From 9b993abb936e2b86016f4b8cad455af4c95c060d Mon Sep 17 00:00:00 2001 From: Snaipe Date: Tue, 17 Nov 2015 17:33:44 +0100 Subject: [PATCH] Refactored tests and assertions implementation to internal/ --- CMakeLists.txt | 2 + include/criterion/assert.h | 274 ++-------------- include/criterion/criterion.h | 70 +--- .../{assert_base.h => internal/assert.h} | 305 +++++++++++------- include/criterion/internal/test.h | 97 ++++++ include/criterion/theories.h | 2 +- src/core/wrappers/wrap.cc | 10 +- 7 files changed, 317 insertions(+), 443 deletions(-) rename include/criterion/{assert_base.h => internal/assert.h} (57%) create mode 100644 include/criterion/internal/test.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 3890768..75cb3fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -204,6 +204,8 @@ set(INTERFACE_FILES include/criterion/parameterized.h include/criterion/redirect.h include/criterion/output.h + include/criterion/internal/assert.h + include/criterion/internal/test.h include/criterion/internal/common.h include/criterion/internal/ordered-set.h include/criterion/internal/asprintf-compat.h diff --git a/include/criterion/assert.h b/include/criterion/assert.h index 1959310..3c69283 100644 --- a/include/criterion/assert.h +++ b/include/criterion/assert.h @@ -28,29 +28,27 @@ # include # endif -# include "assert_base.h" +# include "internal/assert.h" + +CR_BEGIN_C_API + +CR_API char *cr_translate_assert_msg(int msg_index, ...); + +CR_END_C_API + +// Base assertions + +# define cr_assert_fail(...) CR_EXPAND(cr_fail(CR_FAIL_ABORT_, __VA_ARGS__)) +# define cr_expect_fail(...) CR_EXPAND(cr_fail(CR_FAIL_CONTINUES_, __VA_ARGS__)) + +# define cr_assert(...) CR_EXPAND(cr_assert_(__VA_ARGS__)) +# define cr_expect(...) CR_EXPAND(cr_expect_(__VA_ARGS__)) + +# define cr_assert_not(...) CR_EXPAND(cr_assert_not_(__VA_ARGS__)) +# define cr_expect_not(...) CR_EXPAND(cr_expect_not_(__VA_ARGS__)) // Common binary assertions -# define cr_assert_op_(Fail, Op, Actual, Expected, ...) \ - CR_EXPAND(cr_assert_impl( \ - Fail, \ - (Actual) Op (Expected), \ - dummy, \ - CRITERION_ASSERT_MSG_EXPR_FALSE, \ - (CR_STR((Actual) Op (Expected))), \ - __VA_ARGS__ \ - )) - -# define cr_assert_op_va_(Fail, Op, ...) \ - CR_EXPAND(cr_assert_op_( \ - Fail, \ - Op, \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ - )) - # define cr_assert_eq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__)) # define cr_expect_eq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__)) @@ -71,25 +69,6 @@ // Common unary assertions -# define cr_assert_null_op_(Fail, Op, Msg, Value, ...) \ - CR_EXPAND(cr_assert_impl( \ - Fail, \ - (Value) Op NULL, \ - dummy, \ - Msg, \ - (CR_STR(Value)), \ - __VA_ARGS__ \ - )) - -# define cr_assert_null_op_va_(Fail, Op, Msg, ...) \ - CR_EXPAND(cr_assert_null_op_( \ - Fail, \ - Op, \ - Msg, \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_TAIL(__VA_ARGS__) \ - )) - # define cr_assert_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_ABORT_, ==, CRITERION_ASSERT_MSG_IS_NOT_NULL, __VA_ARGS__)) # define cr_expect_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_CONTINUES_, ==, CRITERION_ASSERT_MSG_IS_NOT_NULL, __VA_ARGS__)) @@ -98,32 +77,6 @@ // Floating-point assertions -# define cr_assert_float_eq_op_(Actual, Expected, Epsilon) \ - (Expected) - (Actual) <= (Epsilon) && (Actual) - (Expected) <= (Epsilon) - -# define cr_assert_float_neq_op_(Actual, Expected, Epsilon) \ - (Expected) - (Actual) > (Epsilon) || (Actual) - (Expected) > (Epsilon) - -# define cr_assert_float_op_(Fail, Op, Actual, Expected, Epsilon, ...) \ - CR_EXPAND(cr_assert_impl( \ - Fail, \ - Op(Actual, Expected, Epsilon), \ - dummy, \ - CRITERION_ASSERT_MSG_EXPR_FALSE, \ - (CR_STR(Op(Actual, Expected, Epsilon))), \ - __VA_ARGS__ \ - )) - -# define cr_assert_float_op_va_(Fail, Op, ...) \ - CR_EXPAND(cr_assert_float_op_( \ - Fail, \ - Op, \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ - CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \ - )) - # define cr_assert_float_eq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_ABORT_, cr_assert_float_eq_op_, __VA_ARGS__)) # define cr_expect_float_eq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_CONTINUES_, cr_assert_float_eq_op_, __VA_ARGS__)) @@ -132,50 +85,12 @@ // String assertions -# define cr_assert_str_op_empty_(Fail, Op, Msg, Value, ...) \ - CR_EXPAND(cr_assert_impl( \ - Fail, \ - (Value)[0] Op '\0', \ - dummy, \ - Msg, \ - (CR_STR(Value)), \ - __VA_ARGS__ \ - )) - -# define cr_assert_str_op_empty_va_(Fail, Op, Msg, ...) \ - CR_EXPAND(cr_assert_str_op_empty_( \ - Fail, \ - Op, \ - Msg, \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_TAIL(__VA_ARGS__) \ - )) - # define cr_assert_str_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_ABORT_, ==, CRITERION_ASSERT_MSG_IS_NOT_EMPTY, __VA_ARGS__)) # define cr_expect_str_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_CONTINUES_, ==, CRITERION_ASSERT_MSG_IS_NOT_EMPTY, __VA_ARGS__)) # define cr_assert_str_not_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_ABORT_, !=, CRITERION_ASSERT_MSG_IS_EMPTY, __VA_ARGS__)) # define cr_expect_str_not_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_CONTINUES_, !=, CRITERION_ASSERT_MSG_IS_EMPTY, __VA_ARGS__)) -# define cr_assert_str_op_(Fail, Op, Actual, Expected, ...) \ - CR_EXPAND(cr_assert_impl( \ - Fail, \ - CR_STDN strcmp((Actual), (Expected)) Op 0, \ - dummy, \ - CRITERION_ASSERT_MSG_EXPR_AS_STRINGS_FALSE, \ - (CR_STR((Actual) Op (Expected))), \ - __VA_ARGS__ \ - )) - -# define cr_assert_str_op_va_(Fail, Op, ...) \ - CR_EXPAND(cr_assert_str_op_( \ - Fail, \ - Op, \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ - )) - # define cr_assert_str_eq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__)) # define cr_expect_str_eq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__)) @@ -196,26 +111,6 @@ // Array assertions -# define cr_assert_mem_op_(Fail, Op, Actual, Expected, Size, ...) \ - CR_EXPAND(cr_assert_impl( \ - Fail, \ - CR_STDN memcmp((Actual), (Expected), (Size)) Op 0, \ - dummy, \ - CRITERION_ASSERT_MSG_EXPR_FALSE, \ - (CR_STR((Actual)[0 .. Size] Op (Expected)[0 .. Size])), \ - __VA_ARGS__ \ - )) - -# define cr_assert_mem_op_va_(Fail, Op, ...) \ - CR_EXPAND(cr_assert_mem_op_( \ - Fail, \ - Op, \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ - CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \ - )) - # define cr_assert_arr_eq(...) CR_EXPAND(cr_assert_mem_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__)) # define cr_expect_arr_eq(...) CR_EXPAND(cr_assert_mem_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__)) @@ -226,43 +121,6 @@ # if defined(__GNUC__) || defined(__clang__) || defined(__cplusplus) -# ifdef __cplusplus -# define CR_ARR_COMPARE_(A, B, Size, Cmp, Result) \ - int Result = std::lexicographical_compare((A), (A) + Size, (B), (B) + Size, Cmp) -# else -# define CR_ARR_COMPARE_(A, B, Size, Cmp, Result) \ - __typeof__(&(A)[0]) first = (A); \ - __typeof__(&(B)[0]) second = (B); \ - int Result = 0; \ - size_t i, size; \ - for (i = 0, size = (Size); !Result && i < size; ++i) \ - Result = Cmp(first + i, second + i) -# endif - -# define cr_assert_arr_op_cmp_(Fail, Op, Actual, Expected, Size, Cmp, ...) \ - do { \ - CR_ARR_COMPARE_(Actual, Expected, Size, Cmp, order); \ - CR_EXPAND(cr_assert_impl( \ - Fail, \ - order Op 0, \ - dummy, \ - CRITERION_ASSERT_MSG_EXPR_FALSE, \ - (CR_STR((Actual)[0 .. Size] Op (Expected)[0 .. Size])), \ - __VA_ARGS__ \ - )); \ - } while (0) - -# define cr_assert_arr_op_cmp_va_(Fail, Op, ...) \ - CR_EXPAND(cr_assert_arr_op_cmp_( \ - Fail, \ - Op, \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ - CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)))), \ - CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)))) \ - )) - # define cr_assert_arr_eq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__)) # define cr_expect_arr_eq_cmp(...) CR_EXPAND(cr_assert_arr_op_cmp_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__)) @@ -283,14 +141,6 @@ # else -# define CRITERION_GNUC_WARN__(Msg) \ - _Pragma(#Msg) - -# define CRITERION_GNUC_WARN_(Name) CRITERION_GNUC_WARN__( \ - message \ - "The `" #Name "` macro is only available on GNU C compilers." \ - ) - # define cr_assert_arr_eq_cmp(...) CRITERION_GNUC_WARN_(cr_assert_arr_eq_cmp) CR_NOOP # define cr_expect_arr_eq_cmp(...) CRITERION_GNUC_WARN_(cr_expect_arr_eq_cmp) CR_NOOP @@ -313,103 +163,15 @@ # ifdef __cplusplus -# define cr_assert_throw_abort_(Fail, Msg, MsgArgs, ...) \ - CR_EXPAND(cr_assert_impl( \ - Fail, \ - 0, \ - dummy, \ - Msg, \ - MsgArgs, \ - CR_VA_TAIL(__VA_ARGS__) \ - )) - -# define cr_assert_throw_(Fail, Statement, Exception, ...) \ - try { \ - Statement; \ - } catch (Exception const &) { \ - } catch (...) { \ - CR_EXPAND(cr_assert_throw_abort_( \ - Fail, \ - CRITERION_ASSERT_MSG_NO_THROW, \ - (CR_STR(Statement), CR_STR(Exception)), \ - __VA_ARGS__)); \ - } - -# define cr_assert_throw_va_(...) \ - CR_EXPAND(cr_assert_throw_( \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ - dummy, \ - CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \ - )) - # define cr_assert_throw(...) CR_EXPAND(cr_assert_throw_va_(CR_FAIL_ABORT_, __VA_ARGS__)) # define cr_expect_throw(...) CR_EXPAND(cr_assert_throw_va_(CR_FAIL_CONTINUES_, __VA_ARGS__)) -# define cr_assert_no_throw_(Fail, Statement, Exception, ...) \ - try { \ - Statement; \ - } catch (Exception const &) { \ - CR_EXPAND(cr_assert_throw_abort_( \ - Fail, \ - CRITERION_ASSERT_MSG_THROW, \ - (CR_STR(Statement), CR_STR(Exception)), \ - __VA_ARGS__)); \ - } - -# define cr_assert_no_throw_va_(...) \ - CR_EXPAND(cr_assert_no_throw_( \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ - dummy, \ - CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \ - )) - # define cr_assert_no_throw(...) CR_EXPAND(cr_assert_no_throw_va_(CR_FAIL_ABORT_, __VA_ARGS__)) # define cr_expect_no_throw(...) CR_EXPAND(cr_assert_no_throw_va_(CR_FAIL_CONTINUES_, __VA_ARGS__)) -# define cr_assert_any_throw_(Fail, Statement, ...) \ - try { \ - Statement; \ - CR_EXPAND(cr_assert_throw_abort_( \ - Fail, \ - CRITERION_ASSERT_MSG_ANY_THROW, \ - (CR_STR(Statement)), \ - __VA_ARGS__)); \ - } catch (...) {} - -# define cr_assert_any_throw_va_(...) \ - CR_EXPAND(cr_assert_any_throw_( \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - dummy, \ - CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ - )) - # define cr_assert_any_throw(...) CR_EXPAND(cr_assert_any_throw_va_(CR_FAIL_ABORT_, __VA_ARGS__)) # define cr_expect_any_throw(...) CR_EXPAND(cr_assert_any_throw_va_(CR_FAIL_CONTINUES_, __VA_ARGS__)) -# define cr_assert_none_throw_(Fail, Statement, ...) \ - try { \ - Statement; \ - } catch (...) { \ - CR_EXPAND(cr_assert_throw_abort_( \ - Fail, \ - CRITERION_ASSERT_MSG_NONE_THROW, \ - (CR_STR(Statement)), \ - __VA_ARGS__)); \ - } - -# define cr_assert_none_throw_va_(...) \ - CR_EXPAND(cr_assert_none_throw_( \ - CR_VA_HEAD(__VA_ARGS__), \ - CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ - dummy, \ - CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ - )) - # define cr_assert_none_throw(...) CR_EXPAND(cr_assert_none_throw_va_(CR_FAIL_ABORT_, __VA_ARGS__)) # define cr_expect_none_throw(...) CR_EXPAND(cr_assert_none_throw_va_(CR_FAIL_CONTINUES_, __VA_ARGS__)) diff --git a/include/criterion/criterion.h b/include/criterion/criterion.h index 9549223..c90114e 100644 --- a/include/criterion/criterion.h +++ b/include/criterion/criterion.h @@ -24,79 +24,15 @@ #ifndef CRITERION_H_ # define CRITERION_H_ -# include "internal/designated-initializer-compat.h" -# include "internal/common.h" # include "types.h" # include "assert.h" # include "alloc.h" -# define CR_IDENTIFIER_(Category, Name, Suffix) \ - Category ## _ ## Name ## _ ## Suffix +# include "internal/test.h" -# ifdef __cplusplus -# ifdef __OBJC__ -# define CR_LANG CR_LANG_OBJCXX -# else -# define CR_LANG CR_LANG_CXX -# endif -# else -# ifdef __OBJC__ -# define CR_LANG CR_LANG_OBJC -# else -# define CR_LANG CR_LANG_C -# endif -# endif +# define Test(...) CR_EXPAND(CR_TEST_BASE(__VA_ARGS__, .sentinel_ = 0)) -# ifdef __cplusplus -# define CR_TEST_PROTOTYPE_(Category, Name) \ - extern "C" void CR_IDENTIFIER_(Category, Name, impl)(void) -# else -# define CR_TEST_PROTOTYPE_(Category, Name) \ - void CR_IDENTIFIER_(Category, Name, impl)(void) -# endif - -# define CR_SUITE_IDENTIFIER_(Name, Suffix) \ - suite_ ## Name ## _ ## Suffix - -# define Test(...) CR_EXPAND(Test_(__VA_ARGS__, .sentinel_ = 0)) -# define Test_(Category, Name, ...) \ - CR_TEST_PROTOTYPE_(Category, Name); \ - struct criterion_test_extra_data CR_IDENTIFIER_(Category, Name, extra) = \ - CR_EXPAND(CRITERION_MAKE_STRUCT(struct criterion_test_extra_data, \ - .lang_ = CR_LANG, \ - .kind_ = CR_TEST_NORMAL, \ - .param_ = (struct criterion_test_params(*)(void)) NULL, \ - .identifier_ = #Category "/" #Name, \ - .file_ = __FILE__, \ - .line_ = __LINE__, \ - __VA_ARGS__ \ - )); \ - struct criterion_test CR_IDENTIFIER_(Category, Name, meta) = { \ - #Name, \ - #Category, \ - CR_IDENTIFIER_(Category, Name, impl), \ - &CR_IDENTIFIER_(Category, Name, extra) \ - }; \ - CR_SECTION_("cr_tst") \ - struct criterion_test *CR_IDENTIFIER_(Category, Name, ptr) \ - = &CR_IDENTIFIER_(Category, Name, meta) CR_SECTION_SUFFIX_; \ - CR_TEST_PROTOTYPE_(Category, Name) - -# define TestSuite(...) CR_EXPAND(TestSuite_(__VA_ARGS__, .sentinel_ = 0)) -# define TestSuite_(Name, ...) \ - struct criterion_test_extra_data CR_SUITE_IDENTIFIER_(Name, extra) = \ - CR_EXPAND(CRITERION_MAKE_STRUCT(struct criterion_test_extra_data, \ - .file_ = __FILE__, \ - .line_ = 0, \ - __VA_ARGS__ \ - )); \ - struct criterion_suite CR_SUITE_IDENTIFIER_(Name, meta) = { \ - #Name, \ - &CR_SUITE_IDENTIFIER_(Name, extra), \ - }; \ - CR_SECTION_("cr_sts") \ - struct criterion_suite *CR_SUITE_IDENTIFIER_(Name, ptr) \ - = &CR_SUITE_IDENTIFIER_(Name, meta) CR_SECTION_SUFFIX_ +# define TestSuite(...) CR_EXPAND(CR_SUITE_BASE(__VA_ARGS__, .sentinel_ = 0)) CR_BEGIN_C_API diff --git a/include/criterion/assert_base.h b/include/criterion/internal/assert.h similarity index 57% rename from include/criterion/assert_base.h rename to include/criterion/internal/assert.h index f539598..9b23417 100644 --- a/include/criterion/assert_base.h +++ b/include/criterion/internal/assert.h @@ -1,31 +1,10 @@ -/* - * The MIT License (MIT) - * - * Copyright © 2015 Franklin "Snaipe" Mathieu - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -#ifndef CRITERION_ASSERT_BASE_H_ -# define CRITERION_ASSERT_BASE_H_ +#ifndef CRITERION_INTERNAL_ASSERT_H_ +# define CRITERION_INTERNAL_ASSERT_H_ -# include "internal/preprocess.h" -# include "internal/asprintf-compat.h" +# include "common.h" +# include "preprocess.h" +# include "asprintf-compat.h" +# include "designated-initializer-compat.h" # ifdef __cplusplus # include @@ -35,12 +14,11 @@ # include # include # endif -# include "internal/designated-initializer-compat.h" -# include "types.h" -# include "stats.h" -# include "hooks.h" -# include "event.h" -# include "abort.h" +# include "../types.h" +# include "../stats.h" +# include "../hooks.h" +# include "../event.h" +# include "../abort.h" struct criterion_assert_args { const char *msg; @@ -69,12 +47,6 @@ enum criterion_assert_messages { CRITERION_ASSERT_MSG_NONE_THROW, }; -CR_BEGIN_C_API - -CR_API char *cr_translate_assert_msg(int msg_index, ...); - -CR_END_C_API - # define CR_GET_CONDITION(Condition, ...) Condition # define CR_GET_CONDITION_STR(Condition, ...) #Condition # define CR_VA_SKIP(_, ...) __VA_ARGS__ @@ -151,8 +123,6 @@ CR_END_C_API Fail(); \ } while (0) -// Base assertions - # define cr_fail(Fail, ...) \ CR_EXPAND(cr_assert_impl( \ Fail, \ @@ -163,10 +133,7 @@ CR_END_C_API __VA_ARGS__ \ )) -# define cr_assert_fail(...) CR_EXPAND(cr_fail(CR_FAIL_ABORT_, __VA_ARGS__)) -# define cr_expect_fail(...) CR_EXPAND(cr_fail(CR_FAIL_CONTINUES_, __VA_ARGS__)) - -# define cr_assert(...) \ +# define cr_assert_(...) \ CR_EXPAND(cr_assert_impl( \ CR_FAIL_ABORT_, \ CR_VA_HEAD(__VA_ARGS__), \ @@ -176,7 +143,7 @@ CR_END_C_API CR_VA_TAIL(__VA_ARGS__) \ )) -# define cr_expect(...) \ +# define cr_expect_(...) \ CR_EXPAND(cr_assert_impl( \ CR_FAIL_CONTINUES_, \ CR_VA_HEAD(__VA_ARGS__), \ @@ -186,27 +153,28 @@ CR_END_C_API CR_VA_TAIL(__VA_ARGS__) \ )) -# define cr_assert_not(...) \ - CR_EXPAND(cr_assert_impl( \ - CR_FAIL_ABORT_, \ - !(CR_VA_HEAD(__VA_ARGS__)), \ - dummy, \ - CRITERION_ASSERT_MSG_EXPR_FALSE, \ - (CR_STR(!(CR_VA_HEAD(__VA_ARGS__)))), \ - CR_VA_TAIL(__VA_ARGS__) \ +# define cr_assert_not_(...) \ + CR_EXPAND(cr_assert_impl( \ + CR_FAIL_ABORT_, \ + !(CR_VA_HEAD(__VA_ARGS__)), \ + dummy, \ + CRITERION_ASSERT_MSG_EXPR_FALSE, \ + (CR_STR(!(CR_VA_HEAD(__VA_ARGS__)))), \ + CR_VA_TAIL(__VA_ARGS__) \ )) -# define cr_expect_not(...) \ - CR_EXPAND(cr_assert_impl( \ - CR_FAIL_CONTINUES_, \ - !(CR_VA_HEAD(__VA_ARGS__)), \ - dummy, \ - CRITERION_ASSERT_MSG_EXPR_FALSE, \ - (CR_STR(!(CR_VA_HEAD(__VA_ARGS__)))), \ - CR_VA_TAIL(__VA_ARGS__) \ +# define cr_expect_not_(...) \ + CR_EXPAND(cr_assert_impl( \ + CR_FAIL_CONTINUES_, \ + !(CR_VA_HEAD(__VA_ARGS__)), \ + dummy, \ + CRITERION_ASSERT_MSG_EXPR_FALSE, \ + (CR_STR(!(CR_VA_HEAD(__VA_ARGS__)))), \ + CR_VA_TAIL(__VA_ARGS__) \ )) -// Common binary assertions + +// Binary # define cr_assert_op_(Fail, Op, Actual, Expected, ...) \ CR_EXPAND(cr_assert_impl( \ @@ -227,25 +195,7 @@ CR_END_C_API CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ )) -# define cr_assert_eq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__)) -# define cr_expect_eq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__)) - -# define cr_assert_neq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, !=, __VA_ARGS__)) -# define cr_expect_neq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, !=, __VA_ARGS__)) - -# define cr_assert_lt(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, <, __VA_ARGS__)) -# define cr_expect_lt(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, <, __VA_ARGS__)) - -# define cr_assert_leq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, <=, __VA_ARGS__)) -# define cr_expect_leq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, <=, __VA_ARGS__)) - -# define cr_assert_gt(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, >, __VA_ARGS__)) -# define cr_expect_gt(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, >, __VA_ARGS__)) - -# define cr_assert_geq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_ABORT_, >=, __VA_ARGS__)) -# define cr_expect_geq(...) CR_EXPAND(cr_assert_op_va_(CR_FAIL_CONTINUES_, >=, __VA_ARGS__)) - -// Common unary assertions +// Unary # define cr_assert_null_op_(Fail, Op, Msg, Value, ...) \ CR_EXPAND(cr_assert_impl( \ @@ -266,13 +216,7 @@ CR_END_C_API CR_VA_TAIL(__VA_ARGS__) \ )) -# define cr_assert_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_ABORT_, ==, CRITERION_ASSERT_MSG_IS_NOT_NULL, __VA_ARGS__)) -# define cr_expect_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_CONTINUES_, ==, CRITERION_ASSERT_MSG_IS_NOT_NULL, __VA_ARGS__)) - -# define cr_assert_not_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_ABORT_, !=, CRITERION_ASSERT_MSG_IS_NULL, __VA_ARGS__)) -# define cr_expect_not_null(...) CR_EXPAND(cr_assert_null_op_va_(CR_FAIL_CONTINUES_, !=, CRITERION_ASSERT_MSG_IS_NULL, __VA_ARGS__)) - -// Floating-point assertions +// Floating point # define cr_assert_float_eq_op_(Actual, Expected, Epsilon) \ (Expected) - (Actual) <= (Epsilon) && (Actual) - (Expected) <= (Epsilon) @@ -300,13 +244,7 @@ CR_END_C_API CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \ )) -# define cr_assert_float_eq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_ABORT_, cr_assert_float_eq_op_, __VA_ARGS__)) -# define cr_expect_float_eq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_CONTINUES_, cr_assert_float_eq_op_, __VA_ARGS__)) - -# define cr_assert_float_neq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_ABORT_, cr_assert_float_neq_op_, __VA_ARGS__)) -# define cr_expect_float_neq(...) CR_EXPAND(cr_assert_float_op_va_(CR_FAIL_CONTINUES_, cr_assert_float_neq_op_, __VA_ARGS__)) - -// String assertions +// String # define cr_assert_str_op_empty_(Fail, Op, Msg, Value, ...) \ CR_EXPAND(cr_assert_impl( \ @@ -327,12 +265,6 @@ CR_END_C_API CR_VA_TAIL(__VA_ARGS__) \ )) -# define cr_assert_str_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_ABORT_, ==, CRITERION_ASSERT_MSG_IS_NOT_EMPTY, __VA_ARGS__)) -# define cr_expect_str_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_CONTINUES_, ==, CRITERION_ASSERT_MSG_IS_NOT_EMPTY, __VA_ARGS__)) - -# define cr_assert_str_not_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_ABORT_, !=, CRITERION_ASSERT_MSG_IS_EMPTY, __VA_ARGS__)) -# define cr_expect_str_not_empty(...) CR_EXPAND(cr_assert_str_op_empty_va_(CR_FAIL_CONTINUES_, !=, CRITERION_ASSERT_MSG_IS_EMPTY, __VA_ARGS__)) - # define cr_assert_str_op_(Fail, Op, Actual, Expected, ...) \ CR_EXPAND(cr_assert_impl( \ Fail, \ @@ -352,22 +284,165 @@ CR_END_C_API CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ )) -# define cr_assert_str_eq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, ==, __VA_ARGS__)) -# define cr_expect_str_eq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, ==, __VA_ARGS__)) +// Array -# define cr_assert_str_neq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, !=, __VA_ARGS__)) -# define cr_expect_str_neq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, !=, __VA_ARGS__)) +# define cr_assert_mem_op_(Fail, Op, Actual, Expected, Size, ...) \ + CR_EXPAND(cr_assert_impl( \ + Fail, \ + CR_STDN memcmp((Actual), (Expected), (Size)) Op 0, \ + dummy, \ + CRITERION_ASSERT_MSG_EXPR_FALSE, \ + (CR_STR((Actual)[0 .. Size] Op (Expected)[0 .. Size])), \ + __VA_ARGS__ \ + )) -# define cr_assert_str_lt(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, <, __VA_ARGS__)) -# define cr_expect_str_lt(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, <, __VA_ARGS__)) +# define cr_assert_mem_op_va_(Fail, Op, ...) \ + CR_EXPAND(cr_assert_mem_op_( \ + Fail, \ + Op, \ + CR_VA_HEAD(__VA_ARGS__), \ + CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ + CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ + CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \ + )) -# define cr_assert_str_leq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, <=, __VA_ARGS__)) -# define cr_expect_str_leq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, <=, __VA_ARGS__)) +// Array comparisons -# define cr_assert_str_gt(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, >, __VA_ARGS__)) -# define cr_expect_str_gt(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, >, __VA_ARGS__)) +# ifdef __cplusplus +# define CR_ARR_COMPARE_(A, B, Size, Cmp, Result) \ + int Result = std::lexicographical_compare((A), (A) + Size, (B), (B) + Size, Cmp) +# else +# define CR_ARR_COMPARE_(A, B, Size, Cmp, Result) \ + __typeof__(&(A)[0]) first = (A); \ + __typeof__(&(B)[0]) second = (B); \ + int Result = 0; \ + size_t i, size; \ + for (i = 0, size = (Size); !Result && i < size; ++i) \ + Result = Cmp(first + i, second + i) +# endif -# define cr_assert_str_geq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_ABORT_, >=, __VA_ARGS__)) -# define cr_expect_str_geq(...) CR_EXPAND(cr_assert_str_op_va_(CR_FAIL_CONTINUES_, >=, __VA_ARGS__)) +# define cr_assert_arr_op_cmp_(Fail, Op, Actual, Expected, Size, Cmp, ...) \ + do { \ + CR_ARR_COMPARE_(Actual, Expected, Size, Cmp, order); \ + CR_EXPAND(cr_assert_impl( \ + Fail, \ + order Op 0, \ + dummy, \ + CRITERION_ASSERT_MSG_EXPR_FALSE, \ + (CR_STR((Actual)[0 .. Size] Op (Expected)[0 .. Size])), \ + __VA_ARGS__ \ + )); \ + } while (0) -#endif /* !CRITERION_ASSERT_BASE_H_ */ +# define cr_assert_arr_op_cmp_va_(Fail, Op, ...) \ + CR_EXPAND(cr_assert_arr_op_cmp_( \ + Fail, \ + Op, \ + CR_VA_HEAD(__VA_ARGS__), \ + CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ + CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ + CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)))), \ + CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)))) \ + )) + +// Exceptions + +# define cr_assert_throw_abort_(Fail, Msg, MsgArgs, ...) \ + CR_EXPAND(cr_assert_impl( \ + Fail, \ + 0, \ + dummy, \ + Msg, \ + MsgArgs, \ + CR_VA_TAIL(__VA_ARGS__) \ + )) + +# define cr_assert_throw_(Fail, Statement, Exception, ...) \ + try { \ + Statement; \ + } catch (Exception const &) { \ + } catch (...) { \ + CR_EXPAND(cr_assert_throw_abort_( \ + Fail, \ + CRITERION_ASSERT_MSG_NO_THROW, \ + (CR_STR(Statement), CR_STR(Exception)), \ + __VA_ARGS__)); \ + } + +# define cr_assert_throw_va_(...) \ + CR_EXPAND(cr_assert_throw_( \ + CR_VA_HEAD(__VA_ARGS__), \ + CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ + CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ + dummy, \ + CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \ + )) + +# define cr_assert_no_throw_(Fail, Statement, Exception, ...) \ + try { \ + Statement; \ + } catch (Exception const &) { \ + CR_EXPAND(cr_assert_throw_abort_( \ + Fail, \ + CRITERION_ASSERT_MSG_THROW, \ + (CR_STR(Statement), CR_STR(Exception)), \ + __VA_ARGS__)); \ + } + +# define cr_assert_no_throw_va_(...) \ + CR_EXPAND(cr_assert_no_throw_( \ + CR_VA_HEAD(__VA_ARGS__), \ + CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ + CR_VA_HEAD(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))), \ + dummy, \ + CR_VA_TAIL(CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))) \ + )) + +# define cr_assert_any_throw_(Fail, Statement, ...) \ + try { \ + Statement; \ + CR_EXPAND(cr_assert_throw_abort_( \ + Fail, \ + CRITERION_ASSERT_MSG_ANY_THROW, \ + (CR_STR(Statement)), \ + __VA_ARGS__)); \ + } catch (...) {} + +# define cr_assert_any_throw_va_(...) \ + CR_EXPAND(cr_assert_any_throw_( \ + CR_VA_HEAD(__VA_ARGS__), \ + CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ + dummy, \ + CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ + )) + +# define cr_assert_none_throw_(Fail, Statement, ...) \ + try { \ + Statement; \ + } catch (...) { \ + CR_EXPAND(cr_assert_throw_abort_( \ + Fail, \ + CRITERION_ASSERT_MSG_NONE_THROW, \ + (CR_STR(Statement)), \ + __VA_ARGS__)); \ + } + +# define cr_assert_none_throw_va_(...) \ + CR_EXPAND(cr_assert_none_throw_( \ + CR_VA_HEAD(__VA_ARGS__), \ + CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ + dummy, \ + CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ + )) + +// Messages + +# define CRITERION_GNUC_WARN__(Msg) \ + _Pragma(#Msg) + +# define CRITERION_GNUC_WARN_(Name) CRITERION_GNUC_WARN__( \ + message \ + "The `" #Name "` macro is only available on GNU C compilers." \ + ) + +#endif /* !CRITERION_INTERNAL_ASSERT_H_ */ diff --git a/include/criterion/internal/test.h b/include/criterion/internal/test.h new file mode 100644 index 0000000..2b4e3d9 --- /dev/null +++ b/include/criterion/internal/test.h @@ -0,0 +1,97 @@ +/* + * The MIT License (MIT) + * + * Copyright © 2015 Franklin "Snaipe" Mathieu + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +#ifndef CRITERION_INTERNAL_TEST_H_ +# define CRITERION_INTERNAL_TEST_H_ + +# include "designated-initializer-compat.h" +# include "common.h" + +# define CR_IDENTIFIER_(Category, Name, Suffix) \ + Category ## _ ## Name ## _ ## Suffix + +# ifdef __cplusplus +# ifdef __OBJC__ +# define CR_LANG CR_LANG_OBJCXX +# else +# define CR_LANG CR_LANG_CXX +# endif +# else +# ifdef __OBJC__ +# define CR_LANG CR_LANG_OBJC +# else +# define CR_LANG CR_LANG_C +# endif +# endif + +# ifdef __cplusplus +# define CR_TEST_PROTOTYPE_(Category, Name) \ + extern "C" void CR_IDENTIFIER_(Category, Name, impl)(void) +# else +# define CR_TEST_PROTOTYPE_(Category, Name) \ + void CR_IDENTIFIER_(Category, Name, impl)(void) +# endif + +# define CR_SUITE_IDENTIFIER_(Name, Suffix) \ + suite_ ## Name ## _ ## Suffix + +# define CR_TEST_BASE(Category, Name, ...) \ + CR_TEST_PROTOTYPE_(Category, Name); \ + struct criterion_test_extra_data CR_IDENTIFIER_(Category, Name, extra) = \ + CR_EXPAND(CRITERION_MAKE_STRUCT(struct criterion_test_extra_data, \ + .lang_ = CR_LANG, \ + .kind_ = CR_TEST_NORMAL, \ + .param_ = (struct criterion_test_params(*)(void)) NULL, \ + .identifier_ = #Category "/" #Name, \ + .file_ = __FILE__, \ + .line_ = __LINE__, \ + __VA_ARGS__ \ + )); \ + struct criterion_test CR_IDENTIFIER_(Category, Name, meta) = { \ + #Name, \ + #Category, \ + CR_IDENTIFIER_(Category, Name, impl), \ + &CR_IDENTIFIER_(Category, Name, extra) \ + }; \ + CR_SECTION_("cr_tst") \ + struct criterion_test *CR_IDENTIFIER_(Category, Name, ptr) \ + = &CR_IDENTIFIER_(Category, Name, meta) CR_SECTION_SUFFIX_; \ + CR_TEST_PROTOTYPE_(Category, Name) + +# define CR_SUITE_BASE(Name, ...) \ + struct criterion_test_extra_data CR_SUITE_IDENTIFIER_(Name, extra) = \ + CR_EXPAND(CRITERION_MAKE_STRUCT(struct criterion_test_extra_data, \ + .file_ = __FILE__, \ + .line_ = 0, \ + __VA_ARGS__ \ + )); \ + struct criterion_suite CR_SUITE_IDENTIFIER_(Name, meta) = { \ + #Name, \ + &CR_SUITE_IDENTIFIER_(Name, extra), \ + }; \ + CR_SECTION_("cr_sts") \ + struct criterion_suite *CR_SUITE_IDENTIFIER_(Name, ptr) \ + = &CR_SUITE_IDENTIFIER_(Name, meta) CR_SECTION_SUFFIX_ + + +#endif /* !CRITERION_INTERNAL_TEST_H_ */ diff --git a/include/criterion/theories.h b/include/criterion/theories.h index 3777ef7..7472760 100644 --- a/include/criterion/theories.h +++ b/include/criterion/theories.h @@ -122,7 +122,7 @@ CR_API void cr_theory_main(struct criterion_datapoints *dps, size_t datapoints, # define Theory(Args, ...) \ void CR_EXPAND(CR_VAARG_ID(theory, __VA_ARGS__,))Args; \ - CR_EXPAND(Test_(__VA_ARGS__, .sentinel_ = 0)) { \ + CR_EXPAND(CR_TEST_BASE(__VA_ARGS__, .sentinel_ = 0)) { \ cr_theory_main( \ CR_EXPAND(CR_VAARG_ID(dps, __VA_ARGS__,)), \ CR_NB_DATAPOINTS(CR_EXPAND(CR_VAARG_ID(dps, __VA_ARGS__,))), \ diff --git a/src/core/wrappers/wrap.cc b/src/core/wrappers/wrap.cc index e7f716c..a5bc3eb 100644 --- a/src/core/wrappers/wrap.cc +++ b/src/core/wrappers/wrap.cc @@ -22,13 +22,13 @@ * THE SOFTWARE. */ #include -#include "criterion/assert_base.h" #include "criterion/event.h" +#include "core/report.h" + extern "C" { #include "core/abort.h" -#include "core/report.h" #include "core/worker.h" #include "compat/time.h" #include "wrap.h" @@ -36,6 +36,10 @@ extern "C" { static INLINE void nothing(void) {} +void cxx_wrap(struct criterion_test *test, struct criterion_suite *suite); + +} + void cxx_wrap(struct criterion_test *test, struct criterion_suite *suite) { criterion_send_event(PRE_INIT, NULL, 0); @@ -86,5 +90,3 @@ void cxx_wrap(struct criterion_test *test, struct criterion_suite *suite) { criterion_send_event(POST_FINI, NULL, 0); } - -}