• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
23 namespace boost
24 {
25     namespace
26     {
27         template<class ForwardRange1, class ForwardRange2>
test_lexicographical_compare_impl_nopred(ForwardRange1 & rng1,ForwardRange2 & rng2)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>
test_lexicographical_compare_impl_pred(ForwardRange1 & rng1,ForwardRange2 & rng2,BinaryPredicate pred)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>
test_lexicographical_compare_impl(Container1 & cont1,Container2 & cont2)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>
test_lexicographical_compare_impl()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>
test_lexicographical_compare_rhs()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 
test_lexicographical_compare()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 
148 boost::unit_test::test_suite*
init_unit_test_suite(int argc,char * argv[])149 init_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