blob: 38eb29c6a10b53d55b7f5dd5be477d47c45be9ce [file] [log] [blame]
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +01001/*
2 * Copyright (c) 2017 ARM Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#ifndef ARM_COMPUTE_TEST_FRAMEWORK_MACROS
25#define ARM_COMPUTE_TEST_FRAMEWORK_MACROS
26
27#include "Exceptions.h"
28#include "Framework.h"
29#include "Registrars.h"
30#include "TestCase.h"
31
32#include <sstream>
33
34//
35// TEST SUITE MACROS
36//
37#define TEST_SUITE(SUITE_NAME) \
38 namespace SUITE_NAME##Suite \
39 { \
40 static arm_compute::test::framework::detail::TestSuiteRegistrar SUITE_NAME##Suite_reg{ #SUITE_NAME };
41
42#define TEST_SUITE_END() \
43 static arm_compute::test::framework::detail::TestSuiteRegistrar Suite_end; \
44 }
45//
46// TEST SUITE MACROS END
47//
48
49//
50// TEST CASE MACROS
51//
52#define TEST_CASE_CONSTRUCTOR(TEST_NAME) \
53 TEST_NAME() = default;
54#define DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
55 template <typename D> \
56 explicit TEST_NAME(D &&data) : DataTestCase{ std::forward<D>(data) } \
57 { \
58 }
59#define FIXTURE_SETUP(FIXTURE) \
60 void do_setup() override \
61 { \
62 FIXTURE::setup(); \
63 }
64#define FIXTURE_DATA_SETUP(FIXTURE) \
65 void do_setup() override \
66 { \
67 apply(this, &FIXTURE::setup, _data); \
68 }
69#define FIXTURE_RUN(FIXTURE) \
70 void do_run() override \
71 { \
72 FIXTURE::run(); \
73 }
74#define FIXTURE_TEARDOWN(FIXTURE) \
75 void do_teardown() override \
76 { \
77 FIXTURE::teardown(); \
78 }
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +010079#define TEST_REGISTRAR(TEST_NAME, MODE) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010080 static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
81 { \
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +010082 #TEST_NAME, MODE \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010083 }
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +010084#define DATA_TEST_REGISTRAR(TEST_NAME, MODE, DATASET) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010085 static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
86 { \
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +010087 #TEST_NAME, MODE, DATASET \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010088 }
89
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +010090#define TEST_CASE(TEST_NAME, MODE) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010091 class TEST_NAME : public arm_compute::test::framework::TestCase \
92 { \
93 public: \
94 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
95 void do_run() override; \
96 }; \
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +010097 TEST_REGISTRAR(TEST_NAME, MODE); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010098 void TEST_NAME::do_run()
99
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100100#define DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100101 class TEST_NAME : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type> \
102 { \
103 public: \
104 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
105 void do_run() override \
106 { \
107 arm_compute::test::framework::apply(this, &TEST_NAME::run, _data); \
108 } \
109 void run(__VA_ARGS__); \
110 }; \
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100111 DATA_TEST_REGISTRAR(TEST_NAME, MODE, DATASET); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100112 void TEST_NAME::run(__VA_ARGS__)
113
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100114#define FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100115 class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
116 { \
117 public: \
118 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
119 FIXTURE_SETUP(FIXTURE) \
120 void do_run() override; \
121 FIXTURE_TEARDOWN(FIXTURE) \
122 }; \
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100123 TEST_REGISTRAR(TEST_NAME, MODE); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100124 void TEST_NAME::do_run()
125
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100126#define FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100127 class TEST_NAME : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
128 { \
129 public: \
130 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
131 FIXTURE_DATA_SETUP(FIXTURE) \
132 void do_run() override; \
133 FIXTURE_TEARDOWN(FIXTURE) \
134 }; \
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100135 DATA_TEST_REGISTRAR(TEST_NAME, MODE, DATASET); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100136 void TEST_NAME::do_run()
137
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100138#define REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100139 class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
140 { \
141 public: \
142 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
143 FIXTURE_SETUP(FIXTURE) \
144 FIXTURE_RUN(FIXTURE) \
145 FIXTURE_TEARDOWN(FIXTURE) \
146 }; \
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100147 TEST_REGISTRAR(TEST_NAME, MODE)
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100148
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100149#define REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100150 class TEST_NAME : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
151 { \
152 public: \
153 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
154 FIXTURE_DATA_SETUP(FIXTURE) \
155 FIXTURE_RUN(FIXTURE) \
156 FIXTURE_TEARDOWN(FIXTURE) \
157 }; \
Moritz Pflanzerd03b00a2017-07-17 13:50:12 +0100158 DATA_TEST_REGISTRAR(TEST_NAME, MODE, DATASET)
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100159//
160// TEST CASE MACROS END
161//
162
163#define ARM_COMPUTE_ASSERT_EQUAL(x, y) \
164 do \
165 { \
166 const auto &_x = (x); \
167 const auto &_y = (y); \
168 if(_x != _y) \
169 { \
170 std::stringstream msg; \
171 msg << "Assertion " << _x << " != " << _y << " failed."; \
172 throw arm_compute::test::framework::TestError(msg.str()); \
173 } \
174 } while(false)
175
176#define ARM_COMPUTE_EXPECT_EQUAL(x, y) \
177 do \
178 { \
179 const auto &_x = (x); \
180 const auto &_y = (y); \
181 if(_x != _y) \
182 { \
183 std::stringstream msg; \
184 msg << "Expectation " << _x << " != " << _y << " failed."; \
185 arm_compute::test::framework::Framework::get().log_failed_expectation(msg.str()); \
186 } \
187 } while(false)
188#endif /* ARM_COMPUTE_TEST_FRAMEWORK_MACROS */