blob: a6ba137b59a760ad990f0764cd3db041ce8e29f5 [file] [log] [blame]
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +01001/*
Giorgio Arena68e29da2021-02-08 16:31:10 +00002 * Copyright (c) 2017-2021 Arm Limited.
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +01003 *
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
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010027#include "Framework.h"
28#include "Registrars.h"
29#include "TestCase.h"
30
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010031//
32// TEST SUITE MACROS
33//
34#define TEST_SUITE(SUITE_NAME) \
35 namespace SUITE_NAME##Suite \
36 { \
37 static arm_compute::test::framework::detail::TestSuiteRegistrar SUITE_NAME##Suite_reg{ #SUITE_NAME };
38
39#define TEST_SUITE_END() \
40 static arm_compute::test::framework::detail::TestSuiteRegistrar Suite_end; \
41 }
42//
43// TEST SUITE MACROS END
44//
45
46//
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +010047// HELPER MACROS
48//
49
50#define CONCAT(ARG0, ARG1) ARG0##ARG1
51
Giorgio Arenaae99b6e2019-08-01 14:22:12 +010052#define VARIADIC_SIZE_IMPL(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, size, ...) size
53#define VARIADIC_SIZE(...) VARIADIC_SIZE_IMPL(__VA_ARGS__, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +010054
55#define JOIN_PARAM1(OP, param) OP(0, param)
56#define JOIN_PARAM2(OP, param, ...) \
57 OP(1, param) \
58 , JOIN_PARAM1(OP, __VA_ARGS__)
59#define JOIN_PARAM3(OP, param, ...) \
60 OP(2, param) \
61 , JOIN_PARAM2(OP, __VA_ARGS__)
62#define JOIN_PARAM4(OP, param, ...) \
63 OP(3, param) \
64 , JOIN_PARAM3(OP, __VA_ARGS__)
65#define JOIN_PARAM5(OP, param, ...) \
66 OP(4, param) \
67 , JOIN_PARAM4(OP, __VA_ARGS__)
68#define JOIN_PARAM6(OP, param, ...) \
69 OP(5, param) \
70 , JOIN_PARAM5(OP, __VA_ARGS__)
71#define JOIN_PARAM7(OP, param, ...) \
72 OP(6, param) \
73 , JOIN_PARAM6(OP, __VA_ARGS__)
74#define JOIN_PARAM8(OP, param, ...) \
75 OP(7, param) \
76 , JOIN_PARAM7(OP, __VA_ARGS__)
77#define JOIN_PARAM9(OP, param, ...) \
78 OP(8, param) \
79 , JOIN_PARAM8(OP, __VA_ARGS__)
80#define JOIN_PARAM10(OP, param, ...) \
81 OP(9, param) \
82 , JOIN_PARAM9(OP, __VA_ARGS__)
Gian Marco Iodicebf9731e2018-12-12 10:18:04 +000083#define JOIN_PARAM11(OP, param, ...) \
84 OP(10, param) \
85 , JOIN_PARAM10(OP, __VA_ARGS__)
Gian Marco Iodicee16c8902019-06-14 16:11:10 +010086#define JOIN_PARAM12(OP, param, ...) \
87 OP(11, param) \
88 , JOIN_PARAM11(OP, __VA_ARGS__)
Gian Marco Iodiceca1f4602019-07-16 15:46:48 +010089#define JOIN_PARAM13(OP, param, ...) \
90 OP(12, param) \
91 , JOIN_PARAM12(OP, __VA_ARGS__)
Giorgio Arenaae99b6e2019-08-01 14:22:12 +010092#define JOIN_PARAM14(OP, param, ...) \
93 OP(13, param) \
94 , JOIN_PARAM13(OP, __VA_ARGS__)
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +010095#define JOIN_PARAM(OP, NUM, ...) \
96 CONCAT(JOIN_PARAM, NUM) \
97 (OP, __VA_ARGS__)
98
99#define MAKE_TYPE_PARAM(i, name) typename T##i
100#define MAKE_ARG_PARAM(i, name) const T##i &name
101#define MAKE_TYPE_PARAMS(...) JOIN_PARAM(MAKE_TYPE_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
102#define MAKE_ARG_PARAMS(...) JOIN_PARAM(MAKE_ARG_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
103
104//
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100105// TEST CASE MACROS
106//
107#define TEST_CASE_CONSTRUCTOR(TEST_NAME) \
108 TEST_NAME() = default;
109#define DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
110 template <typename D> \
111 explicit TEST_NAME(D &&data) : DataTestCase{ std::forward<D>(data) } \
112 { \
113 }
Giorgio Arena68e29da2021-02-08 16:31:10 +0000114#define FIXTURE_SETUP(FIXTURE) \
115 void do_setup() override \
116 { \
117 framework::Framework::get().set_new_fixture_call(false); \
118 FIXTURE::setup(); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100119 }
Giorgio Arena68e29da2021-02-08 16:31:10 +0000120#define FIXTURE_DATA_SETUP(FIXTURE) \
121 void do_setup() override \
122 { \
123 framework::Framework::get().set_new_fixture_call(false); \
124 apply(this, &FIXTURE::setup<As...>, _data); \
125 }
126#define FIXTURE_DATA_SETUP_NEW(FIXTURE) \
127 void do_setup() override \
128 { \
129 framework::Framework::get().set_new_fixture_call(true); \
130 apply(this, &FIXTURE::setup<As...>, _data); \
131 configure_target(); \
132 if(!framework::Framework::get().configure_only()) \
133 { \
134 allocate_and_run_target(); \
135 compute_reference(); \
136 } \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100137 }
138#define FIXTURE_RUN(FIXTURE) \
139 void do_run() override \
140 { \
141 FIXTURE::run(); \
142 }
Joel Liang1c5ffd62017-12-28 10:09:51 +0800143#define FIXTURE_SYNC(FIXTURE) \
144 void do_sync() override \
145 { \
146 FIXTURE::sync(); \
147 }
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100148#define FIXTURE_TEARDOWN(FIXTURE) \
149 void do_teardown() override \
150 { \
151 FIXTURE::teardown(); \
152 }
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100153#define TEST_REGISTRAR(TEST_NAME, MODE, STATUS) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100154 static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
155 { \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100156 #TEST_NAME, MODE, STATUS \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100157 }
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100158#define DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100159 static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME<decltype(DATASET)::type>> TEST_NAME##_reg \
160 { \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100161 #TEST_NAME, MODE, STATUS, DATASET \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100162 }
163
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100164#define TEST_CASE_IMPL(TEST_NAME, MODE, STATUS) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100165 class TEST_NAME : public arm_compute::test::framework::TestCase \
166 { \
167 public: \
168 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
169 void do_run() override; \
170 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100171 TEST_REGISTRAR(TEST_NAME, MODE, STATUS); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100172 void TEST_NAME::do_run()
173
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100174#define TEST_CASE(TEST_NAME, MODE) \
175 TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
176#define EXPECTED_FAILURE_TEST_CASE(TEST_NAME, MODE) \
177 TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
178#define DISABLED_TEST_CASE(TEST_NAME, MODE) \
179 TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
180
181#define DATA_TEST_CASE_IMPL(TEST_NAME, MODE, STATUS, DATASET, ...) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100182 template <typename T> \
183 class TEST_NAME; \
184 template <typename... As> \
185 class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type> \
186 { \
187 public: \
188 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
189 void do_run() override \
190 { \
191 arm_compute::test::framework::apply(this, &TEST_NAME::run<As...>, _data); \
192 } \
193 template <MAKE_TYPE_PARAMS(__VA_ARGS__)> \
194 void run(MAKE_ARG_PARAMS(__VA_ARGS__)); \
195 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100196 DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100197 template <typename... As> \
198 template <MAKE_TYPE_PARAMS(__VA_ARGS__)> \
199 void TEST_NAME<std::tuple<As...>>::run(MAKE_ARG_PARAMS(__VA_ARGS__))
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100200
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100201#define DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
202 DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET, __VA_ARGS__)
203#define EXPECTED_FAILURE_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
204 DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET, __VA_ARGS__)
205#define DISABLED_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
206 DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET, __VA_ARGS__)
207
208#define FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100209 class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
210 { \
211 public: \
212 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
213 FIXTURE_SETUP(FIXTURE) \
214 void do_run() override; \
215 FIXTURE_TEARDOWN(FIXTURE) \
216 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100217 TEST_REGISTRAR(TEST_NAME, MODE, STATUS); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100218 void TEST_NAME::do_run()
219
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100220#define FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
221 FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
222#define EXPECTED_FAILURE_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
223 FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
224#define DISABLED_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
225 FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
226
Georgios Pinitasc3c352e2021-03-18 10:59:40 +0000227#define EMPTY_BODY_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
228 FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
229 { \
230 }
231
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100232#define FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100233 template <typename T> \
234 class TEST_NAME; \
235 template <typename... As> \
236 class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
237 { \
238 public: \
239 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
240 FIXTURE_DATA_SETUP(FIXTURE) \
241 void do_run() override; \
242 FIXTURE_TEARDOWN(FIXTURE) \
243 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100244 DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100245 template <typename... As> \
246 void TEST_NAME<std::tuple<As...>>::do_run()
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100247
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100248#define FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
249 FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
250#define EXPECTED_FAILURE_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
251 FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
252#define DISABLED_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
253 FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
254
Giorgio Arena68e29da2021-02-08 16:31:10 +0000255#define FIXTURE_DATA_TEST_CASE_NEW_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
256 template <typename T> \
257 class TEST_NAME; \
258 template <typename... As> \
259 class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
260 { \
261 public: \
262 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
263 FIXTURE_DATA_SETUP_NEW(FIXTURE) \
264 void do_run() override; \
265 FIXTURE_TEARDOWN(FIXTURE) \
266 }; \
267 DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
268 template <typename... As> \
269 void TEST_NAME<std::tuple<As...>>::do_run()
270
271#define FIXTURE_DATA_TEST_CASE_NEW(TEST_NAME, FIXTURE, MODE, DATASET) \
272 FIXTURE_DATA_TEST_CASE_NEW_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
273#define EXPECTED_FAILURE_FIXTURE_DATA_TEST_CASE_NEW(TEST_NAME, FIXTURE, MODE, DATASET) \
274 FIXTURE_DATA_TEST_CASE_NEW_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
275#define DISABLED_FIXTURE_DATA_TEST_CASE_NEW(TEST_NAME, FIXTURE, MODE, DATASET) \
276 FIXTURE_DATA_TEST_CASE_NEW_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
277
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100278#define REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100279 class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
280 { \
281 public: \
282 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
283 FIXTURE_SETUP(FIXTURE) \
284 FIXTURE_RUN(FIXTURE) \
Joel Liang1c5ffd62017-12-28 10:09:51 +0800285 FIXTURE_SYNC(FIXTURE) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100286 FIXTURE_TEARDOWN(FIXTURE) \
287 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100288 TEST_REGISTRAR(TEST_NAME, MODE, STATUS)
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100289
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100290#define REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
291 REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
292#define EXPECTED_FAILURE_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
293 REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
294#define DISABLED_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
295 REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
296
297#define REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100298 template <typename T> \
299 class TEST_NAME; \
300 template <typename... As> \
301 class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
302 { \
303 public: \
304 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
305 FIXTURE_DATA_SETUP(FIXTURE) \
306 FIXTURE_RUN(FIXTURE) \
Joel Liang1c5ffd62017-12-28 10:09:51 +0800307 FIXTURE_SYNC(FIXTURE) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100308 FIXTURE_TEARDOWN(FIXTURE) \
309 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100310 DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET)
311
312#define REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
313 REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
314#define EXPECTED_FAILURE_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
315 REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
316#define DISABLED_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
317 REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100318//
319// TEST CASE MACROS END
320//
Gian Marco Iodicebf9731e2018-12-12 10:18:04 +0000321#endif /* ARM_COMPUTE_TEST_FRAMEWORK_MACROS */