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

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


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

diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c
index 71876e7..bb67019 100644
--- a/dlls/kernel32/tests/codepage.c
+++ b/dlls/kernel32/tests/codepage.c
@@ -576,6 +576,43 @@ static void test_utf7_encoding(void)
         }
     };
 
+    static const BOOL directly_encodable_table[] = {
+        /* \0     \x01   \x02   \x03   \x04   \x05   \x06   \a   */
+           TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+        /* \b     \t     \n     \v     \f     \r     \x0E   \x0F */
+           FALSE, TRUE,  TRUE,  FALSE, FALSE, TRUE,  FALSE, FALSE,
+        /* \x10   \x11   \x12   \x13   \x14   \x15   \x16   \x17 */
+           FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+        /* \x18   \x19   \x1A   \e     \x1C   \x1D   \x1E   \x1F */
+           FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+        /*        !      "      #      $      %      &      '    */
+           TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,
+        /* (      )      *      +      ,      -      .      /    */
+           TRUE,  TRUE,  FALSE, TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        /* 0      1      2      3      4      5      6      7    */
+           TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        /* 8      9      :      ;      <      =      >      ?    */
+           TRUE,  TRUE,  TRUE,  FALSE, FALSE, FALSE, FALSE, TRUE,
+        /* @      A      B      C      D      E      F      G    */
+           FALSE, TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        /* H      I      J      K      L      M      N      O    */
+           TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        /* P      Q      R      S      T      U      V      W    */
+           TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        /* X      Y      Z      [      \      ]      ^      _    */
+           TRUE,  TRUE,  TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE,
+        /* `      a      b      c      d      e      f      g    */
+           FALSE, TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        /* h      i      j      k      l      m      n      o    */
+           TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        /* p      q      r      s      t      u      v      w    */
+           TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,  TRUE,
+        /* x      y      z                                       */
+           TRUE,  TRUE,  TRUE
+    };
+
+    static const char base64_encoding_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
     int i;
 
     for (i = 0; i < sizeof(simple_tests) / sizeof(simple_tests[0]); i++)
@@ -687,6 +724,47 @@ static void test_utf7_encoding(void)
            "complex_test failure i=%i len=%i dst=\"%s\"\n", i, len, c_buffer);
         ok(GetLastError() == complex_tests[i].error, "error=%x\n", GetLastError());
     }
+
+    /* test which characters are encoded if surrounded by non-encoded characters */
+    for (i = 0; i <= 0xFFFF; i++)
+    {
+        WCHAR w_buffer[] = {' ',i,' ',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 == 5 &&
+               memcmp(c_buffer, " +- \0#", 6) == 0,
+               "non-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 == 4 &&
+               c_buffer[0] == ' ' && c_buffer[1] == i && memcmp(c_buffer + 2, " \0#", 3) == 0,
+               "non-encoded surrounding characters failure i=0x%04x len=%i dst=\"%s\"\n", i, len, c_buffer);
+        }
+        else
+        {
+            /* base64-encodes */
+            ok(len == 8 &&
+               memcmp(c_buffer, " +", 2) == 0 &&
+               c_buffer[2] == base64_encoding_table[(i & 0xFC00) >> 10] &&
+               c_buffer[3] == base64_encoding_table[(i & 0x03F0) >> 4] &&
+               c_buffer[4] == base64_encoding_table[(i & 0x000F) << 2] &&
+               memcmp(c_buffer + 5, "- \0#", 4) == 0,
+               "non-encoded surrounding characters failure i=0x%04x len=%i dst=\"%s\" %c\n", i, len, c_buffer, base64_encoding_table[i & 0xFC00 >> 10]);
+        }
+        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