From: Nicholas Nethercote Date: Fri, 20 Feb 2009 06:37:52 +0000 (+0000) Subject: Forgot to add this file in the last commit. X-Git-Tag: svn/VALGRIND_3_5_0~959 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f6b278a3fc6b7976843643ad69e035a0d61b3b22;p=thirdparty%2Fvalgrind.git Forgot to add this file in the last commit. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9205 --- diff --git a/memcheck/tests/unit_libcbase.c b/memcheck/tests/unit_libcbase.c new file mode 100644 index 0000000000..768ca25f2b --- /dev/null +++ b/memcheck/tests/unit_libcbase.c @@ -0,0 +1,239 @@ +// This module does unit testing of m_libcbase. + +#include +#include +#include + +#include "coregrind/m_libcbase.c" + + +void test_isXYZ(void) +{ + assert( VG_(isspace)(' ') ); + assert( VG_(isspace)('\n') ); + assert( VG_(isspace)('\t') ); + assert( ! VG_(isspace)('3') ); + assert( ! VG_(isspace)('x') ); + + assert( VG_(isdigit)('0') ); + assert( VG_(isdigit)('1') ); + assert( VG_(isdigit)('5') ); + assert( VG_(isdigit)('9') ); + assert( ! VG_(isdigit)('a') ); + assert( ! VG_(isdigit)('!') ); +} + +void test_is_XYZ_digit() +{ + Long x; + + assert( is_dec_digit('0', &x) && 0 == x ); + assert( is_dec_digit('1', &x) && 1 == x ); + assert( is_dec_digit('9', &x) && 9 == x ); + + assert( is_hex_digit('0', &x) && 0 == x ); + assert( is_hex_digit('1', &x) && 1 == x ); + assert( is_hex_digit('9', &x) && 9 == x ); + assert( is_hex_digit('a', &x) && 10 == x ); + assert( is_hex_digit('f', &x) && 15 == x ); + assert( is_hex_digit('A', &x) && 10 == x ); + assert( is_hex_digit('F', &x) && 15 == x ); +} + +void test_strtoll(void) +{ + // For VG_(strtoll*)() + typedef struct { + Char* str; // The string to convert. + Long res; // The result. + Char endptr_val; // The char one past the end of the converted text. + } StrtollInputs; + + // VG_(strtoll10)() + { + StrtollInputs a[] = { + // If there's no number at the head of the string, return 0, and + // make 'endptr' point to the start of the string. + { str : "", res : 0, endptr_val : '\0' }, + { str : " \n\t", res : 0, endptr_val : ' ' }, + { str : "one", res : 0, endptr_val : 'o' }, + { str : "\ntwo", res : 0, endptr_val : '\n' }, + + // Successful conversion. Leading whitespace is ignored. A single + // '-' or '+' is accepted. + { str : "0", res : 0, endptr_val : '\0' }, + { str : "+0", res : 0, endptr_val : '\0' }, + { str : "-0", res : 0, endptr_val : '\0' }, + { str : "1", res : 1, endptr_val : '\0' }, + { str : "+1", res : 1, endptr_val : '\0' }, + { str : "-1", res : -1, endptr_val : '\0' }, + { str : "12", res : 12, endptr_val : '\0' }, + { str : "-567", res : -567, endptr_val : '\0' }, + { str : "1234567", res : 1234567, endptr_val : '\0' }, + { str : "007", res : 7, endptr_val : '\0' }, + { str : " +42", res : 42, endptr_val : '\0' }, + { str : "\n\t\r\v -56", res : -56, endptr_val : '\0' }, + { str : "123xyz", res : 123, endptr_val : 'x' }, + { str : " -123abc", res : -123, endptr_val : 'a' }, + + // Whitespace after the +/- is not allowed; conversion fails. + { str : "+ 1", res : 0, endptr_val : '+' }, + { str : "-\n1", res : 0, endptr_val : '-' }, + }; + + // Nb: We test the results against strtoll() as well. + int i; + for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) { + Char* endptr1; + char* endptr2; + Long res1 = VG_(strtoll10)(a[i].str, &endptr1); + long long res2 = strtoll (a[i].str, &endptr2, 10); + //printf("res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1); + //printf("res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2); + assert(a[i].res == res1 && a[i].endptr_val == *endptr1); + assert(res2 == res1 && *endptr2 == *endptr1); + } + } + + // VG_(strtoll16)() + { + StrtollInputs a[] = { + // If there's no number at the head of the string, return 0, and + // make 'endptr' point to the start of the string. + { str : "", res : 0, endptr_val : '\0' }, + { str : " \n\t", res : 0, endptr_val : ' ' }, + { str : "one", res : 0, endptr_val : 'o' }, + { str : "\ntwo", res : 0, endptr_val : '\n' }, + + // Successful conversion. Leading whitespace is ignored. A single + // '-' or '+' is accepted. "0X" and "0x" are also allowed at the + // front, but if no digits follow, just the "0" is converted. + { str : "0", res : 0, endptr_val : '\0' }, + { str : "0x0", res : 0, endptr_val : '\0' }, + { str : "0X0", res : 0, endptr_val : '\0' }, + { str : "0x", res : 0, endptr_val : 'x' }, + { str : "0Xg", res : 0, endptr_val : 'X' }, + { str : "0", res : 0, endptr_val : '\0' }, + { str : "+0", res : 0, endptr_val : '\0' }, + { str : "-0", res : 0, endptr_val : '\0' }, + { str : "1", res : 1, endptr_val : '\0' }, + { str : "+1", res : 1, endptr_val : '\0' }, + { str : "-1", res : -1, endptr_val : '\0' }, + { str : "1a", res : 26, endptr_val : '\0' }, + { str : "-5F7", res : -1527, endptr_val : '\0' }, + { str : "0x1234567", res : 19088743, endptr_val : '\0' }, + { str : "007", res : 7, endptr_val : '\0' }, + { str : "0X00ABCD", res : 43981, endptr_val : '\0' }, + { str : " +AbC", res : 2748, endptr_val : '\0' }, + { str : " -0xAbC", res : -2748, endptr_val : '\0' }, + { str : " -0xxx", res : 0, endptr_val : 'x' }, + { str : "\n\t\r\v -56", res : -86, endptr_val : '\0' }, + { str : "123xyz", res : 291, endptr_val : 'x' }, + { str : " -123defghi", res : -1195503, endptr_val : 'g' }, + + // Whitespace after the +/- is not allowed; conversion fails. + { str : "+ 1", res : 0, endptr_val : '+' }, + { str : "-\n0x1", res : 0, endptr_val : '-' }, + }; + + // Nb: We test the results against strtoll() as well. + int i; + for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) { + Char* endptr1; + char* endptr2; + Long res1 = VG_(strtoll16)(a[i].str, &endptr1); + long long res2 = strtoll (a[i].str, &endptr2, 16); + //printf(" res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1); + //printf(" res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2); + assert(a[i].res == res1 && a[i].endptr_val == *endptr1); + assert(res2 == res1 && *endptr2 == *endptr1); + } + } + // VG_(strtod)() + { + StrtollInputs a[] = { + // If there's no number at the head of the string, return 0, and + // make 'endptr' point to the start of the string. + { str : "", res : 0, endptr_val : '\0' }, + { str : " \n\t", res : 0, endptr_val : ' ' }, + { str : "one", res : 0, endptr_val : 'o' }, + { str : "\ntwo", res : 0, endptr_val : '\n' }, + + // Successful conversion. Leading whitespace is ignored. A single + // '-' or '+' is accepted. "0X" and "0x" are also allowed at the + // front, but if no digits follow, just the "0" is converted. + { str : "0", res : 0, endptr_val : '\0' }, + { str : "0", res : 0, endptr_val : '\0' }, + { str : "+0", res : 0, endptr_val : '\0' }, + { str : "-0", res : 0, endptr_val : '\0' }, + { str : "1", res : 1, endptr_val : '\0' }, + { str : "+1", res : 1, endptr_val : '\0' }, + { str : "-1", res : -1, endptr_val : '\0' }, + { str : "1a", res : 26, endptr_val : '\0' }, + { str : "-5F7", res : -1527, endptr_val : '\0' }, + { str : "0x1234567", res : 19088743, endptr_val : '\0' }, + { str : "007", res : 7, endptr_val : '\0' }, + { str : "0X00ABCD", res : 43981, endptr_val : '\0' }, + { str : " +AbC", res : 2748, endptr_val : '\0' }, + { str : " -0xAbC", res : -2748, endptr_val : '\0' }, + { str : " -0xxx", res : 0, endptr_val : 'x' }, + { str : "\n\t\r\v -56", res : -86, endptr_val : '\0' }, + { str : "123xyz", res : 291, endptr_val : 'x' }, + { str : " -123defghi", res : -1195503, endptr_val : 'g' }, + + // Whitespace after the +/- is not allowed; conversion fails. + { str : "+ 1", res : 0, endptr_val : '+' }, + { str : "-\n0x1", res : 0, endptr_val : '-' }, + }; + + // Nb: We test the results against strtoll() as well. + int i; + for (i = 0; i < (sizeof(a) / sizeof(StrtollInputs)); i++) { + Char* endptr1; + char* endptr2; + Long res1 = VG_(strtoll16)(a[i].str, &endptr1); + long long res2 = strtoll (a[i].str, &endptr2, 16); + //printf(" res1 = %lld, *endptr1 = '%c'\n", res1, *endptr1); + //printf(" res2 = %lld, *endptr2 = '%c'\n", res2, *endptr2); + assert(a[i].res == res1 && a[i].endptr_val == *endptr1); + assert(res2 == res1 && *endptr2 == *endptr1); + } + } +} + +int main(void) +{ + //-------------------------------------------------------------------- + // Macros in pub_tool_libcbase.h + //-------------------------------------------------------------------- + // XXX: todo + + //-------------------------------------------------------------------- + // Char functions + //-------------------------------------------------------------------- + test_isXYZ(); + + //-------------------------------------------------------------------- + // String-to-number functions + //-------------------------------------------------------------------- + test_is_XYZ_digit(); + test_strtoll(); + + //-------------------------------------------------------------------- + // String functions + //-------------------------------------------------------------------- + // XXX: todo + + //-------------------------------------------------------------------- + // Mem functions + //-------------------------------------------------------------------- + // XXX: todo + + //-------------------------------------------------------------------- + // Miscellaneous functions + //-------------------------------------------------------------------- + // XXX: todo + + return 0; +} +