[v1.2.1] Merge branch 'bleeding'

Changelog:

* Added a cr_ prefix to all assertion macros. Old macros are deprecated
  and will be removed in a future version.
This commit is contained in:
Snaipe 2015-04-26 16:02:50 +02:00
commit 4a04a8a703
18 changed files with 274 additions and 185 deletions

10
.bumpversion.cfg Normal file
View file

@ -0,0 +1,10 @@
[bumpversion]
current_version = 1.2.1
commit = True
[bumpversion:file:configure.ac]
[bumpversion:file:doc/conf.py]
[bumpversion:file:appveyor.yml]

1
.gitignore vendored
View file

@ -2,6 +2,7 @@
!*/
!.gitignore
!.bumpversion.cfg
!*.c
!*.h

View file

@ -1,3 +1,9 @@
2015-04-26 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
* criterion: version 1.2.1
* Added a cr_ prefix to all assertion macros. Old macros are deprecated
and will be removed in a future version.
2015-04-15 Franklin "Snaipe" Mathieu <franklinmathieu@gmail.com>
* criterion: version 1.2.0

View file

@ -1,4 +1,4 @@
version: 1.0.0_b{build}-{branch}
version: 1.2.1_b{build}-{branch}
os: Windows Server 2012

View file

@ -1,6 +1,6 @@
AC_PREREQ([2.60])
AC_INIT([criterion], [1.2.0], [], [criterion], [franklinmathieu@gmail.com])
AC_INIT([criterion], [1.2.1], [], [criterion], [franklinmathieu@gmail.com])
AC_CONFIG_SRCDIR([src/runner.c])
LT_PREREQ([2.2.4])

View file

@ -39,7 +39,7 @@ copyright = u'2015, Franklin "Snaipe" Mathieu'
# built documents.
#
# The short X.Y version.
version = '1.2.0'
version = '1.2.1'
# The full version, including alpha/beta/rc tags.
release = version

View file

@ -26,14 +26,14 @@ Asserting things
Assertions come in two kinds:
* ``assert*`` are assertions that are fatal to the current test if failed;
* ``cr_assert*`` are assertions that are fatal to the current test if failed;
in other words, if the condition evaluates to ``false``, the test is
marked as a failure and the execution of the function is aborted.
* ``expect*`` are, in the other hand, assertions that are not fatal to the
* ``cr_expect*`` are, in the other hand, assertions that are not fatal to the
test. Execution will continue even if the condition evaluates to
``false``, but the test will be marked as a failure.
``assert()`` and ``expect()`` are the most simple kinds of assertions
``cr_assert()`` and ``cr_expect()`` are the most simple kinds of assertions
criterion has to offer. They both take a mandatory condition as a first
parameter, and an optional failure message:
@ -43,45 +43,45 @@ parameter, and an optional failure message:
#include <criterion/criterion.h>
Test(sample, test) {
expect(strlen("Test") == 4, "Expected \"Test\" to have a length of 4.");
expect(strlen("Hello") == 4, "This will always fail, why did I add this?");
assert(strlen("") == 0);
cr_expect(strlen("Test") == 4, "Expected \"Test\" to have a length of 4.");
cr_expect(strlen("Hello") == 4, "This will always fail, why did I add this?");
cr_assert(strlen("") == 0);
}
On top of those, more assertions are available for common operations:
* ``assert_null(Ptr, [Message])``: passes if Ptr is NULL.
* ``assert_eq(Actual, Expected, [Message])``: passes if Actual == Expected.
* ``assert_lt(Actual, Expected, [Message])``: passes if Actual < Expected.
* ``assert_leq(Actual, Expected, [Message])``: passes if Actual <= Expected.
* ``assert_gt(Actual, Expected, [Message])``: passes if Actual > Expected.
* ``assert_geq(Actual, Expected, [Message])``: passes if Actual >= Expected.
* ``assert_float_eq(Actual, Expected, Epsilon, [Message])``:
* ``cr_assert_null(Ptr, [Message])``: passes if Ptr is NULL.
* ``cr_assert_eq(Actual, Expected, [Message])``: passes if Actual == Expected.
* ``cr_assert_lt(Actual, Expected, [Message])``: passes if Actual < Expected.
* ``cr_assert_leq(Actual, Expected, [Message])``: passes if Actual <= Expected.
* ``cr_assert_gt(Actual, Expected, [Message])``: passes if Actual > Expected.
* ``cr_assert_geq(Actual, Expected, [Message])``: passes if Actual >= Expected.
* ``cr_assert_float_eq(Actual, Expected, Epsilon, [Message])``:
passes if Actual == Expected with an error of Epsilon.
* ``assert_arrays_eq(Actual, Expected, Size, [Message])``:
* ``cr_assert_arrays_eq(Actual, Expected, Size, [Message])``:
passes if all elements of Actual (from 0 to Size - 1) are equals to those
of Expected.
* ``assert_arrays_eq_cmp(Actual, Expected, Size, Cmp, [Message])``:
* ``cr_assert_arrays_eq_cmp(Actual, Expected, Size, Cmp, [Message])``:
Same as ``arrays_eq`` but equality is defined by the result of the binary
Cmp function.
Equality and lexical comparison assertions are also available for strings:
* ``assert_strings_eq(Actual, Expected, [Message])``
* ``assert_strings_lt(Actual, Expected, [Message])``
* ``assert_strings_leq(Actual, Expected, [Message])``
* ``assert_strings_gt(Actual, Expected, [Message])``
* ``assert_strings_geq(Actual, Expected, [Message])``
* ``cr_assert_strings_eq(Actual, Expected, [Message])``
* ``cr_assert_strings_lt(Actual, Expected, [Message])``
* ``cr_assert_strings_leq(Actual, Expected, [Message])``
* ``cr_assert_strings_gt(Actual, Expected, [Message])``
* ``cr_assert_strings_geq(Actual, Expected, [Message])``
And some assertions have a logical negative counterpart:
* ``assert_not(Condition, [Message])``
* ``assert_not_null(Ptr, [Message])``
* ``assert_neq(Actual, Unexpected, [Message])``
* ``assert_float_neq(Actual, Unexpected, Epsilon, [Message])``
* ``assert_strings_neq(Actual, Unexpected, [Message])``
* ``assert_arrays_neq(Actual, Unexpected, Size, [Message])``
* ``assert_arrays_neq_cmp(Actual, Unexpected, Size, Cmp, [Message])``
* ``cr_assert_not(Condition, [Message])``
* ``cr_assert_not_null(Ptr, [Message])``
* ``cr_assert_neq(Actual, Unexpected, [Message])``
* ``cr_assert_float_neq(Actual, Unexpected, Epsilon, [Message])``
* ``cr_assert_strings_neq(Actual, Unexpected, [Message])``
* ``cr_assert_arrays_neq(Actual, Unexpected, Size, [Message])``
* ``cr_assert_arrays_neq_cmp(Actual, Unexpected, Size, Cmp, [Message])``
Of course, every ``assert`` has an ``expect`` counterpart.

View file

@ -44,7 +44,7 @@ struct criterion_assert_args {
int sentinel_;
};
# define assert_impl(Kind, Condition, ...) \
# define cr_assert_impl(Kind, Condition, ...) \
do { \
struct criterion_assert_args args = { \
__VA_ARGS__ \
@ -66,153 +66,154 @@ struct criterion_assert_args {
// Common asserts
# define abort_test(Message) \
assert(0, \
# define cr_abort_test(Message) \
cr_assert(0, \
.default_msg = "The conditions for this test were not met.", \
.msg = (Message) \
)
# define assert(...) assert_(__VA_ARGS__, .sentinel_ = 0)
# define expect(...) expect_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert(...) cr_assert_(__VA_ARGS__, .sentinel_ = 0)
# define assert_(Condition, ...) assert_impl(FATAL, Condition, __VA_ARGS__)
# define expect_(Condition, ...) assert_impl(NORMAL, Condition, __VA_ARGS__)
# define cr_expect(...) cr_expect_(__VA_ARGS__, .sentinel_ = 0)
# define assert_not(...) assert_not_(__VA_ARGS__, .sentinel_ = 0)
# define expect_not(...) expect_not_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_(Condition, ...) cr_assert_impl(FATAL, Condition, __VA_ARGS__)
# define cr_expect_(Condition, ...) cr_assert_impl(NORMAL, Condition, __VA_ARGS__)
# define assert_not_(Condition, ...) \
assert_impl(FATAL, !(Condition), __VA_ARGS__)
# define expect_not_(Condition, ...) \
expect_impl(NORMAL, !(Condition), __VA_ARGS__)
# define cr_assert_not(...) cr_assert_not_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_not(...) cr_expect_not_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_not_(Condition, ...) \
cr_assert_impl(FATAL, !(Condition), __VA_ARGS__)
# define cr_expect_not_(Condition, ...) \
cr_expect_impl(NORMAL, !(Condition), __VA_ARGS__)
// Native asserts
# define assert_op_(Op, Actual, Expected, ...) \
assert_impl(FATAL, (Actual) Op (Expected), __VA_ARGS__)
# define expect_op_(Op, Actual, Expected, ...) \
assert_impl(NORMAL, (Actual) Op (Expected), __VA_ARGS__)
# define cr_assert_op_(Op, Actual, Expected, ...) \
cr_assert_impl(FATAL, (Actual) Op (Expected), __VA_ARGS__)
# define cr_expect_op_(Op, Actual, Expected, ...) \
cr_assert_impl(NORMAL, (Actual) Op (Expected), __VA_ARGS__)
# define assert_eq(...) assert_op_(==, __VA_ARGS__, .sentinel_ = 0)
# define expect_eq(...) expect_op_(==, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_eq(...) cr_assert_op_(==, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_eq(...) cr_expect_op_(==, __VA_ARGS__, .sentinel_ = 0)
# define assert_neq(...) assert_op_(!=, __VA_ARGS__, .sentinel_ = 0)
# define expect_neq(...) expect_op_(!=, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_neq(...) cr_assert_op_(!=, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_neq(...) cr_expect_op_(!=, __VA_ARGS__, .sentinel_ = 0)
# define assert_lt(...) assert_op_(<, __VA_ARGS__, .sentinel_ = 0)
# define expect_lt(...) expect_op_(<, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_lt(...) cr_assert_op_(<, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_lt(...) cr_expect_op_(<, __VA_ARGS__, .sentinel_ = 0)
# define assert_gt(...) assert_op_(>, __VA_ARGS__, .sentinel_ = 0)
# define expect_gt(...) expect_op_(>, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_gt(...) cr_assert_op_(>, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_gt(...) cr_expect_op_(>, __VA_ARGS__, .sentinel_ = 0)
# define assert_leq(...) assert_op_(<=, __VA_ARGS__, .sentinel_ = 0)
# define expect_leq(...) expect_op_(<=, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_leq(...) cr_assert_op_(<=, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_leq(...) cr_expect_op_(<=, __VA_ARGS__, .sentinel_ = 0)
# define assert_geq(...) assert_op_(>=, __VA_ARGS__, .sentinel_ = 0)
# define expect_geq(...) expect_op_(>=, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_geq(...) cr_assert_op_(>=, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_geq(...) cr_expect_op_(>=, __VA_ARGS__, .sentinel_ = 0)
# define assert_null_(Value, ...) \
assert_impl(FATAL, (Value) == NULL, __VA_ARGS__)
# define expect_null_(Value, ...) \
assert_impl(NORMAL, (Value) == NULL, __VA_ARGS__)
# define cr_assert_null_(Value, ...) \
cr_assert_impl(FATAL, (Value) == NULL, __VA_ARGS__)
# define cr_expect_null_(Value, ...) \
cr_assert_impl(NORMAL, (Value) == NULL, __VA_ARGS__)
# define assert_null(...) assert_null_(__VA_ARGS__, .sentinel_ = 0)
# define expect_null(...) expect_null_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_null(...) cr_assert_null_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_null(...) cr_expect_null_(__VA_ARGS__, .sentinel_ = 0)
# define assert_not_null_(Value, ...) \
assert_impl(FATAL, (Value) != NULL, __VA_ARGS__)
# define expect_not_null_(Value, ...) \
assert_impl(NORMAL, (Value) != NULL, __VA_ARGS__)
# define cr_assert_not_null_(Value, ...) \
cr_assert_impl(FATAL, (Value) != NULL, __VA_ARGS__)
# define cr_expect_not_null_(Value, ...) \
cr_assert_impl(NORMAL, (Value) != NULL, __VA_ARGS__)
# define assert_not_null(...) assert_not_null_(__VA_ARGS__, .sentinel_ = 0)
# define expect_not_null(...) expect_not_null_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_not_null(...) cr_assert_not_null_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_not_null(...) cr_expect_not_null_(__VA_ARGS__, .sentinel_ = 0)
// Floating-point asserts
# define assert_float_eq(...) \
assert_float_eq_(__VA_ARGS__, .sentinel_ = 0)
# define expect_float_eq(...) \
expect_float_eq_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_float_eq(...) \
cr_assert_float_eq_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_float_eq(...) \
cr_expect_float_eq_(__VA_ARGS__, .sentinel_ = 0)
# define assert_float_eq_(Actual, Expected, Epsilon, ...) \
assert_impl(FATAL, (Expected) - (Actual) <= (Epsilon) \
# define cr_assert_float_eq_(Actual, Expected, Epsilon, ...) \
cr_assert_impl(FATAL, (Expected) - (Actual) <= (Epsilon) \
&& (Actual) - (Expected) <= (Epsilon), \
__VA_ARGS__)
# define expect_float_eq_(Actual, Expected, Epsilon, ...) \
assert_impl(NORMAL, (Expected) - (Actual) <= (Epsilon) \
# define cr_expect_float_eq_(Actual, Expected, Epsilon, ...) \
cr_assert_impl(NORMAL, (Expected) - (Actual) <= (Epsilon) \
&& (Actual) - (Expected) <= (Epsilon), \
__VA_ARGS__)
# define assert_float_neq(...) \
assert_float_neq_(__VA_ARGS__, .sentinel_ = 0)
# define expect_float_neq(...) \
expect_float_neq_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_float_neq(...) \
cr_assert_float_neq_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_float_neq(...) \
cr_expect_float_neq_(__VA_ARGS__, .sentinel_ = 0)
# define assert_float_neq_(Actual, Expected, Epsilon, ...) \
assert_impl(FATAL, (Expected) - (Actual) > (Epsilon) \
# define cr_assert_float_neq_(Actual, Expected, Epsilon, ...) \
cr_assert_impl(FATAL, (Expected) - (Actual) > (Epsilon) \
|| (Actual) - (Expected) > (Epsilon), \
__VA_ARGS__)
# define expect_float_neq_(Actual, Expected, Epsilon, ...) \
assert_impl(NORMAL, (Expected) - (Actual) > (Epsilon) \
# define cr_expect_float_neq_(Actual, Expected, Epsilon, ...) \
cr_assert_impl(NORMAL, (Expected) - (Actual) > (Epsilon) \
|| (Actual) - (Expected) > (Epsilon), \
__VA_ARGS__)
// String asserts
# define assert_strings_(Op, Actual, Expected, ...) \
assert_impl(FATAL, strcmp((Actual), (Expected)) Op 0, __VA_ARGS__)
# define expect_strings_(Op, Actual, Expected, ...) \
assert_impl(NORMAL, strcmp((Actual), (Expected)) Op 0, __VA_ARGS__)
# define cr_assert_strings_(Op, Actual, Expected, ...) \
cr_assert_impl(FATAL, strcmp((Actual), (Expected)) Op 0, __VA_ARGS__)
# define cr_expect_strings_(Op, Actual, Expected, ...) \
cr_assert_impl(NORMAL, strcmp((Actual), (Expected)) Op 0, __VA_ARGS__)
# define assert_strings_eq(...) \
assert_strings_(==, __VA_ARGS__, .sentinel_ = 0)
# define expect_strings_eq(...) \
expect_strings_(==, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_strings_eq(...) \
cr_assert_strings_(==, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_strings_eq(...) \
cr_expect_strings_(==, __VA_ARGS__, .sentinel_ = 0)
# define assert_strings_neq(...) \
assert_strings_(!=, __VA_ARGS__, .sentinel_ = 0)
# define expect_strings_neq(...) \
expect_strings_(!=, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_strings_neq(...) \
cr_assert_strings_(!=, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_strings_neq(...) \
cr_expect_strings_(!=, __VA_ARGS__, .sentinel_ = 0)
# define assert_strings_gt(...) assert_strings_(>, __VA_ARGS__, .sentinel_ = 0)
# define expect_strings_gt(...) expect_strings_(>, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_strings_gt(...) cr_assert_strings_(>, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_strings_gt(...) cr_expect_strings_(>, __VA_ARGS__, .sentinel_ = 0)
# define assert_strings_lt(...) assert_strings_(<, __VA_ARGS__, .sentinel_ = 0)
# define expect_strings_lt(...) expect_strings_(<, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_strings_lt(...) cr_assert_strings_(<, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_strings_lt(...) cr_expect_strings_(<, __VA_ARGS__, .sentinel_ = 0)
# define assert_strings_leq(...) assert_strings_(<=, __VA_ARGS__, .sentinel_ = 0)
# define expect_strings_leq(...) expect_strings_(<=, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_strings_leq(...) cr_assert_strings_(<=, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_strings_leq(...) cr_expect_strings_(<=, __VA_ARGS__, .sentinel_ = 0)
# define assert_strings_geq(...) assert_strings_(>=, __VA_ARGS__, .sentinel_ = 0)
# define expect_strings_geq(...) expect_strings_(>=, __VA_ARGS__, .sentinel_ = 0)
# define cr_assert_strings_geq(...) cr_assert_strings_(>=, __VA_ARGS__, .sentinel_ = 0)
# define cr_expect_strings_geq(...) cr_expect_strings_(>=, __VA_ARGS__, .sentinel_ = 0)
// Array asserts
# define assert_arrays_eq(...) \
assert_arrays_eq_(__VA_ARGS__, .sentinel_ = 0)
# define expect_arrays_eq(...) \
expect_arrays_eq_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_arrays_eq(...) \
cr_assert_arrays_eq_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_arrays_eq(...) \
cr_expect_arrays_eq_(__VA_ARGS__, .sentinel_ = 0)
# define assert_arrays_neq(...) \
assert_arrays_neq_(__VA_ARGS__, .sentinel_ = 0)
# define expect_arrays_neq(...) \
expect_arrays_neq_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_arrays_neq(...) \
cr_assert_arrays_neq_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_arrays_neq(...) \
cr_expect_arrays_neq_(__VA_ARGS__, .sentinel_ = 0)
# define assert_arrays_eq_(A, B, Size, ...) \
assert_impl(FATAL, !memcmp((A), (B), (Size)), \
# define cr_assert_arrays_eq_(A, B, Size, ...) \
cr_assert_impl(FATAL, !memcmp((A), (B), (Size)), \
.default_msg = "Arrays are not equal.", \
__VA_ARGS__)
# define expect_arrays_eq_(A, B, Size, ...) \
assert_impl(NORMAL, !memcmp((A), (B), (Size)), \
# define cr_expect_arrays_eq_(A, B, Size, ...) \
cr_assert_impl(NORMAL, !memcmp((A), (B), (Size)), \
.default_msg = "Arrays are not equal.", \
__VA_ARGS__)
# define assert_arrays_neq_(A, B, Size, ...) \
assert_impl(FATAL, memcmp((A), (B), (Size)), \
# define cr_assert_arrays_neq_(A, B, Size, ...) \
cr_assert_impl(FATAL, memcmp((A), (B), (Size)), \
.default_msg = "Arrays are equal", \
__VA_ARGS__)
# define expect_arrays_neq_(A, B, Size, ...) \
assert_impl(NORMAL, memcmp((A), (B), (Size)), \
# define cr_expect_arrays_neq_(A, B, Size, ...) \
cr_assert_impl(NORMAL, memcmp((A), (B), (Size)), \
.default_msg = "Arrays are equal", \
__VA_ARGS__)
@ -221,50 +222,121 @@ struct criterion_assert_args {
__typeof__(&(A)[0]) first = (A); \
__typeof__(&(B)[0]) second = (B); \
int equals = 1; \
for (size_t i = 0, size = (Size); equals && i < size; ++i) \
size_t i, size; \
for (i = 0, size = (Size); equals && i < size; ++i) \
equals = equals && !Cmp(first + i, second + i)
# define assert_arrays_eq_cmp_(A, B, Size, Cmp, ...) \
# define cr_assert_arrays_eq_cmp_(A, B, Size, Cmp, ...) \
do { \
CRIT_ARR_COMPARE_(A, B, Size, Cmp, equals); \
assert_impl(FATAL, equals, \
cr_assert_impl(FATAL, equals, \
.default_msg = "Arrays are not equal", \
__VA_ARGS__); \
} while (0)
# define expect_arrays_eq_cmp_(A, B, Size, Cmp, ...) \
# define cr_expect_arrays_eq_cmp_(A, B, Size, Cmp, ...) \
do { \
CRIT_ARR_COMPARE_(A, B, Size, Cmp, equals); \
assert_impl(NORMAL, equals, \
cr_assert_impl(NORMAL, equals, \
.default_msg = "Arrays are not equal", \
__VA_ARGS__); \
} while (0)
# define assert_arrays_eq_cmp(...) \
assert_arrays_eq_cmp_(__VA_ARGS__, .sentinel_ = 0)
# define expect_arrays_eq_cmp(...) \
expect_arrays_eq_cmp_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_arrays_eq_cmp(...) \
cr_assert_arrays_eq_cmp_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_arrays_eq_cmp(...) \
cr_expect_arrays_eq_cmp_(__VA_ARGS__, .sentinel_ = 0)
# define assert_arrays_neq_cmp_(A, B, Size, Cmp, ...) \
# define cr_assert_arrays_neq_cmp_(A, B, Size, Cmp, ...) \
do { \
CRIT_ARR_COMPARE_(A, B, Size, Cmp, equals); \
assert_impl(FATAL, !equals, \
cr_assert_impl(FATAL, !equals, \
.default_msg = "Arrays not equal", \
__VA_ARGS__); \
} while (0)
# define expect_arrays_neq_cmp_(A, B, Size, Cmp, ...) \
# define cr_expect_arrays_neq_cmp_(A, B, Size, Cmp, ...) \
do { \
CRIT_ARR_COMPARE_(A, B, Size, Cmp, equals); \
assert_impl(NORMAL, equals, \
cr_assert_impl(NORMAL, equals, \
.default_msg = "Arrays not equal", \
__VA_ARGS__); \
} while (0)
# define assert_arrays_neq_cmp(...) \
assert_arrays_eq_cmp_(__VA_ARGS__, .sentinel_ = 0)
# define expect_arrays_neq_cmp(...) \
expect_arrays_eq_cmp_(__VA_ARGS__, .sentinel_ = 0)
# define cr_assert_arrays_neq_cmp(...) \
cr_assert_arrays_eq_cmp_(__VA_ARGS__, .sentinel_ = 0)
# define cr_expect_arrays_neq_cmp(...) \
cr_expect_arrays_eq_cmp_(__VA_ARGS__, .sentinel_ = 0)
# endif /* !__GNUC__ */
// The section below is here for backward compatibility purposes.
// It shall be removed in the text major version of Criterion
# ifndef CRITERION_NO_COMPAT
# define CRITERION_ASSERT_DEPRECATED_(Name) CRITERION_ASSERT_DEPRECATED__( \
message \
"The `" #Name "` macro is deprecated, " \
"please use `cr_" #Name "` instead." \
)
# define CRITERION_ASSERT_DEPRECATED__(Msg) \
_Pragma(#Msg)
# ifndef assert
# define assert(...) CRITERION_ASSERT_DEPRECATED_(assert) cr_assert(__VA_ARGS__)
// this is needed to make the POSIX assert.h redefine assert if
// subsequently included
# ifndef _ASSERT_H
# define _ASSERT_H 1
# endif /* !_ASSERT_H */
# endif /* !assert */
# define abort_test(Message) CRITERION_ASSERT_DEPRECATED_(abort_test) cr_abort_test(Message)
# define expect(...) CRITERION_ASSERT_DEPRECATED_(expect) cr_expect(__VA_ARGS__)
# define assert_not(...) CRITERION_ASSERT_DEPRECATED_(assert_not) cr_assert_not(__VA_ARGS__)
# define expect_not(...) CRITERION_ASSERT_DEPRECATED_(expect_not) cr_expect_not(__VA_ARGS__)
# define assert_eq(...) CRITERION_ASSERT_DEPRECATED_(assert_eq) cr_assert_eq(__VA_ARGS__)
# define expect_eq(...) CRITERION_ASSERT_DEPRECATED_(expect_eq) cr_expect_eq(__VA_ARGS__)
# define assert_neq(...) CRITERION_ASSERT_DEPRECATED_(assert_neq) cr_assert_neq(__VA_ARGS__)
# define expect_neq(...) CRITERION_ASSERT_DEPRECATED_(expect_neq) cr_expect_neq(__VA_ARGS__)
# define assert_lt(...) CRITERION_ASSERT_DEPRECATED_(assert_lt) cr_assert_lt(__VA_ARGS__)
# define expect_lt(...) CRITERION_ASSERT_DEPRECATED_(expect_lt) cr_expect_lt(__VA_ARGS__)
# define assert_gt(...) CRITERION_ASSERT_DEPRECATED_(assert_gt) cr_assert_gt(__VA_ARGS__)
# define expect_gt(...) CRITERION_ASSERT_DEPRECATED_(expect_gt) cr_expect_gt(__VA_ARGS__)
# define assert_leq(...) CRITERION_ASSERT_DEPRECATED_(assert_leq) cr_assert_leq(__VA_ARGS__)
# define expect_leq(...) CRITERION_ASSERT_DEPRECATED_(expect_leq) cr_expect_leq(__VA_ARGS__)
# define assert_geq(...) CRITERION_ASSERT_DEPRECATED_(assert_geq) cr_assert_geq(__VA_ARGS__)
# define expect_geq(...) CRITERION_ASSERT_DEPRECATED_(expect_geq) cr_expect_geq(__VA_ARGS__)
# define assert_null(...) CRITERION_ASSERT_DEPRECATED_(assert_null) cr_assert_null(__VA_ARGS__)
# define expect_null(...) CRITERION_ASSERT_DEPRECATED_(expect_null) cr_expect_null(__VA_ARGS__)
# define assert_not_null(...) CRITERION_ASSERT_DEPRECATED_(assert_not_null) cr_assert_not_null(__VA_ARGS__)
# define expect_not_null(...) CRITERION_ASSERT_DEPRECATED_(expect_not_null) cr_expect_not_null(__VA_ARGS__)
# define assert_float_eq(...) CRITERION_ASSERT_DEPRECATED_(assert_float_eq) cr_assert_float_eq(__VA_ARGS__)
# define expect_float_eq(...) CRITERION_ASSERT_DEPRECATED_(expect_float_eq) cr_expect_float_eq(__VA_ARGS__)
# define assert_float_neq(...) CRITERION_ASSERT_DEPRECATED_(assert_float_neq) cr_assert_float_neq(__VA_ARGS__)
# define expect_float_neq(...) CRITERION_ASSERT_DEPRECATED_(expect_float_neq) cr_expect_float_neq(__VA_ARGS__)
# define assert_strings_eq(...) CRITERION_ASSERT_DEPRECATED_(assert_strings_eq) cr_assert_strings_eq(__VA_ARGS__)
# define expect_strings_eq(...) CRITERION_ASSERT_DEPRECATED_(expect_strings_eq) cr_expect_strings_eq(__VA_ARGS__)
# define assert_strings_neq(...) CRITERION_ASSERT_DEPRECATED_(assert_strings_neq) cr_assert_strings_neq(__VA_ARGS__)
# define expect_strings_neq(...) CRITERION_ASSERT_DEPRECATED_(expect_strings_neq) cr_expect_strings_neq(__VA_ARGS__)
# define assert_strings_gt(...) CRITERION_ASSERT_DEPRECATED_(assert_strings_gt) cr_assert_strings_gt(__VA_ARGS__)
# define expect_strings_gt(...) CRITERION_ASSERT_DEPRECATED_(expect_strings_gt) cr_expect_strings_gt(__VA_ARGS__)
# define assert_strings_lt(...) CRITERION_ASSERT_DEPRECATED_(assert_strings_lt) cr_assert_strings_lt(__VA_ARGS__)
# define expect_strings_lt(...) CRITERION_ASSERT_DEPRECATED_(expect_strings_lt) cr_expect_strings_lt(__VA_ARGS__)
# define assert_strings_leq(...) CRITERION_ASSERT_DEPRECATED_(assert_strings_leq) cr_assert_strings_leq(__VA_ARGS__)
# define expect_strings_leq(...) CRITERION_ASSERT_DEPRECATED_(expect_strings_leq) cr_expect_strings_leq(__VA_ARGS__)
# define assert_strings_geq(...) CRITERION_ASSERT_DEPRECATED_(assert_strings_geq) cr_assert_strings_geq(__VA_ARGS__)
# define expect_strings_geq(...) CRITERION_ASSERT_DEPRECATED_(expect_strings_geq) cr_expect_strings_geq(__VA_ARGS__)
# define assert_arrays_eq(...) CRITERION_ASSERT_DEPRECATED_(assert_arrays_eq) cr_assert_arrays_eq(__VA_ARGS__)
# define expect_arrays_eq(...) CRITERION_ASSERT_DEPRECATED_(expect_arrays_eq) cr_expect_arrays_eq(__VA_ARGS__)
# define assert_arrays_neq(...) CRITERION_ASSERT_DEPRECATED_(assert_arrays_neq) cr_assert_arrays_neq(__VA_ARGS__)
# define expect_arrays_neq(...) CRITERION_ASSERT_DEPRECATED_(expect_arrays_neq) cr_expect_arrays_neq(__VA_ARGS__)
# define assert_arrays_eq_cmp(...) CRITERION_ASSERT_DEPRECATED_(assert_arrays_eq_cmp) cr_assert_arrays_eq_cmp(__VA_ARGS__)
# define expect_arrays_eq_cmp(...) CRITERION_ASSERT_DEPRECATED_(expect_arrays_eq_cmp) cr_expect_arrays_eq_cmp(__VA_ARGS__)
# define assert_arrays_neq_cmp(...) CRITERION_ASSERT_DEPRECATED_(assert_arrays_neq_cmp) cr_assert_arrays_neq_cmp(__VA_ARGS__)
# define expect_arrays_neq_cmp(...) CRITERION_ASSERT_DEPRECATED_(expect_arrays_neq_cmp) cr_expect_arrays_neq_cmp(__VA_ARGS__)
# endif
#endif /* !CRITERION_ASSERT_H_ */

View file

@ -1,54 +1,54 @@
#include <criterion/criterion.h>
Test(asserts, base) {
assert(true);
expect(true);
cr_assert(true);
cr_expect(true);
assert(true, "Assertions may take failure messages");
cr_assert(true, "Assertions may take failure messages");
assert(true, .msg = "You can use explicit named arguments");
cr_assert(true, .msg = "You can use explicit named arguments");
expect(false, "assert is fatal, expect isn't");
assert(false, "This assert runs");
assert(false, "This does not");
cr_expect(false, "assert is fatal, expect isn't");
cr_assert(false, "This assert runs");
cr_assert(false, "This does not");
}
Test(asserts, old_school) {
if (false)
abort_test("You can abort the test with a message from anywhere");
cr_abort_test("You can abort the test with a message from anywhere");
abort_test(NULL); // or without a message
cr_abort_test(NULL); // or without a message
}
Test(asserts, string) {
assert_strings_eq("hello", "hello");
assert_strings_neq("hello", "olleh");
cr_assert_strings_eq("hello", "hello");
cr_assert_strings_neq("hello", "olleh");
assert_strings_gt("hello", "hell");
assert_strings_geq("hello", "hell");
assert_strings_geq("hello", "hello");
cr_assert_strings_gt("hello", "hell");
cr_assert_strings_geq("hello", "hell");
cr_assert_strings_geq("hello", "hello");
assert_strings_lt("hell", "hello");
assert_strings_leq("hell", "hello");
assert_strings_leq("hello", "hello");
cr_assert_strings_lt("hell", "hello");
cr_assert_strings_leq("hell", "hello");
cr_assert_strings_leq("hello", "hello");
}
Test(asserts, native) {
assert_eq(1, 1);
assert_neq(1, 2);
cr_assert_eq(1, 1);
cr_assert_neq(1, 2);
assert_lt(1, 2);
assert_leq(1, 2);
assert_leq(2, 2);
cr_assert_lt(1, 2);
cr_assert_leq(1, 2);
cr_assert_leq(2, 2);
assert_gt(2, 1);
assert_geq(2, 1);
assert_geq(2, 2);
cr_assert_gt(2, 1);
cr_assert_geq(2, 1);
cr_assert_geq(2, 2);
}
Test(asserts, float) {
assert_neq(0.1 * 0.1, 0.01);
assert_float_eq(0.1 * 0.1, 0.01, 0.001);
cr_assert_neq(0.1 * 0.1, 0.01);
cr_assert_float_eq(0.1 * 0.1, 0.01, 0.001);
}
struct dummy_struct {
@ -72,9 +72,9 @@ Test(asserts, array) {
s2[1].a = 2;
s2[1].b = 4;
assert_arrays_eq(arr1, arr1, 4);
assert_arrays_neq(arr1, arr2, 4);
cr_assert_arrays_eq(arr1, arr1, 4);
cr_assert_arrays_neq(arr1, arr2, 4);
assert_arrays_neq(s1, s2, 2);
assert_arrays_eq_cmp(s1, s2, 2, eq_dummy);
cr_assert_arrays_neq(s1, s2, 2);
cr_assert_arrays_eq_cmp(s1, s2, 2, eq_dummy);
}

View file

@ -1,7 +1,7 @@
#include <criterion/criterion.h>
Test(misc, failing, .description = "Just a failing test") {
assert(0);
cr_assert(0);
}
Test(misc, skipped, .description = "This one is skipped", .disabled = true) {

View file

@ -10,5 +10,5 @@ void teardown(void) {
}
Test(simple, fixtures, .init = setup, .fini = teardown) {
assert(1);
cr_assert(1);
}

View file

@ -1,5 +1,5 @@
#include <criterion/criterion.h>
Test(sample, long_msg) {
assert(0, "This is\nA long message\nSpawning multiple lines.\n\nFormatting is respected.");
cr_assert(0, "This is\nA long message\nSpawning multiple lines.\n\nFormatting is respected.");
}

View file

@ -9,11 +9,11 @@ void teardown_suite(void) {
TestSuite(suite1, .init = setup_suite, .fini = teardown_suite);
Test(suite1, test) {
assert(1);
cr_assert(1);
}
Test(suite2, test) {
assert(1);
cr_assert(1);
}
TestSuite(disabled, .disabled = true);

View file

@ -6,9 +6,9 @@ void crash(void) {
}
Test(misc, setup_crash, .init = crash) {
assert(true);
cr_assert(true);
}
Test(misc, teardown_crash, .fini = crash) {
assert(true);
cr_assert(true);
}

View file

@ -2,8 +2,8 @@
#include <criterion/criterion.h>
Test(sample, test) {
expect(0);
assert(1);
cr_expect(0);
cr_assert(1);
}
ReportHook(PRE_INIT)(struct criterion_test *test) {

View file

@ -1,9 +1,9 @@
#include <criterion/criterion.h>
Test(misc, failing) {
assert(0);
cr_assert(0);
}
Test(misc, passing) {
assert(1);
cr_assert(1);
}

View file

@ -1,9 +1,9 @@
#include <criterion/criterion.h>
Test(first_suite, test) {
assert(1);
cr_assert(1);
}
Test(second_suite, test) {
assert(1);
cr_assert(1);
}

View file

@ -1,5 +1,5 @@
#include <criterion/criterion.h>
Test(samples, timed) {
assert(0);
cr_assert(0);
}