Boost logo

Boost :

Subject: Re: [boost] [Boost.Test] access to boost::unit_test::framework::master_test_suite().{argc, argv} outside from BOOST_TEST
From: Olaf Peter (ope-devel_at_[hidden])
Date: 2017-04-04 18:34:51


Hello Raffi,
>
>> my test program uses boost.test datasets. I've wrote a filesystem loader
>> for the input and expected data. Now I run into the problem, that
>> boost::unit_test::framework::master_test_suite().{argc, argv} is only
>> setup inside the tests self. My loader isn't a test case ... I can check
>> it by using a simple mock, like
>>
>> struct app_mock
>> {
>> app_mock();
>>
>> int const argc;
>> char** const argv;
>> };
>>
>> app_mock::app_mock()
>> : argc(boost::unit_test::framework::master_test_suite().argc)
>> , argv(boost::unit_test::framework::master_test_suite().argv)
>> { }
>>
>> BOOST_AUTO_TEST_CASE( app_mocker )
>> {
>> app_mock app;
>> std::cout << "Count = " << app.argc << '\n';
>> for(int i = 0; i != app.argc; i++)
>> std::cout << "Arg = " << app.argv[i] << '\n';
>> }
>>
>>
>> $ my_test -- my_args
>>
>> Count = 2
>>
>> path/to/exe
>>
>> my_args
>>
>>
>> these works, but as mentioned:
>>
>> dataset_loader::dataset_loader(fs::path const& path)
>> {
>> app_mock app;
>>
>> std::cout << "ARGC = " <<
>> boost::unit_test::framework::master_test_suite().argc << '\n';
>> read_files(path);
>> }
>>
>> is always zero.
>>
>>
>> How can I read the argc/argv values?
>>
>>
>> Thanks,
>>
>> Olaf
>
> The datasets are creating static objects on file scope, that generate
> the definition of the unit tests.
>
> I believe you can achieve what you want here by loading the data from
> a suite fixture associated to the dataset test case. Otherwise, bring
> the topic to a trac issue.
As far I can see, it can't work, since how can I pass arguments to the
constructor? My use case is

::x3_test::dataset_loader foo_dataset{ "test/foo" };

BOOST_DATA_TEST_CASE(foo,
       foo_dataset.input()
     ^ foo_dataset.expect()
     ^ foo_dataset.test_file_name(),
     input, expected, file)
{
...
}

where a lot of datasets are required with different paths to the test
files. Otherwise a simple:

struct foo_dataset : public ::dataset_loader {
     foo_dataset() : dataset_loader { "test/foo" }
     { }
};

BOOST_DATA_TEST_CASE_F(
         foo_dataset,
         foo_test_case,
       foo_dataset.input()
     ^ foo_dataset.expect()
     ^ foo_dataset.test_file_name(),
     input, expected, file)
{
...
}

doesn't compile: error: 'foo_test_case' has not been declared.

Thanks,
Olaf


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk