mirror of
https://github.com/boostorg/test.git
synced 2026-01-26 07:02:12 +00:00
191 lines
5.9 KiB
C++
191 lines
5.9 KiB
C++
// (C) Copyright Gennadiy Rozental 2001-2014.
|
|
// 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$
|
|
//
|
|
// Version : $Revision$
|
|
//
|
|
// Description : string_token_iterator unit test
|
|
// *****************************************************************************
|
|
|
|
// Boost.Test
|
|
#define BOOST_TEST_MAIN
|
|
#include <boost/test/unit_test.hpp>
|
|
#include <boost/test/utils/iterator/token_iterator.hpp>
|
|
|
|
// BOOST
|
|
#include <boost/iterator/transform_iterator.hpp>
|
|
|
|
// STL
|
|
#include <iostream>
|
|
#include <list>
|
|
#include <iterator>
|
|
|
|
#ifdef BOOST_NO_STDC_NAMESPACE
|
|
namespace std{ using ::toupper; using ::tolower; }
|
|
#endif
|
|
|
|
namespace utf = boost::unit_test;
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
static utf::string_token_iterator sti_end;
|
|
static utf::wstring_token_iterator wsti_end;
|
|
|
|
BOOST_AUTO_TEST_CASE( test_default_delim_policy )
|
|
{
|
|
utf::string_token_iterator tit( "This is\n, a \ttest" );
|
|
char const* res[] = { "This", "is", ",", "a", "test" };
|
|
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( tit, sti_end, res, res + sizeof(res)/sizeof(char const*) );
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
BOOST_AUTO_TEST_CASE( test_wide )
|
|
{
|
|
utf::wstring_token_iterator tit( L"\317\356\367\345\354\363 \341\373 \350 \355\345\362" );
|
|
wchar_t const* res[4] = { L"\317\356\367\345\354\363", L"\341\373", L"\350", L"\355\345\362" };
|
|
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( tit, wsti_end, res, res + sizeof(res)/sizeof(char const*) );
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
BOOST_AUTO_TEST_CASE( test_custom_drop_delim )
|
|
{
|
|
utf::string_token_iterator tit( "My:-:\t: :string, :", utf::dropped_delimeters = ":" );
|
|
char const* res[] = { "My", "-", "\t", " ", "string", ",", " " };
|
|
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( tit, sti_end, res, res + sizeof(res)/sizeof(char const*) );
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
BOOST_AUTO_TEST_CASE( test_custom_keep_delim )
|
|
{
|
|
utf::string_token_iterator tit( "abc = \t\t 123, int", utf::kept_delimeters = "=," );
|
|
char const* res[] = { "abc", "=", "123", ",", "int" };
|
|
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( tit, sti_end, res, res + sizeof(res)/sizeof(char const*) );
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
BOOST_AUTO_TEST_CASE( test_keep_empty_tokens )
|
|
{
|
|
utf::string_token_iterator tit( "fld,, 456,a==4=,",
|
|
(utf::dropped_delimeters = " ,",
|
|
utf::kept_delimeters = "=",
|
|
utf::keep_empty_tokens ));
|
|
char const* res[] = { "fld", "", "", "456", "a", "=", "", "=", "4", "=", "", "" };
|
|
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( tit, sti_end, res, res + sizeof(res)/sizeof(char const*) );
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
BOOST_AUTO_TEST_CASE( test_max_tokens )
|
|
{
|
|
utf::string_token_iterator tit( "aa bb dd", utf::max_tokens = 2 );
|
|
char const* res[] = { "aa", "bb dd" };
|
|
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( tit, sti_end, res, res + sizeof(res)/sizeof(char const*) );
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
struct ci_comp {
|
|
bool operator()( char c1, char c2 )
|
|
{
|
|
return (std::toupper)( c1 ) == (std::toupper)( c2 );
|
|
}
|
|
};
|
|
|
|
BOOST_AUTO_TEST_CASE( test_custom_compare )
|
|
{
|
|
typedef utf::basic_string_token_iterator<char,ci_comp> my_token_iterator;
|
|
|
|
my_token_iterator tit( "093514T120104", utf::dropped_delimeters = "t" );
|
|
char const* res[] = { "093514", "120104" };
|
|
|
|
my_token_iterator end;
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( tit, end, res, res + sizeof(res)/sizeof(char const*) );
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
BOOST_AUTO_TEST_CASE( test_range_token_iterator )
|
|
{
|
|
typedef utf::range_token_iterator<std::list<char>::iterator> my_token_iterator;
|
|
|
|
std::list<char> l;
|
|
char const* pattern = "a bc , cd";
|
|
std::copy( pattern, pattern+9, std::back_inserter( l ) );
|
|
|
|
#if !defined( __GNUC__ ) || ( __GNUC__ == 3 && __GNUC_MINOR__ != 2 ) || ( __GNUC__ > 3 )
|
|
my_token_iterator tit( l.begin(), l.end() );
|
|
char const* res[] = { "a", "bc", ",", "cd" };
|
|
|
|
my_token_iterator end;
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( tit, end, res, res + sizeof(res)/sizeof(char const*) );
|
|
#endif
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
template<typename Iter>
|
|
void moo( Iter b )
|
|
{
|
|
char const* res[6] = { "ABC", "SDF", " ", "SD", "FG", " " };
|
|
|
|
Iter end;
|
|
BOOST_CHECK_EQUAL_COLLECTIONS( b, end, res, res+sizeof(res)/sizeof(char const*) );
|
|
}
|
|
|
|
template<typename Iter>
|
|
void foo( Iter b, Iter e )
|
|
{
|
|
moo( utf::make_range_token_iterator( b, e, (utf::kept_delimeters = utf::dt_isspace, utf::dropped_delimeters = "2" )) );
|
|
}
|
|
|
|
inline char loo( char c ) { return (char)(std::toupper)( c ); }
|
|
|
|
BOOST_AUTO_TEST_CASE( test_make_range_token_iterator )
|
|
{
|
|
char const* str = "Abc22sdf sd2fg ";
|
|
|
|
#if !BOOST_WORKAROUND( BOOST_MSVC, <= 1300 ) && !BOOST_WORKAROUND( __BORLANDC__, <= 0x550 )
|
|
foo( boost::make_transform_iterator( str, loo ),
|
|
boost::make_transform_iterator( str+15, loo ) );
|
|
#endif
|
|
}
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
#if 0
|
|
|
|
BOOST_AUTO_TEST_CASE( test_istream_token_iterator )
|
|
{
|
|
typedef utf::range_token_iterator<std::istream_iterator<char> > my_token_iterator;
|
|
|
|
std::istream_iterator<char> in_it( std::cin );
|
|
|
|
my_token_iterator tit( in_it, std::istream_iterator<char>(), utf::dropped_delimeters = ":" );
|
|
|
|
while( tit != my_token_iterator() ) {
|
|
std::cout << '<' << *tit << '>';
|
|
++tit;
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|
|
//____________________________________________________________________________//
|
|
|
|
// EOF
|