1 // (C) Copyright Raffi Enficiaud 2018
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.
9 /// @brief tests the access to the master test suite from the datasets, trac 12953
10 // ***************************************************************************
12 #define BOOST_TEST_MODULE "Access master test suite arguments from datasets"
13 #include <boost/test/included/unit_test.hpp>
15 #include <boost/test/data/test_case.hpp>
23 // this constructor access the master test suite
25 dataset_loader(std::initializer_list
<std::string
> init_list
)
26 : m_input_extension(init_list
)
28 dataset_loader(std::string s1
, std::string s2
)
30 m_input_extension
.push_back(s1
);
31 m_input_extension
.push_back(s2
);
35 iterator(std::vector
<std::string
>::const_iterator
const& v_iterator
)
36 : m_iterator(v_iterator
)
39 // bug in joins, see 13380, can safely be changed to std::string once fixed
40 const std::string
& operator*() const { return *m_iterator
; }
46 std::vector
<std::string
>::const_iterator m_iterator
;
49 boost::unit_test::data::size_t size() const {
50 return m_input_extension
.size();
54 iterator
begin() const { return iterator(m_input_extension
.begin()); }
57 std::vector
<std::string
> m_input_extension
;
61 dataset_loader::dataset_loader()
63 BOOST_TEST_INFO("dataset_loader");
65 int argc
= boost::unit_test::framework::master_test_suite().argc
;
66 char** argv
= boost::unit_test::framework::master_test_suite().argv
;
68 // not taking into account the name of the program (first argument)
69 for(unsigned i
= 1; i
!= argc
; i
++) {
70 m_input_extension
.push_back(argv
[i
]);
74 //------------------------------------------------------------------------------
76 namespace boost
{ namespace unit_test
{ namespace data
{
78 namespace monomorphic
{
80 struct is_dataset
<dataset_loader
> : boost::mpl::true_
{};
84 BOOST_AUTO_TEST_SUITE( concrete_testsuite
)
86 // parameters passed on the command line
87 char const* expected
[] = {"--param1=1", "--param2=2"};
89 BOOST_DATA_TEST_CASE(master_access_zips
,
90 boost::unit_test::data::make_delayed
<dataset_loader
>( ) ^ boost::unit_test::data::make(expected
),
94 BOOST_TEST(input
== expect
);
98 BOOST_DATA_TEST_CASE(master_access_zips_flip
,
99 boost::unit_test::data::make_delayed
<dataset_loader
>( ) ^ dataset_loader({"--param1=1", "--param2=2"}),
102 BOOST_TEST(input
== expect
);
105 // checking the forward of the arguments
106 BOOST_DATA_TEST_CASE(master_access_zips_args_forward
,
107 boost::unit_test::data::make_delayed
<dataset_loader
>( "--param1=1", "--param2=2" ) ^ boost::unit_test::data::make_delayed
<dataset_loader
>( ),
110 BOOST_TEST(input
== expect
);
113 BOOST_DATA_TEST_CASE(master_access_grid
,
114 boost::unit_test::data::make_delayed
<dataset_loader
>( ) * dataset_loader({"--param1=1", "--param2=2"}),
117 BOOST_TEST((input
== expect
|| input
== "--param1=1" || expect
== "--param1=1" ));
120 BOOST_DATA_TEST_CASE(master_access_grid_flip
,
121 dataset_loader({"--param1=1", "--param2=2"}) * boost::unit_test::data::make_delayed
<dataset_loader
>( ),
124 BOOST_TEST((input
== expect
|| input
== "--param1=1" || expect
== "--param1=1" ));
128 BOOST_DATA_TEST_CASE(master_access_joins
,
129 boost::unit_test::data::make_delayed
<dataset_loader
>( ) + dataset_loader({"--param1=1", "--param2=2"}),
132 static const std::string values
[] = {"--param1=1", "--param2=2", "--param1=1", "--param2=2"};
133 BOOST_TEST(input
== values
[counter4
++]);
137 BOOST_DATA_TEST_CASE(master_access_joins_flip
,
138 dataset_loader({"--param2=2", "--param1=1"}) + boost::unit_test::data::make_delayed
<dataset_loader
>( ),
141 static const std::string values
[] = {"--param2=2", "--param1=1", "--param1=1", "--param2=2"};
142 BOOST_TEST(input
== values
[counter41
++]);
145 BOOST_AUTO_TEST_SUITE_END()
148 class dataset_loader_arity3
151 typedef std::vector
<std::string
> data_type
;
153 data_type m_expected
;
159 dataset_loader_arity3(std::string some_additional
) : m_some_additional(some_additional
)
161 int argc
= boost::unit_test::framework::master_test_suite().argc
;
162 char** argv
= boost::unit_test::framework::master_test_suite().argv
;
165 for(unsigned i
= 1; i
!= argc
; i
++) {
166 std::string
current(argv
[i
]);
167 std::cout
<< "current " << current
<< std::endl
;
168 if(current
.find("--param1") != std::string::npos
) {
169 m_expected
.push_back(current
);
172 m_input
.push_back(current
);
179 data_type::const_iterator v_expected
,
180 data_type::const_iterator v_input
,
181 std::string additional
)
183 , m_expected(v_expected
)
184 , m_additional(additional
)
187 // bug in joins, see 13380. We should return a non temporary
188 std::tuple
<std::string
, std::string
, std::string
> operator*() const {
189 return std::tuple
<std::string
, std::string
, std::string
>(*m_input
, *m_expected
, *m_input
+ " -" + m_additional
+ "- " + *m_expected
);
197 data_type::const_iterator m_input
, m_expected
;
198 std::string m_additional
;
201 boost::unit_test::data::size_t size() const {
202 using namespace boost
;
203 BOOST_TEST_I_ASSRT( m_expected
.size() == m_input
.size(), "Lists of strings of different size" );
204 return m_input
.size();
208 iterator
begin() const {
209 using namespace boost
;
210 BOOST_TEST_I_ASSRT( m_expected
.size() == m_input
.size(), "Lists of strings of different size" );
211 return iterator(m_expected
.begin(), m_input
.begin(), m_some_additional
); }
214 std::string m_some_additional
;
218 namespace boost
{ namespace unit_test
{ namespace data
{
220 namespace monomorphic
{
222 struct is_dataset
<dataset_loader_arity3
> : boost::mpl::true_
{};
226 BOOST_DATA_TEST_CASE(master_access_make_ds_with_arity
,
227 boost::unit_test::data::make_delayed
<dataset_loader_arity3
>( "something-in-the-middle"),
228 input
, expected
, additional
)
230 std::cout
<< "input: " << input
<< " -- expected: " << expected
<< " -- additional: " << additional
<< std::endl
;