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>
8 #define KMT_EMULATE_KERNEL
13 TestFindCharInUnicodeString(VOID
)
16 NTSTATUS ExceptionStatus
;
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
;
27 RtlInitUnicodeString(&ZeroLengthString
, NULL
);
29 /* Basic checks. Covered by Winetests */
31 Status
= RtlFindCharInUnicodeString(0, &String
, &Chars
, &Position
);
32 ok_eq_hex(Status
, STATUS_SUCCESS
);
33 ok_eq_uint(Position
, 6);
36 Status
= RtlFindCharInUnicodeString(1, &String
, &Chars
, &Position
);
37 ok_eq_hex(Status
, STATUS_SUCCESS
);
38 ok_eq_uint(Position
, 10);
41 Status
= RtlFindCharInUnicodeString(2, &String
, &Chars
, &Position
);
42 ok_eq_hex(Status
, STATUS_SUCCESS
);
43 ok_eq_uint(Position
, 2);
46 Status
= RtlFindCharInUnicodeString(3, &String
, &Chars
, &Position
);
47 ok_eq_hex(Status
, STATUS_SUCCESS
);
48 ok_eq_uint(Position
, 24);
50 /* Show that checks are case sensitive by default */
52 Status
= RtlFindCharInUnicodeString(0, &String
, &Chars2
, &Position
);
53 ok_eq_hex(Status
, STATUS_NOT_FOUND
);
54 ok_eq_uint(Position
, 0);
57 Status
= RtlFindCharInUnicodeString(1, &String
, &Chars2
, &Position
);
58 ok_eq_hex(Status
, STATUS_NOT_FOUND
);
59 ok_eq_uint(Position
, 0);
62 Status
= RtlFindCharInUnicodeString(2, &String
, &Chars3
, &Position
);
63 ok_eq_hex(Status
, STATUS_SUCCESS
);
64 ok_eq_uint(Position
, 2);
67 Status
= RtlFindCharInUnicodeString(3, &String
, &Chars4
, &Position
);
68 ok_eq_hex(Status
, STATUS_SUCCESS
);
69 ok_eq_uint(Position
, 24);
71 /* Show that 4 means case insensitive */
73 Status
= RtlFindCharInUnicodeString(4, &String
, &Chars2
, &Position
);
74 ok_eq_hex(Status
, STATUS_SUCCESS
);
75 ok_eq_uint(Position
, 6);
78 Status
= RtlFindCharInUnicodeString(5, &String
, &Chars2
, &Position
);
79 ok_eq_hex(Status
, STATUS_SUCCESS
);
80 ok_eq_uint(Position
, 10);
83 Status
= RtlFindCharInUnicodeString(6, &String
, &Chars3
, &Position
);
84 ok_eq_hex(Status
, STATUS_SUCCESS
);
85 ok_eq_uint(Position
, 4);
88 Status
= RtlFindCharInUnicodeString(7, &String
, &Chars4
, &Position
);
89 ok_eq_hex(Status
, STATUS_SUCCESS
);
90 ok_eq_uint(Position
, 22);
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
);
100 Status
= RtlFindCharInUnicodeString(8, &String
, &String
, &Position
);
101 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
102 ok_eq_uint(Position
, 0);
105 Status
= RtlFindCharInUnicodeString(0xFFFFFFF8, &String
, &String
, &Position
);
106 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
107 ok_eq_uint(Position
, 0);
110 Status
= RtlFindCharInUnicodeString(0xFFFFFFFF, &String
, &String
, &Position
);
111 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
112 ok_eq_uint(Position
, 0);
114 /* NULL for SearchString */
117 Status
= RtlFindCharInUnicodeString(0, NULL
, &String
, &Position
);
118 KmtEndSeh(STATUS_ACCESS_VIOLATION
);
119 ok_eq_uint(Position
, 0);
121 /* NULL for SearchString and invalid flags */
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);
130 /* NULL for SearchString with zero-length MatchString */
133 Status
= RtlFindCharInUnicodeString(0, NULL
, &ZeroLengthString
, &Position
);
134 KmtEndSeh(STATUS_ACCESS_VIOLATION
);
135 ok_eq_uint(Position
, 0);
137 /* NULL for MatchString */
140 Status
= RtlFindCharInUnicodeString(0, &String
, NULL
, &Position
);
141 KmtEndSeh(STATUS_ACCESS_VIOLATION
);
142 ok_eq_uint(Position
, 0);
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 */
147 /* NULL for MatchString with zero-length SearchString */
150 Status
= RtlFindCharInUnicodeString(0, &ZeroLengthString
, NULL
, &Position
);
151 KmtEndSeh(STATUS_ACCESS_VIOLATION
);
152 ok_eq_uint(Position
, 0);
155 /* NULL for MatchString and invalid flags */
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);
163 /* NULL for Position */
165 Status
= RtlFindCharInUnicodeString(0, &String
, &String
, NULL
);
166 KmtEndSeh(STATUS_SUCCESS
);
167 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
169 /* NULL for all three */
171 Status
= RtlFindCharInUnicodeString(0, NULL
, NULL
, NULL
);
172 KmtEndSeh(STATUS_SUCCESS
);
173 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
177 START_TEST(RtlUnicodeString
)
179 TestFindCharInUnicodeString();