• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2017-2019 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, 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)
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_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 //
105 // 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     }
114 #define FIXTURE_SETUP(FIXTURE) \
115     void do_setup() override   \
116     {                          \
117         FIXTURE::setup();      \
118     }
119 #define FIXTURE_DATA_SETUP(FIXTURE)                 \
120     void do_setup() override                        \
121     {                                               \
122         apply(this, &FIXTURE::setup<As...>, _data); \
123     }
124 #define FIXTURE_RUN(FIXTURE) \
125     void do_run() override   \
126     {                        \
127         FIXTURE::run();      \
128     }
129 #define FIXTURE_SYNC(FIXTURE) \
130     void do_sync() override   \
131     {                         \
132         FIXTURE::sync();      \
133     }
134 #define FIXTURE_TEARDOWN(FIXTURE) \
135     void do_teardown() override   \
136     {                             \
137         FIXTURE::teardown();      \
138     }
139 #define TEST_REGISTRAR(TEST_NAME, MODE, STATUS)                                               \
140     static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
141     {                                                                                         \
142         #TEST_NAME, MODE, STATUS                                                              \
143     }
144 #define DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET)                                                          \
145     static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME<decltype(DATASET)::type>> TEST_NAME##_reg \
146     {                                                                                                                  \
147         #TEST_NAME, MODE, STATUS, DATASET                                                                              \
148     }
149 
150 #define TEST_CASE_IMPL(TEST_NAME, MODE, STATUS)                     \
151     class TEST_NAME : public arm_compute::test::framework::TestCase \
152     {                                                               \
153     public:                                                     \
154         TEST_CASE_CONSTRUCTOR(TEST_NAME)                            \
155         void do_run() override;                                     \
156     };                                                              \
157     TEST_REGISTRAR(TEST_NAME, MODE, STATUS);                        \
158     void TEST_NAME::do_run()
159 
160 #define TEST_CASE(TEST_NAME, MODE) \
161     TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
162 #define EXPECTED_FAILURE_TEST_CASE(TEST_NAME, MODE) \
163     TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
164 #define DISABLED_TEST_CASE(TEST_NAME, MODE) \
165     TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
166 
167 #define DATA_TEST_CASE_IMPL(TEST_NAME, MODE, STATUS, DATASET, ...)                                                  \
168     template <typename T>                                                                                           \
169     class TEST_NAME;                                                                                                \
170     template <typename... As>                                                                                       \
171     class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type> \
172     {                                                                                                               \
173     public:                                                                                                     \
174         DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET)                                                              \
175         void do_run() override                                                                                      \
176         {                                                                                                           \
177             arm_compute::test::framework::apply(this, &TEST_NAME::run<As...>, _data);                               \
178         }                                                                                                           \
179         template <MAKE_TYPE_PARAMS(__VA_ARGS__)>                                                                    \
180         void run(MAKE_ARG_PARAMS(__VA_ARGS__));                                                                     \
181     };                                                                                                              \
182     DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET);                                                          \
183     template <typename... As>                                                                                       \
184     template <MAKE_TYPE_PARAMS(__VA_ARGS__)>                                                                        \
185     void TEST_NAME<std::tuple<As...>>::run(MAKE_ARG_PARAMS(__VA_ARGS__))
186 
187 #define DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
188     DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET, __VA_ARGS__)
189 #define EXPECTED_FAILURE_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
190     DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET, __VA_ARGS__)
191 #define DISABLED_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
192     DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET, __VA_ARGS__)
193 
194 #define FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS)                    \
195     class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
196     {                                                                               \
197     public:                                                                     \
198         TEST_CASE_CONSTRUCTOR(TEST_NAME)                                            \
199         FIXTURE_SETUP(FIXTURE)                                                      \
200         void do_run() override;                                                     \
201         FIXTURE_TEARDOWN(FIXTURE)                                                   \
202     };                                                                              \
203     TEST_REGISTRAR(TEST_NAME, MODE, STATUS);                                        \
204     void TEST_NAME::do_run()
205 
206 #define FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
207     FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
208 #define EXPECTED_FAILURE_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
209     FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
210 #define DISABLED_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
211     FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
212 
213 #define FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET)                                                      \
214     template <typename T>                                                                                                           \
215     class TEST_NAME;                                                                                                                \
216     template <typename... As>                                                                                                       \
217     class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
218     {                                                                                                                               \
219     public:                                                                                                                     \
220         DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET)                                                                              \
221         FIXTURE_DATA_SETUP(FIXTURE)                                                                                                 \
222         void do_run() override;                                                                                                     \
223         FIXTURE_TEARDOWN(FIXTURE)                                                                                                   \
224     };                                                                                                                              \
225     DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET);                                                                          \
226     template <typename... As>                                                                                                       \
227     void TEST_NAME<std::tuple<As...>>::do_run()
228 
229 #define FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
230     FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
231 #define EXPECTED_FAILURE_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
232     FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
233 #define DISABLED_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
234     FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
235 
236 #define REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS)           \
237     class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
238     {                                                                               \
239     public:                                                                     \
240         TEST_CASE_CONSTRUCTOR(TEST_NAME)                                            \
241         FIXTURE_SETUP(FIXTURE)                                                      \
242         FIXTURE_RUN(FIXTURE)                                                        \
243         FIXTURE_SYNC(FIXTURE)                                                       \
244         FIXTURE_TEARDOWN(FIXTURE)                                                   \
245     };                                                                              \
246     TEST_REGISTRAR(TEST_NAME, MODE, STATUS)
247 
248 #define REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
249     REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
250 #define EXPECTED_FAILURE_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
251     REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
252 #define DISABLED_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
253     REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
254 
255 #define REGISTER_FIXTURE_DATA_TEST_CASE_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(FIXTURE)                                                                                                 \
264         FIXTURE_RUN(FIXTURE)                                                                                                        \
265         FIXTURE_SYNC(FIXTURE)                                                                                                       \
266         FIXTURE_TEARDOWN(FIXTURE)                                                                                                   \
267     };                                                                                                                              \
268     DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET)
269 
270 #define REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
271     REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
272 #define EXPECTED_FAILURE_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
273     REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
274 #define DISABLED_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
275     REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
276 //
277 // TEST CASE MACROS END
278 //
279 #endif /* ARM_COMPUTE_TEST_FRAMEWORK_MACROS */