/*=============================================================================
    Copyright (c) 2005-2007 Dan Marsden
    Copyright (c) 2005-2007 Joel de Guzman

    Distributed under 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)
==============================================================================*/

#include <boost/spirit/home/phoenix/stl/algorithm/querying.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/detail/lightweight_test.hpp>

#include <boost/range.hpp>

#include <functional>

namespace
{
    void includes_test()
    {
        using namespace boost::phoenix;
        using namespace boost::phoenix::arg_names;
        int array[] = {1,2,3};
        int array2[] = {1,2};
        BOOST_TEST(includes(arg1, arg2)(array, array2));
        boost::iterator_range<int*> rng(array + 1, array + 3);
        BOOST_TEST(!includes(arg1, arg2)(rng, array2));

        int array3[] = {3,2,1};
        int array4[] = {2,1};
        BOOST_TEST(boost::phoenix::includes(arg1, arg2, std::greater<int>())(array3, array4));
        boost::iterator_range<int*> rng2(array3, array3 + 2);
        BOOST_TEST(!boost::phoenix::includes(arg1, arg2, std::greater<int>())(rng2, array4));
        return;
    }

    void min_element_test()
    {
        using namespace boost::phoenix;
        using namespace boost::phoenix::arg_names;
        int array[] = {1,3,2};
        BOOST_TEST(min_element(arg1)(array) == array);
        BOOST_TEST(boost::phoenix::min_element(arg1, std::greater<int>())(array) == array + 1);
        return;
    }

    void max_element_test()
    {
        using namespace boost::phoenix;
        using namespace boost::phoenix::arg_names;
        int array[] = {1,3,2};
        BOOST_TEST(max_element(arg1)(array) == array + 1);
        BOOST_TEST(boost::phoenix::max_element(arg1, std::greater<int>())(array) == array);
        return;
    }

    void lexicographical_compare_test()
    {
        using namespace boost::phoenix;
        using namespace boost::phoenix::arg_names;
        int array[] = {1,2,3};
        int array2[] = {1,2,4};

        BOOST_TEST(lexicographical_compare(arg1, arg2)(array, array2));
        BOOST_TEST(!lexicographical_compare(arg1, arg2)(array2, array));
        BOOST_TEST(!lexicographical_compare(arg1, arg2)(array, array));

        BOOST_TEST(!boost::phoenix::lexicographical_compare(arg1, arg2, std::greater<int>())(array, array2));
        BOOST_TEST(boost::phoenix::lexicographical_compare(arg1, arg2, std::greater<int>())(array2, array));
        BOOST_TEST(!boost::phoenix::lexicographical_compare(arg1, arg2, std::greater<int>())(array, array));

        return;
    }
}

int main()
{
    includes_test();
    min_element_test();
    max_element_test();
    lexicographical_compare_test();
    return boost::report_errors();
}
