• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   *             Copyright Andrey Semashev 2013.
3   * Distributed under the Boost Software License, Version 1.0.
4   *    (See accompanying file LICENSE_1_0.txt or copy at
5   *          http://www.boost.org/LICENSE_1_0.txt)
6   */
7  /*!
8   * \file   string_ref_test_io.cpp
9   * \author Andrey Semashev
10   * \date   26.05.2013
11   *
12   * \brief  This header contains tests for stream operations of \c basic_string_ref.
13   */
14  
15  #include <boost/utility/string_ref.hpp>
16  
17  #include <iomanip>
18  #include <sstream>
19  #include <algorithm>
20  #include <iterator>
21  #include <string>
22  
23  #include <boost/config.hpp>
24  #include <boost/core/lightweight_test.hpp>
25  
26  /* Current implementations seem to be missing codecvt facets to convert chars to char16_t and char32_t even though the types are available.
27  */
28  
29  static const char* test_strings[] =
30  {
31      "begin",
32      "abcd",
33      "end"
34  };
35  
36  //! The context with test data for particular character type
37  template< typename CharT >
38  struct context
39  {
40      typedef CharT char_type;
41      typedef std::basic_string< char_type > string_type;
42      typedef std::basic_ostringstream< char_type > ostream_type;
43  
44      string_type begin, abcd, end;
45  
contextcontext46      context()
47      {
48          boost::string_ref str = test_strings[0];
49          std::copy(str.begin(), str.end(), std::back_inserter(begin));
50  
51          str = test_strings[1];
52          std::copy(str.begin(), str.end(), std::back_inserter(abcd));
53  
54          str = test_strings[2];
55          std::copy(str.begin(), str.end(), std::back_inserter(end));
56      }
57  };
58  
59  // Test regular output
60  template<class CharT>
test_string_ref_output()61  void test_string_ref_output()
62  {
63      typedef CharT char_type;
64      typedef std::basic_ostringstream< char_type > ostream_type;
65      typedef boost::basic_string_ref< char_type > string_ref_type;
66  
67      context< char_type > ctx;
68  
69      ostream_type strm;
70      strm << string_ref_type(ctx.abcd);
71      BOOST_TEST(strm.str() == ctx.abcd);
72  }
73  
74  // Test support for padding
75  template<class CharT>
test_padding()76  void test_padding()
77  {
78      typedef CharT char_type;
79      typedef std::basic_ostringstream< char_type > ostream_type;
80      typedef boost::basic_string_ref< char_type > string_ref_type;
81  
82      context< char_type > ctx;
83  
84      // Test for padding
85      {
86          ostream_type strm_ref;
87          strm_ref << ctx.begin << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end;
88  
89          ostream_type strm_correct;
90          strm_correct << ctx.begin << std::setw(8) << ctx.abcd << ctx.end;
91  
92          BOOST_TEST(strm_ref.str() == strm_correct.str());
93      }
94  
95      // Test for long padding
96      {
97          ostream_type strm_ref;
98          strm_ref << ctx.begin << std::setw(100) << string_ref_type(ctx.abcd) << ctx.end;
99  
100          ostream_type strm_correct;
101          strm_correct << ctx.begin << std::setw(100) << ctx.abcd << ctx.end;
102  
103          BOOST_TEST(strm_ref.str() == strm_correct.str());
104      }
105  
106      // Test that short width does not truncate the string
107      {
108          ostream_type strm_ref;
109          strm_ref << ctx.begin << std::setw(1) << string_ref_type(ctx.abcd) << ctx.end;
110  
111          ostream_type strm_correct;
112          strm_correct << ctx.begin << std::setw(1) << ctx.abcd << ctx.end;
113  
114          BOOST_TEST(strm_ref.str() == strm_correct.str());
115      }
116  }
117  
118  // Test support for padding fill
119  template<class CharT>
test_padding_fill()120  void test_padding_fill()
121  {
122      typedef CharT char_type;
123      typedef std::basic_ostringstream< char_type > ostream_type;
124      typedef boost::basic_string_ref< char_type > string_ref_type;
125  
126      context< char_type > ctx;
127  
128      ostream_type strm_ref;
129      strm_ref << ctx.begin << std::setfill(static_cast< char_type >('x')) << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end;
130  
131      ostream_type strm_correct;
132      strm_correct << ctx.begin << std::setfill(static_cast< char_type >('x')) << std::setw(8) << ctx.abcd << ctx.end;
133  
134      BOOST_TEST(strm_ref.str() == strm_correct.str());
135  }
136  
137  // Test support for alignment
138  template<class CharT>
test_alignment()139  void test_alignment()
140  {
141      typedef CharT char_type;
142      typedef std::basic_ostringstream< char_type > ostream_type;
143      typedef boost::basic_string_ref< char_type > string_ref_type;
144  
145      context< char_type > ctx;
146  
147      // Left alignment
148      {
149          ostream_type strm_ref;
150          strm_ref << ctx.begin << std::left << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end;
151  
152          ostream_type strm_correct;
153          strm_correct << ctx.begin << std::left << std::setw(8) << ctx.abcd << ctx.end;
154  
155          BOOST_TEST(strm_ref.str() == strm_correct.str());
156      }
157  
158      // Right alignment
159      {
160          ostream_type strm_ref;
161          strm_ref << ctx.begin << std::right << std::setw(8) << string_ref_type(ctx.abcd) << ctx.end;
162  
163          ostream_type strm_correct;
164          strm_correct << ctx.begin << std::right << std::setw(8) << ctx.abcd << ctx.end;
165  
166          BOOST_TEST(strm_ref.str() == strm_correct.str());
167      }
168  }
169  
170  template<class CharT>
test()171  void test()
172  {
173      test_string_ref_output<CharT>();
174      test_padding<CharT>();
175      test_padding_fill<CharT>();
176      test_alignment<CharT>();
177  }
178  
main()179  int main()
180  {
181      test<char>();
182      test<wchar_t>();
183      return boost::report_errors();
184  }
185