Skip to content

Commit 87e278d

Browse files
committed
Merge branch 'ps/clar-integers'
Import newer version of "clar", unit testing framework. * ps/clar-integers: gitattributes: disable blank-at-eof errors for clar test expectations t/unit-tests: demonstrate use of integer comparison assertions t/unit-tests: update clar to 39f11fe
2 parents e7b120c + 84071a6 commit 87e278d

File tree

14 files changed

+520
-70
lines changed

14 files changed

+520
-70
lines changed

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ CODE_OF_CONDUCT.md -whitespace
1717
/Documentation/gitk.adoc conflict-marker-size=32
1818
/Documentation/user-manual.adoc conflict-marker-size=32
1919
/t/t????-*.sh conflict-marker-size=32
20+
/t/unit-tests/clar/test/expected/* whitespace=-blank-at-eof

t/unit-tests/clar/.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353
if: matrix.platform.image == 'i386/debian:latest'
5454
run: apt -q update && apt -q -y install cmake gcc libc6-amd64 lib64stdc++6 make python3
5555
- name: Check out
56-
uses: actions/checkout@v4
56+
uses: actions/checkout@v6
5757
- name: Build
5858
shell: bash
5959
run: |

t/unit-tests/clar/clar.c

Lines changed: 141 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
#include <sys/types.h>
2525
#include <sys/stat.h>
2626

27+
#ifndef va_copy
28+
# ifdef __va_copy
29+
# define va_copy(dst, src) __va_copy(dst, src)
30+
# else
31+
# define va_copy(dst, src) ((dst) = (src))
32+
# endif
33+
#endif
34+
2735
#if defined(__UCLIBC__) && ! defined(__UCLIBC_HAS_WCHAR__)
2836
/*
2937
* uClibc can optionally be built without wchar support, in which case
@@ -76,8 +84,10 @@
7684
# define S_ISDIR(x) ((x & _S_IFDIR) != 0)
7785
# endif
7886
# define p_snprintf(buf,sz,fmt,...) _snprintf_s(buf,sz,_TRUNCATE,fmt,__VA_ARGS__)
87+
# define p_vsnprintf _vsnprintf
7988
# else
8089
# define p_snprintf snprintf
90+
# define p_vsnprintf vsnprintf
8191
# endif
8292

8393
# define localtime_r(timer, buf) (localtime_s(buf, timer) == 0 ? buf : NULL)
@@ -86,6 +96,7 @@
8696
# include <unistd.h>
8797
# define _MAIN_CC
8898
# define p_snprintf snprintf
99+
# define p_vsnprintf vsnprintf
89100
typedef struct stat STAT_T;
90101
#endif
91102

@@ -699,13 +710,14 @@ void clar__skip(void)
699710
abort_test();
700711
}
701712

702-
void clar__fail(
713+
static void clar__failv(
703714
const char *file,
704715
const char *function,
705716
size_t line,
717+
int should_abort,
706718
const char *error_msg,
707719
const char *description,
708-
int should_abort)
720+
va_list args)
709721
{
710722
struct clar_error *error;
711723

@@ -725,9 +737,19 @@ void clar__fail(
725737
error->line_number = _clar.invoke_line ? _clar.invoke_line : line;
726738
error->error_msg = error_msg;
727739

728-
if (description != NULL &&
729-
(error->description = strdup(description)) == NULL)
730-
clar_abort("Failed to allocate description.\n");
740+
if (description != NULL) {
741+
va_list args_copy;
742+
int len;
743+
744+
va_copy(args_copy, args);
745+
if ((len = p_vsnprintf(NULL, 0, description, args_copy)) < 0)
746+
clar_abort("Failed to compute description.");
747+
va_end(args_copy);
748+
749+
if ((error->description = calloc(1, len + 1)) == NULL)
750+
clar_abort("Failed to allocate buffer.");
751+
p_vsnprintf(error->description, len + 1, description, args);
752+
}
731753

732754
_clar.total_errors++;
733755
_clar.last_report->status = CL_TEST_FAILURE;
@@ -736,6 +758,34 @@ void clar__fail(
736758
abort_test();
737759
}
738760

761+
void clar__failf(
762+
const char *file,
763+
const char *function,
764+
size_t line,
765+
int should_abort,
766+
const char *error_msg,
767+
const char *description,
768+
...)
769+
{
770+
va_list args;
771+
va_start(args, description);
772+
clar__failv(file, function, line, should_abort, error_msg,
773+
description, args);
774+
va_end(args);
775+
}
776+
777+
void clar__fail(
778+
const char *file,
779+
const char *function,
780+
size_t line,
781+
const char *error_msg,
782+
const char *description,
783+
int should_abort)
784+
{
785+
clar__failf(file, function, line, should_abort, error_msg,
786+
description ? "%s" : NULL, description);
787+
}
788+
739789
void clar__assert(
740790
int condition,
741791
const char *file,
@@ -889,6 +939,92 @@ void clar__assert_equal(
889939
clar__fail(file, function, line, err, buf, should_abort);
890940
}
891941

942+
void clar__assert_compare_i(
943+
const char *file,
944+
const char *func,
945+
size_t line,
946+
int should_abort,
947+
enum clar_comparison cmp,
948+
intmax_t value1,
949+
intmax_t value2,
950+
const char *error,
951+
const char *description,
952+
...)
953+
{
954+
int fulfilled;
955+
switch (cmp) {
956+
case CLAR_COMPARISON_EQ:
957+
fulfilled = value1 == value2;
958+
break;
959+
case CLAR_COMPARISON_LT:
960+
fulfilled = value1 < value2;
961+
break;
962+
case CLAR_COMPARISON_LE:
963+
fulfilled = value1 <= value2;
964+
break;
965+
case CLAR_COMPARISON_GT:
966+
fulfilled = value1 > value2;
967+
break;
968+
case CLAR_COMPARISON_GE:
969+
fulfilled = value1 >= value2;
970+
break;
971+
default:
972+
cl_assert(0);
973+
return;
974+
}
975+
976+
if (!fulfilled) {
977+
va_list args;
978+
va_start(args, description);
979+
clar__failv(file, func, line, should_abort, error,
980+
description, args);
981+
va_end(args);
982+
}
983+
}
984+
985+
void clar__assert_compare_u(
986+
const char *file,
987+
const char *func,
988+
size_t line,
989+
int should_abort,
990+
enum clar_comparison cmp,
991+
uintmax_t value1,
992+
uintmax_t value2,
993+
const char *error,
994+
const char *description,
995+
...)
996+
{
997+
int fulfilled;
998+
switch (cmp) {
999+
case CLAR_COMPARISON_EQ:
1000+
fulfilled = value1 == value2;
1001+
break;
1002+
case CLAR_COMPARISON_LT:
1003+
fulfilled = value1 < value2;
1004+
break;
1005+
case CLAR_COMPARISON_LE:
1006+
fulfilled = value1 <= value2;
1007+
break;
1008+
case CLAR_COMPARISON_GT:
1009+
fulfilled = value1 > value2;
1010+
break;
1011+
case CLAR_COMPARISON_GE:
1012+
fulfilled = value1 >= value2;
1013+
break;
1014+
default:
1015+
cl_assert(0);
1016+
return;
1017+
}
1018+
1019+
if (!fulfilled) {
1020+
va_list args;
1021+
va_start(args, description);
1022+
clar__failv(file, func, line, should_abort, error,
1023+
description, args);
1024+
va_end(args);
1025+
}
1026+
}
1027+
8921028
void cl_set_cleanup(void (*cleanup)(void *), void *opaque)
8931029
{
8941030
_clar.local_cleanup = cleanup;

t/unit-tests/clar/clar.h

Lines changed: 79 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#ifndef __CLAR_TEST_H__
88
#define __CLAR_TEST_H__
99

10+
#include <inttypes.h>
1011
#include <stdlib.h>
1112
#include <limits.h>
1213

@@ -149,6 +150,7 @@ const char *cl_fixture_basename(const char *fixture_name);
149150
* Forced failure/warning
150151
*/
151152
#define cl_fail(desc) clar__fail(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, "Test failed.", desc, 1)
153+
#define cl_failf(desc,...) clar__failf(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, "Test failed.", desc, __VA_ARGS__)
152154
#define cl_warning(desc) clar__fail(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, "Warning during test execution:", desc, 0)
153155

154156
#define cl_skip() clar__skip()
@@ -168,9 +170,42 @@ const char *cl_fixture_basename(const char *fixture_name);
168170
#define cl_assert_equal_wcsn(wcs1,wcs2,len) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,"String mismatch: " #wcs1 " != " #wcs2, 1, "%.*ls", (wcs1), (wcs2), (int)(len))
169171
#define cl_assert_equal_wcsn_(wcs1,wcs2,len,note) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,"String mismatch: " #wcs1 " != " #wcs2 " (" #note ")", 1, "%.*ls", (wcs1), (wcs2), (int)(len))
170172

171-
#define cl_assert_equal_i(i1,i2) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,#i1 " != " #i2, 1, "%d", (int)(i1), (int)(i2))
172-
#define cl_assert_equal_i_(i1,i2,note) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,#i1 " != " #i2 " (" #note ")", 1, "%d", (i1), (i2))
173-
#define cl_assert_equal_i_fmt(i1,i2,fmt) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,#i1 " != " #i2, 1, (fmt), (int)(i1), (int)(i2))
173+
#define cl_assert_compare_i_(i1, i2, cmp, error, ...) clar__assert_compare_i(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \
174+
(i1), (i2), "Expected comparison to hold: " error, __VA_ARGS__)
175+
#define cl_assert_compare_i(i1, i2, cmp, error, fmt) do { \
176+
intmax_t v1 = (i1), v2 = (i2); \
177+
clar__assert_compare_i(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \
178+
v1, v2, "Expected comparison to hold: " error, fmt, v1, v2); \
179+
} while (0)
180+
#define cl_assert_equal_i_(i1, i2, ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_EQ, #i1 " == " #i2, __VA_ARGS__)
181+
#define cl_assert_equal_i(i1, i2) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_EQ, #i1 " == " #i2, "%"PRIdMAX " != %"PRIdMAX)
182+
#define cl_assert_equal_i_fmt(i1, i2, fmt) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_EQ, #i1 " == " #i2, fmt " != " fmt, (int)(i1), (int)(i2))
183+
#define cl_assert_lt_i_(i1, i2, ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_LT, #i1 " < " #i2, __VA_ARGS__)
184+
#define cl_assert_lt_i(i1, i2) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_LT, #i1 " < " #i2, "%"PRIdMAX " >= %"PRIdMAX)
185+
#define cl_assert_le_i_(i1, i2, ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_LE, #i1 " <= " #i2, __VA_ARGS__)
186+
#define cl_assert_le_i(i1, i2) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_LE, #i1 " <= " #i2, "%"PRIdMAX " > %"PRIdMAX)
187+
#define cl_assert_gt_i_(i1, i2, ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_GT, #i1 " > " #i2, __VA_ARGS__)
188+
#define cl_assert_gt_i(i1, i2) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_GT, #i1 " > " #i2, "%"PRIdMAX " <= %"PRIdMAX)
189+
#define cl_assert_ge_i_(i1, i2, ...) cl_assert_compare_i_(i1, i2, CLAR_COMPARISON_GE, #i1 " >= " #i2, __VA_ARGS__)
190+
#define cl_assert_ge_i(i1, i2) cl_assert_compare_i (i1, i2, CLAR_COMPARISON_GE, #i1 " >= " #i2, "%"PRIdMAX " < %"PRIdMAX)
191+
192+
#define cl_assert_compare_u_(u1, u2, cmp, error, ...) clar__assert_compare_u(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \
193+
(u1), (u2), "Expected comparison to hold: " error, __VA_ARGS__)
194+
#define cl_assert_compare_u(u1, u2, cmp, error, fmt) do { \
195+
uintmax_t v1 = (u1), v2 = (u2); \
196+
clar__assert_compare_u(CLAR_CURRENT_FILE, CLAR_CURRENT_FUNC, CLAR_CURRENT_LINE, 1, cmp, \
197+
v1, v2, "Expected comparison to hold: " error, fmt, v1, v2); \
198+
} while (0)
199+
#define cl_assert_equal_u_(u1, u2, ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_EQ, #u1 " == " #u2, __VA_ARGS__)
200+
#define cl_assert_equal_u(u1, u2) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_EQ, #u1 " == " #u2, "%"PRIuMAX " != %"PRIuMAX)
201+
#define cl_assert_lt_u_(u1, u2, ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_LT, #u1 " < " #u2, __VA_ARGS__)
202+
#define cl_assert_lt_u(u1, u2) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_LT, #u1 " < " #u2, "%"PRIuMAX " >= %"PRIuMAX)
203+
#define cl_assert_le_u_(u1, u2, ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_LE, #u1 " <= " #u2, __VA_ARGS__)
204+
#define cl_assert_le_u(u1, u2) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_LE, #u1 " <= " #u2, "%"PRIuMAX " > %"PRIuMAX)
205+
#define cl_assert_gt_u_(u1, u2, ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_GT, #u1 " > " #u2, __VA_ARGS__)
206+
#define cl_assert_gt_u(u1, u2) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_GT, #u1 " > " #u2, "%"PRIuMAX " <= %"PRIuMAX)
207+
#define cl_assert_ge_u_(u1, u2, ...) cl_assert_compare_u_(u1, u2, CLAR_COMPARISON_GE, #u1 " >= " #u2, __VA_ARGS__)
208+
#define cl_assert_ge_u(u1, u2) cl_assert_compare_u (u1, u2, CLAR_COMPARISON_GE, #u1 " >= " #u2, "%"PRIuMAX " < %"PRIuMAX)
174209

175210
#define cl_assert_equal_b(b1,b2) clar__assert_equal(CLAR_CURRENT_FILE,CLAR_CURRENT_FUNC,CLAR_CURRENT_LINE,#b1 " != " #b2, 1, "%d", (int)((b1) != 0),(int)((b2) != 0))
176211

@@ -186,6 +221,15 @@ void clar__fail(
186221
const char *description,
187222
int should_abort);
188223

224+
void clar__failf(
225+
const char *file,
226+
const char *func,
227+
size_t line,
228+
int should_abort,
229+
const char *error,
230+
const char *description,
231+
...);
232+
189233
void clar__assert(
190234
int condition,
191235
const char *file,
@@ -204,6 +248,38 @@ void clar__assert_equal(
204248
const char *fmt,
205249
...);
206250

251+
enum clar_comparison {
252+
CLAR_COMPARISON_EQ,
253+
CLAR_COMPARISON_LT,
254+
CLAR_COMPARISON_LE,
255+
CLAR_COMPARISON_GT,
256+
CLAR_COMPARISON_GE,
257+
};
258+
259+
void clar__assert_compare_i(
260+
const char *file,
261+
const char *func,
262+
size_t line,
263+
int should_abort,
264+
enum clar_comparison cmp,
265+
intmax_t value1,
266+
intmax_t value2,
267+
const char *error,
268+
const char *description,
269+
...);
270+
271+
void clar__assert_compare_u(
272+
const char *file,
273+
const char *func,
274+
size_t line,
275+
int should_abort,
276+
enum clar_comparison cmp,
277+
uintmax_t value1,
278+
uintmax_t value2,
279+
const char *error,
280+
const char *description,
281+
...);
282+
207283
void clar__set_invokepoint(
208284
const char *file,
209285
const char *func,

t/unit-tests/clar/clar/print.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ static void clar_print_tap_ontest(const char *suite_name, const char *test_name,
164164
printf(" file: '"); print_escaped(error->file); printf("'\n");
165165
printf(" line: %" PRIuMAX "\n", error->line_number);
166166
printf(" function: '%s'\n", error->function);
167-
printf(" ---\n");
167+
printf(" ...\n");
168168
}
169169

170170
break;

0 commit comments

Comments
 (0)