//  Boost string_algo library conv_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/case_conv.hpp>

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

#include <string>
#include <iostream>
#include <algorithm>
#include <boost/test/test_tools.hpp>

using namespace std;
using namespace boost;

void conv_test()
{
    string str1("AbCdEfG 123 xxxYYYzZzZ");
    string str2("AbCdEfG 123 xxxYYYzZzZ");
    string str3("");
    const char pch[]="AbCdEfG 123 xxxYYYzZzZ";    
    unsigned int pchlen=sizeof(pch);

    char* pch1=new char[pchlen];
    std::copy(pch, pch+pchlen, pch1);
    char* pch2=new char[pchlen];
    std::copy(pch, pch+pchlen, pch2);

    // *** iterator tests *** //

    string strout;
    to_lower_copy( back_inserter(strout), str1 );
    BOOST_CHECK( strout=="abcdefg 123 xxxyyyzzzz" );
    strout.clear();
    to_upper_copy( back_inserter(strout), str1 );
    BOOST_CHECK( strout=="ABCDEFG 123 XXXYYYZZZZ" );

    strout.clear();
    to_lower_copy( back_inserter(strout), "AbCdEfG 123 xxxYYYzZzZ" );
    BOOST_CHECK( strout=="abcdefg 123 xxxyyyzzzz" );
    strout.clear();
    to_upper_copy( back_inserter(strout), "AbCdEfG 123 xxxYYYzZzZ" );
    BOOST_CHECK( strout=="ABCDEFG 123 XXXYYYZZZZ" );

    strout.clear();
    to_lower_copy( back_inserter(strout), pch1 );
    BOOST_CHECK( strout=="abcdefg 123 xxxyyyzzzz" );
    strout.clear();
    to_upper_copy( back_inserter(strout), pch1 );
    BOOST_CHECK( strout=="ABCDEFG 123 XXXYYYZZZZ" );

    // *** value passing tests *** //

    BOOST_CHECK( to_lower_copy( str1 )=="abcdefg 123 xxxyyyzzzz" );
    BOOST_CHECK( to_upper_copy( str1 )=="ABCDEFG 123 XXXYYYZZZZ" );

    BOOST_CHECK( to_lower_copy( str3 )=="" );
    BOOST_CHECK( to_upper_copy( str3 )=="" );

    // *** inplace tests *** //

    to_lower( str1 );
    BOOST_CHECK( str1=="abcdefg 123 xxxyyyzzzz" );
    to_upper( str2 );
    BOOST_CHECK( str2=="ABCDEFG 123 XXXYYYZZZZ" );

    // c-string modification
    to_lower( pch1 );
    BOOST_CHECK( string(pch1)=="abcdefg 123 xxxyyyzzzz" );
    to_upper( pch2 );
    BOOST_CHECK( string(pch2)=="ABCDEFG 123 XXXYYYZZZZ" );

    to_lower( str3 );
    BOOST_CHECK( str3=="" );
    to_upper( str3 );
    BOOST_CHECK( str3=="" );

    delete[] pch1;
    delete[] pch2;
}

// test main 
int test_main( int, char*[] )
{
    conv_test();
    
    return 0;
}
