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 */