1 // (C) Copyright Gennadiy Rozental 2001-2008.
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
6 // See http://www.boost.org/libs/test for the library home page.
10 // Version : $Revision$
12 // Description : basic_cstring unit test
13 // *****************************************************************************
16 #pragma warning(disable: 4996)
20 #include <boost/test/unit_test.hpp>
21 #include <boost/test/test_case_template.hpp>
23 #include <boost/test/utils/basic_cstring/basic_cstring.hpp>
24 #include <boost/test/utils/basic_cstring/compare.hpp>
25 #include <boost/test/utils/basic_cstring/io.hpp>
26 #include <boost/test/output_test_stream.hpp>
27 namespace utf
= boost::unit_test
;
28 namespace tt
= boost::test_tools
;
29 using utf::const_string
;
32 #include <boost/mpl/list.hpp>
33 #include <boost/mpl/joint_view.hpp>
34 #include <boost/mpl/transform.hpp>
35 #include <boost/type_traits/add_const.hpp>
44 namespace mpl
= boost::mpl
;
46 #if defined(BOOST_NO_STD_WSTRING)
47 typedef mpl::list1
<char const> base_const_char_types
;
48 typedef mpl::list2
<char,unsigned char> mutable_char_types
;
50 typedef mpl::list2
<char const,wchar_t const> base_const_char_types
;
51 typedef mpl::list3
<char,unsigned char,wchar_t> mutable_char_types
;
53 typedef mpl::transform
<mutable_char_types
,boost::add_const
<mpl::_1
> >::type const_char_types
;
54 typedef mpl::joint_view
<const_char_types
,mutable_char_types
> char_types
;
55 typedef mpl::list2
<char,const char> io_test_types
;
57 //____________________________________________________________________________//
59 template<typename CharT
>
62 typedef typename
boost::remove_const
<CharT
>::type mutable_char
;
64 string_literal( char const* orig
, std::size_t orig_size
)
66 std::copy( orig
, orig
+ orig_size
, buff
);
71 mutable_char buff
[100];
74 #define LITERAL( s ) (CharT*)string_literal<CharT>( s, sizeof( s ) ).buff
75 #define LOCAL_DEF( name, s ) \
76 string_literal<CharT> BOOST_JOIN( sl, __LINE__)(s, sizeof( s )); \
77 utf::basic_cstring<CharT> name( (CharT*)(BOOST_JOIN( sl, __LINE__).buff) ) \
80 #define TEST_STRING test_string<CharT>( (CharT*)0 )
82 template<typename CharT
>
84 test_string( CharT
* = 0 )
86 static string_literal
<CharT
> l( "test_string", 11 );
91 //____________________________________________________________________________//
93 BOOST_TEST_CASE_TEMPLATE_FUNCTION( constructors_test
, CharT
)
96 utf::basic_cstring
<CharT
> bcs
;
97 BOOST_CHECK_EQUAL( bcs
.size(), (unsigned)0 );
98 BOOST_CHECK( bcs
.is_empty() );
102 utf::basic_cstring
<CharT
> bcs( utf::basic_cstring
<CharT
>::null_str() );
103 BOOST_CHECK_EQUAL( bcs
.size(), (unsigned)0 );
104 BOOST_CHECK( bcs
.is_empty() );
108 utf::basic_cstring
<CharT
> bcs( 0 );
109 BOOST_CHECK_EQUAL( bcs
.size(), (unsigned)0 );
110 BOOST_CHECK( bcs
.is_empty() );
114 typedef typename
utf::basic_cstring
<CharT
>::traits_type traits
;
116 utf::basic_cstring
<CharT
> bcs( TEST_STRING
);
117 BOOST_CHECK_EQUAL( traits::compare( bcs
.begin(), TEST_STRING
, bcs
.size() ), 0 );
118 BOOST_CHECK_EQUAL( bcs
.size(), traits::length( TEST_STRING
) );
120 utf::basic_cstring
<CharT
> bcs1( bcs
);
121 BOOST_CHECK_EQUAL( traits::compare( bcs1
.begin(), TEST_STRING
, bcs1
.size() ), 0 );
125 typedef typename
utf::basic_cstring
<CharT
>::traits_type traits
;
127 utf::basic_cstring
<CharT
> bcs( TEST_STRING
, 4 );
128 BOOST_CHECK_EQUAL( traits::compare( bcs
.begin(), LITERAL( "test" ), bcs
.size() ), 0 );
132 typedef typename
utf::basic_cstring
<CharT
>::traits_type traits
;
134 utf::basic_cstring
<CharT
> bcs( TEST_STRING
, TEST_STRING
+ 6 );
135 BOOST_CHECK_EQUAL( traits::compare( bcs
.begin(), LITERAL( "test_s" ), bcs
.size() ), 0 );
139 //____________________________________________________________________________//
141 BOOST_TEST_CASE_TEMPLATE_FUNCTION( constructors_std_string_test
, CharT
)
143 typedef typename
utf::basic_cstring
<CharT
>::traits_type traits
;
146 typename
utf::basic_cstring
<CharT
>::std_string
l( TEST_STRING
);
148 utf::basic_cstring
<CharT
> bcs( l
);
149 BOOST_CHECK_EQUAL( traits::compare( bcs
.begin(), TEST_STRING
, bcs
.size() ), 0 );
154 //____________________________________________________________________________//
156 void array_construction_test()
158 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x600))
159 const_string bcs_array
[] = { "str1", "str2" };
161 BOOST_CHECK_EQUAL( const_string::traits_type::compare( bcs_array
[0].begin(), "str1", bcs_array
[0].size() ), 0 );
162 BOOST_CHECK_EQUAL( const_string::traits_type::compare( bcs_array
[1].begin(), "str2", bcs_array
[1].size() ), 0 );
164 const_string
bcs( "abc" );
165 BOOST_CHECK_EQUAL( const_string::traits_type::compare( bcs
.begin(), "abc", bcs
.size() ), 0 );
169 //____________________________________________________________________________//
171 BOOST_TEST_CASE_TEMPLATE_FUNCTION( data_access_test
, CharT
)
173 typedef typename
utf::basic_cstring
<CharT
>::traits_type traits_type
;
175 utf::basic_cstring
<CharT
> bcs1( TEST_STRING
);
176 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), TEST_STRING
, bcs1
.size() ), 0 );
177 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), bcs1
.begin(), bcs1
.size() ), 0 );
179 BOOST_CHECK_EQUAL( bcs1
[0], 't' );
180 BOOST_CHECK_EQUAL( bcs1
[4], '_' );
181 BOOST_CHECK_EQUAL( bcs1
[bcs1
.size()-1], 'g' );
183 BOOST_CHECK_EQUAL( bcs1
[0], bcs1
.at( 0 ) );
184 BOOST_CHECK_EQUAL( bcs1
[2], bcs1
.at( 5 ) );
185 BOOST_CHECK_EQUAL( bcs1
.at( bcs1
.size() - 1 ), 'g' );
186 BOOST_CHECK_EQUAL( bcs1
.at( bcs1
.size() ), 0 );
187 BOOST_CHECK_EQUAL( bcs1
.at( bcs1
.size()+1 ), 0 );
189 BOOST_CHECK_EQUAL( utf::first_char( bcs1
), 't' );
190 BOOST_CHECK_EQUAL( utf::last_char( bcs1
) , 'g' );
192 BOOST_CHECK_EQUAL( utf::first_char( utf::basic_cstring
<CharT
>() ), 0 );
193 BOOST_CHECK_EQUAL( utf::last_char( utf::basic_cstring
<CharT
>() ), 0 );
196 //____________________________________________________________________________//
198 BOOST_TEST_CASE_TEMPLATE_FUNCTION( size_test
, CharT
)
200 utf::basic_cstring
<CharT
> bcs1
;
202 BOOST_CHECK_EQUAL( bcs1
.size(), (unsigned)0 );
203 BOOST_CHECK( bcs1
.is_empty() );
206 BOOST_CHECK_EQUAL( bcs1
.size(), (unsigned)11 );
209 BOOST_CHECK_EQUAL( bcs1
.size(), (unsigned)0 );
210 BOOST_CHECK( bcs1
.is_empty() );
212 bcs1
= utf::basic_cstring
<CharT
>( TEST_STRING
, 4 );
213 BOOST_CHECK_EQUAL( bcs1
.size(), (unsigned)4 );
216 BOOST_CHECK_EQUAL( bcs1
.size(), (unsigned)4 );
219 BOOST_CHECK_EQUAL( bcs1
.size(), (unsigned)3 );
222 //____________________________________________________________________________//
224 BOOST_TEST_CASE_TEMPLATE_FUNCTION( asignment_test
, CharT
)
226 typedef typename
utf::basic_cstring
<CharT
>::traits_type traits_type
;
228 utf::basic_cstring
<CharT
> bcs1
;
229 string_literal
<CharT
> l( "test", 4 );
232 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), LITERAL( "test" ), bcs1
.size() ), 0 );
234 utf::basic_cstring
<CharT
> bcs2( TEST_STRING
);
236 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), TEST_STRING
, bcs1
.size() ), 0 );
238 bcs1
.assign( l
.buff
);
239 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), LITERAL( "test" ), bcs1
.size() ), 0 );
241 bcs1
.assign( l
.buff
+1, l
.buff
+3 );
242 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), LITERAL( "est" ), bcs1
.size() ), 0 );
244 bcs1
.assign( bcs2
, 4, 3 );
245 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), LITERAL( "_st" ), bcs1
.size() ), 0 );
248 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), TEST_STRING
, bcs1
.size() ), 0 );
249 BOOST_CHECK_EQUAL( traits_type::compare( bcs2
.begin(), LITERAL( "_st" ), bcs2
.size() ), 0 );
252 //____________________________________________________________________________//
254 BOOST_TEST_CASE_TEMPLATE_FUNCTION( asignment_std_string_test
, CharT
)
256 typedef typename
utf::basic_cstring
<CharT
>::traits_type traits_type
;
258 utf::basic_cstring
<CharT
> bcs1
;
259 typename
utf::basic_cstring
<CharT
>::std_string
l( TEST_STRING
);
262 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), TEST_STRING
, bcs1
.size() ), 0 );
265 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), TEST_STRING
, bcs1
.size() ), 0 );
267 bcs1
.assign( l
, 1, 2 );
268 BOOST_CHECK_EQUAL( traits_type::compare( bcs1
.begin(), LITERAL( "es" ), bcs1
.size() ), 0 );
271 //____________________________________________________________________________//
273 BOOST_TEST_CASE_TEMPLATE_FUNCTION( comparison_test
, CharT
)
275 utf::basic_cstring
<CharT
> bcs1( TEST_STRING
);
276 utf::basic_cstring
<CharT
> bcs2( TEST_STRING
);
278 BOOST_CHECK_EQUAL( bcs1
, TEST_STRING
);
279 BOOST_CHECK_EQUAL( TEST_STRING
, bcs1
);
280 BOOST_CHECK_EQUAL( bcs1
, bcs2
);
284 BOOST_CHECK_EQUAL( bcs1
, LITERAL( "test" ) );
286 BOOST_CHECK( bcs1
!= TEST_STRING
);
287 BOOST_CHECK( TEST_STRING
!= bcs1
);
288 BOOST_CHECK( bcs1
!= bcs2
);
290 LOCAL_DEF( bcs3
, "TeSt" );
291 BOOST_CHECK( utf::case_ins_eq( bcs1
, bcs3
) );
294 //____________________________________________________________________________//
296 BOOST_TEST_CASE_TEMPLATE_FUNCTION( comparison_std_string_test
, CharT
)
298 utf::basic_cstring
<CharT
> bcs1( TEST_STRING
);
299 typename
utf::basic_cstring
<CharT
>::std_string
l( TEST_STRING
);
301 BOOST_CHECK( bcs1
== l
);
302 #if BOOST_WORKAROUND(BOOST_MSVC, > 1300)
303 BOOST_CHECK( l
== bcs1
);
308 BOOST_CHECK( bcs1
!= l
);
309 #if BOOST_WORKAROUND(BOOST_MSVC, > 1300)
310 BOOST_CHECK( l
!= bcs1
);
314 //____________________________________________________________________________//
316 BOOST_TEST_CASE_TEMPLATE_FUNCTION( ordering_test
, CharT
)
318 LOCAL_DEF( bcs1
, "aBcd" );
319 LOCAL_DEF( bcs2
, "aBbdd" );
320 LOCAL_DEF( bcs3
, "aBbde" );
321 LOCAL_DEF( bcs4
, "abab" );
323 BOOST_CHECK( bcs1
< bcs2
);
324 BOOST_CHECK( bcs2
< bcs3
);
325 BOOST_CHECK( bcs1
< bcs3
);
326 BOOST_CHECK( bcs1
< bcs4
);
328 utf::case_ins_less
<CharT
> cil
;
329 BOOST_CHECK( cil( bcs4
, bcs1
) );
332 //____________________________________________________________________________//
334 BOOST_TEST_CASE_TEMPLATE_FUNCTION( trim_test
, CharT
)
336 LOCAL_DEF( bcs0
, "tes" );
338 bcs0
.trim_right( 1 );
339 BOOST_CHECK_EQUAL( bcs0
.size(), (unsigned)2 );
340 BOOST_CHECK_EQUAL( bcs0
[0], 't' );
343 BOOST_CHECK_EQUAL( bcs0
.size(), (unsigned)1 );
344 BOOST_CHECK_EQUAL( bcs0
[0], 'e' );
347 BOOST_CHECK( bcs0
.is_empty() );
350 bcs0
.trim_left( 11 );
351 BOOST_CHECK( bcs0
.is_empty() );
354 bcs0
.trim_right( 11 );
355 BOOST_CHECK( bcs0
.is_empty() );
358 bcs0
.trim_right( bcs0
.size() - bcs0
.find( LITERAL( "t_s" ) ) - 3 );
359 BOOST_CHECK_EQUAL( bcs0
, LITERAL( "test_s" ) );
361 bcs0
.trim_left( bcs0
.find( LITERAL( "t_s" ) ) );
362 BOOST_CHECK_EQUAL( bcs0
, LITERAL( "t_s" ) );
364 LOCAL_DEF( bcs1
, "abcd " );
365 LOCAL_DEF( bcs2
, " abcd" );
366 LOCAL_DEF( bcs3
, " abcd " );
369 BOOST_CHECK_EQUAL( bcs1
, LITERAL( "abcd" ) );
372 BOOST_CHECK_EQUAL( bcs2
, LITERAL( "abcd" ) );
374 bcs3
.trim( LITERAL( "\"" ) );
375 BOOST_CHECK_EQUAL( bcs3
, LITERAL( " abcd " ) );
378 BOOST_CHECK_EQUAL( bcs3
, LITERAL( "abcd" ) );
381 BOOST_CHECK_EQUAL( bcs3
, LITERAL( "abcd" ) );
384 //____________________________________________________________________________//
386 BOOST_TEST_CASE_TEMPLATE_FUNCTION( io_test
, CharT
)
388 utf::basic_cstring
<CharT
> bcs1( TEST_STRING
);
389 bcs1
.trim_right( 7 );
391 tt::output_test_stream ostr
;
393 ostr
<< std::setw( 6 ) << bcs1
;
394 BOOST_CHECK( ostr
.is_equal( " test" ) );
396 ostr
<< std::setw( 3 ) << bcs1
;
397 BOOST_CHECK( ostr
.is_equal( "test" ) );
399 ostr
<< std::setw( 5 ) << std::setiosflags( std::ios::left
) << bcs1
;
400 BOOST_CHECK( ostr
.is_equal( "test " ) );
403 //____________________________________________________________________________//
405 BOOST_TEST_CASE_TEMPLATE_FUNCTION( find_test
, CharT
)
407 typedef typename
utf::basic_cstring
<CharT
>::size_type size
;
408 utf::basic_cstring
<CharT
> bcs1( TEST_STRING
);
410 size not_found
= (size
)utf::basic_cstring
<CharT
>::npos
;
412 BOOST_CHECK_EQUAL( bcs1
.find( utf::basic_cstring
<CharT
>() ), not_found
);
413 BOOST_CHECK_EQUAL( bcs1
.find( LITERAL( "test" ) ), (size
)0 );
414 BOOST_CHECK_EQUAL( bcs1
.find( TEST_STRING
), (size
)0 );
415 BOOST_CHECK_EQUAL( bcs1
.find( LITERAL( "test_string " ) ), not_found
);
416 BOOST_CHECK_EQUAL( bcs1
.find( LITERAL( " test_string" ) ), not_found
);
417 BOOST_CHECK_EQUAL( bcs1
.find( LITERAL( "est" ) ), (size
)1 );
418 BOOST_CHECK_EQUAL( bcs1
.find( LITERAL( "t_st" ) ), (size
)3 );
419 BOOST_CHECK_EQUAL( bcs1
.find( LITERAL( "ing" ) ), (size
)8 );
420 BOOST_CHECK_EQUAL( bcs1
.find( LITERAL( "tst" ) ), not_found
);
422 BOOST_CHECK_EQUAL( bcs1
.rfind( utf::basic_cstring
<CharT
>() ), not_found
);
423 BOOST_CHECK_EQUAL( bcs1
.rfind( LITERAL( "test" ) ), (size
)0 );
424 BOOST_CHECK_EQUAL( bcs1
.rfind( TEST_STRING
), (size
)0 );
425 BOOST_CHECK_EQUAL( bcs1
.rfind( LITERAL( "test_string " ) ), not_found
);
426 BOOST_CHECK_EQUAL( bcs1
.rfind( LITERAL( " test_string" ) ), not_found
);
427 BOOST_CHECK_EQUAL( bcs1
.rfind( LITERAL( "est" ) ), (size
)1 );
428 BOOST_CHECK_EQUAL( bcs1
.rfind( LITERAL( "t_st" ) ), (size
)3 );
429 BOOST_CHECK_EQUAL( bcs1
.rfind( LITERAL( "ing" ) ), (size
)8 );
430 BOOST_CHECK_EQUAL( bcs1
.rfind( LITERAL( "tst" ) ), not_found
);
433 //____________________________________________________________________________//
435 void const_conversion()
437 char arr
[] = { "ABC" };
439 utf::basic_cstring
<char> str1( arr
);
440 utf::basic_cstring
<char const> str2
;
444 BOOST_CHECK_EQUAL( str1
, "ABC" );
445 BOOST_CHECK_EQUAL( str2
, "ABC" );
448 //____________________________________________________________________________//
451 init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
453 utf::test_suite
* test
= BOOST_TEST_SUITE("basic_cstring test");
455 test
->add( BOOST_TEST_CASE_TEMPLATE( constructors_test
, char_types
) );
456 #if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
457 test
->add( BOOST_TEST_CASE_TEMPLATE( constructors_std_string_test
, base_const_char_types
) );
458 test
->add( BOOST_TEST_CASE_TEMPLATE( asignment_std_string_test
, base_const_char_types
) );
459 test
->add( BOOST_TEST_CASE_TEMPLATE( comparison_std_string_test
, base_const_char_types
) );
461 test
->add( BOOST_TEST_CASE( array_construction_test
) );
462 test
->add( BOOST_TEST_CASE_TEMPLATE( data_access_test
, char_types
) );
463 test
->add( BOOST_TEST_CASE_TEMPLATE( size_test
, char_types
) );
464 test
->add( BOOST_TEST_CASE_TEMPLATE( asignment_test
, char_types
) );
465 test
->add( BOOST_TEST_CASE_TEMPLATE( comparison_test
, char_types
) );
466 test
->add( BOOST_TEST_CASE_TEMPLATE( ordering_test
, char_types
) );
467 test
->add( BOOST_TEST_CASE_TEMPLATE( trim_test
, char_types
) );
468 test
->add( BOOST_TEST_CASE_TEMPLATE( io_test
, io_test_types
) );
469 test
->add( BOOST_TEST_CASE_TEMPLATE( find_test
, char_types
) );
470 test
->add( BOOST_TEST_CASE( &const_conversion
) );