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