42#define FindLastNotOf(sig) StringIds::find_last_not_of_ ## sig
44static const char*
const exceptions[] = {
45 "unknown exception",
"out_of_range",
"length_error",
46 "bad_alloc",
"exception"
57#define TEST(str, arg, res) \
58 { __LINE__, -1, -1, -1, -1, -1, \
59 str, sizeof str - 1, arg, \
60 sizeof arg - 1, 0, res, 0 \
79 TEST (
"bbcdefghij",
"a", 9),
80 TEST (
"bcdefghija",
"a", 8),
81 TEST (
"abcdedaaaa",
"a", 5),
82 TEST (
"aabaaacaaa",
"a", 6),
84 TEST (
"edfcbbhjig",
"cba", 9),
85 TEST (
"edfcbaacba",
"bca", 2),
86 TEST (
"edhcbahcba",
"cba", 6),
89 TEST (
"e\0cb\0\0g",
"b\0\0g", 6),
90 TEST (
"e\0cb\0\0g",
"ecbg", 5),
91 TEST (
"\0cb\0\0ge",
"\0\0ge", 6),
92 TEST (
"ge\0\0\0cb",
"bc\0", 4),
93 TEST (
"e\0cdg\0\0",
"abc", 6),
94 TEST (
"a\0b",
"e\0gbg\0\0", 2),
95 TEST (
"a\0b",
"ab\0gg\0\0", 1),
96 TEST (
"\0ab",
"b\0gg\0\0a", 1),
98 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa",
NPOS),
99 TEST (
"aaaaabaaaa",
"ccccccccca", 5),
100 TEST (
"aabaabaaaa",
"ccccccccca", 5),
102 TEST (
"bbb",
"aaaaaaaaaa", 2),
103 TEST (
"abcdefghij",
"jihgfedcba",
NPOS),
105 TEST (
"x@4096",
"", 4095),
106 TEST (
"x@4096",
"a", 4095),
110 TEST (
"abc",
"x@4096", 2),
111 TEST (
"xxxxxxxxxx",
"x@4096",
NPOS),
112 TEST (
"xxax@2048",
"x@4096", 2),
115 TEST (
"\0cb\0\0ge", 0, 6),
118 TEST (
"last test",
"test", 4)
126cstr_test_cases [] = {
129#define TEST(str, arg, res) \
130 { __LINE__, -1, -1, -1, -1, -1, \
131 str, sizeof str - 1, arg, \
132 sizeof arg - 1, 0, res, 0 \
153 TEST (
"bbcdefghij",
"a", 9),
154 TEST (
"bcdefghija",
"a", 8),
155 TEST (
"abcdedaaaa",
"a", 5),
156 TEST (
"aabaaacaaa",
"a", 6),
158 TEST (
"edfcbbhjig",
"cba", 9),
159 TEST (
"edfcbaacba",
"bca", 2),
160 TEST (
"edhcbahcba",
"cba", 6),
163 TEST (
"e\0bb\0\0g",
"b\0\0g", 0),
164 TEST (
"e\0cb\0\0g",
"ecbg", 5),
165 TEST (
"\0cb\0\0ge",
"\0\0ge", 2),
166 TEST (
"be\0\0\0cb",
"bc\0", 1),
167 TEST (
"e\0cdg\0\0",
"abc", 6),
168 TEST (
"a\0b",
"e\0gbg\0\0", 0),
170 TEST (
"\0ab",
"abcdefghij", 0),
172 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa",
NPOS),
173 TEST (
"aaaaabaaaa",
"ccccccccca", 5),
174 TEST (
"aabaabaaaa",
"ccccccccca", 5),
176 TEST (
"bbb",
"aaaaaaaaaa", 2),
177 TEST (
"abcdefghij",
"jihgfedcba",
NPOS),
179 TEST (
"x@4096",
"", 4095),
180 TEST (
"x@4096",
"a", 4095),
184 TEST (
"abc",
"x@4096", 2),
185 TEST (
"xxxxxxxxxx",
"x@4096",
NPOS),
186 TEST (
"xxax@2048",
"x@4096", 2),
192 TEST (
"last test",
"test", 4)
200cptr_size_test_cases [] = {
203#define TEST(str, arg, off, res) \
204 { __LINE__, off, -1, -1, -1, -1, \
205 str, sizeof str - 1, arg, \
206 sizeof arg - 1, 0, res, 0 \
216 TEST (
"ab",
"c", 0, 0),
222 TEST (
"\0",
"", 0, 0),
223 TEST (
"\0",
"", 1, 0),
224 TEST (
"\0",
"\0", 0, 0),
225 TEST (
"\0",
"\0", 1, 0),
226 TEST (
"\0",
"a", 0, 0),
228 TEST (
"bbcdefghij",
"a", 9, 9),
229 TEST (
"bcdefghija",
"a", 9, 8),
230 TEST (
"bbcdefghij",
"a", 0, 0),
231 TEST (
"bcadefghij",
"a", 2, 1),
233 TEST (
"abcdeaaaij",
"a", 7, 4),
235 TEST (
"edfcbbhjig",
"cba", 9, 9),
236 TEST (
"edfcbacbag",
"cba", 7, 2),
237 TEST (
"ebccbahjig",
"cba", 4, 0),
238 TEST (
"edfcbahcba",
"cba", 9, 6),
239 TEST (
"cbacbahcba",
"cba", 5,
NPOS),
240 TEST (
"edfcbahcba",
"cba", 3, 2),
241 TEST (
"cbahbahabc",
"cba", 9, 6),
243 TEST (
"e\0cb\0\0g",
"b\0\0g", 5, 5),
244 TEST (
"b\0bc\0\0g",
"b\0\0g", 2, 1),
245 TEST (
"e\0cb\0\0g",
"ecb", 7, 6),
246 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 6),
247 TEST (
"b\0\0\0gec",
"cb\0", 0,
NPOS),
248 TEST (
"\0cb\0\0ge",
"cb\0", 1, 0),
249 TEST (
"\0cb\0\0ge",
"cb\0", 2, 0),
250 TEST (
"e\0cbg\0\0",
"bg", 4, 2),
251 TEST (
"e\0\0\0bbg",
"bg", 5, 3),
252 TEST (
"a\0b",
"b\0gbg\0\0", 3, 1),
253 TEST (
"\0ba",
"ab\0gg\0\0", 3, 0),
254 TEST (
"ab\0",
"ba\0d\0\0a", 1,
NPOS),
256 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 9,
NPOS),
257 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 4,
NPOS),
258 TEST (
"aaaaabaaaa",
"ccccccccca", 8, 5),
259 TEST (
"aabaabaaaa",
"ccccccccca", 9, 5),
260 TEST (
"aabaabaaaa",
"ccccccccca", 3, 2),
261 TEST (
"bbb",
"aaaaaaaaba", 2,
NPOS),
262 TEST (
"cab",
"aaaaaaaaba", 0, 0),
263 TEST (
"bbb",
"aaaaaaaaaa", 3, 2),
265 TEST (
"x@4096",
"", 4096, 4095),
266 TEST (
"x@4096",
"a", 4096, 4095),
272 TEST (
"abc",
"x@4096", 2, 2),
273 TEST (
"xxxxxxxxxx",
"x@4096", 6,
NPOS),
274 TEST (
"xxxxaxxxxx",
"x@4096", 9, 4),
278 TEST (
"xxax@2048",
"x@4096", 2052, 2),
282 TEST (
"\0cb\0\0ge", 0, 5, 5),
287 TEST (
"defghijabc",
"abc", 15, 6),
288 TEST (
"defgabcabc",
"cba", 15, 3),
290 TEST (
"last test",
"test", 9, 4)
298cptr_size_size_test_cases [] = {
301#define TEST(str, arg, off, size, res, bthrow) \
302 { __LINE__, off, size, int (NPOS), -1, -1, \
303 str, sizeof str - 1, arg, \
304 sizeof arg - 1, 0, res, bthrow \
318 TEST (
"ab",
"c", 0, 1, 0, 0),
326 TEST (
"\0",
"", 0, 0, 0, 0),
329 TEST (
"\0\0",
"\0\0", 1, 1,
NPOS, 0),
330 TEST (
"\0",
"a", 0, 1, 0, 0),
331 TEST (
"a",
"\0", 0, 1, 0, 0),
333 TEST (
"adfcbbhjig",
"cba", 0, 3,
NPOS, 0),
334 TEST (
"bdfcbbhjig",
"cba", 0, 2,
NPOS, 0),
335 TEST (
"edfhjabcbb",
"cba", 9, 2, 5, 0),
336 TEST (
"edacbdcbag",
"cba", 8, 3, 5, 0),
337 TEST (
"edfcbaabcg",
"cba", 8, 3, 2, 0),
338 TEST (
"cccfehjigb",
"cba", 2, 1,
NPOS, 0),
339 TEST (
"edfcbahcba",
"cba", 9, 3, 6, 0),
340 TEST (
"edfcbehcba",
"cab", 9, 2, 8, 0),
341 TEST (
"edfcbacbah",
"cba", 9, 3, 9, 0),
342 TEST (
"cbacbahjig",
"cba", 5, 3,
NPOS, 0),
343 TEST (
"accacbahji",
"cba", 2, 1, 0, 0),
344 TEST (
"cbacbaccdg",
"cba", 7, 1, 5, 0),
346 TEST (
"e\0cb\0\0g",
"b\0\0g", 6, 4, 2, 0),
347 TEST (
"eg\0b\0\0g",
"b\0\0g", 7, 4, 0, 0),
348 TEST (
"e\0cb\0\0b",
"b\0\0g", 4, 1, 4, 0),
349 TEST (
"g\0b\0\0b\0",
"b\0\0g", 7, 2, 0, 0),
350 TEST (
"\0bg\0\0b\0",
"b\0\0g", 2, 2, 2, 0),
351 TEST (
"\0b\0\0b\0g",
"b\0g\0", 7, 3,
NPOS, 0),
352 TEST (
"e\0cbg\0\0",
"ecb", 7, 2, 6, 0),
353 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 4, 2, 0),
354 TEST (
"\0cb\0\0ge",
"\0\0ge", 2, 0, 2, 0),
355 TEST (
"\0cb\0\0ge",
"cb\0", 4, 3,
NPOS, 0),
356 TEST (
"e\0bcg\0\0",
"bg", 1, 2, 1, 0),
357 TEST (
"e\0bcg\0\0",
"bg", 6, 2, 6, 0),
358 TEST (
"a\0b",
"a\0gbg\0\0", 2, 1, 2, 0),
359 TEST (
"\0ba",
"ab\0gg\0\0", 1, 2, 0, 0),
360 TEST (
"ba\0",
"e\0gg\0\0a", 3, 7, 0, 0),
361 TEST (
"a\0b",
"e\0gg\0\0a", 0, 7,
NPOS, 0),
362 TEST (
"a\0b",
"eb\0gg\0\0", 1, 3, 0, 0),
364 TEST (
"e\0a\0",
"e\0a\0\0", 2, 4,
NPOS, 0),
365 TEST (
"e\0a\0",
"e\0a\0\0", 3, 5,
NPOS, 0),
366 TEST (
"ee\0a\0",
"b\0c\0\0", 3, 4, 3, 0),
367 TEST (
"e\0\0cb",
"fdbcb\0a", 3, 5, 2, 0),
369 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 9, 10,
NPOS, 0),
370 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 8, 10,
NPOS, 0),
371 TEST (
"aaaaabaaaa",
"ccccccccca", 9, 10, 5, 0),
372 TEST (
"aabaabaaab",
"cccacccccc", 8, 4, 5, 0),
373 TEST (
"aaaabaaaab",
"cccca", 9, 5, 9, 0),
374 TEST (
"aabaabaaaa",
"cacccccccb", 7, 5, 5, 0),
375 TEST (
"bbb",
"aaaaaaaaba", 1, 2, 1, 0),
376 TEST (
"bbb",
"aaaaaaaaab", 1, 9, 1, 0),
377 TEST (
"bab",
"aaaaaaaaba", 0, 0, 0, 0),
378 TEST (
"bab",
"ccccccccba", 1, 10,
NPOS, 0),
379 TEST (
"abcdefghij",
"jihgfedcba", 9, 10,
NPOS, 0),
380 TEST (
"abcdefghij",
"jihgfedcba", 9, 9, 0, 0),
382 TEST (
"x@4096",
"", 4096, 0, 4095, 0),
383 TEST (
"x@4096",
"a", 4096, 1, 4095, 0),
384 TEST (
"x@4096",
"x", 4096, 1,
NPOS, 0),
385 TEST (
"x@4096",
"xxx", 4088, 3,
NPOS, 0),
386 TEST (
"x@4096",
"aax", 4088, 2, 4088, 0),
387 TEST (
"abc",
"x@4096", 2, 10, 2, 0),
388 TEST (
"xxxxxxxxxx",
"x@4096", 9, 4096,
NPOS, 0),
389 TEST (
"xxxxxxxxxx",
"x@4096", 2, 4,
NPOS, 0),
391 TEST (
"x@4096",
"xxx", 4093, 3,
NPOS, 0),
392 TEST (
"x@4096",
"xxx", 4094, 0, 4094, 0),
393 TEST (
"xxax@2048",
"x@4096a", 2052, 4096, 2, 0),
395 TEST (
"abcdefghij", 0, 9, 10,
NPOS, 0),
396 TEST (
"abcdefghij", 0, 8, 6, 8, 0),
397 TEST (
"\0cb\0\0ge", 0, 5, 7,
NPOS, 0),
398 TEST (
"\0cb\0ge\0", 0, 6, 1, 5, 0),
399 TEST (
"\0c\0eg\0c", 0, 6, 2, 4, 0),
400 TEST (
"x@4096", 0, 0, 4096,
NPOS, 0),
401 TEST (
"x@4096", 0, 1, 4096,
NPOS, 0),
402 TEST (
"x@4096", 0, 4091, 0, 4091, 0),
405 TEST (
"defghijabc",
"abc", 15, 3, 6, 0),
406 TEST (
"defghijabc",
"cba", 15, 1, 8, 0),
410 TEST (
"last test",
"test", 9, 4, 4, 0)
418cstr_size_test_cases [] = {
421#define TEST(str, arg, off, res) \
422 { __LINE__, off, -1, -1, -1, -1, \
423 str, sizeof str - 1, arg, \
424 sizeof arg - 1, 0, res, 0 \
434 TEST (
"ab",
"c", 1, 1),
440 TEST (
"\0",
"", 0, 0),
441 TEST (
"\0",
"", 1, 0),
445 TEST (
"\0",
"a", 0, 0),
446 TEST (
"a",
"\0", 1, 0),
448 TEST (
"bbcdefghij",
"a", 9, 9),
449 TEST (
"bcdefghija",
"a", 9, 8),
450 TEST (
"bbcdefghij",
"a", 0, 0),
451 TEST (
"bcadefghij",
"a", 2, 1),
453 TEST (
"abcdeaaaij",
"a", 7, 4),
455 TEST (
"edfcbbhjig",
"cba", 9, 9),
456 TEST (
"edfcbacbag",
"cba", 7, 2),
457 TEST (
"ebccbahjig",
"cba", 4, 0),
458 TEST (
"edfcbahcba",
"cba", 9, 6),
459 TEST (
"cbacbahcba",
"cba", 5,
NPOS),
460 TEST (
"edfcbahcba",
"cba", 3, 2),
461 TEST (
"cbahbahabc",
"cba", 9, 6),
463 TEST (
"e\0cb\0\0g",
"b\0\0g", 5, 2),
464 TEST (
"c\0bg\0\0g",
"b\0\0g", 2, 0),
465 TEST (
"e\0cb\0\0g",
"ecb", 7, 6),
466 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 2),
467 TEST (
"b\0\0\0gec",
"cb\0", 2,
NPOS),
468 TEST (
"\0cb\0\0ge",
"cb\0", 1,
NPOS),
469 TEST (
"\0cb\0\0ge",
"cb\0", 6, 6),
470 TEST (
"e\0cbg\0\0",
"bg", 4, 2),
471 TEST (
"e\0\0\0bbg",
"bg", 5, 3),
472 TEST (
"a\0b",
"b\0gbg\0\0", 3, 0),
473 TEST (
"\0ba",
"ab\0gg\0\0", 3,
NPOS),
474 TEST (
"ab\0",
"ba\0d\0\0a", 2,
NPOS),
476 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 9,
NPOS),
477 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 4,
NPOS),
478 TEST (
"aaaaabaaaa",
"ccccccccca", 8, 5),
479 TEST (
"aabaabaaaa",
"ccccccccca", 9, 5),
480 TEST (
"aabaabaaaa",
"ccccccccca", 3, 2),
481 TEST (
"bbb",
"aaaaaaaaba", 2,
NPOS),
482 TEST (
"cab",
"aaaaaaaaba", 0, 0),
483 TEST (
"bbb",
"aaaaaaaaaa", 3, 2),
485 TEST (
"x@4096",
"", 4096, 4095),
486 TEST (
"x@4096",
"a", 4096, 4095),
492 TEST (
"abc",
"x@4096", 2, 2),
493 TEST (
"xxxxxxxxxx",
"x@4096", 6,
NPOS),
494 TEST (
"xxxxaxxxxx",
"x@4096", 9, 4),
495 TEST (
"xxax@2048",
"x@4096", 2050, 2),
507 TEST (
"defghijabc",
"abc", 15, 6),
508 TEST (
"defgabcabc",
"cba", 15, 3),
510 TEST (
"last test",
"test", 9, 4)
521#define TEST(str, val, res) \
522 { __LINE__, -1, -1, -1, -1, \
523 val, str, sizeof str - 1, \
541 TEST (
"a\0",
'\0', 0),
543 TEST (
"e\0cbg\0\0",
'\0', 4),
544 TEST (
"e\0cgg\0\0",
'\0', 4),
545 TEST (
"e\0cb\0\0b",
'b', 5),
546 TEST (
"\0cbge\0\0",
'\0', 4),
547 TEST (
"\0cbgb\0\0",
'b', 6),
549 TEST (
"\0aaaaaaaa",
'a', 0),
552 TEST (
"x@4096",
'\0', 4095),
553 TEST (
"x@4096",
'a', 4095),
554 TEST (
"xxax@2048",
'x', 2),
556 TEST (
"last test",
't', 7)
564val_size_test_cases [] = {
567#define TEST(str, val, off, res) \
568 { __LINE__, off, -1, -1, -1, \
569 val, str, sizeof str - 1, \
580 TEST (
"ab",
'c', 1, 1),
586 TEST (
"\0",
'a', 0, 0),
588 TEST (
"\0\0",
'a', 3, 1),
591 TEST (
"e\0cb\0\0g",
'\0', 1, 0),
592 TEST (
"e\0cb\0\0g",
'\0', 5, 3),
594 TEST (
"e\0cb\0\0b",
'b', 7, 5),
595 TEST (
"e\0cb\0\0g",
'b', 4, 4),
596 TEST (
"e\0cbg\0\0",
'a', 6, 6),
598 TEST (
"\0cbee\0\0",
'\0', 6, 4),
599 TEST (
"\0cb\0\0\0",
'\0', 9, 2),
601 TEST (
"\0aaaaaaaa",
'a', 6, 0),
605 TEST (
"x@4096",
'\0', 4096, 4095),
606 TEST (
"x@4096",
'a', 4094, 4094),
608 TEST (
"xxax@2048",
'x', 2050, 2),
610 TEST (
"last test",
't', 9, 7)
615template <
class charT,
class Traits,
class Allocator>
620 typedef std::basic_string <charT, Traits, Allocator>
String;
622 static const std::size_t BUFSIZE = 256;
624 static charT wstr_buf [BUFSIZE];
625 static charT warg_buf [BUFSIZE];
627 std::size_t str_len =
sizeof wstr_buf /
sizeof *wstr_buf;
628 std::size_t arg_len =
sizeof warg_buf /
sizeof *warg_buf;
634 const String s_str (wstr, str_len);
635 const String s_arg (warg, arg_len);
637 if (wstr != wstr_buf)
640 if (warg != warg_buf)
651 const charT*
const arg_ptr = tcase.
arg ? s_arg.c_str () : s_str.c_str ();
652 const String& arg_str = tcase.
arg ? s_arg : s_str;
655 std::size_t
size = tcase.
size >= 0 ? tcase.
size : s_arg.max_size () + 1;
657#ifndef _RWSTD_NO_EXCEPTIONS
660 const char* expected = 0;
662 expected = exceptions [2];
676 switch (
func.which_) {
679 res = s_str.find_last_not_of (arg_ptr);
683 res = s_str.find_last_not_of (arg_str);
687 res = s_str.find_last_not_of (arg_ptr, tcase.
off);
691 res = s_str.find_last_not_of (arg_ptr, tcase.
off,
size);
695 res = s_str.find_last_not_of (arg_str, tcase.
off);
699 res = s_str.find_last_not_of (arg_val);
703 res = s_str.find_last_not_of (arg_val, tcase.
off);
707 RW_ASSERT (
"test logic error: unknown find_last_not_of overload");
711 const std::size_t exp_res =
716 "line %d. %{$FUNCALL} == %{?}%zu%{;}%{?}npos%{;}, "
717 "got %{?}%zu%{;}%{?}npos%{;}",
719 String::npos !=
res,
res, String::npos ==
res);
722#ifndef _RWSTD_NO_EXCEPTIONS
724 catch (
const std::length_error &ex) {
727 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
728 "unexpectedly%{;} caught std::%s(%#s)",
729 __LINE__, 0 != expected, expected,
caught, ex.what ());
734 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
735 "unexpectedly%{;} caught std::%s(%#s)",
736 __LINE__, 0 != expected, expected,
caught, ex.what ());
741 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
742 "unexpectedly%{;} caught %s",
743 __LINE__, 0 != expected, expected,
caught);
754 else if (-1 != tcase.
bthrow) {
756 "line %d. %{$FUNCALL} %{?}expected %s, caught %s"
757 "%{:}unexpectedly caught %s%{;}",
766int main (
int argc,
char** argv)
773 FindLastNotOf (sig), sig ## _test_cases, \
774 sizeof sig ## _test_cases / sizeof *sig ## _test_cases \
780 TEST (cptr_size_size),
786 const std::size_t test_count =
sizeof tests /
sizeof *tests;
789 "lib.string.find.last.not.of",
void test_find_last_not_of(charT, Traits *, Allocator *, const StringFunc &func, const StringTestCase &tcase)
#define TEST(str, arg, res)
#define FindLastNotOf(sig)
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