Line data Source code
1 : // Copyright (c) 2012-2024 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/eventdispatcher
4 : // contact@m2osw.com
5 : //
6 : // This program is free software: you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation, either version 3 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program. If not, see <https://www.gnu.org/licenses/>.
18 :
19 : // this diagnostic has to be turned off "globally" so the catch2 does not
20 : // generate the warning on the floating point == operator
21 : //
22 :
23 : // self
24 : //
25 : #include "catch_main.h"
26 :
27 :
28 : // reporter
29 : //
30 : #include <eventdispatcher/reporter/expression.h>
31 :
32 :
33 : // last include
34 : //
35 : #include <snapdev/poison.h>
36 :
37 :
38 :
39 : namespace
40 : {
41 :
42 :
43 : constexpr SNAP_CATCH2_NAMESPACE::reporter::operator_t const g_all_operators[] =
44 : {
45 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_NULL,
46 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_NAMED,
47 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_LIST,
48 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_PRIMARY,
49 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_IDENTITY,
50 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_NEGATE,
51 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_ADD,
52 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_SUBTRACT,
53 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_MULTIPLY,
54 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_DIVIDE,
55 : SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_MODULO,
56 : };
57 :
58 :
59 : } // no name namespace
60 :
61 :
62 :
63 2 : CATCH_TEST_CASE("reporter_expression", "[expression][reporter]")
64 : {
65 2 : CATCH_START_SECTION("reporter_expression: set/get operator")
66 : {
67 12 : for(auto const op : g_all_operators)
68 : {
69 11 : SNAP_CATCH2_NAMESPACE::reporter::expression e;
70 11 : CATCH_REQUIRE(e.get_operator() == SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_NULL);
71 11 : e.set_operator(op);
72 11 : CATCH_REQUIRE(e.get_operator() == op);
73 11 : }
74 : }
75 2 : CATCH_END_SECTION()
76 :
77 2 : CATCH_START_SECTION("reporter_expression: ADD of two integers")
78 : {
79 1 : SNAP_CATCH2_NAMESPACE::reporter::expression::pointer_t e(std::make_shared<SNAP_CATCH2_NAMESPACE::reporter::expression>());
80 1 : SNAP_CATCH2_NAMESPACE::reporter::expression::pointer_t l(std::make_shared<SNAP_CATCH2_NAMESPACE::reporter::expression>());
81 1 : SNAP_CATCH2_NAMESPACE::reporter::expression::pointer_t r(std::make_shared<SNAP_CATCH2_NAMESPACE::reporter::expression>());
82 1 : CATCH_REQUIRE(e->get_expression_size() == 0);
83 1 : CATCH_REQUIRE(l->get_expression_size() == 0);
84 1 : CATCH_REQUIRE(r->get_expression_size() == 0);
85 1 : e->set_operator(SNAP_CATCH2_NAMESPACE::reporter::operator_t::OPERATOR_ADD);
86 1 : SNAP_CATCH2_NAMESPACE::reporter::token t;
87 1 : t.set_token(SNAP_CATCH2_NAMESPACE::reporter::token_t::TOKEN_INTEGER);
88 1 : t.set_integer(55);
89 1 : l->set_token(t);
90 1 : t.set_integer(105); // expressions make a copy of the token so we can reuse it
91 1 : r->set_token(t);
92 1 : e->add_expression(l);
93 1 : e->add_expression(r); // here 'e' represents "55 + 105"
94 :
95 1 : CATCH_REQUIRE(e->get_expression_size() == 2ULL);
96 1 : CATCH_REQUIRE(e->get_expression(0) == l);
97 1 : CATCH_REQUIRE(e->get_expression(1) == r);
98 1 : CATCH_REQUIRE(e->get_expression(0)->get_token().get_integer() == 55);
99 1 : CATCH_REQUIRE(e->get_expression(1)->get_token().get_integer() == 105);
100 1 : }
101 2 : CATCH_END_SECTION()
102 2 : }
103 :
104 :
105 1 : CATCH_TEST_CASE("reporter_expression_error", "[expression][reporter][error]")
106 : {
107 1 : CATCH_START_SECTION("reporter_expression_error: get expression out of bounds")
108 : {
109 1 : SNAP_CATCH2_NAMESPACE::reporter::expression e;
110 4 : CATCH_REQUIRE_THROWS_MATCHES(
111 : e.get_expression(0)
112 : , std::overflow_error
113 : , Catch::Matchers::ExceptionMessage(
114 : "index too large (0) to get sub-expression (max: 0)."));
115 1 : }
116 1 : CATCH_END_SECTION()
117 1 : }
118 :
119 :
120 : // vim: ts=4 sw=4 et
|