41#define RFind(sig) StringIds::rfind_ ## sig
43static const char*
const exceptions[] = {
44 "unknown exception",
"out_of_range",
"length_error",
45 "bad_alloc",
"exception"
56#define TEST(str, arg, res) \
57 { __LINE__, -1, -1, -1, -1, -1, \
58 str, sizeof str - 1, arg, \
59 sizeof arg - 1, 0, res, 0 \
79 TEST (
"abcdefghij",
"a", 0),
80 TEST (
"abcdefghij",
"f", 5),
81 TEST (
"abcdefghij",
"j", 9),
84 TEST (
"edfcbahjig",
"cba", 3),
85 TEST (
"edfcbahcba",
"cba", 7),
86 TEST (
"cbacbahjig",
"cba", 3),
88 TEST (
"e\0cb\0\0g",
"b\0\0g", 3),
90 TEST (
"\0cb\0\0ge",
"\0\0ge", 7),
91 TEST (
"\0cb\0\0ge",
"cb\0", 1),
92 TEST (
"e\0cbg\0\0",
"bg", 3),
96 TEST (
"bcaedfajih",
"a", 6),
97 TEST (
"bcedfaajih",
"a", 6),
98 TEST (
"bcaaedfaji",
"a", 7),
100 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0),
101 TEST (
"aaaaabaaaa",
"aaaaaaaaaa",
NPOS),
102 TEST (
"aaaaabaaaa",
"aaaaa", 0),
103 TEST (
"aaaabaaaaa",
"aaaaa", 5),
104 TEST (
"aaaabaaaaa",
"aaaa", 6),
105 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 1),
106 TEST (
"aaaaaaaaa",
"aaaaaaaaaa",
NPOS),
108 TEST (
"x@4096",
"", 4096),
110 TEST (
"x@4096",
"x", 4095),
111 TEST (
"x@4096",
"xxx", 4093),
114 TEST (
"xxxxxxxxxx",
"x@4096",
NPOS),
116 TEST (
"abcdefghij", 0, 0),
117 TEST (
"\0cb\0\0ge", 0, 7),
118 TEST (
"x@4096", 0, 0),
120 TEST (
"last test",
"test", 5)
128cstr_test_cases [] = {
131#define TEST(str, arg, res) \
132 { __LINE__, -1, -1, -1, -1, -1, \
133 str, sizeof str - 1, arg, \
134 sizeof arg - 1, 0, res, 0 \
150 TEST (
"\0",
"\0", 0),
156 TEST (
"abcdefghij",
"a", 0),
157 TEST (
"abcdefghij",
"f", 5),
158 TEST (
"abcdefghij",
"j", 9),
161 TEST (
"edfcbahjig",
"cba", 3),
162 TEST (
"edfcbahcba",
"cba", 7),
163 TEST (
"cbacbahjig",
"cba", 3),
165 TEST (
"e\0cb\0\0g",
"b\0\0g", 3),
167 TEST (
"\0cb\0\0ge",
"\0\0ge", 3),
168 TEST (
"\0cb\0\0ge",
"cb\0", 1),
170 TEST (
"e\0cbg\0\0",
"bg", 3),
171 TEST (
"e\0cbg\0\0",
"\0\0", 5),
172 TEST (
"\0\0cg\0\0",
"\0\0", 4),
177 TEST (
"bcaedfajih",
"a", 6),
178 TEST (
"bcedfaajih",
"a", 6),
179 TEST (
"bcaaedfaji",
"a", 7),
181 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0),
182 TEST (
"aaaaabaaaa",
"aaaaaaaaaa",
NPOS),
183 TEST (
"aaaabaaaaa",
"aaaaa", 5),
184 TEST (
"aaaaabaaaa",
"aaaa", 6),
185 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 1),
186 TEST (
"aaaaaaaaa",
"aaaaaaaaaa",
NPOS),
188 TEST (
"x@4096",
"", 4096),
190 TEST (
"x@4096",
"x", 4095),
191 TEST (
"x@4096",
"xxx", 4093),
194 TEST (
"xxxxxxxxxx",
"x@4096",
NPOS),
196 TEST (
"abcdefghij", 0, 0),
197 TEST (
"\0cb\0\0ge", 0, 0),
198 TEST (
"x@4096", 0, 0),
200 TEST (
"last test",
"test", 5)
208cptr_size_test_cases [] = {
211#define TEST(str, arg, off, res) \
212 { __LINE__, off, -1, -1, -1, -1, \
213 str, sizeof str - 1, arg, \
214 sizeof arg - 1, 0, res, 0 \
224 TEST (
"ab",
"a", 0, 0),
227 TEST (
"",
"\0", 0, 0),
230 TEST (
"\0",
"", 0, 0),
231 TEST (
"\0",
"", 1, 1),
232 TEST (
"\0",
"\0", 0, 0),
233 TEST (
"\0",
"\0", 1, 1),
237 TEST (
"abcdefghij",
"a", 0, 0),
238 TEST (
"abcdefghij",
"a", 2, 0),
240 TEST (
"abcdefghij",
"f", 7, 5),
241 TEST (
"abcdefghij",
"j", 9, 9),
243 TEST (
"edfcbbhjig",
"cba", 0,
NPOS),
244 TEST (
"edfcbahjig",
"cba", 1,
NPOS),
245 TEST (
"edfcbahjig",
"cba", 5, 3),
246 TEST (
"edfcbahcba",
"cba", 1,
NPOS),
247 TEST (
"edfcbahcba",
"cba", 9, 7),
248 TEST (
"edfcbahcba",
"cba", 5, 3),
249 TEST (
"cbacbahjig",
"cba", 5, 3),
251 TEST (
"e\0cb\0\0g",
"b\0\0g", 5, 3),
252 TEST (
"e\0cb\0\0g",
"b\0\0g", 4, 3),
253 TEST (
"e\0cb\0\0g",
"ecb", 7,
NPOS),
254 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 6),
255 TEST (
"\0cb\0\0ge",
"cb\0", 0,
NPOS),
256 TEST (
"\0cb\0\0ge",
"cb\0", 1, 1),
257 TEST (
"\0cb\0\0ge",
"cb\0", 2, 1),
259 TEST (
"e\0cbg\0\0",
"bg", 5, 3),
260 TEST (
"e\0cbg\0\0",
"cba", 7,
NPOS),
263 TEST (
"bcaedfajih",
"a", 8, 6),
264 TEST (
"bcedfaajih",
"a", 6, 6),
265 TEST (
"bcaaedfaji",
"a", 8, 7),
267 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 0),
268 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 8, 0),
269 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 9,
NPOS),
270 TEST (
"aaaabaaaaa",
"aaaaa", 9, 5),
271 TEST (
"aaaabaaaaa",
"aaaaa", 6, 5),
272 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 9, 1),
273 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 8, 1),
274 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 7, 1),
275 TEST (
"aaaaaaaaa",
"aaaaaaaaaa", 8,
NPOS),
277 TEST (
"x@4096",
"", 4096, 4096),
279 TEST (
"x@4096",
"x", 4096, 4095),
280 TEST (
"x@4096",
"xxx", 4095, 4093),
281 TEST (
"x@4096",
"xxx", 0, 0),
282 TEST (
"x@4096",
"xxx", 4087, 4087),
285 TEST (
"xxxxxxxxxx",
"x@4096", 6,
NPOS),
287 TEST (
"x@4096",
"xxx", 3, 3),
288 TEST (
"x@4096",
"xxx", 2, 2),
290 TEST (
"abcdefghij", 0, 0, 0),
291 TEST (
"abcdefghij", 0, 1, 0),
292 TEST (
"\0cb\0\0ge", 0, 5, 5),
293 TEST (
"x@4096", 0, 0, 0),
294 TEST (
"x@4096", 0, 1, 0),
297 TEST (
"abcdefghij",
"abc", 10, 0),
298 TEST (
"abcdefghij",
"cba", 10,
NPOS),
300 TEST (
"last test",
"test", 9, 5)
308cptr_size_size_test_cases [] = {
311#define TEST(str, arg, off, size, res) { \
312 __LINE__, off, size, -1, -1, -1, \
313 str, sizeof str - 1, arg, \
314 sizeof arg - 1, 0, res, 0 \
325 TEST (
"ab",
"a", 0, 1, 0),
327 TEST (
"",
"", 0, 0, 0),
328 TEST (
"",
"\0", 0, 0, 0),
330 TEST (
"",
"a", 0, 0, 0),
333 TEST (
"\0",
"", 0, 0, 0),
334 TEST (
"\0",
"\0", 0, 1, 0),
335 TEST (
"\0",
"\0", 1, 1, 0),
336 TEST (
"\0\0",
"\0\0", 1, 1, 1),
339 TEST (
"edfcbbhjig",
"cba", 0, 3,
NPOS),
340 TEST (
"edfcbbhjig",
"cba", 0, 2,
NPOS),
341 TEST (
"edfcbbhjig",
"cba", 9, 2, 3),
342 TEST (
"edfcbahjig",
"cba", 8, 3, 3),
343 TEST (
"edfcbahjig",
"cba", 2, 3,
NPOS),
344 TEST (
"edfcbahjig",
"cba", 2, 1,
NPOS),
345 TEST (
"edfcbahcba",
"cba", 8, 3, 7),
346 TEST (
"edfcbehcba",
"cba", 8, 2, 7),
347 TEST (
"edfcbahcba",
"cba", 9, 3, 7),
348 TEST (
"cbacbahjig",
"cba", 5, 3, 3),
349 TEST (
"cbacbahjig",
"cba", 2, 3, 0),
350 TEST (
"cbacbahjcg",
"cba", 2, 1, 0),
352 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 4,
NPOS),
353 TEST (
"e\0cb\0\0g",
"b\0\0g", 7, 4, 3),
354 TEST (
"e\0cb\0\0b",
"b\0\0g", 4, 1, 3),
355 TEST (
"\0b\0\0gb\0",
"b\0\0g", 7, 2, 5),
356 TEST (
"\0b\0\0gb\0",
"b\0\0g", 2, 2, 1),
357 TEST (
"\0b\0\0gb\0",
"b\0\0g", 7, 3, 1),
358 TEST (
"e\0cb\0\0g",
"ecb", 7, 2,
NPOS),
359 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 4, 3),
360 TEST (
"\0cb\0\0ge",
"\0\0ge", 2, 0, 2),
361 TEST (
"\0cb\0\0ge",
"cb\0", 1, 3, 1),
362 TEST (
"e\0cbg\0\0",
"bg", 1, 2,
NPOS),
363 TEST (
"e\0cbg\0\0",
"cba", 7, 3,
NPOS),
364 TEST (
"e\0cbg\0\0",
"cba", 7, 2, 2),
366 TEST (
"e\0a\0",
"e\0a\0\0", 3, 4, 0),
367 TEST (
"e\0a\0",
"e\0a\0\0", 3, 5,
NPOS),
368 TEST (
"ee\0a\0",
"e\0a\0\0", 4, 4, 1),
369 TEST (
"ee\0a\0",
"e\0a\0\0", 4, 5,
NPOS),
371 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 9, 10, 0),
372 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 1, 10, 0),
373 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 1, 9, 1),
374 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 0, 10,
NPOS),
375 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 1, 4, 1),
376 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 7, 4, 6),
377 TEST (
"aaaabaaaaa",
"aaaaa", 0, 5,
NPOS),
378 TEST (
"aaaabaaaaa",
"aaaaa", 0, 4, 0),
379 TEST (
"aaaabaaaaa",
"aaaaa", 6, 5, 5),
380 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 0, 9, 0),
381 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 1, 9, 1),
382 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 2, 9, 1),
383 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 7, 8, 2),
384 TEST (
"aaaaaaaaa",
"aaaaaaaaaa", 9, 10,
NPOS),
385 TEST (
"aaaaaaaaa",
"aaaaaaaaaa", 8, 7, 2),
387 TEST (
"x@4096",
"", 4096, 0, 4096),
388 TEST (
"x@4096",
"a", 4096, 1,
NPOS),
389 TEST (
"x@4096",
"x", 4096, 1, 4095),
390 TEST (
"x@4096",
"xxx", 4087, 3, 4087),
391 TEST (
"x@4096",
"xxa", 4087, 3,
NPOS),
392 TEST (
"x@4096",
"xxa", 4096, 2, 4094),
393 TEST (
"abc",
"x@4096", 2, 10,
NPOS),
394 TEST (
"xxxxxxxxxx",
"x@4096", 0, 4096,
NPOS),
395 TEST (
"xxxxxxxxxx",
"x@4096", 2, 4, 2),
397 TEST (
"x@4096",
"xxx", 4093, 3, 4093),
398 TEST (
"x@4096",
"xxx", 4094, 3, 4093),
399 TEST (
"x@4096",
"xxx", 4094, 2, 4094),
401 TEST (
"abcdefghij", 0, 0, 9, 0),
402 TEST (
"abcdefghij", 0, 1, 9, 0),
403 TEST (
"\0cb\0\0ge", 0, 5, 7, 0),
404 TEST (
"\0cb\0ge\0", 0, 6, 1, 6),
405 TEST (
"x@4096", 0, 0, 4096, 0),
406 TEST (
"x@4096", 0, 1, 4096, 0),
407 TEST (
"x@4096", 0, 5, 4091, 5),
409 TEST (
"",
"", 1, 0, 0),
410 TEST (
"abcdefghij",
"abc", 10, 3, 0),
411 TEST (
"abcdefghij",
"cba", 10, 1, 2),
415 TEST (
"abcdefghij",
"cba", 0, -1,
NPOS),
416 TEST (
"x@4096",
"xxx", 0, -1,
NPOS),
417 TEST (
"abcdefghij",
"x@4096", 0, -1,
NPOS),
419 TEST (
"last test",
"test", 9, 4, 5)
427cstr_size_test_cases [] = {
430#define TEST(str, arg, off, res) \
431 { __LINE__, off, -1, -1, -1, -1, \
432 str, sizeof str - 1, arg, \
433 sizeof arg - 1, 0, res, 0 \
443 TEST (
"ab",
"a", 0, 0),
449 TEST (
"\0",
"", 0, 0),
450 TEST (
"\0",
"\0", 0, 0),
451 TEST (
"\0",
"\0", 1, 0),
452 TEST (
"\0\0",
"\0", 2, 1),
456 TEST (
"abcdefghij",
"a", 0, 0),
457 TEST (
"abcdefghij",
"a", 9, 0),
459 TEST (
"abcdefghij",
"f", 7, 5),
460 TEST (
"abcdefghij",
"j", 9, 9),
462 TEST (
"edfcbbhjig",
"cba", 9,
NPOS),
463 TEST (
"edfcbahjig",
"cba", 1,
NPOS),
464 TEST (
"edfcbahjig",
"cba", 4, 3),
465 TEST (
"edfcbahcba",
"cba", 9, 7),
466 TEST (
"edfcbahcba",
"cba", 6, 3),
467 TEST (
"cbacbahjig",
"cba", 5, 3),
469 TEST (
"e\0cb\0\0g",
"b\0\0g", 7, 3),
470 TEST (
"e\0cb\0\0g",
"b\0\0g", 2,
NPOS),
471 TEST (
"e\0cb\0\0g",
"ecb", 7,
NPOS),
472 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 3),
473 TEST (
"\0cb\0\0ge",
"\0\0ge", 1,
NPOS),
474 TEST (
"\0cb\0\0ge",
"cb\0", 2, 1),
475 TEST (
"\0cbg\0\0e",
"cb\0", 0,
NPOS),
476 TEST (
"e\0cbg\0\0",
"bg", 6, 3),
477 TEST (
"e\0cbg\0\0",
"cba", 7,
NPOS),
480 TEST (
"bcaedfajih",
"a", 9, 6),
481 TEST (
"bcedfaajih",
"a", 6, 6),
482 TEST (
"bcaaedfaji",
"a", 5, 3),
484 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 0),
485 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 9, 0),
486 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 9,
NPOS),
487 TEST (
"aaaabaaaaa",
"aaaaa", 9, 5),
488 TEST (
"aaaabaaaaa",
"aaaaa", 3,
NPOS),
489 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 9, 1),
490 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 0, 0),
491 TEST (
"aaaaaaaaa",
"aaaaaaaaaa", 8,
NPOS),
493 TEST (
"x@4096",
"", 4096, 4096),
495 TEST (
"x@4096",
"x", 4096, 4095),
496 TEST (
"x@4096",
"xxx", 4087, 4087),
499 TEST (
"xxxxxxxxxx",
"x@4096", 4096,
NPOS),
501 TEST (
"x@4096",
"xxx", 4096, 4093),
502 TEST (
"x@4096",
"xxx", 4091, 4091),
504 TEST (
"abcdefghij", 0, 9, 0),
505 TEST (
"abcdefghij", 0, 1, 0),
506 TEST (
"\0cb\0\0ge", 0, 5, 0),
507 TEST (
"x@4096", 0, 0, 0),
508 TEST (
"x@4096", 0, 1, 0),
511 TEST (
"abcdefghij",
"abc", 10, 0),
512 TEST (
"abcdefghij",
"cba", 10,
NPOS),
514 TEST (
"last test",
"test", 9, 5)
525#define TEST(str, val, res) \
526 { __LINE__, -1, -1, -1, -1, val, \
527 str, sizeof str - 1, \
542 TEST (
"\0",
'\0', 0),
543 TEST (
"\0\0",
'\0', 1),
546 TEST (
"e\0cb\0\0g",
'\0', 5),
547 TEST (
"e\0cb\0\0g",
'b', 3),
549 TEST (
"\0cbge\0\0",
'\0', 6),
550 TEST (
"\0cbge\0\0",
'b', 2),
553 TEST (
"x@4096",
'x', 4095),
557 TEST (
"last test",
't', 8)
565val_size_test_cases [] = {
568#define TEST(str, val, off, res) \
569 { __LINE__, off, -1, -1, -1, val, \
570 str, sizeof str - 1, \
581 TEST (
"ab",
'a', 0, 0),
586 TEST (
"\0",
'\0', 1, 0),
588 TEST (
"\0\0",
'\0', 2, 1),
590 TEST (
"\0\0",
'\0', 3, 1),
592 TEST (
"e\0cb\0\0g",
'\0', 1, 1),
593 TEST (
"e\0cb\0\0g",
'\0', 5, 5),
596 TEST (
"e\0cb\0\0g",
'b', 4, 3),
598 TEST (
"\0cbge\0\0",
'\0', 0, 0),
599 TEST (
"\0cbge\0\0",
'\0', 5, 5),
600 TEST (
"\0cbge\0\0",
'\0', 9, 6),
601 TEST (
"\0cbge\0\0",
'b', 5, 2),
602 TEST (
"\0bgeb\0\0",
'b', 5, 4),
605 TEST (
"x@4096",
'x', 0, 0),
606 TEST (
"x@4096",
'x', 5, 5),
607 TEST (
"x@4096",
'x', 4096, 4095),
610 TEST (
"x@4096",
'x', 4095, 4095),
611 TEST (
"x@4096",
'x', 4106, 4095),
613 TEST (
"last test",
't', 9, 8)
618template <
class charT,
class Traits,
class Allocator>
623 typedef std::basic_string <charT, Traits, Allocator>
String;
625 static const std::size_t BUFSIZE = 256;
627 static charT wstr_buf [BUFSIZE];
628 static charT warg_buf [BUFSIZE];
630 std::size_t str_len =
sizeof wstr_buf /
sizeof *wstr_buf;
631 std::size_t arg_len =
sizeof warg_buf /
sizeof *warg_buf;
637 const String s_str (wstr, str_len);
638 const String s_arg (warg, arg_len);
640 if (wstr != wstr_buf)
643 if (warg != warg_buf)
654 const charT*
const arg_ptr = tcase.
arg ? s_arg.c_str () : s_str.c_str ();
655 const String& arg_str = tcase.
arg ? s_arg : s_str;
658 std::size_t
size = tcase.
size >= 0 ? tcase.
size : s_arg.max_size () + 1;
660#ifndef _RWSTD_NO_EXCEPTIONS
663 const char* expected = 0;
665 expected = exceptions [2];
679 switch (
func.which_) {
681 res = s_str.rfind (arg_ptr);
685 res = s_str.rfind (arg_str);
688 case RFind (cptr_size):
689 res = s_str.rfind (arg_ptr, tcase.
off);
692 case RFind (cptr_size_size):
696 case RFind (cstr_size):
697 res = s_str.rfind (arg_str, tcase.
off);
701 res = s_str.rfind (arg_val);
704 case RFind (val_size):
705 res = s_str.rfind (arg_val, tcase.
off);
709 RW_ASSERT (
"test logic error: unknown rfind overload");
713 const std::size_t exp_res =
718 "line %d. %{$FUNCALL} == %{?}%zu%{;}%{?}npos%{;}, "
719 "got %{?}%zu%{;}%{?}npos%{;}",
721 String::npos !=
res,
res, String::npos ==
res);
724#ifndef _RWSTD_NO_EXCEPTIONS
729 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
730 "unexpectedly%{;} caught std::%s(%#s)",
731 __LINE__, 0 != expected, expected,
caught, ex.what ());
736 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
737 "unexpectedly%{;} caught %s",
738 __LINE__, 0 != expected, expected,
caught);
749 else if (-1 != tcase.
bthrow) {
751 "line %d. %{$FUNCALL} %{?}expected %s, caught %s"
752 "%{:}unexpectedly caught %s%{;}",
761int main (
int argc,
char** argv)
768 RFind (sig), sig ## _test_cases, \
769 sizeof sig ## _test_cases / sizeof *sig ## _test_cases \
775 TEST (cptr_size_size),
781 const std::size_t test_count =
sizeof tests /
sizeof *tests;
void test_rfind(charT, Traits *, Allocator *, const StringFunc &func, const StringTestCase &tcase)
#define TEST(str, arg, res)
std::char_traits< S > Traits
UserChar make_char(char c, UserChar *)
_TEST_EXPORT char * rw_expand(char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX, _RWSTD_SIZE_T *=0)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
StringState rw_get_string_state(const String &str)
#define DEFINE_STRING_TEST_DISPATCH(fname)
_TEST_EXPORT int rw_run_string_test(int, char **, const char *, const char *, StringTestFunc *, const StringTest *, _RWSTD_SIZE_T)
int assert_equal(const StringState &, int, int, const char *) const