blob: 38eb29c6a10b53d55b7f5dd5be477d47c45be9ce [file] [log] [blame]
/*
* Copyright (c) 2017 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 "Exceptions.h"
#include "Framework.h"
#include "Registrars.h"
#include "TestCase.h"
#include <sstream>
//
// 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
//
//
// 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, _data); \
}
#define FIXTURE_RUN(FIXTURE) \
void do_run() override \
{ \
FIXTURE::run(); \
}
#define FIXTURE_TEARDOWN(FIXTURE) \
void do_teardown() override \
{ \
FIXTURE::teardown(); \
}
#define TEST_REGISTRAR(TEST_NAME, MODE) \
static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
{ \
#TEST_NAME, MODE \
}
#define DATA_TEST_REGISTRAR(TEST_NAME, MODE, DATASET) \
static arm_compute::test::framework::detail::TestCaseRegistrar<TEST_NAME> TEST_NAME##_reg \
{ \
#TEST_NAME, MODE, DATASET \
}
#define TEST_CASE(TEST_NAME, MODE) \
class TEST_NAME : public arm_compute::test::framework::TestCase \
{ \
public: \
TEST_CASE_CONSTRUCTOR(TEST_NAME) \
void do_run() override; \
}; \
TEST_REGISTRAR(TEST_NAME, MODE); \
void TEST_NAME::do_run()
#define DATA_TEST_CASE(TEST_NAME, MODE, DATASET, ...) \
class TEST_NAME : 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, _data); \
} \
void run(__VA_ARGS__); \
}; \
DATA_TEST_REGISTRAR(TEST_NAME, MODE, DATASET); \
void TEST_NAME::run(__VA_ARGS__)
#define FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
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); \
void TEST_NAME::do_run()
#define FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
class TEST_NAME : 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, DATASET); \
void TEST_NAME::do_run()
#define REGISTER_FIXTURE_TEST_CASE(TEST_NAME, FIXTURE, MODE) \
class TEST_NAME : public arm_compute::test::framework::TestCase, public FIXTURE \
{ \
public: \
TEST_CASE_CONSTRUCTOR(TEST_NAME) \
FIXTURE_SETUP(FIXTURE) \
FIXTURE_RUN(FIXTURE) \
FIXTURE_TEARDOWN(FIXTURE) \
}; \
TEST_REGISTRAR(TEST_NAME, MODE)
#define REGISTER_FIXTURE_DATA_TEST_CASE(TEST_NAME, FIXTURE, MODE, DATASET) \
class TEST_NAME : 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_TEARDOWN(FIXTURE) \
}; \
DATA_TEST_REGISTRAR(TEST_NAME, MODE, DATASET)
//
// TEST CASE MACROS END
//
#define ARM_COMPUTE_ASSERT_EQUAL(x, y) \
do \
{ \
const auto &_x = (x); \
const auto &_y = (y); \
if(_x != _y) \
{ \
std::stringstream msg; \
msg << "Assertion " << _x << " != " << _y << " failed."; \
throw arm_compute::test::framework::TestError(msg.str()); \
} \
} while(false)
#define ARM_COMPUTE_EXPECT_EQUAL(x, y) \
do \
{ \
const auto &_x = (x); \
const auto &_y = (y); \
if(_x != _y) \
{ \
std::stringstream msg; \
msg << "Expectation " << _x << " != " << _y << " failed."; \
arm_compute::test::framework::Framework::get().log_failed_expectation(msg.str()); \
} \
} while(false)
#endif /* ARM_COMPUTE_TEST_FRAMEWORK_MACROS */