Compute Library
 22.02
Macros.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2017-2021 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 "Framework.h"
28 #include "Registrars.h"
29 #include "TestCase.h"
30 
31 //
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 //
47 // 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, e10, e11, e12, e13, e14, e15, size, ...) size
53 #define VARIADIC_SIZE(...) VARIADIC_SIZE_IMPL(__VA_ARGS__, 16, 15, 14, 13, 12, 11, 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_PARAM11(OP, param, ...) \
84  OP(10, param) \
85  , JOIN_PARAM10(OP, __VA_ARGS__)
86 #define JOIN_PARAM12(OP, param, ...) \
87  OP(11, param) \
88  , JOIN_PARAM11(OP, __VA_ARGS__)
89 #define JOIN_PARAM13(OP, param, ...) \
90  OP(12, param) \
91  , JOIN_PARAM12(OP, __VA_ARGS__)
92 #define JOIN_PARAM14(OP, param, ...) \
93  OP(13, param) \
94  , JOIN_PARAM13(OP, __VA_ARGS__)
95 #define JOIN_PARAM15(OP, param, ...) \
96  OP(14, param) \
97  , JOIN_PARAM14(OP, __VA_ARGS__)
98 #define JOIN_PARAM16(OP, param, ...) \
99  OP(15, param) \
100  , JOIN_PARAM15(OP, __VA_ARGS__)
101 #define JOIN_PARAM(OP, NUM, ...) \
102  CONCAT(JOIN_PARAM, NUM) \
103  (OP, __VA_ARGS__)
104 
105 #define MAKE_TYPE_PARAM(i, name) typename T##i
106 #define MAKE_ARG_PARAM(i, name) const T##i &name
107 #define MAKE_TYPE_PARAMS(...) JOIN_PARAM(MAKE_TYPE_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
108 #define MAKE_ARG_PARAMS(...) JOIN_PARAM(MAKE_ARG_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
109 
110 //
111 // TEST CASE MACROS
112 //
113 #define TEST_CASE_CONSTRUCTOR(TEST_NAME) \
114  TEST_NAME() = default;
115 #define DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
116  template <typename D> \
117  explicit TEST_NAME(D &&data) : DataTestCase{ std::forward<D>(data) } \
118  { \
119  }
120 #define FIXTURE_SETUP(FIXTURE) \
121  void do_setup() override \
122  { \
123  framework::Framework::get().set_new_fixture_call(false); \
124  FIXTURE::setup(); \
125  }
126 #define FIXTURE_DATA_SETUP(FIXTURE) \
127  void do_setup() override \
128  { \
129  framework::Framework::get().set_new_fixture_call(false); \
130  apply(this, &FIXTURE::setup<As...>, _data); \
131  }
132 #define FIXTURE_DATA_SETUP_NEW(FIXTURE) \
133  void do_setup() override \
134  { \
135  framework::Framework::get().set_new_fixture_call(true); \
136  apply(this, &FIXTURE::setup<As...>, _data); \
137  configure_target(); \
138  if(!framework::Framework::get().configure_only()) \
139  { \
140  allocate_and_run_target(); \
141  compute_reference(); \
142  } \
143  }
144 #define FIXTURE_RUN(FIXTURE) \
145  void do_run() override \
146  { \
147  FIXTURE::run(); \
148  }
149 #define FIXTURE_SYNC(FIXTURE) \
150  void do_sync() override \
151  { \
152  FIXTURE::sync(); \
153  }
154 #define FIXTURE_TEARDOWN(FIXTURE) \
155  void do_teardown() override \
156  { \
157  FIXTURE::teardown(); \
158  }
159 #define TEST_REGISTRAR(TEST_NAME, MODE, STATUS) \
160  static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
161  { \
162  #TEST_NAME, MODE, STATUS \
163  }
164 #define DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET) \
165  static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME<decltype(DATASET)::type>> TEST_NAME##_reg \
166  { \
167  #TEST_NAME, MODE, STATUS, DATASET \
168  }
169 
170 #define TEST_CASE_IMPL(TEST_NAME, MODE, STATUS) \
171  class TEST_NAME : public arm_compute::test::framework::TestCase \
172  { \
173  public: \
174  TEST_CASE_CONSTRUCTOR(TEST_NAME) \
175  void do_run() override; \
176  }; \
177  TEST_REGISTRAR(TEST_NAME, MODE, STATUS); \
178  void TEST_NAME::do_run()
179 
180 #define TEST_CASE(TEST_NAME, MODE) \
181  TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
182 #define EXPECTED_FAILURE_TEST_CASE(TEST_NAME, MODE) \
183  TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
184 #define DISABLED_TEST_CASE(TEST_NAME, MODE) \
185  TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
186 
187 #define DATA_TEST_CASE_IMPL(TEST_NAME, MODE, STATUS, DATASET, ...) \
188  template <typename T> \
189  class TEST_NAME; \
190  template <typename... As> \
191  class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type> \
192  { \
193  public: \
194  DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
195  void do_run() override \
196  { \
197  arm_compute::test::framework::apply(this, &TEST_NAME::run<As...>, _data); \
198  } \
199  template <MAKE_TYPE_PARAMS(__VA_ARGS__)> \
200  void run(MAKE_ARG_PARAMS(__VA_ARGS__)); \
201  }; \
202  DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
203  template <typename... As> \
204  template <MAKE_TYPE_PARAMS(__VA_ARGS__)> \
205  void TEST_NAME<std::tuple<As...>>::run(MAKE_ARG_PARAMS(__VA_ARGS__))
206 
207 #define DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
208  DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET, __VA_ARGS__)
209 #define EXPECTED_FAILURE_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
210  DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET, __VA_ARGS__)
211 #define DISABLED_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
212  DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET, __VA_ARGS__)
213 
214 #define FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS) \
215  class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
216  { \
217  public: \
218  TEST_CASE_CONSTRUCTOR(TEST_NAME) \
219  FIXTURE_SETUP(FIXTURE) \
220  void do_run() override; \
221  FIXTURE_TEARDOWN(FIXTURE) \
222  }; \
223  TEST_REGISTRAR(TEST_NAME, MODE, STATUS); \
224  void TEST_NAME::do_run()
225 
226 #define FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
227  FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
228 #define EXPECTED_FAILURE_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
229  FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
230 #define DISABLED_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
231  FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
232 
233 #define EMPTY_BODY_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
234  FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
235  { \
236  }
237 
238 #define FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
239  template <typename T> \
240  class TEST_NAME; \
241  template <typename... As> \
242  class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
243  { \
244  public: \
245  DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
246  FIXTURE_DATA_SETUP(FIXTURE) \
247  void do_run() override; \
248  FIXTURE_TEARDOWN(FIXTURE) \
249  }; \
250  DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
251  template <typename... As> \
252  void TEST_NAME<std::tuple<As...>>::do_run()
253 
254 #define FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
255  FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
256 #define EXPECTED_FAILURE_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
257  FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
258 #define DISABLED_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
259  FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
260 
261 #define FIXTURE_DATA_TEST_CASE_NEW_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
262  template <typename T> \
263  class TEST_NAME; \
264  template <typename... As> \
265  class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
266  { \
267  public: \
268  DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
269  FIXTURE_DATA_SETUP_NEW(FIXTURE) \
270  void do_run() override; \
271  FIXTURE_TEARDOWN(FIXTURE) \
272  }; \
273  DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
274  template <typename... As> \
275  void TEST_NAME<std::tuple<As...>>::do_run()
276 
277 #define FIXTURE_DATA_TEST_CASE_NEW(TEST_NAME, FIXTURE, MODE, DATASET) \
278  FIXTURE_DATA_TEST_CASE_NEW_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
279 #define EXPECTED_FAILURE_FIXTURE_DATA_TEST_CASE_NEW(TEST_NAME, FIXTURE, MODE, DATASET) \
280  FIXTURE_DATA_TEST_CASE_NEW_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
281 #define DISABLED_FIXTURE_DATA_TEST_CASE_NEW(TEST_NAME, FIXTURE, MODE, DATASET) \
282  FIXTURE_DATA_TEST_CASE_NEW_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
283 
284 #define REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS) \
285  class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
286  { \
287  public: \
288  TEST_CASE_CONSTRUCTOR(TEST_NAME) \
289  FIXTURE_SETUP(FIXTURE) \
290  FIXTURE_RUN(FIXTURE) \
291  FIXTURE_SYNC(FIXTURE) \
292  FIXTURE_TEARDOWN(FIXTURE) \
293  }; \
294  TEST_REGISTRAR(TEST_NAME, MODE, STATUS)
295 
296 #define REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
297  REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
298 #define EXPECTED_FAILURE_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
299  REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
300 #define DISABLED_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
301  REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
302 
303 #define REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
304  template <typename T> \
305  class TEST_NAME; \
306  template <typename... As> \
307  class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
308  { \
309  public: \
310  DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
311  FIXTURE_DATA_SETUP(FIXTURE) \
312  FIXTURE_RUN(FIXTURE) \
313  FIXTURE_SYNC(FIXTURE) \
314  FIXTURE_TEARDOWN(FIXTURE) \
315  }; \
316  DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET)
317 
318 #define REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
319  REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
320 #define EXPECTED_FAILURE_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
321  REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
322 #define DISABLED_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
323  REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
324 //
325 // TEST CASE MACROS END
326 //
327 #endif /* ARM_COMPUTE_TEST_FRAMEWORK_MACROS */