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