From 5331f36789d7de0be60463a77529a3ede6e76c0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carl=20=C3=85stholm?= Date: Wed, 11 Sep 2024 00:41:52 +0200 Subject: [PATCH] stdlib: Add failing tests for SDL_strtoull --- test/testautomation_stdlib.c | 128 +++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) diff --git a/test/testautomation_stdlib.c b/test/testautomation_stdlib.c index 987156a0e7..549538855d 100644 --- a/test/testautomation_stdlib.c +++ b/test/testautomation_stdlib.c @@ -1347,6 +1347,129 @@ static int SDLCALL stdlib_wcstol(void *arg) return TEST_COMPLETED; } +static int SDLCALL stdlib_strtoull(void *arg) +{ + const char *text; + unsigned long long result; + char *endp; + unsigned long long expected_result; + char *expected_endp; + + // infer decimal + + text = "\t 123abcxyz"; // skip leading space + expected_result = 123; + expected_endp = (char *)text + 6; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\"\\t 123abcxyz\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = "+123abcxyz"; + expected_result = 123; + expected_endp = (char *)text + 4; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\"+123abcxyz\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = "-123abcxyz"; + expected_result = 0ULL - 123; + expected_endp = (char *)text + 4; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\"-123abcxyz\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = "9999999999999999999999999999999999999999abcxyz"; + expected_result = ~0ULL; // ULLONG_MAX + expected_endp = (char *)text + 40; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\"9999999999999999999999999999999999999999abcxyz\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = "-9999999999999999999999999999999999999999abcxyz"; + expected_result = ~0ULL; // ULLONG_MAX + expected_endp = (char *)text + 41; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\"-9999999999999999999999999999999999999999abcxyz\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + // infer hexadecimal + + text = "0x123abcxyz"; + expected_result = 0x123abc; + expected_endp = (char *)text + 8; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\"0x123abcxyz\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = "0X123ABCXYZ"; // uppercase X + expected_result = 0x123abc; + expected_endp = (char *)text + 8; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\"0X123ABCXYZ\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + // infer octal + + text = "0123abcxyz"; + expected_result = 0123; + expected_endp = (char *)text + 4; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\"0123abcxyz\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + // arbitrary bases + + text = "00110011"; + expected_result = 51; + expected_endp = (char *)text + 8; + result = SDL_strtoull(text, &endp, 2); + SDLTest_AssertPass("Call to SDL_strtoull(\"00110011\", &endp, 2)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = "-uvwxyz"; + expected_result = -991; + expected_endp = (char *)text + 3; + result = SDL_strtoull(text, &endp, 32); + SDLTest_AssertPass("Call to SDL_strtoull(\"-uvwxyz\", &endp, 32)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = "ZzZzZzZzZzZzZzZzZzZzZzZzZ"; + expected_result = ~0ULL; // ULLONG_MAX + expected_endp = (char *)text + 25; + result = SDL_strtoull(text, &endp, 36); + SDLTest_AssertPass("Call to SDL_strtoull(\"ZzZzZzZzZzZzZzZzZzZzZzZzZ\", &endp, 36)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = "-0"; + expected_result = 0; + expected_endp = (char *)text + 2; + result = SDL_strtoull(text, &endp, 10); + SDLTest_AssertPass("Call to SDL_strtoull(\"-0\", &endp, 10)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + text = " +0x"; // invalid hexadecimal + expected_result = 0; + expected_endp = (char *)text; + result = SDL_strtoull(text, &endp, 0); + SDLTest_AssertPass("Call to SDL_strtoull(\" +0x\", &endp, 0)"); + SDLTest_AssertCheck(result == expected_result, "Check result value, expected: %llu, got: %llu", expected_result, result); + SDLTest_AssertCheck(endp == expected_endp, "Check endp value, expected: %p, got: %p", expected_endp, endp); + + return TEST_COMPLETED; +} + /* ================= Test References ================== */ /* Standard C routine test cases */ @@ -1398,6 +1521,10 @@ static const SDLTest_TestCaseReference stdlibTest_wcstol = { stdlib_wcstol, "stdlib_wcstol", "Calls to SDL_wcstol", TEST_ENABLED }; +static const SDLTest_TestCaseReference stdlibTest_strtoull = { + stdlib_strtoull, "stdlib_strtoull", "Calls to SDL_strtoull", TEST_ENABLED +}; + /* Sequence of Standard C routine test cases */ static const SDLTest_TestCaseReference *stdlibTests[] = { &stdlibTest_strnlen, @@ -1412,6 +1539,7 @@ static const SDLTest_TestCaseReference *stdlibTests[] = { &stdlibTest_iconv, &stdlibTest_strpbrk, &stdlibTest_wcstol, + &stdlibTest_strtoull, NULL };