// (C) Copyright Jonathan Turkanis 2004 // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) // See http://www.boost.org/libs/iostreams for documentation. #include #ifdef BOOST_IOSTREAMS_NO_WIDE_STREAMS # error wide streams not supported on this platform #endif #include // equal. #include #include #include // BOOST_DEDUCED_TYPENAME. #include #include #include #include #include #include #include #include #include #include "detail/temp_file.hpp" // Include codevct facets #include "detail/null_padded_codecvt.hpp" #include "detail/utf8_codecvt_facet.hpp" #ifdef BOOST_IOSTREAMS_USE_DINKUM_COREX # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include # include #endif // #ifdef BOOST_IOSTREAMS_USE_DINKUM_COREX using namespace std; using namespace boost::iostreams; using namespace boost::iostreams::detail; using namespace boost::iostreams::test; using boost::unit_test::test_suite; const int max_length = 30; const unsigned int string_length = 100; template bool valid_char(typename codecvt_intern::type c) { typedef typename codecvt_state::type state_type; typedef typename codecvt_intern::type intern_type; Codecvt cvt; state_type state = state_type(); const intern_type* nint; char* next; char buf[max_length]; return cvt.out( state, &c, &c + 1, nint, buf, buf + max_length, next ) == codecvt_base::ok; } template basic_string< BOOST_DEDUCED_TYPENAME codecvt_intern::type > test_string() { typedef typename codecvt_intern::type intern_type; std::basic_string result; for (intern_type c = 0; result.size() < string_length; ++c) if (valid_char(c)) result += c; return result; } template bool codecvt_test1() { typedef basic_string< BOOST_DEDUCED_TYPENAME codecvt_intern::type > string_type; typedef code_converter wide_file_source; typedef code_converter wide_file_sink; // Borland needs modes specified separately. BOOST_CHECK(Codecvt().max_length() <= max_length); temp_file temp; string_type test = test_string(); BOOST_IOS::openmode mode = BOOST_IOS::out | BOOST_IOS::binary; stream_facade out(temp.name(), mode); out.write(test.data(), static_cast(test.size())); out.close(); mode = BOOST_IOS::in | BOOST_IOS::binary; stream_facade in(temp.name(), mode); string_type test2; boost::iostreams::copy(in, boost::iostreams::back_inserter(test2)); return test == test2; } template bool codecvt_test2() { typedef basic_string< BOOST_DEDUCED_TYPENAME codecvt_intern::type > string_type; typedef code_converter wide_file_source; typedef code_converter wide_file_sink; // Set global locale. locale loc = add_facet(locale(), new Codecvt); locale::global(loc); // Borland needs modes specified separately. temp_file temp; string_type test = test_string(); BOOST_IOS::openmode mode = BOOST_IOS::out | BOOST_IOS::binary; stream_facade out(temp.name(), mode); out.write(test.data(), static_cast(test.size())); out.close(); mode = BOOST_IOS::in | BOOST_IOS::binary; stream_facade in(temp.name(), mode); string_type test2; boost::iostreams::copy(in, boost::iostreams::back_inserter(test2)); return test == test2; } template bool codecvt_test() { return codecvt_test1() && codecvt_test2(); } void code_converter_test() { BOOST_CHECK((codecvt_test >())); BOOST_CHECK(codecvt_test()); BOOST_CHECK(codecvt_test()); #ifdef BOOST_IOSTREAMS_USE_DINKUM_COREX using namespace Dinkum::conversions; BOOST_CHECK(codecvt_test< codecvt_8859_1 >()); BOOST_CHECK(codecvt_test< codecvt_8859_10 >()); BOOST_CHECK(codecvt_test< codecvt_8859_13 >()); BOOST_CHECK(codecvt_test< codecvt_8859_14 >()); BOOST_CHECK(codecvt_test< codecvt_8859_15 >()); BOOST_CHECK(codecvt_test< codecvt_8859_16 >()); BOOST_CHECK(codecvt_test< codecvt_8859_2 >()); BOOST_CHECK(codecvt_test< codecvt_8859_3 >()); BOOST_CHECK(codecvt_test< codecvt_8859_4 >()); BOOST_CHECK(codecvt_test< codecvt_8859_5 >()); BOOST_CHECK(codecvt_test< codecvt_8859_6 >()); BOOST_CHECK(codecvt_test< codecvt_8859_7 >()); BOOST_CHECK(codecvt_test< codecvt_8859_8 >()); BOOST_CHECK(codecvt_test< codecvt_8859_9 >()); BOOST_CHECK(codecvt_test< codecvt_baltic >()); BOOST_CHECK(codecvt_test< codecvt_big5 >()); BOOST_CHECK(codecvt_test< codecvt_cp037 >()); BOOST_CHECK(codecvt_test< codecvt_cp1006 >()); BOOST_CHECK(codecvt_test< codecvt_cp1026 >()); BOOST_CHECK(codecvt_test< codecvt_cp1250 >()); BOOST_CHECK(codecvt_test< codecvt_cp1251 >()); BOOST_CHECK(codecvt_test< codecvt_cp1252 >()); BOOST_CHECK(codecvt_test< codecvt_cp1253 >()); BOOST_CHECK(codecvt_test< codecvt_cp1254 >()); BOOST_CHECK(codecvt_test< codecvt_cp1255 >()); BOOST_CHECK(codecvt_test< codecvt_cp1256 >()); BOOST_CHECK(codecvt_test< codecvt_cp1257 >()); BOOST_CHECK(codecvt_test< codecvt_cp1258 >()); BOOST_CHECK(codecvt_test< codecvt_cp424 >()); BOOST_CHECK(codecvt_test< codecvt_cp437 >()); BOOST_CHECK(codecvt_test< codecvt_cp500 >()); BOOST_CHECK(codecvt_test< codecvt_cp737 >()); BOOST_CHECK(codecvt_test< codecvt_cp775 >()); BOOST_CHECK(codecvt_test< codecvt_cp850 >()); BOOST_CHECK(codecvt_test< codecvt_cp852 >()); BOOST_CHECK(codecvt_test< codecvt_cp855 >()); BOOST_CHECK(codecvt_test< codecvt_cp856 >()); BOOST_CHECK(codecvt_test< codecvt_cp857 >()); BOOST_CHECK(codecvt_test< codecvt_cp860 >()); BOOST_CHECK(codecvt_test< codecvt_cp861 >()); BOOST_CHECK(codecvt_test< codecvt_cp862 >()); BOOST_CHECK(codecvt_test< codecvt_cp863 >()); BOOST_CHECK(codecvt_test< codecvt_cp864 >()); BOOST_CHECK(codecvt_test< codecvt_cp865 >()); BOOST_CHECK(codecvt_test< codecvt_cp866 >()); BOOST_CHECK(codecvt_test< codecvt_cp869 >()); BOOST_CHECK(codecvt_test< codecvt_cp874 >()); BOOST_CHECK(codecvt_test< codecvt_cp875 >()); BOOST_CHECK(codecvt_test< codecvt_cp932 >()); BOOST_CHECK(codecvt_test< codecvt_cp936 >()); BOOST_CHECK(codecvt_test< codecvt_cp949 >()); BOOST_CHECK(codecvt_test< codecvt_cp950 >()); BOOST_CHECK(codecvt_test< codecvt_cyrillic >()); BOOST_CHECK(codecvt_test< codecvt_ebcdic >()); BOOST_CHECK(codecvt_test< codecvt_euc >()); BOOST_CHECK(codecvt_test< codecvt_euc_0208 >()); BOOST_CHECK(codecvt_test< codecvt_gb12345 >()); BOOST_CHECK(codecvt_test< codecvt_gb2312 >()); BOOST_CHECK(codecvt_test< codecvt_greek >()); BOOST_CHECK(codecvt_test< codecvt_iceland >()); BOOST_CHECK(codecvt_test< codecvt_jis >()); BOOST_CHECK(codecvt_test< codecvt_jis_0208 >()); BOOST_CHECK(codecvt_test< codecvt_jis0201 >()); BOOST_CHECK(codecvt_test< codecvt_ksc5601 >()); BOOST_CHECK(codecvt_test< codecvt_latin2 >()); BOOST_CHECK(codecvt_test< codecvt_one_one >()); BOOST_CHECK(codecvt_test< codecvt_roman >()); BOOST_CHECK(codecvt_test< codecvt_sjis >()); BOOST_CHECK(codecvt_test< codecvt_sjis_0208 >()); BOOST_CHECK(codecvt_test< codecvt_turkish >()); BOOST_CHECK(codecvt_test< codecvt_utf16 >()); BOOST_CHECK(codecvt_test< codecvt_utf8 >()); BOOST_CHECK(codecvt_test< codecvt_utf8_utf16 >()); #endif } test_suite* init_unit_test_suite(int, char* []) { test_suite* test = BOOST_TEST_SUITE("code_converter test"); test->add(BOOST_TEST_CASE(&code_converter_test)); return test; }