summaryrefslogtreecommitdiff
path: root/tests/pke-test.cpp
blob: 7a314b5384a987e45aababd09e774b5005500377 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

#include "./pke-test-types.h"

#include "./pke-test-asset-manager.h"
#include "./pke-test-audio.h"
#include "./pke-test-dummy.h"
#include "./pke-test-font.hpp"
#include "./pke-test-load-unload.h"
#include "./pke-test-serialization.h"
#include "./pke-test-static-ui.h"
#include "./pke-test-stubs.h"

#include "pk.h"
#include "unistd.h"
#include <stdio.h>

#define CLR_WHITE "\033[0m"
#define CLR_GREEN "\033[92m"
#define CLR_RED   "\033[31m"

// https://stackoverflow.com/questions/64190847/how-to-catch-a-call-to-exit-for-unit-testing
struct pke_test_long_jump lj;
void exit(int code) {
	if (lj.expected_exit) {
		lj.caught = 1;
		longjmp(lj.jump_env, 1);
	}
	_exit(code);
}

int main(int argc, char *argv[])
{
	(void)argc;
	(void)argv;
	int i = 0;
	int result;
	uint32_t k, pass_count, test_group_count, test_group_pass_count;
	double elapsed_ms;
	double group_ms;
	double total_ms;
	pk_tmr func_tmr;
	pk_tmr total_tmr;

	pke_test_get_group *group_fns[] = {
		pke_test_dummy_get_group,
		pke_test_static_ui_get_group,
		pke_test_serialization_get_group,
		pke_test_asset_manager_get_group,
		pke_test_load_unload_get_group,
		pke_test_font_get_group,
		// pke_test_audio_get_group,
		NULL,
	};

	total_ms = 0;
	test_group_count = 0;
	test_group_pass_count = 0;
	pk_tmr_start(total_tmr);
	fprintf(stdout, "\r\n");
	pke_test_get_group *fn = group_fns[i];
	while (fn != NULL) {
		test_group_count += 1;
		pass_count = 0;
		group_ms = 0;
		struct pke_test_group *group = (fn)();
		fprintf(stdout, "[pke-test]:[%s] Begin.\n", group->title);
		if (group->group_setup != NULL) (group->group_setup)();
		for (k = 0; k < group->n_tests; ++k) {
			pke_test_stub_init_vulkan();
			if (group->test_setup != NULL) (group->test_setup)();
			lj.expected_exit = 0;
			lj.caught = 0;
			pk_tmr_start(func_tmr);
			result = (group->tests[k].func)();
			pk_tmr_stop(func_tmr);
			elapsed_ms = pk_tmr_duration_dbl_mili(func_tmr);
			group_ms += elapsed_ms;
			total_ms += elapsed_ms;
			if (result == group->tests[k].expected_result){
				pass_count += 1;
				fprintf(stdout, "[pke-test]:[%s]:[%s] %sPassed.%s\n", group->title, group->tests[k].title, CLR_GREEN, CLR_WHITE);
				fprintf(stdout, "[pke-test]:[%s]:[%s] Elapsed ms: '%f'.\n", group->title, group->tests[k].title, elapsed_ms);
			} else {
				fprintf(stdout, "[pke-test]:[%s]:[%s] %sFailed.%s Expected: '%i' Got: '%i'.\n", group->title, group->tests[k].title, CLR_RED, CLR_WHITE, group->tests[k].expected_result, result);
			}
			if (group->test_teardown != NULL) (group->test_teardown)();
			pke_test_stub_teardown_vulkan();
		}
		if (group->group_teardown != NULL) (group->group_teardown)();
		fprintf(stdout, "[pke-test]:[%s] End. ( %s%03d%s / %03d ) Tests Completed.\n", group->title, pass_count == group->n_tests ? CLR_GREEN : CLR_RED, pass_count, CLR_WHITE, group->n_tests);
		fprintf(stdout, "[pke-test]:[%s] End. Elapsed ms: '%f'.\n\n", group->title, group_ms);
		if (pass_count == group->n_tests) {
			test_group_pass_count += 1;
		}
		i += 1;
		fn = group_fns[i];
	}
	pk_tmr_stop(total_tmr);

	fprintf(stdout, "[pke-test] End. ( %s%03d%s / %03d ) Test Groups Completed.\n", test_group_count == test_group_pass_count ? CLR_GREEN : CLR_RED, test_group_pass_count, CLR_WHITE, test_group_count);
	fprintf(stdout, "[pke-test] End. Elapsed ms: '%f' (test fn sum).\n", total_ms);
	fprintf(stdout, "[pke-test] End. Elapsed ms: '%f' (actual).\n\n", pk_tmr_duration_dbl_mili(total_tmr));

	return 0;
}