38test_user_traits_char ()
41 rw_info (0, 0, 0,
"template class UserTraits<char>");
43 rw_warn (0, 0, 0,
"UserTraits<char> not exercised");
49test_user_traits_wchar ()
52 rw_info (0, 0, 0,
"template class UserTraits<wchar_t>");
54 rw_warn (0, 0, 0,
"UserTraits<wchar_t> not exercised");
60test_user_traits_user_char ()
63 rw_info (0, 0, 0,
"template class UserTraits<UserChar>");
66 { 1, 2 }, { 0, 0 }, { 3, 4 }, { 5, 6 }, { 7, 8 }, { 0, 0 }
69 const size_t nsrc =
sizeof src /
sizeof *src;
77 Traits::n_calls_ [MemFun::assign] = 0;
79 Traits::assign (dst [0], src [0]);
80 rw_assert (dst [0].
f == src [0].
f && dst [0].
c == src [0].
c, 0, __LINE__,
81 "UserTraits::assign(char_type&, const char_type&)");
83 rw_assert (1 == Traits::n_calls_ [MemFun::assign], 0, __LINE__,
84 "UserTraits::assign(char_type&, const char_type&)");
87 Traits::n_calls_ [MemFun::eq] = 0;
89 bool eq = Traits::eq (dst [0], src [0]);
91 "UserTraits::eq(const char_type&, const char_type&)");
93 rw_assert (1 == Traits::n_calls_ [MemFun::eq], 0, __LINE__,
94 "UserTraits::eq(const char_type&, const char_type&)");
97 Traits::n_calls_ [MemFun::lt] = 0;
99 bool lt = Traits::lt (dst [0], src [0]);
101 "UserTraits::lt(const char_type&, const char_type&)");
103 rw_assert (1 == Traits::n_calls_ [MemFun::lt], 0, __LINE__,
104 "UserTraits::lt(const char_type&, const char_type&)");
106 lt = Traits::lt (src [0], src [1]);
108 "UserTraits::lt(const char_type&, const char_type&)");
110 rw_assert (2 == Traits::n_calls_ [MemFun::lt], 0, __LINE__,
111 "UserTraits::lt(const char_type&, const char_type&)");
114 Traits::n_calls_ [MemFun::compare] = 0;
118 "UserTraits::compare(const char_type*, const char_type*) "
121 rw_assert (1 == Traits::n_calls_ [MemFun::compare], 0, __LINE__,
122 "UserTraits::compare(const char_type*, const char_type*)");
124 compare = Traits::compare (src, src + 1,
nsrc - 1);
126 "UserTraits::compare(const char_type*, const char_type*) "
129 rw_assert (2 == Traits::n_calls_ [MemFun::compare], 0, __LINE__,
130 "UserTraits::compare(const char_type*, const char_type*)");
132 compare = Traits::compare (src + 1, src,
nsrc - 1);
134 "UserTraits::compare(const char_type*, const char_type*) "
137 rw_assert (3 == Traits::n_calls_ [MemFun::compare], 0, __LINE__,
138 "UserTraits::compare(const char_type*, const char_type*)");
141 Traits::n_calls_ [MemFun::length] = 0;
143 size_t length = Traits::length (src);
145 "UserTraits::length(const char_type*)");
147 rw_assert (1 == Traits::n_calls_ [MemFun::length], 0, __LINE__,
148 "UserTraits::length(const char_type*)");
150 length = Traits::length (src + 1);
152 "UserTraits::length(const char_type*)");
154 rw_assert (2 == Traits::n_calls_ [MemFun::length], 0, __LINE__,
155 "UserTraits::length(const char_type*)");
157 length = Traits::length (src + 2);
159 "UserTraits::length(const char_type*) == %zu, got %zu",
162 rw_assert (3 == Traits::n_calls_ [MemFun::length], 0, __LINE__,
163 "UserTraits::length(const char_type*)");
166 Traits::n_calls_ [MemFun::find] = 0;
168 const UserChar *find = Traits::find (src,
nsrc, src [0]);
170 "UserTraits::find(const char_type*, size_t, const char_type&)");
172 rw_assert (1 == Traits::n_calls_ [MemFun::find], 0, __LINE__,
173 "UserTraits::find(const char_type*, size_t, const char_type&)");
175 find = Traits::find (src,
nsrc, src [1]);
177 "UserTraits::find(const char_type*, size_t, const char_type&)");
179 rw_assert (2 == Traits::n_calls_ [MemFun::find], 0, __LINE__,
180 "UserTraits::find(const char_type*, size_t, const char_type&)");
182 find = Traits::find (src,
nsrc, src [2]);
184 "UserTraits::find(const char_type*, size_t, const char_type&)");
186 rw_assert (3 == Traits::n_calls_ [MemFun::find], 0, __LINE__,
187 "UserTraits::find(const char_type*, size_t, const char_type&)");
189 find = Traits::find (src + 1,
nsrc - 1, src [0]);
191 "UserTraits::find(const char_type*, size_t, const char_type&)");
193 rw_assert (4 == Traits::n_calls_ [MemFun::find], 0, __LINE__,
194 "UserTraits::find(const char_type*, size_t, const char_type&)");
197 Traits::n_calls_ [MemFun::copy] = 0;
201 memset (dst, 0,
sizeof dst);
204 const UserChar *copy = Traits::copy (dst, src, 0);
206 "UserTraits::copy(char_type*, const char_type*, size_t)");
208 rw_assert (Traits::eq (dst [0], uc), 0, __LINE__,
209 "UserTraits::copy(char_type*, const char_type*, size_t)");
211 rw_assert (1 == Traits::n_calls_ [MemFun::copy], 0, __LINE__,
212 "UserTraits::copy(char_type*, const char_type*, size_t)");
214 memset (dst, 0,
sizeof dst);
217 copy = Traits::copy (dst, src, 1);
220 "UserTraits::copy(char_type*, const char_type*, size_t)");
222 rw_assert (Traits::eq (dst [0], src [0]) && Traits::eq (dst [1], uc),
224 "UserTraits::copy(char_type*, const char_type*, size_t)");
226 rw_assert (2 == Traits::n_calls_ [MemFun::copy], 0, __LINE__,
227 "UserTraits::copy(char_type*, const char_type*, size_t)");
230 Traits::n_calls_ [MemFun::move] = 0;
232 memset (dst, 0,
sizeof dst);
235 const UserChar *move = Traits::move (dst, src, 0);
237 "UserTraits::move(char_type*, const char_type*, size_t)");
239 rw_assert (Traits::eq (dst [0], uc), 0, __LINE__,
240 "UserTraits::move(char_type*, const char_type*, size_t)");
242 rw_assert (1 == Traits::n_calls_ [MemFun::move], 0, __LINE__,
243 "UserTraits::move(char_type*, const char_type*, size_t)");
245 memset (dst, 0,
sizeof dst);
248 move = Traits::move (dst, src, 1);
251 "UserTraits::move(char_type*, const char_type*, size_t)");
253 rw_assert (Traits::eq (dst [0], src [0]) && Traits::eq (dst [1], uc),
255 "UserTraits::move(char_type*, const char_type*, size_t)");
257 rw_assert (2 == Traits::n_calls_ [MemFun::move], 0, __LINE__,
258 "UserTraits::move(char_type*, const char_type*, size_t)");
261 memcpy (dst, src,
sizeof dst);
262 move = Traits::move (dst, dst + 1, 1);
265 "UserTraits::move(char_type*, const char_type*, size_t)");
267 rw_assert ( Traits::eq (dst [0], src [1])
268 && Traits::eq (dst [1], src [1]),
270 "UserTraits::move(char_type*, const char_type*, size_t)");
272 rw_assert (3 == Traits::n_calls_ [MemFun::move], 0, __LINE__,
273 "UserTraits::move(char_type*, const char_type*, size_t)");
275 memcpy (dst, src,
sizeof dst);
276 move = Traits::move (dst, dst + 1, 2);
279 "UserTraits::move(char_type*, const char_type*, size_t)");
281 rw_assert ( Traits::eq (dst [0], src [1])
282 && Traits::eq (dst [1], src [2])
283 && Traits::eq (dst [2], src [2]),
285 "UserTraits::move(char_type*, const char_type*, size_t)");
287 rw_assert (4 == Traits::n_calls_ [MemFun::move], 0, __LINE__,
288 "UserTraits::move(char_type*, const char_type*, size_t)");
290 memcpy (dst, src,
sizeof dst);
291 move = Traits::move (dst + 1, dst, 1);
294 "UserTraits::move(char_type*, const char_type*, size_t)");
296 rw_assert ( Traits::eq (dst [0], src [0])
297 && Traits::eq (dst [1], src [0])
298 && Traits::eq (dst [2], src [2]),
300 "UserTraits::move(char_type*, const char_type*, size_t)");
302 rw_assert (5 == Traits::n_calls_ [MemFun::move], 0, __LINE__,
303 "UserTraits::move(char_type*, const char_type*, size_t)");
305 memcpy (dst, src,
sizeof dst);
306 move = Traits::move (dst + 1, dst, 2);
309 "UserTraits::move(char_type*, const char_type*, size_t)");
311 rw_assert ( Traits::eq (dst [0], src [0])
312 && Traits::eq (dst [1], src [0])
313 && Traits::eq (dst [2], src [1])
314 && Traits::eq (dst [3], src [3]),
316 "UserTraits::move(char_type*, const char_type*, size_t)");
318 rw_assert (6 == Traits::n_calls_ [MemFun::move], 0, __LINE__,
319 "UserTraits::move(char_type*, const char_type*, size_t)");
322 Traits::n_calls_ [MemFun::assign] = 0;
324 memset (dst, 0,
sizeof dst);
330 "UserTraits::assign(char_type*, size_t, const char_type&)");
332 rw_assert (Traits::eq (dst [0], uc), 0, __LINE__,
333 "UserTraits::assign(char_type*, size_t, const char_type&)");
335 rw_assert (1 == Traits::n_calls_ [MemFun::assign2], 0, __LINE__,
336 "UserTraits::assign(char_type*, size_t, const char_type&)");
338 memset (dst, 0,
sizeof dst);
341 assign = Traits::assign (dst, 1, src [0]);
343 "UserTraits::assign(char_type*, size_t, const char_type&)");
345 rw_assert (Traits::eq (dst [0], src [0]) && Traits::eq (dst [1], uc),
347 "UserTraits::assign(char_type*, size_t, const char_type&)");
349 rw_assert (2 == Traits::n_calls_ [MemFun::assign2], 0, __LINE__,
350 "UserTraits::assign(char_type*, size_t, const char_type&)");
352 memset (dst, 0,
sizeof dst);
355 assign = Traits::assign (dst, 2, src [0]);
357 "UserTraits::assign(char_type*, size_t, const char_type&)");
359 rw_assert ( Traits::eq (dst [0], src [0])
360 && Traits::eq (dst [1], src [0])
361 && Traits::eq (dst [2], uc),
363 "UserTraits::assign(char_type*, size_t, const char_type&)");
365 rw_assert (3 == Traits::n_calls_ [MemFun::assign2], 0, __LINE__,
366 "UserTraits::assign(char_type*, size_t, const char_type&)");
369 rw_warn (0, 0, 0,
"UserTraits<UserChar>::not_eof() not exercised");
370 rw_warn (0, 0, 0,
"UserTraits<UserChar>::eof() not exercised");
371 rw_warn (0, 0, 0,
"UserTraits<UserChar>::to_char_type() not exercised");
372 rw_warn (0, 0, 0,
"UserTraits<UserChar>::to_int_type() not exercised");
373 rw_warn (0, 0, 0,
"UserTraits<UserChar>::eq_int_type() not exercised");
382 rw_info (0, 0, 0,
"rw_widen(char*, const char*, size_t)");
384 static const char src [] =
"abcdefgh";
385 const size_t nsrc =
sizeof src - 1;
386 static const char null [
nsrc + 1] =
"";
387 char cdst [
nsrc + 1];
389 for (
size_t i = 0;
i !=
nsrc + 1; ++
i) {
391 memset (cdst, 0,
sizeof cdst);
393 const char*
const ret =
i <
nsrc ?
397 "rw_widen(char*, %{#s}%{?}, %zu%{;})",
400 rw_assert (0 == memcmp (cdst, src,
i) &&
'\0' == cdst [
i],
402 "rw_widen(char*, %{#s}%{?}, %zu%{;}) == %{#*s}, got %{#*s}",
403 src,
i <
nsrc,
i,
int (
i), src,
int (
i + 1), cdst);
406 memset (cdst,
'@',
sizeof cdst);
409 rw_assert (0 == memcmp (cdst, null,
sizeof cdst), 0, __LINE__,
410 "rw_widen(char*, %{#s}, %zu) == %{#*s}, got %{#*s}",
411 0,
sizeof cdst,
int (
sizeof cdst), null,
412 int (
sizeof cdst), cdst);
415 rw_info (0, 0, 0,
"rw_widen(wchar_t*, const char*, size_t)");
417#ifndef _RWSTD_NO_WCHAR_T
419 static const wchar_t wsrc [] =
L"abcdefgh";
420 static const wchar_t wnull [
nsrc + 1] =
L"";
421 wchar_t wdst [
nsrc + 1];
423 for (
size_t i = 0;
i !=
nsrc + 1; ++
i) {
425 memset (wdst, 0,
sizeof wdst);
427 const wchar_t*
const ret =
i <
nsrc ?
431 "rw_widen(wchar_t*, %{#s}%{?}, %zu%{;})",
437 "rw_widen(wchar_t*, %{#s}%{?}, %zu%{;}) == L%{#*ls}, "
442 memset (wdst,
'@',
sizeof wdst);
443 rw_widen (wdst, 0,
sizeof wdst /
sizeof *wdst);
445 rw_assert (0 == memcmp (wdst, wnull,
sizeof wdst), 0, __LINE__,
446 "rw_widen(wchar_t*, %{#s}, %zu) == %{#*s}, got L%{#*ls}",
447 0,
sizeof wdst,
int (
sizeof wdst /
sizeof *wdst), wnull,
448 int (
sizeof wdst /
sizeof *wdst), wdst);
452 rw_note (0, 0, 0,
"_RWSTD_NO_WCHAR_T #defined, wchar_t test disabled");
457 rw_info (0, 0, 0,
"rw_widen(UserChar*, const char*, size_t)");
460 { 0,
'a' }, { 0,
'b' }, { 0,
'c' }, { 0,
'd' },
461 { 0,
'e' }, { 0,
'f' }, { 0,
'g' }, { 0,
'h' },
465 { 0,
'\0' }, { 0,
'\0' }, { 0,
'\0' }, { 0,
'\0' },
466 { 0,
'\0' }, { 0,
'\0' }, { 0,
'\0' }, { 0,
'\0' },
474 for (
size_t i = 0;
i !=
nsrc + 1; ++
i) {
476 memset (udst, 0,
sizeof udst);
482 "rw_widen(UserChar*, %{#s}%{?}, %zu%{;})",
485 rw_assert ( 0 == Traits::compare (udst, usrc,
i)
486 && 0 == udst [
i].
f && 0 == udst [
i].
c,
488 "rw_widen(UserChar*, %{#s}%{?}, %zu%{;})",
492 memset (udst, 1,
sizeof udst);
493 rw_widen (udst, 0,
sizeof udst /
sizeof *udst);
495 rw_assert (0 == Traits::compare (udst, unull,
nsrc + 1), 0, __LINE__,
496 "rw_widen(UserChar*, %{#s}, %zu)",
497 0,
sizeof udst,
int (
sizeof udst), wnull);
506 rw_info (0, 0, 0,
"rw_expand(char*, const char*, size_t, size_t*)");
509#define TEST(str, expstr) \
511 const size_t str_size = sizeof str - 1; \
512 const size_t exp_size = sizeof expstr - 1; \
514 char* const res = rw_expand ((char*)0, str, str_size, &len); \
515 rw_assert ( 0 == memcmp (res, expstr, exp_size) \
516 && exp_size == len, \
518 "rw_expand((char*)0, %{#*s}, %zu, ...) == " \
519 "%{#*s} (length %zu), got %{#*s} (length %zu)", \
520 int (str_size), str, str_size, \
521 int (exp_size), expstr, exp_size, \
522 int (len), res, len); \
532 TEST (
"a\0b",
"a\0b");
533 TEST (
"a\0b\0c\0",
"a\0b\0c\0");
534 TEST (
"\0\0\0",
"\0\0\0");
540 TEST (
"\0@2",
"\0\0");
542 TEST (
"a@2\0",
"aa\0");
545 TEST (
"a@2b",
"aab");
546 TEST (
"a@3b",
"aaab");
547 TEST (
"a@2\0\0",
"aa\0\0");
548 TEST (
"\0@2b",
"\0\0b");
549 TEST (
"a@3bc",
"aaabc");
550 TEST (
"a@3b@1c",
"aaabc");
551 TEST (
"a@3b@2c",
"aaabbc");
552 TEST (
"a@3b@2c@1",
"aaabbc");
553 TEST (
"a@3b@3c@2",
"aaabbbcc");
556 rw_info (0, 0, 0,
"rw_expand(wchar_t*, const char*, size_t, size_t*)");
558#ifndef _RWSTD_NO_WCHAR_T
561#define TEST(str, expstr) \
563 const size_t str_size = sizeof str - 1; \
564 const size_t exp_size = sizeof expstr / sizeof *expstr - 1; \
566 wchar_t* const res = rw_expand ((wchar_t*)0, str, str_size, &len); \
567 rw_assert ( 0 == memcmp (res, expstr, exp_size * sizeof *res) \
568 && exp_size == len, \
570 "rw_expand((wchar_t*)0, %{#*s}, %zu, ...) == " \
571 "%{#*ls} (length %zu), got %{#*ls} (length %zu)", \
572 int (str_size), str, str_size, \
573 int (exp_size), expstr, exp_size, \
574 int (len), res, len); \
581 TEST (
"a\0",
L"a\0");
583 TEST (
"abc",
L"abc");
584 TEST (
"a\0b",
L"a\0b");
585 TEST (
"a\0b\0c\0",
L"a\0b\0c\0");
586 TEST (
"\0\0\0",
L"\0\0\0");
590 TEST (
"\0@1",
L"\0");
592 TEST (
"\0@2",
L"\0\0");
594 TEST (
"a@2\0",
L"aa\0");
595 TEST (
"\0@2a",
L"\0\0a");
596 TEST (
"a@3",
L"aaa");
597 TEST (
"a@1b",
L"ab");
598 TEST (
"a@2b",
L"aab");
599 TEST (
"a@3b",
L"aaab");
600 TEST (
"a@2\0\0",
L"aa\0\0");
601 TEST (
"\0@2b",
L"\0\0b");
602 TEST (
"a@3bc",
L"aaabc");
603 TEST (
"a@3b@1c",
L"aaabc");
604 TEST (
"a@3b@2c",
L"aaabbc");
605 TEST (
"a@3b@2c@1",
L"aaabbc");
606 TEST (
"a@3b@3c@2",
L"aaabbbcc");
610 rw_note (0, 0, 0,
"_RWSTD_NO_WCHAR_T #defined, wchar_t test disabled");
615 rw_info (0, 0, 0,
"rw_expand(UserChar*, const char*, size_t, size_t*)");
617 rw_warn (0, 0, 0,
"rw_expand(UserChar*, const char*, size_t, size_t*) "
628 rw_info (0, 0, 0,
"rw_narrow(char*, const char*, size_t)");
630 static const char src [] =
"abcdefgh";
631 const size_t nsrc =
sizeof src - 1;
632 static const char null [
nsrc + 1] =
"";
633 char cdst [
nsrc + 1];
635 for (
size_t i = 0;
i !=
nsrc + 1; ++
i) {
637 memset (cdst, 0,
sizeof cdst);
639 const char*
const ret =
i <
nsrc ?
643 "rw_narrow(char*, %{#s}%{?}, %zu%{;})",
646 rw_assert (0 == memcmp (cdst, src,
i) &&
'\0' == cdst [
i],
648 "rw_narrow(char*, %{#s}%{?}, %zu%{;}) == %{#*s}, got %{#*s}",
649 src,
i <
nsrc,
i,
int (
i), src,
int (
i + 1), cdst);
652 memset (cdst,
'@',
sizeof cdst);
653 rw_narrow (cdst, (
const char*)0,
sizeof cdst);
655 rw_assert (0 == memcmp (cdst, null,
sizeof cdst), 0, __LINE__,
656 "rw_narrow(char*, %{#s}, %zu) == %{#*s}, got %{#*s}",
657 0,
sizeof cdst,
int (
sizeof cdst), null,
658 int (
sizeof cdst), cdst);
661 rw_info (0, 0, 0,
"rw_narrow(wchar_t*, const wchar_t*, size_t)");
663#ifndef _RWSTD_NO_WCHAR_T
665 static const wchar_t wsrc [] =
L"abcdefgh";
667 for (
size_t i = 0;
i !=
nsrc + 1; ++
i) {
669 memset (cdst, 0,
sizeof cdst);
671 const char*
const ret =
i <
nsrc ?
675 "rw_narrow(char*, %{#s}%{?}, %zu%{;})",
678 rw_assert (0 == memcmp (cdst, src,
i) &&
'\0' == cdst [
i],
680 "rw_narrow(char*, L%{#*ls}%{?}, %zu%{;}) == %{#*s}, "
686 memset (cdst,
'@',
sizeof cdst);
687 rw_narrow (cdst, (
const wchar_t*)0,
sizeof cdst);
690 "rw_narrow(char*, %{#s}, %zu) == %{#*s}, got %{#*s}",
691 0,
sizeof cdst,
int (
sizeof null), null,
692 int (
sizeof cdst), cdst);
696 rw_note (0, 0, 0,
"_RWSTD_NO_WCHAR_T #defined, wchar_t test disabled");
701 rw_info (0, 0, 0,
"rw_narrow(char*, const UserChar*, size_t)");
704 { 0,
'a' }, { 0,
'b' }, { 0,
'c' }, { 0,
'd' },
705 { 0,
'e' }, { 0,
'f' }, { 0,
'g' }, { 0,
'h' },
709 for (
size_t i = 0;
i !=
nsrc + 1; ++
i) {
711 memset (cdst, 0,
sizeof cdst);
713 const char*
const ret =
i <
nsrc ?
717 "rw_narrow(char*, %{#s}%{?}, %zu%{;})",
720 rw_assert (0 == memcmp (cdst, src,
i) && 0 == cdst [
i],
722 "rw_narrow(char*, %{#s}%{?}, %zu%{;})",
726 memset (cdst,
'@',
sizeof cdst);
730 "rw_narrow(char*, %{#s}, %zu)",
737make_user_string (
const char *
s,
size_t len)
740 memset (usrbuf, 0,
sizeof usrbuf);
743 for (
size_t i = 0;
i !=
len; ++
i) {
745 typedef unsigned char UChar;
761 rw_info (0, 0, 0,
"rw_match(char*, const char*, size_t)");
766#define TEST(s1, s2, len, expect) \
767 result = rw_match ((const char*)s1, (const char*)s2, size_t (len)); \
768 rw_assert (expect == result, \
770 "rw_match(%{#*s}, %{#*s}, %zu) == %zu, got %zu", \
771 int (sizeof s1 - 1), s1, int (sizeof s2 - 1), s2, len, \
777 TEST (
"",
"", -1, 1);
780 TEST (
"a@0",
"", -1, 1);
781 TEST (
"",
"b@0", -1, 1);
782 TEST (
"a@0",
"b@0", -1, 1);
787 TEST (0,
"a", -1, 1);
788 TEST (0,
"ab", -1, 2);
789 TEST (0,
"abc", -1, 3);
790 TEST (0,
"a@0", -1, 0);
791 TEST (0,
"a@1", -1, 1);
792 TEST (0,
"a@2", -1, 2);
793 TEST (0,
"a@2b@0", -1, 2);
794 TEST (0,
"a@2b@1", -1, 3);
795 TEST (0,
"a@2b@2", -1, 4);
798 TEST (
"a", 0, -1, 1);
799 TEST (
"ab", 0, -1, 2);
800 TEST (
"abc", 0, -1, 3);
801 TEST (
"a@0", 0, -1, 0);
802 TEST (
"a@1", 0, -1, 1);
803 TEST (
"a@2", 0, -1, 2);
804 TEST (
"a@2b@0", 0, -1, 2);
805 TEST (
"a@2b@1", 0, -1, 3);
806 TEST (
"a@2b@2", 0, -1, 4);
808 TEST (
"",
"a", -1, 0);
809 TEST (
"a",
"", -1, 0);
810 TEST (
"a",
"a", -1, 2);
813 TEST (
"",
"a@1", -1, 0);
814 TEST (
"a@1",
"", -1, 0);
815 TEST (
"a",
"a@1", -1, 2);
816 TEST (
"a@1",
"a", -1, 2);
817 TEST (
"a@1",
"a@1", -1, 2);
819 TEST (
"\0ab",
"\0ac", 2, 2);
820 TEST (
"\0@0ab",
"ab", 2, 2);
821 TEST (
"\0@0a\0@0b",
"ab", 2, 2);
822 TEST (
"\0@1ab",
"\0@1ac", 2, 2);
823 TEST (
"\0@1ab",
"\0@1ac", 2, 2);
824 TEST (
"a\0@0b",
"a\0@0c", -1, 2);
825 TEST (
"a\0@0b",
"a\0@1c", -1, 2);
826 TEST (
"a\0@1b",
"a\0@0c", -1, 2);
827 TEST (
"a\0@1b",
"a\0@1c", -1, 2);
829 TEST (
"a\0bc",
"a\0bd", -1, 2);
830 TEST (
"a\0bc",
"a\0bd", 0, 0);
831 TEST (
"a\0bc",
"a\0bd", 1, 1);
832 TEST (
"a\0bc",
"a\0bd", 2, 2);
833 TEST (
"a\0bc",
"a\0bd", 3, 3);
834 TEST (
"a\0bc",
"a\0bd", 4, 3);
836 TEST (
"aaaaa",
"a@5", -1, 6);
837 TEST (
"aaaaaa@0",
"a@5", -1, 6);
838 TEST (
"aaaaa@1",
"a@5", -1, 6);
839 TEST (
"aaaa@2",
"a@5", -1, 6);
840 TEST (
"aaa@3",
"a@5", -1, 6);
841 TEST (
"aa@4",
"a@5", -1, 6);
842 TEST (
"a@5",
"a@5", -1, 6);
843 TEST (
"a@4a",
"a@5", -1, 6);
844 TEST (
"a@3aa",
"a@5", -1, 6);
845 TEST (
"a@2aaa",
"a@5", -1, 6);
846 TEST (
"a@1aaaa",
"a@5", -1, 6);
847 TEST (
"a@0aaaaa",
"a@5", -1, 6);
849 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", -1, 7);
850 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", 0, 0);
851 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", 1, 1);
852 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", 2, 2);
853 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", 3, 3);
854 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", 4, 4);
855 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", 5, 5);
856 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", 6, 6);
857 TEST (
"a@0a@1a@2a@3",
"a@3a@2a@1a@0", 7, 7);
859 TEST (
"a@0\0a@1a@2\0a@3\0",
"\0a@3\0a@2a@1a@0\0", 10, 10);
860 TEST (
"a@0*a@1a@2\0a@3\0",
"\0a@3\0a@2a@1a@0\0", 10, 0);
861 TEST (
"a@0\0a@1a@2*a@3\0",
"\0a@3\0a@2a@1a@0\0", 10, 4);
862 TEST (
"a@0\0a@1a@2\0a@3*",
"\0a@3\0a@2a@1a@0\0", 10, 8);
863 TEST (
"a@11aa@12aaa@13b",
"a@13aa@12aaa@11c", -1, 39);
866 TEST (
"a@b",
"a@0a@b", -1, 4);
867 TEST (
"a@b@c",
"a@0a@b@c", -1, 6);
871 TEST (
"<U0>",
"", -1, 1);
872 TEST (
"<U00>",
"", -1, 1);
873 TEST (
"<U000>",
"", -1, 1);
874 TEST (
"<U0000>",
"", -1, 1);
875 TEST (
"",
"<U0>", -1, 1);
876 TEST (
"",
"<U00>", -1, 1);
877 TEST (
"",
"<U000>", -1, 1);
878 TEST (
"",
"<U0000>", -1, 1);
879 TEST (
"<U0>",
"<U0000>", -1, 1);
880 TEST (
"<U00>",
"<U000>", -1, 1);
881 TEST (
"<U000>",
"<U00>", -1, 1);
882 TEST (
"<U0000>",
"<U0>", -1, 1);
884 TEST (
"<U1>", 0, -1, 1);
885 TEST (
"<U1><U02>", 0, -1, 2);
886 TEST (
"<U1><U02><U003>", 0, -1, 3);
887 TEST (
"<U1><U02><U003><U0004>", 0, -1, 4);
890 TEST (
"<UA>",
"\n", -1, 2);
891 TEST (
"<U0A>",
"\n", -1, 2);
892 TEST (
"<U00A>",
"\n", -1, 2);
893 TEST (
"<U000A>",
"\n", -1, 2);
894 TEST (
"<U0000A>",
"\n", -1, 2);
895 TEST (
"<U41>",
"A", -1, 2);
896 TEST (
"<U41>A",
"AA", -1, 3);
897 TEST (
"A<U41>A",
"AAA", -1, 4);
898 TEST (
"A<U41>@3A",
"AAAAA", -1, 6);
900 TEST (
"<U41>@0<U42>@1<U43>@2<U44>@3",
"BCCDDD", -1, 7);
902 TEST (
"<U25>",
"\n", -1, 2);
903 TEST (
"<U025>",
"\n", -1, 2);
904 TEST (
"<U025>",
"\n", -1, 2);
905 TEST (
"<U0025>",
"\n", -1, 2);
906 TEST (
"<UC1>",
"A", -1, 2);
907 TEST (
"<UC1>A",
"AA", -1, 3);
908 TEST (
"A<UC1>A",
"AAA", -1, 4);
909 TEST (
"A<UC1>@3A",
"AAAAA", -1, 6);
911 TEST (
"<UC1>@0<UC2>@1<UC3>@2<UC4>@3",
"BCCDDD", -1, 7);
913 rw_warn (0, 0,
"unknown character set (neither ASCII nor EBCDIC)");
917 rw_info (0, 0, 0,
"rw_match(char*, const wchar_t*, size_t)");
919#ifndef _RWSTD_NO_WCHAR_T
922#define TEST(s1, s2, len, expect) \
923 result = rw_match ((const char*)s1, (const wchar_t*)s2, size_t (len)); \
924 rw_assert (expect == result, \
926 "rw_match(%{#*s}, L%{#*ls}, %zu) == %zu, got %zu", \
927 int (sizeof s1 - 1), s1, \
928 int (sizeof (s2) / sizeof *(s2) - 1), s2, len, \
931 TEST (0, (
wchar_t*)0, -1, 0);
932 TEST (
"", (
wchar_t*)0, -1, 0);
933 TEST (0,
L"", -1, 0);
934 TEST (
"",
L"", -1, 1);
937 TEST (
"a@0",
L"", -1, 1);
938 TEST (
"",
L"", -1, 1);
939 TEST (
"a@0",
L"", -1, 1);
944 TEST (0,
L"a", -1, 1);
945 TEST (0,
L"ab", -1, 2);
946 TEST (0,
L"abc", -1, 3);
947 TEST (0,
L"abcd", -1, 4);
948 TEST (0,
L"abcde", -1, 5);
949 TEST (0,
L"abcdef", -1, 6);
952 TEST (
"a", (
wchar_t*)0, -1, 1);
953 TEST (
"ab", (
wchar_t*)0, -1, 2);
954 TEST (
"abc", (
wchar_t*)0, -1, 3);
955 TEST (
"a@0", (
wchar_t*)0, -1, 0);
956 TEST (
"a@1", (
wchar_t*)0, -1, 1);
957 TEST (
"a@2", (
wchar_t*)0, -1, 2);
958 TEST (
"a@2b@0", (
wchar_t*)0, -1, 2);
959 TEST (
"a@2b@1", (
wchar_t*)0, -1, 3);
960 TEST (
"a@2b@2", (
wchar_t*)0, -1, 4);
962 TEST (
"",
L"a", -1, 0);
963 TEST (
"a",
L"", -1, 0);
964 TEST (
"a",
L"a", -1, 2);
967 TEST (
"a@1",
L"", -1, 0);
968 TEST (
"a@1",
L"a", -1, 2);
970 TEST (
"\0ab",
L"\0ac", 2, 2);
971 TEST (
"\0@0ab",
L"ab", 2, 2);
972 TEST (
"\0@0a\0@0b",
L"ab", 2, 2);
973 TEST (
"a\0@0b",
L"a\0\0", -1, 2);
974 TEST (
"a\0@1b",
L"a\0\0", -1, 2);
976 TEST (
"a\0bc",
L"a\0bd", -1, 2);
977 TEST (
"a\0bc",
L"a\0bd", 0, 0);
978 TEST (
"a\0bc",
L"a\0bd", 1, 1);
979 TEST (
"a\0bc",
L"a\0bd", 2, 2);
980 TEST (
"a\0bc",
L"a\0bd", 3, 3);
981 TEST (
"a\0bc",
L"a\0bd", 4, 3);
983 TEST (
"aaaaa",
L"aaaaa", -1, 6);
984 TEST (
"aaaaaa@0",
L"aaaaa", -1, 6);
985 TEST (
"aaaaa@1",
L"aaaaa", -1, 6);
986 TEST (
"aaaa@2",
L"aaaaa", -1, 6);
987 TEST (
"aaa@3",
L"aaaaa", -1, 6);
988 TEST (
"aa@4",
L"aaaaa", -1, 6);
989 TEST (
"a@5",
L"aaaaa", -1, 6);
990 TEST (
"a@4a",
L"aaaaa", -1, 6);
991 TEST (
"a@3aa",
L"aaaaa", -1, 6);
992 TEST (
"a@2aaa",
L"aaaaa", -1, 6);
993 TEST (
"a@1aaaa",
L"aaaaa", -1, 6);
994 TEST (
"a@0aaaaa",
L"aaaaa", -1, 6);
996 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", -1, 7);
997 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", 0, 0);
998 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", 1, 1);
999 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", 2, 2);
1000 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", 3, 3);
1001 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", 4, 4);
1002 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", 5, 5);
1003 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", 6, 6);
1004 TEST (
"a@0a@1a@2a@3",
L"aaaaaa", 7, 7);
1006 TEST (
"a@0\0a@1a@2\0a@3\0",
L"\0aaa\0aaa\0", 10, 10);
1007 TEST (
"a@0*a@1a@2\0a@3\0",
L"\0aaa\0aaa\0", 10, 0);
1008 TEST (
"a@0\0a@1a@2*a@3\0",
L"\0aaa\0aaa\0", 10, 4);
1009 TEST (
"a@0\0a@1a@2\0a@3*",
L"\0aaa\0aaa\0", 10, 8);
1012 TEST (
"a@b",
L"a@b", -1, 4);
1013 TEST (
"a@b@c",
L"a@b@c", -1, 6);
1017 rw_note (0, 0, 0,
"_RWSTD_NO_WCHAR_T #defined, wchar_t test disabled");
1022 rw_info (0, 0, 0,
"rw_match(char*, const UserChar*, size_t)");
1025#define TEST(s1, s2, len, expect) \
1026 result = rw_match ((const char*)s1, \
1027 make_user_string (s2, sizeof (s2)), size_t (len)); \
1028 rw_assert (expect == result, \
1030 "rw_match(%{#*s}, %{#*s}, %zu) == %zu, got %zu", \
1031 int (sizeof s1 - 1), s1, int (sizeof s2 - 1), s2, len, \
1035 TEST (
"", 0, -1, 0);
1036 TEST (0,
"", -1, 0);
1037 TEST (
"",
"", -1, 1);
1040 TEST (
"a@0",
"", -1, 1);
1041 TEST (
"",
"", -1, 1);
1042 TEST (
"a@0",
"", -1, 1);
1046 TEST (0,
"a", -1, 1);
1047 TEST (0,
"ab", -1, 2);
1048 TEST (0,
"abc", -1, 3);
1051 TEST (
"a", 0, -1, 1);
1052 TEST (
"ab", 0, -1, 2);
1053 TEST (
"abc", 0, -1, 3);
1055 TEST (
"",
"a", -1, 0);
1056 TEST (
"a",
"", -1, 0);
1057 TEST (
"a",
"a", -1, 2);
1060 TEST (
"a@1",
"", -1, 0);
1061 TEST (
"a@1",
"a", -1, 2);
1063 TEST (
"\0ab",
"\0ac", 2, 2);
1064 TEST (
"\0@0ab",
"ab", 2, 2);
1065 TEST (
"\0@0a\0@0b",
"ab", 2, 2);
1066 TEST (
"a\0@0b",
"a\0\0", -1, 2);
1067 TEST (
"a\0@1b",
"a\0\0", -1, 2);
1069 TEST (
"a\0bc",
"a\0bd", -1, 2);
1070 TEST (
"a\0bc",
"a\0bd", 0, 0);
1071 TEST (
"a\0bc",
"a\0bd", 1, 1);
1072 TEST (
"a\0bc",
"a\0bd", 2, 2);
1073 TEST (
"a\0bc",
"a\0bd", 3, 3);
1074 TEST (
"a\0bc",
"a\0bd", 4, 3);
1076 TEST (
"aaaaa",
"aaaaa", -1, 6);
1077 TEST (
"aaaaaa@0",
"aaaaa", -1, 6);
1078 TEST (
"aaaaa@1",
"aaaaa", -1, 6);
1079 TEST (
"aaaa@2",
"aaaaa", -1, 6);
1080 TEST (
"aaa@3",
"aaaaa", -1, 6);
1081 TEST (
"aa@4",
"aaaaa", -1, 6);
1082 TEST (
"a@5",
"aaaaa", -1, 6);
1083 TEST (
"a@4a",
"aaaaa", -1, 6);
1084 TEST (
"a@3aa",
"aaaaa", -1, 6);
1085 TEST (
"a@2aaa",
"aaaaa", -1, 6);
1086 TEST (
"a@1aaaa",
"aaaaa", -1, 6);
1087 TEST (
"a@0aaaaa",
"aaaaa", -1, 6);
1089 TEST (
"a@0a@1a@2a@3",
"aaaaaa", -1, 7);
1090 TEST (
"a@0a@1a@2a@3",
"aaaaaa", 0, 0);
1091 TEST (
"a@0a@1a@2a@3",
"aaaaaa", 1, 1);
1092 TEST (
"a@0a@1a@2a@3",
"aaaaaa", 2, 2);
1093 TEST (
"a@0a@1a@2a@3",
"aaaaaa", 3, 3);
1094 TEST (
"a@0a@1a@2a@3",
"aaaaaa", 4, 4);
1095 TEST (
"a@0a@1a@2a@3",
"aaaaaa", 5, 5);
1096 TEST (
"a@0a@1a@2a@3",
"aaaaaa", 6, 6);
1097 TEST (
"a@0a@1a@2a@3",
"aaaaaa", 7, 7);
1099 TEST (
"a@0\0a@1a@2\0a@3\0",
"\0aaa\0aaa\0", 10, 10);
1100 TEST (
"a@0*a@1a@2\0a@3\0",
"\0aaa\0aaa\0", 10, 0);
1101 TEST (
"a@0\0a@1a@2*a@3\0",
"\0aaa\0aaa\0", 10, 4);
1102 TEST (
"a@0\0a@1a@2\0a@3*",
"\0aaa\0aaa\0", 10, 8);
1105 TEST (
"a@b",
"a@b", -1, 4);
1106 TEST (
"a@b@c",
"a@b@c", -1, 6);
1115 rw_info (0, 0, 0,
"\"%s\": formatting directive",
"%{/Gs}");
1117 const int wchsize = int (
sizeof (
wchar_t));
1118 const int usrsize = int (
sizeof (
UserChar));
1123#define TEST(fmt, arg0, arg1, arg2, expect_str) \
1124 str = rw_sprintfa (fmt, arg0, arg1, arg2); \
1125 rw_assert (str && 0 == strcmp (str, expect_str), \
1127 "rw_printf(%#s, ...) == %#s; got %#s", \
1128 fmt, expect_str, str); \
1131 TEST (
">%{/Gs}<", (
char*)0, 0, 0,
">(null)<");
1132 TEST (
">%{/Gs}<",
"", 0, 0,
">\"\"<");
1133 TEST (
">%{/Gs}<",
"a", 0, 0,
">\"a\"<");
1134 TEST (
">%{/Gs}<",
"ab", 0, 0,
">\"ab\"<");
1135 TEST (
">%{/Gs}<",
"abc", 0, 0,
">\"abc\"<");
1136 TEST (
">%{/Gs}<",
"x\0z", 0, 0,
">\"x\"<");
1138 TEST (
">%{/*Gs}<", 1,
"abc", 0,
">\"abc\"<");
1139 TEST (
">%{/*.*Gs}<", 1, 2,
"abc",
">\"ab\"<");
1140 TEST (
">%{/.*Gs}<", 2,
"abc", 0,
">\"ab\"<");
1141 TEST (
">%{/.*Gs}<", 3,
"x\0z", 0,
">\"x\\0z\"<");
1143 TEST (
">%{/*Gs}<", wchsize, (
wchar_t*)0, 0,
">(null)<");
1144 TEST (
">%{/*Gs}<", wchsize,
L"", 0,
">\"\"<");
1145 TEST (
">%{/*Gs}<", wchsize,
L"a", 0,
">\"a\"<");
1146 TEST (
">%{/*Gs}<", wchsize,
L"ab", 0,
">\"ab\"<");
1147 TEST (
">%{/*Gs}<", wchsize,
L"abc", 0,
">\"abc\"<");
1148 TEST (
">%{/*Gs}<", wchsize,
L"x\0z", 0,
">\"x\"<");
1149 TEST (
">%{/*.*Gs}<", wchsize, 2,
L"abc",
">\"ab\"<");
1150 TEST (
">%{/*.*Gs}<", wchsize, 3,
L"x\0z",
">\"x\\0z\"<");
1152#define US(s) make_user_string (s, sizeof (s))
1154 TEST (
">%{/*Gs}<", usrsize, (
UserChar*)0, 0,
">(null)<");
1155 TEST (
">%{/*Gs}<", usrsize,
US (
""), 0,
">\"\"<");
1156 TEST (
">%{/*Gs}<", usrsize,
US (
"a"), 0,
">\"a\"<");
1157 TEST (
">%{/*Gs}<", usrsize,
US (
"ab"), 0,
">\"ab\"<");
1158 TEST (
">%{/*Gs}<", usrsize,
US (
"abc"), 0,
">\"abc\"<");
1159 TEST (
">%{/*Gs}<", usrsize,
US (
"x\0z"), 0,
">\"x\"<");
1160 TEST (
">%{/*.*Gs}<", usrsize, 2,
US (
"abc"),
">\"ab\"<");
1161 TEST (
">%{/*.*Gs}<", usrsize, 3,
US (
"x\0z"),
">\"x\\0z\"<");
1166static int opt_user_traits;
1167static int opt_user_traits_char;
1168static int opt_user_traits_wchar;
1169static int opt_user_traits_user_char;
1170static int opt_rw_widen;
1171static int opt_rw_expand;
1172static int opt_rw_narrow;
1173static int opt_rw_match;
1174static int opt_formatting;
1180 if (opt_user_traits < 0) {
1181 rw_note (0, 0, 0,
"UserTraits tests disabled");
1184 if (opt_user_traits_char < 0) {
1185 rw_note (0, 0, 0,
"UserTraits<char> tests disabled");
1188 test_user_traits_char ();
1191 if (opt_user_traits_wchar < 0) {
1192 rw_note (0, 0, 0,
"UserTraits<wchar_t> tests disabled");
1195 test_user_traits_wchar ();
1198 if (opt_user_traits_user_char < 0) {
1199 rw_note (0, 0, 0,
"UserTraits<UserChar> tests disabled");
1202 test_user_traits_user_char ();
1208 if (opt_ ## fun < 0) \
1209 rw_note (0, 0, 0, "%s() tests disabled", #fun); \
1226 return rw_test (argc, argv, __FILE__,
1231 "|-UserTraits<char>~ "
1232 "|-UserTraits<wchar_t>~ "
1233 "|-UserTraits<UserChar>~ "
1240 &opt_user_traits_char,
1241 &opt_user_traits_wchar,
1242 &opt_user_traits_user_char,
#define TEST(str, expstr)
const MyBuffer< char > nsrc[]
const MyBuffer< wchar_t > wsrc[]
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
_TEST_EXPORT char * rw_expand(char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX, _RWSTD_SIZE_T *=0)
_TEST_EXPORT char * rw_narrow(char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX)
_TEST_EXPORT char * rw_widen(char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX)
_TEST_EXPORT _RWSTD_SIZE_T rw_match(const char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX)
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_warn(int, const char *, int, const char *,...)