From: Alex Henrie Subject: [PATCH 1/4] kernel32/tests: Add simple UTF-7 encoding tests. Message-Id: <1413780100-8876-1-git-send-email-alexhenrie24@gmail.com> Date: Sun, 19 Oct 2014 22:41:37 -0600 --- dlls/kernel32/tests/codepage.c | 134 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c index 8423c75..684ede1 100644 --- a/dlls/kernel32/tests/codepage.c +++ b/dlls/kernel32/tests/codepage.c @@ -412,6 +412,138 @@ static void test_string_conversion(LPBOOL bUsedDefaultChar) ok(GetLastError() == 0xdeadbeef, "GetLastError() is %u\n", GetLastError()); } +static void test_utf7_encoding(void) +{ + struct simple_test + { + WCHAR utf16[1024]; + int utf16_len; + char utf7[1024]; + int utf7_len; + }; + + static const struct simple_test simple_tests[] = { + /* tests some valid UTF-16 */ + { + {0x4F60,0x597D,0x5417,0}, + 4, + "+T2BZfVQX-", + 11 + }, + /* tests some invalid UTF-16 */ + /* (stray lead surrogate) */ + { + {0xD801,0}, + 2, + "+2AE-", + 6 + }, + /* tests some more invalid UTF-16 */ + /* (codepoint does not exist) */ + { + {0xFF00,0}, + 2, + "+/wA-", + 6 + } + }; + + int i; + + for (i = 0; i < sizeof(simple_tests) / sizeof(simple_tests[0]); i++) + { + char c_buffer[1024]; + WCHAR w_buffer[1024]; + int len; + + c_buffer[sizeof(c_buffer) - 1] = 0; + w_buffer[sizeof(w_buffer) / sizeof(WCHAR) - 1] = 0; + + /* test string conversion with srclen=-1 */ + memset(c_buffer, '#', sizeof(c_buffer) - 1); + SetLastError(0xdeadbeef); + len = WideCharToMultiByte(CP_UTF7, 0, simple_tests[i].utf16, -1, c_buffer, sizeof(c_buffer), NULL, NULL); + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + skip("UTF-7 encoding not implemented\n"); + return; + } + ok(len == simple_tests[i].utf7_len && + strcmp(c_buffer, simple_tests[i].utf7) == 0 && + c_buffer[len] == '#', + "simple_test failure i=%i dst=\"%s\" len=%i\n", i, c_buffer, len); + ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError()); + + /* test string conversion with srclen=-2 */ + memset(c_buffer, '#', sizeof(c_buffer) - 1); + SetLastError(0xdeadbeef); + len = WideCharToMultiByte(CP_UTF7, 0, simple_tests[i].utf16, -2, c_buffer, sizeof(c_buffer), NULL, NULL); + ok(len == simple_tests[i].utf7_len && + strcmp(c_buffer, simple_tests[i].utf7) == 0 && + c_buffer[len] == '#', + "simple_test failure i=%i dst=\"%s\" len=%i\n", i, c_buffer, len); + ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError()); + + /* test string conversion with dstlen=len-1 */ + memset(c_buffer, '#', sizeof(c_buffer) - 1); + SetLastError(0xdeadbeef); + len = WideCharToMultiByte(CP_UTF7, 0, simple_tests[i].utf16, -1, c_buffer, simple_tests[i].utf7_len - 1, NULL, NULL); + ok(len == 0 && + memcmp(c_buffer, simple_tests[i].utf7, simple_tests[i].utf7_len - 1) == 0 && + c_buffer[simple_tests[i].utf7_len - 1] == '#', + "simple_test failure i=%i dst=\"%s\" len=%i\n", i, c_buffer, len); + ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "error=%x\n", GetLastError()); + + /* test string conversion with dstlen=len */ + memset(c_buffer, '#', sizeof(c_buffer) - 1); + SetLastError(0xdeadbeef); + len = WideCharToMultiByte(CP_UTF7, 0, simple_tests[i].utf16, -1, c_buffer, simple_tests[i].utf7_len, NULL, NULL); + ok(len == simple_tests[i].utf7_len && + strcmp(c_buffer, simple_tests[i].utf7) == 0 && + c_buffer[len] == '#', + "simple_test failure i=%i dst=\"%s\" len=%i\n", i, c_buffer, len); + ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError()); + + /* test string conversion with dstlen=len+1 */ + memset(c_buffer, '#', sizeof(c_buffer) - 1); + SetLastError(0xdeadbeef); + len = WideCharToMultiByte(CP_UTF7, 0, simple_tests[i].utf16, -1, c_buffer, simple_tests[i].utf7_len + 1, NULL, NULL); + ok(len == simple_tests[i].utf7_len && + strcmp(c_buffer, simple_tests[i].utf7) == 0 && + c_buffer[len] == '#', + "simple_test failure i=%i dst=\"%s\" len=%i\n", i, c_buffer, len); + ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError()); + + /* test dry run with dst=NULL and dstlen=0 */ + memset(c_buffer, '#', sizeof(c_buffer)); + SetLastError(0xdeadbeef); + len = WideCharToMultiByte(CP_UTF7, 0, simple_tests[i].utf16, -1, NULL, 0, NULL, NULL); + ok(len == simple_tests[i].utf7_len && + c_buffer[0] == '#', + "simple_test failure i=%i len=%i\n", i, len); + ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError()); + + /* test dry run with dst!=NULL and dstlen=0 */ + memset(c_buffer, '#', sizeof(c_buffer) - 1); + SetLastError(0xdeadbeef); + len = WideCharToMultiByte(CP_UTF7, 0, simple_tests[i].utf16, -1, c_buffer, 0, NULL, NULL); + ok(len == simple_tests[i].utf7_len && + c_buffer[0] == '#', + "simple_test failure i=%i len=%i\n", i, len); + ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError()); + + /* all simple utf16-to-utf7 tests can be reversed to make utf7-to-utf16 tests */ + memset(w_buffer, '#', sizeof(w_buffer) - sizeof(WCHAR)); + SetLastError(0xdeadbeef); + len = MultiByteToWideChar(CP_UTF7, 0, simple_tests[i].utf7, -1, w_buffer, sizeof(w_buffer) / sizeof(WCHAR)); + todo_wine ok(len == simple_tests[i].utf16_len && + memcmp(w_buffer, simple_tests[i].utf16, len * sizeof(WCHAR)) == 0 && + w_buffer[len] == 0x2323, + "simple_test failure i=%i dst=%s len=%i\n", i, wine_dbgstr_w(w_buffer), len); + todo_wine ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError()); + } +} + static void test_undefined_byte_char(void) { static const struct tag_testset { @@ -618,6 +750,8 @@ START_TEST(codepage) test_string_conversion(NULL); test_string_conversion(&bUsedDefaultChar); + test_utf7_encoding(); + test_undefined_byte_char(); test_threadcp(); } -- 2.1.2