Added SDL_swprintf() and SDL_vswprintf()

This commit is contained in:
Sam Lantinga
2023-05-24 09:41:22 -07:00
parent 6c28546828
commit c9d8a04945
8 changed files with 250 additions and 2 deletions

View File

@@ -205,6 +205,169 @@ static int stdlib_snprintf(void *arg)
return TEST_COMPLETED;
}
/**
* \brief Call to SDL_swprintf
*/
#undef SDL_swprintf
static int stdlib_swprintf(void *arg)
{
int result;
int predicted;
wchar_t text[1024];
const wchar_t *expected;
size_t size;
result = SDL_swprintf(text, sizeof(text), L"%s", "foo");
expected = L"foo";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%s\", \"foo\")");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
result = SDL_swprintf(text, 2, L"%s", "foo");
expected = L"f";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%s\", \"foo\") with buffer size 2");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
result = SDL_swprintf(NULL, 0, L"%s", "foo");
SDLTest_AssertPass("Call to SDL_swprintf(NULL, 0, \"%%s\", \"foo\")");
SDLTest_AssertCheck(result == 3, "Check result value, expected: 3, got: %d", result);
result = SDL_swprintf(text, 2, L"%s\n", "foo");
expected = L"f";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%s\\n\", \"foo\") with buffer size 2");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == 4, "Check result value, expected: 4, got: %d", result);
result = SDL_swprintf(text, sizeof(text), L"%f", 0.0);
predicted = SDL_swprintf(NULL, 0, L"%f", 0.0);
expected = L"0.000000";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%f\", 0.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%f", 1.0);
predicted = SDL_swprintf(NULL, 0, L"%f", 1.0);
expected = L"1.000000";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%f\", 1.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%.f", 1.0);
predicted = SDL_swprintf(NULL, 0, L"%.f", 1.0);
expected = L"1";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%.f\", 1.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%#.f", 1.0);
predicted = SDL_swprintf(NULL, 0, L"%#.f", 1.0);
expected = L"1.";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%#.f\", 1.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%f", 1.0 + 1.0 / 3.0);
predicted = SDL_swprintf(NULL, 0, L"%f", 1.0 + 1.0 / 3.0);
expected = L"1.333333";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%f\", 1.0 + 1.0 / 3.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%+f", 1.0 + 1.0 / 3.0);
predicted = SDL_swprintf(NULL, 0, L"%+f", 1.0 + 1.0 / 3.0);
expected = L"+1.333333";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%+f\", 1.0 + 1.0 / 3.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%.2f", 1.0 + 1.0 / 3.0);
predicted = SDL_swprintf(NULL, 0, L"%.2f", 1.0 + 1.0 / 3.0);
expected = L"1.33";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%.2f\", 1.0 + 1.0 / 3.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: %s, got: %s", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%6.2f", 1.0 + 1.0 / 3.0);
predicted = SDL_swprintf(NULL, 0, L"%6.2f", 1.0 + 1.0 / 3.0);
expected = L" 1.33";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%6.2f\", 1.0 + 1.0 / 3.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%06.2f", 1.0 + 1.0 / 3.0);
predicted = SDL_swprintf(NULL, 0, L"%06.2f", 1.0 + 1.0 / 3.0);
expected = L"001.33";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%06.2f\", 1.0 + 1.0 / 3.0)");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(text), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(text), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, 5, L"%06.2f", 1.0 + 1.0 / 3.0);
expected = L"001.";
SDLTest_AssertPass("Call to SDL_swprintf(\"%%06.2f\", 1.0 + 1.0 / 3.0) with buffer size 5");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
SDLTest_AssertCheck(result == 6, "Check result value, expected: 6, got: %d", result);
{
static struct
{
float value;
const wchar_t *expected_f;
const wchar_t *expected_g;
} f_and_g_test_cases[] = {
{ 100.0f, L"100.000000", L"100" },
{ -100.0f, L"-100.000000", L"-100" },
{ 100.75f, L"100.750000", L"100.75" },
{ -100.75f, L"-100.750000", L"-100.75" },
{ ((100 * 60 * 1000) / 1001) / 100.0f, L"59.939999", L"59.94" },
{ -((100 * 60 * 1000) / 1001) / 100.0f, L"-59.939999", L"-59.94" },
{ ((100 * 120 * 1000) / 1001) / 100.0f, L"119.879997", L"119.88" },
{ -((100 * 120 * 1000) / 1001) / 100.0f, L"-119.879997", L"-119.88" },
{ 9.9999999f, L"10.000000", L"10" },
{ -9.9999999f, L"-10.000000", L"-10" },
};
int i;
for (i = 0; i < SDL_arraysize(f_and_g_test_cases); ++i) {
float value = f_and_g_test_cases[i].value;
result = SDL_swprintf(text, sizeof(text), L"%f", value);
predicted = SDL_swprintf(NULL, 0, L"%f", value);
expected = f_and_g_test_cases[i].expected_f;
SDLTest_AssertPass("Call to SDL_swprintf(\"%%f\", %g)", value);
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(expected), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(expected), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
result = SDL_swprintf(text, sizeof(text), L"%g", value);
predicted = SDL_swprintf(NULL, 0, L"%g", value);
expected = f_and_g_test_cases[i].expected_g;
SDLTest_AssertPass("Call to SDL_swprintf(\"%%g\", %g)", value);
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
SDLTest_AssertCheck(result == SDL_wcslen(expected), "Check result value, expected: %d, got: %d", (int)SDL_wcslen(expected), result);
SDLTest_AssertCheck(predicted == result, "Check predicted value, expected: %d, got: %d", result, predicted);
}
}
size = 64;
result = SDL_swprintf(text, sizeof(text), L"%zu %s", size, "test");
expected = L"64 test";
SDLTest_AssertPass("Call to SDL_swprintf(text, sizeof(text), \"%%zu %%s\", size, \"test\")");
SDLTest_AssertCheck(SDL_wcscmp(text, expected) == 0, "Check text, expected: '%s', got: '%s'", expected, text);
SDLTest_AssertCheck(result == 7, "Check result value, expected: 7, got: %d", result);
return TEST_COMPLETED;
}
#if defined(HAVE_WFORMAT) || defined(HAVE_WFORMAT_EXTRA_ARGS)
#pragma GCC diagnostic pop
#endif
@@ -635,14 +798,18 @@ static const SDLTest_TestCaseReference stdlibTest2 = {
};
static const SDLTest_TestCaseReference stdlibTest3 = {
stdlib_getsetenv, "stdlib_getsetenv", "Call to SDL_getenv and SDL_setenv", TEST_ENABLED
stdlib_swprintf, "stdlib_swprintf", "Call to SDL_swprintf", TEST_ENABLED
};
static const SDLTest_TestCaseReference stdlibTest4 = {
stdlib_sscanf, "stdlib_sscanf", "Call to SDL_sscanf", TEST_ENABLED
stdlib_getsetenv, "stdlib_getsetenv", "Call to SDL_getenv and SDL_setenv", TEST_ENABLED
};
static const SDLTest_TestCaseReference stdlibTest5 = {
stdlib_sscanf, "stdlib_sscanf", "Call to SDL_sscanf", TEST_ENABLED
};
static const SDLTest_TestCaseReference stdlibTest6 = {
stdlib_aligned_alloc, "stdlib_aligned_alloc", "Call to SDL_aligned_alloc", TEST_ENABLED
};
@@ -657,6 +824,7 @@ static const SDLTest_TestCaseReference *stdlibTests[] = {
&stdlibTest3,
&stdlibTest4,
&stdlibTest5,
&stdlibTest6,
&stdlibTestOverflow,
NULL
};