279 lines
17 KiB
C++
279 lines
17 KiB
C++
/*
|
|
* Copyright (c) 2017-2019 Arm Limited.
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to
|
|
* deal in the Software without restriction, including without limitation the
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
* sell copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*/
|
|
#ifndef ARM_COMPUTE_TEST_FRAMEWORK_MACROS
|
|
#define ARM_COMPUTE_TEST_FRAMEWORK_MACROS
|
|
|
|
#include "Framework.h"
|
|
#include "Registrars.h"
|
|
#include "TestCase.h"
|
|
|
|
//
|
|
// TEST SUITE MACROS
|
|
//
|
|
#define TEST_SUITE(SUITE_NAME) \
|
|
namespace SUITE_NAME##Suite \
|
|
{ \
|
|
static arm_compute::test::framework::detail::TestSuiteRegistrar SUITE_NAME##Suite_reg{ #SUITE_NAME };
|
|
|
|
#define TEST_SUITE_END() \
|
|
static arm_compute::test::framework::detail::TestSuiteRegistrar Suite_end; \
|
|
}
|
|
//
|
|
// TEST SUITE MACROS END
|
|
//
|
|
|
|
//
|
|
// HELPER MACROS
|
|
//
|
|
|
|
#define CONCAT(ARG0, ARG1) ARG0##ARG1
|
|
|
|
#define VARIADIC_SIZE_IMPL(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, size, ...) size
|
|
#define VARIADIC_SIZE(...) VARIADIC_SIZE_IMPL(__VA_ARGS__, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
|
|
|
|
#define JOIN_PARAM1(OP, param) OP(0, param)
|
|
#define JOIN_PARAM2(OP, param, ...) \
|
|
OP(1, param) \
|
|
, JOIN_PARAM1(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM3(OP, param, ...) \
|
|
OP(2, param) \
|
|
, JOIN_PARAM2(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM4(OP, param, ...) \
|
|
OP(3, param) \
|
|
, JOIN_PARAM3(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM5(OP, param, ...) \
|
|
OP(4, param) \
|
|
, JOIN_PARAM4(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM6(OP, param, ...) \
|
|
OP(5, param) \
|
|
, JOIN_PARAM5(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM7(OP, param, ...) \
|
|
OP(6, param) \
|
|
, JOIN_PARAM6(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM8(OP, param, ...) \
|
|
OP(7, param) \
|
|
, JOIN_PARAM7(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM9(OP, param, ...) \
|
|
OP(8, param) \
|
|
, JOIN_PARAM8(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM10(OP, param, ...) \
|
|
OP(9, param) \
|
|
, JOIN_PARAM9(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM11(OP, param, ...) \
|
|
OP(10, param) \
|
|
, JOIN_PARAM10(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM12(OP, param, ...) \
|
|
OP(11, param) \
|
|
, JOIN_PARAM11(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM13(OP, param, ...) \
|
|
OP(12, param) \
|
|
, JOIN_PARAM12(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM14(OP, param, ...) \
|
|
OP(13, param) \
|
|
, JOIN_PARAM13(OP, __VA_ARGS__)
|
|
#define JOIN_PARAM(OP, NUM, ...) \
|
|
CONCAT(JOIN_PARAM, NUM) \
|
|
(OP, __VA_ARGS__)
|
|
|
|
#define MAKE_TYPE_PARAM(i, name) typename T##i
|
|
#define MAKE_ARG_PARAM(i, name) const T##i &name
|
|
#define MAKE_TYPE_PARAMS(...) JOIN_PARAM(MAKE_TYPE_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
|
|
#define MAKE_ARG_PARAMS(...) JOIN_PARAM(MAKE_ARG_PARAM, VARIADIC_SIZE(__VA_ARGS__), __VA_ARGS__)
|
|
|
|
//
|
|
// TEST CASE MACROS
|
|
//
|
|
#define TEST_CASE_CONSTRUCTOR(TEST_NAME) \
|
|
TEST_NAME() = default;
|
|
#define DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
|
|
template <typename D> \
|
|
explicit TEST_NAME(D &&data) : DataTestCase{ std::forward<D>(data) } \
|
|
{ \
|
|
}
|
|
#define FIXTURE_SETUP(FIXTURE) \
|
|
void do_setup() override \
|
|
{ \
|
|
FIXTURE::setup(); \
|
|
}
|
|
#define FIXTURE_DATA_SETUP(FIXTURE) \
|
|
void do_setup() override \
|
|
{ \
|
|
apply(this, &FIXTURE::setup<As...>, _data); \
|
|
}
|
|
#define FIXTURE_RUN(FIXTURE) \
|
|
void do_run() override \
|
|
{ \
|
|
FIXTURE::run(); \
|
|
}
|
|
#define FIXTURE_SYNC(FIXTURE) \
|
|
void do_sync() override \
|
|
{ \
|
|
FIXTURE::sync(); \
|
|
}
|
|
#define FIXTURE_TEARDOWN(FIXTURE) \
|
|
void do_teardown() override \
|
|
{ \
|
|
FIXTURE::teardown(); \
|
|
}
|
|
#define TEST_REGISTRAR(TEST_NAME, MODE, STATUS) \
|
|
static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
|
|
{ \
|
|
#TEST_NAME, MODE, STATUS \
|
|
}
|
|
#define DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET) \
|
|
static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME<decltype(DATASET)::type>> TEST_NAME##_reg \
|
|
{ \
|
|
#TEST_NAME, MODE, STATUS, DATASET \
|
|
}
|
|
|
|
#define TEST_CASE_IMPL(TEST_NAME, MODE, STATUS) \
|
|
class TEST_NAME : public arm_compute::test::framework::TestCase \
|
|
{ \
|
|
public: \
|
|
TEST_CASE_CONSTRUCTOR(TEST_NAME) \
|
|
void do_run() override; \
|
|
}; \
|
|
TEST_REGISTRAR(TEST_NAME, MODE, STATUS); \
|
|
void TEST_NAME::do_run()
|
|
|
|
#define TEST_CASE(TEST_NAME, MODE) \
|
|
TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
|
|
#define EXPECTED_FAILURE_TEST_CASE(TEST_NAME, MODE) \
|
|
TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
|
|
#define DISABLED_TEST_CASE(TEST_NAME, MODE) \
|
|
TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
|
|
|
|
#define DATA_TEST_CASE_IMPL(TEST_NAME, MODE, STATUS, DATASET, ...) \
|
|
template <typename T> \
|
|
class TEST_NAME; \
|
|
template <typename... As> \
|
|
class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type> \
|
|
{ \
|
|
public: \
|
|
DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
|
|
void do_run() override \
|
|
{ \
|
|
arm_compute::test::framework::apply(this, &TEST_NAME::run<As...>, _data); \
|
|
} \
|
|
template <MAKE_TYPE_PARAMS(__VA_ARGS__)> \
|
|
void run(MAKE_ARG_PARAMS(__VA_ARGS__)); \
|
|
}; \
|
|
DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
|
|
template <typename... As> \
|
|
template <MAKE_TYPE_PARAMS(__VA_ARGS__)> \
|
|
void TEST_NAME<std::tuple<As...>>::run(MAKE_ARG_PARAMS(__VA_ARGS__))
|
|
|
|
#define DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
|
|
DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET, __VA_ARGS__)
|
|
#define EXPECTED_FAILURE_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
|
|
DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET, __VA_ARGS__)
|
|
#define DISABLED_DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
|
|
DATA_TEST_CASE_IMPL(TEST_NAME, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET, __VA_ARGS__)
|
|
|
|
#define FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS) \
|
|
class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
|
|
{ \
|
|
public: \
|
|
TEST_CASE_CONSTRUCTOR(TEST_NAME) \
|
|
FIXTURE_SETUP(FIXTURE) \
|
|
void do_run() override; \
|
|
FIXTURE_TEARDOWN(FIXTURE) \
|
|
}; \
|
|
TEST_REGISTRAR(TEST_NAME, MODE, STATUS); \
|
|
void TEST_NAME::do_run()
|
|
|
|
#define FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
|
|
FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
|
|
#define EXPECTED_FAILURE_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
|
|
FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
|
|
#define DISABLED_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
|
|
FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
|
|
|
|
#define FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
|
|
template <typename T> \
|
|
class TEST_NAME; \
|
|
template <typename... As> \
|
|
class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
|
|
{ \
|
|
public: \
|
|
DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
|
|
FIXTURE_DATA_SETUP(FIXTURE) \
|
|
void do_run() override; \
|
|
FIXTURE_TEARDOWN(FIXTURE) \
|
|
}; \
|
|
DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET); \
|
|
template <typename... As> \
|
|
void TEST_NAME<std::tuple<As...>>::do_run()
|
|
|
|
#define FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
|
|
FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
|
|
#define EXPECTED_FAILURE_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
|
|
FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
|
|
#define DISABLED_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
|
|
FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
|
|
|
|
#define REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS) \
|
|
class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
|
|
{ \
|
|
public: \
|
|
TEST_CASE_CONSTRUCTOR(TEST_NAME) \
|
|
FIXTURE_SETUP(FIXTURE) \
|
|
FIXTURE_RUN(FIXTURE) \
|
|
FIXTURE_SYNC(FIXTURE) \
|
|
FIXTURE_TEARDOWN(FIXTURE) \
|
|
}; \
|
|
TEST_REGISTRAR(TEST_NAME, MODE, STATUS)
|
|
|
|
#define REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
|
|
REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE)
|
|
#define EXPECTED_FAILURE_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
|
|
REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE)
|
|
#define DISABLED_REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
|
|
REGISTER_FIXTURE_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED)
|
|
|
|
#define REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, STATUS, DATASET) \
|
|
template <typename T> \
|
|
class TEST_NAME; \
|
|
template <typename... As> \
|
|
class TEST_NAME<std::tuple<As...>> : public arm_compute::test::framework::DataTestCase<decltype(DATASET)::type>, public FIXTURE \
|
|
{ \
|
|
public: \
|
|
DATA_TEST_CASE_CONSTRUCTOR(TEST_NAME, DATASET) \
|
|
FIXTURE_DATA_SETUP(FIXTURE) \
|
|
FIXTURE_RUN(FIXTURE) \
|
|
FIXTURE_SYNC(FIXTURE) \
|
|
FIXTURE_TEARDOWN(FIXTURE) \
|
|
}; \
|
|
DATA_TEST_REGISTRAR(TEST_NAME, MODE, STATUS, DATASET)
|
|
|
|
#define REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
|
|
REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::ACTIVE, DATASET)
|
|
#define EXPECTED_FAILURE_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
|
|
REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::EXPECTED_FAILURE, DATASET)
|
|
#define DISABLED_REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
|
|
REGISTER_FIXTURE_DATA_TEST_CASE_IMPL(TEST_NAME, FIXTURE, MODE, arm_compute::test::framework::TestCaseFactory::Status::DISABLED, DATASET)
|
|
//
|
|
// TEST CASE MACROS END
|
|
//
|
|
#endif /* ARM_COMPUTE_TEST_FRAMEWORK_MACROS */ |