41#define Find(sig) StringIds::find_ ## 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, \
59 arg, sizeof arg - 1, 0, res, 0 \
78 TEST (
"aababcabcd",
"", 0),
79 TEST (
"aababcabcd",
"a", 0),
80 TEST (
"aababcabcd",
"ab", 1),
81 TEST (
"aababcabcd",
"abc", 3),
82 TEST (
"aababcabcd",
"abcd", 6),
86 TEST (
"abcdefghij",
"a", 0),
87 TEST (
"abcdefghij",
"f", 5),
88 TEST (
"abcdefghij",
"j", 9),
91 TEST (
"edfcbahjig",
"cba", 3),
92 TEST (
"edfcbahcba",
"cba", 3),
93 TEST (
"cbacbahjig",
"cba", 0),
94 TEST (
"abcbcbd",
"bcbd", 3),
96 TEST (
"e\0cb\0\0g",
"b\0\0g", 3),
98 TEST (
"\0cb\0\0ge",
"\0\0ge", 0),
99 TEST (
"\0cb\0\0ge",
"cb\0", 1),
100 TEST (
"e\0cbg\0\0",
"bg", 3),
104 TEST (
"bcaedfajih",
"a", 2),
105 TEST (
"bcedfaajih",
"a", 5),
106 TEST (
"bcaaedfaji",
"a", 2),
108 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0),
109 TEST (
"aaaaabaaaa",
"aaaaaaaaaa",
NPOS),
110 TEST (
"aaaabaaaaa",
"aaaaa", 5),
111 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 0),
112 TEST (
"aaaaaaaaa",
"aaaaaaaaaa",
NPOS),
114 TEST (
"x@4096",
"", 0),
116 TEST (
"x@4096",
"x", 0),
117 TEST (
"x@4096",
"xxx", 0),
120 TEST (
"xxxxxxxxxx",
"x@4096",
NPOS),
122 TEST (
"abcdefghij", 0, 0),
123 TEST (
"\0cb\0\0ge", 0, 0),
124 TEST (
"x@4096", 0, 0),
126 TEST (
"last test",
"test", 5)
134cstr_test_cases [] = {
137#define TEST(str, arg, res) { \
138 __LINE__, -1, -1, -1, -1, -1, \
139 str, sizeof str - 1, \
140 arg, sizeof arg - 1, 0, res, 0 \
156 TEST (
"\0",
"\0", 0),
161 TEST (
"aababcabcd",
"", 0),
162 TEST (
"aababcabcd",
"a", 0),
163 TEST (
"aababcabcd",
"ab", 1),
164 TEST (
"aababcabcd",
"abc", 3),
165 TEST (
"aababcabcd",
"abcd", 6),
169 TEST (
"abcdefghij",
"a", 0),
170 TEST (
"abcdefghij",
"f", 5),
171 TEST (
"abcdefghij",
"j", 9),
174 TEST (
"edfcbahjig",
"cba", 3),
175 TEST (
"edfcbahcba",
"cba", 3),
176 TEST (
"cbacbahjig",
"cba", 0),
177 TEST (
"abcbcbd",
"bcbd", 3),
179 TEST (
"e\0cb\0\0g",
"b\0\0g", 3),
181 TEST (
"\0cb\0\0ge",
"\0\0ge", 3),
182 TEST (
"\0cb\0\0ge",
"cb\0", 1),
184 TEST (
"e\0cbg\0\0",
"bg", 3),
185 TEST (
"e\0cbg\0\0",
"\0\0", 5),
190 TEST (
"bcaedfajih",
"a", 2),
191 TEST (
"bcedfaajih",
"a", 5),
192 TEST (
"bcaaedfaji",
"a", 2),
194 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0),
195 TEST (
"aaaaabaaaa",
"aaaaaaaaaa",
NPOS),
196 TEST (
"aaaabaaaaa",
"aaaaa", 5),
197 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 0),
198 TEST (
"aaaaaaaaa",
"aaaaaaaaaa",
NPOS),
200 TEST (
"x@4096",
"", 0),
202 TEST (
"x@4096",
"x", 0),
203 TEST (
"x@4096",
"xxx", 0),
206 TEST (
"xxxxxxxxxx",
"x@4096",
NPOS),
208 TEST (
"abcdefghij", 0, 0),
209 TEST (
"\0cb\0\0ge", 0, 0),
210 TEST (
"x@4096", 0, 0),
212 TEST (
"last test",
"test", 5)
220cptr_size_test_cases [] = {
223#define TEST(str, arg, off, res) { \
224 __LINE__, off, -1, -1, -1, -1, \
225 str, sizeof str - 1, \
226 arg, sizeof arg - 1, 0, res, 0 \
236 TEST (
"ab",
"a", 0, 0),
239 TEST (
"",
"\0", 0, 0),
242 TEST (
"\0",
"", 0, 0),
243 TEST (
"\0",
"\0", 0, 0),
244 TEST (
"\0",
"\0", 1, 1),
247 TEST (
"aababcabcd",
"", 0, 0),
248 TEST (
"aababcabcd",
"a", 0, 0),
249 TEST (
"aababcabcd",
"ab", 0, 1),
250 TEST (
"aababcabcd",
"abc", 0, 3),
251 TEST (
"aababcabcd",
"abcd", 0, 6),
252 TEST (
"aababcabcd",
"abcde", 0,
NPOS),
255 TEST (
"abcdefghij",
"a", 0, 0),
257 TEST (
"abcdefghij",
"f", 2, 5),
259 TEST (
"abcdefghij",
"j", 9, 9),
261 TEST (
"edfcbbhjig",
"cba", 0,
NPOS),
262 TEST (
"edfcbahjig",
"cba", 1, 3),
263 TEST (
"edfcbahjig",
"cba", 4,
NPOS),
264 TEST (
"edfcbahcba",
"cba", 1, 3),
265 TEST (
"edfcbahcba",
"cba", 5, 7),
266 TEST (
"cbacbahjig",
"cba", 5,
NPOS),
267 TEST (
"abcbcbd",
"bcbd", 0, 3),
269 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 3),
270 TEST (
"e\0cb\0\0g",
"b\0\0g", 4,
NPOS),
271 TEST (
"e\0cb\0\0g",
"ecb", 0,
NPOS),
272 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 6),
273 TEST (
"\0cb\0\0ge",
"cb\0", 1, 1),
274 TEST (
"e\0cbg\0\0",
"bg", 1, 3),
275 TEST (
"e\0cbg\0\0",
"cba", 0,
NPOS),
278 TEST (
"bcaedfajih",
"a", 1, 2),
279 TEST (
"bcedfaajih",
"a", 6, 6),
280 TEST (
"bcaaedfaji",
"a", 5, 7),
282 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 0),
283 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 1,
NPOS),
284 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 0,
NPOS),
285 TEST (
"aaaabaaaaa",
"aaaaa", 0, 5),
286 TEST (
"aaaabaaaaa",
"aaaaa", 6,
NPOS),
287 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 0, 0),
288 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 1, 1),
289 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 2,
NPOS),
290 TEST (
"aaaaaaaaa",
"aaaaaaaaaa", 0,
NPOS),
292 TEST (
"x@4096",
"", 0, 0),
294 TEST (
"x@4096",
"x", 0, 0),
295 TEST (
"x@4096",
"xxx", 10, 10),
298 TEST (
"xxxxxxxxxx",
"x@4096", 0,
NPOS),
300 TEST (
"x@4096",
"xxx", 4092, 4092),
303 TEST (
"abcdefghij", 0, 0, 0),
305 TEST (
"\0cb\0\0ge", 0, 5, 5),
306 TEST (
"x@4096", 0, 0, 0),
310 TEST (
"abcdefghij",
"abc", 10,
NPOS),
311 TEST (
"abcdefghij",
"cba", 10,
NPOS),
313 TEST (
"last test",
"test", 0, 5)
321cptr_size_size_test_cases [] = {
324#define TEST(str, arg, off, size, res) { \
325 __LINE__, off, size, -1, -1, -1, \
326 str, sizeof str - 1, \
327 arg, sizeof arg - 1, 0, res, 0 \
341 TEST (
"ab",
"a", 0, 1, 0),
343 TEST (
"",
"", 0, 0, 0),
344 TEST (
"",
"\0", 0, 0, 0),
346 TEST (
"",
"a", 0, 0, 0),
349 TEST (
"aababcabcd",
"", 0, 0, 0),
350 TEST (
"aababcabcd",
"a", 0, 1, 0),
351 TEST (
"aababcabcd",
"ab", 0, 2, 1),
352 TEST (
"aababcabcd",
"abc", 0, 3, 3),
353 TEST (
"aababcabcd",
"abcd", 0, 4, 6),
354 TEST (
"aababcabcd",
"abcde", 0, 5,
NPOS),
355 TEST (
"aababcabcd",
"aababcabcde", 0, 11,
NPOS),
357 TEST (
"\0",
"", 0, 0, 0),
358 TEST (
"\0",
"\0", 0, 1, 0),
360 TEST (
"\0\0",
"\0\0", 1, 1, 1),
363 TEST (
"edfcbbhjig",
"cba", 0, 3,
NPOS),
364 TEST (
"edfcbbhjig",
"cba", 0, 2, 3),
365 TEST (
"edfcbahjig",
"cba", 1, 3, 3),
366 TEST (
"edfcbahjig",
"cba", 4, 3,
NPOS),
367 TEST (
"edfcbahjig",
"cba", 4, 1,
NPOS),
368 TEST (
"edfcbahcba",
"cba", 1, 3, 3),
369 TEST (
"edfcbehcba",
"cba", 1, 2, 3),
370 TEST (
"edfcbahcba",
"cba", 5, 3, 7),
371 TEST (
"cbacbahjig",
"cba", 5, 3,
NPOS),
372 TEST (
"cbacbahjcg",
"cba", 5, 1, 8),
373 TEST (
"abcbcbd",
"bcbd", 0, 4, 3),
375 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 4, 3),
376 TEST (
"e\0cb\0\0g",
"b\0\0g", 4, 4,
NPOS),
377 TEST (
"e\0cb\0\0b",
"b\0\0g", 4, 1, 6),
378 TEST (
"\0b\0\0gb\0",
"b\0\0g", 2, 2, 5),
379 TEST (
"\0b\0\0gb\0",
"b\0\0g", 0, 2, 1),
380 TEST (
"\0b\0\0gb\0",
"b\0\0g", 0, 3, 1),
381 TEST (
"e\0cb\0\0g",
"ecb", 0, 2,
NPOS),
382 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 4,
NPOS),
383 TEST (
"\0cb\0\0ge",
"\0\0ge", 6, 0, 6),
384 TEST (
"\0cb\0\0ge",
"cb\0", 1, 3, 1),
385 TEST (
"e\0cbg\0\0",
"bg", 1, 2, 3),
386 TEST (
"e\0cbg\0\0",
"cba", 0, 3,
NPOS),
387 TEST (
"e\0cbg\0\0",
"cba", 0, 2, 2),
389 TEST (
"e\0a\0",
"e\0a\0\0", 0, 4, 0),
390 TEST (
"e\0a\0",
"e\0a\0\0", 0, 5,
NPOS),
391 TEST (
"ee\0a\0",
"e\0a\0\0", 1, 4, 1),
392 TEST (
"ee\0a\0",
"e\0a\0\0", 1, 5,
NPOS),
394 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 10, 0),
395 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 1, 10,
NPOS),
396 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 1, 9, 1),
397 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 0, 10,
NPOS),
398 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 1, 4, 1),
399 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 2, 4, 6),
400 TEST (
"aaaabaaaaa",
"aaaaa", 0, 5, 5),
401 TEST (
"aaaabaaaaa",
"aaaaa", 0, 4, 0),
402 TEST (
"aaaabaaaaa",
"aaaaa", 6, 5,
NPOS),
403 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 0, 9, 0),
404 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 1, 9, 1),
405 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 2, 9,
NPOS),
406 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 2, 8, 2),
407 TEST (
"aaaaaaaaa",
"aaaaaaaaaa", 0, 10,
NPOS),
408 TEST (
"aaaaaaaaa",
"aaaaaaaaaa", 0, 7, 0),
410 TEST (
"x@4096",
"", 0, 0, 0),
412 TEST (
"x@4096",
"x", 0, 1, 0),
413 TEST (
"x@4096",
"xxx", 10, 3, 10),
414 TEST (
"x@4096",
"xxa", 10, 3,
NPOS),
415 TEST (
"x@4096",
"xxa", 10, 2, 10),
416 TEST (
"abc",
"x@4096", 2, 10,
NPOS),
417 TEST (
"xxxxxxxxxx",
"x@4096", 0, 4096,
NPOS),
418 TEST (
"xxxxxxxxxx",
"x@4096", 2, 4, 2),
420 TEST (
"x@4096",
"xxx", 4093, 3, 4093),
421 TEST (
"x@4096",
"xxx", 4094, 3,
NPOS),
422 TEST (
"x@4096",
"xxx", 4094, 2, 4094),
424 TEST (
"abcdefghij", 0, 0, 9, 0),
427 TEST (
"\0cb\0ge\0", 0, 6, 1, 6),
428 TEST (
"x@4096", 0, 0, 4096, 0),
430 TEST (
"x@4096", 0, 5, 4091, 5),
433 TEST (
"abcdefghij",
"abc", 10, 3,
NPOS),
434 TEST (
"abcdefghij",
"cba", 10, 1,
NPOS),
438 TEST (
"abcdefghij",
"cba", 0, -1,
NPOS),
439 TEST (
"x@4096",
"xxx", 0, -1,
NPOS),
440 TEST (
"abcdefghij",
"x@4096", 0, -1,
NPOS),
442 TEST (
"last test",
"test", 0, 4, 5)
450cstr_size_test_cases [] = {
453#define TEST(str, arg, off, res) { \
454 __LINE__, off, -1, -1, -1, -1, \
455 str, sizeof str - 1, \
456 arg, sizeof arg - 1, 0, res, 0 \
466 TEST (
"ab",
"a", 0, 0),
472 TEST (
"\0",
"", 0, 0),
473 TEST (
"\0",
"\0", 0, 0),
475 TEST (
"\0\0",
"\0", 1, 1),
479 TEST (
"abcdefghij",
"a", 0, 0),
481 TEST (
"abcdefghij",
"f", 2, 5),
483 TEST (
"abcdefghij",
"j", 9, 9),
485 TEST (
"edfcbbhjig",
"cba", 0,
NPOS),
486 TEST (
"edfcbahjig",
"cba", 1, 3),
487 TEST (
"edfcbahjig",
"cba", 4,
NPOS),
488 TEST (
"edfcbahcba",
"cba", 1, 3),
489 TEST (
"edfcbahcba",
"cba", 5, 7),
490 TEST (
"cbacbahjig",
"cba", 5,
NPOS),
491 TEST (
"abcbcbd",
"bcbd", 0, 3),
493 TEST (
"e\0cb\0\0g",
"b\0\0g", 0, 3),
494 TEST (
"e\0cb\0\0g",
"b\0\0g", 4,
NPOS),
495 TEST (
"e\0cb\0\0g",
"ecb", 0,
NPOS),
496 TEST (
"\0cb\0\0ge",
"\0\0ge", 6,
NPOS),
497 TEST (
"\0cb\0\0ge",
"\0\0ge", 1, 3),
498 TEST (
"\0cb\0\0ge",
"cb\0", 1, 1),
499 TEST (
"\0cbg\0\0e",
"cb\0", 1,
NPOS),
500 TEST (
"e\0cbg\0\0",
"bg", 1, 3),
501 TEST (
"e\0cbg\0\0",
"cba", 0,
NPOS),
504 TEST (
"bcaedfajih",
"a", 1, 2),
505 TEST (
"bcedfaajih",
"a", 6, 6),
506 TEST (
"bcaaedfaji",
"a", 5, 7),
508 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 0, 0),
509 TEST (
"aaaaaaaaaa",
"aaaaaaaaaa", 1,
NPOS),
510 TEST (
"aaaaabaaaa",
"aaaaaaaaaa", 0,
NPOS),
511 TEST (
"aaaabaaaaa",
"aaaaa", 0, 5),
512 TEST (
"aaaabaaaaa",
"aaaaa", 6,
NPOS),
513 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 0, 0),
514 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 1, 1),
515 TEST (
"aaaaaaaaaa",
"aaaaaaaaa", 2,
NPOS),
516 TEST (
"aaaaaaaaa",
"aaaaaaaaaa", 0,
NPOS),
518 TEST (
"x@4096",
"", 0, 0),
520 TEST (
"x@4096",
"x", 0, 0),
521 TEST (
"x@4096",
"xxx", 10, 10),
524 TEST (
"xxxxxxxxxx",
"x@4096", 0,
NPOS),
526 TEST (
"x@4096",
"xxx", 4093, 4093),
529 TEST (
"abcdefghij", 0, 0, 0),
532 TEST (
"\0cb\0\0ge", 0, 0, 0),
533 TEST (
"x@4096", 0, 0, 0),
537 TEST (
"abcdefghij",
"abc", 10,
NPOS),
538 TEST (
"abcdefghij",
"cba", 10,
NPOS),
540 TEST (
"last test",
"test", 0, 5)
551#define TEST(str, val, res) { \
552 __LINE__, -1, -1, -1, -1, val, \
553 str, sizeof str - 1, 0, 0, 0, res, 0 \
567 TEST (
"\0",
'\0', 0),
568 TEST (
"\0\0",
'\0', 0),
571 TEST (
"e\0cb\0\0g",
'\0', 1),
572 TEST (
"e\0cb\0\0g",
'b', 3),
574 TEST (
"\0cbge\0\0",
'\0', 0),
575 TEST (
"\0cbge\0\0",
'b', 2),
578 TEST (
"x@4096",
'x', 0),
582 TEST (
"last test",
't', 3)
590val_size_test_cases [] = {
593#define TEST(str, val, off, res) { \
594 __LINE__, off, -1, -1, -1, val, \
595 str, sizeof str - 1, 0, 0, 0, res, 0 \
605 TEST (
"ab",
'a', 0, 0),
612 TEST (
"\0\0",
'\0', 1, 1),
616 TEST (
"e\0cb\0\0g",
'\0', 1, 1),
617 TEST (
"e\0cb\0\0g",
'\0', 2, 4),
619 TEST (
"e\0cb\0\0g",
'b', 1, 3),
622 TEST (
"\0cbge\0\0",
'\0', 0, 0),
623 TEST (
"\0cbge\0\0",
'\0', 1, 5),
625 TEST (
"\0cbge\0\0",
'b', 0, 2),
626 TEST (
"\0bgeb\0\0",
'b', 2, 4),
629 TEST (
"x@4096",
'x', 0, 0),
630 TEST (
"x@4096",
'x', 5, 5),
632 TEST (
"x@2048\0xxx",
'\0', 0, 2048),
635 TEST (
"x@4096",
'x', 4095, 4095),
637 TEST (
"last test",
't', 0, 3)
642template <
class charT,
class Traits,
class Allocator>
647 typedef std::basic_string <charT, Traits, Allocator>
String;
649 static const std::size_t BUFSIZE = 256;
651 static charT wstr_buf [BUFSIZE];
652 static charT warg_buf [BUFSIZE];
654 std::size_t str_len =
sizeof wstr_buf /
sizeof *wstr_buf;
655 std::size_t arg_len =
sizeof warg_buf /
sizeof *warg_buf;
661 const String s_str (wstr, str_len);
662 const String s_arg (warg, arg_len);
664 if (wstr != wstr_buf)
667 if (warg != warg_buf)
679 const charT*
const arg_ptr = tcase.
arg ? s_arg.c_str () : s_str.c_str ();
680 const String& arg_str = tcase.
arg ? s_arg : s_str;
683 std::size_t
size = tcase.
size >= 0 ? tcase.
size : s_arg.max_size () + 1;
685#ifndef _RWSTD_NO_EXCEPTIONS
688 const char* expected = 0;
701 switch (
func.which_) {
704 res = s_str.find (arg_ptr);
708 res = s_str.find (arg_str);
711 case Find (cptr_size):
712 res = s_str.find (arg_ptr, tcase.
off);
715 case Find (cptr_size_size):
719 case Find (cstr_size):
720 res = s_str.find (arg_str, tcase.
off);
724 res = s_str.find (arg_val);
727 case Find (val_size):
728 res = s_str.find (arg_val, tcase.
off);
732 RW_ASSERT (!
"logic error: unknown find overload");
736 const std::size_t exp_res =
741 "line %d. %{$FUNCALL} == %{?}%zu%{;}%{?}npos%{;}, "
742 "got %{?}%zu%{;}%{?}npos%{;}",
744 String::npos !=
res,
res, String::npos ==
res);
747#ifndef _RWSTD_NO_EXCEPTIONS
752 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
753 "unexpectedly%{;} caught std::%s(%#s)",
754 __LINE__, 0 != expected, expected,
caught, ex.what ());
759 "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
760 "unexpectedly%{;} caught %s",
761 __LINE__, 0 != expected, expected,
caught);
770 else if (-1 != tcase.
bthrow) {
772 "line %d. %{$FUNCALL} %{?}expected %s, caught %s"
773 "%{:}unexpectedly caught %s%{;}",
784int main (
int argc,
char** argv)
791 Find (sig), sig ## _test_cases, \
792 sizeof sig ## _test_cases / sizeof *sig ## _test_cases \
798 TEST (cptr_size_size),
804 const std::size_t test_count =
sizeof tests /
sizeof *tests;
#define TEST(str, arg, res)
void test_find(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