File: X20-AssertionStartingEventGoesBeforeAssertionIsEvaluated.cpp

package info (click to toggle)
sfxr-qt 1.5.1%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 10,988 kB
  • sloc: cpp: 48,737; python: 1,885; sh: 385; makefile: 4
file content (77 lines) | stat: -rw-r--r-- 2,418 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

//              Copyright Catch2 Authors
// Distributed under the Boost Software License, Version 1.0.
//   (See accompanying file LICENSE.txt or copy at
//        https://www.boost.org/LICENSE_1_0.txt)

// SPDX-License-Identifier: BSL-1.0

/**\file
 * Registers an event listener to increments counter of assertionStarting events.
 *
 * Different assertion macros then check that the counter is at expected
 * value when they are evaluated.
 */

#include <catch2/catch_test_macros.hpp>
#include <catch2/reporters/catch_reporter_event_listener.hpp>
#include <catch2/reporters/catch_reporter_registrars.hpp>
#include <catch2/matchers/catch_matchers_predicate.hpp>

namespace {

    static size_t assertion_starting_events_seen = 0;

    class AssertionStartingListener : public Catch::EventListenerBase {
    public:
        AssertionStartingListener( Catch::IConfig const* config ):
            EventListenerBase( config ) {}

        void assertionStarting( Catch::AssertionInfo const& ) override {
            ++assertion_starting_events_seen;
        }
    };

    static bool f1() {
        return assertion_starting_events_seen == 1;
    }

    static void f2() {
        if ( assertion_starting_events_seen != 2 ) { throw 1; }
    }

    static void f3() {
        if ( assertion_starting_events_seen == 3 ) { throw 1; }
    }

    static bool f4() { return assertion_starting_events_seen == 4; }

    static void f5() { throw assertion_starting_events_seen; }

} // anonymous namespace

CATCH_REGISTER_LISTENER( AssertionStartingListener )

TEST_CASE() {
    // **IMPORTANT**
    // The order of assertions below matters.
    REQUIRE( f1() );
    REQUIRE_NOTHROW( f2() );
    REQUIRE_THROWS( f3() );
    REQUIRE_THAT( f4(),
                  Catch::Matchers::Predicate<bool>( []( bool b ) { return b; } ) );
    REQUIRE_THROWS_MATCHES(
        f5(), size_t, Catch::Matchers::Predicate<size_t>( []( size_t i ) {
            return i == 5;
        } ) );

    CAPTURE( assertion_starting_events_seen ); // **not** an assertion
    INFO( "some info msg" );                   // **not** an assertion
    WARN( "warning! warning!" );               // assertion-like message
    SUCCEED();                                 // assertion-like message

    // We skip FAIL/SKIP and so on, which fail the test.

    // This require will also increment the count once
    REQUIRE( assertion_starting_events_seen == 8 );
}