LUMIERA.clone/tests/lib/meta/generator-combinations-test.cpp

140 lines
3.5 KiB
C++

/*
GeneratorCombinations(Test) - verify generating case combinations
Copyright (C) Lumiera.org
2011, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
#include "lib/test/run.hpp"
#include "lib/meta/generator.hpp"
#include "lib/meta/generator-combinations.hpp"
#include "meta/typelist-diagnostics.hpp"
#include <boost/format.hpp>
#include <iostream>
using ::test::Test;
using std::string;
using std::cout;
using std::endl;
namespace lumiera {
namespace typelist{
namespace test {
namespace { // test cases and data....
typedef Types< Num<1>
, Num<3>
, Num<5>
> Types1;
typedef Types< Num<2>
, Num<4>
, Num<6>
> Types2;
using boost::str;
using boost::format;
format formatted ("-<%u%u>%s");
/**
* A Test-Template to be instantiated
* for all possible combinations
* of the {Types1} x {Types2}
*/
template<class T1, class T2, class BASE>
struct TestCase
: BASE
{
static string
visitAll()
{
T1 param1;
T2 param2;
return str(formatted % uint(param1)
% uint(param2)
% BASE::visitAll());
}
};
template<>
struct TestCase<void,void,NullType>
{
static string
visitAll()
{
return "-|";
}
};
typedef TestCase<void,void,NullType> IterationEnd;
} // (End) test data
/*************************************************************************
* @test check utilities for generating case combinations.
* - verify the Cartesian product is built properly
* - instantiate a two-parameter test template
* for all those cases, as given by the
* Cartesian product of two Type collections
*/
class GeneratorCombinations_test : public Test
{
virtual void
run (Arg)
{
checkCartesian();
checkCaseInstantiation();
}
void
checkCartesian ()
{
typedef CartesianProduct<Types1,Types2> Cartesian;
DISPLAY (Cartesian);
}
void
checkCaseInstantiation ()
{
typedef InstantiateChainedCombinations< Types1,Types2
, TestCase
, IterationEnd > CombnationCases;
cout << "All-Test-Combinations-" << CombnationCases::visitAll() << endl;
}
};
/** Register this test class... */
LAUNCHER (GeneratorCombinations_test, "unit common");
}}} // namespace lumiera::typelist::test