Copper is an obsolete test framework I wrote at university. It is of historical and personal interest only. Use GoogleTest instead.
Code: https://john-millikin.com/code/copper (GitHub mirror)
At my university, the student mainframes ran a variety of crufty and ancient UNIX OSes
with exceptionally crufty and ancient compilers1. Consider a class full of students
learning C++ when the only2 compilers available either (1) didn’t have the STL (even
std::string!), or (2) generated binaries that crashed immediately if an exception was
Writing unit tests in CppUnit under these conditions was difficult, and it was common for students to spend more time debugging their test suites than making progress on assignments.
I decided to try writing my own test framework that could adapt to the weird environment, and as a bonus would be nicer to use than CppUnit.
main()by clever use of static variables, and used this to auto-register tests.
fork(), and communicated test results back to the parent using a simple length-prefixed packet format called netstrings. At the time I had no idea who djb was – netstrings.txt was just some useful thing that another student had found.
The original name was simply “UnitTests” – I renamed it after realizing that CppUnit abbreviated to “CU”, the chemical name for copper.
Use the standard UNIX install stanza
./configure && make && make install to
install Copper. Optionally, you may run the included self-tests with
Copper does not have any dependencies aside from a reasonably capable C++ compiler.
If present, Copper will take advantage of advanced features such as RTTI and
Copper is installed as a static library and set of header files; use
$(pkg-config --cflags --libs copper)
when compiling tests. For example, after installing Copper, you may build and run the included sample tests with:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
$ g++ -o samples tests/sample_tests.cpp tests/main.cpp $(pkg-config --cflags --libs copper) $ ./samples FAILURE in tests/sample_tests.cpp:111: sample_suite.assertion_failure: equal("the answer", "42") "the answer" != "42" ERROR in tests/sample_tests.cpp: sample_suite.NULL_pointer_dereference: Segmentation fault ERROR in tests/sample_tests.cpp: sample_suite.division_by_zero: Floating point exception 10 tests passed 1 test failed 2 errors