]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 : $RCSfile$ | |
9 | // | |
10 | // Version : $Revision$ | |
11 | // | |
12 | // Description : tests stl collection based dataset | |
13 | // *************************************************************************** | |
14 | ||
15 | // Boost.Test | |
16 | ||
17 | #include <boost/test/data/monomorphic/singleton.hpp> | |
18 | #include <boost/test/data/monomorphic/collection.hpp> | |
19 | #include <boost/test/data/for_each_sample.hpp> | |
20 | ||
21 | #include <boost/test/unit_test.hpp> | |
22 | namespace utf=boost::unit_test; | |
23 | namespace data=utf::data; | |
24 | ||
25 | #include "datasets-test.hpp" | |
26 | #include <vector> | |
27 | #include <list> | |
28 | ||
29 | //____________________________________________________________________________// | |
30 | ||
31 | template <typename> | |
32 | struct forwarded_to_collection : std::false_type {}; | |
33 | ||
34 | template <typename T> | |
35 | struct forwarded_to_collection< data::monomorphic::collection<T> > : std::true_type {}; | |
36 | ||
37 | BOOST_AUTO_TEST_CASE( test_forwarded_to_collection) | |
38 | { | |
39 | { | |
40 | std::vector<int> samples1; | |
b32b8144 | 41 | BOOST_TEST(boost::unit_test::is_container_forward_iterable<decltype(samples1)>::value, "forward iterable"); |
7c673cae FG |
42 | BOOST_TEST((forwarded_to_collection<decltype(data::make( samples1 ))>::value), |
43 | "not properly forwarded to a collection"); | |
44 | } | |
45 | { | |
46 | int samples1(0); | |
47 | utf::ut_detail::ignore_unused_variable_warning( samples1 ); | |
48 | ||
b32b8144 | 49 | BOOST_TEST(!boost::unit_test::is_container_forward_iterable<decltype(samples1)>::value, "forward iterable"); |
7c673cae FG |
50 | BOOST_TEST(!(forwarded_to_collection<decltype(data::make( samples1 ))>::value), |
51 | "not properly forwarded to a collection"); | |
52 | } | |
53 | } | |
54 | ||
55 | //____________________________________________________________________________// | |
56 | ||
57 | BOOST_AUTO_TEST_CASE( test_collection_sizes ) | |
58 | { | |
59 | BOOST_TEST( data::make( std::vector<int>() ).size() == 0 ); | |
60 | BOOST_TEST( data::make( std::vector<int>( 3 ) ).size() == 3 ); | |
61 | BOOST_TEST( data::make( std::list<double>() ).size() == 0 ); | |
62 | BOOST_TEST( data::make( std::list<double>( 2 ) ).size() == 2 ); | |
63 | ||
64 | data::for_each_sample( data::make( std::vector<int>( 3 ) ), check_arg_type<int>() ); | |
65 | data::for_each_sample( data::make( std::list<double>( 2 ) ), check_arg_type<double>() ); | |
66 | ||
67 | invocation_count ic; | |
68 | ||
69 | ic.m_value = 0; | |
70 | data::for_each_sample( data::make( std::vector<int>( 3 ) ), ic ); | |
71 | BOOST_TEST( ic.m_value == 3 ); | |
72 | ||
73 | ic.m_value = 0; | |
74 | data::for_each_sample( data::make( std::list<double>( 2 ) ), ic, 4 ); | |
75 | BOOST_TEST( ic.m_value == 2 ); | |
76 | ||
77 | ic.m_value = 0; | |
78 | data::for_each_sample( data::make( std::vector<int>( 3 ) ), ic, 1 ); | |
79 | BOOST_TEST( ic.m_value == 1 ); | |
80 | } | |
81 | ||
82 | //____________________________________________________________________________// | |
83 | ||
84 | BOOST_AUTO_TEST_CASE( test_collection ) | |
85 | { | |
86 | std::vector<int> samples1; | |
87 | samples1.push_back(5); | |
88 | samples1.push_back(567); | |
89 | samples1.push_back(13); | |
90 | ||
91 | int c = 0; | |
92 | data::for_each_sample( data::make( samples1 ), [&c,samples1](int i) { | |
93 | BOOST_TEST( i == samples1[c++] ); | |
94 | }); | |
95 | ||
96 | std::list<char const*> samples2; | |
97 | samples2.push_back("sd"); | |
98 | samples2.push_back("bg"); | |
99 | samples2.push_back( "we3eq3" ); | |
100 | ||
101 | auto it = samples2.begin(); | |
102 | data::for_each_sample( data::make( samples2 ), [&it](char const* str ) { | |
103 | BOOST_TEST( str == *it++ ); | |
104 | }); | |
105 | } | |
106 | ||
107 | //____________________________________________________________________________// | |
108 | ||
109 | BOOST_AUTO_TEST_CASE( test_collection_copies ) | |
110 | { | |
111 | // number of copies due to the dataset make | |
112 | int exp_copy_count = 0; | |
113 | ||
114 | // number of copies due to the vector constructor | |
115 | copy_count::value() = 0; | |
116 | int std_vector_constructor_count = 0; | |
117 | { | |
118 | std::vector<copy_count> v(2); // we cannot do better than std::vector constructor | |
119 | std_vector_constructor_count = copy_count::value()/2; | |
120 | } | |
121 | ||
122 | copy_count::value() = 0; | |
123 | int std_list_constructor_count = 0; | |
124 | { | |
125 | std::list<copy_count> v(2); // we cannot do better than std::vector constructor | |
126 | std_list_constructor_count = copy_count::value()/2; | |
127 | } | |
128 | ||
129 | copy_count::value() = 0; | |
130 | ||
131 | data::for_each_sample( data::make( std::vector<copy_count>( 2 ) ), check_arg_type<copy_count>() ); | |
132 | BOOST_TEST( copy_count::value() == (exp_copy_count + std_vector_constructor_count) * 2); | |
133 | ||
134 | copy_count::value() = 0; | |
135 | std::vector<copy_count> samples3( 2 ); | |
136 | data::for_each_sample( data::make( samples3 ), check_arg_type<copy_count>() ); | |
137 | BOOST_TEST( copy_count::value() == (exp_copy_count + std_vector_constructor_count) * 2); | |
138 | ||
139 | copy_count::value() = 0; | |
140 | std::vector<copy_count> const samples4( 2 ); | |
141 | data::for_each_sample( data::make( samples4 ), check_arg_type<copy_count>() ); | |
142 | BOOST_TEST( copy_count::value() == (exp_copy_count + std_vector_constructor_count) * 2); | |
143 | ||
144 | copy_count::value() = 0; | |
145 | auto ds1 = data::make( make_copy_count_collection() ); | |
146 | BOOST_TEST( ds1.size() == 3 ); | |
147 | BOOST_TEST( copy_count::value() == (exp_copy_count + std_vector_constructor_count) * 3); | |
148 | data::for_each_sample( ds1, check_arg_type<copy_count>() ); | |
149 | ||
150 | copy_count::value() = 0; | |
151 | auto ds2 = data::make( make_copy_count_const_collection() ); | |
152 | BOOST_TEST( ds2.size() == 3 ); | |
153 | data::for_each_sample( ds2, check_arg_type<copy_count>() ); | |
154 | BOOST_TEST( copy_count::value() == (exp_copy_count + std_list_constructor_count + 1) * 3 ); // no rvalue constructor for the dataset | |
155 | } | |
156 | ||
157 | //____________________________________________________________________________// | |
158 | ||
159 | // EOF |