// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include #include "TensorHelpers.hpp" #include inline void ConfigureLoggingTest() { // Configures logging for both the ARMNN library and this test program. armnn::ConfigureLogging(true, true, armnn::LogSeverity::Fatal); armnnUtils::ConfigureLogging(boost::log::core::get().get(), true, true, armnn::LogSeverity::Fatal); } // The following macros require the caller to have defined FactoryType, with one of the following using statements: // // using FactoryType = armnn::RefWorkloadFactory; // using FactoryType = armnn::ClWorkloadFactory; // using FactoryType = armnn::NeonWorkloadFactory; /// Executes BOOST_TEST on CompareTensors() return value so that the predicate_result message is reported. /// If the test reports itself as not supported then the tensors are not compared. /// Additionally this checks that the supportedness reported by the test matches the name of the test. /// Unsupported tests must be 'tagged' by including "UNSUPPORTED" in their name. /// This is useful because it clarifies that the feature being tested is not actually supported /// (a passed test with the name of a feature would imply that feature was supported). /// If support is added for a feature, the test case will fail because the name incorrectly contains UNSUPPORTED. /// If support is removed for a feature, the test case will fail because the name doesn't contain UNSUPPORTED. template void CompareTestResultIfSupported(const std::string& testName, const LayerTestResult& testResult) { bool testNameIndicatesUnsupported = testName.find("UNSUPPORTED") != std::string::npos; BOOST_CHECK_MESSAGE(testNameIndicatesUnsupported != testResult.supported, "The test name does not match the supportedness it is reporting"); if (testResult.supported) { BOOST_TEST(CompareTensors(testResult.output, testResult.outputExpected)); } } template void CompareTestResultIfSupported(const std::string& testName, const std::vector>& testResult) { bool testNameIndicatesUnsupported = testName.find("UNSUPPORTED") != std::string::npos; for (unsigned int i = 0; i < testResult.size(); ++i) { BOOST_CHECK_MESSAGE(testNameIndicatesUnsupported != testResult[i].supported, "The test name does not match the supportedness it is reporting"); if (testResult[i].supported) { BOOST_TEST(CompareTensors(testResult[i].output, testResult[i].outputExpected)); } } } template void RunTestFunction(const char* testName, TFuncPtr testFunction, Args... args) { std::unique_ptr profiler = std::make_unique(); armnn::ProfilerManager::GetInstance().RegisterProfiler(profiler.get()); FactoryType workloadFactory; auto testResult = (*testFunction)(workloadFactory, args...); CompareTestResultIfSupported(testName, testResult); } #define ARMNN_AUTO_TEST_CASE(TestName, TestFunction, ...) \ BOOST_AUTO_TEST_CASE(TestName) \ { \ RunTestFunction(#TestName, &TestFunction, ##__VA_ARGS__); \ } template void CompareRefTestFunction(const char* testName, TFuncPtr testFunction, Args... args) { FactoryType workloadFactory; armnn::RefWorkloadFactory refWorkloadFactory; auto testResult = (*testFunction)(workloadFactory, refWorkloadFactory, args...); CompareTestResultIfSupported(testName, testResult); } #define ARMNN_COMPARE_REF_AUTO_TEST_CASE(TestName, TestFunction, ...) \ BOOST_AUTO_TEST_CASE(TestName) \ { \ CompareRefTestFunction(#TestName, &TestFunction, ##__VA_ARGS__); \ } #define ARMNN_COMPARE_REF_FIXTURE_TEST_CASE(TestName, Fixture, TestFunction, ...) \ BOOST_FIXTURE_TEST_CASE(TestName, Fixture) \ { \ CompareRefTestFunction(#TestName, &TestFunction, ##__VA_ARGS__); \ }