//  Boost string_algo library iterator_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/join.hpp>
#include <boost/algorithm/string/classification.hpp>
// equals predicate is used for result comparison
#include <boost/algorithm/string/predicate.hpp>

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

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

#include <boost/test/test_tools.hpp>


using namespace std;
using namespace boost;

bool is_not_empty(const std::string& str)
{
    return !str.empty();
}

void join_test()
{
    // Prepare inputs
    vector<string> tokens1;
    tokens1.push_back("xx");
    tokens1.push_back("abc");
    tokens1.push_back("xx");

    vector<string> tokens2;
    tokens2.push_back("");
    tokens2.push_back("xx");
    tokens2.push_back("abc");
    tokens2.push_back("");
    tokens2.push_back("abc");
    tokens2.push_back("xx");
    tokens2.push_back("");

    vector<string> tokens3;
    tokens3.push_back("");
    tokens3.push_back("");
    tokens3.push_back("");

    vector<string> empty_tokens;

    vector<vector<int> > vtokens;
    for(unsigned int n=0; n<tokens2.size(); ++n)
    {
        vtokens.push_back(vector<int>(tokens2[n].begin(), tokens2[n].end()));
    }

    BOOST_CHECK( equals(join(tokens1, "-"), "xx-abc-xx") );
    BOOST_CHECK( equals(join(tokens2, "-"), "-xx-abc--abc-xx-") );
    BOOST_CHECK( equals(join(vtokens, "-"), "-xx-abc--abc-xx-") );
    BOOST_CHECK( equals(join(empty_tokens, "-"), "") );

    BOOST_CHECK( equals(join_if(tokens2, "-", is_not_empty), "xx-abc-abc-xx") );
    BOOST_CHECK( equals(join_if(empty_tokens, "-", is_not_empty), "") );
    BOOST_CHECK( equals(join_if(tokens3, "-", is_not_empty), "") );
}

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