/*
 * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 * 02110-1301, USA.
 *
 * You can also choose to distribute this program under the terms of
 * the Unmodified Binary Distribution Licence (as given in the file
 * COPYING.UBDL), provided that you have satisfied its requirements.
 */

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );

/** @file
 *
 * String self-tests
 *
 * memcpy() tests are handled separately
 */

/* Forcibly enable assertions */
#undef NDEBUG

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <wchar.h>
#include <ipxe/string.h>
#include <ipxe/test.h>

/**
 * Perform string self-tests
 *
 */
static void string_test_exec ( void ) {

	/* Test strlen() */
	ok ( strlen ( "" ) == 0 );
	ok ( strlen ( "Hello" ) == 5 );
	ok ( strlen ( "Hello world!" ) == 12 );
	ok ( strlen ( "Hello\0world!" ) == 5 );

	/* Test strnlen() */
	ok ( strnlen ( "", 0 ) == 0 );
	ok ( strnlen ( "", 10 ) == 0 );
	ok ( strnlen ( "Hello", 0 ) == 0 );
	ok ( strnlen ( "Hello", 3 ) == 3 );
	ok ( strnlen ( "Hello", 5 ) == 5 );
	ok ( strnlen ( "Hello", 16 ) == 5 );
	ok ( strnlen ( "Hello world!", 5 ) == 5 );
	ok ( strnlen ( "Hello world!", 11 ) == 11 );
	ok ( strnlen ( "Hello world!", 16 ) == 12 );

	/* Test strchr() */
	ok ( strchr ( "", 'a' ) == NULL );
	ok ( *(strchr ( "Testing", 'e' )) == 'e' );
	ok ( *(strchr ( "Testing", 'g' )) == 'g' );
	ok ( strchr ( "Testing", 'x' ) == NULL );

	/* Test strrchr() */
	ok ( strrchr ( "", 'a' ) == NULL );
	ok ( *(strrchr ( "Haystack", 'a' )) == 'a' );
	ok ( *(strrchr ( "Haystack", 'k' )) == 'k' );
	ok ( strrchr ( "Haystack", 'x' ) == NULL );

	/* Test memchr() */
	ok ( memchr ( "", '\0', 0 ) == NULL );
	ok ( *((uint8_t *)memchr ( "post\0null", 'l', 9 )) == 'l' );
	ok ( *((uint8_t *)memchr ( "post\0null", '\0', 9 )) == '\0' );
	ok ( memchr ( "thingy", 'z', 6 ) == NULL );

	/* Test strcmp() */
	ok ( strcmp ( "", "" ) == 0 );
	ok ( strcmp ( "Hello", "Hello" ) == 0 );
	ok ( strcmp ( "Hello", "hello" ) != 0 );
	ok ( strcmp ( "Hello", "Hello world!" ) != 0 );
	ok ( strcmp ( "Hello world!", "Hello" ) != 0 );
	ok ( strcmp ( "abc", "def" ) < 0 );

	/* Test strncmp() */
	ok ( strncmp ( "", "", 0 ) == 0 );
	ok ( strncmp ( "", "", 15 ) == 0 );
	ok ( strncmp ( "Goodbye", "Goodbye", 16 ) == 0 );
	ok ( strncmp ( "Goodbye", "Hello", 16 ) != 0 );
	ok ( strncmp ( "Goodbye", "Goodbye world", 32 ) != 0 );
	ok ( strncmp ( "Goodbye", "Goodbye world", 7 ) == 0 );

	/* Test strcasecmp() */
	ok ( strcasecmp ( "", "" ) == 0 );
	ok ( strcasecmp ( "Uncle Jack", "Uncle jack" ) == 0 );
	ok ( strcasecmp ( "Uncle Jack", "Uncle" ) != 0 );
	ok ( strcasecmp ( "Uncle", "Uncle Jack" ) != 0 );
	ok ( strcasecmp ( "not", "equal" ) != 0 );

	/* Test strncasecmp() */
	ok ( strncasecmp ( "", "", 0 ) == 0 );
	ok ( strncasecmp ( "", "", 73 ) == 0 );
	ok ( strncasecmp ( "Uncle Jack", "Uncle jack", 47 ) == 0 );
	ok ( strncasecmp ( "Uncle Jack", "Uncle jake", 47 ) != 0 );
	ok ( strncasecmp ( "Uncle Jack", "Uncle jake", 9 ) != 0 );
	ok ( strncasecmp ( "Uncle Jack", "Uncle jake", 8 ) == 0 );

	/* Test memcmp() */
	ok ( memcmp ( "", "", 0 ) == 0 );
	ok ( memcmp ( "Foo", "Foo", 3 ) == 0 );
	ok ( memcmp ( "Foo", "Bar", 3 ) != 0 );
	ok ( memcmp ( "abc", "def", 3 ) < 0 );

	/* Test strstr() */
	{
		const char haystack[] = "find me!";
		char *found;

		found = strstr ( haystack, "find" );
		ok ( found == &haystack[0] );
		found = strstr ( haystack, "me" );
		ok ( found == &haystack[5] );
		found = strstr ( haystack, "me." );
		ok ( found == NULL );
	}

	/* Test memset() */
	{
		static uint8_t test[7] = { '>', 1, 1, 1, 1, 1, '<' };
		static const uint8_t expected[7] = { '>', 0, 0, 0, 0, 0, '<' };
		memset ( ( test + 1 ), 0, ( sizeof ( test ) - 2 ) );
		ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
	}
	{
		static uint8_t test[4] = { '>', 0, 0, '<' };
		static const uint8_t expected[4] = { '>', 0xeb, 0xeb, '<' };
		memset ( ( test + 1 ), 0xeb, ( sizeof ( test ) - 2 ) );
		ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
	}

	/* Test memmove() */
	{
		static uint8_t test[11] =
			{ '>', 1, 2, 3, 4, 5, 6, 7, 8, 9, '<' };
		static const uint8_t expected[11] =
			{ '>', 3, 4, 5, 6, 7, 8, 7, 8, 9, '<' };
		memmove ( ( test + 1 ), ( test + 3 ), 6 );
		ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
	}
	{
		static uint8_t test[12] =
			{ '>', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '<' };
		static const uint8_t expected[12] =
			{ '>', 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, '<' };
		memmove ( ( test + 6 ), ( test + 1 ), 5 );
		ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
	}

	/* Test memswap() */
	{
		static uint8_t test[8] =
			{ '>', 1, 2, 3, 7, 8, 9, '<' };
		static const uint8_t expected[8] =
			{ '>', 7, 8, 9, 1, 2, 3, '<' };
		memswap ( ( test + 1 ), ( test + 4 ), 3 );
		ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
	}

	/* Test strdup() */
	{
		const char *orig = "testing testing";
		char *dup = strdup ( orig );
		ok ( dup != NULL );
		ok ( dup != orig );
		ok ( strcmp ( dup, orig ) == 0 );
		free ( dup );
	}

	/* Test strndup() */
	{
		const char *normal = "testing testing";
		const char unterminated[6] = { 'h', 'e', 'l', 'l', 'o', '!' };
		char *dup;
		dup = strndup ( normal, 32 );
		ok ( dup != NULL );
		ok ( dup != normal );
		ok ( strcmp ( dup, normal ) == 0 );
		free ( dup );
		dup = strndup ( normal, 4 );
		ok ( dup != NULL );
		ok ( strcmp ( dup, "test" ) == 0 );
		free ( dup );
		dup = strndup ( unterminated, 5 );
		ok ( dup != NULL );
		ok ( strcmp ( dup, "hello" ) == 0 );
		free ( dup );
	}

	/* Test stpcpy() */
	{
		const char longer[12] = "duplicateme";
		const char shorter[6] = "hello";
		char dest[12];
		char *dnul;

		dnul = stpcpy ( dest, longer );
		ok ( *dnul == '\0' );
		ok ( dnul == &dest[11] );
		ok ( memcmp ( dest, longer, 12 ) == 0 );
		dnul = stpcpy ( dest, shorter );
		ok ( *dnul == '\0' );
		ok ( dnul == &dest[5] );
		ok ( memcmp ( dest, shorter, 6 ) == 0 );
		ok ( memcmp ( ( dest + 6 ), ( longer + 6 ), 6 ) == 0 );
	}

	/* Test strcpy() */
	{
		const char longer[7] = "copyme";
		const char shorter[3] = "hi";
		char dest[7];
		char *copy;

		copy = strcpy ( dest, longer );
		ok ( copy == dest );
		ok ( memcmp ( dest, longer, 7 ) == 0 );
		copy = strcpy ( dest, shorter );
		ok ( copy == dest );
		ok ( memcmp ( dest, shorter, 3 ) == 0 );
		ok ( memcmp ( ( dest + 3 ), ( longer + 3 ), 4 ) == 0 );
	}

	/* Test strncpy() */
	{
		const char src[5] = "copy";
		const char orig[8] = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' };
		const char zero[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
		char dest[8];
		char *copy;

		memcpy ( dest, orig, sizeof ( dest ) );
		copy = strncpy ( dest, src, 5 );
		ok ( copy == dest );
		ok ( memcmp ( dest, src, 5 ) == 0 );
		ok ( memcmp ( dest + 5, orig + 5, 3 ) == 0 );
		memcpy ( dest, orig, sizeof ( dest ) );
		copy = strncpy ( dest, src, 4 );
		ok ( copy == dest );
		ok ( memcmp ( dest, src, 4 ) == 0 );
		ok ( memcmp ( dest + 4, orig + 4, 4 ) == 0 );
		memcpy ( dest, orig, sizeof ( dest ) );
		copy = strncpy ( dest, src, 8 );
		ok ( copy == dest );
		ok ( memcmp ( dest, src, 5 ) == 0 );
		ok ( memcmp ( dest + 5, zero + 5, 3 ) == 0 );
		memcpy ( dest, orig, sizeof ( dest ) );
		copy = strncpy ( dest, "", 8 );
		ok ( copy == dest );
		ok ( memcmp ( dest, zero, 8 ) == 0 );
	}

	/* Test strcat() */
	{
		char buf[16] = "append";
		char *dest;

		dest = strcat ( buf, " this" );
		ok ( dest == buf );
		ok ( strcmp ( buf, "append this" ) == 0 );
	}

	/* Test digit_value() */
	{
		unsigned int i;
		char buf[2];
		for ( i = 0 ; i < 16 ; i++ ) {
			snprintf ( buf, sizeof ( buf ), "%x", i );
			ok ( digit_value ( buf[0] ) == i );
			snprintf ( buf, sizeof ( buf ), "%X", i );
			ok ( digit_value ( buf[0] ) == i );
		}
		ok ( digit_value ( 0 ) >= 16 );
		ok ( digit_value ( 9 ) >= 16 );
		ok ( digit_value ( '0' - 1 ) >= 16 );
		ok ( digit_value ( '9' + 1 ) >= 16 );
		ok ( digit_value ( 'A' - 1 ) >= 16 );
		ok ( digit_value ( 'F' + 1 ) >= 16 );
		ok ( digit_value ( 'a' - 1 ) >= 16 );
		ok ( digit_value ( 'f' + 1 ) >= 16 );
	}

	/* Test strtoul() */
	ok ( strtoul ( "12345", NULL, 0 ) == 12345UL );
	ok ( strtoul ( "  741", NULL, 10 ) == 741UL );
	ok ( strtoul ( " 555a", NULL, 0 ) == 555UL );
	ok ( strtoul ( " 555a", NULL, 16 ) == 0x555aUL );
	ok ( strtoul ( "-12", NULL, 0 ) == -12UL );
	ok ( strtoul ( "+3", NULL, 0 ) == 3UL );
	ok ( strtoul ( "721", NULL, 0 ) == 721UL );
	ok ( strtoul ( "721", NULL, 8 ) == 0721UL );
	ok ( strtoul ( "0721", NULL, 0 ) == 0721UL );
	ok ( strtoul ( "", NULL, 0 ) == 0UL );
	ok ( strtoul ( "\t0xcAfe", NULL, 0 ) == 0xcafeUL );
	ok ( strtoul ( "0xffffffff", NULL, 0 ) == 0xffffffffUL );
	{
		static const char string[] = "123aHa.world";
		char *endp;
		ok ( strtoul ( string, &endp, 0 ) == 123UL );
		ok ( endp == &string[3] );
		ok ( strtoul ( string, &endp, 16 ) == 0x123aUL );
		ok ( endp == &string[4] );
		ok ( strtoul ( string, &endp, 26 ) ==
		     ( ( ( ( ( 1 * 26 + 2 ) * 26 + 3 ) * 26 + 10 ) * 26
			 + 17 ) * 26 + 10 ) );
		ok ( endp == &string[6] );
	}

	/* Test wcslen() */
	ok ( wcslen ( L"" ) == 0 );
	ok ( wcslen ( L"Helloo" ) == 6 );
	ok ( wcslen ( L"Helloo woorld!" ) == 14 );
	ok ( wcslen ( L"Helloo\0woorld!" ) == 6 );

	/* Test wcsnlen() */
	ok ( wcsnlen ( L"", 0 ) == 0 );
	ok ( wcsnlen ( L"", 10 ) == 0 );
	ok ( wcsnlen ( L"Helloo", 0 ) == 0 );
	ok ( wcsnlen ( L"Helloo", 3 ) == 3 );
	ok ( wcsnlen ( L"Helloo", 5 ) == 5 );
	ok ( wcsnlen ( L"Helloo", 16 ) == 6 );
	ok ( wcsnlen ( L"Helloo woorld!", 5 ) == 5 );
	ok ( wcsnlen ( L"Helloo woorld!", 11 ) == 11 );
	ok ( wcsnlen ( L"Helloo woorld!", 16 ) == 14 );
}

/** String self-test */
struct self_test string_test __self_test = {
	.name = "string",
	.exec = string_test_exec,
};
