// 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_keys_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_keys,
            std::ostream_iterator<int>(std::cout, ","));

        
        std::vector<int> reference;
        reference += 0,1,2,3,4,5,6,7,8,9;

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

        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_keys_example" );

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

    return test;
}
