mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-21 12:00:05 +01:00
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>
This commit is contained in:
parent
2f8703620e
commit
1309718c00
2 changed files with 116 additions and 0 deletions
|
|
@ -289,6 +289,61 @@ START_TEST(litest_ptr_notnull_trigger_NULL)
|
||||||
}
|
}
|
||||||
END_TEST
|
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 *
|
static Suite *
|
||||||
litest_assert_macros_suite(void)
|
litest_assert_macros_suite(void)
|
||||||
{
|
{
|
||||||
|
|
@ -342,6 +397,17 @@ litest_assert_macros_suite(void)
|
||||||
tcase_add_test(tc, litest_ptr_notnull_notrigger);
|
tcase_add_test(tc, litest_ptr_notnull_notrigger);
|
||||||
suite_add_tcase(s, tc);
|
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;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -458,4 +458,54 @@ litest_disable_tap(struct libinput_device *device)
|
||||||
litest_assert_int_eq(status, expected);
|
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 */
|
#endif /* LITEST_H */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue