a4822eb066
The C test files generated by autogen are not included in the upstream repository but are in the source tarball.
161 lines
5.6 KiB
Diff
161 lines
5.6 KiB
Diff
From cefd7b59df628eca240af3c136d66137c8e94888 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?= <zmoelnig@iem.at>
|
|
Date: Thu, 8 Sep 2022 10:49:36 +0200
|
|
Subject: [PATCH] tests: Use fuzzy comparison in test-suite
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Using exact comparison ("a == b") when comparing expected with computed
|
|
test data fails the test-suite on many architectures (including, but not
|
|
limited to armhf and arm64).
|
|
|
|
Instead, use epsilon(for now, FLT_EPSILON and DBL_EPSILON) to compare
|
|
floating point numbers for equality.
|
|
|
|
|
|
Closes: https://github.com/libsndfile/libsndfile/issues/866
|
|
|
|
Signed-off-by: IOhannes m zmölnig <zmoelnig@iem.at>
|
|
---
|
|
tests/utils.tpl | 27 +++++++++++++++++++++++++--
|
|
1 file changed, 25 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/tests/utils.tpl b/tests/utils.tpl
|
|
index c68e3a26e..0d1cd8bb9 100644
|
|
--- a/tests/utils.tpl
|
|
+++ b/tests/utils.tpl
|
|
@@ -193,6 +193,7 @@ sf_count_t file_length_fd (int fd) ;
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <math.h>
|
|
+#include <float.h>
|
|
#include <fcntl.h>
|
|
#include <sys/stat.h>
|
|
|
|
@@ -215,6 +216,28 @@ sf_count_t file_length_fd (int fd) ;
|
|
#define O_BINARY 0
|
|
#endif
|
|
|
|
+
|
|
+/*
|
|
+** Compare for equality, with epsilon
|
|
+*/
|
|
+static inline int
|
|
+equals_short (const short a, const short b)
|
|
+{ return (a == b);
|
|
+} /* equals_short */
|
|
+static inline int
|
|
+equals_int (const int a, const int b)
|
|
+{ return (a == b);
|
|
+} /* equals_int */
|
|
+static inline int
|
|
+equals_float (const float a, const float b)
|
|
+{ return (fabsf(a - b) <= FLT_EPSILON);
|
|
+} /* equals_float */
|
|
+static inline int
|
|
+equals_double (const double a, const double b)
|
|
+{ return (fabs(a - b) <= DBL_EPSILON);
|
|
+} /* equals_double */
|
|
+
|
|
+
|
|
[+ FOR float_type +]
|
|
void
|
|
gen_windowed_sine_[+ (get "name") +] ([+ (get "name") +] *data, int len, double maximum)
|
|
@@ -752,8 +775,8 @@ compare_[+ (get "io_element") +]_or_die (const [+ (get "io_element") +] *expecte
|
|
unsigned k ;
|
|
|
|
for (k = 0 ; k < count ; k++)
|
|
- if (expected [k] != actual [k])
|
|
- { printf ("\n\nLine %d : Error at index %d, got " [+ (get "format_str") +] ", should be " [+ (get "format_str") +] ".\n\n", line_num, k, actual [k], expected [k]) ;
|
|
+ if (!equals_[+ (get "io_element") +](expected [k], actual [k]))
|
|
+ { printf ("\n\nLine %d : Error at index %d, got " [+ (get "format_str") +] ", should be " [+ (get "format_str") +] "(delta=" [+ (get "format_str") +] " ).\n\n", line_num, k, actual [k], expected [k], actual [k] - expected [k]) ;
|
|
exit (1) ;
|
|
} ;
|
|
|
|
diff --git a/tests/utils.c b/tests/utils.c
|
|
index c239606..b1adf29 100644
|
|
--- a/tests/utils.c
|
|
+++ b/tests/utils.c
|
|
@@ -43,6 +43,7 @@
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <math.h>
|
|
+#include <float.h>
|
|
#include <fcntl.h>
|
|
#include <sys/stat.h>
|
|
|
|
@@ -66,6 +67,28 @@
|
|
#endif
|
|
|
|
|
|
+/*
|
|
+** Compare for equality, with epsilon
|
|
+*/
|
|
+static inline int
|
|
+equals_short (const short a, const short b)
|
|
+{ return (a == b);
|
|
+} /* equals_short */
|
|
+static inline int
|
|
+equals_int (const int a, const int b)
|
|
+{ return (a == b);
|
|
+} /* equals_int */
|
|
+static inline int
|
|
+equals_float (const float a, const float b)
|
|
+{ return (fabsf(a - b) <= FLT_EPSILON);
|
|
+} /* equals_float */
|
|
+static inline int
|
|
+equals_double (const double a, const double b)
|
|
+{ return (fabs(a - b) <= DBL_EPSILON);
|
|
+} /* equals_double */
|
|
+
|
|
+
|
|
+
|
|
void
|
|
gen_windowed_sine_float (float *data, int len, double maximum)
|
|
{ int k ;
|
|
@@ -958,8 +981,8 @@ compare_short_or_die (const short *expected, const short *actual, unsigned count
|
|
unsigned k ;
|
|
|
|
for (k = 0 ; k < count ; k++)
|
|
- if (expected [k] != actual [k])
|
|
- { printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" ".\n\n", line_num, k, actual [k], expected [k]) ;
|
|
+ if (!equals_short(expected [k], actual [k]))
|
|
+ { printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" "(delta=" "% d" " ).\n\n", line_num, k, actual [k], expected [k], actual [k] - expected [k]) ;
|
|
exit (1) ;
|
|
} ;
|
|
|
|
@@ -971,8 +994,8 @@ compare_int_or_die (const int *expected, const int *actual, unsigned count, int
|
|
unsigned k ;
|
|
|
|
for (k = 0 ; k < count ; k++)
|
|
- if (expected [k] != actual [k])
|
|
- { printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" ".\n\n", line_num, k, actual [k], expected [k]) ;
|
|
+ if (!equals_int(expected [k], actual [k]))
|
|
+ { printf ("\n\nLine %d : Error at index %d, got " "% d" ", should be " "% d" "(delta=" "% d" " ).\n\n", line_num, k, actual [k], expected [k], actual [k] - expected [k]) ;
|
|
exit (1) ;
|
|
} ;
|
|
|
|
@@ -984,8 +1007,8 @@ compare_float_or_die (const float *expected, const float *actual, unsigned count
|
|
unsigned k ;
|
|
|
|
for (k = 0 ; k < count ; k++)
|
|
- if (expected [k] != actual [k])
|
|
- { printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" ".\n\n", line_num, k, actual [k], expected [k]) ;
|
|
+ if (!equals_float(expected [k], actual [k]))
|
|
+ { printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" "(delta=" "% g" " ).\n\n", line_num, k, actual [k], expected [k], actual [k] - expected [k]) ;
|
|
exit (1) ;
|
|
} ;
|
|
|
|
@@ -997,8 +1020,8 @@ compare_double_or_die (const double *expected, const double *actual, unsigned co
|
|
unsigned k ;
|
|
|
|
for (k = 0 ; k < count ; k++)
|
|
- if (expected [k] != actual [k])
|
|
- { printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" ".\n\n", line_num, k, actual [k], expected [k]) ;
|
|
+ if (!equals_double(expected [k], actual [k]))
|
|
+ { printf ("\n\nLine %d : Error at index %d, got " "% g" ", should be " "% g" "(delta=" "% g" " ).\n\n", line_num, k, actual [k], expected [k], actual [k] - expected [k]) ;
|
|
exit (1) ;
|
|
} ;
|
|
|