aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2015-12-02 20:02:11 +0100
committerCamil Staps2015-12-02 20:04:46 +0100
commit2f564f6fdc21a4f851db2f85cf5416fee5c7d339 (patch)
tree42a6aef3e95d91ce1c2eeb2a4b5ffff0a5d6288a
parentInitial commit (diff)
First version
-rw-r--r--Makefile15
-rw-r--r--cstest.c67
-rw-r--r--cstest.h78
-rw-r--r--example.c33
4 files changed, 193 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..34edccb
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,15 @@
+CC=gcc
+CFLAGS=-O3
+DEPS=cstest.h
+OBJS=example.o cstest.o
+
+%.o: %.c $(DEPS)
+ $(CC) -c -o $@ $< $(CFLAGS)
+
+example: $(OBJS)
+ $(CC) -o $@ $^ $(CFLAGS)
+
+clean:
+ rm *.o example
+
+
diff --git a/cstest.c b/cstest.c
new file mode 100644
index 0000000..1b2a3ef
--- /dev/null
+++ b/cstest.c
@@ -0,0 +1,67 @@
+/**
+ * CSTest - 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 <http://www.gnu.org/licenses/>.
+ */
+#include <stdio.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include "cstest.h"
+
+// Colours for terminal output
+#define KRED "\x1B[31m"
+#define KGRN "\x1B[32m"
+#define RESET "\x1B[0m"
+
+cstester* test_initialize(void) {
+ cstester* test = malloc(sizeof(cstester));
+ if (test == NULL) return NULL;
+ test->passed = 0;
+ test->failed = 0;
+ test->show_pass = true;
+ return test;
+}
+
+void test_wrapup(cstester* tester) {
+ if (tester->failed == 0) {
+ printf(KGRN "\nAll tests passed (%d)\n" RESET, tester->passed);
+ } else {
+ printf(KRED "\n%d test%s failed" RESET " (%d passed)\n",
+ tester->failed, tester->failed > 1 ? "s" : "", tester->passed);
+ }
+}
+
+void test_destroy(cstester* tester) {
+ free(tester);
+}
+
+void test_exit(cstester* tester) {
+ bool all_passed = tester->failed == 0;
+ test_destroy(tester);
+ exit(all_passed ? 0 : -1);
+}
+
+void test_true(cstester* tester, bool check, const char* text) {
+ if (!check || tester->show_pass) {
+ printf(check ? KGRN : KRED);
+ printf(check ? "Test passed" : "Test failed");
+ if (text != NULL)
+ printf(": %s", text);
+ printf("\n" RESET);
+ }
+
+ *(check ? &tester->passed : &tester->failed) += 1;
+}
+
diff --git a/cstest.h b/cstest.h
new file mode 100644
index 0000000..6fb3280
--- /dev/null
+++ b/cstest.h
@@ -0,0 +1,78 @@
+/**
+ * CSTest - 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 <http://www.gnu.org/licenses/>.
+ */
+#include <inttypes.h>
+#include <stdbool.h>
+
+typedef struct {
+ uint16_t passed; // Number of passed tests
+ uint16_t failed; // Number of failed tests
+ bool show_pass; // Whether or not to print a message when a test passes
+} cstester;
+
+/**
+ * Initialize a tester struct
+ *
+ * This allocates a cstester on the heap. Don't forget to call test_destroy to
+ * free that memory.
+ *
+ * @return a struct on the heap for use in the other test_* functions
+ */
+cstester* test_initialize(void);
+
+/**
+ * Show summarised data about the tester
+ *
+ * Shows a green message when all tests passed, otherwise a red message that
+ * some failed. Shows passed/failed counts as well.
+ *
+ * @param cstester* a pointer to a cstester from test_initialize
+ */
+void test_wrapup(cstester*);
+
+/**
+ * Destroy a cstester struct
+ *
+ * Essentially frees the memory that was allocated for the struct.
+ *
+ * @param cstester* a pointer to a cstester from test_initialize
+ */
+void test_destroy(cstester*);
+
+/**
+ * Exit the program with an appropriate return value
+ *
+ * Returns -1 if one or more tests failed, 0 otherwise. Exits the program.
+ *
+ * @param cstester* a pointer to a cstester from test_initialize
+ * @return don't expect this to return
+ */
+void test_exit(cstester*);
+
+/**
+ * Test for truth on a bool
+ *
+ * Outputs a red message for failure, and a green one for passing if
+ * cstester->show_pass is true. Adds this test to the summarised data in the
+ * cstester.
+ *
+ * @param cstester* a pointer to a cstester from test_initialize
+ * @param check the boolean that should be true
+ * @param test a custom message to show
+ */
+void test_true(cstester* tester, bool check, const char* text);
+
diff --git a/example.c b/example.c
new file mode 100644
index 0000000..ffd155a
--- /dev/null
+++ b/example.c
@@ -0,0 +1,33 @@
+/**
+ * CSTest - 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 <http://www.gnu.org/licenses/>.
+ */
+#include <stddef.h>
+#include "cstest.h"
+
+int main(void) {
+ cstester* tester = test_initialize();
+ tester->show_pass = false;
+
+ test_true(tester, 1 == 1, "1 = 1");
+ test_true(tester, 42 == 6 * 7, "42 = 6*7");
+ test_true(tester, !NULL, "NULL is false");
+ test_true(tester, -10 > 10, "Negative is greater than positive");
+
+ test_wrapup(tester);
+ test_exit(tester);
+}
+