summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Pokorny <andreas.pokorny@canonical.com>2015-06-22 12:48:07 +0200
committerPeter Hutterer <peter.hutterer@who-t.net>2015-07-07 17:49:17 +1000
commit1309718c003ad9cd440fc03315e450ccb83ff51d (patch)
tree642a2332caae98e3c7c2353817d617b244a3d217
parent2f8703620e130c4d022b40c4c694301ca3679775 (diff)
litest: floating point comparison macros
Adds the macros ck_assert_double_{eq,ne,lt,gt,le,ge} to compare double values using a fixed tolerance value. The tolerance value is picked based on the range of values to be expected by the libinput API. Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--test/litest-selftest.c66
-rw-r--r--test/litest.h50
2 files changed, 116 insertions, 0 deletions
diff --git a/test/litest-selftest.c b/test/litest-selftest.c
index f7974770..5016514d 100644
--- a/test/litest-selftest.c
+++ b/test/litest-selftest.c
@@ -289,6 +289,61 @@ START_TEST(litest_ptr_notnull_trigger_NULL)
}
END_TEST
+START_TEST(ck_double_eq_and_ne)
+{
+ ck_assert_double_eq(0.4,0.4);
+ ck_assert_double_eq(0.4,0.4 + 1E-6);
+ ck_assert_double_ne(0.4,0.4 + 1E-3);
+}
+END_TEST
+
+START_TEST(ck_double_lt_gt)
+{
+ ck_assert_double_lt(12.0,13.0);
+ ck_assert_double_gt(15.4,13.0);
+ ck_assert_double_le(12.0,12.0);
+ ck_assert_double_le(12.0,20.0);
+ ck_assert_double_ge(12.0,12.0);
+ ck_assert_double_ge(20.0,12.0);
+}
+END_TEST
+
+START_TEST(ck_double_eq_fails)
+{
+ ck_assert_double_eq(0.41,0.4);
+}
+END_TEST
+
+START_TEST(ck_double_ne_fails)
+{
+ ck_assert_double_ne(0.4 + 1E-7,0.4);
+}
+END_TEST
+
+START_TEST(ck_double_lt_fails)
+{
+ ck_assert_double_lt(6,5);
+}
+END_TEST
+
+START_TEST(ck_double_gt_fails)
+{
+ ck_assert_double_gt(5,6);
+}
+END_TEST
+
+START_TEST(ck_double_le_fails)
+{
+ ck_assert_double_le(6,5);
+}
+END_TEST
+
+START_TEST(ck_double_ge_fails)
+{
+ ck_assert_double_ge(5,6);
+}
+END_TEST
+
static Suite *
litest_assert_macros_suite(void)
{
@@ -342,6 +397,17 @@ litest_assert_macros_suite(void)
tcase_add_test(tc, litest_ptr_notnull_notrigger);
suite_add_tcase(s, tc);
+ tc = tcase_create("double comparison ");
+ tcase_add_test(tc, ck_double_eq_and_ne);
+ tcase_add_test(tc, ck_double_lt_gt);
+ tcase_add_exit_test(tc, ck_double_eq_fails, 1);
+ tcase_add_exit_test(tc, ck_double_ne_fails, 1);
+ tcase_add_exit_test(tc, ck_double_lt_fails, 1);
+ tcase_add_exit_test(tc, ck_double_gt_fails, 1);
+ tcase_add_exit_test(tc, ck_double_le_fails, 1);
+ tcase_add_exit_test(tc, ck_double_ge_fails, 1);
+ suite_add_tcase(s, tc);
+
return s;
}
diff --git a/test/litest.h b/test/litest.h
index 8ed50795..8981f13d 100644
--- a/test/litest.h
+++ b/test/litest.h
@@ -458,4 +458,54 @@ litest_disable_tap(struct libinput_device *device)
litest_assert_int_eq(status, expected);
}
+#define CK_DOUBLE_EQ_EPSILON 1E-3
+#define ck_assert_double_eq(X,Y) \
+ do { \
+ double _ck_x = X; \
+ double _ck_y = Y; \
+ ck_assert_msg(fabs(_ck_x - _ck_y) < CK_DOUBLE_EQ_EPSILON, \
+ "Assertion '" #X " == " #Y \
+ "' failed: "#X"==%f, "#Y"==%f", \
+ _ck_x, \
+ _ck_y); \
+ } while (0)
+
+#define ck_assert_double_ne(X,Y) \
+ do { \
+ double _ck_x = X; \
+ double _ck_y = Y; \
+ ck_assert_msg(fabs(_ck_x - _ck_y) > CK_DOUBLE_EQ_EPSILON, \
+ "Assertion '" #X " != " #Y \
+ "' failed: "#X"==%f, "#Y"==%f", \
+ _ck_x, \
+ _ck_y); \
+ } while (0)
+
+#define _ck_assert_double_eq(X, OP, Y) \
+ do { \
+ double _ck_x = X; \
+ double _ck_y = Y; \
+ ck_assert_msg(_ck_x OP _ck_y || \
+ fabs(_ck_x - _ck_y) < CK_DOUBLE_EQ_EPSILON, \
+ "Assertion '" #X#OP#Y \
+ "' failed: "#X"==%f, "#Y"==%f", \
+ _ck_x, \
+ _ck_y); \
+ } while (0)
+
+#define _ck_assert_double_ne(X, OP,Y) \
+ do { \
+ double _ck_x = X; \
+ double _ck_y = Y; \
+ ck_assert_msg(_ck_x OP _ck_y && \
+ fabs(_ck_x - _ck_y) > CK_DOUBLE_EQ_EPSILON, \
+ "Assertion '" #X#OP#Y \
+ "' failed: "#X"==%f, "#Y"==%f", \
+ _ck_x, \
+ _ck_y); \
+ } while (0)
+#define ck_assert_double_lt(X, Y) _ck_assert_double_ne(X, <, Y)
+#define ck_assert_double_le(X, Y) _ck_assert_double_eq(X, <=, Y)
+#define ck_assert_double_gt(X, Y) _ck_assert_double_ne(X, >, Y)
+#define ck_assert_double_ge(X, Y) _ck_assert_double_eq(X, >=, Y)
#endif /* LITEST_H */