40#define FindFirstNotOf(sig) StringIds::find_first_not_of_ ## sig
42static const char*
const exceptions[] = {
43 "unknown exception",
"out_of_range",
"length_error",
44 "bad_alloc",
"exception"
55#define TEST(str, arg, res) \
56 { __LINE__, -1, -1, -1, -1, -1, \
57 str, sizeof str - 1, arg, \
58 sizeof arg - 1, 0, res, 0 \
77 TEST (
"bbcdefghij",
"a", 0),
78 TEST (
"abcdefghij",
"a", 1),
79 TEST (
"abcdefghij",
"f", 0),
81 TEST (
"eaccbbhjig",
"cba", 0),
82 TEST (
"ceabcbahca",
"cba", 1),
83 TEST (
"bacbahjicg",
"cba", 5),
85 TEST (
"bcbedfbjih",
"abce", 4),
86 TEST (
"bcaedfajih",
"aabced", 5),
87 TEST (
"bcedfaacdh",
"abcdef", 9),
89 TEST (
"e\0cb\0\0g",
"b\0\0g", 0),
90 TEST (
"e\0cb\0\0g",
"cbe", 1),
91 TEST (
"\0cb\0\0ge",
"\0\0ge", 0),
92 TEST (
"bcbc\0\0be",
"b\0c", 1),
93 TEST (
"gbg\0\0e\0",
"bg", 3),
94 TEST (
"a\0b",
"e\0gbg\0\0", 0),
95 TEST (
"b\0a",
"eb\0gg\0\0", 1),
96 TEST (
"ab\0",
"ab\0gg\0\0", 2),
98 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa",
NPOS),
99 TEST (
"aaaaabaaaa",
"cccccccccb", 0),
100 TEST (
"aabaabaaaa",
"aaaaaaaaab",
NPOS),
102 TEST (
"aab",
"aaaaaaaaaa", 2),
104 TEST (
"x@4096",
"", 0),
105 TEST (
"x@4096",
"a", 0),
108 TEST (
"abc",
"x@4096", 0),
109 TEST (
"xabc",
"x@4096", 1),
112 TEST (
"\0cb\0\0ge", 0, 0),
115 TEST (
"last test",
"test", 0)
123cstr_test_cases [] = {
126#define TEST(str, arg, res) \
127 { __LINE__, -1, -1, -1, -1, -1, \
128 str, sizeof str - 1, arg, \
129 sizeof arg - 1, 0, res, 0 \
149 TEST (
"bbcdefghij",
"a", 0),
150 TEST (
"abcdefghij",
"a", 1),
151 TEST (
"abcdefghij",
"f", 0),
153 TEST (
"eaccbbhjig",
"cba", 0),
154 TEST (
"ceabcbahca",
"cba", 1),
155 TEST (
"bacbahjicg",
"cba", 5),
157 TEST (
"bcbedfbjih",
"abce", 4),
158 TEST (
"bcaedfajih",
"aabced", 5),
159 TEST (
"bcedfaacdh",
"abcdef", 9),
161 TEST (
"e\0cb\0\0g",
"b\0\0g", 0),
162 TEST (
"\0cb\0\0ge",
"b\0\0g", 1),
163 TEST (
"\0gb\0\0ge",
"b\0\0g", 6),
164 TEST (
"e\0cb\0\0g",
"cbe", 1),
165 TEST (
"\0cb\0\0ge",
"\0\0ge", 1),
167 TEST (
"gbg\0\0e\0",
"bg", 3),
168 TEST (
"a\0b",
"e\0gbg\0\0", 0),
169 TEST (
"b\0a",
"eb\0gg\0\0", 2),
172 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa",
NPOS),
173 TEST (
"aaaaabaaaa",
"cccccccccb", 0),
174 TEST (
"aabaabaaaa",
"aaaaaaaaab",
NPOS),
176 TEST (
"aab",
"aaaaaaaaaa", 2),
178 TEST (
"x@4096",
"", 0),
179 TEST (
"x@4096",
"a", 0),
182 TEST (
"abc",
"x@4096", 0),
183 TEST (
"xabc",
"x@4096", 1),
189 TEST (
"last test",
"test", 0)
197cptr_size_test_cases [] = {
200#define TEST(str, arg, off, res) \
201 { __LINE__, off, -1, -1, -1, -1, \
202 str, sizeof str - 1, arg, \
203 sizeof arg - 1, 0, res, 0 \
213 TEST (
"ab",
"c", 0, 0),
219 TEST (
"\0",
"", 0, 0),
220 TEST (
"\0",
"\0", 0, 0),
222 TEST (
"\0",
"a", 0, 0),
224 TEST (
"bbcdefghij",
"a", 0, 0),
225 TEST (
"abcdefghij",
"a", 0, 1),
227 TEST (
"bcaaafaaaa",
"a", 2, 5),
230 TEST (
"cbbedfhjig",
"cba", 0, 3),
231 TEST (
"edfcbahjig",
"cba", 4, 6),
232 TEST (
"edfcbaaabc",
"cba", 6,
NPOS),
233 TEST (
"edfcbahcba",
"cba", 9,
NPOS),
234 TEST (
"cbacbabjig",
"cbaig", 0, 7),
235 TEST (
"bcaedfajih",
"aabced", 0, 5),
236 TEST (
"bcedfaacdh",
"abcdef", 3, 9),
238 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 0),
239 TEST (
"\0cbe\0\0g",
"b\0\0g", 4, 4),
240 TEST (
"e\0cb\0\0g",
"cbe", 0, 1),
241 TEST (
"\0cb\0\0ge",
"\0\0ge", 0, 0),
242 TEST (
"\0cb\0\0ge",
"cb\0", 6, 6),
243 TEST (
"e\0gbg\0\0",
"bg", 2, 5),
244 TEST (
"a\0b",
"a\0gbg\0\0", 0, 1),
245 TEST (
"ab\0",
"ab\0gg\0\0", 1, 2),
246 TEST (
"a\0b",
"e\0gg\0\0a", 3,
NPOS),
248 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0,
NPOS),
249 TEST (
"aaabaaaaaa",
"aaaaaaaaaa", 4,
NPOS),
250 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 1, 5),
251 TEST (
"aabaabaaaa",
"aaaaaaaaaa", 0, 2),
252 TEST (
"aabaabaaaa",
"aaaaaaaaaa", 3, 5),
253 TEST (
"aabaabaaaa",
"aaaaaaaaab", 0,
NPOS),
254 TEST (
"cbb",
"aaaaaaaaba", 2,
NPOS),
255 TEST (
"bac",
"aaaaaaaaba", 0, 2),
256 TEST (
"baa",
"aaaaaaaaaa", 0, 0),
258 TEST (
"x@4096",
"", 0, 0),
259 TEST (
"x@4096",
"a", 0, 0),
263 TEST (
"abc",
"x@4096", 2, 2),
264 TEST (
"xxxxxxxxxx",
"x@4096", 0,
NPOS),
268 TEST (
"x@2048axxx",
"x", 1, 2048),
272 TEST (
"\0cb\0\0ge", 0, 5, 5),
277 TEST (
"abcdefghij",
"abc", 10,
NPOS),
278 TEST (
"abcdefghij",
"cba", 10,
NPOS),
280 TEST (
"last test",
"test", 0, 0)
288cptr_size_size_test_cases [] = {
291#define TEST(str, arg, off, size, res, bthrow) \
292 { __LINE__, off, size, -1, -1, -1, \
293 str, sizeof str - 1, arg, \
294 sizeof arg - 1, 0, res, bthrow \
308 TEST (
"ab",
"c", 0, 1, 0, 0),
316 TEST (
"\0",
"", 0, 0, 0, 0),
319 TEST (
"\0\0",
"\0\0", 1, 1,
NPOS, 0),
320 TEST (
"\0",
"a", 0, 1, 0, 0),
321 TEST (
"a",
"\0", 0, 1, 0, 0),
323 TEST (
"cbbedfhjig",
"cba", 0, 3, 3, 0),
324 TEST (
"edfcbbhjig",
"bac", 0, 2, 0, 0),
325 TEST (
"edfcbahaib",
"cba", 7, 3, 8, 0),
326 TEST (
"edfcbahbcb",
"cba", 7, 2,
NPOS, 0),
327 TEST (
"edfcbahbcb",
"cba", 3, 2, 5, 0),
328 TEST (
"edfcbahcba",
"bac", 3, 3, 6, 0),
329 TEST (
"edacbehcba",
"abc", 2, 2, 3, 0),
330 TEST (
"babcbahcba",
"cba", 0, 3, 6, 0),
331 TEST (
"hjigcbacba",
"cba", 4, 3,
NPOS, 0),
332 TEST (
"cbacbcccbc",
"cba", 5, 1, 8, 0),
334 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 4, 0, 0),
335 TEST (
"e\0cb\0\0g",
"b\0\0g", 4, 4,
NPOS, 0),
336 TEST (
"e\0cb\0\0g",
"b\0\0g", 4, 1, 4, 0),
337 TEST (
"e\0cb\0\0g",
"b\0\0g", 4, 2, 6, 0),
338 TEST (
"\0b\0\0gb\0",
"bg\0", 2, 2, 2, 0),
339 TEST (
"\0b\0\0gb\0",
"bg\0", 0, 2, 0, 0),
340 TEST (
"\0b\0\0gb\0",
"bg\0", 0, 3,
NPOS, 0),
341 TEST (
"e\0cb\0\0g",
"a\0e", 0, 3, 2, 0),
342 TEST (
"\0cb\0\0ge",
"\0\0ge", 7, 4,
NPOS, 0),
343 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 0, 6, 0),
344 TEST (
"a\0b",
"e\0gbg\0\0", 0, 1, 0, 0),
345 TEST (
"a\0b",
"ab\0gg\0\0", 1, 2, 1, 0),
346 TEST (
"a\0b",
"\0ba\0\0fe", 1, 2,
NPOS, 0),
347 TEST (
"a\0b",
"e\0gg\0\0a", 3, 6,
NPOS, 0),
348 TEST (
"a\0b",
"e\0gg\0\0a", 0, 7, 2, 0),
349 TEST (
"\0baa",
"b\0g\0\0ac", 0, 4, 2, 0),
351 TEST (
"e\0a\0",
"e\0a\0\0", 0, 4,
NPOS, 0),
352 TEST (
"\0\0ea",
"b\0c\0\0", 0, 5, 2, 0),
353 TEST (
"ee\0b\0",
"e\0a\0b", 1, 4, 3, 0),
354 TEST (
"be\0a\0",
"\0acefdg", 1, 5,
NPOS, 0),
356 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 10,
NPOS, 0),
357 TEST (
"baaaaaaaaa",
"aaaaaaaaaa", 1, 10,
NPOS, 0),
358 TEST (
"aaaaabaaaa",
"cccccccccc", 0, 10, 0, 0),
359 TEST (
"aaaaabaaaa",
"aaaaaccbcc", 1, 4, 5, 0),
360 TEST (
"aaaabaaaaa",
"cccca", 0, 5, 4, 0),
361 TEST (
"aabaabadca",
"acaaacccab", 0, 5, 2, 0),
362 TEST (
"abcdefghij",
"jihgfedcba", 0, 10,
NPOS, 0),
363 TEST (
"abcdefghij",
"jihgfedcba", 0, 9, 0, 0),
364 TEST (
"bbb",
"aaaaaaaaba", 2, 2, 2, 0),
365 TEST (
"bbb",
"aaaaaaaaba", 0, 9,
NPOS, 0),
366 TEST (
"bab",
"baaaaaaaaa", 0, 0, 0, 0),
367 TEST (
"bab",
"ccccccccba", 1, 10,
NPOS, 0),
369 TEST (
"x@4096",
"", 0, 0, 0, 0),
370 TEST (
"x@4096",
"a", 0, 1, 0, 0),
371 TEST (
"x@4096",
"x", 0, 1,
NPOS, 0),
372 TEST (
"x@4096",
"xxx", 10, 3,
NPOS, 0),
373 TEST (
"x@4096",
"axx", 10, 1, 10, 0),
374 TEST (
"x@4096",
"xxa", 10, 0, 10, 0),
375 TEST (
"x@4096",
"xxa", 10, 1,
NPOS, 0),
376 TEST (
"abc",
"x@4096", 2, 10, 2, 0),
377 TEST (
"xxxxxxxxxx",
"x@4096", 0, 4096,
NPOS, 0),
378 TEST (
"xxxxxxxxxx",
"x@4096", 2, 4,
NPOS, 0),
379 TEST (
"xxxxxxxxxa",
"x@4096", 0, 4, 9, 0),
381 TEST (
"x@4096",
"xxx", 4094, 3,
NPOS, 0),
382 TEST (
"x@4096",
"xxx", 4093, 0, 4093, 0),
384 TEST (
"abcdefghij", 0, 0, 10,
NPOS, 0),
385 TEST (
"abcdefghij", 0, 1, 9, 9, 0),
386 TEST (
"abcdefghij", 0, 0, 8, 8, 0),
387 TEST (
"\0cb\0\0ge", 0, 5, 7,
NPOS, 0),
388 TEST (
"\0cb\0\0ge", 0, 5, 5, 5, 0),
389 TEST (
"\0cb\0\0cb", 0, 3, 5,
NPOS, 0),
390 TEST (
"\0cb\0ge\0", 0, 6, 1,
NPOS, 0),
391 TEST (
"x@4096", 0, 0, 4096,
NPOS, 0),
392 TEST (
"x@4096", 0, 4096, 4096,
NPOS, 0),
393 TEST (
"x@4096", 0, 4095, 1,
NPOS, 0),
396 TEST (
"abcdefghij",
"abc", 10, 3,
NPOS, 0),
397 TEST (
"abcdefghij",
"cba", 10, 1,
NPOS, 0),
401 TEST (
"last test",
"test", 0, 4, 0, 0)
409cstr_size_test_cases [] = {
412#define TEST(str, arg, off, res) \
413 { __LINE__, off, -1, -1, -1, -1, \
414 str, sizeof str - 1, arg, \
415 sizeof arg - 1, 0, res, 0 \
425 TEST (
"ab",
"c", 0, 0),
431 TEST (
"\0",
"", 0, 0),
435 TEST (
"\0",
"a", 0, 0),
437 TEST (
"bbcdefghij",
"a", 0, 0),
438 TEST (
"abcdefghij",
"a", 0, 1),
440 TEST (
"bcaaafaaaa",
"a", 2, 5),
443 TEST (
"cbbedfhjig",
"cba", 0, 3),
444 TEST (
"edfcbahjig",
"cba", 4, 6),
445 TEST (
"edfcbaaabc",
"cba", 6,
NPOS),
446 TEST (
"edfcbahcba",
"cba", 9,
NPOS),
447 TEST (
"cbacbabjig",
"cbaig", 0, 7),
448 TEST (
"bcaedfajih",
"aabced", 0, 5),
449 TEST (
"bcedfaacdh",
"abcdef", 3, 9),
451 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 0),
452 TEST (
"\0cbe\0\0g",
"b\0\0g", 4,
NPOS),
453 TEST (
"e\0cb\0\0g",
"cbe", 0, 1),
454 TEST (
"\0ge\0\0cb",
"\0\0ge", 0, 5),
455 TEST (
"\0cb\0\0ge",
"cb\0", 6, 6),
456 TEST (
"\0cb\0\0ce",
"cb\0", 0, 6),
457 TEST (
"e\0gbg\0\0",
"bg", 2, 5),
458 TEST (
"a\0c",
"a\0gbg\0\0", 0, 2),
459 TEST (
"a\0b",
"a\0gbg\0\0", 0,
NPOS),
460 TEST (
"ab\0",
"ab\0gg\0\0", 1,
NPOS),
461 TEST (
"a\0b",
"e\0gg\0\0a", 3,
NPOS),
463 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0,
NPOS),
464 TEST (
"aaabaaaaaa",
"aaaaaaaaaa", 4,
NPOS),
465 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 1, 5),
466 TEST (
"aabaabaaaa",
"aaaaaaaaaa", 0, 2),
467 TEST (
"aabaabaaaa",
"aaaaaaaaaa", 3, 5),
468 TEST (
"aabaabaaaa",
"aaaaaaaaab", 0,
NPOS),
469 TEST (
"cbb",
"aaaaaaaaba", 2,
NPOS),
470 TEST (
"bac",
"aaaaaaaaba", 0, 2),
471 TEST (
"baa",
"aaaaaaaaaa", 0, 0),
473 TEST (
"x@4096",
"", 0, 0),
474 TEST (
"x@4096",
"a", 0, 0),
478 TEST (
"abc",
"x@4096", 2, 2),
479 TEST (
"xxxxxxxxxx",
"x@4096", 0,
NPOS),
483 TEST (
"x@2048axxx",
"xxx", 10, 2048),
492 TEST (
"abcdefghij",
"abc", 10,
NPOS),
493 TEST (
"abcdefghij",
"cba", 10,
NPOS),
495 TEST (
"last test",
"test", 0, 0)
506#define TEST(str, val, res) \
507 { __LINE__, -1, -1, -1, -1, \
508 val, str, sizeof str - 1, \
526 TEST (
"a\0",
'a', 1),
528 TEST (
"e\0cb\0\0g",
'\0', 0),
529 TEST (
"\0ecb\0\0g",
'\0', 1),
530 TEST (
"bbb\0cb\0e",
'b', 3),
531 TEST (
"\0ecb\0\0g",
'a', 0),
532 TEST (
"\0cbge\0\0",
'\0', 1),
535 TEST (
"x@4096",
'\0', 0),
536 TEST (
"x@4096",
'a', 0),
538 TEST (
"last test",
't', 0)
546val_size_test_cases [] = {
549#define TEST(str, val, off, res) \
550 { __LINE__, off, -1, -1, -1, \
551 val, str, sizeof str - 1, \
562 TEST (
"ab",
'c', 0, 0),
568 TEST (
"\0",
'a', 0, 0),
571 TEST (
"\0\0",
'a', 1, 1),
574 TEST (
"e\0cb\0\0g",
'\0', 1, 2),
575 TEST (
"ecb\0\0\0g",
'\0', 3, 6),
577 TEST (
"eb\0\0\0cg",
'b', 1, 2),
579 TEST (
"e\0cb\0\0g",
'a', 0, 0),
580 TEST (
"\0cbge\0\0",
'\0', 0, 1),
581 TEST (
"\0\0\0cbge",
'\0', 0, 3),
586 TEST (
"x@4096",
'\0', 0, 0),
587 TEST (
"x@4096",
'a', 3, 3),
590 TEST (
"x@2048axxx",
'x', 1, 2048),
592 TEST (
"last test",
't', 0, 0)
597template <
class charT,
class Traits,
class Allocator>
602 typedef std::basic_string <charT, Traits, Allocator>
String;
604 static const std::size_t BUFSIZE = 256;
606 static charT wstr_buf [BUFSIZE];
607 static charT warg_buf [BUFSIZE];
609 std::size_t str_len =
sizeof wstr_buf /
sizeof *wstr_buf;
610 std::size_t arg_len =
sizeof warg_buf /
sizeof *warg_buf;
616 const String s_str (wstr, str_len);
617 const String s_arg (warg, arg_len);
619 if (wstr != wstr_buf)
622 if (warg != warg_buf)
633 const charT*
const arg_ptr = tcase.
arg ? s_arg.c_str () : s_str.c_str ();
634 const String& arg_str = tcase.
arg ? s_arg : s_str;
637 std::size_t
size = tcase.
size >= 0 ? tcase.
size : s_arg.max_size () + 1;
639#ifndef _RWSTD_NO_EXCEPTIONS
642 const char* expected = 0;
644 expected = exceptions [2];
659 switch (
func.which_) {
661 res = s_str.find_first_not_of (arg_ptr);
665 res = s_str.find_first_not_of (arg_str);
669 res = s_str.find_first_not_of (arg_ptr, tcase.
off);
673 res = s_str.find_first_not_of (arg_ptr, tcase.
off,
size);
677 res = s_str.find_first_not_of (arg_str, tcase.
off);
681 res = s_str.find_first_not_of (arg_val);
685 res = s_str.find_first_not_of (arg_val, tcase.
off);
689 RW_ASSERT (!
"logic error: unknown find_first_not_of overload");
693 const std::size_t exp_res =
698 "line %d. %{$FUNCALL} == %{?}%zu%{;}%{?}npos%{;}, "
699 "got %{?}%zu%{;}%{?}npos%{;}",
701 String::npos !=
res,
res, String::npos ==
res);
704#ifndef _RWSTD_NO_EXCEPTIONS
706 catch (
const std::length_error &ex) {
709 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
710 "unexpectedly%{;} caught std::%s(%#s)",
711 __LINE__, 0 != expected, expected,
caught, ex.what ());
716 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
717 "unexpectedly%{;} caught std::%s(%#s)",
718 __LINE__, 0 != expected, expected,
caught, ex.what ());
723 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
724 "unexpectedly%{;} caught %s",
725 __LINE__, 0 != expected, expected,
caught);
736 else if (-1 != tcase.
bthrow) {
738 "line %d. %{$FUNCALL} %{?}expected %s, caught %s"
739 "%{:}unexpectedly caught %s%{;}",
748int main (
int argc,
char** argv)
755 FindFirstNotOf (sig), sig ## _test_cases, \
756 sizeof sig ## _test_cases / sizeof *sig ## _test_cases \
762 TEST (cptr_size_size),
768 const std::size_t test_count =
sizeof tests /
sizeof *tests;
771 "lib.string.find.first.not.of",
#define TEST(str, arg, res)
#define FindFirstNotOf(sig)
void test_find_first_not_of(charT, Traits *, Allocator *, const StringFunc &func, const StringTestCase &tcase)
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