51typedef std::codecvt<char, char, std::mbstate_t>
Codecvt;
54#ifndef _RWSTD_NO_WCHAR_T
56typedef std::codecvt<wchar_t, char, std::mbstate_t>
WCodecvt;
72 if (
rw_snprintf (cm_fname,
sizeof cm_fname,
"%s%c%s",
76 static const char charmap[] = {
77 "<code_set_name> test_charmap\n"
85 "<U0002> /x32/x32 22 \n"
86 "<U0003> /x33/x33/x33 333 \n"
87 "<U0004> /x34/x34/x34/x34 4444 \n"
88 "<U0005> /x35/x35/x35/x35/x35 55555 \n"
89 "<U0006> /x36/x36/x36/x36/x36/x36 666666 \n"
90 "<U0007> /x37/x37/x37/x37/x37/x37/x37 7777777 \n"
91 "<U0008> /x38/x38/x38/x38/x38/x38/x38/x38 88888888 \n"
92 "<U0009> /x39/x39/x39/x39/x39/x39/x39/x39/x39 999999999 \n"
99 if (std::size_t (-1) ==
rw_fwrite (cm_fname, charmap))
102 char src_fname [1024];
103 if (
rw_snprintf (src_fname,
sizeof src_fname,
"%s%c%s",
107 if (std::size_t (-1) ==
rw_fwrite (src_fname,
"LC_CTYPE\nEND LC_CTYPE\n"))
116 const char*
const locname =
118 src_fname, cm_fname,
"mb_cur_max-9");
125template <
class internT>
128 const std::mbstate_t *pstate,
129 const std::codecvt<internT, char, std::mbstate_t> &
cvt,
135 static const std::mbstate_t initial_state = std::mbstate_t ();
139 std::mbstate_t state = pstate ? *pstate : initial_state;
141 if (std::size_t (-1) ==
nchars)
142 nchars = std::strlen (from);
144 const int res =
cvt.length (state, from, from +
nchars, maxi);
147 "line %d: codecvt<%s, char, mbstate_t>::length("
148 "state, from=%{*s}, from + %zu, %d) == %d, got %d",
151 rw_assert (!pstate || 0 == std::memcmp (pstate, &state,
sizeof state),
153 "line %d: codecvt<%s, char, mbstate_t>::length("
154 "state, from=%{*s}, from + %zu, %d) unexpected state",
155 __LINE__, tname, from,
nchars, maxi);
164 "std::codecvt<char, char, mbstate_t>::length "
165 "(state_type&, const extern_type*, const "
166 "extern_type*, size_t)");
168 const std::locale classic = std::locale::classic ();
170 const Codecvt &
cvt = pcvt ? *pcvt : std::use_facet<Codecvt>(classic);
173#define TEST(from, nchars, maxi, result) \
174 test_length (char (), __LINE__, 0, cvt, from, nchars, maxi, result)
185 TEST (
"ab", 2, 1, 1);
186 TEST (
"ab", 2, 2, 2);
187 TEST (
"ab", 2, 3, 2);
188 TEST (
"abc", 3, 0, 0);
189 TEST (
"abc", 3, 1, 1);
190 TEST (
"abc", 3, 2, 2);
191 TEST (
"abc", 3, 3, 3);
192 TEST (
"abc", 3, 4, 3);
198test_codecvt_byname ()
201 "std::codecvt_byname<char, char, mbstate_t>::length "
202 "(state_type&, const extern_type*, const extern_type*, "
217 "std::codecvt<wchar_t, char, mbstate_t>::length "
218 "(state_type&, const extern_type*, const extern_type*, "
221#ifndef _RWSTD_NO_WCHAR_T
223 const std::locale classic = std::locale::classic ();
225 const WCodecvt &
cvt = std::use_facet<WCodecvt>(classic);
228#define TEST(from, nchars, maxi, result) \
229 test_length (wchar_t (), __LINE__, 0, cvt, from, nchars, maxi, result)
240 TEST (
"ab", 2, 1, 1);
241 TEST (
"ab", 2, 2, 2);
242 TEST (
"ab", 2, 3, 2);
243 TEST (
"abc", 3, 0, 0);
244 TEST (
"abc", 3, 1, 1);
245 TEST (
"abc", 3, 2, 2);
246 TEST (
"abc", 3, 3, 3);
247 TEST (
"abc", 3, 4, 3);
251 rw_warn (0, 0, __LINE__,
"_RWSTD_NO_WCHAR_T #defined, cannot test");
259#ifndef _RWSTD_NO_WCHAR_T
263test_wcodecvt_byname_algorithmic ()
265 rw_info (0, 0, 0,
"locale (\"UTF-8@UCS\") [algorithmic encoding]");
275#define STRICT(from, nc, maxi, res) \
276 test_length (wchar_t (), __LINE__, 0, cvt_strict, from, nc, maxi, res)
279#define RELAXD(from, nc, maxi, res) \
280 test_length (wchar_t (), __LINE__, 0, cvt_relaxd, from, nc, maxi, res)
283#define TEST(from, nc, maxi, res) \
284 STRICT (from, nc, maxi, res); \
285 RELAXD (from, nc, maxi, res)
318 TEST (
"ab", 2, 1, 1);
319 TEST (
"ab", 2, 2, 2);
320 TEST (
"ab", 2, 3, 2);
321 TEST (
"abc", 3, 0, 0);
322 TEST (
"abc", 3, 1, 1);
323 TEST (
"abc", 3, 2, 2);
324 TEST (
"abc", 3, 3, 3);
325 TEST (
"abc", 3, 4, 3);
328 TEST (
"\x80", 1, 0, 0);
329 TEST (
"\xc0", 1, 0, 0);
330 TEST (
"\x80\x00", 2, 0, 0);
331 TEST (
"\xc0\x00", 2, 0, 0);
337 TEST (
"\xc2", 1, 0, 0);
338 TEST (
"\xc2\x81", 1, 1, 0);
339 TEST (
"\xc2\x82", 2, 1, 2);
340 TEST (
"\xc2\x83", 2, 2, 2);
345 STRICT (
"\xc2\x01", 2, 1, 0);
346 RELAXD (
"\xc2\x01", 2, 1, 2);
348 TEST (
"\xc2\x80\xc0", 3, 0, 0);
349 TEST (
"\xc2\x80\xc0\x81", 3, 1, 2);
350 TEST (
"\xc2\x80\xc0\x82", 3, 2, 2);
352 STRICT (
"\xc2\x80\xc2\x01", 4, 2, 2);
353 RELAXD (
"\xc2\x80\xc2\x01", 4, 2, 4);
355 TEST (
"\xc2\x80\xc2\x81", 4, 0, 0);
356 TEST (
"\xc2\x80\xc2\x82", 4, 1, 2);
357 TEST (
"\xc2\x80\xc2\x83", 4, 2, 4);
358 TEST (
"\xc2\x80\xc2\x84", 4, 3, 4);
364test_wcodecvt_byname_table_based ()
368 if (!
rw_error (0 != locname, 0, __LINE__,
369 "failed to create a locale database")) {
376 loc = std::locale (locname);
380 "locale(\"%s\") unexpectedly threw an exception", locname);
384 const WCodecvt &cvt_table = std::use_facet<WCodecvt>(
loc);
386 rw_info (0, 0, 0,
"locale (\"%s\") [table-based encoding]", locname);
389#define TEST(from, nc, maxi, res) \
390 test_length (wchar_t (), __LINE__, 0, cvt_table, \
391 from, std::size_t (nc), maxi, res)
396 TEST (
"AB", 2, 1, 1);
397 TEST (
"AB", 2, 2, 2);
398 TEST (
"AB", 2, 3, 2);
399 TEST (
"ABC", 3, 0, 0);
400 TEST (
"ABC", 3, 1, 1);
401 TEST (
"ABC", 3, 2, 2);
402 TEST (
"ABC", 3, 3, 3);
403 TEST (
"ABC", 3, 4, 3);
405 TEST (
"22", 1, 1, 0);
406 TEST (
"22", 2, 1, 2);
407 TEST (
"22", 2, 2, 2);
409 TEST (
"333", 1, 1, 0);
410 TEST (
"333", 2, 1, 0);
411 TEST (
"333", 3, 1, 3);
412 TEST (
"333", 3, 2, 3);
414 TEST (
"4444", 1, 1, 0);
415 TEST (
"4444", 2, 1, 0);
416 TEST (
"4444", 3, 1, 0);
417 TEST (
"4444", 4, 1, 4);
418 TEST (
"4444", 4, 2, 4);
420 TEST (
"122", 1, 0, 0);
421 TEST (
"122", 1, 1, 1);
422 TEST (
"122", 1, 2, 1);
423 TEST (
"122", 2, 2, 1);
424 TEST (
"122", 3, 2, 3);
425 TEST (
"122", 3, 3, 3);
427 TEST (
"122333", 1, 0, 0);
428 TEST (
"122333", 1, 1, 1);
429 TEST (
"122333", 1, 2, 1);
430 TEST (
"122333", 4, 1, 1);
431 TEST (
"122333", 4, 2, 3);
432 TEST (
"122333", 4, 3, 3);
433 TEST (
"122333", 5, 1, 1);
434 TEST (
"122333", 5, 2, 3);
435 TEST (
"122333", 5, 3, 3);
436 TEST (
"122333", 5, 1, 1);
437 TEST (
"122333", 5, 2, 3);
438 TEST (
"122333", 5, 3, 3);
439 TEST (
"122333", 6, 1, 1);
440 TEST (
"122333", 6, 2, 3);
441 TEST (
"122333", 6, 3, 6);
442 TEST (
"122333", 6, 4, 6);
447 TEST (
"4444A55555B666666C77777770333122", -1, 1, 4);
448 TEST (
"4444A55555B666666C77777770333122", -1, 2, 5);
449 TEST (
"4444A55555B666666C77777770333122", -1, 3, 10);
450 TEST (
"4444A55555B666666C77777770333122", -1, 4, 11);
451 TEST (
"4444A55555B666666C77777770333122", -1, 5, 17);
452 TEST (
"4444A55555B666666C77777770333122", -1, 6, 18);
453 TEST (
"4444A55555B666666C77777770333122", -1, 7, 25);
454 TEST (
"4444A55555B666666C77777770333122", -1, 8, 26);
455 TEST (
"4444A55555B666666C77777770333122", -1, 9, 29);
456 TEST (
"4444A55555B666666C77777770333122", -1, 10, 30);
457 TEST (
"4444A55555B666666C77777770333122", -1, 11, 32);
459 TEST (
"4444.55555B666666C77777770333122", -1, 11, 4);
460 TEST (
"4444A55555.666666C77777770333122", -1, 11, 10);
461 TEST (
"4444A55555B666666.77777770333122", -1, 11, 17);
462 TEST (
"4444A55555B666666C7777777.333122", -1, 11, 25);
463 TEST (
"4444A55555B666666C77777770333.22", -1, 11, 29);
469test_wcodecvt_byname_libc_based ()
480 std::size_t mb_cur_max = 0;
486 if (!
rw_warn (0 != locname, 0, __LINE__,
487 "failed to find a multibyte locale")) {
494 loc = std::locale (locname);
498 "locale(\"%s\") unexpectedly threw an exception", locname);
502 const WCodecvt &cvt_libc = std::use_facet<WCodecvt>(
loc);
504 rw_info (0, 0, 0,
"locale (\"%s\") [libc-based encoding, "
505 "single-byte characters]", locname);
511#define TEST(from, nc, maxi, res) \
512 test_length (wchar_t (), __LINE__, 0, cvt_libc, \
513 from, std::size_t (nc), maxi, res)
518 TEST (
"AB", 2, 1, 1);
519 TEST (
"AB", 2, 2, 2);
520 TEST (
"AB", 2, 3, 2);
521 TEST (
"ABC", 3, 0, 0);
522 TEST (
"ABC", 3, 1, 1);
523 TEST (
"ABC", 3, 2, 2);
524 TEST (
"ABC", 3, 3, 3);
525 TEST (
"ABC", 3, 4, 3);
528 TEST (
"\0BC", 3, 3, 3);
529 TEST (
"A\0C", 3, 3, 3);
530 TEST (
"AB\0", 3, 3, 3);
531 TEST (
"\0\0C", 3, 3, 3);
532 TEST (
"A\0\0", 3, 3, 3);
533 TEST (
"\0B\0", 3, 3, 3);
534 TEST (
"\0\0\0", 3, 3, 3);
539 if (!
rw_warn (2 <= mb_cur_max, 0, __LINE__,
540 "no multibyte characters found, skipping test")) {
547 for (std::size_t
i = 0;
i < mb_cur_max; ++
i) {
548 const std::size_t mb_len = std::strlen (mb_chars [
i]);
550 if (!
rw_error (
i + 1 == mb_len, 0, __LINE__,
551 "unexpected multibyte character length: "
552 "%zu, expected %zu", mb_len,
i + 1)) {
557 sequences ? sequences :
"",
558 i ?
", " :
"", mb_chars [
i]);
561 rw_info (0, 0, 0,
"locale (\"%s\") [libc-based encoding, "
562 "MB_CUR_MAX = %zu, multi-byte characters: %s]",
563 locname, mb_cur_max, sequences);
565 std::free (sequences);
567#ifdef _RWSTD_OS_SUNOS
569 if (!
rw_warn (std::strcmp (
"5.7", _RWSTD_OS_RELEASE), 0, __LINE__,
570 "skipping tests due to a SunOS 5.7 libc bug")) {
576 char mb_string [256];
579 rw_sprintf (mb_string,
"%s%s", mb_chars [0], mb_chars [1]);
587 TEST (mb_string, 0, 0, 0);
588 TEST (mb_string, 1, 1, 1);
589 TEST (mb_string, 1, 1, 1);
590 TEST (mb_string, 2, 1, 1);
591 TEST (mb_string, 2, 2, 1);
592 TEST (mb_string, 3, 1, 1);
593 TEST (mb_string, 3, 2, 3);
594 TEST (mb_string, 3, 3, 3);
596 TEST (mb_string, 3, -1, 3);
599 rw_sprintf (mb_string,
"%c%s%s",
'\0', mb_chars [0], mb_chars [1]);
600 TEST (mb_string, 4, 3, 4);
602 rw_sprintf (mb_string,
"%s%c%s", mb_chars [0],
'\0', mb_chars [1]);
603 TEST (mb_string, 4, 3, 4);
605 rw_sprintf (mb_string,
"%s%s%c", mb_chars [0], mb_chars [1],
'\0');
606 TEST (mb_string, 4, 3, 4);
608 rw_sprintf (mb_string,
"%c%c%s",
'\0',
'\0', mb_chars [0]);
609 TEST (mb_string, 3, 3, 3);
611 rw_sprintf (mb_string,
"%c%c%s",
'\0',
'\0', mb_chars [1]);
612 TEST (mb_string, 4, 3, 4);
624 mb_chars [2], mb_chars [1], mb_chars [0]);
626 TEST (mb_string, 0, 3, 0);
627 TEST (mb_string, 1, 3, 0);
628 TEST (mb_string, 2, 3, 0);
629 TEST (mb_string, 3, 3, 3);
630 TEST (mb_string, 4, 3, 3);
631 TEST (mb_string, 5, 3, 5);
632 TEST (mb_string, 6, 3, 6);
633 TEST (mb_string, 6, 4, 6);
634 TEST (mb_string, 6, -1, 6);
646 mb_chars [3], mb_chars [2], mb_chars [1], mb_chars [0]);
648 TEST (mb_string, 0, 4, 0);
649 TEST (mb_string, 1, 4, 0);
650 TEST (mb_string, 2, 4, 0);
651 TEST (mb_string, 3, 4, 0);
652 TEST (mb_string, 4, 4, 4);
653 TEST (mb_string, 5, 4, 4);
654 TEST (mb_string, 6, 4, 4);
655 TEST (mb_string, 7, 4, 7);
656 TEST (mb_string, 8, 4, 7);
657 TEST (mb_string, 9, 4, 9);
658 TEST (mb_string, 10, 4, 10);
659 TEST (mb_string, 10, 5, 10);
660 TEST (mb_string, 10, -1, 10);
672 mb_chars [4], mb_chars [3], mb_chars [2], mb_chars [1],
675 TEST (mb_string, 0, 5, 0);
676 TEST (mb_string, 1, 5, 0);
677 TEST (mb_string, 2, 5, 0);
678 TEST (mb_string, 3, 5, 0);
679 TEST (mb_string, 4, 5, 0);
680 TEST (mb_string, 5, 5, 5);
681 TEST (mb_string, 6, 5, 5);
682 TEST (mb_string, 7, 5, 5);
683 TEST (mb_string, 8, 5, 5);
684 TEST (mb_string, 9, 5, 9);
685 TEST (mb_string, 10, 5, 9);
686 TEST (mb_string, 11, 5, 9);
687 TEST (mb_string, 12, 5, 12);
688 TEST (mb_string, 13, 5, 12);
689 TEST (mb_string, 14, 5, 14);
690 TEST (mb_string, 15, 5, 15);
691 TEST (mb_string, 15, 6, 15);
692 TEST (mb_string, 15, -1, 15);
697 mb_chars [4], mb_chars [4], mb_chars [4], mb_chars [4],
700 TEST (mb_string, 5, 5, 5);
701 TEST (mb_string, 6, 5, 5);
702 TEST (mb_string, 9, 5, 5);
703 TEST (mb_string, 10, 1, 5);
704 TEST (mb_string, 10, 2, 10);
705 TEST (mb_string, 10, 5, 10);
706 TEST (mb_string, 11, 5, 10);
707 TEST (mb_string, 14, 5, 10);
708 TEST (mb_string, 15, 5, 15);
711 mb_chars [4], mb_chars [0], mb_chars [4], mb_chars [4],
717 TEST (mb_string, 5, 5, 5);
718 TEST (mb_string, 6, 5, 6);
719 TEST (mb_string, 7, 5, 6);
720 TEST (mb_string, 8, 5, 6);
721 TEST (mb_string, 9, 5, 6);
722 TEST (mb_string, 10, 5, 6);
723 TEST (mb_string, 11, 5, 11);
724 TEST (mb_string, 12, 5, 11);
725 TEST (mb_string, 15, 5, 11);
726 TEST (mb_string, 16, 5, 16);
727 TEST (mb_string, 21, 5, 21);
734test_wcodecvt_byname ()
737 "std::codecvt_byname<wchar_t, char, mbstate_t>::length "
738 "(state_type&, const extern_type*, const extern_type*, "
741#ifndef _RWSTD_NO_WCHAR_T
743 test_wcodecvt_byname_algorithmic ();
744 test_wcodecvt_byname_table_based ();
745 test_wcodecvt_byname_libc_based ();
749 rw_warn (0, 0, __LINE__,
"_RWSTD_NO_WCHAR_T #defined, cannot test");
757static int no_codecvt;
758static int no_codecvt_byname;
759static int no_wcodecvt;
760static int no_wcodecvt_byname;
773 rw_note (0, 0, __LINE__, "%s test disabled", #what); \
777 } typedef void unused_typedef
782 TEST (codecvt_byname);
785 rw_note (0, 0, 0,
"char tests disabled");
790 TEST (wcodecvt_byname);
793 rw_note (0, 0, 0,
"wchar_t tests disabled");
801int main (
int argc,
char *argv[])
803 return rw_test (argc, argv, __FILE__,
804 "lib.locale.codecvt.virtuals",
807 "|-no-codecvt_byname# "
809 "|-no-wcodecvt_byname# ",
813 &no_wcodecvt_byname);
std::codecvt< char, char, std::mbstate_t > Codecvt
std::codecvt< char, char, std::mbstate_t > Codecvt
std::codecvt< wchar_t, char, std::mbstate_t > WCodecvt
std::codecvt_byname< wchar_t, char, std::mbstate_t > WCodecvtByname
const char * create_locale()
#define STRICT(from, nc, maxi, res)
std::codecvt_byname< char, char, std::mbstate_t > CodecvtByname
void test_codecvt(const Codecvt *pcvt=0)
#define RELAXD(from, nc, maxi, res)
#define TEST(from, nchars, maxi, result)
void test_length(internT, int line, const std::mbstate_t *pstate, const std::codecvt< internT, char, std::mbstate_t > &cvt, const char *from, std::size_t nchars, int maxi, int result)
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
const char * type_name() const
_TEST_EXPORT int rw_enabled(const char *name)
_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_error(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_warn(int, const char *, int, const char *,...)
_TEST_EXPORT _RWSTD_SIZE_T rw_fwrite(const char *, const void *, _RWSTD_SIZE_T=~0, const char *="w")
_TEST_EXPORT const char * rw_set_locale_root()
_TEST_EXPORT const char * rw_localedef(const char *, const char *, const char *, const char *)
char rw_mbchar_array_t[_RWSTD_MB_LEN_MAX][_RWSTD_MB_LEN_MAX]
_TEST_EXPORT const char * rw_find_mb_locale(_RWSTD_SIZE_T *, rw_mbchar_array_t)
_TEST_EXPORT char * rw_sprintfa(const char *fmt,...)
_TEST_EXPORT int rw_snprintf(char *, _RWSTD_SIZE_T, const char *,...)
_TEST_EXPORT int rw_sprintf(char *, const char *,...)