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 join
10 // ***************************************************************************
11
12 // Boost.Test
13 #include <boost/test/unit_test.hpp>
14 #include <boost/test/data/monomorphic/join.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 namespace data=boost::unit_test::data;
19
20 #include "datasets-test.hpp"
21
22 //____________________________________________________________________________//
23
BOOST_AUTO_TEST_CASE(test_mono_join)24 BOOST_AUTO_TEST_CASE( test_mono_join )
25 {
26 BOOST_TEST( (data::make( 1 ) + data::make( 5 )).size() == 2 );
27 BOOST_TEST( (data::make( std::vector<int>(2) ) + data::make( std::list<int>(3) )).size() == 5 );
28
29 int arr1[] = {1,2};
30 int arr2[] = {7,19};
31 BOOST_TEST( (data::make( arr1 ) + data::make( arr2 )).size() == 4 );
32
33 BOOST_TEST( (data::make( 1 ) + data::make( 5 ) + data::make( 19 )).size() == 3 );
34
35 BOOST_TEST( (data::make( std::vector<int>(2) ) + data::make( 1 ) + data::make( arr2 ) + data::make( 17 )).size() == 6 );
36
37 int expected[] = {1,2,5,7,19,37};
38 int* exp = expected;
39 int c = 0;
40 invocation_count ic;
41
42 auto samples1 = data::make( std::vector<int>(arr1,arr1+2) ) + data::make( 5 ) + data::make( arr2 ) + data::make( 37 );
43
44 ic.m_value = 0;
45 data::for_each_sample( samples1, ic );
46 BOOST_TEST( ic.m_value == 6 );
47
48 c = 0;
49 data::for_each_sample( samples1, [&c,exp](int i) {
50 BOOST_TEST( i == exp[c++] );
51 });
52
53 auto samples2 = data::make( std::vector<int>(arr1,arr1+2) ) + (data::make( 5 ) + (data::make( arr2 ) + data::make( 37 )));
54
55 ic.m_value = 0;
56 data::for_each_sample( samples2, ic );
57 BOOST_TEST( ic.m_value == 6 );
58
59 c = 0;
60 data::for_each_sample( samples2, [&c,exp](int i) {
61 BOOST_TEST( i == exp[c++] );
62 });
63
64 auto samples3 = (data::make( std::vector<int>(arr1,arr1+2) ) + data::make( 5 )) + (data::make( arr2 ) + data::make( 37 ));
65
66 ic.m_value = 0;
67 data::for_each_sample( samples3, ic );
68 BOOST_TEST( ic.m_value == 6 );
69
70 c = 0;
71 data::for_each_sample( samples3, [&c,exp](int i) {
72 BOOST_TEST( i == exp[c++] );
73 });
74
75 copy_count::value() = 0;
76 data::for_each_sample( data::make( copy_count() ) + data::make( copy_count() ), check_arg_type<copy_count>() );
77 BOOST_TEST( copy_count::value() == 0 );
78
79 copy_count::value() = 0;
80 data::for_each_sample( data::make( copy_count() ) + data::make( copy_count() ) + data::make( copy_count() ), check_arg_type<copy_count>() );
81 BOOST_TEST( copy_count::value() == 0 );
82
83 copy_count::value() = 0;
84 data::for_each_sample( data::make( copy_count() ) + (data::make( copy_count() ) + data::make( copy_count() )), check_arg_type<copy_count>() );
85 BOOST_TEST( copy_count::value() == 0 );
86 copy_count::value() = 0;
87 data::for_each_sample( (data::make( copy_count() ) + data::make( copy_count() )) +
88 (data::make( copy_count() ) + data::make( copy_count() )), check_arg_type<copy_count>() );
89 BOOST_TEST( copy_count::value() == 0 );
90
91 auto ds1 = data::make( copy_count() );
92 auto const ds2 = data::make( copy_count() );
93
94 copy_count::value() = 0;
95 data::for_each_sample( ds1 + ds1, check_arg_type<copy_count>() );
96 BOOST_TEST( copy_count::value() == 0 );
97
98 copy_count::value() = 0;
99 data::for_each_sample( ds2 + ds2, check_arg_type<copy_count>() );
100 BOOST_TEST( copy_count::value() == 0 );
101
102 copy_count::value() = 0;
103 data::for_each_sample( ds1 + ds2, check_arg_type<copy_count>() );
104 BOOST_TEST( copy_count::value() == 0 );
105
106 copy_count::value() = 0;
107 auto jn1 = ds1 + data::make( copy_count() );
108 data::for_each_sample( jn1, check_arg_type<copy_count>() );
109 BOOST_TEST( copy_count::value() == 0 );
110
111 copy_count::value() = 0;
112 data::for_each_sample( data::make( copy_count() ) + ds1, check_arg_type<copy_count>() );
113 BOOST_TEST( copy_count::value() == 0 );
114
115 copy_count::value() = 0;
116 data::for_each_sample( ds1 + ds2 + ds1, check_arg_type<copy_count>() );
117 BOOST_TEST( copy_count::value() == 0 );
118
119 copy_count::value() = 0;
120 data::for_each_sample( ds1 + (ds1 + ds2), check_arg_type<copy_count>() );
121 BOOST_TEST( copy_count::value() == 0 );
122
123 copy_count::value() = 0;
124 data::for_each_sample( (ds1 + ds1) + (ds2 + ds2), check_arg_type<copy_count>() );
125 BOOST_TEST( copy_count::value() == 0 );
126
127 copy_count::value() = 0;
128 int std_vector_constructor_count = 0;
129 {
130 std::vector<copy_count> v(2); // we cannot do better than std::vector constructor
131 std_vector_constructor_count = copy_count::value()/2;
132 }
133
134 copy_count::value() = 0;
135 auto ds3 = data::make( make_copy_count_collection() ) + data::make( make_copy_count_collection() );
136 BOOST_TEST( ds3.size() == 6 );
137 data::for_each_sample( ds3, check_arg_type<copy_count>() );
138 BOOST_TEST( copy_count::value() == std_vector_constructor_count * 2 * 3 );
139 }
140
141 //____________________________________________________________________________//
142
143 // EOF
144
145