Skip to content

Commit 9ab9e95

Browse files
authored
Custom Built-in Unit Test Suite (#105)
* tests: new built-in test runner * tests: update tests for new builtin test api * tests: print test suite logs * tests: remove cmocka from build files * tests: colorize test suite log and remove redundant prints
1 parent 27cc9c3 commit 9ab9e95

23 files changed

+561
-415
lines changed

.github/workflows/ccpp.yml

-24
This file was deleted.

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ cscope.*
5151
test/*.trs
5252
test/test_*
5353
*.log
54-
test-*
5554
test/.libs/*
5655
test/tests
5756
cglm_arm/*
@@ -71,3 +70,4 @@ win/x85
7170
win/Debug
7271
cglm-test-ios*
7372
/cglm.pc
73+
test-driver

Makefile.am

+5-9
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
#******************************************************************************
88

99
ACLOCAL_AMFLAGS = -I m4
10-
1110
AM_CFLAGS = -Wall \
1211
-std=gnu99 \
1312
-O3 \
@@ -19,12 +18,9 @@ lib_LTLIBRARIES = libcglm.la
1918
libcglm_la_LDFLAGS = -no-undefined -version-info 0:1:0
2019

2120
checkLDFLAGS = -L./.libs \
22-
-L./test/lib/cmocka/build/src \
23-
-lcmocka \
2421
-lm \
2522
-lcglm
26-
checkCFLAGS = -I./test/lib/cmocka/include \
27-
-I./include
23+
checkCFLAGS = -I./include
2824

2925
check_PROGRAMS = test/tests
3026
TESTS = $(check_PROGRAMS)
@@ -140,8 +136,8 @@ libcglm_la_SOURCES=\
140136
src/bezier.c
141137

142138
test_tests_SOURCES=\
139+
test/runner.c \
143140
test/src/test_common.c \
144-
test/src/test_main.c \
145141
test/src/test_mat4.c \
146142
test/src/test_cam.c \
147143
test/src/test_project.c \
@@ -160,7 +156,7 @@ pkgconfig_DATA=cglm.pc
160156
# the source directory that post-build.sh is in. When not
161157
# using a prefix, $VPATH will be unset, so we need to fall
162158
# back to using . to run the script.
163-
export VPATH
159+
#export VPATH
164160

165-
all-local:
166-
sh $${VPATH:-.}/post-build.sh
161+
# all-local:
162+
# sh $${VPATH:-.}/post-build.sh

configure.ac

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
AC_PREREQ([2.69])
1010
AC_INIT([cglm], [0.6.0], [[email protected]])
11-
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects])
11+
AM_INIT_AUTOMAKE([-Wall -Werror foreign subdir-objects serial-tests])
1212

1313
AC_CONFIG_MACRO_DIR([m4])
1414
AC_CONFIG_SRCDIR([src/])

post-build.sh

-24
This file was deleted.

test/include/common.h

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
* Copyright (c), Recep Aslantas.
3+
*
4+
* MIT License (MIT), http://opensource.org/licenses/MIT
5+
* Full license can be found in the LICENSE file
6+
*/
7+
8+
#ifndef tests_common_h
9+
#define tests_common_h
10+
11+
#include <stdlib.h>
12+
#include <stdio.h>
13+
14+
#include <cglm/cglm.h>
15+
#include <cglm/struct.h>
16+
#include <cglm/call.h>
17+
18+
typedef struct test_status_t {
19+
const char *msg;
20+
int status;
21+
} test_status_t;
22+
23+
typedef test_status_t (*fntest)(void);
24+
25+
typedef struct test_entry_t {
26+
char *name;
27+
fntest entry;
28+
int ret;
29+
int show_output;
30+
} test_entry_t;
31+
32+
#define RESET "\033[0m"
33+
#define BLACK "\033[30m" /* Black */
34+
#define RED "\033[31m" /* Red */
35+
#define GREEN "\033[32m" /* Green */
36+
#define YELLOW "\033[33m" /* Yellow */
37+
#define BLUE "\033[34m" /* Blue */
38+
#define MAGENTA "\033[35m" /* Magenta */
39+
#define CYAN "\033[36m" /* Cyan */
40+
#define WHITE "\033[37m" /* White */
41+
#define BOLDBLACK "\033[1m\033[30m" /* Bold Black */
42+
#define BOLDRED "\033[1m\033[31m" /* Bold Red */
43+
#define BOLDGREEN "\033[1m\033[32m" /* Bold Green */
44+
#define BOLDYELLOW "\033[1m\033[33m" /* Bold Yellow */
45+
#define BOLDBLUE "\033[1m\033[34m" /* Bold Blue */
46+
#define BOLDMAGENTA "\033[1m\033[35m" /* Bold Magenta */
47+
#define BOLDCYAN "\033[1m\033[36m" /* Bold Cyan */
48+
#define BOLDWHITE "\033[1m\033[37m" /* Bold White */
49+
50+
#define TEST_DECLARE(FUN) test_status_t test_ ## FUN(void);
51+
#define TEST_ENTRY(FUN) { #FUN, test_ ## FUN, 0, 0 },
52+
#define TEST_LIST static test_entry_t tests[] =
53+
54+
#define ASSERT_EXT(expr, msg) \
55+
if (!(expr)) { \
56+
fprintf(stderr, \
57+
RED " assert fail" RESET \
58+
" in " BOLDCYAN "%s " RESET \
59+
"on " BOLDMAGENTA "line %d" RESET \
60+
" : " BOLDWHITE " ASSERT(%s)\n" RESET, \
61+
__FILE__, \
62+
__LINE__, \
63+
#expr); \
64+
return (test_status_t){msg, 0}; \
65+
}
66+
67+
#define ASSERT_ARG1(expr) ASSERT_EXT(expr, NULL)
68+
#define ASSERT_ARG2(expr, msg) ASSERT_EXT(expr, msg)
69+
#define ASSERT_ARG3(arg1, arg2, arg3, ...) arg3
70+
71+
#define ASSERT_CHOOSER(...) ASSERT_ARG3(__VA_ARGS__, ASSERT_ARG2, ASSERT_ARG1)
72+
#define ASSERT(...) do { ASSERT_CHOOSER(__VA_ARGS__)(__VA_ARGS__) } while(0);
73+
74+
#define TEST_OK 1
75+
#define TEST_SUCCESS return (test_status_t){NULL, TEST_OK};
76+
77+
#define TEST_IMPL(FUN) \
78+
test_status_t test_ ## FUN (void); \
79+
test_status_t test_ ## FUN()
80+
81+
#endif /* common_h */

test/runner.c

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Copyright (c), Recep Aslantas.
3+
*
4+
* MIT License (MIT), http://opensource.org/licenses/MIT
5+
* Full license can be found in the LICENSE file
6+
*/
7+
8+
#include "include/common.h"
9+
#include "tests.h"
10+
11+
#include <stdlib.h>
12+
13+
int
14+
main(int argc, const char * argv[]) {
15+
test_entry_t *entry;
16+
test_status_t st;
17+
int32_t i, count, passed, failed;
18+
19+
passed = failed = 0;
20+
count = sizeof(tests) / sizeof(tests[0]);
21+
22+
fprintf(stderr, CYAN "\nWelcome to cglm tests\n\n" RESET);
23+
24+
for (i = 0; i < count; i++) {
25+
entry = tests + i;
26+
st = entry->entry();
27+
28+
if (!st.status) {
29+
fprintf(stderr,
30+
BOLDRED " 𐄂" BOLDWHITE " %s " RESET,
31+
entry->name);
32+
if (st.msg) {
33+
fprintf(stderr,
34+
YELLOW "- %s" RESET,
35+
st.msg);
36+
}
37+
38+
fprintf(stderr, "\n");
39+
40+
failed++;
41+
} else {
42+
fprintf(stderr,
43+
GREEN " ✔︎" RESET " %s\n"
44+
,
45+
entry->name);
46+
passed++;
47+
}
48+
}
49+
50+
if (failed == 0) {
51+
fprintf(stderr, BOLDGREEN "\n All tests are passed 🎉\n" RESET);
52+
}
53+
54+
fprintf(stderr,
55+
CYAN "\ncglm test results:\n" RESET
56+
"------------------\n"
57+
58+
MAGENTA "%d" RESET " tests are runned, "
59+
GREEN "%d" RESET " %s passed, "
60+
RED "%d" RESET " %s failed\n\n" RESET,
61+
passed + failed,
62+
passed,
63+
passed > 1 ? "are" : "is",
64+
failed,
65+
failed > 1 ? "are" : "is");
66+
67+
return failed;
68+
}

test/src/test_affine.c

+14-13
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77

88
#include "test_common.h"
99

10-
void
11-
test_affine(void **state) {
10+
TEST_IMPL(affine) {
1211
mat4 t1, t2, t3, t4, t5;
1312

1413
/* test translate is postmultiplied */
@@ -18,7 +17,7 @@ test_affine(void **state) {
1817
glmc_mat4_mul(t1, t2, t3); /* R * T */
1918

2019
glm_translate(t1, (vec3){34, 57, 36});
21-
test_assert_mat4_eq(t1, t3);
20+
ASSERT(test_assert_mat4_eq(t1, t3).status == 1)
2221

2322
/* test rotate is postmultiplied */
2423
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
@@ -27,7 +26,7 @@ test_affine(void **state) {
2726
glmc_mat4_mul(t2, t1, t3); /* T * R */
2827

2928
glm_rotate(t2, GLM_PI_4f, GLM_YUP);
30-
test_assert_mat4_eq(t2, t3);
29+
ASSERT(test_assert_mat4_eq(t2, t3).status == 1)
3130

3231
/* test scale is postmultiplied */
3332
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
@@ -38,31 +37,31 @@ test_affine(void **state) {
3837
glmc_mat4_mul(t3, t4, t5); /* T * R * S */
3938

4039
glm_scale(t3, (vec3){3, 5, 6});
41-
test_assert_mat4_eq(t3, t5);
40+
ASSERT(test_assert_mat4_eq(t3, t5).status == 1)
4241

4342
/* test translate_x */
4443
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
4544
glm_translate_make(t2, (vec3){34, 0, 0});
4645

4746
glmc_mat4_mul(t1, t2, t3); /* R * T */
4847
glm_translate_x(t1, 34);
49-
test_assert_mat4_eq(t1, t3);
48+
ASSERT(test_assert_mat4_eq(t1, t3).status == 1)
5049

5150
/* test translate_y */
5251
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
5352
glm_translate_make(t2, (vec3){0, 57, 0});
5453

5554
glmc_mat4_mul(t1, t2, t3); /* R * T */
5655
glm_translate_y(t1, 57);
57-
test_assert_mat4_eq(t1, t3);
56+
ASSERT(test_assert_mat4_eq(t1, t3).status == 1)
5857

5958
/* test translate_z */
6059
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
6160
glm_translate_make(t2, (vec3){0, 0, 36});
6261

6362
glmc_mat4_mul(t1, t2, t3); /* R * T */
6463
glm_translate_z(t1, 36);
65-
test_assert_mat4_eq(t1, t3);
64+
ASSERT(test_assert_mat4_eq(t1, t3).status == 1)
6665

6766
/* test rotate_x */
6867
glmc_rotate_make(t1, GLM_PI_4f, (vec3){1, 0, 0});
@@ -71,7 +70,7 @@ test_affine(void **state) {
7170
glmc_mat4_mul(t2, t1, t3); /* T * R */
7271

7372
glm_rotate_x(t2, GLM_PI_4f, t2);
74-
test_assert_mat4_eq(t2, t3);
73+
ASSERT(test_assert_mat4_eq(t2, t3).status == 1)
7574

7675
/* test rotate_y */
7776
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 1, 0});
@@ -80,7 +79,7 @@ test_affine(void **state) {
8079
glmc_mat4_mul(t2, t1, t3); /* T * R */
8180

8281
glm_rotate_y(t2, GLM_PI_4f, t2);
83-
test_assert_mat4_eq(t2, t3);
82+
ASSERT(test_assert_mat4_eq(t2, t3).status == 1)
8483

8584
/* test rotate_z */
8685
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 0, 1});
@@ -89,7 +88,7 @@ test_affine(void **state) {
8988
glmc_mat4_mul(t2, t1, t3); /* T * R */
9089

9190
glm_rotate_z(t2, GLM_PI_4f, t2);
92-
test_assert_mat4_eq(t2, t3);
91+
ASSERT(test_assert_mat4_eq(t2, t3).status == 1)
9392

9493
/* test rotate */
9594
glmc_rotate_make(t1, GLM_PI_4f, (vec3){0, 0, 1});
@@ -98,7 +97,7 @@ test_affine(void **state) {
9897
glmc_mat4_mul(t2, t1, t3); /* T * R */
9998
glmc_rotate(t2, GLM_PI_4f, (vec3){0, 0, 1});
10099

101-
test_assert_mat4_eq(t3, t2);
100+
ASSERT(test_assert_mat4_eq(t3, t2).status == 1)
102101

103102
/* test scale_uni */
104103
glmc_rotate_make(t1, GLM_PI_4f, GLM_YUP);
@@ -109,5 +108,7 @@ test_affine(void **state) {
109108
glmc_mat4_mul(t3, t4, t5); /* T * R * S */
110109

111110
glm_scale_uni(t3, 3);
112-
test_assert_mat4_eq(t3, t5);
111+
ASSERT(test_assert_mat4_eq(t3, t5).status == 1)
112+
113+
TEST_SUCCESS
113114
}

0 commit comments

Comments
 (0)