42#define FindFirstOf(sig) StringIds::find_first_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 \
80 TEST (
"abcdefghij",
"a", 0),
81 TEST (
"abcdefghij",
"f", 5),
82 TEST (
"abcdefghij",
"j", 9),
84 TEST (
"edfcbbhjig",
"cba", 3),
85 TEST (
"ecdfcbahca",
"cba", 1),
86 TEST (
"bacbahjicg",
"cba", 0),
89 TEST (
"e\0cb\0\0g",
"b\0\0g", 3),
90 TEST (
"e\0cb\0\0g",
"cbe", 0),
92 TEST (
"\0cb\0\0be",
"b\0c", 2),
93 TEST (
"e\0gbg\0\0",
"bg", 2),
94 TEST (
"e\0dg\0\0a",
"cba", 6),
96 TEST (
"a\0b",
"eb\0gg\0\0", 2),
100 TEST (
"bcaedfajih",
"a", 2),
101 TEST (
"bcedfaajih",
"a", 5),
102 TEST (
"bcaaedfaji",
"a", 2),
104 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0),
105 TEST (
"aaaaabaaaa",
"cccccccccb", 5),
106 TEST (
"aabaabaaaa",
"cccccccccb", 2),
107 TEST (
"bbb",
"aaaaaaaaba", 0),
112 TEST (
"x@4096",
"x", 0),
113 TEST (
"x@4096",
"axa", 0),
115 TEST (
"axbc",
"x@4096", 1),
116 TEST (
"x@2048axxx",
"y@4096a", 2048),
118 TEST (
"abcdefghij", 0, 0),
120 TEST (
"x@4096", 0, 0),
122 TEST (
"last test",
"test", 2)
130cstr_test_cases [] = {
133#define TEST(str, arg, res) \
134 { __LINE__, -1, -1, -1, -1, -1, \
135 str, sizeof str - 1, arg, \
136 sizeof arg - 1, 0, res, 0 \
152 TEST (
"\0",
"\0", 0),
156 TEST (
"abcdefghij",
"a", 0),
157 TEST (
"abcdefghij",
"f", 5),
158 TEST (
"abcdefghij",
"j", 9),
160 TEST (
"edfcbbhjig",
"cba", 3),
161 TEST (
"ecdfcbahca",
"cba", 1),
162 TEST (
"bacbahjicg",
"cba", 0),
166 TEST (
"e\0cb\0\0g",
"b\0\0g", 1),
167 TEST (
"e\0cb\0\0g",
"cbe", 0),
168 TEST (
"\0cb\0\0ge",
"\0\0ge", 0),
169 TEST (
"\0cb\0\0be",
"b\0c", 0),
170 TEST (
"\0cb\0\0be",
"bc", 1),
171 TEST (
"\0ab\0\0be",
"bc", 2),
172 TEST (
"e\0gbg\0\0",
"bg", 2),
173 TEST (
"e\0dg\0\0a",
"cba", 6),
174 TEST (
"a\0b",
"e\0gbg\0\0", 1),
175 TEST (
"a\0b",
"eb\0gg\0\0", 1),
176 TEST (
"a\0b",
"e\0gg\0\0a", 0),
179 TEST (
"bcaedfajih",
"a", 2),
180 TEST (
"bcedfaajih",
"a", 5),
181 TEST (
"bcaaedfaji",
"a", 2),
183 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0),
184 TEST (
"aaaaabaaaa",
"cccccccccb", 5),
185 TEST (
"aabaabaaaa",
"cccccccccb", 2),
186 TEST (
"bbb",
"aaaaaaaaba", 0),
191 TEST (
"x@4096",
"x", 0),
192 TEST (
"x@4096",
"axa", 0),
194 TEST (
"axbc",
"x@4096", 1),
195 TEST (
"x@2048axxx",
"y@4096a", 2048),
197 TEST (
"abcdefghij", 0, 0),
198 TEST (
"\0cb\0\0ge", 0, 0),
199 TEST (
"x@4096", 0, 0),
201 TEST (
"last test",
"test", 2)
209cptr_size_test_cases [] = {
212#define TEST(str, arg, off, res) \
213 { __LINE__, off, -1, -1, -1, -1, \
214 str, sizeof str - 1, arg, \
215 sizeof arg - 1, 0, res, 0 \
225 TEST (
"ab",
"a", 0, 0),
237 TEST (
"abcdefghij",
"a", 0, 0),
239 TEST (
"abcdefghij",
"f", 2, 5),
241 TEST (
"abcdefghij",
"j", 9, 9),
243 TEST (
"edfcbbhjig",
"cba", 0, 3),
244 TEST (
"edfcbahjig",
"cba", 4, 4),
245 TEST (
"edfcbahjig",
"cba", 6,
NPOS),
246 TEST (
"edfcbahcba",
"cba", 9, 9),
247 TEST (
"cbacbahjig",
"cba", 7,
NPOS),
249 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 3),
250 TEST (
"e\0cb\0\0g",
"b\0\0g", 4,
NPOS),
251 TEST (
"e\0cb\0\0g",
"cbe", 0, 0),
252 TEST (
"\0cb\0\0ge",
"\0\0ge", 0,
NPOS),
253 TEST (
"\0cb\0\0ge",
"cb\0", 6,
NPOS),
254 TEST (
"e\0gbg\0\0",
"bg", 1, 2),
255 TEST (
"e\0dg\0\0a",
"cba", 0, 6),
256 TEST (
"a\0b",
"e\0gbg\0\0", 0,
NPOS),
257 TEST (
"a\0b",
"eb\0gg\0\0", 1, 2),
258 TEST (
"a\0b",
"e\0gg\0\0a", 3,
NPOS),
261 TEST (
"bcaedfajih",
"a", 1, 2),
262 TEST (
"bcedfaajih",
"a", 6, 6),
263 TEST (
"bcaaedfaji",
"a", 5, 7),
265 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 0),
266 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 4, 4),
267 TEST (
"aaaaabaaaa",
"cccccccccb", 1, 5),
268 TEST (
"aabaabaaaa",
"cccccccccb", 0, 2),
269 TEST (
"aabaabaaaa",
"cccccccccb", 6,
NPOS),
270 TEST (
"bbb",
"aaaaaaaaba", 2, 2),
271 TEST (
"bab",
"aaaaaaaaba", 0, 0),
272 TEST (
"bbb",
"aaaaaaaaaa", 0,
NPOS),
276 TEST (
"x@4096",
"x", 0, 0),
277 TEST (
"x@4096",
"xxx", 10, 10),
278 TEST (
"x@4096",
"axa", 10, 10),
280 TEST (
"xxxxxxxxxx",
"x@4096", 0, 0),
281 TEST (
"x@2048axxx",
"y@4096a", 10, 2048),
283 TEST (
"x@4096",
"xxx", 4093, 4093),
286 TEST (
"abcdefghij", 0, 0, 0),
287 TEST (
"abcdefghij", 0, 1, 1),
289 TEST (
"x@4096", 0, 0, 0),
290 TEST (
"x@4096", 0, 7, 7),
293 TEST (
"abcdefghij",
"abc", 10,
NPOS),
294 TEST (
"abcdefghij",
"cba", 10,
NPOS),
296 TEST (
"last test",
"test", 0, 2)
304cptr_size_size_test_cases [] = {
307#define TEST(str, arg, off, size, res, bthrow) \
308 { __LINE__, off, size, -1, -1, -1, \
309 str, sizeof str - 1, arg, \
310 sizeof arg - 1, 0, res, bthrow \
324 TEST (
"ab",
"a", 0, 1, 0, 0),
333 TEST (
"\0",
"\0", 0, 1, 0, 0),
335 TEST (
"\0\0",
"\0\0", 1, 1, 1, 0),
338 TEST (
"edfcbbhjig",
"cba", 0, 3, 3, 0),
339 TEST (
"edfcbbhjig",
"bac", 0, 2, 4, 0),
340 TEST (
"edfcbahjig",
"cba", 7, 3,
NPOS, 0),
341 TEST (
"ebcfeahjig",
"cba", 3, 2,
NPOS, 0),
342 TEST (
"ebcfeahjig",
"cab", 3, 2, 5, 0),
343 TEST (
"edfcbahcba",
"bac", 6, 3, 7, 0),
344 TEST (
"edfcbehcba",
"abc", 1, 2, 4, 0),
345 TEST (
"edfcbahcba",
"cba", 5, 1, 7, 0),
346 TEST (
"cbacbahjig",
"cba", 6, 3,
NPOS, 0),
347 TEST (
"cbacbahjcg",
"cba", 5, 1, 8, 0),
349 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 4, 1, 0),
350 TEST (
"e\0cb\0\0g",
"b\0\0g", 4, 4, 4, 0),
351 TEST (
"e\0cb\0\0b",
"b\0\0g", 4, 1, 6, 0),
352 TEST (
"\0b\0\0gb\0",
"bg\0", 2, 2, 4, 0),
353 TEST (
"\0b\0\0gb\0",
"bg\0", 0, 2, 1, 0),
354 TEST (
"\0b\0\0gb\0",
"bg\0", 0, 3, 0, 0),
355 TEST (
"e\0cb\0\0g",
"afe", 0, 2,
NPOS, 0),
356 TEST (
"\0cb\0\0ge",
"\0\0ge", 7, 4,
NPOS, 0),
357 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 0,
NPOS, 0),
358 TEST (
"a\0b",
"e\0gbg\0\0", 0, 1,
NPOS, 0),
359 TEST (
"a\0b",
"eb\0gg\0\0", 1, 2, 2, 0),
360 TEST (
"a\0b",
"e\0gg\0\0a", 3, 6,
NPOS, 0),
361 TEST (
"a\0b",
"e\0gg\0\0a", 0, 7, 0, 0),
362 TEST (
"a\0b",
"e\0gg\0\0a", 0, 4, 1, 0),
364 TEST (
"e\0a\0",
"e\0a\0\0", 0, 4, 0, 0),
365 TEST (
"e\0a\0",
"b\0c\0\0", 0, 5, 1, 0),
366 TEST (
"ee\0a\0",
"b\0c\0\0", 1, 4, 2, 0),
367 TEST (
"be\0a\0",
"fdbcb\0a", 1, 5,
NPOS, 0),
369 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 10, 0, 0),
370 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 1, 10, 1, 0),
371 TEST (
"aaaaabaaaa",
"cccccccccc", 0, 10,
NPOS, 0),
372 TEST (
"aaaaabaaaa",
"cccbcccccc", 1, 4, 5, 0),
373 TEST (
"aaaabaaaaa",
"cccca", 0, 5, 0, 0),
374 TEST (
"aabaabaaaa",
"cbccccccca", 0, 5, 2, 0),
375 TEST (
"bbb",
"aaaaaaaaba", 2, 2,
NPOS, 0),
376 TEST (
"bbb",
"aaaaaaaaaa", 0, 9,
NPOS, 0),
377 TEST (
"bab",
"aaaaaaaaba", 0, 0,
NPOS, 0),
378 TEST (
"bab",
"ccccccccba", 1, 10, 1, 0),
381 TEST (
"x@4096",
"a", 0, 1,
NPOS, 0),
382 TEST (
"x@4096",
"x", 0, 1, 0, 0),
383 TEST (
"x@4096",
"xxx", 10, 3, 10, 0),
384 TEST (
"x@4096",
"axx", 10, 1,
NPOS, 0),
385 TEST (
"x@4096",
"xxa", 10, 0,
NPOS, 0),
386 TEST (
"abc",
"x@4096", 2, 10,
NPOS, 0),
387 TEST (
"xxxxxxxxxx",
"x@4096", 0, 4096, 0, 0),
388 TEST (
"xxxxxxxxxx",
"x@4096", 2, 4, 2, 0),
389 TEST (
"x@2048axyx",
"y@4096a", 10, 4097, 2048, 0),
391 TEST (
"x@4096",
"xxx", 4093, 3, 4093, 0),
392 TEST (
"x@4096",
"xxx", 4094, 0,
NPOS, 0),
393 TEST (
"x@4096",
"xxx", 4095, 1, 4095, 0),
395 TEST (
"abcdefghij", 0, 0, 9, 0, 0),
396 TEST (
"abcdefghij", 0, 1, 9, 1, 0),
397 TEST (
"\0cb\0\0ge", 0, 5, 7, 5, 0),
398 TEST (
"\0cb\0\0ge", 0, 5, 5,
NPOS, 0),
399 TEST (
"\0cb\0ge\0", 0, 6, 1, 6, 0),
400 TEST (
"x@4096", 0, 0, 4096, 0, 0),
401 TEST (
"x@4096", 0, 4096, 4096,
NPOS, 0),
402 TEST (
"x@4096", 0, 4095, 1, 4095, 0),
405 TEST (
"abcdefghij",
"abc", 10, 3,
NPOS, 0),
406 TEST (
"abcdefghij",
"cba", 10, 1,
NPOS, 0),
409 TEST (
"abcdefghij",
"cba", 0, -1, 0, 0),
410 TEST (
"x@4096",
"xxx", 0, -1, 0, 0),
411 TEST (
"abcdefghij",
"ax@4096", 0, -1, 0, 0),
413 TEST (
"last test",
"test", 0, 4, 2, 0)
421cstr_size_test_cases [] = {
424#define TEST(str, arg, off, res) \
425 { __LINE__, off, -1, -1, -1, -1, \
426 str, sizeof str - 1, arg, \
427 sizeof arg - 1, 0, res, 0 \
437 TEST (
"ab",
"a", 0, 0),
444 TEST (
"\0",
"\0", 0, 0),
449 TEST (
"abcdefghij",
"a", 0, 0),
451 TEST (
"abcdefghij",
"f", 2, 5),
453 TEST (
"abcdefghij",
"j", 9, 9),
455 TEST (
"edfcbbhjig",
"cba", 0, 3),
456 TEST (
"edfcbahjig",
"cba", 4, 4),
457 TEST (
"edfcbahjig",
"cba", 6,
NPOS),
458 TEST (
"edfcbahcba",
"cba", 9, 9),
459 TEST (
"cbacbahjig",
"cba", 7,
NPOS),
461 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 1),
462 TEST (
"e\0cb\0\0g",
"b\0\0g", 4, 4),
463 TEST (
"e\0cb\0\0g",
"cbe", 0, 0),
464 TEST (
"\0cb\0\0ge",
"\0\0ge", 0, 0),
465 TEST (
"\0cb\0\0ge",
"cb\0", 6,
NPOS),
466 TEST (
"e\0gbg\0\0",
"bg", 1, 2),
467 TEST (
"e\0gbg\0\0",
"\0bg", 5, 5),
468 TEST (
"e\0dg\0\0a",
"cba", 0, 6),
469 TEST (
"a\0b",
"e\0gbg\0\0", 0, 1),
470 TEST (
"a\0b",
"eb\0gg\0\0", 1, 1),
471 TEST (
"a\0b",
"e\0gg\0\0b", 2, 2),
472 TEST (
"a\0b",
"e\0gg\0\0a", 3,
NPOS),
475 TEST (
"bcaedfajih",
"a", 1, 2),
476 TEST (
"bcedfaajih",
"a", 6, 6),
477 TEST (
"bcaaedfaji",
"a", 5, 7),
479 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 0),
480 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 4, 4),
481 TEST (
"aaaaabaaaa",
"cccccccccb", 1, 5),
482 TEST (
"aabaabaaaa",
"cccccccccb", 0, 2),
483 TEST (
"aabaabaaaa",
"cccccccccb", 6,
NPOS),
484 TEST (
"bbb",
"aaaaaaaaba", 2, 2),
485 TEST (
"bab",
"aaaaaaaaba", 0, 0),
486 TEST (
"bbb",
"aaaaaaaaaa", 0,
NPOS),
490 TEST (
"x@4096",
"x", 0, 0),
491 TEST (
"x@4096",
"xxx", 10, 10),
492 TEST (
"x@4096",
"axa", 10, 10),
494 TEST (
"xxxxxxxxxx",
"x@4096", 0, 0),
495 TEST (
"x@2048axxx",
"y@4096a", 10, 2048),
497 TEST (
"x@4096",
"xxx", 4093, 4093),
500 TEST (
"abcdefghij", 0, 0, 0),
501 TEST (
"abcdefghij", 0, 1, 1),
502 TEST (
"\0cb\0\0ge", 0, 5, 5),
503 TEST (
"\0cb\0\0ge", 0, 4, 4),
504 TEST (
"x@4096", 0, 0, 0),
505 TEST (
"x@4096", 0, 7, 7),
508 TEST (
"abcdefghij",
"abc", 10,
NPOS),
509 TEST (
"abcdefghij",
"cba", 10,
NPOS),
511 TEST (
"last test",
"test", 0, 2)
522#define TEST(str, val, res) \
523 { __LINE__, -1, -1, -1, -1, \
524 val, str, sizeof str - 1, \
539 TEST (
"\0",
'\0', 0),
540 TEST (
"\0\0",
'\0', 0),
543 TEST (
"e\0cb\0\0g",
'\0', 1),
544 TEST (
"e\0cb\0\0g",
'b', 3),
546 TEST (
"\0cbge\0\0",
'\0', 0),
547 TEST (
"\0cbge\0\0",
'b', 2),
550 TEST (
"x@4096",
'x', 0),
553 TEST (
"x@2048axxx",
'a', 2048),
555 TEST (
"last test",
't', 3)
563val_size_test_cases [] = {
566#define TEST(str, val, off, res) \
567 { __LINE__, off, -1, -1, -1, \
568 val, str, sizeof str - 1, \
579 TEST (
"ab",
'a', 0, 0),
586 TEST (
"\0\0",
'\0', 1, 1),
590 TEST (
"e\0cb\0\0g",
'\0', 1, 1),
591 TEST (
"e\0cb\0\0g",
'\0', 2, 4),
593 TEST (
"e\0cb\0\0g",
'b', 1, 3),
596 TEST (
"\0cbge\0\0",
'\0', 0, 0),
597 TEST (
"\0cbge\0\0",
'\0', 1, 5),
599 TEST (
"\0cbge\0\0",
'b', 0, 2),
600 TEST (
"\0bgeb\0\0",
'b', 2, 4),
603 TEST (
"x@4096",
'x', 0, 0),
604 TEST (
"x@4096",
'x', 5, 5),
608 TEST (
"x@4096",
'x', 4095, 4095),
609 TEST (
"x@2048axxx",
'a', 10, 2048),
611 TEST (
"last test",
't', 0, 3)
616template <
class charT,
class Traits,
class Allocator>
621 typedef std::basic_string <charT, Traits, Allocator>
String;
623 static const std::size_t BUFSIZE = 256;
625 static charT wstr_buf [BUFSIZE];
626 static charT warg_buf [BUFSIZE];
628 std::size_t str_len =
sizeof wstr_buf /
sizeof *wstr_buf;
629 std::size_t arg_len =
sizeof warg_buf /
sizeof *warg_buf;
635 const String s_str (wstr, str_len);
636 const String s_arg (warg, arg_len);
638 if (wstr != wstr_buf)
641 if (warg != warg_buf)
652 const charT*
const arg_ptr = tcase.
arg ? s_arg.c_str () : s_str.c_str ();
653 const String& arg_str = tcase.
arg ? s_arg : s_str;
656 std::size_t
size = tcase.
size >= 0 ? tcase.
size : s_arg.max_size () + 1;
658#ifndef _RWSTD_NO_EXCEPTIONS
661 const char* expected = 0;
663 expected = exceptions [2];
677 switch (
func.which_) {
680 res = s_str.find_first_of (arg_ptr);
684 res = s_str.find_first_of (arg_str);
688 res = s_str.find_first_of (arg_ptr, tcase.
off);
692 res = s_str.find_first_of (arg_ptr, tcase.
off,
size);
696 res = s_str.find_first_of (arg_str, tcase.
off);
700 res = s_str.find_first_of (arg_val);
704 res = s_str.find_first_of (arg_val, tcase.
off);
708 RW_ASSERT (
"test logic error: unknown find_first_of overload");
712 const std::size_t exp_res =
717 "line %d. %{$FUNCALL} == %{?}%zu%{;}%{?}npos%{;}, "
718 "got %{?}%zu%{;}%{?}npos%{;}",
720 String::npos !=
res,
res, String::npos ==
res);
723#ifndef _RWSTD_NO_EXCEPTIONS
725 catch (
const std::length_error &ex) {
728 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
729 "unexpectedly%{;} caught std::%s(%#s)",
730 __LINE__, 0 != expected, expected,
caught, ex.what ());
735 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
736 "unexpectedly%{;} caught std::%s(%#s)",
737 __LINE__, 0 != expected, expected,
caught, ex.what ());
742 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
743 "unexpectedly%{;} caught %s",
744 __LINE__, 0 != expected, expected,
caught);
755 else if (-1 != tcase.
bthrow) {
757 "line %d. %{$FUNCALL} %{?}expected %s, caught %s"
758 "%{:}unexpectedly caught %s%{;}",
767int main (
int argc,
char** argv)
774 FindFirstOf (sig), sig ## _test_cases, \
775 sizeof sig ## _test_cases / sizeof *sig ## _test_cases \
781 TEST (cptr_size_size),
787 const std::size_t test_count =
sizeof tests /
sizeof *tests;
790 "lib.string.find.first.of",
void test_find_first_of(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