Added basic test execution collector and runner and some reference assertions
This commit is contained in:
commit
612c64ca21
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
obj/
|
||||
.vscode
|
||||
*.so*
|
7
.vscode/settings.json
vendored
Normal file
7
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"ctest.h": "c",
|
||||
"typeinfo": "c",
|
||||
"*.a": "c"
|
||||
}
|
||||
}
|
49
Makefile
Normal file
49
Makefile
Normal file
@ -0,0 +1,49 @@
|
||||
CC=gcc
|
||||
|
||||
CFLAGS=-Wall -pedantic -std=c11 -fPIC
|
||||
LDFLAGS=
|
||||
DFLAGS=-gdb3
|
||||
|
||||
NAMES=ctest funcs
|
||||
|
||||
set_values = $(addprefix $(1),$(addsuffix $(2),$(3)))
|
||||
|
||||
sourcefy = $(call set_values,./src/,.c,$(1))
|
||||
objectify = $(call set_values,./obj/,.o,$(1))
|
||||
|
||||
SOURCES=$(foreach N,$(NAMES),$(call sourcefy,$(N)))
|
||||
OBJECTS=$(foreach N,$(NAMES),$(call objectify,$(N)))
|
||||
|
||||
all: libctest
|
||||
|
||||
libctest: $(OBJECTS) check-env
|
||||
gcc -shared -Wl,-soname,$(addsuffix .so.$(CT_VERSION),$@) -o $(addsuffix .so.$(CT_VERSION).0,$@) $(OBJECTS)
|
||||
|
||||
|
||||
$(OBJECTS):%.o: $($(call sourcefy $@)) objdir
|
||||
$(CC) $(CFLAGS) -c -o $@ $(call sourcefy,$(subst .o,,$(@F)))
|
||||
|
||||
objdir:
|
||||
mkdir -p obj
|
||||
|
||||
install: check-env
|
||||
cp libctest.so.$(CT_VERSION).0 /usr/local/lib/
|
||||
ln -sf /usr/local/lib/libctest.so.$(CT_VERSION).0 /usr/local/lib/libctest.so.$(CT_VERSION)
|
||||
ln -sf /usr/local/lib/libctest.so.$(CT_VERSION).0 /usr/local/lib/libctest.so
|
||||
mkdir -p /usr/local/include/ctest
|
||||
cp $(wildcard ./include/*) /usr/local/include/ctest
|
||||
|
||||
uninstall: check-env
|
||||
rm -f $(wildcard /usr/local/lib/libctest.so*)
|
||||
rm -rf $(wildcard /usr/local/include/ctest/*)
|
||||
|
||||
check-env:
|
||||
ifndef CT_VERSION
|
||||
$(error CT_VERSION is undefined)
|
||||
endif
|
||||
|
||||
.PHONY:
|
||||
clean
|
||||
clean:
|
||||
rm -rf obj
|
||||
rm $(wildcard libctest.so*)
|
15
README.md
Normal file
15
README.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Testing library for C
|
||||
|
||||
Mostly specialized on unit tests library for improved testing experience
|
||||
|
||||
# Example:
|
||||
|
||||
```c
|
||||
#include "ctest.h"
|
||||
#include "funcs.h"
|
||||
...
|
||||
test(is_true(some_function()), "Function is true");
|
||||
run_tests();
|
||||
...
|
||||
|
||||
```
|
19
include/ctest.h
Normal file
19
include/ctest.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef CTEST_H
|
||||
#define CTEST_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
typedef struct test_structure
|
||||
{
|
||||
int result;
|
||||
char *name;
|
||||
} test_t;
|
||||
|
||||
void run_tests(int *which);
|
||||
test_t *new_test(int res, char *name);
|
||||
void free_test(test_t *o_t);
|
||||
void test(int res, char *name);
|
||||
|
||||
#endif
|
8
include/funcs.h
Normal file
8
include/funcs.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef FUNCS_H
|
||||
#define FUNCS_H
|
||||
|
||||
int is_equal(void *res, void *correct);
|
||||
int is_true(void *res);
|
||||
int is_false(void *res);
|
||||
|
||||
#endif
|
BIN
obj/ctest.o
Normal file
BIN
obj/ctest.o
Normal file
Binary file not shown.
BIN
obj/funcs.o
Normal file
BIN
obj/funcs.o
Normal file
Binary file not shown.
114
src/ctest.c
Normal file
114
src/ctest.c
Normal file
@ -0,0 +1,114 @@
|
||||
#include "../include/ctest.h"
|
||||
|
||||
static test_t **tests;
|
||||
static int tests_k;
|
||||
|
||||
/**
|
||||
* Executes one test check. Fails if NULL passed
|
||||
* @param test Test to execute
|
||||
* @param failde_k Counter of failed tests. Link is passed because it is incremented inside function body
|
||||
* @param n Test number to print
|
||||
*/
|
||||
void execute_test(test_t *test, int *failed_k, int n)
|
||||
{
|
||||
if (test == NULL)
|
||||
{
|
||||
fprintf(stderr, "No such test: %d", n + 1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (test->result)
|
||||
fprintf(stdout, "%s\n\033[0;32m%d - Passed\033[0m\n", test->name, n + 1);
|
||||
else
|
||||
{
|
||||
fprintf(stdout, "\033[0;31m%d FAILED\033[0m\n", n + 1);
|
||||
fprintf(stderr, "Test %d failded", n + 1);
|
||||
failed_k++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs all tests
|
||||
* Execute after all test declarations.
|
||||
* @param which Array of numbers of tests to execute ending with -1 or NULL if all tests must be run.
|
||||
*/
|
||||
void run_tests(int *which)
|
||||
{
|
||||
fprintf(stdout, "Executing tests:\n");
|
||||
|
||||
int failed_k = 0;
|
||||
|
||||
if (which == NULL)
|
||||
{
|
||||
for (int i = 0; i < tests_k; i++)
|
||||
execute_test(tests[i], &failed_k, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
int i = 0;
|
||||
while (which[i] != -1)
|
||||
{
|
||||
int j = which[i];
|
||||
|
||||
if (j < 0 || j >= tests_k)
|
||||
{
|
||||
fprintf(stderr, "No such test: %d", j + 1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
execute_test(tests[j], &failed_k, j);
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
if (failed_k > 0)
|
||||
{
|
||||
fprintf(stderr, "%d tests failed", failed_k);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(stdout, "All tests passed");
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new test struct
|
||||
*/
|
||||
test_t *new_test(int res, char *name)
|
||||
{
|
||||
test_t *n_t = (test_t *)malloc(sizeof(test_t));
|
||||
|
||||
n_t->name = strdup(name);
|
||||
n_t->result = res;
|
||||
|
||||
return n_t;
|
||||
}
|
||||
|
||||
/**
|
||||
* Frees memory allocated for test structure
|
||||
*/
|
||||
void free_test(test_t *o_t)
|
||||
{
|
||||
free(o_t->name);
|
||||
free(o_t);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test declarator. Adds specified test to list of tests
|
||||
* @param res Response of testing function
|
||||
* @param name Test name
|
||||
*/
|
||||
void test(int res, char *name)
|
||||
{
|
||||
if (tests == NULL)
|
||||
{
|
||||
tests = malloc(0);
|
||||
tests_k = 0;
|
||||
}
|
||||
|
||||
tests = realloc(tests, (tests_k + 1) * sizeof(test_t *));
|
||||
tests[tests_k] = new_test(res, name);
|
||||
tests_k++;
|
||||
}
|
16
src/funcs.c
Normal file
16
src/funcs.c
Normal file
@ -0,0 +1,16 @@
|
||||
#include "../include/funcs.h"
|
||||
|
||||
int is_equal(void *res, void *correct)
|
||||
{
|
||||
return res == correct;
|
||||
}
|
||||
|
||||
int is_true(void *res)
|
||||
{
|
||||
return res && 1;
|
||||
}
|
||||
|
||||
int is_false(void *res)
|
||||
{
|
||||
return !res;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user