• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  (C) Copyright Gennadiy Rozental 2015.
2 //  Distributed under the Boost Software License, Version 1.0.
3 //  (See accompanying file LICENSE_1_0.txt or copy at
4 //  http://www.boost.org/LICENSE_1_0.txt)
5 
6 //  See http://www.boost.org/libs/test for the library home page.
7 //
8 /// @file
9 /// @brief tests collection comparison implementation
10 // ***************************************************************************
11 
12 // Boost.Test
13 #define BOOST_TEST_MODULE Test collection`s comparisons
14 #include <boost/test/unit_test.hpp>
15 namespace tt = boost::test_tools;
16 namespace ut = boost::unit_test;
17 
BOOST_TEST_SPECIALIZED_COLLECTION_COMPARE(std::vector<int>)18 BOOST_TEST_SPECIALIZED_COLLECTION_COMPARE(std::vector<int>)
19 
20 #define VALIDATE_OP( op )                           \
21 {                                                   \
22     BOOST_TEST_INFO( "validating operator " #op );  \
23     bool expected = (c1 op c2);                     \
24     auto const& res = (tt::assertion::seed()->* c1 op c2).evaluate();      \
25     BOOST_TEST( expected == !!res );                \
26 }                                                   \
27 /**/
28 
29 template<typename Col>
30 void
31 validate_comparisons(Col const& c1, Col const& c2 )
32 {
33     VALIDATE_OP( == )
34     VALIDATE_OP( != )
35     VALIDATE_OP( < )
36     VALIDATE_OP( > )
37     VALIDATE_OP( <= )
38     VALIDATE_OP( >= )
39 }
40 
BOOST_AUTO_TEST_CASE(test_against_overloaded_comp_op)41 BOOST_AUTO_TEST_CASE( test_against_overloaded_comp_op )
42 {
43     std::vector<int> a{1, 2, 3};
44     std::vector<int> b{1, 3, 2};
45     std::vector<int> c{1, 2, 3};
46     std::vector<int> d{1, 2, 3, 4};
47 
48     BOOST_TEST_CONTEXT( "validating comparisons of a and b" )
49         validate_comparisons(a, b);
50     BOOST_TEST_CONTEXT( "validating comparisons of a and c" )
51         validate_comparisons(a, c);
52     BOOST_TEST_CONTEXT( "validating comparisons of a and d" )
53         validate_comparisons(a, d);
54 }
55 
56 //____________________________________________________________________________//
57 
58 BOOST_AUTO_TEST_CASE( test_per_element_eq, * ut::expected_failures(2) )
59 {
60     std::vector<int> a{1, 2, 3};
61     std::vector<int> b{1, 3, 2};
62 
63     BOOST_TEST( a == b, tt::per_element() );
64 }
65 
66 //____________________________________________________________________________//
67 
68 BOOST_AUTO_TEST_CASE( test_per_element_ne, * ut::expected_failures(1) )
69 {
70     std::vector<int> a{1, 2, 3};
71     std::vector<int> b{1, 3, 2};
72 
73     BOOST_TEST( a != b, tt::per_element() );
74 }
75 
76 //____________________________________________________________________________//
77 
78 BOOST_AUTO_TEST_CASE( test_per_element_lt, * ut::expected_failures(2) )
79 {
80     std::vector<int> a{1, 2, 3};
81     std::vector<int> b{1, 3, 2};
82 
83     BOOST_TEST( a < b, tt::per_element() );
84 }
85 
86 //____________________________________________________________________________//
87 
88 BOOST_AUTO_TEST_CASE( test_per_element_ge, * ut::expected_failures(1) )
89 {
90     std::vector<int> a{1, 2, 3};
91     std::vector<int> b{1, 3, 2};
92 
93     BOOST_TEST( b >= a, tt::per_element() );
94 }
95 
96 //____________________________________________________________________________//
97 
BOOST_AUTO_TEST_CASE(test_lexicographic_lt)98 BOOST_AUTO_TEST_CASE( test_lexicographic_lt )
99 {
100     std::vector<int> a{1, 2, 3};
101     std::vector<int> b{1, 3, 2};
102 
103     BOOST_TEST( a < b, tt::lexicographic() );
104 }
105 
106 //____________________________________________________________________________//
107 
BOOST_AUTO_TEST_CASE(test_lexicographic_le)108 BOOST_AUTO_TEST_CASE( test_lexicographic_le )
109 {
110     std::vector<int> a{1, 2, 3};
111     std::vector<int> b{1, 3, 2};
112 
113     BOOST_TEST( a <= b, tt::lexicographic() );
114 }
115 
116 //____________________________________________________________________________//
117 
BOOST_AUTO_TEST_CASE(test_lexicographic_gt)118 BOOST_AUTO_TEST_CASE( test_lexicographic_gt )
119 {
120     std::vector<int> a{1, 2, 3};
121     std::vector<int> b{1, 3, 2};
122 
123     BOOST_TEST( b > a, tt::lexicographic() );
124 }
125 
126 //____________________________________________________________________________//
127 
BOOST_AUTO_TEST_CASE(test_lexicographic_ge)128 BOOST_AUTO_TEST_CASE( test_lexicographic_ge )
129 {
130     std::vector<int> a{1, 2, 3};
131     std::vector<int> b{1, 3, 2};
132 
133     BOOST_TEST( b >= a, tt::lexicographic() );
134 }
135 
136 //____________________________________________________________________________//
137 
BOOST_AUTO_TEST_CASE(test_collection_of_collection_comp)138 BOOST_AUTO_TEST_CASE( test_collection_of_collection_comp )
139 {
140     BOOST_TEST( std::string("abc") == std::string("abc") );
141 }
142 
143 //____________________________________________________________________________//
144 
145 // this one does not have const_iterator nor a size, but should be forward iterable
146 // and possible to use in the collection comparison
147 struct fwd_iterable_custom {
148   typedef std::vector<int>::const_iterator custom_iterator; // named "exotic" on purpose
149 
beginfwd_iterable_custom150   custom_iterator begin() const { return values.begin(); }
endfwd_iterable_custom151   custom_iterator end() const { return values.end(); }
152 
153 #if !defined(BOOST_MSVC) || (BOOST_MSVC_FULL_VER > 180040629)
154 #define MY_TEST_HAS_INIT_LIST
155   // this does not work on VC++ 2013 update 5
fwd_iterable_customfwd_iterable_custom156   fwd_iterable_custom(std::initializer_list<int> ilist) : values{ilist}
157   {}
158 #else
fwd_iterable_customfwd_iterable_custom159   fwd_iterable_custom(int v1, int v2, int v3) {
160     values.push_back(v1);
161     values.push_back(v2);
162     values.push_back(v3);
163   }
164 #endif
165 private:
166   std::vector<int> values;
167 };
168 
BOOST_AUTO_TEST_CASE(test_collection_requirement_type)169 BOOST_AUTO_TEST_CASE( test_collection_requirement_type )
170 {
171 #ifdef MY_TEST_HAS_INIT_LIST
172     fwd_iterable_custom a{3,4,5};
173     fwd_iterable_custom b{3,4,6};
174     fwd_iterable_custom c{3,4,5};
175 #else
176     fwd_iterable_custom a(3,4,5);
177     fwd_iterable_custom b(3,4,6);
178     fwd_iterable_custom c(3,4,5);
179 #endif
180 
181     BOOST_TEST( a == a, tt::per_element() );
182     //BOOST_TEST( a != b, tt::per_element() );
183     BOOST_TEST( a == c, tt::per_element() );
184 
185     BOOST_TEST( a < b, tt::lexicographic() );
186     BOOST_TEST( a <= c, tt::lexicographic() );
187     BOOST_TEST( b > c, tt::lexicographic() );
188 
189     BOOST_TEST( a <= b, tt::per_element() );
190     BOOST_TEST( a <= c, tt::per_element() );
191 }
192 
193 // EOF
194