[PATCH 4/4] kernel32/tests: Add UTF-7 encoded surrounding characters tests.

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


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

diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c
index bb67019..173d9e5 100644
--- a/dlls/kernel32/tests/codepage.c
+++ b/dlls/kernel32/tests/codepage.c
@@ -765,6 +765,49 @@ static void test_utf7_encoding(void)
         }
         ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError());
     }
+
+    /* test which one-byte characters are absorbed into surrounding base64 blocks */
+    /* (Windows always ends the base64 block when it encounters a directly encodable character) */
+    for (i = 0; i <= 0xFFFF; i++)
+    {
+        WCHAR w_buffer[] = {0x2672,i,0x2672,0};
+        char c_buffer[1024];
+        int len;
+
+        memset(c_buffer, '#', sizeof(c_buffer) - 1);
+        c_buffer[sizeof(c_buffer) - 1] = 0;
+        SetLastError(0xdeadbeef);
+
+        len = WideCharToMultiByte(CP_UTF7, 0, w_buffer, sizeof(w_buffer) / sizeof(WCHAR), c_buffer, 1023, NULL, NULL);
+
+        if (i == '+')
+        {
+            /* escapes */
+            ok(len == 13 &&
+               memcmp(c_buffer, "+JnI-+-+JnI-\0#", 14) == 0,
+               "encoded surrounding characters failure i='+' len=%i dst=\"%s\"\n", len, c_buffer);
+        }
+        else if (i <= 'z' && directly_encodable_table[i])
+        {
+            /* encodes directly */
+            ok(len == 12 &&
+               memcmp(c_buffer, "+JnI-", 5) == 0 && c_buffer[5] == i && memcmp(c_buffer + 6, "+JnI-\0#", 7) == 0,
+               "encoded surrounding characters failure i=0x%04x len=%i dst=\"%s\"\n", i, len, c_buffer);
+        }
+        else
+        {
+            /* base64-encodes */
+            ok(len == 11 &&
+               memcmp(c_buffer, "+Jn", 3) == 0 &&
+               c_buffer[3] == base64_encoding_table[8 | ((i & 0xC000) >> 14)] &&
+               c_buffer[4] == base64_encoding_table[(i & 0x3F00) >> 8] &&
+               c_buffer[5] == base64_encoding_table[(i & 0x00FC) >> 2] &&
+               c_buffer[6] == base64_encoding_table[((i & 0x0003) << 4) | 2] &&
+               memcmp(c_buffer + 7, "Zy-\0#", 5) == 0,
+               "encoded surrounding characters failure i=0x%04x len=%i dst=\"%s\" %c\n", i, len, c_buffer, base64_encoding_table[8 | ((i & 0xC000) >> 14)]);
+        }
+        ok(GetLastError() == 0xdeadbeef, "error=%x\n", GetLastError());
+    }
 }
 
 static void test_undefined_byte_char(void)
-- 
2.1.2




More information about the wine-patches mailing list