[KMTESTS]
[reactos.git] / rostests / kmtests / rtl / RtlUnicodeString.c
1 /*
2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Runtime library unicode string functions test
5 * PROGRAMMER: Thomas Faber <thfabba@gmx.de>
6 */
7
8 #define KMT_EMULATE_KERNEL
9 #include <kmt_test.h>
10
11 #define StartSeh() ExceptionStatus = STATUS_SUCCESS; _SEH2_TRY {
12 #define EndSeh(ExpectedStatus) } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { ExceptionStatus = _SEH2_GetExceptionCode(); } _SEH2_END; ok_eq_hex(ExceptionStatus, ExpectedStatus)
13
14 static
15 VOID
16 TestFindCharInUnicodeString(VOID)
17 {
18 #ifdef KMT_USER_MODE
19 NTSTATUS ExceptionStatus;
20 NTSTATUS Status;
21 UNICODE_STRING String = RTL_CONSTANT_STRING(L"I am a string");
22 UNICODE_STRING Chars = RTL_CONSTANT_STRING(L"a");
23 UNICODE_STRING Chars2 = RTL_CONSTANT_STRING(L"A");
24 UNICODE_STRING Chars3 = RTL_CONSTANT_STRING(L"i");
25 UNICODE_STRING Chars4 = RTL_CONSTANT_STRING(L"G");
26 UNICODE_STRING ZeroLengthString;
27 USHORT Position;
28 ULONG LongPosition;
29
30 RtlInitUnicodeString(&ZeroLengthString, NULL);
31
32 /* Basic checks. Covered by Winetests */
33 Position = 123;
34 Status = RtlFindCharInUnicodeString(0, &String, &Chars, &Position);
35 ok_eq_hex(Status, STATUS_SUCCESS);
36 ok_eq_uint(Position, 6);
37
38 Position = 123;
39 Status = RtlFindCharInUnicodeString(1, &String, &Chars, &Position);
40 ok_eq_hex(Status, STATUS_SUCCESS);
41 ok_eq_uint(Position, 10);
42
43 Position = 123;
44 Status = RtlFindCharInUnicodeString(2, &String, &Chars, &Position);
45 ok_eq_hex(Status, STATUS_SUCCESS);
46 ok_eq_uint(Position, 2);
47
48 Position = 123;
49 Status = RtlFindCharInUnicodeString(3, &String, &Chars, &Position);
50 ok_eq_hex(Status, STATUS_SUCCESS);
51 ok_eq_uint(Position, 24);
52
53 /* Show that checks are case sensitive by default */
54 Position = 123;
55 Status = RtlFindCharInUnicodeString(0, &String, &Chars2, &Position);
56 ok_eq_hex(Status, STATUS_NOT_FOUND);
57 ok_eq_uint(Position, 0);
58
59 Position = 123;
60 Status = RtlFindCharInUnicodeString(1, &String, &Chars2, &Position);
61 ok_eq_hex(Status, STATUS_NOT_FOUND);
62 ok_eq_uint(Position, 0);
63
64 Position = 123;
65 Status = RtlFindCharInUnicodeString(2, &String, &Chars3, &Position);
66 ok_eq_hex(Status, STATUS_SUCCESS);
67 ok_eq_uint(Position, 2);
68
69 Position = 123;
70 Status = RtlFindCharInUnicodeString(3, &String, &Chars4, &Position);
71 ok_eq_hex(Status, STATUS_SUCCESS);
72 ok_eq_uint(Position, 24);
73
74 /* Show that 4 means case insensitive */
75 Position = 123;
76 Status = RtlFindCharInUnicodeString(4, &String, &Chars2, &Position);
77 ok_eq_hex(Status, STATUS_SUCCESS);
78 ok_eq_uint(Position, 6);
79
80 Position = 123;
81 Status = RtlFindCharInUnicodeString(5, &String, &Chars2, &Position);
82 ok_eq_hex(Status, STATUS_SUCCESS);
83 ok_eq_uint(Position, 10);
84
85 Position = 123;
86 Status = RtlFindCharInUnicodeString(6, &String, &Chars3, &Position);
87 ok_eq_hex(Status, STATUS_SUCCESS);
88 ok_eq_uint(Position, 4);
89
90 Position = 123;
91 Status = RtlFindCharInUnicodeString(7, &String, &Chars4, &Position);
92 ok_eq_hex(Status, STATUS_SUCCESS);
93 ok_eq_uint(Position, 22);
94
95 /* Show that Position is USHORT */
96 LongPosition = 0x55555555;
97 Status = RtlFindCharInUnicodeString(8, &String, &String, (PUSHORT)&LongPosition);
98 ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
99 ok_eq_ulong(LongPosition, 0x55550000UL);
100
101 /* Invalid flags */
102 Position = 123;
103 Status = RtlFindCharInUnicodeString(8, &String, &String, &Position);
104 ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
105 ok_eq_uint(Position, 0);
106
107 Position = 123;
108 Status = RtlFindCharInUnicodeString(0xFFFFFFF8, &String, &String, &Position);
109 ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
110 ok_eq_uint(Position, 0);
111
112 Position = 123;
113 Status = RtlFindCharInUnicodeString(0xFFFFFFFF, &String, &String, &Position);
114 ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
115 ok_eq_uint(Position, 0);
116
117 /* NULL for SearchString */
118 Position = 123;
119 StartSeh()
120 Status = RtlFindCharInUnicodeString(0, NULL, &String, &Position);
121 EndSeh(STATUS_ACCESS_VIOLATION);
122 ok_eq_uint(Position, 0);
123
124 /* NULL for SearchString and invalid flags */
125 Position = 123;
126 StartSeh()
127 Status = RtlFindCharInUnicodeString(8, NULL, &String, &Position);
128 EndSeh(STATUS_SUCCESS);
129 ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
130 ok_eq_uint(Position, 0);
131 ok_eq_uint(Position, 0);
132
133 /* NULL for SearchString with zero-length MatchString */
134 Position = 123;
135 StartSeh()
136 Status = RtlFindCharInUnicodeString(0, NULL, &ZeroLengthString, &Position);
137 EndSeh(STATUS_ACCESS_VIOLATION);
138 ok_eq_uint(Position, 0);
139
140 /* NULL for MatchString */
141 Position = 123;
142 StartSeh()
143 Status = RtlFindCharInUnicodeString(0, &String, NULL, &Position);
144 EndSeh(STATUS_ACCESS_VIOLATION);
145 ok_eq_uint(Position, 0);
146
147 /* This crashes in Windows, but not in ROS. I see no reason to add
148 * additional code or redesign the function to replicate that */
149 #if 0
150 /* NULL for MatchString with zero-length SearchString */
151 Position = 123;
152 StartSeh()
153 Status = RtlFindCharInUnicodeString(0, &ZeroLengthString, NULL, &Position);
154 EndSeh(STATUS_ACCESS_VIOLATION);
155 ok_eq_uint(Position, 0);
156 #endif
157
158 /* NULL for MatchString and invalid flags */
159 Position = 123;
160 StartSeh()
161 Status = RtlFindCharInUnicodeString(8, &String, NULL, &Position);
162 EndSeh(STATUS_SUCCESS);
163 ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
164 ok_eq_uint(Position, 0);
165
166 /* NULL for Position */
167 StartSeh()
168 Status = RtlFindCharInUnicodeString(0, &String, &String, NULL);
169 EndSeh(STATUS_SUCCESS);
170 ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
171
172 /* NULL for all three */
173 StartSeh()
174 Status = RtlFindCharInUnicodeString(0, NULL, NULL, NULL);
175 EndSeh(STATUS_SUCCESS);
176 ok_eq_hex(Status, STATUS_INVALID_PARAMETER);
177 #endif
178 }
179
180 START_TEST(RtlUnicodeString)
181 {
182 TestFindCharInUnicodeString();
183 }