/* * Copyright Andrey Semashev 2013. * 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) */ /*! * \file string_ref_test_io.cpp * \author Andrey Semashev * \date 26.05.2013 * * \brief This header contains tests for stream operations of \c basic_string_ref. */ #include #include #include #include #include #include #include #include /* Current implementations seem to be missing codecvt facets to convert chars to char16_t and char32_t even though the types are available. */ static const char* test_strings[] = { "begin", "abcd", "end" }; //! The context with test data for particular character type template< typename CharT > struct context { typedef CharT char_type; typedef std::basic_string< char_type > string_type; typedef std::basic_ostringstream< char_type > ostream_type; string_type begin, abcd, end; context() { boost::string_ref str = test_strings[0]; std::copy(str.begin(), str.end(), std::back_inserter(begin)); str = test_strings[1]; std::copy(str.begin(), str.end(), std::back_inserter(abcd)); str = test_strings[2]; std::copy(str.begin(), str.end(), std::back_inserter(end)); } }; // Test regular output template void test_string_ref_output() { typedef CharT char_type; typedef std::basic_ostringstream< char_type > ostream_type; typedef boost::basic_string_ref< char_type > string_ref_type; context< char_type > ctx; ostream_type strm; strm << string_ref_type(ctx.abcd); BOOST_TEST(strm.str() == ctx.abcd); } // Test support for padding template void test_padding() { typedef CharT char_type; typedef std::basic_ostringstream< char_type > ostream_type; typedef boost::basic_string_ref< char_type > string_ref_type; context< char_type > ctx; // Test for padding { ostream_type strm_ref; strm_ref << ctx.begin << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end; ostream_type strm_correct; strm_correct << ctx.begin << std::setw(8) << ctx.abcd << ctx.end; BOOST_TEST(strm_ref.str() == strm_correct.str()); } // Test for long padding { ostream_type strm_ref; strm_ref << ctx.begin << std::setw(100) << string_ref_type(ctx.abcd) << ctx.end; ostream_type strm_correct; strm_correct << ctx.begin << std::setw(100) << ctx.abcd << ctx.end; BOOST_TEST(strm_ref.str() == strm_correct.str()); } // Test that short width does not truncate the string { ostream_type strm_ref; strm_ref << ctx.begin << std::setw(1) << string_ref_type(ctx.abcd) << ctx.end; ostream_type strm_correct; strm_correct << ctx.begin << std::setw(1) << ctx.abcd << ctx.end; BOOST_TEST(strm_ref.str() == strm_correct.str()); } } // Test support for padding fill template void test_padding_fill() { typedef CharT char_type; typedef std::basic_ostringstream< char_type > ostream_type; typedef boost::basic_string_ref< char_type > string_ref_type; context< char_type > ctx; ostream_type strm_ref; strm_ref << ctx.begin << std::setfill(static_cast< char_type >('x')) << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end; ostream_type strm_correct; strm_correct << ctx.begin << std::setfill(static_cast< char_type >('x')) << std::setw(8) << ctx.abcd << ctx.end; BOOST_TEST(strm_ref.str() == strm_correct.str()); } // Test support for alignment template void test_alignment() { typedef CharT char_type; typedef std::basic_ostringstream< char_type > ostream_type; typedef boost::basic_string_ref< char_type > string_ref_type; context< char_type > ctx; // Left alignment { ostream_type strm_ref; strm_ref << ctx.begin << std::left << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end; ostream_type strm_correct; strm_correct << ctx.begin << std::left << std::setw(8) << ctx.abcd << ctx.end; BOOST_TEST(strm_ref.str() == strm_correct.str()); } // Right alignment { ostream_type strm_ref; strm_ref << ctx.begin << std::right << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end; ostream_type strm_correct; strm_correct << ctx.begin << std::right << std::setw(8) << ctx.abcd << ctx.end; BOOST_TEST(strm_ref.str() == strm_correct.str()); } } template void test() { test_string_ref_output(); test_padding(); test_padding_fill(); test_alignment(); } int main() { test(); test(); return boost::report_errors(); }