1 // (C) Copyright Gennadiy Rozental 2011-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 monomorphic grid
10 // ***************************************************************************
11
12 // Boost.Test
13 #include <boost/test/unit_test.hpp>
14 #include <boost/test/data/monomorphic/grid.hpp>
15 #include <boost/test/data/monomorphic/singleton.hpp>
16 #include <boost/test/data/monomorphic/array.hpp>
17 #include <boost/test/data/monomorphic/collection.hpp>
18 #include <boost/test/data/monomorphic/generators/xrange.hpp>
19 #include <boost/test/data/for_each_sample.hpp>
20
21 namespace data = boost::unit_test::data;
22
23 #include "datasets-test.hpp"
24
25 //____________________________________________________________________________//
26
BOOST_AUTO_TEST_CASE(test_mono_grid_size_and_composition)27 BOOST_AUTO_TEST_CASE( test_mono_grid_size_and_composition )
28 {
29 BOOST_TEST( (data::make( 1 ) * data::make( 5 )).size() == 1 );
30 BOOST_TEST( (data::make( std::vector<int>(2) ) * data::make( std::list<float>(2) )).size() == 4 );
31 BOOST_TEST( (data::make( std::vector<int>(2) ) * data::make( 5. )).size() == 2 );
32 BOOST_TEST( (data::make( std::vector<int>(3) ) * data::make( std::list<int>(1) )).size() == 3 );
33
34 BOOST_TEST( (data::make( std::vector<int>(3) ) * data::make( std::list<std::string>(3) ) * data::make( 5 )).size() == 9 );
35 BOOST_TEST( (data::make( std::vector<int>(1) ) * data::make( std::list<int>(3) ) * data::make( 5 )).size() == 3 );
36 }
37
38 //____________________________________________________________________________//
39
BOOST_AUTO_TEST_CASE(test_mono_grid_with_xrange)40 BOOST_AUTO_TEST_CASE( test_mono_grid_with_xrange )
41 {
42 auto ds1 = data::make(1);
43 auto ds2 = data::xrange(5);
44
45 BOOST_TEST( (ds1 * ds2).size() == 5 );
46 BOOST_TEST( (ds1 * ds2).size() == 5 );
47 }
48
49 //____________________________________________________________________________//
50
BOOST_AUTO_TEST_CASE(test_mono_grid_cpp11_features)51 BOOST_AUTO_TEST_CASE( test_mono_grid_cpp11_features )
52 {
53 int arr1[] = {1,2};
54 char const* arr2[] = {"a","b"};
55 int* exp1 = arr1;
56 char const** exp2 = arr2;
57 invocation_count ic;
58
59 auto samples1 = data::make( arr1 ) * data::make( arr2 );
60
61 BOOST_TEST( samples1.size() == 4 );
62
63 ic.m_value = 0;
64 data::for_each_sample( samples1, ic );
65 BOOST_TEST( ic.m_value == 4 );
66
67 data::for_each_sample( samples1, check_arg_type_like<std::tuple<int,char const*>>() );
68
69 int c = 0;
70 data::for_each_sample( samples1, [&c,exp1,exp2](int i,char const* s) {
71 BOOST_TEST( i == exp1[c/2] );
72 BOOST_TEST( s == exp2[c%2] );
73 ++c;
74 });
75
76 std::vector<double> vec1;
77 vec1.push_back(2.1);
78 vec1.push_back(3.2);
79 vec1.push_back(4.7);
80 int arr3[] = {4,2,1};
81
82 auto samples2 = data::make( vec1 ) * data::make( "qqq" ) * data::make( arr3 );
83
84 BOOST_TEST( samples2.size() == 9 );
85
86 ic.m_value = 0;
87 data::for_each_sample( samples2, ic );
88 BOOST_TEST( ic.m_value == 9 );
89
90 data::for_each_sample( samples2, check_arg_type_like<std::tuple<double,char const*,int>>() );
91
92 int* exp3 = arr3;
93 c = 0;
94
95 data::for_each_sample( samples2, [&c,&vec1,exp3](double a1,char const* a2,int a3) {
96 BOOST_TEST( a1 == vec1[c/3] );
97 BOOST_TEST( a2 == "qqq" );
98 BOOST_TEST( a3 == exp3[c%3] );
99 ++c;
100 });
101
102 }
103
104 //____________________________________________________________________________//
105
BOOST_AUTO_TEST_CASE(test_mono_grid_number_of_copies)106 BOOST_AUTO_TEST_CASE( test_mono_grid_number_of_copies )
107 {
108 copy_count::value() = 0;
109 data::for_each_sample( data::make( copy_count() ) * data::make( copy_count() ), check_arg_type<std::tuple<copy_count,copy_count>>() );
110 BOOST_TEST( copy_count::value() == 0 );
111
112 copy_count::value() = 0;
113 data::for_each_sample( data::make( copy_count() ) * data::make( copy_count() ) * data::make( copy_count() ),
114 check_arg_type<std::tuple<copy_count,copy_count,copy_count>>() );
115 BOOST_TEST( copy_count::value() == 0 );
116
117 copy_count::value() = 0;
118 data::for_each_sample( data::make( copy_count() ) * (data::make( copy_count() ) * data::make( copy_count() )),
119 check_arg_type<std::tuple<copy_count,copy_count,copy_count>>() );
120 BOOST_TEST( copy_count::value() == 0 );
121 }
122
123 //____________________________________________________________________________//
124
BOOST_AUTO_TEST_CASE(test_mono_grid_number_of_copies_auto)125 BOOST_AUTO_TEST_CASE( test_mono_grid_number_of_copies_auto )
126 {
127 auto ds1 = data::make( copy_count() );
128 auto const ds2 = data::make( copy_count() );
129
130 copy_count::value() = 0;
131 data::for_each_sample( ds1 * ds1, check_arg_type<std::tuple<copy_count,copy_count>>() );
132 BOOST_TEST( copy_count::value() == 0 );
133
134 copy_count::value() = 0;
135 data::for_each_sample( ds2 * ds2, check_arg_type<std::tuple<copy_count,copy_count>>() );
136 BOOST_TEST( copy_count::value() == 0 );
137
138 copy_count::value() = 0;
139 data::for_each_sample( ds1 * ds2, check_arg_type<std::tuple<copy_count,copy_count>>() );
140 BOOST_TEST( copy_count::value() == 0 );
141
142 copy_count::value() = 0;
143 auto zp1 = ds1 * data::make( copy_count() );
144 BOOST_TEST( zp1.size() == 1 );
145 data::for_each_sample( zp1, check_arg_type<std::tuple<copy_count,copy_count>>() );
146 BOOST_TEST( copy_count::value() == 0 );
147
148 copy_count::value() = 0;
149 data::for_each_sample( data::make( copy_count() ) * ds1, check_arg_type<std::tuple<copy_count,copy_count>>() );
150 BOOST_TEST( copy_count::value() == 0 );
151
152 copy_count::value() = 0;
153 data::for_each_sample( ds1 * ds2 * ds1, check_arg_type<std::tuple<copy_count,copy_count,copy_count>>() );
154 BOOST_TEST( copy_count::value() == 0 );
155
156 copy_count::value() = 0;
157 data::for_each_sample( ds1 * (ds1 * ds2), check_arg_type<std::tuple<copy_count,copy_count,copy_count>>() );
158 BOOST_TEST( copy_count::value() == 0 );
159
160 copy_count::value() = 0;
161 int std_vector_constructor_count = 0;
162 {
163 std::vector<copy_count> v(2); // we cannot do better than std::vector constructor
164 std_vector_constructor_count = copy_count::value()/2;
165 }
166
167 copy_count::value() = 0;
168 auto ds3 = data::make( make_copy_count_collection() ) * data::make( make_copy_count_collection() );
169 BOOST_TEST( ds3.size() == 9 );
170 data::for_each_sample( ds3, check_arg_type<std::tuple<copy_count,copy_count>>() );
171 BOOST_TEST( copy_count::value() == std_vector_constructor_count *2 *3);
172 }
173
BOOST_AUTO_TEST_CASE(test_mono_grid_variadic_dimension)174 BOOST_AUTO_TEST_CASE( test_mono_grid_variadic_dimension )
175 {
176 // tests that the grid dimension can be > 3
177
178 BOOST_TEST( (data::make( 1 ) * data::make( 5 ) * data::make( 1 )).size() == 1 );
179 BOOST_TEST( (data::make( 1 ) * data::make( 5 ) * data::make( 1 ) * data::make( 1 )).size() == 1 );
180
181 BOOST_TEST( (data::xrange(2) * data::xrange(2) * data::xrange(2) * data::xrange(2)).size() == (1 << 4));
182 }
183
184 //____________________________________________________________________________//
185
186 // EOF
187
188