From: Alex Henrie Subject: [PATCH 3/4] kernel32/tests: Add UTF-7 non-encoded surrounding characters tests. Message-Id: <1413780100-8876-3-git-send-email-alexhenrie24@gmail.com> Date: Sun, 19 Oct 2014 22:41:39 -0600 --- 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