C++ library for tests (unit, fuzz, property), benchmarks, apps
#include <nexus/test.hh>
TEST("my test")
{
CHECK(1 + 2 == 3);
}
Fuzz tests are randomized tests, per default called until a small time budget is exhausted. If they fail, they provide information how to reproduce them.
#include <nexus/fuzz_test.hh>
FUZZ_TEST("my fuzz test")(tg::rng& rng)
{
auto i = uniform(rng, 0, 10);
CHECK(i >= 0);
}
Monte carlo tests are super-powered property tests where you define a set of operations (functions), optionally with some invariants and the framework executes random combinations of operations.
#include <nexus/monte_carlo_test.hh>
MONTE_CARLO_TEST("my mct test")
{
addOp("gen", [](tg::rng& rng) { return uniform(rng, -10, 10) * 2; }
addOp("add", [](int a, int b) { return a + b; });
addOp("sub", [](int a, int b) { return a - b; });
addInvariant("mod 2", [](int i) { CHECK(i % 2 == 0); });
}
TODO: write an in-depth guide to MCT tests.
Options can be passed after the name: TEST("name", optA, optB, ...)
.
Supported options (can be found in <nexus/config.hh>
):
before("A")
- executes this test before testA
after("A")
- executes this test after testA
exclusive
- no other test is executed concurrently (for multi-threaded test execution)should_fail
- this test passes if at least one check failsdisabled
- this test is not run by default (only if exactly called by name)
For fuzz and monte carlo tests:
seed
- customizes the seed used in this testendless
- repeats this test endlesslydebug
- thrown errors are not caught (makes it easier to debug fuzz and monte carlo tesets)verbose
- increases verbosity of test outputs and can be useful for debugging (especially endless loops in a MCT)reproduce(...)
- reproduces a specific test case (exact option is printed when a fuzz or monte carlo tests fails)
The simplest way to start nexus is:
#include <nexus/run.hh>
int main(int argc, char** argv)
{
return nx::run(argc, argv);
}
Currently, very little command line args are supported. Most importantly:
~ test-name
This only executes the given test (exact match).
For tests containing spaces, use ~ "my test"
.
Apps or disabled tests can also be executed this way.
Nexus apps are a convenient way to have small executable sub-programs in your binary (including argument parsing).
#include <nexus/app.hh>
APP("myapp")
{
// simple built-in argparse library
int n = 10;
float t = 1.0f;
auto args = nx::args("My App", "just a simple app")
.version("0.0.1-alpha")
.add("b", "some bool")
.add({"f", "flag"}, "some flag")
.group("vars")
.add(n, "n", "iterations")
.add(t, {"t", "time"}, "time parameter");
if (!args.parse()) // takes arguments from app
return;
auto b = args.has("b");
auto posargs = args.positional_args();
.. do something
}
This app can be called with ~ myapp
(and help via ~ myapp -h
).