forked from boostorg/utility
		
	
		
			
				
	
	
		
			185 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  *             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 <boost/utility/string_view.hpp>
 | |
| 
 | |
| #include <iomanip>
 | |
| #include <sstream>
 | |
| #include <algorithm>
 | |
| #include <iterator>
 | |
| #include <string>
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| #include <boost/core/lightweight_test.hpp>
 | |
| 
 | |
| /* 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_view 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<class CharT>
 | |
| void test_string_view_output()
 | |
| {
 | |
|     typedef CharT char_type;
 | |
|     typedef std::basic_ostringstream< char_type > ostream_type;
 | |
|     typedef boost::basic_string_view< char_type > string_view_type;
 | |
| 
 | |
|     context< char_type > ctx;
 | |
| 
 | |
|     ostream_type strm;
 | |
|     strm << string_view_type(ctx.abcd);
 | |
|     BOOST_TEST(strm.str() == ctx.abcd);
 | |
| }
 | |
| 
 | |
| // Test support for padding
 | |
| template<class CharT>
 | |
| void test_padding()
 | |
| {
 | |
|     typedef CharT char_type;
 | |
|     typedef std::basic_ostringstream< char_type > ostream_type;
 | |
|     typedef boost::basic_string_view< char_type > string_view_type;
 | |
| 
 | |
|     context< char_type > ctx;
 | |
| 
 | |
|     // Test for padding
 | |
|     {
 | |
|         ostream_type strm_ref;
 | |
|         strm_ref << ctx.begin << std::setw(8) << string_view_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_view_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_view_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<class CharT>
 | |
| void test_padding_fill()
 | |
| {
 | |
|     typedef CharT char_type;
 | |
|     typedef std::basic_ostringstream< char_type > ostream_type;
 | |
|     typedef boost::basic_string_view< char_type > string_view_type;
 | |
| 
 | |
|     context< char_type > ctx;
 | |
| 
 | |
|     ostream_type strm_ref;
 | |
|     strm_ref << ctx.begin << std::setfill(static_cast< char_type >('x')) << std::setw(8) << string_view_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<class CharT>
 | |
| void test_alignment()
 | |
| {
 | |
|     typedef CharT char_type;
 | |
|     typedef std::basic_ostringstream< char_type > ostream_type;
 | |
|     typedef boost::basic_string_view< char_type > string_view_type;
 | |
| 
 | |
|     context< char_type > ctx;
 | |
| 
 | |
|     // Left alignment
 | |
|     {
 | |
|         ostream_type strm_ref;
 | |
|         strm_ref << ctx.begin << std::left << std::setw(8) << string_view_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_view_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<class CharT>
 | |
| void test()
 | |
| {
 | |
|     test_string_view_output<CharT>();
 | |
|     test_padding<CharT>();
 | |
|     test_padding_fill<CharT>();
 | |
|     test_alignment<CharT>();
 | |
| }
 | |
| 
 | |
| int main()
 | |
| {
 | |
|     test<char>();
 | |
|     test<wchar_t>();
 | |
|     return boost::report_errors();
 | |
| }
 |