📄 basic_cstring_test.cpp
字号:
// (C) Copyright Gennadiy Rozental 2001-2005.
// 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/test for the library home page.
//
// File : $RCSfile: basic_cstring_test.cpp,v $
//
// Version : $Revision: 1.13.2.1 $
//
// Description : basic_cstring unit test
// *****************************************************************************
// Boost.Test
#include <boost/test/unit_test.hpp>
#include <boost/test/test_case_template.hpp>
#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
#include <boost/test/utils/basic_cstring/compare.hpp>
#include <boost/test/utils/basic_cstring/io.hpp>
#include <boost/test/output_test_stream.hpp>
namespace utf = boost::unit_test;
namespace tt = boost::test_tools;
using utf::const_string;
// Boost
#include <boost/mpl/list.hpp>
#include <boost/mpl/joint_view.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/type_traits/add_const.hpp>
// STL
#include <cctype>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <stdexcept>
namespace mpl = boost::mpl;
#if defined(BOOST_NO_STD_WSTRING)
typedef mpl::list1<char const> base_const_char_types;
typedef mpl::list2<char,unsigned char> mutable_char_types;
#else
typedef mpl::list2<char const,wchar_t const> base_const_char_types;
typedef mpl::list3<char,unsigned char,wchar_t> mutable_char_types;
#endif
typedef mpl::transform<mutable_char_types,boost::add_const<mpl::_1> >::type const_char_types;
typedef mpl::joint_view<const_char_types,mutable_char_types> char_types;
typedef mpl::list2<char,const char> io_test_types;
//____________________________________________________________________________//
template<typename CharT>
struct string_literal
{
typedef typename boost::remove_const<CharT>::type mutable_char;
string_literal( char const* orig, std::size_t orig_size )
{
std::copy( orig, orig + orig_size, buff );
buff[orig_size] = 0;
}
mutable_char buff[100];
};
#define LITERAL( s ) (CharT*)string_literal<CharT>( s, sizeof( s ) ).buff
#define LOCAL_DEF( name, s ) \
string_literal<CharT> BOOST_JOIN( sl, __LINE__)(s, sizeof( s )); \
utf::basic_cstring<CharT> name( (CharT*)(BOOST_JOIN( sl, __LINE__).buff) ) \
/**/
#define TEST_STRING test_string<CharT>( (CharT*)0 )
template<typename CharT>
CharT*
test_string( CharT* = 0 )
{
static string_literal<CharT> l( "test_string", 11 );
return l.buff;
}
//____________________________________________________________________________//
BOOST_TEST_CASE_TEMPLATE_FUNCTION( constructors_test, CharT )
{
{
utf::basic_cstring<CharT> bcs;
BOOST_CHECK_EQUAL( bcs.size(), 0 );
BOOST_CHECK( bcs.is_empty() );
}
{
utf::basic_cstring<CharT> bcs( utf::basic_cstring<CharT>::null_str() );
BOOST_CHECK_EQUAL( bcs.size(), 0 );
BOOST_CHECK( bcs.is_empty() );
}
{
utf::basic_cstring<CharT> bcs( 0 );
BOOST_CHECK_EQUAL( bcs.size(), 0 );
BOOST_CHECK( bcs.is_empty() );
}
{
typedef typename utf::basic_cstring<CharT>::traits_type traits;
utf::basic_cstring<CharT> bcs( TEST_STRING );
BOOST_CHECK_EQUAL( traits::compare( bcs.begin(), TEST_STRING, bcs.size() ), 0 );
BOOST_CHECK_EQUAL( bcs.size(), traits::length( TEST_STRING ) );
utf::basic_cstring<CharT> bcs1( bcs );
BOOST_CHECK_EQUAL( traits::compare( bcs1.begin(), TEST_STRING, bcs1.size() ), 0 );
}
{
typedef typename utf::basic_cstring<CharT>::traits_type traits;
utf::basic_cstring<CharT> bcs( TEST_STRING, 4 );
BOOST_CHECK_EQUAL( traits::compare( bcs.begin(), LITERAL( "test" ), bcs.size() ), 0 );
}
{
typedef typename utf::basic_cstring<CharT>::traits_type traits;
utf::basic_cstring<CharT> bcs( TEST_STRING, TEST_STRING + 6 );
BOOST_CHECK_EQUAL( traits::compare( bcs.begin(), LITERAL( "test_s" ), bcs.size() ), 0 );
}
}
//____________________________________________________________________________//
BOOST_TEST_CASE_TEMPLATE_FUNCTION( constructors_std_string_test, CharT )
{
typedef typename utf::basic_cstring<CharT>::traits_type traits;
{
typename utf::basic_cstring<CharT>::std_string l( TEST_STRING );
utf::basic_cstring<CharT> bcs( l );
BOOST_CHECK_EQUAL( traits::compare( bcs.begin(), TEST_STRING, bcs.size() ), 0 );
}
}
//____________________________________________________________________________//
void array_construction_test()
{
#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x600))
const_string bcs_array[] = { "str1", "str2" };
BOOST_CHECK_EQUAL( const_string::traits_type::compare( bcs_array[0].begin(), "str1", bcs_array[0].size() ), 0 );
BOOST_CHECK_EQUAL( const_string::traits_type::compare( bcs_array[1].begin(), "str2", bcs_array[1].size() ), 0 );
const_string bcs( "abc" );
BOOST_CHECK_EQUAL( const_string::traits_type::compare( bcs.begin(), "abc", bcs.size() ), 0 );
#endif
}
//____________________________________________________________________________//
BOOST_TEST_CASE_TEMPLATE_FUNCTION( data_access_test, CharT )
{
typedef typename utf::basic_cstring<CharT>::traits_type traits_type;
utf::basic_cstring<CharT> bcs1( TEST_STRING );
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), TEST_STRING, bcs1.size() ), 0 );
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), bcs1.begin(), bcs1.size() ), 0 );
BOOST_CHECK_EQUAL( bcs1[0], 't' );
BOOST_CHECK_EQUAL( bcs1[4], '_' );
BOOST_CHECK_EQUAL( bcs1[bcs1.size()-1], 'g' );
BOOST_CHECK_EQUAL( bcs1[0], bcs1.at( 0 ) );
BOOST_CHECK_EQUAL( bcs1[2], bcs1.at( 5 ) );
BOOST_CHECK_EQUAL( bcs1.at( bcs1.size() - 1 ), 'g' );
BOOST_CHECK_EQUAL( bcs1.at( bcs1.size() ), 0 );
BOOST_CHECK_EQUAL( bcs1.at( bcs1.size()+1 ), 0 );
BOOST_CHECK_EQUAL( utf::first_char( bcs1 ), 't' );
BOOST_CHECK_EQUAL( utf::last_char( bcs1 ) , 'g' );
BOOST_CHECK_EQUAL( utf::first_char( utf::basic_cstring<CharT>() ), 0 );
BOOST_CHECK_EQUAL( utf::last_char( utf::basic_cstring<CharT>() ), 0 );
}
//____________________________________________________________________________//
BOOST_TEST_CASE_TEMPLATE_FUNCTION( size_test, CharT )
{
utf::basic_cstring<CharT> bcs1;
BOOST_CHECK_EQUAL( bcs1.size(), 0 );
BOOST_CHECK( bcs1.is_empty() );
bcs1 = TEST_STRING;
BOOST_CHECK_EQUAL( bcs1.size(), 11 );
bcs1.clear();
BOOST_CHECK_EQUAL( bcs1.size(), 0 );
BOOST_CHECK( bcs1.is_empty() );
bcs1 = utf::basic_cstring<CharT>( TEST_STRING, 4 );
BOOST_CHECK_EQUAL( bcs1.size(), 4 );
bcs1.resize( 5 );
BOOST_CHECK_EQUAL( bcs1.size(), 4 );
bcs1.resize( 3 );
BOOST_CHECK_EQUAL( bcs1.size(), 3 );
}
//____________________________________________________________________________//
BOOST_TEST_CASE_TEMPLATE_FUNCTION( asignment_test, CharT )
{
typedef typename utf::basic_cstring<CharT>::traits_type traits_type;
utf::basic_cstring<CharT> bcs1;
string_literal<CharT> l( "test", 4 );
bcs1 = l.buff;
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), LITERAL( "test" ), bcs1.size() ), 0 );
utf::basic_cstring<CharT> bcs2( TEST_STRING );
bcs1 = bcs2;
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), TEST_STRING, bcs1.size() ), 0 );
bcs1.assign( l.buff );
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), LITERAL( "test" ), bcs1.size() ), 0 );
bcs1.assign( l.buff+1, l.buff+3 );
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), LITERAL( "est" ), bcs1.size() ), 0 );
bcs1.assign( bcs2, 4, 3 );
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), LITERAL( "_st" ), bcs1.size() ), 0 );
bcs1.swap( bcs2 );
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), TEST_STRING, bcs1.size() ), 0 );
BOOST_CHECK_EQUAL( traits_type::compare( bcs2.begin(), LITERAL( "_st" ), bcs2.size() ), 0 );
}
//____________________________________________________________________________//
BOOST_TEST_CASE_TEMPLATE_FUNCTION( asignment_std_string_test, CharT )
{
typedef typename utf::basic_cstring<CharT>::traits_type traits_type;
utf::basic_cstring<CharT> bcs1;
typename utf::basic_cstring<CharT>::std_string l( TEST_STRING );
bcs1 = l;
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), TEST_STRING, bcs1.size() ), 0 );
bcs1.assign( l );
BOOST_CHECK_EQUAL( traits_type::compare( bcs1.begin(), TEST_STRING, bcs1.size() ), 0 );
bcs1.assign( l, 1, 2 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -