Boost logo

Boost Users :

Subject: Re: [Boost-users] naming a test
From: Eric Prud'hommeaux (eric_at_[hidden])
Date: 2014-05-27 16:35:22


* Richard <legalize+jeeves_at_[hidden]> [2014-05-27 19:15+0000]
> [Please do not mail me a copy of your followup]
>
> boost-users_at_[hidden] spake the secret code
> <20140525080836.GI5022_at_[hidden]> thusly:
>
> >boost/libs/test/example/external_main_example_1.cpp provides an
> >example of a dynamical test suite tree. The invocation of
> > add( BOOST_TEST_CASE(boost::bind(&free_test_function, 1, 1)));
> >results in unpleasant names like
> > "boost::bind( &free_test_function, 1, 2 )"
>
> Do you really need to build the test case tree by hand?

Generally, yes. I'm working from standard test suites and it makes
more sense to read them from the manifest than to write some emacs
macro to turn the manifest into procedural code.

> In your example this could just as easily have been done with
> BOOST_AUTO_TEST_CASE.
>
> >. I used the preprocessor output to override the 2nd arg to
> >make_test_case with a name of my choosing:
> > ts->add(boost::unit_test::make_test_case
> > (boost::unit_test::callback0<>
> > (boost::bind( &free_test_function, 1, 2)),
> > boost::unit_test::const_string( minor, 1)));
> >
> >This works (pretty names and invocable with the logical run_test) but
> >I have no particular confidence that this will survive version changes
> >as well as would BOOST_TEST_CASE. Is there a better way to do this?
>
> IMO, while passing a functor to BOOST_TEST_CASE works, it was intended
> to be used with a free function that has an intention-revealing name
> for the test case. See
> <http://user.xmission.com/~legalize/boost.test/libs/test/doc/html/test/reference/test_case/boost_test_case.html>

That makes sense when you know the intentional names a priori. In my
case, I'd have something like

    std::ifstream man("Manifest.txt");
    std::string name, check, expect;
    int lineNo = 1;
    while (tsv >> name >> check >> expect) {
        name = name.substr(1,name.length()-2);
        check = check.substr(1,check.length()-2);
        ts->add(BOOST_TEST_CASE
                (boost::bind(&parseAndCompare, name, check,
                             expect, "Manifest.txt", lineNo)));
        ++lineNo;
    }

, which results in names that are neither informative nor easy to type
as an argument to --run_test.

As I alluded to above, I have in the past used a script to rewrite the
entries in some manifests as a series of

    BOOST_AUTO_TEST_CASE( name_with_underbars ) {
      MY_TEST_MACRO("checkFile1", "expectFile1");
    }

. This meant that every time someone in the working group proposed
adding a test to the manifest, I had to run the script and recompile.
With this approach, I can just pull the manifest and run the tests in
less than a couple seconds. For this, I incur the danger that the
BOOST_TEST_CASE macro may shift underneath me and I'll have to play
some catchup.

> --
> "The Direct3D Graphics Pipeline" free book <http://tinyurl.com/d3d-pipeline>
> The Computer Graphics Museum <http://computergraphicsmuseum.org>
> The Terminals Wiki <http://terminals.classiccmp.org>
> Legalize Adulthood! (my blog) <http://legalizeadulthood.wordpress.com>
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users

-- 
-ericP
office: +1.617.599.3509
mobile: +33.6.80.80.35.59
(eric_at_[hidden])
Feel free to forward this message to any list for any purpose other than
email address distribution.
There are subtle nuances encoded in font variation and clever layout
which can only be seen by printing this message on high-clay paper.

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net