blob: deca1ef51ad5376061d8d85fac7736d308287991 [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
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
52#define VARIADIC_SIZE_IMPL(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, size, ...) size
53#define VARIADIC_SIZE(...) VARIADIC_SIZE_IMPL(__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
54
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__)
83#define JOIN_PARAM(OP, NUM, ...) \
84 CONCAT(JOIN_PARAM, NUM) \
85 (OP, __VA_ARGS__)
86
87#define MAKE_TYPE_PARAM(i, name) typename T##i
88#define MAKE_ARG_PARAM(i, name) const T##i &name
89#define MAKE_TYPE_PARAMS(...) JOIN_PARAM(MAKE_TYPE_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
90#define MAKE_ARG_PARAMS(...) JOIN_PARAM(MAKE_ARG_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
91
92//
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +010093// TEST CASE MACROS
94//
95#define TEST_CASE_CONSTRUCTOR(TEST_NAME) \
96 TEST_NAME() = default;
97#define DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
98 template <typename D> \
99 explicit TEST_NAME(D &&data) : DataTestCase{ std::forward<D>(data) } \
100 { \
101 }
102#define FIXTURE_SETUP(FIXTURE) \
103 void do_setup() override \
104 { \
105 FIXTURE::setup(); \
106 }
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100107#define FIXTURE_DATA_SETUP(FIXTURE) \
108 void do_setup() override \
109 { \
110 apply(this, &FIXTURE::setup<As...>, _data); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100111 }
112#define FIXTURE_RUN(FIXTURE) \
113 void do_run() override \
114 { \
115 FIXTURE::run(); \
116 }
Joel Liang1c5ffd62017-12-28 10:09:51 +0800117#define FIXTURE_SYNC(FIXTURE) \
118 void do_sync() override \
119 { \
120 FIXTURE::sync(); \
121 }
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100122#define FIXTURE_TEARDOWN(FIXTURE) \
123 void do_teardown() override \
124 { \
125 FIXTURE::teardown(); \
126 }
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100127#define TEST_REGISTRAR(TEST_NAME, MODE, STATUS) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100128 static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
129 { \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100130 #TEST_NAME, MODE, STATUS \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100131 }
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100132#define DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100133 static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME<decltype(DATASET)::type>> TEST_NAME##_reg \
134 { \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100135 #TEST_NAME, MODE, STATUS, DATASET \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100136 }
137
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100138#define TEST_CASE_IMPL(TEST_NAME, MODE, STATUS) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100139 class TEST_NAME : public arm_compute::test::framework::TestCase \
140 { \
141 public: \
142 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
143 void do_run() override; \
144 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100145 TEST_REGISTRAR(TEST_NAME, MODE, STATUS); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100146 void TEST_NAME::do_run()
147
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100148#define TEST_CASE(TEST_NAME, MODE) \
149 TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
150#define EXPECTED_FAILURE_TEST_CASE(TEST_NAME, MODE) \
151 TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
152#define DISABLED_TEST_CASE(TEST_NAME, MODE) \
153 TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
154
155#define DATA_TEST_CASE_IMPL(TEST_NAME, MODE, STATUS, DATASET, ...) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100156 template <typename T> \
157 class TEST_NAME; \
158 template <typename... As> \
159 class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type> \
160 { \
161 public: \
162 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
163 void do_run() override \
164 { \
165 arm_compute::test::framework::apply(this, &TEST_NAME::run<As...>, _data); \
166 } \
167 template <MAKE_TYPE_PARAMS(__VA_ARGS__)> \
168 void run(MAKE_ARG_PARAMS(__VA_ARGS__)); \
169 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100170 DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100171 template <typename... As> \
172 template <MAKE_TYPE_PARAMS(__VA_ARGS__)> \
173 void TEST_NAME<std::tuple<As...>>::run(MAKE_ARG_PARAMS(__VA_ARGS__))
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100174
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100175#define DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
176 DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET, __VA_ARGS__)
177#define EXPECTED_FAILURE_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
178 DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET, __VA_ARGS__)
179#define DISABLED_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
180 DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET, __VA_ARGS__)
181
182#define FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100183 class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
184 { \
185 public: \
186 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
187 FIXTURE_SETUP(FIXTURE) \
188 void do_run() override; \
189 FIXTURE_TEARDOWN(FIXTURE) \
190 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100191 TEST_REGISTRAR(TEST_NAME, MODE, STATUS); \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100192 void TEST_NAME::do_run()
193
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100194#define FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
195 FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
196#define EXPECTED_FAILURE_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
197 FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
198#define DISABLED_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
199 FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
200
201#define FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100202 template <typename T> \
203 class TEST_NAME; \
204 template <typename... As> \
205 class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
206 { \
207 public: \
208 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
209 FIXTURE_DATA_SETUP(FIXTURE) \
210 void do_run() override; \
211 FIXTURE_TEARDOWN(FIXTURE) \
212 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100213 DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100214 template <typename... As> \
215 void TEST_NAME<std::tuple<As...>>::do_run()
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100216
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100217#define FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
218 FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
219#define EXPECTED_FAILURE_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
220 FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
221#define DISABLED_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
222 FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
223
224#define REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100225 class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
226 { \
227 public: \
228 TEST_CASE_CONSTRUCTOR(TEST_NAME) \
229 FIXTURE_SETUP(FIXTURE) \
230 FIXTURE_RUN(FIXTURE) \
Joel Liang1c5ffd62017-12-28 10:09:51 +0800231 FIXTURE_SYNC(FIXTURE) \
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100232 FIXTURE_TEARDOWN(FIXTURE) \
233 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100234 TEST_REGISTRAR(TEST_NAME, MODE, STATUS)
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100235
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100236#define REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
237 REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
238#define EXPECTED_FAILURE_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
239 REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
240#define DISABLED_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
241 REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
242
243#define REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100244 template <typename T> \
245 class TEST_NAME; \
246 template <typename... As> \
247 class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
248 { \
249 public: \
250 DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
251 FIXTURE_DATA_SETUP(FIXTURE) \
252 FIXTURE_RUN(FIXTURE) \
Joel Liang1c5ffd62017-12-28 10:09:51 +0800253 FIXTURE_SYNC(FIXTURE) \
Moritz Pflanzerb6c8d242017-07-18 13:42:54 +0100254 FIXTURE_TEARDOWN(FIXTURE) \
255 }; \
Moritz Pflanzerbf234e02017-07-24 15:04:14 +0100256 DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET)
257
258#define REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
259 REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
260#define EXPECTED_FAILURE_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
261 REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
262#define DISABLED_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
263 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 +0100264//
265// TEST CASE MACROS END
266//
Moritz Pflanzerfc95ed22017-07-05 11:07:07 +0100267#endif /* ARM_COMPUTE_TEST_FRAMEWORK_MACROS */