]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/test/test/test-organization-ts/datasets-test/collection-test.cpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / test / test / test-organization-ts / datasets-test / collection-test.cpp
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;
41 BOOST_TEST(boost::unit_test::is_container_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");
44 }
45 {
46 int samples1(0);
47 utf::ut_detail::ignore_unused_variable_warning( samples1 );
48
49 BOOST_TEST(!boost::unit_test::is_container_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");
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