2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for RtlGenerate8dot3Name
5 * PROGRAMMER: Pierre Schweitzer <pierre@reactos.org>
10 #define WIN32_NO_STATUS
11 #include <ndk/rtlfuncs.h>
18 _In_ PCUNICODE_STRING Name
,
19 _In_ BOOLEAN AllowExtendedCharacters
,
20 _Inout_ PGENERATE_NAME_CONTEXT Context
,
21 _Inout_ PUNICODE_STRING Name8dot3
);
23 #define NAMES_COUNT 14
24 #define LOCALES_COUNT 3
26 PWSTR Names
[NAMES_COUNT
] = { L
"Menu Démarrer", L
"Sélecteur de configuration clavier.lnk", L
"éèàùç.txt", L
"çùàèé.txt", L
"éèàù.txt", L
"çùàè.txt", L
"éèàùçeeauc.txt", L
"éeèéçcùu.txt", L
"test.éxè", L
"t£$t¤.txt", L
"Long file name.txt", L
"Long file name", L
"Longfilename.txt", L
"Longfilename" };
27 PWSTR ShortNames1
[LOCALES_COUNT
][NAMES_COUNT
] =
29 { L
"MENUDM~1", L
"SLECTE~1.LNK", L
"5C2D~1.TXT", L
"423C~1.TXT", L
"925E~1.TXT", L
"7E4C~1.TXT", L
"EEAUC~1.TXT", L
"ECU~1.TXT", L
"TEST~1.X", L
"T$T~1.TXT", L
"LONGFI~1.TXT", L
"LONGFI~1", L
"LONGFI~1.TXT", L
"LONGFI~1" },
30 { L
"MENUDM~1", L
"SLECTE~1.LNK", L
"5C2D~1.TXT", L
"423C~1.TXT", L
"925E~1.TXT", L
"7E4C~1.TXT", L
"EEAUC~1.TXT", L
"ECU~1.TXT", L
"TEST~1.X", L
"T$T~1.TXT", L
"LONGFI~1.TXT", L
"LONGFI~1", L
"LONGFI~1.TXT", L
"LONGFI~1" },
31 { L
"MENUDM~1", L
"SLECTE~1.LNK", L
"5C2D~1.TXT", L
"423C~1.TXT", L
"925E~1.TXT", L
"7E4C~1.TXT", L
"EEAUC~1.TXT", L
"ECU~1.TXT", L
"TEST~1.X", L
"T$T~1.TXT", L
"LONGFI~1.TXT", L
"LONGFI~1", L
"LONGFI~1.TXT", L
"LONGFI~1" },
33 PWSTR ShortNames2
[LOCALES_COUNT
][NAMES_COUNT
] =
35 { L
"MENUDM~2", L
"SLECTE~2.LNK", L
"5C2D~2.TXT", L
"423C~2.TXT", L
"925E~2.TXT", L
"7E4C~2.TXT", L
"EEAUC~2.TXT", L
"ECU~2.TXT", L
"TEST~2.X", L
"T$T~2.TXT", L
"LONGFI~2.TXT", L
"LONGFI~2", L
"LONGFI~2.TXT", L
"LONGFI~2" },
36 { L
"MENUDM~2", L
"SLECTE~2.LNK", L
"5C2D~2.TXT", L
"423C~2.TXT", L
"925E~2.TXT", L
"7E4C~2.TXT", L
"EEAUC~2.TXT", L
"ECU~2.TXT", L
"TEST~2.X", L
"T$T~2.TXT", L
"LONGFI~2.TXT", L
"LONGFI~2", L
"LONGFI~2.TXT", L
"LONGFI~2" },
37 { L
"MENUDM~2", L
"SLECTE~2.LNK", L
"5C2D~2.TXT", L
"423C~2.TXT", L
"925E~2.TXT", L
"7E4C~2.TXT", L
"EEAUC~2.TXT", L
"ECU~2.TXT", L
"TEST~2.X", L
"T$T~2.TXT", L
"LONGFI~2.TXT", L
"LONGFI~2", L
"LONGFI~2.TXT", L
"LONGFI~2" },
39 PWSTR ExShortNames1
[LOCALES_COUNT
][NAMES_COUNT
] =
41 { L
"MENUDÉ~1", L
"SÉLECT~1.LNK", L
"ÉÈÀÙÇ~1.TXT", L
"ÇÙÀÈÉ~1.TXT", L
"ÉÈÀÙ~1.TXT", L
"ÇÙÀÈ~1.TXT", L
"ÉÈÀÙÇE~1.TXT", L
"ÉEÈÉÇC~1.TXT", L
"TEST~1.ÉXÈ", L
"T£$T¤~1.TXT", L
"LONGFI~1.TXT", L
"LONGFI~1", L
"LONGFI~1.TXT", L
"LONGFI~1" },
42 { L
"MENUDÉ~1", L
"SÉLECT~1.LNK", L
"ÉÈÀÙÇ~1.TXT", L
"ÇÙÀÈÉ~1.TXT", L
"ÉÈÀÙ~1.TXT", L
"ÇÙÀÈ~1.TXT", L
"ÉÈÀÙÇE~1.TXT", L
"ÉEÈÉÇC~1.TXT", L
"TEST~1.ÉXÈ", L
"T£$T_~1.TXT", L
"LONGFI~1.TXT", L
"LONGFI~1", L
"LONGFI~1.TXT", L
"LONGFI~1" },
43 { L
"MENUDÉ~1", L
"SÉLECT~1.LNK", L
"ÉCAU~1.TXT", L
"UACÉ~1.TXT", L
"ÉCAU~1.TXT", L
"UAC~1.TXT", L
"ÉCAUEE~1.TXT", L
"ÉECÉCU~1.TXT", L
"TEST~1.ÉXC", L
"T£$T¤~1.TXT", L
"LONGFI~1.TXT", L
"LONGFI~1", L
"LONGFI~1.TXT", L
"LONGFI~1" },
45 PWSTR ExShortNames2
[LOCALES_COUNT
][NAMES_COUNT
] =
47 { L
"MENUDÉ~2", L
"SÉLECT~2.LNK", L
"ÉÈÀÙÇ~2.TXT", L
"ÇÙÀÈÉ~2.TXT", L
"ÉÈÀÙ~2.TXT", L
"ÇÙÀÈ~2.TXT", L
"ÉÈÀÙÇE~2.TXT", L
"ÉEÈÉÇC~2.TXT", L
"TEST~2.ÉXÈ", L
"T£$T¤~2.TXT", L
"LONGFI~2.TXT", L
"LONGFI~2", L
"LONGFI~2.TXT", L
"LONGFI~2" },
48 { L
"MENUDÉ~2", L
"SÉLECT~2.LNK", L
"ÉÈÀÙÇ~2.TXT", L
"ÇÙÀÈÉ~2.TXT", L
"ÉÈÀÙ~2.TXT", L
"ÇÙÀÈ~2.TXT", L
"ÉÈÀÙÇE~2.TXT", L
"ÉEÈÉÇC~2.TXT", L
"TEST~2.ÉXÈ", L
"T£$T_~2.TXT", L
"LONGFI~2.TXT", L
"LONGFI~2", L
"LONGFI~2.TXT", L
"LONGFI~2" },
49 { L
"MENUDÉ~2", L
"SÉLECT~2.LNK", L
"ÉCAU~2.TXT", L
"UACÉ~2.TXT", L
"ÉCAU~2.TXT", L
"UAC~2.TXT", L
"ÉCAUEE~2.TXT", L
"ÉECÉCU~2.TXT", L
"TEST~2.ÉXC", L
"T£$T¤~2.TXT", L
"LONGFI~2.TXT", L
"LONGFI~2", L
"LONGFI~2.TXT", L
"LONGFI~2" },
52 ULONG Locales
[LOCALES_COUNT
][2] =
54 {1252, 850}, // Most used for latin langs
55 {1252, 437}, // Used for English US (not only)
56 {1252, 775}, // Used for Estonian
59 PVOID
LoadCodePageData(ULONG Code
)
61 char filename
[MAX_PATH
], sysdir
[MAX_PATH
];
64 GetSystemDirectoryA(sysdir
, MAX_PATH
);
67 sprintf(filename
, "%s\\c_%lu.nls", sysdir
, Code
);
69 sprintf(filename
, "%s\\l_intl.nls", sysdir
);
71 hFile
= CreateFile(filename
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, 0, NULL
);
72 if (hFile
!= INVALID_HANDLE_VALUE
)
75 DWORD dwFileSize
= GetFileSize(hFile
, NULL
);
76 Data
= malloc(dwFileSize
);
77 ReadFile(hFile
, Data
, dwFileSize
, &dwRead
, NULL
);
83 /* https://www.microsoft.com/resources/msdn/goglobal/default.mspx */
84 void SetupLocale(ULONG AnsiCode
, ULONG OemCode
, ULONG Unicode
)
86 NLSTABLEINFO NlsTable
;
87 PVOID AnsiCodePageData
;
88 PVOID OemCodePageData
;
89 PVOID UnicodeCaseTableData
;
91 AnsiCodePageData
= LoadCodePageData(AnsiCode
);
92 OemCodePageData
= LoadCodePageData(OemCode
);
93 UnicodeCaseTableData
= LoadCodePageData(Unicode
);
95 RtlInitNlsTables(AnsiCodePageData
, OemCodePageData
, UnicodeCaseTableData
, &NlsTable
);
96 RtlResetRtlTranslations(&NlsTable
);
97 /* Do NOT free the buffers here, they are directly used!
98 Yes, we leak the old buffers, but this is a test anyway... */
102 START_TEST(RtlGenerate8dot3Name
)
106 for (j
= 0; j
< LOCALES_COUNT
; ++j
)
109 SetupLocale(Locales
[j
][0], Locales
[j
][1], -1);
111 for (i
= 0; i
< NAMES_COUNT
; ++i
)
114 GENERATE_NAME_CONTEXT Context
;
115 UNICODE_STRING LongName
, ShortName
, Expected
;
117 RtlZeroMemory(&Context
, sizeof(GENERATE_NAME_CONTEXT
));
118 RtlInitUnicodeString(&LongName
, Names
[i
]);
119 ShortName
.Buffer
= Buffer
;
120 ShortName
.Length
= 0;
121 ShortName
.MaximumLength
= sizeof(Buffer
);
123 RtlGenerate8dot3Name(&LongName
, FALSE
, &Context
, &ShortName
);
124 RtlInitUnicodeString(&Expected
, ShortNames1
[j
][i
]);
125 ok(RtlEqualUnicodeString(&Expected
, &ShortName
, FALSE
), "%u:: Generated: %.*S. Expected: %.*S\n", j
, ShortName
.Length
/ sizeof(WCHAR
), ShortName
.Buffer
, Expected
.Length
/ sizeof(WCHAR
), Expected
.Buffer
);
127 ShortName
.Length
= 0;
128 RtlGenerate8dot3Name(&LongName
, FALSE
, &Context
, &ShortName
);
129 RtlInitUnicodeString(&Expected
, ShortNames2
[j
][i
]);
130 ok(RtlEqualUnicodeString(&Expected
, &ShortName
, FALSE
), "%u:: Generated: %.*S. Expected: %.*S\n", j
, ShortName
.Length
/ sizeof(WCHAR
), ShortName
.Buffer
, Expected
.Length
/ sizeof(WCHAR
), Expected
.Buffer
);
132 RtlZeroMemory(&Context
, sizeof(GENERATE_NAME_CONTEXT
));
133 ShortName
.Length
= 0;
134 RtlGenerate8dot3Name(&LongName
, TRUE
, &Context
, &ShortName
);
135 RtlInitUnicodeString(&Expected
, ExShortNames1
[j
][i
]);
136 ok(RtlEqualUnicodeString(&Expected
, &ShortName
, FALSE
), "%u:: Generated: %.*S. Expected: %.*S\n", j
, ShortName
.Length
/ sizeof(WCHAR
), ShortName
.Buffer
, Expected
.Length
/ sizeof(WCHAR
), Expected
.Buffer
);
138 ShortName
.Length
= 0;
139 RtlGenerate8dot3Name(&LongName
, TRUE
, &Context
, &ShortName
);
140 RtlInitUnicodeString(&Expected
, ExShortNames2
[j
][i
]);
141 ok(RtlEqualUnicodeString(&Expected
, &ShortName
, FALSE
), "%u:: Generated: %.*S. Expected: %.*S\n", j
, ShortName
.Length
/ sizeof(WCHAR
), ShortName
.Buffer
, Expected
.Length
/ sizeof(WCHAR
), Expected
.Buffer
);