2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Tests for (Rtl)IsTextUnicode.
5 * PROGRAMMERS: Hermes Belusca-Maito
14 PVOID
LoadCodePageData(ULONG Code
)
16 char filename
[MAX_PATH
], sysdir
[MAX_PATH
];
19 GetSystemDirectoryA(sysdir
, MAX_PATH
);
22 StringCbPrintfA(filename
, sizeof(filename
), "%s\\c_%lu.nls", sysdir
, Code
);
24 StringCbPrintfA(filename
, sizeof(filename
), "%s\\l_intl.nls", sysdir
);
26 hFile
= CreateFile(filename
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, 0, NULL
);
27 if (hFile
!= INVALID_HANDLE_VALUE
)
30 DWORD dwFileSize
= GetFileSize(hFile
, NULL
);
31 Data
= malloc(dwFileSize
);
32 ReadFile(hFile
, Data
, dwFileSize
, &dwRead
, NULL
);
38 /* https://www.microsoft.com/resources/msdn/goglobal/default.mspx */
39 void SetupLocale(ULONG AnsiCode
, ULONG OemCode
, ULONG Unicode
)
41 NLSTABLEINFO NlsTable
;
42 PVOID AnsiCodePageData
;
43 PVOID OemCodePageData
;
44 PVOID UnicodeCaseTableData
;
46 AnsiCodePageData
= LoadCodePageData(AnsiCode
);
47 OemCodePageData
= LoadCodePageData(OemCode
);
48 UnicodeCaseTableData
= LoadCodePageData(Unicode
);
50 RtlInitNlsTables(AnsiCodePageData
, OemCodePageData
, UnicodeCaseTableData
, &NlsTable
);
51 RtlResetRtlTranslations(&NlsTable
);
52 /* Do NOT free the buffers here, they are directly used!
53 Yes, we leak the old buffers, but this is a test anyway... */
57 START_TEST(IsTextUnicode
)
59 #define INVALID_FLAG 0xFFFFFFFF
61 #define NEW_TEST(Buffer, Flags, ResultFlags, Success) \
62 { __LINE__, (PVOID)(Buffer), sizeof((Buffer)), (Flags), (ResultFlags), (Success) }
79 NEW_TEST("ANSI string", IS_TEXT_UNICODE_ASCII16
, 0, FALSE
),
80 NEW_TEST("ANSI string", IS_TEXT_UNICODE_STATISTICS
, 0, FALSE
),
81 NEW_TEST("ANSI string", INVALID_FLAG
, 0, FALSE
),
84 NEW_TEST(L
"a", IS_TEXT_UNICODE_ASCII16
, IS_TEXT_UNICODE_ASCII16
, TRUE
),
85 NEW_TEST(L
"a", IS_TEXT_UNICODE_UNICODE_MASK
, IS_TEXT_UNICODE_STATISTICS
| IS_TEXT_UNICODE_ASCII16
, TRUE
),
86 NEW_TEST(L
"a", IS_TEXT_UNICODE_STATISTICS
, IS_TEXT_UNICODE_STATISTICS
, TRUE
),
87 NEW_TEST(L
"a", INVALID_FLAG
, 0, TRUE
),
89 NEW_TEST(L
"UNICODE String 0", IS_TEXT_UNICODE_ASCII16
, 0, FALSE
),
90 NEW_TEST(L
"UNICODE String 0", IS_TEXT_UNICODE_UNICODE_MASK
, IS_TEXT_UNICODE_CONTROLS
| IS_TEXT_UNICODE_STATISTICS
, TRUE
),
91 NEW_TEST(L
"UNICODE String 0", IS_TEXT_UNICODE_STATISTICS
, IS_TEXT_UNICODE_STATISTICS
, TRUE
),
92 NEW_TEST(L
"UNICODE String 0", INVALID_FLAG
, 0, TRUE
),
94 NEW_TEST(L
"\xFEFF" L
"UNICODE String 1", IS_TEXT_UNICODE_ASCII16
, 0, FALSE
),
95 NEW_TEST(L
"\xFEFF" L
"UNICODE String 1", IS_TEXT_UNICODE_UNICODE_MASK
, IS_TEXT_UNICODE_SIGNATURE
| IS_TEXT_UNICODE_CONTROLS
, TRUE
),
96 NEW_TEST(L
"\xFEFF" L
"UNICODE String 1", IS_TEXT_UNICODE_STATISTICS
, 0, FALSE
),
97 NEW_TEST(L
"\xFEFF" L
"UNICODE String 1", INVALID_FLAG
, 0, TRUE
),
99 NEW_TEST(L
"\xFFFE" L
"UNICODE String 2", IS_TEXT_UNICODE_ASCII16
, 0, FALSE
),
100 NEW_TEST(L
"\xFFFE" L
"UNICODE String 2", IS_TEXT_UNICODE_UNICODE_MASK
, IS_TEXT_UNICODE_CONTROLS
, TRUE
),
101 NEW_TEST(L
"\xFFFE" L
"UNICODE String 2", IS_TEXT_UNICODE_STATISTICS
, 0, FALSE
),
102 NEW_TEST(L
"\xFFFE" L
"UNICODE String 2", INVALID_FLAG
, 0, FALSE
),
104 NEW_TEST(L
"UNICODE String 3 Привет!", IS_TEXT_UNICODE_ASCII16
, 0, FALSE
),
105 NEW_TEST(L
"UNICODE String 3 Привет!", IS_TEXT_UNICODE_UNICODE_MASK
, IS_TEXT_UNICODE_CONTROLS
| IS_TEXT_UNICODE_STATISTICS
, TRUE
),
106 NEW_TEST(L
"UNICODE String 3 Привет!", IS_TEXT_UNICODE_STATISTICS
, IS_TEXT_UNICODE_STATISTICS
, TRUE
),
107 NEW_TEST(L
"UNICODE String 3 Привет!", INVALID_FLAG
, 0, TRUE
),
109 NEW_TEST(L
"\xFEFF" L
"UNICODE String 4 Привет!", IS_TEXT_UNICODE_ASCII16
, 0, FALSE
),
110 NEW_TEST(L
"\xFEFF" L
"UNICODE String 4 Привет!", IS_TEXT_UNICODE_UNICODE_MASK
, IS_TEXT_UNICODE_SIGNATURE
| IS_TEXT_UNICODE_CONTROLS
, TRUE
),
111 NEW_TEST(L
"\xFEFF" L
"UNICODE String 4 Привет!", IS_TEXT_UNICODE_STATISTICS
, 0, FALSE
),
112 NEW_TEST(L
"\xFEFF" L
"UNICODE String 4 Привет!", INVALID_FLAG
, 0, TRUE
),
114 NEW_TEST(L
"\xFFFE" L
"UNICODE String 5 Привет!", IS_TEXT_UNICODE_ASCII16
, 0, FALSE
),
115 NEW_TEST(L
"\xFFFE" L
"UNICODE String 5 Привет!", IS_TEXT_UNICODE_UNICODE_MASK
, IS_TEXT_UNICODE_CONTROLS
, TRUE
),
116 NEW_TEST(L
"\xFFFE" L
"UNICODE String 5 Привет!", IS_TEXT_UNICODE_STATISTICS
, 0, FALSE
),
117 NEW_TEST(L
"\xFFFE" L
"UNICODE String 5 Привет!", INVALID_FLAG
, 0, FALSE
),
120 NEW_TEST(L
"UNICODE S" L
"\xFFFE" L
"tring 5 Привет!", IS_TEXT_UNICODE_ILLEGAL_CHARS
, IS_TEXT_UNICODE_ILLEGAL_CHARS
, FALSE
),
122 NEW_TEST(L
"UNICODE S" L
"\x0000" L
"tring 5 Привет!", IS_TEXT_UNICODE_ILLEGAL_CHARS
, IS_TEXT_UNICODE_ILLEGAL_CHARS
, FALSE
),
123 /* ASCII CRLF (packed into one word) */
124 NEW_TEST(L
"UNICODE S" L
"\x0A0D" L
"tring 5 Привет!", IS_TEXT_UNICODE_ILLEGAL_CHARS
, IS_TEXT_UNICODE_ILLEGAL_CHARS
, FALSE
),
126 NEW_TEST(L
"UNICODE S" L
"\xFFFF" L
"tring 5 Привет!", IS_TEXT_UNICODE_ILLEGAL_CHARS
, IS_TEXT_UNICODE_ILLEGAL_CHARS
, FALSE
),
128 NEW_TEST(L
"UNICODE String 0", IS_TEXT_UNICODE_DBCS_LEADBYTE
, 0, FALSE
)
131 const char japanese_with_lead
[] = "ABC" "\x83\x40" "D";
132 const char japanese_sjis
[] = "\x93\xFA\x96\x7B\x8C\xEA\x31\x32\x33\x93\xFA\x96\x7B\x8C\xEA";
133 const char japanese_utf8
[] = "\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E\x31\x32\x33\xE6\x97\xA5"
134 "\xE6\x9C\xAC\xE8\xAA\x9E";
135 const char simplfied_chinese_with_lead
[] = "ABC" "\xC5\xC5" "D";
136 const char korean_with_lead
[] = "ABC" "\xBF\xAD" "D";
137 const char traditional_chinese_with_lead
[] = "ABC" "\xB1\xC1" "D";
143 for (i
= 0; i
< ARRAYSIZE(Tests
); ++i
)
145 Result
= Tests
[i
].Flags
;
146 Success
= IsTextUnicode(Tests
[i
].Buffer
, Tests
[i
].Size
, ((Result
!= INVALID_FLAG
) ? &Result
: NULL
));
147 ok(Success
== Tests
[i
].Success
, "Line %u: IsTextUnicode() returned 0x%x, expected %s\n", Tests
[i
].lineno
, Success
, (Tests
[i
].Success
? "TRUE" : "FALSE"));
148 if (Result
!= INVALID_FLAG
)
149 ok(Result
== Tests
[i
].ResultFlags
, "Line %u: IsTextUnicode() Result returned 0x%x, expected 0x%x\n", Tests
[i
].lineno
, Result
, Tests
[i
].ResultFlags
);
153 SetupLocale(932, 932, -1);
155 Result
= IS_TEXT_UNICODE_DBCS_LEADBYTE
;
156 ok_int(IsTextUnicode(japanese_with_lead
, sizeof(japanese_with_lead
), &Result
), FALSE
);
157 ok_int(Result
, IS_TEXT_UNICODE_DBCS_LEADBYTE
);
159 ok_int(IsTextUnicode(japanese_sjis
, sizeof(japanese_sjis
) - 1, NULL
), FALSE
);
161 Result
= IS_TEXT_UNICODE_STATISTICS
| IS_TEXT_UNICODE_REVERSE_STATISTICS
;
162 ok_int(IsTextUnicode(japanese_sjis
, sizeof(japanese_sjis
) - 1, &Result
), FALSE
);
165 Result
= IS_TEXT_UNICODE_STATISTICS
| IS_TEXT_UNICODE_REVERSE_STATISTICS
|
166 IS_TEXT_UNICODE_DBCS_LEADBYTE
;
167 ok_int(IsTextUnicode(japanese_sjis
, sizeof(japanese_sjis
) - 1, &Result
), FALSE
);
168 ok_int(Result
, (IS_TEXT_UNICODE_DBCS_LEADBYTE
| IS_TEXT_UNICODE_REVERSE_STATISTICS
));
170 ok_int(IsTextUnicode(japanese_utf8
, sizeof(japanese_utf8
) - 1, NULL
), FALSE
);
172 Result
= IS_TEXT_UNICODE_STATISTICS
| IS_TEXT_UNICODE_REVERSE_STATISTICS
;
173 ok_int(IsTextUnicode(japanese_utf8
, sizeof(japanese_utf8
) - 1, &Result
), FALSE
);
176 Result
= IS_TEXT_UNICODE_STATISTICS
| IS_TEXT_UNICODE_REVERSE_STATISTICS
|
177 IS_TEXT_UNICODE_DBCS_LEADBYTE
;
178 ok_int(IsTextUnicode(japanese_utf8
, sizeof(japanese_utf8
) - 1, &Result
), FALSE
);
179 ok_int(Result
, (IS_TEXT_UNICODE_DBCS_LEADBYTE
| IS_TEXT_UNICODE_STATISTICS
));
181 /* Simplified Chinese */
182 SetupLocale(936, 936, -1);
184 Result
= IS_TEXT_UNICODE_DBCS_LEADBYTE
;
185 ok(!IsTextUnicode(simplfied_chinese_with_lead
, sizeof(simplfied_chinese_with_lead
), &Result
), "IsTextUnicode() returned TRUE, expected FALSE\n");
186 ok(Result
== IS_TEXT_UNICODE_DBCS_LEADBYTE
, "Result returned 0x%x, expected 0x%x\n", Result
, IS_TEXT_UNICODE_DBCS_LEADBYTE
);
189 SetupLocale(949, 949, -1);
191 Result
= IS_TEXT_UNICODE_DBCS_LEADBYTE
;
192 ok(!IsTextUnicode(korean_with_lead
, sizeof(korean_with_lead
), &Result
), "IsTextUnicode() returned TRUE, expected FALSE\n");
193 ok(Result
== IS_TEXT_UNICODE_DBCS_LEADBYTE
, "Result returned 0x%x, expected 0x%x\n", Result
, IS_TEXT_UNICODE_DBCS_LEADBYTE
);
195 /* Traditional Chinese */
196 SetupLocale(950, 950, -1);
198 Result
= IS_TEXT_UNICODE_DBCS_LEADBYTE
;
199 ok(!IsTextUnicode(traditional_chinese_with_lead
, sizeof(traditional_chinese_with_lead
), &Result
), "IsTextUnicode() returned TRUE, expected FALSE\n");
200 ok(Result
== IS_TEXT_UNICODE_DBCS_LEADBYTE
, "Result returned 0x%x, expected 0x%x\n", Result
, IS_TEXT_UNICODE_DBCS_LEADBYTE
);