[PATCH 2/4] kernel32/tests: Add complex UTF-7 encoding tests.

Alex Henrie alexhenrie24 at gmail.com
Sun Oct 19 23:41:38 CDT 2014


---
 dlls/kernel32/tests/codepage.c | 145 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 145 insertions(+)

diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c
index 684ede1..71876e7 100644
--- a/dlls/kernel32/tests/codepage.c
+++ b/dlls/kernel32/tests/codepage.c
@@ -448,6 +448,134 @@ static void test_utf7_encoding(void)
         }
     };
 
+    struct complex_test
+    {
+        /* inputs */
+        WCHAR src[1024];
+        int srclen;
+        int dstlen;
+        /* expected outputs */
+        char dst[1024];
+        int chars_written;
+        int len;
+        DWORD error;
+    };
+
+    static const struct complex_test complex_tests[] = {
+        /* tests srclen > strlenW(src) */
+        {
+            {'a',0,'b',0},
+            4,
+            1023,
+            "a\0b",
+            4,
+            4,
+            0xdeadbeef
+        },
+        /* tests srclen < strlenW(src) with directly encodable chars */
+        {
+            {'h','e','l','l','o',0},
+            2,
+            1023,
+            "he",
+            2,
+            2,
+            0xdeadbeef
+        },
+        /* tests srclen < strlenW(src) with non-directly encodable chars */
+        {
+            {0x4F60,0x597D,0x5417,0},
+            2,
+            1023,
+            "+T2BZfQ-",
+            8,
+            8,
+            0xdeadbeef
+        },
+        /* tests a buffer that runs out while not encoding a UTF-7 sequence */
+        {
+            {'h','e','l','l','o',0},
+            -1,
+            2,
+            "he",
+            2,
+            0,
+            ERROR_INSUFFICIENT_BUFFER
+        },
+        /* tests a buffer that runs out after writing 1 base64 character */
+        {
+            {0x4F60,0x0001,0},
+            -1,
+            2,
+            "+T",
+            2,
+            0,
+            ERROR_INSUFFICIENT_BUFFER
+        },
+        /* tests a buffer that runs out after writing 2 base64 characters */
+        {
+            {0x4F60,0x0001,0},
+            -1,
+            3,
+            "+T2",
+            3,
+            0,
+            ERROR_INSUFFICIENT_BUFFER
+        },
+        /* tests a buffer that runs out after writing 3 base64 characters */
+        {
+            {0x4F60,0x0001,0},
+            -1,
+            4,
+            "+T2A",
+            4,
+            0,
+            ERROR_INSUFFICIENT_BUFFER
+        },
+        /* tests a buffer that runs out just after writing the + sign */
+        {
+            {0x4F60,0},
+            -1,
+            1,
+            "+",
+            1,
+            0,
+            ERROR_INSUFFICIENT_BUFFER
+        },
+        /* tests a buffer that runs out just before writing the - sign */
+        /* the number of bits to encode here is evenly divisible by 6 */
+        {
+            {0x4F60,0x597D,0x5417,0},
+            -1,
+            9,
+            "+T2BZfVQX",
+            9,
+            0,
+            ERROR_INSUFFICIENT_BUFFER
+        },
+        /* tests a buffer that runs out just before writing the - sign */
+        /* the number of bits to encode here is NOT evenly divisible by 6 */
+        {
+            {0x4F60,0},
+            -1,
+            4,
+            "+T2",
+            3,
+            0,
+            ERROR_INSUFFICIENT_BUFFER
+        },
+        /* tests a buffer that runs out in the middle of escaping a + sign */
+        {
+            {'+',0},
+            -1,
+            1,
+            "+",
+            1,
+            0,
+            ERROR_INSUFFICIENT_BUFFER
+        }
+    };
+
     int i;
 
     for (i = 0; i < sizeof(simple_tests) / sizeof(simple_tests[0]); i++)
@@ -542,6 +670,23 @@ static void test_utf7_encoding(void)
            "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());
     }
+
+    for (i = 0; i < sizeof(complex_tests) / sizeof(complex_tests[0]); i++)
+    {
+        char c_buffer[1024];
+        int len;
+
+        c_buffer[sizeof(c_buffer) - 1] = 0;
+        memset(c_buffer, '#', sizeof(c_buffer) - 1);
+        SetLastError(0xdeadbeef);
+
+        len = WideCharToMultiByte(CP_UTF7, 0, complex_tests[i].src, complex_tests[i].srclen, c_buffer, complex_tests[i].dstlen, NULL, NULL);
+        ok(len == complex_tests[i].len &&
+           memcmp(c_buffer, complex_tests[i].dst, complex_tests[i].chars_written) == 0 &&
+           c_buffer[complex_tests[i].chars_written] == '#',
+           "complex_test failure i=%i len=%i dst=\"%s\"\n", i, len, c_buffer);
+        ok(GetLastError() == complex_tests[i].error, "error=%x\n", GetLastError());
+    }
 }
 
 static void test_undefined_byte_char(void)
-- 
2.1.2




More information about the wine-patches mailing list