Back in the late 1990s and early 2000s, JUnit and CppUnit were gaining popularity, but I wanted something my beginning C++ students could understand immediately.
This article explores how little code is actually required to build a useful unit-testing framework: expression stringizing, source-location reporting, exception testing, and a simple test driver in a single header file.
The implementation predates C++17, which leads to some interesting discussion about anonymous namespaces, inline variables, and how I would approach the design today.
To illustrate how C++ has evolved over that last decade or so I took a function composition example written C++17 and took it through C++20 and C++23 versions. Illustrates ranges, modules and functional programming in a small, self-contained example.