|
|
|
@ -784,4 +784,36 @@ TEST(Core_Check, testSize_1) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename T> class Rect_Test : public testing::Test {}; |
|
|
|
|
|
|
|
|
|
TYPED_TEST_CASE_P(Rect_Test); |
|
|
|
|
|
|
|
|
|
// Reimplement C++11 std::numeric_limits<>::lowest.
|
|
|
|
|
template<typename T> T cv_numeric_limits_lowest(); |
|
|
|
|
template<> int cv_numeric_limits_lowest<int>() { return INT_MIN; } |
|
|
|
|
template<> float cv_numeric_limits_lowest<float>() { return -FLT_MAX; } |
|
|
|
|
template<> double cv_numeric_limits_lowest<double>() { return -DBL_MAX; } |
|
|
|
|
|
|
|
|
|
TYPED_TEST_P(Rect_Test, Overflows) { |
|
|
|
|
typedef Rect_<TypeParam> R; |
|
|
|
|
TypeParam num_max = std::numeric_limits<TypeParam>::max(); |
|
|
|
|
TypeParam num_lowest = cv_numeric_limits_lowest<TypeParam>(); |
|
|
|
|
EXPECT_EQ(R(0, 0, 10, 10), R(0, 0, 10, 10) & R(0, 0, 10, 10)); |
|
|
|
|
EXPECT_EQ(R(5, 6, 4, 3), R(0, 0, 10, 10) & R(5, 6, 4, 3)); |
|
|
|
|
EXPECT_EQ(R(5, 6, 3, 2), R(0, 0, 8, 8) & R(5, 6, 4, 3)); |
|
|
|
|
// Test with overflowing dimenions.
|
|
|
|
|
EXPECT_EQ(R(5, 0, 5, 10), R(0, 0, 10, 10) & R(5, 0, num_max, num_max)); |
|
|
|
|
// Test with overflowing dimensions for floats/doubles.
|
|
|
|
|
EXPECT_EQ(R(num_max, 0, num_max / 4, 10), R(num_max, 0, num_max / 2, 10) & R(num_max, 0, num_max / 4, 10)); |
|
|
|
|
// Test with overflowing coordinates.
|
|
|
|
|
EXPECT_EQ(R(), R(20, 0, 10, 10) & R(num_lowest, 0, 10, 10)); |
|
|
|
|
EXPECT_EQ(R(), R(20, 0, 10, 10) & R(0, num_lowest, 10, 10)); |
|
|
|
|
EXPECT_EQ(R(), R(num_lowest, 0, 10, 10) & R(0, num_lowest, 10, 10)); |
|
|
|
|
} |
|
|
|
|
REGISTER_TYPED_TEST_CASE_P(Rect_Test, Overflows); |
|
|
|
|
|
|
|
|
|
typedef ::testing::Types<int, float, double> RectTypes; |
|
|
|
|
INSTANTIATE_TYPED_TEST_CASE_P(Negative_Test, Rect_Test, RectTypes); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}} // namespace
|
|
|
|
|