// 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. #include "test_precomp.hpp" namespace opencv_test { namespace { TEST(Core_OutputArrayCreate, _1997) { struct local { static void create(OutputArray arr, Size submatSize, int type) { int sizes[] = {submatSize.width, submatSize.height}; arr.create(sizeof(sizes)/sizeof(sizes[0]), sizes, type); } }; Mat mat(Size(512, 512), CV_8U); Size submatSize = Size(256, 256); ASSERT_NO_THROW(local::create( mat(Rect(Point(), submatSize)), submatSize, mat.type() )); } TEST(Core_SaturateCast, NegativeNotClipped) { double d = -1.0; unsigned int val = cv::saturate_cast(d); ASSERT_EQ(0xffffffff, val); } template static double maxAbsDiff(const T &t, const U &u) { Mat_ d; absdiff(t, u, d); double ret; minMaxLoc(d, NULL, &ret); return ret; } TEST(Core_OutputArrayAssign, _Matxd_Matd) { Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); Matx23d actualx; { OutputArray oa(actualx); oa.assign(expected); } Mat actual = (Mat) actualx; EXPECT_LE(maxAbsDiff(expected, actual), 0.0); } TEST(Core_OutputArrayAssign, _Matxd_Matf) { Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); Matx23d actualx; { OutputArray oa(actualx); oa.assign(expected); } Mat actual = (Mat) actualx; EXPECT_LE(maxAbsDiff(expected, actual), FLT_EPSILON); } TEST(Core_OutputArrayAssign, _Matxf_Matd) { Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); Matx23f actualx; { OutputArray oa(actualx); oa.assign(expected); } Mat actual = (Mat) actualx; EXPECT_LE(maxAbsDiff(expected, actual), FLT_EPSILON); } TEST(Core_OutputArrayAssign, _Matxd_UMatd) { Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); UMat uexpected = expected.getUMat(ACCESS_READ); Matx23d actualx; { OutputArray oa(actualx); oa.assign(uexpected); } Mat actual = (Mat) actualx; EXPECT_LE(maxAbsDiff(expected, actual), 0.0); } TEST(Core_OutputArrayAssign, _Matxd_UMatf) { Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); UMat uexpected = expected.getUMat(ACCESS_READ); Matx23d actualx; { OutputArray oa(actualx); oa.assign(uexpected); } Mat actual = (Mat) actualx; EXPECT_LE(maxAbsDiff(expected, actual), FLT_EPSILON); } TEST(Core_OutputArrayAssign, _Matxf_UMatd) { Mat expected = (Mat_(2,3) << 1, 2, 3, .1, .2, .3); UMat uexpected = expected.getUMat(ACCESS_READ); Matx23f actualx; { OutputArray oa(actualx); oa.assign(uexpected); } Mat actual = (Mat) actualx; EXPECT_LE(maxAbsDiff(expected, actual), FLT_EPSILON); } int fixedType_handler(OutputArray dst) { int type = CV_32FC2; // return points only {x, y} if (dst.fixedType()) { type = dst.type(); CV_Assert(type == CV_32FC2 || type == CV_32FC3); // allow points + confidence level: {x, y, confidence} } const int N = 100; dst.create(Size(1, N), type); Mat m = dst.getMat(); if (m.type() == CV_32FC2) { for (int i = 0; i < N; i++) m.at(i) = Vec2f((float)i, (float)(i*2)); } else if (m.type() == CV_32FC3) { for (int i = 0; i < N; i++) m.at(i) = Vec3f((float)i, (float)(i*2), 1.0f / (i + 1)); } else { CV_Assert(0 && "Internal error"); } return CV_MAT_CN(type); } TEST(Core_OutputArray, FixedType) { Mat_ pointsOnly; int num_pointsOnly = fixedType_handler(pointsOnly); EXPECT_EQ(2, num_pointsOnly); Mat_ pointsWithConfidence; int num_pointsWithConfidence = fixedType_handler(pointsWithConfidence); EXPECT_EQ(3, num_pointsWithConfidence); Mat defaultResult; int num_defaultResult = fixedType_handler(defaultResult); EXPECT_EQ(2, num_defaultResult); } TEST(Core_String, find_last_of__with__empty_string) { cv::String s; size_t p = s.find_last_of("q", 0); // npos is not exported: EXPECT_EQ(cv::String::npos, p); EXPECT_EQ(std::string::npos, p); } TEST(Core_String, end_method_regression) { cv::String old_string = "012345"; cv::String new_string(old_string.begin(), old_string.end()); EXPECT_EQ(6u, new_string.size()); } TEST(Core_Copy, repeat_regression_8972) { Mat src = (Mat_(1, 4) << 1, 2, 3, 4); ASSERT_ANY_THROW({ repeat(src, 5, 1, src); }); } class ThrowErrorParallelLoopBody : public cv::ParallelLoopBody { public: ThrowErrorParallelLoopBody(cv::Mat& dst, int i) : dst_(dst), i_(i) {} ~ThrowErrorParallelLoopBody() {} void operator()(const cv::Range& r) const { for (int i = r.start; i < r.end; i++) { CV_Assert(i != i_); dst_.row(i).setTo(1); } } protected: Mat dst_; int i_; }; TEST(Core_Parallel, propagate_exceptions) { Mat dst1(1000, 100, CV_8SC1, Scalar::all(0)); ASSERT_NO_THROW({ parallel_for_(cv::Range(0, dst1.rows), ThrowErrorParallelLoopBody(dst1, -1)); }); Mat dst2(1000, 100, CV_8SC1, Scalar::all(0)); ASSERT_THROW({ parallel_for_(cv::Range(0, dst2.rows), ThrowErrorParallelLoopBody(dst2, dst2.rows / 2)); }, cv::Exception); } TEST(Core_Version, consistency) { // this test verifies that OpenCV version loaded in runtime // is the same this test has been built with EXPECT_EQ(CV_VERSION_MAJOR, cv::getVersionMajor()); EXPECT_EQ(CV_VERSION_MINOR, cv::getVersionMinor()); EXPECT_EQ(CV_VERSION_REVISION, cv::getVersionRevision()); EXPECT_EQ(String(CV_VERSION), cv::getVersionString()); } }} // namespace