From b773bb61c33e14fd64ec640343499a4bea4347d2 Mon Sep 17 00:00:00 2001 From: Snaipe Date: Wed, 23 Sep 2015 20:11:35 +0200 Subject: [PATCH] Added C++ version of parameterized sample --- samples/CMakeLists.txt | 1 + samples/parameterized.cc | 75 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 samples/parameterized.cc diff --git a/samples/CMakeLists.txt b/samples/CMakeLists.txt index dfba5a0..7bde575 100644 --- a/samples/CMakeLists.txt +++ b/samples/CMakeLists.txt @@ -29,6 +29,7 @@ set(SAMPLES simple.cc theories.cc redirect.cc + parameterized.cc ) set(SCRIPTS diff --git a/samples/parameterized.cc b/samples/parameterized.cc new file mode 100644 index 0000000..3ae6c57 --- /dev/null +++ b/samples/parameterized.cc @@ -0,0 +1,75 @@ +#include + +// Basic usage + +ParameterizedTestParameters(params, str) { + static const char *strings[] = { + "foo", "bar", "baz" + }; + + return cr_make_param_array(const char *, strings, sizeof (strings) / sizeof (const char *)); +} + +ParameterizedTest(const char **str, params, str) { + cr_assert_fail("Parameter: %s", *str); +} + +// Multiple parameters must be coalesced in a single parameter + +struct parameter_tuple { + int i; + double d; +}; + +ParameterizedTestParameters(params, multiple) { + static struct parameter_tuple params[] = { + {1, 2}, + {3, 4}, + {5, 6}, + }; + + return cr_make_param_array(struct parameter_tuple, params, sizeof (params) / sizeof (struct parameter_tuple)); +} + +ParameterizedTest(struct parameter_tuple *tup, params, multiple) { + cr_assert_fail("Parameters: (%d, %f)", tup->i, tup->d); +} + +// Using dynamically generated parameters + +// you **MUST** use new_obj, new_arr, delete_obj, delete_arr instead of +// the new, new[], delete and delete[] operators (respectively) to allocate and +// deallocate dynamic memory in parameters, otherwise this will crash on +// Windows builds of the test. + +// the criterion::allocator allocator may be used with STL containers to +// allocate objects with the functions described above. + +using criterion::new_obj; +using criterion::new_arr; +using criterion::delete_obj; +using criterion::delete_arr; + +struct parameter_tuple_dyn { + int i; + std::unique_ptr d; + + parameter_tuple_dyn() : i(0), d(nullptr, criterion::free) {} + parameter_tuple_dyn(int i, double *d) : i(i), d(d, criterion::free) {} +}; + +ParameterizedTestParameters(params, cleanup) { + static criterion::parameters params; + + params.push_back(parameter_tuple_dyn(1, new_obj(2))); + params.push_back(parameter_tuple_dyn(3, new_obj(4))); + params.push_back(parameter_tuple_dyn(5, new_obj(6))); + + // A criterion::parameters can be returned in place of a + // criterion_test_params. + return params; +} + +ParameterizedTest(parameter_tuple_dyn *tup, params, cleanup) { + cr_assert_fail("Parameters: (%d, %f)", tup->i, *tup->d); +}