// (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) // (C) Copyright 2004-2007 Jonathan Turkanis // 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 #if !defined(__COMO__) || !defined(BOOST_COMO_STRICT) # if defined(BOOST_IOSTREAMS_NO_LIB) || defined(BOOST_ALL_NO_LIB) # include "../src/file_descriptor.cpp" # else # include # endif #endif #include #include #include #include "detail/closable.hpp" #include "detail/operation_sequence.hpp" #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] #include using namespace std; using namespace boost::iostreams; using namespace boost::iostreams::detail; using namespace boost::iostreams::test; using boost::unit_test::test_suite; namespace io = boost::iostreams; const int max_length = 30; const unsigned int pattern_length = 100; const unsigned int pattern_reps = 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 pattern, result; for (intern_type c = 255; pattern.size() < pattern_length; --c) if (valid_char(c)) pattern += c; result.reserve(pattern.size() * pattern_reps); for (unsigned int w = 0; w < pattern_reps; ++w) result += pattern; return result; } // Como can't compile file_descriptor.cpp in strict mode; this failure // is detected by file_descriptor_test.cpp. #if !defined(__COMO__) || !defined(BOOST_COMO_STRICT) typedef io::file_descriptor_source classic_file_source; typedef io::file_descriptor_sink classic_file_sink; #else struct classic_file_source : io::source { classic_file_source(const std::string& path) : file_(new filebuf) { file_->pubimbue(locale::classic()); file_->open(path.c_str(), BOOST_IOS::in | BOOST_IOS::binary); } streamsize read(char* s, streamsize n) { return file_->sgetn(s, n); } boost::shared_ptr file_; }; struct classic_file_sink : io::sink { classic_file_sink(const std::string& path) : file_(new filebuf) { file_->pubimbue(locale::classic()); file_->open(path.c_str(), BOOST_IOS::out | BOOST_IOS::binary); } streamsize write(const char* s, streamsize n) { return file_->sputn(s, n); } boost::shared_ptr file_; }; #endif 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; BOOST_CHECK(Codecvt().max_length() <= max_length); temp_file temp; string_type test = test_string(); stream out(temp.name()); out.write(test.data(), static_cast(test.size())); out.close(); stream in(temp.name()); string_type test2; io::copy(in, io::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); temp_file temp; string_type test = test_string(); stream out(temp.name()); out.write(test.data(), static_cast(test.size())); out.close(); stream in(temp.name()); string_type test2; io::copy(in, io::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 } /* Defer pending further testing void close_test() { typedef utf8_codecvt_facet codecvt_type; // Test code converter based on a source { operation_sequence seq; io::wchain ch; ch.push( code_converter, codecvt_type>( seq.new_operation(1) ) ); BOOST_CHECK_NO_THROW(ch.reset()); BOOST_CHECK_OPERATION_SEQUENCE(seq); } // Test code converter based on a sink { operation_sequence seq; io::wchain ch; ch.push( code_converter, codecvt_type>( seq.new_operation(1) ) ); BOOST_CHECK_NO_THROW(ch.reset()); BOOST_CHECK_OPERATION_SEQUENCE(seq); } // Test code converter based on a bidirectional device { operation_sequence seq; io::wchain ch; ch.push( code_converter, codecvt_type>( seq.new_operation(1), seq.new_operation(2) ) ); BOOST_CHECK_NO_THROW(ch.reset()); BOOST_CHECK_OPERATION_SEQUENCE(seq); } }*/ 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)); //test->add(BOOST_TEST_CASE(&close_test)); return test; }