Rexo

Rexo is a neat single-file cross-platform unit testing framework for C/C++.

It offers the same xUnit-like structure than most other unit testing frameworks but aims at providing a truly polished API.

Features

  • sleek: polished API with great attention to details.
  • easy: no learning curve, it's yet another framework based on xUnit with test suites, test cases, and fixtures.
  • convenient: automatic registration of tests.
  • granular: high level or low level API? You choose.
  • portable: compatible with C89 (ANSI C) and C++.
  • cross-platform: tested on Linux, macOS, and Windows.
  • simple: straightforward implementation—KISS all the things!
  • cascading configuration: configure a whole test suite at once and/or tweak specific options for each test case.
  • painless: deployment couldn't be easier—it all fits into a single header file and has no external dependencies.

But also...

  • fully standard compliant minus the optional automatic registration of tests that relies on a widespread compiler-specific feature.
  • designated initializer-like syntax to all C and C++ versions.

Roadmap

  • implement a command-line option parser (e.g.: for filtering test cases).
  • allow choosing the output format of the summary (e.g.: jUnit XML).
  • support more assertion macros (e.g.: array comparison, signal handling).
  • improve failure messages to be more visual (e.g.: an arrow pointing where strings differ).

Usage

Minimal

#include <rexo.h>

RX_TEST_CASE(foo, bar)
{
    RX_INT_REQUIRE_EQUAL(2 * 3 * 7, 42);
}

int
main(int argc, const char **argv)
{
    return rx_main(0, NULL, argc, argv) == RX_SUCCESS ? 0 : 1;
}

Fixture

#include <rexo.h>

struct foo_data {
    const char *value;
};

RX_SET_UP(foo_set_up)
{
    struct foo_data *data;

    data = (struct foo_data *)RX_DATA;
    data->value = "world!";
    return RX_SUCCESS;
}

RX_FIXTURE(foo_fixture, struct foo_data, .set_up = foo_set_up);

RX_TEST_CASE(foo, bar, .fixture = foo_fixture)
{
    struct foo_data *data;

    data = (struct foo_data *)RX_DATA;
    RX_STR_REQUIRE_EQUAL("Hello", data->value);
}

int
main(int argc, const char **argv)
{
    return rx_main(0, NULL, argc, argv) == RX_SUCCESS ? 0 : 1;
}

Documentation

https://christophercrouzet.github.io/rexo

Repository

https://github.com/christophercrouzet/rexo

License

Unlicense.