forked from Qortal/Brooklyn
177 lines
5.4 KiB
C++
177 lines
5.4 KiB
C++
|
//
|
||
|
// Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
|
||
|
// SPDX-License-Identifier: MIT
|
||
|
//
|
||
|
|
||
|
#include <catch.hpp>
|
||
|
#include "BoundingBox.hpp"
|
||
|
|
||
|
namespace
|
||
|
{
|
||
|
static constexpr unsigned int s_X = 100u;
|
||
|
static constexpr unsigned int s_Y = 200u;
|
||
|
static constexpr unsigned int s_W = 300u;
|
||
|
static constexpr unsigned int s_H = 400u;
|
||
|
} // anonymous namespace
|
||
|
|
||
|
TEST_CASE("BoundingBoxTest_Default")
|
||
|
{
|
||
|
od::BoundingBox boundingBox;
|
||
|
|
||
|
REQUIRE(boundingBox.GetX() == 0u);
|
||
|
REQUIRE(boundingBox.GetY() == 0u);
|
||
|
REQUIRE(boundingBox.GetWidth() == 0u);
|
||
|
REQUIRE(boundingBox.GetHeight() == 0u);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("BoundingBoxTest_Custom")
|
||
|
{
|
||
|
od::BoundingBox boundingBox(s_X, s_Y, s_W, s_H);
|
||
|
|
||
|
REQUIRE(boundingBox.GetX() == s_X);
|
||
|
REQUIRE(boundingBox.GetY() == s_Y);
|
||
|
REQUIRE(boundingBox.GetWidth() == s_W);
|
||
|
REQUIRE(boundingBox.GetHeight() == s_H);
|
||
|
}
|
||
|
|
||
|
TEST_CASE("BoundingBoxTest_Setters")
|
||
|
{
|
||
|
od::BoundingBox boundingBox;
|
||
|
|
||
|
boundingBox.SetX(s_X);
|
||
|
boundingBox.SetY(s_Y);
|
||
|
boundingBox.SetWidth(s_W);
|
||
|
boundingBox.SetHeight(s_H);
|
||
|
|
||
|
REQUIRE(boundingBox.GetX() == s_X);
|
||
|
REQUIRE(boundingBox.GetY() == s_Y);
|
||
|
REQUIRE(boundingBox.GetWidth() == s_W);
|
||
|
REQUIRE(boundingBox.GetHeight() == s_H);
|
||
|
}
|
||
|
|
||
|
static inline bool AreBoxesEqual(od::BoundingBox& b1, od::BoundingBox& b2)
|
||
|
{
|
||
|
return (b1.GetX() == b2.GetX() && b1.GetY() == b2.GetY() &&
|
||
|
b1.GetWidth() == b2.GetWidth() && b1.GetHeight() == b2.GetHeight());
|
||
|
}
|
||
|
|
||
|
TEST_CASE("BoundingBoxTest_GetValidBoundingBox")
|
||
|
{
|
||
|
od::BoundingBox boxIn { 0, 0, 10, 20 };
|
||
|
od::BoundingBox boxOut;
|
||
|
|
||
|
WHEN("Limiting box is completely within the input box")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 1, 1, 9, 18 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxLmt,boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box cuts off the top and left")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 1, 1, 10, 20 };
|
||
|
od::BoundingBox boxExp{ 1, 1, 9, 19 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box cuts off the bottom")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 0, 0, 10, 19 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxLmt, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box cuts off the right")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 0, 0, 9, 20 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxLmt, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box cuts off the bottom and right")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 0, 0, 9, 19 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxLmt, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box cuts off the bottom and left")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 1, 0, 10, 19 };
|
||
|
od::BoundingBox boxExp{ 1, 0, 9, 19 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box does not impose any limit")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 0, 0, 10, 20 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxIn, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box zeros out the width")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 0, 0, 0, 20 };
|
||
|
od::BoundingBox boxExp{ 0, 0, 0, 0 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box zeros out the height")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ 0, 0, 10, 0 };
|
||
|
od::BoundingBox boxExp{ 0, 0, 0, 0 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box with negative starts - top and left with 1 sq pixel cut-off")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ -1, -1, 10, 20 };
|
||
|
od::BoundingBox boxExp{ 0, 0, 9, 19 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box with negative starts - top and left with full overlap")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{ -1, -1, 11, 21 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxIn, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box with zero overlap")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{-10,-20, 10, 20 };
|
||
|
od::BoundingBox boxExp{ 0, 0, 0, 0 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box with one square pixel overlap")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{-9,-19, 10, 20 };
|
||
|
od::BoundingBox boxExp{ 0, 0, 1, 1 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
|
||
|
WHEN("Limiting box with unrealistically high values in positive quadrant")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{INT32_MAX, INT32_MAX, UINT32_MAX, UINT32_MAX };
|
||
|
od::BoundingBox boxExp{ 0, 0, 0, 0 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
|
||
|
/* This should actually return a valid bounding box, currently not handled. */
|
||
|
WHEN("Limiting box with unrealistic values spanning 32 bit space")
|
||
|
{
|
||
|
od::BoundingBox boxLmt{-(INT32_MAX), -(INT32_MAX), UINT32_MAX, UINT32_MAX};
|
||
|
od::BoundingBox boxExp{ 0, 0, 0, 0 };
|
||
|
GetValidBoundingBox(boxIn, boxOut, boxLmt);
|
||
|
REQUIRE(AreBoxesEqual(boxExp, boxOut));
|
||
|
}
|
||
|
}
|