• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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