/**
* MinCTest - Minimalistic C unit test framework
* Copyright (C) 2015 Camil Staps
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include
#include
#include "minctest.h"
/* Colours for terminal output */
#define KRED "\x1B[31m"
#define KGRN "\x1B[32m"
#define RESET "\x1B[0m"
struct tester *test_initialize() {
struct tester *test = malloc(sizeof(struct tester));
if (test == NULL)
return NULL;
test->passed = 0;
test->failed = 0;
test->show_pass = true;
gettimeofday(&test->created, NULL);
test_start_timer(test);
return test;
}
void test_wrapup(struct tester* tester) {
struct timeval end;
float time, used;
gettimeofday(&end, NULL);
time = (end.tv_usec - tester->created.tv_usec) / 1000.0;
used = (tester->used) / 1000.0;
if (tester->failed == 0) {
printf(KGRN "\nAll tests passed (%d) [%.3fs / %.3fs]\n" RESET,
tester->passed, used, time);
} else {
printf(KRED "\n%d test%s failed" RESET
" (%d passed) [%.3fs / %.3fs]\n",
tester->failed, tester->failed > 1 ? "s" : "",
tester->passed, used, time);
}
}
void test_destroy(struct tester *tester) {
free(tester);
}
void test_exit(struct tester *tester) {
bool all_passed = tester->failed == 0;
test_destroy(tester);
exit(all_passed ? 0 : -1);
}
void test_start_timer(struct tester *tester) {
gettimeofday(&tester->start_last_test, NULL);
}
void test_true(struct tester *tester, bool check, const char* text) {
struct timeval end;
float time;
gettimeofday(&end, NULL);
tester->used += end.tv_usec - tester->start_last_test.tv_usec;
time = (end.tv_usec - tester->start_last_test.tv_usec) / 1000.0;
if (!check || tester->show_pass) {
puts(check ? KGRN : KRED);
puts(check ? "Test passed" : "Test failed");
if (text != NULL)
printf(": %s", text);
printf(" [%.3fs]", time);
puts(RESET "\n");
}
*(check ? &tester->passed : &tester->failed) += 1;
test_start_timer(tester);
}