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
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)
16 TestFindCharInUnicodeString(VOID
)
19 NTSTATUS ExceptionStatus
;
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
;
30 RtlInitUnicodeString(&ZeroLengthString
, NULL
);
32 /* Basic checks. Covered by Winetests */
34 Status
= RtlFindCharInUnicodeString(0, &String
, &Chars
, &Position
);
35 ok_eq_hex(Status
, STATUS_SUCCESS
);
36 ok_eq_uint(Position
, 6);
39 Status
= RtlFindCharInUnicodeString(1, &String
, &Chars
, &Position
);
40 ok_eq_hex(Status
, STATUS_SUCCESS
);
41 ok_eq_uint(Position
, 10);
44 Status
= RtlFindCharInUnicodeString(2, &String
, &Chars
, &Position
);
45 ok_eq_hex(Status
, STATUS_SUCCESS
);
46 ok_eq_uint(Position
, 2);
49 Status
= RtlFindCharInUnicodeString(3, &String
, &Chars
, &Position
);
50 ok_eq_hex(Status
, STATUS_SUCCESS
);
51 ok_eq_uint(Position
, 24);
53 /* Show that checks are case sensitive by default */
55 Status
= RtlFindCharInUnicodeString(0, &String
, &Chars2
, &Position
);
56 ok_eq_hex(Status
, STATUS_NOT_FOUND
);
57 ok_eq_uint(Position
, 0);
60 Status
= RtlFindCharInUnicodeString(1, &String
, &Chars2
, &Position
);
61 ok_eq_hex(Status
, STATUS_NOT_FOUND
);
62 ok_eq_uint(Position
, 0);
65 Status
= RtlFindCharInUnicodeString(2, &String
, &Chars3
, &Position
);
66 ok_eq_hex(Status
, STATUS_SUCCESS
);
67 ok_eq_uint(Position
, 2);
70 Status
= RtlFindCharInUnicodeString(3, &String
, &Chars4
, &Position
);
71 ok_eq_hex(Status
, STATUS_SUCCESS
);
72 ok_eq_uint(Position
, 24);
74 /* Show that 4 means case insensitive */
76 Status
= RtlFindCharInUnicodeString(4, &String
, &Chars2
, &Position
);
77 ok_eq_hex(Status
, STATUS_SUCCESS
);
78 ok_eq_uint(Position
, 6);
81 Status
= RtlFindCharInUnicodeString(5, &String
, &Chars2
, &Position
);
82 ok_eq_hex(Status
, STATUS_SUCCESS
);
83 ok_eq_uint(Position
, 10);
86 Status
= RtlFindCharInUnicodeString(6, &String
, &Chars3
, &Position
);
87 ok_eq_hex(Status
, STATUS_SUCCESS
);
88 ok_eq_uint(Position
, 4);
91 Status
= RtlFindCharInUnicodeString(7, &String
, &Chars4
, &Position
);
92 ok_eq_hex(Status
, STATUS_SUCCESS
);
93 ok_eq_uint(Position
, 22);
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
);
103 Status
= RtlFindCharInUnicodeString(8, &String
, &String
, &Position
);
104 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
105 ok_eq_uint(Position
, 0);
108 Status
= RtlFindCharInUnicodeString(0xFFFFFFF8, &String
, &String
, &Position
);
109 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
110 ok_eq_uint(Position
, 0);
113 Status
= RtlFindCharInUnicodeString(0xFFFFFFFF, &String
, &String
, &Position
);
114 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
115 ok_eq_uint(Position
, 0);
117 /* NULL for SearchString */
120 Status
= RtlFindCharInUnicodeString(0, NULL
, &String
, &Position
);
121 EndSeh(STATUS_ACCESS_VIOLATION
);
122 ok_eq_uint(Position
, 0);
124 /* NULL for SearchString and invalid flags */
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);
133 /* NULL for SearchString with zero-length MatchString */
136 Status
= RtlFindCharInUnicodeString(0, NULL
, &ZeroLengthString
, &Position
);
137 EndSeh(STATUS_ACCESS_VIOLATION
);
138 ok_eq_uint(Position
, 0);
140 /* NULL for MatchString */
143 Status
= RtlFindCharInUnicodeString(0, &String
, NULL
, &Position
);
144 EndSeh(STATUS_ACCESS_VIOLATION
);
145 ok_eq_uint(Position
, 0);
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 */
150 /* NULL for MatchString with zero-length SearchString */
153 Status
= RtlFindCharInUnicodeString(0, &ZeroLengthString
, NULL
, &Position
);
154 EndSeh(STATUS_ACCESS_VIOLATION
);
155 ok_eq_uint(Position
, 0);
158 /* NULL for MatchString and invalid flags */
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);
166 /* NULL for Position */
168 Status
= RtlFindCharInUnicodeString(0, &String
, &String
, NULL
);
169 EndSeh(STATUS_SUCCESS
);
170 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
172 /* NULL for all three */
174 Status
= RtlFindCharInUnicodeString(0, NULL
, NULL
, NULL
);
175 EndSeh(STATUS_SUCCESS
);
176 ok_eq_hex(Status
, STATUS_INVALID_PARAMETER
);
180 START_TEST(RtlUnicodeString
)
182 TestFindCharInUnicodeString();