1 // Boost.Range library
2 //
3 // Copyright Neil Groves 2014
4 //
5 // Copyright Thorsten Ottosen 2006. Use, modification and
6 // distribution is subject to the Boost Software License, Version
7 // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //
10 // For more information, see http://www.boost.org/libs/range/
11 //
12 #include <boost/range/combine.hpp>
13
14 #include <boost/range/algorithm_ext/push_back.hpp>
15
16 #include <boost/test/test_tools.hpp>
17 #include <boost/test/unit_test.hpp>
18 #include <boost/foreach.hpp>
19 #include <vector>
20
21 namespace boost_range_test
22 {
23 namespace
24 {
25
26 template<typename ContRef1, typename ContRef2>
test_combine2()27 void test_combine2()
28 {
29 std::vector<int> v;
30 std::list<int> l;
31
32 for (int i = 0; i < 10; ++i)
33 {
34 v.push_back(i);
35 l.push_back(i * 2);
36 }
37
38 ContRef1& in1 = v;
39 ContRef2& in2 = l;
40
41 std::vector<boost::tuple<int,int> > output;
42 boost::push_back(output, boost::combine(in1, in2));
43
44 int index = 0;
45 int i1, i2;
46 BOOST_FOREACH(boost::tie(i1,i2), output)
47 {
48 BOOST_CHECK_EQUAL(i1, index);
49 BOOST_CHECK_EQUAL(i2, index * 2);
50 ++index;
51 }
52 }
53
54 template<typename ContRef1, typename ContRef2, typename ContRef3>
test_combine3()55 void test_combine3()
56 {
57 std::vector<int> v1;
58 std::vector<int> v2;
59 std::vector<int> v3;
60
61 for (int i = 0; i < 10; ++i)
62 {
63 v1.push_back(i);
64 v2.push_back(i * 2);
65 v3.push_back(i * 3);
66 }
67
68 ContRef1& in1 = v1;
69 ContRef2& in2 = v2;
70 ContRef3& in3 = v3;
71
72 std::vector<boost::tuple<int,int,int> > output;
73 boost::push_back(output, boost::combine(in1, in2, in3));
74
75 int index = 0;
76 int i1, i2, i3;
77
78 BOOST_FOREACH(boost::tie(i1,i2,i3), output)
79 {
80 BOOST_CHECK_EQUAL(i1, index);
81 BOOST_CHECK_EQUAL(i2, index * 2);
82 BOOST_CHECK_EQUAL(i3, index * 3);
83 ++index;
84 }
85 }
86
87 } // anonymous namespace
88 } // namespace boost_range_test
89
init_unit_test_suite(int,char * [])90 boost::unit_test::test_suite* init_unit_test_suite(int, char*[] )
91 {
92 boost::unit_test::test_suite* test =
93 BOOST_TEST_SUITE( "Boost.Range combine() test suite" );
94
95 test->add(BOOST_TEST_CASE((
96 &boost_range_test::test_combine2<
97 const std::vector<int>, const std::list<int> >)));
98
99 test->add(BOOST_TEST_CASE((
100 &boost_range_test::test_combine2<
101 const std::vector<int>, std::list<int> >)));
102
103 test->add(BOOST_TEST_CASE((
104 &boost_range_test::test_combine2<
105 std::vector<int>, const std::list<int> >)));
106
107 test->add(BOOST_TEST_CASE((
108 &boost_range_test::test_combine2<
109 std::vector<int>, std::list<int> >)));
110
111 test->add(BOOST_TEST_CASE((
112 &boost_range_test::test_combine3<
113 std::vector<int>,
114 std::vector<int>,
115 std::vector<int> >)));
116
117 test->add(BOOST_TEST_CASE((
118 &boost_range_test::test_combine3<
119 std::vector<int>,
120 std::vector<int>,
121 const std::vector<int> >)));
122
123 test->add(BOOST_TEST_CASE((
124 &boost_range_test::test_combine3<
125 std::vector<int>,
126 const std::vector<int>,
127 std::vector<int> >)));
128
129 test->add(BOOST_TEST_CASE((
130 &boost_range_test::test_combine3<
131 std::vector<int>,
132 const std::vector<int>,
133 const std::vector<int> >)));
134
135 test->add(BOOST_TEST_CASE((
136 &boost_range_test::test_combine3<
137 const std::vector<int>,
138 std::vector<int>,
139 std::vector<int> >)));
140
141 test->add(BOOST_TEST_CASE((
142 &boost_range_test::test_combine3<
143 const std::vector<int>,
144 std::vector<int>,
145 const std::vector<int> >)));
146
147 test->add(BOOST_TEST_CASE((
148 &boost_range_test::test_combine3<
149 const std::vector<int>,
150 const std::vector<int>,
151 std::vector<int> >)));
152
153 test->add(BOOST_TEST_CASE((
154 &boost_range_test::test_combine3<
155 const std::vector<int>,
156 const std::vector<int>,
157 const std::vector<int> >)));
158
159 return test;
160 }
161