summary refs log tree commit diff
path: root/www/
diff options
authorC. McEnroe <>2019-07-12 22:11:16 -0400
committerC. McEnroe <>2019-07-12 22:11:16 -0400
commitebacc3d0ee00212a20cb33b8f660ae73ecd5b95a (patch)
tree7a3ef26ccc341bbf17d3063c80a79440d2e88dbb /www/
parentAdd "Testing C" (diff)
Move to www/
Diffstat (limited to 'www/')
1 files changed, 79 insertions, 0 deletions
diff --git a/www/ b/www/
new file mode 100644
index 0000000..c3a47c1
--- /dev/null
+++ b/www/
@@ -0,0 +1,79 @@
+.Dd December 21, 2018
+.Os "Causal Agency"
+.Nm Testing C
+.Nd a simple unit testing setup
+This is a simple approach
+to unit testing in C
+that I've used in a couple projects.
+At the bottom of a C file
+with some code I want to test,
+I add:
+.Bd -literal -offset indent
+#ifdef TEST
+#include <assert.h>
+int main(void) {
+	assert(...);
+	assert(...);
+This file normally produces a
+.Pa .o
+to be linked into the main binary.
+For testing,
+I produce separate binaries
+and run them with
+.Xr make 1 :
+.Bd -literal -offset indent
+TESTS = foo.t bar.t
+\&.SUFFIXES: .t
+	$(CC) $(CFLAGS) -DTEST $(LDFLAGS) $< $(LDLIBS) -o $@
+test: $(TESTS)
+	set -e; $(TESTS:%=./%;)
+Note that the test binaries
+aren't linked with the rest of the code,
+so there is potential for simple stubbing or mocking.
+To get the best output
+from C's simple
+.Xr assert 3 ,
+it's best to assert the result
+of a helper function
+which takes the expected output
+and the test input,
+rather than calling
+.Xr assert 3
+inside the helper function.
+This way,
+the message printed by the assert failure
+contains a useful line number
+and the expected output
+rather than just variable names.
+For a real example,
+.Lk term.c
+from my IRC client project.
+.An C. McEnroe Aq Mt