1// Copyright Neil Groves 2009. Use, modification and
2// distribution is subject to the Boost Software License, Version
3// 1.0. (See accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5//
6//
7// For more information, see http://www.boost.org/libs/range/
8//
9#include <boost/range/algorithm/lexicographical_compare.hpp>
10
11#include <boost/test/test_tools.hpp>
12#include <boost/test/unit_test.hpp>
13
14#include <boost/assign.hpp>
15#include <boost/range/value_type.hpp>
16#include <algorithm>
17#include <functional>
18#include <list>
19#include <numeric>
20#include <deque>
21#include <vector>
22
23namespace boost
24{
25 namespace
26 {
27 template<class ForwardRange1, class ForwardRange2>
28 void test_lexicographical_compare_impl_nopred(ForwardRange1& rng1,
29 ForwardRange2& rng2)
30 {
31 const bool reference = std::lexicographical_compare(
32 boost::begin(rng1), boost::end(rng1),
33 boost::begin(rng2), boost::end(rng2));
34
35 const bool test = boost::lexicographical_compare(rng1, rng2);
36
37 BOOST_CHECK( reference == test );
38 BOOST_CHECK( test == boost::lexicographical_compare(boost::make_iterator_range(rng1), rng2) );
39 BOOST_CHECK( test == boost::lexicographical_compare(rng1, boost::make_iterator_range(rng2)) );
40 BOOST_CHECK( test == boost::lexicographical_compare(boost::make_iterator_range(rng1), boost::make_iterator_range(rng2)) );
41 }
42
43 template<class ForwardRange1, class ForwardRange2,
44 class BinaryPredicate>
45 void test_lexicographical_compare_impl_pred(ForwardRange1& rng1,
46 ForwardRange2& rng2,
47 BinaryPredicate pred)
48 {
49 const bool reference = std::lexicographical_compare(
50 boost::begin(rng1), boost::end(rng1),
51 boost::begin(rng2), boost::end(rng2),
52 pred);
53
54 const bool test = boost::lexicographical_compare(rng1, rng2, pred);
55
56 BOOST_CHECK( reference == test );
57 BOOST_CHECK( test == boost::lexicographical_compare(boost::make_iterator_range(rng1), rng2, pred) );
58 BOOST_CHECK( test == boost::lexicographical_compare(rng1, boost::make_iterator_range(rng2), pred) );
59 BOOST_CHECK( test == boost::lexicographical_compare(boost::make_iterator_range(rng1), boost::make_iterator_range(rng2), pred) );
60 }
61
62 template<class Container1, class Container2>
63 void test_lexicographical_compare_impl(Container1& cont1,
64 Container2& cont2)
65 {
66 typedef BOOST_DEDUCED_TYPENAME boost::range_value<Container1>::type value_t;
67
68 test_lexicographical_compare_impl_nopred(cont1, cont2);
69 test_lexicographical_compare_impl_pred(cont1, cont2, std::less<value_t>());
70 test_lexicographical_compare_impl_pred(cont1, cont2, std::greater<value_t>());
71 }
72
73 template<class Container1, class Container2>
74 void test_lexicographical_compare_impl()
75 {
76 using namespace boost::assign;
77
78 typedef BOOST_DEDUCED_TYPENAME boost::remove_const<Container1>::type container1_t;
79 typedef BOOST_DEDUCED_TYPENAME boost::remove_const<Container2>::type container2_t;
80
81 container1_t cont1;
82 container2_t cont2;
83 test_lexicographical_compare_impl<Container1,Container2>(cont1, cont2);
84
85 cont1.clear();
86 cont2.clear();
87 cont1.push_back(1);
88 cont2.push_back(1);
89 test_lexicographical_compare_impl<Container1,Container2>(cont1, cont2);
90
91 cont1.clear();
92 cont2.clear();
93 cont1 += 2;
94 cont2 += 1;
95 test_lexicographical_compare_impl<Container1,Container2>(cont1, cont2);
96
97 cont1.clear();
98 cont2.clear();
99 cont1 += 1;
100 cont2 += 2;
101 test_lexicographical_compare_impl<Container1,Container2>(cont1, cont2);
102
103 cont1.clear();
104 cont2.clear();
105 cont1 += 1,2,3,4,5,6,7;
106 cont2 += 1,2,3,4,5,6,7;
107 test_lexicographical_compare_impl<Container1,Container2>(cont1, cont2);
108
109 cont1.clear();
110 cont2.clear();
111 cont1 += 1,2,3,4,5,6,7;
112 cont2 += 1,2,3,4,5,6;
113 test_lexicographical_compare_impl<Container1,Container2>(cont1, cont2);
114
115 cont1.clear();
116 cont2.clear();
117 cont1 += 1,2,3,4,5,6;
118 cont2 += 1,2,3,4,5,6,7;
119 test_lexicographical_compare_impl<Container1,Container2>(cont1, cont2);
120 }
121
122 template<class Container1>
123 void test_lexicographical_compare_rhs()
124 {
125 typedef BOOST_DEDUCED_TYPENAME range_value<Container1>::type value_t;
126
127 test_lexicographical_compare_impl<Container1, const std::vector<value_t> >();
128 test_lexicographical_compare_impl<Container1, const std::deque<value_t> >();
129 test_lexicographical_compare_impl<Container1, const std::list<value_t> >();
130 test_lexicographical_compare_impl<Container1, std::vector<value_t> >();
131 test_lexicographical_compare_impl<Container1, std::deque<value_t> >();
132 test_lexicographical_compare_impl<Container1, std::list<value_t> >();
133 }
134
135 void test_lexicographical_compare()
136 {
137 test_lexicographical_compare_rhs< const std::vector<int> >();
138 test_lexicographical_compare_rhs< const std::deque<int> >();
139 test_lexicographical_compare_rhs< const std::list<int> >();
140 test_lexicographical_compare_rhs< std::vector<int> >();
141 test_lexicographical_compare_rhs< std::deque<int> >();
142 test_lexicographical_compare_rhs< std::list<int> >();
143 }
144 }
145}
146
147
148boost::unit_test::test_suite*
149init_unit_test_suite(int argc, char* argv[])
150{
151 boost::unit_test::test_suite* test
152 = BOOST_TEST_SUITE( "RangeTestSuite.algorithm.lexicographical_compare" );
153
154 test->add( BOOST_TEST_CASE( &boost::test_lexicographical_compare ) );
155
156 return test;
157}
158

source code of boost/libs/range/test/algorithm_test/lexicographical_compare.cpp