Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
7.5 KiB
195 lines
7.5 KiB
// This file is part of OpenCV project. |
|
// It is subject to the license terms in the LICENSE file found in the top-level directory |
|
// of this distribution and at http://opencv.org/license.html. |
|
|
|
// Copyright (C) 2014, Intel, Inc., all rights reserved. |
|
// Third party copyrights are property of their respective owners. |
|
|
|
#ifndef OPENCV_TS_EXT_HPP |
|
#define OPENCV_TS_EXT_HPP |
|
|
|
namespace cvtest { |
|
void checkIppStatus(); |
|
extern bool skipUnstableTests; |
|
extern bool runBigDataTests; |
|
extern int testThreads; |
|
|
|
void testSetUp(); |
|
void testTearDown(); |
|
|
|
bool checkBigDataTests(); |
|
|
|
} |
|
|
|
// check for required "opencv_test" namespace |
|
#if !defined(CV_TEST_SKIP_NAMESPACE_CHECK) && defined(__OPENCV_BUILD) |
|
#define CV__TEST_NAMESPACE_CHECK required_opencv_test_namespace = true; |
|
#else |
|
#define CV__TEST_NAMESPACE_CHECK // nothing |
|
#endif |
|
|
|
#define CV__TEST_INIT \ |
|
CV__TEST_NAMESPACE_CHECK \ |
|
::cvtest::testSetUp(); |
|
#define CV__TEST_CLEANUP ::cvtest::testTearDown(); |
|
#define CV__TEST_BODY_IMPL(name) \ |
|
{ \ |
|
CV__TRACE_APP_FUNCTION_NAME(name); \ |
|
try { \ |
|
CV__TEST_INIT \ |
|
Body(); \ |
|
CV__TEST_CLEANUP \ |
|
} \ |
|
catch (const cvtest::details::SkipTestExceptionBase& e) \ |
|
{ \ |
|
printf("[ SKIP ] %s\n", e.what()); \ |
|
} \ |
|
} \ |
|
|
|
|
|
#undef TEST |
|
#define TEST_(test_case_name, test_name, parent_class, bodyMethodName, BODY_IMPL) \ |
|
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\ |
|
public:\ |
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\ |
|
private:\ |
|
virtual void TestBody() CV_OVERRIDE;\ |
|
virtual void bodyMethodName();\ |
|
static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ |
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(\ |
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\ |
|
};\ |
|
\ |
|
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\ |
|
::test_info_ =\ |
|
::testing::internal::MakeAndRegisterTestInfo(\ |
|
#test_case_name, #test_name, NULL, NULL, \ |
|
::testing::internal::CodeLocation(__FILE__, __LINE__), \ |
|
(::testing::internal::GetTestTypeId()), \ |
|
parent_class::SetUpTestCase, \ |
|
parent_class::TearDownTestCase, \ |
|
new ::testing::internal::TestFactoryImpl<\ |
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\ |
|
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() BODY_IMPL( #test_case_name "_" #test_name ) \ |
|
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::bodyMethodName() |
|
|
|
#define TEST(test_case_name, test_name) TEST_(test_case_name, test_name, ::testing::Test, Body, CV__TEST_BODY_IMPL) |
|
|
|
#define CV__TEST_BIGDATA_BODY_IMPL(name) \ |
|
{ \ |
|
if (!cvtest::checkBigDataTests()) \ |
|
{ \ |
|
return; \ |
|
} \ |
|
CV__TRACE_APP_FUNCTION_NAME(name); \ |
|
try { \ |
|
CV__TEST_INIT \ |
|
Body(); \ |
|
CV__TEST_CLEANUP \ |
|
} \ |
|
catch (const cvtest::details::SkipTestExceptionBase& e) \ |
|
{ \ |
|
printf("[ SKIP ] %s\n", e.what()); \ |
|
} \ |
|
} \ |
|
|
|
// Special type of tests which require / use or validate processing of huge amount of data (>= 2Gb) |
|
#if defined(_M_X64) || defined(_M_ARM64) || defined(__x86_64__) || defined(__aarch64__) |
|
#define BIGDATA_TEST(test_case_name, test_name) TEST_(BigData_ ## test_case_name, test_name, ::testing::Test, Body, CV__TEST_BIGDATA_BODY_IMPL) |
|
#else |
|
#define BIGDATA_TEST(test_case_name, test_name) TEST_(BigData_ ## test_case_name, DISABLED_ ## test_name, ::testing::Test, Body, CV__TEST_BIGDATA_BODY_IMPL) |
|
#endif |
|
|
|
#undef TEST_F |
|
#define TEST_F(test_fixture, test_name)\ |
|
class GTEST_TEST_CLASS_NAME_(test_fixture, test_name) : public test_fixture {\ |
|
public:\ |
|
GTEST_TEST_CLASS_NAME_(test_fixture, test_name)() {}\ |
|
private:\ |
|
virtual void TestBody() CV_OVERRIDE;\ |
|
virtual void Body(); \ |
|
static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\ |
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(\ |
|
GTEST_TEST_CLASS_NAME_(test_fixture, test_name));\ |
|
};\ |
|
\ |
|
::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_fixture, test_name)\ |
|
::test_info_ =\ |
|
::testing::internal::MakeAndRegisterTestInfo(\ |
|
#test_fixture, #test_name, NULL, NULL, \ |
|
::testing::internal::CodeLocation(__FILE__, __LINE__), \ |
|
(::testing::internal::GetTypeId<test_fixture>()), \ |
|
test_fixture::SetUpTestCase, \ |
|
test_fixture::TearDownTestCase, \ |
|
new ::testing::internal::TestFactoryImpl<\ |
|
GTEST_TEST_CLASS_NAME_(test_fixture, test_name)>);\ |
|
void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::TestBody() CV__TEST_BODY_IMPL( #test_fixture "_" #test_name ) \ |
|
void GTEST_TEST_CLASS_NAME_(test_fixture, test_name)::Body() |
|
|
|
// Don't use directly |
|
#define CV__TEST_P(test_case_name, test_name, bodyMethodName, BODY_IMPL/*(name_str)*/) \ |
|
class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \ |
|
: public test_case_name { \ |
|
public: \ |
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \ |
|
private: \ |
|
virtual void bodyMethodName(); \ |
|
virtual void TestBody() CV_OVERRIDE; \ |
|
static int AddToRegistry() { \ |
|
::testing::UnitTest::GetInstance()->parameterized_test_registry(). \ |
|
GetTestCasePatternHolder<test_case_name>(\ |
|
#test_case_name, \ |
|
::testing::internal::CodeLocation(\ |
|
__FILE__, __LINE__))->AddTestPattern(\ |
|
#test_case_name, \ |
|
#test_name, \ |
|
new ::testing::internal::TestMetaFactory< \ |
|
GTEST_TEST_CLASS_NAME_(\ |
|
test_case_name, test_name)>()); \ |
|
return 0; \ |
|
} \ |
|
static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \ |
|
GTEST_DISALLOW_COPY_AND_ASSIGN_(\ |
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \ |
|
}; \ |
|
int GTEST_TEST_CLASS_NAME_(test_case_name, \ |
|
test_name)::gtest_registering_dummy_ = \ |
|
GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \ |
|
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody() BODY_IMPL( #test_case_name "_" #test_name ) \ |
|
void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::bodyMethodName() |
|
|
|
#undef TEST_P |
|
#define TEST_P(test_case_name, test_name) CV__TEST_P(test_case_name, test_name, Body, CV__TEST_BODY_IMPL) |
|
|
|
|
|
#define CV_TEST_EXPECT_EXCEPTION_MESSAGE(statement, msg) \ |
|
GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
|
if (::testing::internal::AlwaysTrue()) { \ |
|
const char* msg_ = msg; \ |
|
bool hasException = false; \ |
|
try { \ |
|
GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ |
|
} \ |
|
catch (const cv::Exception& e) { \ |
|
if (NULL == strstr(e.what(), msg_)) \ |
|
ADD_FAILURE() << "Unexpected cv::Exception is raised: " << #statement << "\n Expected message substring: '" << msg_ << "'. Actual message:\n" << e.what(); \ |
|
hasException = true; \ |
|
} \ |
|
catch (const std::exception& e) { \ |
|
ADD_FAILURE() << "Unexpected std::exception is raised: " << #statement << "\n" << e.what(); \ |
|
hasException = true; \ |
|
} \ |
|
catch (...) { \ |
|
ADD_FAILURE() << "Unexpected C++ exception is raised: " << #statement; \ |
|
hasException = true; \ |
|
} \ |
|
if (!hasException) { \ |
|
goto GTEST_CONCAT_TOKEN_(gtest_label_test_, __LINE__); \ |
|
} \ |
|
} else \ |
|
GTEST_CONCAT_TOKEN_(gtest_label_test_, __LINE__): \ |
|
ADD_FAILURE() << "Failed: Expected: " #statement " throws an '" << msg << "' exception.\n" \ |
|
" Actual: it doesn't." |
|
|
|
|
|
#endif // OPENCV_TS_EXT_HPP
|
|
|