mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-04 05:09:53 +01:00
56 lines
2.1 KiB
C++
56 lines
2.1 KiB
C++
|
// 302-Gen-Table.cpp
|
||
|
// Shows how to use table to run a test many times with different inputs. Lifted from examples on
|
||
|
// issue #850.
|
||
|
|
||
|
#include <catch2/catch_test_macros.hpp>
|
||
|
#include <catch2/generators/catch_generators.hpp>
|
||
|
#include <string>
|
||
|
|
||
|
struct TestSubject {
|
||
|
// this is the method we are going to test. It returns the length of the
|
||
|
// input string.
|
||
|
size_t GetLength( const std::string& input ) const { return input.size(); }
|
||
|
};
|
||
|
|
||
|
|
||
|
TEST_CASE("Table allows pre-computed test inputs and outputs", "[example][generator]") {
|
||
|
using std::make_tuple;
|
||
|
// do setup here as normal
|
||
|
TestSubject subj;
|
||
|
|
||
|
SECTION("This section is run for each row in the table") {
|
||
|
std::string test_input;
|
||
|
size_t expected_output;
|
||
|
std::tie( test_input, expected_output ) =
|
||
|
GENERATE( table<std::string, size_t>(
|
||
|
{ /* In this case one of the parameters to our test case is the
|
||
|
* expected output, but this is not required. There could be
|
||
|
* multiple expected values in the table, which can have any
|
||
|
* (fixed) number of columns.
|
||
|
*/
|
||
|
make_tuple( "one", 3 ),
|
||
|
make_tuple( "two", 3 ),
|
||
|
make_tuple( "three", 5 ),
|
||
|
make_tuple( "four", 4 ) } ) );
|
||
|
|
||
|
// run the test
|
||
|
auto result = subj.GetLength(test_input);
|
||
|
// capture the input data to go with the outputs.
|
||
|
CAPTURE(test_input);
|
||
|
// check it matches the pre-calculated data
|
||
|
REQUIRE(result == expected_output);
|
||
|
} // end section
|
||
|
}
|
||
|
|
||
|
/* Possible simplifications where less legacy toolchain support is needed:
|
||
|
*
|
||
|
* - With libstdc++6 or newer, the make_tuple() calls can be ommitted
|
||
|
* (technically C++17 but does not require -std in GCC/Clang). See
|
||
|
* https://stackoverflow.com/questions/12436586/tuple-vector-and-initializer-list
|
||
|
*
|
||
|
* - In C++17 mode std::tie() and the preceeding variable delcarations can be
|
||
|
* replaced by structured bindings: auto [test_input, expected] = GENERATE(
|
||
|
* table<std::string, size_t>({ ...
|
||
|
*/
|
||
|
// Compiling and running this file will result in 4 successful assertions
|