mirror of
				https://github.com/boostorg/algorithm.git
				synced 2025-11-04 09:41:39 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			163 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
//  Boost string_algo library predicate_test.cpp file  ------------------//
 | 
						|
 | 
						|
//  Copyright Pavol Droba 2002-2003. Use, modification and
 | 
						|
//  distribution is subject to 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 for updates, documentation, and revision history.
 | 
						|
 | 
						|
#include <boost/algorithm/string/predicate.hpp>
 | 
						|
#include <boost/algorithm/string/classification.hpp>
 | 
						|
 | 
						|
// Include unit test framework
 | 
						|
#include <boost/test/included/test_exec_monitor.hpp>
 | 
						|
 | 
						|
#include <string>
 | 
						|
#include <vector>
 | 
						|
#include <iostream>
 | 
						|
#include <functional>
 | 
						|
#include <boost/test/test_tools.hpp>
 | 
						|
 | 
						|
using namespace std;
 | 
						|
using namespace boost;
 | 
						|
 | 
						|
void predicate_test()
 | 
						|
{
 | 
						|
    string str1("123xxx321");
 | 
						|
    string str1_prefix("123");
 | 
						|
    string str2("abc");
 | 
						|
    string str3("");
 | 
						|
    string str4("abc");
 | 
						|
    vector<int> vec1( str1.begin(), str1.end() );
 | 
						|
 | 
						|
    // Basic tests
 | 
						|
    BOOST_CHECK( starts_with( str1, string("123") ) );
 | 
						|
    BOOST_CHECK( !starts_with( str1, string("1234") ) );
 | 
						|
 | 
						|
    BOOST_CHECK( istarts_with( "aBCxxx", "abc" ) );
 | 
						|
    BOOST_CHECK( !istarts_with( "aBCxxx", "abcd" ) );
 | 
						|
 | 
						|
    BOOST_CHECK( ends_with( str1, string("321") ) );
 | 
						|
    BOOST_CHECK( !ends_with( str1, string("123") ) );
 | 
						|
 | 
						|
    BOOST_CHECK( iends_with( "aBCxXx", "XXX" ) );
 | 
						|
    BOOST_CHECK( !iends_with( "aBCxxX", "xXXX" ) );
 | 
						|
 | 
						|
    BOOST_CHECK( contains( str1, string("xxx") ) );
 | 
						|
    BOOST_CHECK( !contains( str1, string("yyy") ) );
 | 
						|
 | 
						|
    BOOST_CHECK( icontains( "123XxX321", "xxx" ) );
 | 
						|
    BOOST_CHECK( !icontains( "123xXx321", "yyy" ) );
 | 
						|
 | 
						|
    BOOST_CHECK( equals( str2, string("abc") ) );
 | 
						|
    BOOST_CHECK( !equals( str1, string("yyy") ) );
 | 
						|
 | 
						|
    BOOST_CHECK( iequals( "AbC", "abc" ) );
 | 
						|
    BOOST_CHECK( !iequals( "aBc", "yyy" ) );
 | 
						|
 | 
						|
    BOOST_CHECK( lexicographical_compare("abc", "abd") );
 | 
						|
    BOOST_CHECK( !lexicographical_compare("abc", "abc") );
 | 
						|
    BOOST_CHECK( lexicographical_compare("abc", "abd", is_less()) );
 | 
						|
 | 
						|
    BOOST_CHECK( !ilexicographical_compare("aBD", "AbC") );
 | 
						|
    BOOST_CHECK( ilexicographical_compare("aBc", "AbD") );
 | 
						|
    BOOST_CHECK( lexicographical_compare("abC", "aBd", is_iless()) );
 | 
						|
 | 
						|
    // multi-type comparison test
 | 
						|
    BOOST_CHECK( starts_with( vec1, string("123") ) );
 | 
						|
    BOOST_CHECK( ends_with( vec1, string("321") ) );
 | 
						|
    BOOST_CHECK( contains( vec1, string("xxx") ) );
 | 
						|
    BOOST_CHECK( equals( vec1, str1 ) );
 | 
						|
 | 
						|
    // overflow test
 | 
						|
    BOOST_CHECK( !starts_with( str2, string("abcd") ) );
 | 
						|
    BOOST_CHECK( !ends_with( str2, string("abcd") ) );
 | 
						|
    BOOST_CHECK( !contains( str2, string("abcd") ) );
 | 
						|
    BOOST_CHECK( !equals( str2, string("abcd") ) );
 | 
						|
 | 
						|
    // equal test
 | 
						|
    BOOST_CHECK( starts_with( str2, string("abc") ) );
 | 
						|
    BOOST_CHECK( ends_with( str2, string("abc") ) );
 | 
						|
    BOOST_CHECK( contains( str2, string("abc") ) );
 | 
						|
    BOOST_CHECK( equals( str2, string("abc") ) );
 | 
						|
 | 
						|
    //! Empty string test
 | 
						|
    BOOST_CHECK( starts_with( str2, string("") ) );
 | 
						|
    BOOST_CHECK( ends_with( str2, string("") ) );
 | 
						|
    BOOST_CHECK( contains( str2, string("") ) );
 | 
						|
    BOOST_CHECK( equals( str3, string("") ) );
 | 
						|
 | 
						|
    //! Container compatibility test
 | 
						|
    BOOST_CHECK( starts_with( "123xxx321", "123" ) );
 | 
						|
    BOOST_CHECK( ends_with( "123xxx321", "321" ) );
 | 
						|
    BOOST_CHECK( contains( "123xxx321", "xxx" ) );
 | 
						|
    BOOST_CHECK( equals( "123xxx321", "123xxx321" ) );
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
template<typename Pred, typename Input>
 | 
						|
void test_pred(const Pred& pred, const Input& input, bool bYes)
 | 
						|
{
 | 
						|
    // test assignment operator
 | 
						|
    Pred pred1=pred;
 | 
						|
    pred1=pred;
 | 
						|
    pred1=pred1;
 | 
						|
    if(bYes)
 | 
						|
    {
 | 
						|
        BOOST_CHECK( all( input, pred ) );
 | 
						|
        BOOST_CHECK( all( input, pred1 ) );
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        BOOST_CHECK( !all( input, pred ) );
 | 
						|
        BOOST_CHECK( !all( input, pred1 ) );
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#define TEST_CLASS( Pred, YesInput, NoInput )\
 | 
						|
{\
 | 
						|
    test_pred(Pred, YesInput, true); \
 | 
						|
    test_pred(Pred, NoInput, false); \
 | 
						|
}
 | 
						|
 | 
						|
void classification_test()
 | 
						|
{
 | 
						|
    TEST_CLASS( is_space(), "\n\r\t ", "..." );
 | 
						|
    TEST_CLASS( is_alnum(), "ab129ABc", "_ab129ABc" );
 | 
						|
    TEST_CLASS( is_alpha(), "abc", "abc1" );
 | 
						|
    TEST_CLASS( is_cntrl(), "\n\t\r", "..." );
 | 
						|
    TEST_CLASS( is_digit(), "1234567890", "abc" );
 | 
						|
    TEST_CLASS( is_graph(), "123abc.,", "  \t" );
 | 
						|
    TEST_CLASS( is_lower(), "abc", "Aasdf" );
 | 
						|
    TEST_CLASS( is_print(), "abs", "\003\004asdf" );
 | 
						|
    TEST_CLASS( is_punct(), ".,;\"", "abc" );
 | 
						|
    TEST_CLASS( is_upper(), "ABC", "aBc" );
 | 
						|
    TEST_CLASS( is_xdigit(), "ABC123", "XFD" );
 | 
						|
    TEST_CLASS( is_any_of( string("abc") ), "aaabbcc", "aaxb" );
 | 
						|
    TEST_CLASS( is_any_of( "abc" ), "aaabbcc", "aaxb" );
 | 
						|
    TEST_CLASS( is_from_range( 'a', 'c' ), "aaabbcc", "aaxb" );
 | 
						|
 | 
						|
    TEST_CLASS( !is_classified(std::ctype_base::space), "...", "..\n\r\t " );
 | 
						|
    TEST_CLASS( ( !is_any_of("abc") && is_from_range('a','e') ) || is_space(), "d e", "abcde" );
 | 
						|
 | 
						|
    // is_any_of test
 | 
						|
//  TEST_CLASS( !is_any_of(""), "", "aaa" )
 | 
						|
    TEST_CLASS( is_any_of("a"), "a", "ab" )
 | 
						|
    TEST_CLASS( is_any_of("ba"), "ab", "abc" )
 | 
						|
    TEST_CLASS( is_any_of("cba"), "abc", "abcd" )
 | 
						|
    TEST_CLASS( is_any_of("hgfedcba"), "abcdefgh", "abcdefghi" )
 | 
						|
    TEST_CLASS( is_any_of("qponmlkjihgfedcba"), "abcdefghijklmnopq", "zzz" )
 | 
						|
}
 | 
						|
 | 
						|
#undef TEST_CLASS
 | 
						|
 | 
						|
// test main 
 | 
						|
int test_main( int, char*[] )
 | 
						|
{
 | 
						|
    predicate_test();
 | 
						|
    classification_test();
 | 
						|
    
 | 
						|
    return 0;
 | 
						|
}
 |