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)
6 // See http://www.boost.org/libs/test for the library home page.
10 // Version : $Revision$
12 // Description : tests stl collection based dataset
13 // ***************************************************************************
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>
21 #include <boost/test/unit_test.hpp>
22 namespace utf
=boost::unit_test
;
23 namespace data
=utf::data
;
25 #include "datasets-test.hpp"
29 //____________________________________________________________________________//
32 struct forwarded_to_collection
: std::false_type
{};
35 struct forwarded_to_collection
< data::monomorphic::collection
<T
> > : std::true_type
{};
37 BOOST_AUTO_TEST_CASE( test_forwarded_to_collection
)
40 std::vector
<int> samples1
;
41 BOOST_TEST(boost::unit_test::is_forward_iterable
<decltype(samples1
)>::value
, "forward iterable");
42 BOOST_TEST((forwarded_to_collection
<decltype(data::make( samples1
))>::value
),
43 "not properly forwarded to a collection");
47 utf::ut_detail::ignore_unused_variable_warning( samples1
);
49 BOOST_TEST(!boost::unit_test::is_forward_iterable
<decltype(samples1
)>::value
, "forward iterable");
50 BOOST_TEST(!(forwarded_to_collection
<decltype(data::make( samples1
))>::value
),
51 "not properly forwarded to a collection");
55 //____________________________________________________________________________//
57 BOOST_AUTO_TEST_CASE( test_collection_sizes
)
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 );
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>() );
70 data::for_each_sample( data::make( std::vector
<int>( 3 ) ), ic
);
71 BOOST_TEST( ic
.m_value
== 3 );
74 data::for_each_sample( data::make( std::list
<double>( 2 ) ), ic
, 4 );
75 BOOST_TEST( ic
.m_value
== 2 );
78 data::for_each_sample( data::make( std::vector
<int>( 3 ) ), ic
, 1 );
79 BOOST_TEST( ic
.m_value
== 1 );
82 //____________________________________________________________________________//
84 BOOST_AUTO_TEST_CASE( test_collection
)
86 std::vector
<int> samples1
;
87 samples1
.push_back(5);
88 samples1
.push_back(567);
89 samples1
.push_back(13);
92 data::for_each_sample( data::make( samples1
), [&c
,samples1
](int i
) {
93 BOOST_TEST( i
== samples1
[c
++] );
96 std::list
<char const*> samples2
;
97 samples2
.push_back("sd");
98 samples2
.push_back("bg");
99 samples2
.push_back( "we3eq3" );
101 auto it
= samples2
.begin();
102 data::for_each_sample( data::make( samples2
), [&it
](char const* str
) {
103 BOOST_TEST( str
== *it
++ );
107 //____________________________________________________________________________//
109 BOOST_AUTO_TEST_CASE( test_collection_copies
)
111 // number of copies due to the dataset make
112 int exp_copy_count
= 0;
114 // number of copies due to the vector constructor
115 copy_count::value() = 0;
116 int std_vector_constructor_count
= 0;
118 std::vector
<copy_count
> v(2); // we cannot do better than std::vector constructor
119 std_vector_constructor_count
= copy_count::value()/2;
122 copy_count::value() = 0;
123 int std_list_constructor_count
= 0;
125 std::list
<copy_count
> v(2); // we cannot do better than std::vector constructor
126 std_list_constructor_count
= copy_count::value()/2;
129 copy_count::value() = 0;
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);
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);
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);
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
>() );
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
157 //____________________________________________________________________________//