Using Approval Tests With doctest

Introduction

The doctest test framework works well with Approval Tests.

Notes pre-v.10.8.0:

Earlier versions of Approval Tests had issues with Ninja. Read more at Troubleshooting Misconfigured Build.

Doctest is similar to Catch, but claims to give faster compilation times.

Requirements

Approval Tests for doctest requires that a file called the following is found:

#include <doctest/doctest.h>

(See snippet source)

Approval Tests needs doctest version 2.3.4 or above.

Getting Started With doctest

New Project

Create a file main.cpp and add just the following two lines:

// main.cpp:
#define APPROVALS_DOCTEST // This tells Approval Tests to provide a main() - only do this in one cpp file
#include "ApprovalTests.hpp"

(See snippet source)

Existing Project - with your main()

If you have supplied your own main() for doctest, you will need to teach it how to supply test names to Approval Tests.

You should make the following additions to your own source file that contains main().

// Add these two lines to the top of your main.cpp file:
#define APPROVALS_DOCTEST_EXISTING_MAIN
#include "ApprovalTests.hpp"

(See snippet source)

Code to copy for your first doctest Approvals test

Here is sample code to create your main() function, to set up Approval Tests’ doctest integration.

We called this file doctest_starter_main.cpp:

#define APPROVALS_DOCTEST
#include "ApprovalTests.hpp"

// This puts "received" and "approved" files in approval_tests/ sub-directory,
// keeping the test source directory tidy:
auto directoryDisposer =
    ApprovalTests::Approvals::useApprovalsSubdirectory("approval_tests");

(See snippet source)

Here is sample code to create your first test. We called this file doctest_starter_test.cpp:

#include "doctest/doctest.h"
#include "ApprovalTests.hpp"

TEST_CASE("doctest_starter sample")
{
    // TODO Replace 42 with the value or object whose contents you are verifying.
    // For help, see:
    // https://approvaltestscpp.readthedocs.io/en/latest/generated_docs/ToString.html
    ApprovalTests::Approvals::verify(42);
}

(See snippet source)

And finally, here is sample code to put in your CMakeLists.txt file:

set(EXE_NAME doctest_starter)
set(CMAKE_CXX_STANDARD 11)
add_executable(${EXE_NAME}
        doctest_starter_main.cpp
        doctest_starter_test.cpp
        )
target_link_libraries(${EXE_NAME} ApprovalTests::ApprovalTests doctest::doctest)

add_test(NAME ${EXE_NAME} COMMAND ${EXE_NAME})

(See snippet source)