// Boost.Range library
//
//  Copyright Neil Groves 2009. 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)
//
//
// For more information, see http://www.boost.org/libs/range/
//
#include <boost/range/adaptor/map.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/assign.hpp>
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>

#include <boost/test/test_tools.hpp>
#include <boost/test/unit_test.hpp>

#include <boost/range/algorithm_ext/push_back.hpp>

namespace 
{
    void map_values_example_test()
    {
        using namespace boost::assign;
        using namespace boost::adaptors;

        std::map<int,int> input;
        for (int i = 0; i < 10; ++i)
            input.insert(std::make_pair(i, i * 10));

        boost::copy(
            input | map_values,
            std::ostream_iterator<int>(std::cout, ","));

        
        std::vector<int> reference;
        reference += 0,10,20,30,40,50,60,70,80,90;

        std::vector<int> test;
        boost::push_back(test, input | map_values);

        BOOST_CHECK_EQUAL_COLLECTIONS( reference.begin(), reference.end(),
            test.begin(), test.end() );
    }
}

boost::unit_test::test_suite*
init_unit_test_suite(int argc, char* argv[])
{
    boost::unit_test::test_suite* test
        = BOOST_TEST_SUITE( "RangeTestSuite.adaptor.map_values_example" );

    test->add( BOOST_TEST_CASE( &map_values_example_test ) );

    return test;
}
