//  Boost string_algo library substr_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/replace.hpp>
#include <boost/algorithm/string/erase.hpp>
#include <boost/algorithm/string/std/list_traits.hpp>
#include <boost/algorithm/string/std/string_traits.hpp>

// Include unit test framework
#include <boost/test/included/test_exec_monitor.hpp>

#include <string>
#include <vector>
#include <list>
#include <iostream>

// equals predicate is used for result comparison
#include <boost/algorithm/string/predicate.hpp>

#include <boost/test/test_tools.hpp>

using namespace std;
using namespace boost;

void sequence_traits_test()
{
    // basic_string traits
    BOOST_CHECK( boost::algorithm::has_native_replace<string>::value );
    BOOST_CHECK( !boost::algorithm::has_stable_iterators<string>::value );
    BOOST_CHECK( !boost::algorithm::has_const_time_insert<string>::value );    
    BOOST_CHECK( !boost::algorithm::has_const_time_erase<string>::value ); 

    // vector traits
    BOOST_CHECK( !boost::algorithm::has_native_replace< vector<char> >::value );
    BOOST_CHECK( !boost::algorithm::has_stable_iterators< vector<char> >::value );
    BOOST_CHECK( !boost::algorithm::has_const_time_insert< vector<char> >::value );    
    BOOST_CHECK( !boost::algorithm::has_const_time_erase< vector<char> >::value ); 

    // list traits
    BOOST_CHECK( !boost::algorithm::has_native_replace< list<char> >::value );
    BOOST_CHECK( boost::algorithm::has_stable_iterators< list<char> >::value );
    BOOST_CHECK( boost::algorithm::has_const_time_insert< list<char> >::value );   
    BOOST_CHECK( boost::algorithm::has_const_time_erase< list<char> >::value );    
}

// Combine tests for all variants of the algorithm
#define C_ ,
#define TEST_ALGO( Algo, Input, Params, Output ) \
{\
    BOOST_CHECKPOINT( #Algo " - Copy" );\
\
    string str1(Input);\
\
    /* Copy test */ \
    BOOST_CHECK( Algo##_copy( str1, Params )==Output );\
\
    BOOST_CHECKPOINT( #Algo " - Iterator" );\
    /* Iterator test */\
    string strout;\
    Algo##_copy( back_inserter(strout), str1, Params );\
    BOOST_CHECK( strout==Output ); \
\
    /* In-place test */\
    vector<char> vec1( str1.begin(), str1.end() );\
    list<char> list1( str1.begin(), str1.end() );\
\
    BOOST_CHECKPOINT( #Algo " - Inplace(string)" );\
    Algo( str1, Params ); \
    BOOST_CHECK( equals( str1, Output ) ); \
\
    BOOST_CHECKPOINT( #Algo " - Inplace(vector)" );\
    Algo( vec1, Params ); \
    BOOST_CHECK( equals( vec1, Output ) );\
\
    BOOST_CHECKPOINT( #Algo " - Inplace(list)" );\
    Algo( list1, Params ); \
    BOOST_CHECK( equals( list1, Output ) );\
}

void replace_first_test()
{
    // replace first
    TEST_ALGO( replace_first, "1abc3abc2", string("abc") C_ string("YYY"), string("1YYY3abc2") );
    TEST_ALGO( ireplace_first, "1AbC3abc2", "aBc" C_ "YYY", string("1YYY3abc2") );
    TEST_ALGO( replace_first, "1abc3abc2", string("abc") C_ string("Z"), string("1Z3abc2") );
    TEST_ALGO( replace_first, "1abc3abc2", string("abc") C_ string("XXXX"), string("1XXXX3abc2") );
    TEST_ALGO( replace_first, "1abc3abc2", string("") C_ string("XXXX"), string("1abc3abc2") );
    TEST_ALGO( replace_first, "1abc3abc2", "" C_ "XXXX", string("1abc3abc2") );
    TEST_ALGO( replace_first, "", string("") C_ string("XXXX"), string("") );
    TEST_ALGO( erase_first, "1abc3abc2", string("abc"), string("13abc2") );
    TEST_ALGO( ierase_first, "1aBc3abc2", "abC", "13abc2" );
    TEST_ALGO( erase_first, "1abc3abc2", "abc", "13abc2" );
    TEST_ALGO( erase_first, "1abc3abc2", string(""), string("1abc3abc2") );
    TEST_ALGO( erase_first, "", string("abc"), string("") );
}

void replace_last_test()
{
    // replace last
    TEST_ALGO( replace_last, "1abc3abc2", string("abc") C_ string("YYY"), string("1abc3YYY2") );
    TEST_ALGO( ireplace_last, "1abc3AbC2", "aBc" C_ "YYY", string("1abc3YYY2") );
    TEST_ALGO( replace_last, "1abc3abc2", string("abc") C_ string("Z"), string("1abc3Z2") );
    TEST_ALGO( replace_last, "1abc3abc2", string("abc") C_ string("XXXX"), string("1abc3XXXX2") );
    TEST_ALGO( replace_last, "1abc3abc2", "abc" C_ "XXXX", string("1abc3XXXX2") );
    TEST_ALGO( replace_last, "", string("") C_ string("XXXX"), string("") );
    TEST_ALGO( erase_last, "1abc3abc2", string("abc"), string("1abc32") );
    TEST_ALGO( ierase_last, "1aBc3aBc2", "ABC", string("1aBc32") );
    TEST_ALGO( erase_last, "1abc3abc2", "abc", string("1abc32") );
    TEST_ALGO( erase_last, "1abc3abc2", string(""), string("1abc3abc2") );
    TEST_ALGO( erase_last, "", string("abc"), string("") );
}

void replace_all_test()
{
    // replace all
    TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("YYY"), string("1YYY3YYY2") );
    TEST_ALGO( replace_all, string("1abc3abc2"), "/" C_ "\\", string("1abc3abc2") );
    TEST_ALGO( ireplace_all, "1aBc3AbC2", "abC" C_ "YYY", string("1YYY3YYY2") );
    TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("Z"), string("1Z3Z2") );
    TEST_ALGO( replace_all, "1abc3abc2", string("abc") C_ string("XXXX"), string("1XXXX3XXXX2") );
    TEST_ALGO( replace_all, "1abc3abc2", "abc" C_ "XXXX", string("1XXXX3XXXX2") );
    TEST_ALGO( replace_all, "", string("") C_ string("XXXX"), string("") );
    TEST_ALGO( erase_all, "1abc3abc2", string("abc"), string("132") );
    TEST_ALGO( ierase_all, "1aBc3aBc2", "aBC", string("132") );
    TEST_ALGO( erase_all, "1abc3abc2", "abc", string("132") );
    TEST_ALGO( erase_all, "1abc3abc2", string(""), string("1abc3abc2") );
    TEST_ALGO( erase_all, "", string("abc"), string("") );
}

void replace_nth_test()
{
    // replace nth
    TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("YYY"), string("1YYY3abc2") );
    TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ -1 C_ string("YYY"), string("1abc3YYY2") );
    TEST_ALGO( ireplace_nth, "1AbC3abc2", "aBc" C_ 0 C_ "YYY", string("1YYY3abc2") );
    TEST_ALGO( ireplace_nth, "1AbC3abc2", "aBc" C_ -1 C_ "YYY", string("1AbC3YYY2") );
    TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("Z"), string("1Z3abc2") );
    TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 0 C_ string("XXXX"), string("1XXXX3abc2") );
    TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ 0 C_ "XXXX", string("1XXXX3abc2") );
    TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ 3 C_ "XXXX", string("1abc3abc2") );
    TEST_ALGO( replace_nth, "1abc3abc2", "abc" C_ -3 C_ "XXXX", string("1abc3abc2") );
    TEST_ALGO( replace_nth, "1abc3abc2", string("") C_ 0 C_ string("XXXX"), string("1abc3abc2") );
    TEST_ALGO( replace_nth, "", string("") C_ 0 C_ string("XXXX"), string("") );
    TEST_ALGO( replace_nth, "", string("") C_ -1 C_ string("XXXX"), string("") );
    TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ 0, string("13abc2") );
    TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ -1, string("1abc32") );
    TEST_ALGO( erase_nth, "1abc3abc2", string("abc") C_ -3, string("1abc3abc2") );
    TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ 0, string("13aBc2") );
    TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ -1, string("1aBc32") );
    TEST_ALGO( ierase_nth, "1aBc3aBc2", "ABC" C_ -3, string("1aBc3aBc2") );
    TEST_ALGO( erase_nth, "1abc3abc2", "abc" C_ 0, string("13abc2") );
    TEST_ALGO( erase_nth, "1abc3abc2", string("") C_ 0, string("1abc3abc2") );
    TEST_ALGO( erase_nth, "", string("abc") C_ 0, string("") );
    TEST_ALGO( erase_nth, "", string("abc") C_ -1, string("") );
    TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 1 C_ string("YYY"), string("1abc3YYY2") );
    TEST_ALGO( replace_nth, "1abc3abc2", string("abc") C_ 2 C_ string("YYY"), string("1abc3abc2") );
}

void replace_head_test()
{
    // replace head
    TEST_ALGO( replace_head, "abc3abc2", 3 C_ string("YYY"), string("YYY3abc2") );
    TEST_ALGO( replace_head, "abc3abc2", -3 C_ string("YYY"), string("YYYbc2") );
    TEST_ALGO( replace_head, "abc3abc2", 3 C_ "YYY", string("YYY3abc2") );
    TEST_ALGO( replace_head, "abc", 3 C_ string("Z"), string("Z") );
    TEST_ALGO( replace_head, "abc", 6 C_ string("XXXX"), string("XXXX") );
    TEST_ALGO( replace_head, "abc", -6 C_ string("XXXX"), string("abc") );
    TEST_ALGO( replace_head, "abc3abc2", 0 C_ string("XXXX"), string("abc3abc2") );
    TEST_ALGO( replace_head, "", 4 C_ string("XXXX"), string("") );
    TEST_ALGO( replace_head, "", -4 C_ string("XXXX"), string("") );
    TEST_ALGO( erase_head, "abc3abc2", 3, string("3abc2") );
    TEST_ALGO( erase_head, "abc3abc2", -3, string("bc2") );
    TEST_ALGO( erase_head, "abc3abc2", 0, string("abc3abc2") );
    TEST_ALGO( erase_head, "", 4, string("") );
    TEST_ALGO( erase_head, "", -4, string("") );
}

void replace_tail_test()
{
    // replace tail
    TEST_ALGO( replace_tail, "abc3abc", 3 C_ string("YYY"), string("abc3YYY") );
    TEST_ALGO( replace_tail, "abc3abc", -3 C_ "YYY", string("abcYYY") );
    TEST_ALGO( replace_tail, "abc", 3 C_ string("Z"), string("Z") );
    TEST_ALGO( replace_tail, "abc", 6 C_ string("XXXX"), string("XXXX") );
    TEST_ALGO( replace_tail, "abc", -6 C_ string("XXXX"), string("abc") );
    TEST_ALGO( replace_tail, "abc3abc", 0 C_ string("XXXX"), string("abc3abc") );
    TEST_ALGO( replace_tail, "", 4 C_ string("XXXX"), string("") );
    TEST_ALGO( replace_tail, "", -4 C_ string("XXXX"), string("") );
    TEST_ALGO( erase_tail, "abc3abc", 3, string("abc3") );
    TEST_ALGO( erase_tail, "abc3abc", -3, string("abc") );
    TEST_ALGO( erase_tail, "abc3abc", 0, string("abc3abc") );
    TEST_ALGO( erase_tail, "", 4, string("") );
    TEST_ALGO( erase_tail, "", -4, string("") );
}

void replace_range_test()
{
    // replace_range
    {
        BOOST_CHECKPOINT( "replace_range" );

        string str1("1abc3abc2");
        BOOST_CHECK( 
            replace_range_copy( 
                str1, 
                make_iterator_range(str1.begin()+1, str1.begin()+4),
                string("XXX") )==string("1XXX3abc2") );

        string strout;
        replace_range_copy( 
                back_inserter( strout ),
                str1, 
                make_iterator_range(str1.begin()+1, str1.begin()+4),
                string("XXX") );
        BOOST_CHECK( strout==string("1XXX3abc2") );

        replace_range( 
                str1, 
                make_iterator_range(str1.begin()+1, str1.begin()+4),
                string("XXX") );
        BOOST_CHECK( str1==string("1XXX3abc2") );
    }
    // erase_range
    {
        BOOST_CHECKPOINT( "erase_range" );

        string str1("1abc3abc2");
        BOOST_CHECK( 
        erase_range_copy( 
                str1, 
                make_iterator_range(str1.begin()+1, str1.begin()+4))==string("13abc2") );

        string strout;
        erase_range_copy( 
                back_inserter( strout ),
                str1, 
                make_iterator_range(str1.begin()+1, str1.begin()+4));
        BOOST_CHECK( strout==string("13abc2") );

        erase_range( 
                str1, 
                make_iterator_range(str1.begin()+1, str1.begin()+4));
        BOOST_CHECK( str1==string("13abc2") );
    }
}

void collection_comp_test()
{
    // container traits compatibility tests
    {
        string strout;
        replace_first_copy( back_inserter(strout), "1abc3abc2", "abc", "YYY" );
        BOOST_CHECK( strout==string("1YYY3abc2") ); 
    }
    {
        string strout;
        replace_last_copy( back_inserter(strout), "1abc3abc2", "abc", "YYY" );
        BOOST_CHECK( strout==string("1abc3YYY2") ); 
    }   
    {
        string strout;
        replace_all_copy( back_inserter(strout), "1abc3abc2", "abc", "YYY" );
        BOOST_CHECK( strout==string("1YYY3YYY2") ); 
    }   
    {
        string strout;
        replace_nth_copy( back_inserter(strout), "1abc3abc2", "abc", 1, "YYY" );
        BOOST_CHECK( strout==string("1abc3YYY2") ); 
    }   
    {
        string strout;
        replace_head_copy( back_inserter(strout), "abc3abc2", 3 , "YYY" );
        BOOST_CHECK( strout==string("YYY3abc2") ); 
    }   
    {
        string strout;
        replace_tail_copy( back_inserter(strout), "abc3abc", 3 , "YYY" );
        BOOST_CHECK( strout==string("abc3YYY") ); 
    }   
}

// test main 
int test_main( int, char*[] )
{
    sequence_traits_test(); 
    replace_first_test();
    replace_last_test();
    replace_all_test();
    replace_nth_test();
    replace_head_test();
    replace_tail_test();
    replace_range_test();
    collection_comp_test();

    return 0;
}
