ReactOS 0.4.16-dev-927-g467dec4
RtlLocale.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Tests for Rtl LCID functions
5 * COPYRIGHT: Copyright 2025 Timo Kreuzer <timo.kreuzer@reactos.org>
6 */
7
8#include "precomp.h"
9#include <winnls.h>
10
11typedef
15 _In_ LCID LcidValue,
17 _In_ ULONG Padding,
18 _Out_writes_(Size) PWSTR pResultBuf,
20
21typedef
27
28typedef
34
35typedef
43
44typedef
51
57
58#define FL_LOCALE 0x00000001
59#define FL_CULTURE 0x00000002
60#define FL_BOTH 0x00000003
61#define FL_ALT_NAME 0x00000004
62
63typedef struct _LCID_TEST_ENTRY
64{
70
71#define TEST(Lcid, CultureName, Flags) { __LINE__, Lcid, CultureName, Flags }
72
73//
74// For documentation see https://winprotocoldoc.z19.web.core.windows.net/MS-LCID/%5bMS-LCID%5d.pdf
75// The comments are based on the comments in the document, they might not apply in all cases.
76//
78{
79 TEST(0x0000, NULL, 0),
80 TEST(0x0001, L"ar", FL_CULTURE),
81 TEST(0x0002, L"bg", FL_CULTURE),
82 TEST(0x0003, L"ca", FL_CULTURE),
83 TEST(0x0004, L"zh-Hans", FL_CULTURE),
84 TEST(0x0005, L"cs", FL_CULTURE),
85 TEST(0x0006, L"da", FL_CULTURE),
86 TEST(0x0007, L"de", FL_CULTURE),
87 TEST(0x0008, L"el", FL_CULTURE),
88 TEST(0x0009, L"en", FL_CULTURE),
89 TEST(0x000A, L"es", FL_CULTURE),
90 TEST(0x000B, L"fi", FL_CULTURE),
91 TEST(0x000C, L"fr", FL_CULTURE),
92 TEST(0x000D, L"he", FL_CULTURE),
93 TEST(0x000E, L"hu", FL_CULTURE),
94 TEST(0x000F, L"is", FL_CULTURE),
95 TEST(0x0010, L"it", FL_CULTURE),
96 TEST(0x0011, L"ja", FL_CULTURE),
97 TEST(0x0012, L"ko", FL_CULTURE),
98 TEST(0x0013, L"nl", FL_CULTURE),
99 TEST(0x0014, L"no", FL_CULTURE),
100 TEST(0x0015, L"pl", FL_CULTURE),
101 TEST(0x0016, L"pt", FL_CULTURE),
102 TEST(0x0017, L"rm", FL_CULTURE),
103 TEST(0x0018, L"ro", FL_CULTURE),
104 TEST(0x0019, L"ru", FL_CULTURE),
105 TEST(0x001A, L"hr", FL_CULTURE),
106 TEST(0x001B, L"sk", FL_CULTURE),
107 TEST(0x001C, L"sq", FL_CULTURE),
108 TEST(0x001D, L"sv", FL_CULTURE),
109 TEST(0x001E, L"th", FL_CULTURE),
110 TEST(0x001F, L"tr", FL_CULTURE),
111 TEST(0x0020, L"ur", FL_CULTURE),
112 TEST(0x0021, L"id", FL_CULTURE),
113 TEST(0x0022, L"uk", FL_CULTURE),
114 TEST(0x0023, L"be", FL_CULTURE),
115 TEST(0x0024, L"sl", FL_CULTURE),
116 TEST(0x0025, L"et", FL_CULTURE),
117 TEST(0x0026, L"lv", FL_CULTURE),
118 TEST(0x0027, L"lt", FL_CULTURE),
119 TEST(0x0028, L"tg", FL_CULTURE),
120 TEST(0x0029, L"fa", FL_CULTURE),
121 TEST(0x002A, L"vi", FL_CULTURE),
122 TEST(0x002B, L"hy", FL_CULTURE),
123 TEST(0x002C, L"az", FL_CULTURE),
124 TEST(0x002D, L"eu", FL_CULTURE),
125 TEST(0x002E, L"hsb", FL_CULTURE),
126 TEST(0x002F, L"mk", FL_CULTURE),
127 TEST(0x0030, L"st", FL_CULTURE),
128 TEST(0x0031, L"ts", FL_CULTURE),
129 TEST(0x0032, L"tn", FL_CULTURE),
130 TEST(0x0033, L"ve", FL_CULTURE),
131 TEST(0x0034, L"xh", FL_CULTURE),
132 TEST(0x0035, L"zu", FL_CULTURE),
133 TEST(0x0036, L"af", FL_CULTURE),
134 TEST(0x0037, L"ka", FL_CULTURE),
135 TEST(0x0038, L"fo", FL_CULTURE),
136 TEST(0x0039, L"hi", FL_CULTURE),
137 TEST(0x003A, L"mt", FL_CULTURE),
138 TEST(0x003B, L"se", FL_CULTURE),
139 TEST(0x003C, L"ga", FL_CULTURE),
140 TEST(0x003D, L"yi", FL_CULTURE), // reserved
141 TEST(0x003E, L"ms", FL_CULTURE),
142 TEST(0x003F, L"kk", FL_CULTURE),
143 TEST(0x003F, L"Kk-Cyrl", FL_CULTURE | FL_ALT_NAME), // reserved, see LCID 0x783F
144 TEST(0x0040, L"ky", FL_CULTURE),
145 TEST(0x0041, L"sw", FL_CULTURE),
146 TEST(0x0042, L"tk", FL_CULTURE),
147 TEST(0x0043, L"uz", FL_CULTURE),
148 TEST(0x0044, L"tt", FL_CULTURE),
149 TEST(0x0045, L"bn", FL_CULTURE),
150 TEST(0x0046, L"pa", FL_CULTURE),
151 TEST(0x0047, L"gu", FL_CULTURE),
152 TEST(0x0048, L"or", FL_CULTURE),
153 TEST(0x0049, L"ta", FL_CULTURE),
154 TEST(0x004A, L"te", FL_CULTURE),
155 TEST(0x004B, L"kn", FL_CULTURE),
156 TEST(0x004C, L"ml", FL_CULTURE),
157 TEST(0x004D, L"as", FL_CULTURE),
158 TEST(0x004E, L"mr", FL_CULTURE),
159 TEST(0x004F, L"sa", FL_CULTURE),
160 TEST(0x0050, L"mn", FL_CULTURE),
161 TEST(0x0051, L"bo", FL_CULTURE),
162 TEST(0x0052, L"cy", FL_CULTURE),
163 TEST(0x0053, L"km", FL_CULTURE),
164 TEST(0x0054, L"lo", FL_CULTURE),
165 TEST(0x0055, L"my", FL_CULTURE),
166 TEST(0x0056, L"gl", FL_CULTURE),
167 TEST(0x0057, L"kok", FL_CULTURE),
168 TEST(0x0058, L"mni", FL_CULTURE), // reserved
169 TEST(0x0059, L"sd", FL_CULTURE),
170 TEST(0x005A, L"syr", FL_CULTURE),
171 TEST(0x005B, L"si", FL_CULTURE),
172 TEST(0x005C, L"chr", FL_CULTURE),
173 TEST(0x005D, L"iu", FL_CULTURE),
174 TEST(0x005E, L"am", FL_CULTURE),
175 TEST(0x005F, L"tzm", FL_CULTURE),
176 TEST(0x0060, L"ks", FL_CULTURE),
177 TEST(0x0061, L"ne", FL_CULTURE),
178 TEST(0x0062, L"fy", FL_CULTURE),
179 TEST(0x0063, L"ps", FL_CULTURE),
180 TEST(0x0064, L"fil", FL_CULTURE),
181 TEST(0x0065, L"dv", FL_CULTURE),
182 TEST(0x0066, L"bin", FL_CULTURE), // reserved
183 TEST(0x0067, L"ff", FL_CULTURE),
184 TEST(0x0068, L"ha", FL_CULTURE),
185 TEST(0x0069, L"ibb", FL_CULTURE), // reserved
186 TEST(0x006A, L"yo", FL_CULTURE),
187 TEST(0x006B, L"quz", FL_CULTURE),
188 TEST(0x006C, L"nso", FL_CULTURE),
189 TEST(0x006D, L"ba", FL_CULTURE),
190 TEST(0x006E, L"lb", FL_CULTURE),
191 TEST(0x006F, L"kl", FL_CULTURE),
192 TEST(0x0070, L"ig", FL_CULTURE),
193 TEST(0x0071, L"kr", FL_CULTURE), // reserved
194 TEST(0x0072, L"om", FL_CULTURE),
195 TEST(0x0073, L"ti", FL_CULTURE),
196 TEST(0x0074, L"gn", FL_CULTURE),
197 TEST(0x0075, L"haw", FL_CULTURE),
198 TEST(0x0076, L"la", FL_CULTURE), // reserved
199 TEST(0x0077, L"so", FL_CULTURE), // reserved
200 TEST(0x0078, L"ii", FL_CULTURE),
201 TEST(0x0079, L"pap", FL_CULTURE), // reserved
202 TEST(0x007A, L"arn", FL_CULTURE),
203 TEST(0x007B, NULL, 0), // Neither defined nor reserved
204 TEST(0x007C, L"moh", FL_CULTURE),
205 TEST(0x007D, NULL, 0), // Neither defined nor reserved
206 TEST(0x007E, L"br", FL_CULTURE),
207 //TEST(0x007F, L"", FL_BOTH), // CULTURE_INVARIANT
208 TEST(0x0080, L"ug", FL_CULTURE),
209 TEST(0x0081, L"mi", FL_CULTURE),
210 TEST(0x0082, L"oc", FL_CULTURE),
211 TEST(0x0083, L"co", FL_CULTURE),
212 TEST(0x0084, L"gsw", FL_CULTURE),
213 TEST(0x0085, L"sah", FL_CULTURE),
214 TEST(0x0086, L"quc", FL_CULTURE), // Doc says qut, see LCID 0x0093
215 TEST(0x0086, L"qut", FL_CULTURE | FL_ALT_NAME),
216 TEST(0x0087, L"rw", FL_CULTURE),
217 TEST(0x0088, L"wo", FL_CULTURE),
218 TEST(0x0089, NULL, 0), // Neither defined nor reserved
219 TEST(0x008A, NULL, 0), // Neither defined nor reserved
220 TEST(0x008B, NULL, 0), // Neither defined nor reserved
221 TEST(0x008C, L"prs", FL_CULTURE),
222 TEST(0x008D, NULL, 0), // Neither defined nor reserved
223 TEST(0x008E, NULL, 0), // Neither defined nor reserved
224 TEST(0x008F, NULL, 0), // Neither defined nor reserved
225 TEST(0x0090, NULL, 0), // Neither defined nor reserved
226 TEST(0x0091, L"gd", FL_CULTURE),
227 TEST(0x0092, L"ku", FL_CULTURE),
228 TEST(0x0093, NULL, 0), // reserved, quc, see LCID 0x0086
229 TEST(0x0401, L"ar-SA", FL_BOTH),
230 TEST(0x0402, L"bg-BG", FL_BOTH),
231 TEST(0x0403, L"ca-ES", FL_BOTH),
232 TEST(0x0404, L"zh-TW", FL_BOTH),
233 TEST(0x0405, L"cs-CZ", FL_BOTH),
234 TEST(0x0406, L"da-DK", FL_BOTH),
235 TEST(0x0407, L"de-DE", FL_BOTH),
236 TEST(0x0408, L"el-GR", FL_BOTH),
237 TEST(0x0409, L"en-US", FL_BOTH),
238 TEST(0x040A, L"es-ES_tradnl", FL_BOTH),
239 TEST(0x040B, L"fi-FI", FL_BOTH),
240 TEST(0x040C, L"fr-FR", FL_BOTH),
241 TEST(0x040D, L"he-IL", FL_BOTH),
242 TEST(0x040E, L"hu-HU", FL_BOTH),
243 TEST(0x040F, L"is-IS", FL_BOTH),
244 TEST(0x0410, L"it-IT", FL_BOTH),
245 TEST(0x0411, L"ja-JP", FL_BOTH),
246 TEST(0x0412, L"ko-KR", FL_BOTH),
247 TEST(0x0413, L"nl-NL", FL_BOTH),
248 TEST(0x0414, L"nb-NO", FL_BOTH),
249 TEST(0x0415, L"pl-PL", FL_BOTH),
250 TEST(0x0416, L"pt-BR", FL_BOTH),
251 TEST(0x0417, L"rm-CH", FL_BOTH),
252 TEST(0x0418, L"ro-RO", FL_BOTH),
253 TEST(0x0419, L"ru-RU", FL_BOTH),
254 TEST(0x041A, L"hr-HR", FL_BOTH),
255 TEST(0x041B, L"sk-SK", FL_BOTH),
256 TEST(0x041C, L"sq-AL", FL_BOTH),
257 TEST(0x041D, L"sv-SE", FL_BOTH),
258 TEST(0x041E, L"th-TH", FL_BOTH),
259 TEST(0x041F, L"tr-TR", FL_BOTH),
260 TEST(0x0420, L"ur-PK", FL_BOTH),
261 TEST(0x0421, L"id-ID", FL_BOTH),
262 TEST(0x0422, L"uk-UA", FL_BOTH),
263 TEST(0x0423, L"be-BY", FL_BOTH),
264 TEST(0x0424, L"sl-SI", FL_BOTH),
265 TEST(0x0425, L"et-EE", FL_BOTH),
266 TEST(0x0426, L"lv-LV", FL_BOTH),
267 TEST(0x0427, L"lt-LT", FL_BOTH),
268 TEST(0x0428, L"tg-Cyrl-TJ", FL_BOTH),
269 TEST(0x0429, L"fa-IR", FL_BOTH),
270 TEST(0x042A, L"vi-VN", FL_BOTH),
271 TEST(0x042B, L"hy-AM", FL_BOTH),
272 TEST(0x042C, L"az-Latn-AZ", FL_BOTH),
273 TEST(0x042D, L"eu-ES", FL_BOTH),
274 TEST(0x042E, L"hsb-DE", FL_BOTH),
275 TEST(0x042F, L"mk-MK", FL_BOTH),
276 TEST(0x0430, L"st-ZA", FL_BOTH),
277 TEST(0x0431, L"ts-ZA", FL_BOTH),
278 TEST(0x0432, L"tn-ZA", FL_BOTH),
279 TEST(0x0433, L"ve-ZA", FL_BOTH),
280 TEST(0x0434, L"xh-ZA", FL_BOTH),
281 TEST(0x0435, L"zu-ZA", FL_BOTH),
282 TEST(0x0436, L"af-ZA", FL_BOTH),
283 TEST(0x0437, L"ka-GE", FL_BOTH),
284 TEST(0x0438, L"fo-FO", FL_BOTH),
285 TEST(0x0439, L"hi-IN", FL_BOTH),
286 TEST(0x043A, L"mt-MT", FL_BOTH),
287 TEST(0x043B, L"se-NO", FL_BOTH),
288 TEST(0x043D, L"yi-001", FL_BOTH),
289 TEST(0x043E, L"ms-MY", FL_BOTH),
290 TEST(0x043F, L"kk-KZ", FL_BOTH),
291 TEST(0x0440, L"ky-KG", FL_BOTH),
292 TEST(0x0441, L"sw-KE", FL_BOTH),
293 TEST(0x0442, L"tk-TM", FL_BOTH),
294 TEST(0x0443, L"uz-Latn-UZ", FL_BOTH),
295 TEST(0x0444, L"tt-RU", FL_BOTH),
296 TEST(0x0445, L"bn-IN", FL_BOTH),
297 TEST(0x0446, L"pa-IN", FL_BOTH),
298 TEST(0x0447, L"gu-IN", FL_BOTH),
299 TEST(0x0448, L"or-IN", FL_BOTH),
300 TEST(0x0449, L"ta-IN", FL_BOTH),
301 TEST(0x044A, L"te-IN", FL_BOTH),
302 TEST(0x044B, L"kn-IN", FL_BOTH),
303 TEST(0x044C, L"ml-IN", FL_BOTH),
304 TEST(0x044D, L"as-IN", FL_BOTH),
305 TEST(0x044E, L"mr-IN", FL_BOTH),
306 TEST(0x044F, L"sa-IN", FL_BOTH),
307 TEST(0x0450, L"mn-MN", FL_BOTH),
308 TEST(0x0451, L"bo-CN", FL_BOTH),
309 TEST(0x0452, L"cy-GB", FL_BOTH),
310 TEST(0x0453, L"km-KH", FL_BOTH),
311 TEST(0x0454, L"lo-LA", FL_BOTH),
312 TEST(0x0455, L"my-MM", FL_BOTH),
313 TEST(0x0456, L"gl-ES", FL_BOTH),
314 TEST(0x0457, L"kok-IN", FL_BOTH),
315 TEST(0x0458, L"mni-IN", FL_BOTH), // reserved
316 TEST(0x0459, L"sd-Deva-IN", FL_BOTH), // reserved
317 TEST(0x045A, L"syr-SY", FL_BOTH),
318 TEST(0x045B, L"si-LK", FL_BOTH),
319 TEST(0x045C, L"chr-Cher-US", FL_BOTH),
320 TEST(0x045D, L"iu-Cans-CA", FL_BOTH),
321 TEST(0x045E, L"am-ET", FL_BOTH),
322 TEST(0x045F, L"tzm-Arab-MA", FL_BOTH),
323 TEST(0x0460, L"ks-Arab", FL_CULTURE),
324 TEST(0x0461, L"ne-NP", FL_BOTH),
325 TEST(0x0462, L"fy-NL", FL_BOTH),
326 TEST(0x0463, L"ps-AF", FL_BOTH),
327 TEST(0x0464, L"fil-PH", FL_BOTH),
328 TEST(0x0465, L"dv-MV", FL_BOTH),
329 TEST(0x0466, L"bin-NG", FL_BOTH), // reserved
330 TEST(0x0467, L"ff-Latn-NG", FL_BOTH),
331 TEST(0x0467, L"ff-NG", FL_BOTH | FL_ALT_NAME),
332 TEST(0x0468, L"ha-Latn-NG", FL_BOTH),
333 TEST(0x0469, L"ibb-NG", FL_BOTH), // reserved
334 TEST(0x046A, L"yo-NG", FL_BOTH),
335 TEST(0x046B, L"quz-BO", FL_BOTH),
336 TEST(0x046C, L"nso-ZA", FL_BOTH),
337 TEST(0x046D, L"ba-RU", FL_BOTH),
338 TEST(0x046E, L"lb-LU", FL_BOTH),
339 TEST(0x046F, L"kl-GL", FL_BOTH),
340 TEST(0x0470, L"ig-NG", FL_BOTH),
341 TEST(0x0471, L"kr-Latn-NG", FL_BOTH),
342 TEST(0x0472, L"om-ET", FL_BOTH),
343 TEST(0x0473, L"ti-ET", FL_BOTH),
344 TEST(0x0474, L"gn-PY", FL_BOTH),
345 TEST(0x0475, L"haw-US", FL_BOTH),
346 TEST(0x0476, L"la-001", FL_BOTH), // Doc says la-VA
347 TEST(0x0477, L"so-SO", FL_BOTH),
348 TEST(0x0478, L"ii-CN", FL_BOTH),
349 TEST(0x0479, L"pap-029", FL_BOTH), // reserved
350 TEST(0x047A, L"arn-CL", FL_BOTH),
351 TEST(0x047C, L"moh-CA", FL_BOTH),
352 TEST(0x047E, L"br-FR", FL_BOTH),
353 TEST(0x0480, L"ug-CN", FL_BOTH),
354 TEST(0x0481, L"mi-NZ", FL_BOTH),
355 TEST(0x0482, L"oc-FR", FL_BOTH),
356 TEST(0x0483, L"co-FR", FL_BOTH),
357 TEST(0x0484, L"gsw-FR", FL_BOTH),
358 TEST(0x0485, L"sah-RU", FL_BOTH),
359 TEST(0x0486, L"quc-Latn-GT", FL_BOTH), // reserved, Doc says qut-GT
360 TEST(0x0486, L"qut-GT", FL_BOTH | FL_ALT_NAME),
361 TEST(0x0487, L"rw-RW", FL_BOTH),
362 TEST(0x0488, L"wo-SN", FL_BOTH),
363 TEST(0x048C, L"prs-AF", FL_BOTH),
364 TEST(0x048D, L"plt-MG", 0), // reserved, plt-MG
365 TEST(0x048E, L"zh-yue-HK", 0), // reserved, zh-yue-HK
366 TEST(0x048F, L"tdd-Tale-CN", 0), // reserved, tdd-Tale-CN
367 TEST(0x0490, L"khb-Talu-CN", 0), // reserved, khb-Talu-CN
368 TEST(0x0491, L"gd-GB", FL_BOTH),
369 TEST(0x0492, L"ku-Arab-IQ", FL_BOTH),
370 TEST(0x0493, L"khb-Talu-CN", 0), // reserved, quc-CO
371 //TEST(0x0501, L"qps-ploc", FL_BOTH), // Needs special handling
372 TEST(0x05FE, L"qps-ploca", FL_BOTH),
373 TEST(0x0801, L"ar-IQ", FL_BOTH),
374 TEST(0x0803, L"ca-ES-valencia", FL_BOTH),
375 TEST(0x0804, L"zh-CN", FL_BOTH),
376 TEST(0x0807, L"de-CH", FL_BOTH),
377 TEST(0x0809, L"en-GB", FL_BOTH),
378 TEST(0x080A, L"es-MX", FL_BOTH),
379 TEST(0x080C, L"fr-BE", FL_BOTH),
380 TEST(0x0810, L"it-CH", FL_BOTH),
381 TEST(0x0811, L"ja-Ploc-JP", 0), // reserved, ja-Ploc-JP
382 TEST(0x0813, L"nl-BE", FL_BOTH),
383 TEST(0x0814, L"nn-NO", FL_BOTH),
384 TEST(0x0816, L"pt-PT", FL_BOTH),
385 TEST(0x0818, L"ro-MD", FL_BOTH),
386 TEST(0x0819, L"ru-MD", FL_BOTH),
387 TEST(0x081A, L"sr-Latn-CS", FL_BOTH),
388 TEST(0x081D, L"sv-FI", FL_BOTH),
389 TEST(0x0820, L"ur-IN", FL_BOTH),
390 TEST(0x0827, NULL, 0), // Neither defined nor reserved
391 TEST(0x082C, L"az-Cyrl-AZ", FL_BOTH), // reserved
392 TEST(0x082E, L"dsb-DE", FL_BOTH),
393 TEST(0x0832, L"tn-BW", FL_BOTH),
394 TEST(0x083B, L"se-SE", FL_BOTH),
395 TEST(0x083C, L"ga-IE", FL_BOTH),
396 TEST(0x083E, L"ms-BN", FL_BOTH),
397 TEST(0x083F, NULL, 0), // reserved, kk-Latn-KZ
398 TEST(0x0843, L"uz-Cyrl-UZ", FL_BOTH), // reserved
399 TEST(0x0845, L"bn-BD", FL_BOTH),
400 TEST(0x0846, L"pa-Arab-PK", FL_BOTH),
401 TEST(0x0849, L"ta-LK", FL_BOTH),
402 TEST(0x0850, L"mn-Mong-CN", FL_BOTH), // reserved
403 TEST(0x0851, NULL, 0), // reserved, bo-BT,
404 TEST(0x0859, L"sd-Arab-PK", FL_BOTH),
405 TEST(0x085D, L"iu-Latn-CA", FL_BOTH),
406 TEST(0x085F, L"tzm-Latn-DZ", FL_BOTH),
407 TEST(0x0860, L"ks-Deva-IN", FL_BOTH),
408 TEST(0x0861, L"ne-IN", FL_BOTH),
409 TEST(0x0867, L"ff-Latn-SN", FL_BOTH),
410 TEST(0x086B, L"quz-EC", FL_BOTH),
411 TEST(0x0873, L"ti-ER", FL_BOTH),
412 TEST(0x09FF, L"qps-plocm", FL_BOTH),
413 //TEST(0x0C00, NULL, 0),// Locale without assigned LCID if the current user default locale. See section 2.2.1.
414 TEST(0x0C01, L"ar-EG", FL_BOTH),
415 TEST(0x0C04, L"zh-HK", FL_BOTH),
416 TEST(0x0C07, L"de-AT", FL_BOTH),
417 TEST(0x0C09, L"en-AU", FL_BOTH),
418 TEST(0x0C0A, L"es-ES", FL_BOTH),
419 TEST(0x0C0C, L"fr-CA", FL_BOTH),
420 TEST(0x0C1A, L"sr-Cyrl-CS", FL_BOTH),
421 TEST(0x0C3B, L"se-FI", FL_BOTH),
422 TEST(0x0C50, L"mn-Mong-MN", FL_BOTH),
423 TEST(0x0C51, L"dz-BT", FL_BOTH),
424 TEST(0x0C5F, L"Tmz-MA", 0), // reserved, Tmz-MA
425 TEST(0x0C6b, L"quz-PE", FL_BOTH),
426 TEST(0x1000, NULL, 0), // Locale without assigned LCID if the current user default locale. See section 2.2.1.
427 TEST(0x1001, L"ar-LY", FL_BOTH),
428 TEST(0x1004, L"zh-SG", FL_BOTH),
429 TEST(0x1007, L"de-LU", FL_BOTH),
430 TEST(0x1009, L"en-CA", FL_BOTH),
431 TEST(0x100A, L"es-GT", FL_BOTH),
432 TEST(0x100C, L"fr-CH", FL_BOTH),
433 TEST(0x101A, L"hr-BA", FL_BOTH),
434 TEST(0x103B, L"smj-NO", FL_BOTH),
435 TEST(0x105F, L"tzm-Tfng-MA", FL_BOTH),
436 //TEST(0x1400, NULL, 0),
437 TEST(0x1401, L"ar-DZ", FL_BOTH),
438 TEST(0x1404, L"zh-MO", FL_BOTH),
439 TEST(0x1407, L"de-LI", FL_BOTH),
440 TEST(0x1409, L"en-NZ", FL_BOTH),
441 TEST(0x140A, L"es-CR", FL_BOTH),
442 TEST(0x140C, L"fr-LU", FL_BOTH),
443 TEST(0x141A, L"bs-Latn-BA", FL_BOTH),
444 TEST(0x143B, L"smj-SE", FL_BOTH),
445 TEST(0x1801, L"ar-MA", FL_BOTH),
446 TEST(0x1809, L"en-IE", FL_BOTH),
447 TEST(0x180A, L"es-PA", FL_BOTH),
448 TEST(0x180C, L"fr-MC", FL_BOTH),
449 TEST(0x181A, L"sr-Latn-BA", FL_BOTH),
450 TEST(0x183B, L"sma-NO", FL_BOTH),
451 TEST(0x1C01, L"ar-TN", FL_BOTH),
452 TEST(0x1C09, L"en-ZA", FL_BOTH),
453 TEST(0x1C0A, L"es-DO", FL_BOTH),
454 TEST(0x1C0C, L"fr-029", FL_BOTH),
455 TEST(0x1C1A, L"sr-Cyrl-BA", FL_BOTH),
456 TEST(0x1C3B, L"sma-SE", FL_BOTH),
457 TEST(0x2000, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
458 TEST(0x2001, L"ar-OM", FL_BOTH),
459 TEST(0x2008, NULL, 0), // Neither defined nor reserved
460 TEST(0x2009, L"en-JM", FL_BOTH),
461 TEST(0x200A, L"es-VE", FL_BOTH),
462 TEST(0x200C, L"fr-RE", FL_BOTH),
463 TEST(0x201A, L"bs-Cyrl-BA", FL_BOTH),
464 TEST(0x203B, L"sms-FI", FL_BOTH),
465 TEST(0x2400, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
466 TEST(0x2401, L"ar-YE", FL_BOTH),
467 TEST(0x2409, L"en-029", FL_BOTH), // reserved
468 TEST(0x240A, L"es-CO", FL_BOTH),
469 TEST(0x240C, L"fr-CD", FL_BOTH),
470 TEST(0x241A, L"sr-Latn-RS", FL_BOTH),
471 TEST(0x243B, L"smn-FI", FL_BOTH),
472 TEST(0x2800, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
473 TEST(0x2801, L"ar-SY", FL_BOTH),
474 TEST(0x2809, L"en-BZ", FL_BOTH),
475 TEST(0x280A, L"es-PE", FL_BOTH),
476 TEST(0x280C, L"fr-SN", FL_BOTH),
477 TEST(0x281A, L"sr-Cyrl-RS", FL_BOTH),
478 TEST(0x2C00, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
479 TEST(0x2C01, L"ar-JO", FL_BOTH),
480 TEST(0x2C09, L"en-TT", FL_BOTH),
481 TEST(0x2C0A, L"es-AR", FL_BOTH),
482 TEST(0x2C0C, L"fr-CM", FL_BOTH),
483 TEST(0x2C1A, L"sr-Latn-ME", FL_BOTH),
484 TEST(0x3000, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
485 TEST(0x3001, L"ar-LB", FL_BOTH),
486 TEST(0x3009, L"en-ZW", FL_BOTH),
487 TEST(0x300A, L"es-EC", FL_BOTH),
488 TEST(0x300C, L"fr-CI", FL_BOTH),
489 TEST(0x301A, L"sr-Cyrl-ME", FL_BOTH),
490 TEST(0x3400, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
491 TEST(0x3401, L"ar-KW", FL_BOTH),
492 TEST(0x3409, L"en-PH", FL_BOTH),
493 TEST(0x340A, L"es-CL", FL_BOTH),
494 TEST(0x340C, L"fr-ML", FL_BOTH),
495 TEST(0x3800, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
496 TEST(0x3801, L"ar-AE", FL_BOTH),
497 TEST(0x3809, L"en-ID", FL_BOTH), // reserved
498 TEST(0x380A, L"es-UY", FL_BOTH),
499 TEST(0x380C, L"fr-MA", FL_BOTH),
500 TEST(0x3C00, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
501 TEST(0x3C01, L"ar-BH", FL_BOTH),
502 TEST(0x3C09, L"en-HK", FL_BOTH),
503 TEST(0x3C0A, L"es-PY", FL_BOTH),
504 TEST(0x3C0C, L"fr-HT", FL_BOTH),
505 TEST(0x4000, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
506 TEST(0x4001, L"ar-QA", FL_BOTH),
507 TEST(0x4009, L"en-IN", FL_BOTH),
508 TEST(0x400A, L"es-BO", FL_BOTH),
509 TEST(0x4400, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
510 TEST(0x4401, L"ar-Ploc-SA", 0), // reserved, ar-Ploc-SA
511 TEST(0x4409, L"en-MY", FL_BOTH),
512 TEST(0x440A, L"es-SV", FL_BOTH),
513 TEST(0x4800, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
514 TEST(0x4801, L"ar-145", 0), // reserved, ar-145
515 TEST(0x4809, L"en-SG", FL_BOTH),
516 TEST(0x480A, L"es-HN", FL_BOTH),
517 TEST(0x4C00, NULL, 0), // Unassigned LCID locale temporarily assigned to LCID 0x3000. See section 2.2.1.
518 TEST(0x4C09, L"en-AE", FL_BOTH),
519 TEST(0x4C0A, L"es-NI", FL_BOTH),
520 TEST(0x5009, L"en-BH", 0), // reserved
521 TEST(0x500A, L"es-PR", FL_BOTH),
522 TEST(0x5409, L"en-EG", 0), // reserved
523 TEST(0x540A, L"es-US", FL_BOTH),
524 TEST(0x5809, L"en-JO", 0), // reserved
525 TEST(0x580A, L"es-419", FL_BOTH),// reserved
526 TEST(0x5C09, L"en-KW", 0), // reserved
527 TEST(0x5C0A, L"es-CU", FL_BOTH),
528 TEST(0x6009, L"en-TR", 0), // reserved
529 TEST(0x6409, L"en-YE", 0), // reserved
530 TEST(0x641A, L"bs-Cyrl", FL_CULTURE),
531 TEST(0x681A, L"bs-Latn", FL_CULTURE),
532 TEST(0x6C1A, L"sr-Cyrl", FL_CULTURE),
533 TEST(0x701A, L"sr-Latn", FL_CULTURE),
534 TEST(0x703B, L"smn", FL_CULTURE),
535 TEST(0x742C, L"az-Cyrl", FL_CULTURE),
536 TEST(0x743B, L"sms", FL_CULTURE),
537 TEST(0x7804, L"zh", FL_CULTURE),
538 TEST(0x7814, L"nn", FL_CULTURE),
539 TEST(0x781A, L"bs", FL_CULTURE),
540 TEST(0x782C, L"az-Latn", FL_CULTURE),
541 TEST(0x783B, L"sma", FL_CULTURE),
542 //TEST(0x783F, L"kk-Cyrl", FL_BOTH), // reserved, see LCID 0x003F
543 TEST(0x7843, L"uz-Cyrl", FL_CULTURE),
544 TEST(0x7850, L"mn-Cyrl", FL_CULTURE),
545 TEST(0x785D, L"iu-Cans", FL_CULTURE),
546 TEST(0x785F, L"tzm-Tfng", FL_CULTURE),
547 TEST(0x7C04, L"zh-Hant", FL_CULTURE),
548 TEST(0x7C14, L"nb", FL_CULTURE),
549 TEST(0x7C1A, L"sr", FL_CULTURE),
550 TEST(0x7C28, L"tg-Cyrl", FL_CULTURE),
551 TEST(0x7C2E, L"dsb", FL_CULTURE),
552 TEST(0x7C3B, L"smj", FL_CULTURE),
553 TEST(0x7C3F, L"kk-Latn", 0), // reserved
554 TEST(0x7C43, L"uz-Latn", FL_CULTURE),
555 TEST(0x7C46, L"pa-Arab", FL_CULTURE),
556 TEST(0x7C50, L"mn-Mong", FL_CULTURE),
557 TEST(0x7C59, L"sd-Arab", FL_CULTURE),
558 TEST(0x7C5C, L"chr-Cher", FL_CULTURE),
559 TEST(0x7C5D, L"iu-Latn", FL_CULTURE),
560 TEST(0x7C5F, L"tzm-Latn", FL_CULTURE),
561 TEST(0x7C67, L"ff-Latn", FL_CULTURE),
562 TEST(0x7C68, L"ha-Latn", FL_CULTURE),
563 TEST(0x7C92, L"ku-Arab", FL_CULTURE),
564 TEST(0xF2EE, NULL, 0), // reserved
565 TEST(0xE40C, L"fr-015", 0), // reserved
566 TEST(0xEEEE, NULL, 0), // reserved
567
568 // Alternative sorting
569 TEST(0x10407, L"de-DE_phoneb", FL_BOTH),
570 TEST(0x1040E, L"hu-HU_technl", FL_BOTH),
571 TEST(0x10437, L"ka-GE_modern", FL_BOTH),
572 TEST(0x20804, L"zh-CN_stroke", FL_BOTH),
573 TEST(0x21004, L"zh-SG_stroke", FL_BOTH),
574 TEST(0x30404, L"zh-TW_pronun", FL_BOTH),
575 TEST(0x40404, L"zh-TW_radstr", FL_BOTH),
576 TEST(0x40411, L"ja-JP_radstr", FL_BOTH),
577 TEST(0x40C04, L"zh-HK_radstr", FL_BOTH),
578 TEST(0x41404, L"zh-MO_radstr", FL_BOTH),
579
580 // Some invalid sorting flags
581 TEST(0x10804, NULL, 0),
582 TEST(0x20404, NULL, 0),
583
584};
585
586static BOOLEAN Init(void)
587{
588 HMODULE hmod = GetModuleHandleA("ntdll.dll");
589
590 // Initialize function pointers
601 {
602 skip("Function not found\n");
603 return FALSE;
604 }
605
606 return TRUE;
607}
608
610{
611 UNICODE_STRING CultureName;
612 WCHAR Buffer[100];
613 BOOLEAN Result, ExpectedResult;;
614 LCID Lcid, ExpectedLcid;
615
616 // Test valid CultureName
617 Lcid = 0xDEADBEEF;
618 RtlInitUnicodeString(&CultureName, L"en-US");
619 Result = pRtlCultureNameToLCID(&CultureName, &Lcid);
621 ok_eq_hex(Lcid, 0x0409);
622
623 // Test wrongly capatalized CultureName
624 Lcid = 0xDEADBEEF;
625 RtlInitUnicodeString(&CultureName, L"eN-uS");
626 Result = pRtlCultureNameToLCID(&CultureName, &Lcid);
628 ok_eq_hex(Lcid, 0x0409);
629
630 // Test not nullterminated buffer
631 Lcid = 0xDEADBEEF;
632 wcscpy(Buffer, L"en-US");
633 RtlInitUnicodeString(&CultureName, Buffer);
634 Buffer[5] = L'X';
635 Result = pRtlCultureNameToLCID(&CultureName, &Lcid);
637 ok_eq_hex(Lcid, 0x0409);
638
639 // Test NULL Lcid
640 Lcid = 0xDEADBEEF;
641 RtlInitUnicodeString(&CultureName, L"en-US");
642 Result = pRtlCultureNameToLCID(&CultureName, NULL);
644 ok_eq_hex(Lcid, 0xDEADBEEF);
645
646 // Test NULL CultureName
647 Lcid = 0xDEADBEEF;
650 ok_eq_hex(Lcid, 0xDEADBEEF);
651
652 // Test NULL CultureName buffer
653 Lcid = 0xDEADBEEF;
654 RtlInitEmptyUnicodeString(&CultureName, NULL, 0);
655 Result = pRtlCultureNameToLCID(&CultureName, &Lcid);
657 ok_eq_hex(Lcid, 0xDEADBEEF);
658
659 // Test empty CultureName
660 Lcid = 0xDEADBEEF;
661 RtlInitUnicodeString(&CultureName, L"");
662 Result = pRtlCultureNameToLCID(&CultureName, &Lcid);
664 ok_eq_hex(Lcid, 0xDEADBEEF);
665
666 // Test invalid CultureName
667 Lcid = 0xDEADBEEF;
668 RtlInitUnicodeString(&CultureName, L"en-UX");
669 Result = pRtlCultureNameToLCID(&CultureName, &Lcid);
671 ok_eq_hex(Lcid, 0xDEADBEEF);
672
673 // Process the test entries
674 for (ULONG i = 0; i < ARRAYSIZE(Tests); i++)
675 {
676 ExpectedResult = (Tests[i].Flags & FL_CULTURE) ? TRUE : FALSE;
677 ExpectedLcid = (Tests[i].Flags & FL_CULTURE) ? Tests[i].Lcid : 0xDEADBEEF;
678
679 RtlInitUnicodeString(&CultureName, Tests[i].CultureName);
680 Lcid = 0xDEADBEEF;
681 Result = pRtlCultureNameToLCID(&CultureName, &Lcid);
682 ok(Result == ExpectedResult,
683 "Line %lu: Result = %u, expected %u failed\n",
684 Tests[i].Line,
685 Result,
686 ExpectedResult);
687 ok(Lcid == ExpectedLcid,
688 "Line %lu: Lcid = 0x%08lX, expected 0x%08lX\n",
689 Tests[i].Line, Lcid, Tests[i].Lcid);
690 }
691}
692
694{
695 UNICODE_STRING CultureName, ExpectedCultureName;
696 WCHAR Buffer[100];
697 BOOLEAN Result, ExpectedResult, Equal;
698
699 // Test NULL CultureName
702
703 // Test NULL CultureName buffer
704 RtlInitEmptyUnicodeString(&CultureName, NULL, 0);
705 Result = pRtlLCIDToCultureName(0x0409, &CultureName);
707
708 // Test 0 sized CultureName buffer
709 RtlInitEmptyUnicodeString(&CultureName, Buffer, 0);
710 Result = pRtlLCIDToCultureName(0x0409, &CultureName);
712
713 // Test too small CultureName buffer
714 RtlInitEmptyUnicodeString(&CultureName, Buffer, 10);
715 Result = pRtlLCIDToCultureName(0x0409, &CultureName);
717
718 // Test valid CultureName buffer
719 RtlInitEmptyUnicodeString(&CultureName, Buffer, 12);
720 Result = pRtlLCIDToCultureName(0x0409, &CultureName);
722 ok_eq_wstr(CultureName.Buffer, L"en-US");
723
724 // Test invalid LCID
725 RtlInitEmptyUnicodeString(&CultureName, Buffer, 12);
726 Result = pRtlLCIDToCultureName(0x0469, &CultureName);
728
729 // Process the test entries
730 for (ULONG i = 0; i < ARRAYSIZE(Tests); i++)
731 {
732 if (Tests[i].Flags & FL_ALT_NAME)
733 {
734 continue;
735 }
736
737 ExpectedResult = (Tests[i].Flags & FL_CULTURE) ? TRUE : FALSE;
738 RtlInitEmptyUnicodeString(&CultureName, Buffer, sizeof(Buffer));
739 RtlInitUnicodeString(&ExpectedCultureName, Tests[i].CultureName);
740 Result = pRtlLCIDToCultureName(Tests[i].Lcid, &CultureName);
741 ok(Result == ExpectedResult,
742 "Line %lu, Lcid 0x%lx: Result == %u, expected %u\n",
743 Tests[i].Line, Tests[i].Lcid, Result, ExpectedResult);
744 if (Result)
745 {
746 Equal = RtlEqualUnicodeString(&CultureName, &ExpectedCultureName, FALSE);
747 ok(Equal, "Line %lu, Lcid 0x%lx: CultureName = '%wZ', expected '%wZ'\n",
748 Tests[i].Line, Tests[i].Lcid, &CultureName, &ExpectedCultureName);
749 }
750 }
751}
752
754{
755 LCID Lcid;
756 NTSTATUS Status, ExpectedStatus;
757 LCID ExpectedLcid;
758
759 // Test valid LocaleName
760 Lcid = 0xDEADBEEF;
761 Status = pRtlLocaleNameToLcid(L"en-US", &Lcid, 0);
763 ok_eq_hex(Lcid, 0x0409);
764
765 // Test wrongly capatalized LocaleName
766 Lcid = 0xDEADBEEF;
767 Status = pRtlLocaleNameToLcid(L"eN-uS", &Lcid, 0);
769 ok_eq_hex(Lcid, 0x0409);
770
771 // Test extended unicode chars
772 Lcid = 0xDEADBEEF;
773 Status = pRtlLocaleNameToLcid(L"\x1165n-US", &Lcid, 0);
775 ok_eq_hex(Lcid, 0xDEADBEEF);
776
777 // Test NULL LocaleName
778 Lcid = 0xDEADBEEF;
781 ok_eq_hex(Lcid, 0xDEADBEEF);
782
783 // Test empty LocaleName
784 Lcid = 0xDEADBEEF;
788
789 // Test invalid LocaleName
790 Lcid = 0xDEADBEEF;
791 Status = pRtlLocaleNameToLcid(L"en-UX", &Lcid, 0);
793 ok_eq_hex(Lcid, 0xDEADBEEF);
794
795 // Test NULL Lcid
796 Lcid = 0xDEADBEEF;
797 Status = pRtlLocaleNameToLcid(L"en-US", NULL, 0);
799 ok_eq_hex(Lcid, 0xDEADBEEF);
800
801 // Test flags
802 Status = pRtlLocaleNameToLcid(L"en-US", &Lcid, 0x1);
804 Status = pRtlLocaleNameToLcid(L"en-US", &Lcid, 0x2);
806 Status = pRtlLocaleNameToLcid(L"en-US", &Lcid, 0x3);
808 Status = pRtlLocaleNameToLcid(L"en-US", &Lcid, 0x4);
810 Status = pRtlLocaleNameToLcid(L"en-US", &Lcid, 0x8);
812
813 // Test NULL LocaleName and NULL Lcid
814 Lcid = 0xDEADBEEF;
817 ok_eq_hex(Lcid, 0xDEADBEEF);
818
819 // Test invalid LocaleName and NULL Lcid
820 Lcid = 0xDEADBEEF;
821 Status = pRtlLocaleNameToLcid(L"en-UX", NULL, 0);
823 ok_eq_hex(Lcid, 0xDEADBEEF);
824
825 // Test NULL Lcid and invalid flags
826 Lcid = 0xDEADBEEF;
827 Status = pRtlLocaleNameToLcid(L"en-US", NULL, 0x8);
829 ok_eq_hex(Lcid, 0xDEADBEEF);
830
831 // Test empty LocaleName
832 Lcid = 0xDEADBEEF;
835 ok_eq_hex(Lcid, 0x7F);
836
837 // Process the test entries
838 for (ULONG i = 0; i < ARRAYSIZE(Tests); i++)
839 {
840 // No flags
842 ExpectedLcid = (Tests[i].Flags & FL_LOCALE) ? Tests[i].Lcid : 0xDEADBEEF;
843 Lcid = 0xDEADBEEF;
844 Status = pRtlLocaleNameToLcid((PWSTR)Tests[i].CultureName, &Lcid, 0);
845 ok(Status == ExpectedStatus,
846 "Line %lu: Status == 0x%lx, expected 0x%lx\n",
847 Tests[i].Line, Status, ExpectedStatus);
848 ok(Lcid == ExpectedLcid,
849 "Line %lu: Lcid == 0x%08X, expected 0x%08X\n",
850 Tests[i].Line, Lcid, ExpectedLcid);
851
852 // Flags = 0x2
854 ExpectedLcid = (Tests[i].Flags & FL_BOTH) ? Tests[i].Lcid : 0xDEADBEEF;
855 Lcid = 0xDEADBEEF;
856 Status = pRtlLocaleNameToLcid((PWSTR)Tests[i].CultureName, &Lcid, 0x2);
857 ok(Status == ExpectedStatus,
858 "Line %lu: Status == 0x%lx, expected 0x%lx\n",
859 Tests[i].Line, Status, ExpectedStatus);
860 ok(Lcid == ExpectedLcid,
861 "Line %lu: Lcid == 0x%08X, expected 0x%08X\n",
862 Tests[i].Line, Lcid, ExpectedLcid);
863 }
864}
865
867{
868 UNICODE_STRING LocaleName, ExpectedLocaleName;
869 WCHAR Buffer[100];
870 NTSTATUS Status, ExpectedStatus;
871 BOOLEAN Equal;
872 LCID Lcid;
873
874 // Test valid parameters
875 RtlInitEmptyUnicodeString(&LocaleName, Buffer, sizeof(Buffer));
878 ok(memcmp(Buffer, L"en-US", 12) == 0, "Expected null-terminated 'en-US', got %wZ\n", &LocaleName);
879
880 // Test invalid LCIDs
885
886 // Test reserved LCID
889
890 // Test NULL LocaleName
891 Status = pRtlLcidToLocaleName(0x0409, NULL, 0, FALSE);
893
894 // Test NULL LocaleName buffer
895 RtlInitEmptyUnicodeString(&LocaleName, NULL, 0);
898
899 // Test invalid buffer size
900 RtlInitEmptyUnicodeString(&LocaleName, Buffer, sizeof(Buffer));
901 LocaleName.Length = sizeof(Buffer) + 8;
904
905 // Test flags
914 Status = pRtlLcidToLocaleName(0x0409, &LocaleName, 0x08000000, FALSE); // LOCALE_ALLOW_NEUTRAL_NAMES
916
917 // Test invalid LCID and NULL buffer
918 RtlInitEmptyUnicodeString(&LocaleName, NULL, 0);
921
922 // Test reserved LCID and NULL buffer
925
926 // Test reserved LCID and invalid flags
927 RtlInitEmptyUnicodeString(&LocaleName, Buffer, sizeof(Buffer));
930
931 // Test invalid flags and NULL buffer
932 RtlInitEmptyUnicodeString(&LocaleName, NULL, 0);
935
936 // Test 0 sized LocaleName buffer
937 RtlInitEmptyUnicodeString(&LocaleName, Buffer, 0);
940
941 // Test too small LocaleName buffer
942 RtlInitEmptyUnicodeString(&LocaleName, Buffer, 10);
943 Buffer[0] = L'@';
946 ok(Buffer[0] == L'@', "Buffer should not be modified\n");
947
948 // Test LOCALE_INVARIANT (0x007F)
949 RtlInitEmptyUnicodeString(&LocaleName, Buffer, sizeof(Buffer));
952 ok(Buffer[0] == L'\0', "Buffer should be empty\n");
953
954 // Test LOCALE_USER_DEFAULT (0x0400)
960
961 // Test LOCALE_SYSTEM_DEFAULT (0x0800)
967
968 // Test LOCALE_CUSTOM_DEFAULT (0x0C00)
971
972 // Test LOCALE_CUSTOM_UNSPECIFIED (0x1000)
977
978 // Test LOCALE_CUSTOM_UI_DEFAULT (0x1400)
983
984 // Test LOCALE_CUSTOM_UNSPECIFIED (0x1000)
987
988 // Process the test entries
989 for (ULONG i = 0; i < ARRAYSIZE(Tests); i++)
990 {
991 if (Tests[i].Flags & FL_ALT_NAME)
992 {
993 continue;
994 }
995
996 RtlInitEmptyUnicodeString(&LocaleName, Buffer, sizeof(Buffer));
997 RtlInitUnicodeString(&ExpectedLocaleName, Tests[i].CultureName);
998
999 /* First test with Flags == 0 */
1002 ok(Status == ExpectedStatus,
1003 "Line %lu, Lcid 0x%lx: Status == 0x%lx, expected 0x%lx\n",
1004 Tests[i].Line, Tests[i].Lcid, Status, ExpectedStatus);
1005 if (NT_SUCCESS(Status))
1006 {
1007 Equal = RtlEqualUnicodeString(&LocaleName, &ExpectedLocaleName, TRUE);
1008 ok(Equal, "Line %lu, Lcid 0x%lx: LocaleName == '%wZ', expected '%wZ'\n",
1009 Tests[i].Line, Tests[i].Lcid, &LocaleName, &ExpectedLocaleName);
1010 }
1011
1012 /* Test with Flags == 2 */
1015 ok(Status == ExpectedStatus,
1016 "Line %lu, Lcid 0x%lx: Status == 0x%lx, expected 0x%lx\n",
1017 Tests[i].Line, Tests[i].Lcid, Status, ExpectedStatus);
1018 if (NT_SUCCESS(Status))
1019 {
1020 Equal = RtlEqualUnicodeString(&LocaleName, &ExpectedLocaleName, FALSE);
1021 ok(Equal, "Line %lu, Lcid 0x%lx: LocaleName == '%wZ', expected '%wZ'\n",
1022 Tests[i].Line, Tests[i].Lcid, &LocaleName, &ExpectedLocaleName);
1023 }
1024 }
1025}
1026
1027START_TEST(RtlLocale)
1028{
1029 if (!Init())
1030 {
1031 return;
1032 }
1033
1038}
static _In_ LPCWSTR LocaleName
unsigned char BOOLEAN
#define TEST(Lcid, CultureName, Flags)
Definition: RtlLocale.c:71
struct _LCID_TEST_ENTRY LCID_TEST_ENTRY
#define FL_BOTH
Definition: RtlLocale.c:60
static BOOLEAN Init(void)
Definition: RtlLocale.c:586
static void Test_RtlCultureNameToLCID(void)
Definition: RtlLocale.c:609
NTSTATUS NTAPI FN_RtlLocaleNameToLcid(_In_ PWSTR LocaleName, _Out_ PLCID Lcid, _In_ ULONG Flags)
Definition: RtlLocale.c:47
FN_RtlConvertLCIDToString * pRtlConvertLCIDToString
Definition: RtlLocale.c:52
BOOLEAN NTAPI FN_RtlCultureNameToLCID(_In_ PUNICODE_STRING String, _Out_ PLCID Lcid)
Definition: RtlLocale.c:24
NTSTATUS NTAPI FN_RtlConvertLCIDToString(_In_ LCID LcidValue, _In_ ULONG Base, _In_ ULONG Padding, _Out_writes_(Size) PWSTR pResultBuf, _In_ ULONG Size)
Definition: RtlLocale.c:14
static LCID_TEST_ENTRY Tests[]
Definition: RtlLocale.c:77
BOOLEAN NTAPI FN_RtlLCIDToCultureName(_In_ LCID Lcid, _Inout_ PUNICODE_STRING String)
Definition: RtlLocale.c:31
FN_RtlLCIDToCultureName * pRtlLCIDToCultureName
Definition: RtlLocale.c:54
#define FL_CULTURE
Definition: RtlLocale.c:59
#define FL_LOCALE
Definition: RtlLocale.c:58
static void Test_RtlLocaleNameToLcid(void)
Definition: RtlLocale.c:753
FN_RtlCultureNameToLCID * pRtlCultureNameToLCID
Definition: RtlLocale.c:53
NTSTATUS NTAPI FN_RtlLcidToLocaleName(_In_ LCID Lcid, _Inout_ PUNICODE_STRING LocaleName, _In_ ULONG Flags, _In_ BOOLEAN AllocateDestinationString)
Definition: RtlLocale.c:38
FN_RtlLocaleNameToLcid * pRtlLocaleNameToLcid
Definition: RtlLocale.c:56
static void Test_RtlLcidToLocaleName(void)
Definition: RtlLocale.c:866
static void Test_RtlLCIDToCultureName(void)
Definition: RtlLocale.c:693
#define FL_ALT_NAME
Definition: RtlLocale.c:61
FN_RtlLcidToLocaleName * pRtlLcidToLocaleName
Definition: RtlLocale.c:55
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define ok_eq_hex(value, expected)
Definition: apitest.h:58
#define ok_eq_wstr(value, expected)
Definition: apitest.h:65
#define ok_eq_bool(value, expected)
Definition: apitest.h:61
#define ok_ntstatus(status, expected)
Definition: atltest.h:135
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
wcscpy
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
#define GetProcAddress(x, y)
Definition: compat.h:753
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
LCID WINAPI GetUserDefaultLCID(void)
Definition: locale.c:1211
LCID WINAPI GetSystemDefaultLCID(void)
Definition: locale.c:1230
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static PEXPLICIT_ACCESSW *static HMODULE hmod
Definition: security.c:143
_In_ PSID _In_ BOOLEAN AllocateDestinationString
Definition: rtlfuncs.h:1373
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2478
#define _Inout_
Definition: no_sal2.h:162
#define _Out_writes_(s)
Definition: no_sal2.h:176
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
#define LOCALE_CUSTOM_UNSPECIFIED
* PLCID
Definition: ntbasedef.h:517
#define LOCALE_USER_DEFAULT
#define LOCALE_INVARIANT
#define LOCALE_CUSTOM_DEFAULT
#define LOCALE_SYSTEM_DEFAULT
#define LOCALE_CUSTOM_UI_DEFAULT
#define STATUS_INVALID_PARAMETER_2
Definition: ntstatus.h:476
#define STATUS_INVALID_PARAMETER_1
Definition: ntstatus.h:475
#define STATUS_INVALID_PARAMETER_3
Definition: ntstatus.h:477
#define L(x)
Definition: ntvdm.h:50
DWORD LCID
Definition: nls.h:13
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
Definition: ncftp.h:79
Definition: RtlLocale.c:64
LCID Lcid
Definition: RtlLocale.c:66
ULONG Line
Definition: RtlLocale.c:65
PCWSTR CultureName
Definition: RtlLocale.c:67
ULONG Flags
Definition: RtlLocale.c:68
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFSTRING String
Definition: wdfdevice.h:2433
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_In_ CONST DEVPROPKEY _In_ LCID Lcid
Definition: iofuncs.h:2415
__wchar_t WCHAR
Definition: xmlstorage.h:180