205 lines
5.5 KiB
C++
205 lines
5.5 KiB
C++
#include "catch.hpp"
|
|
|
|
#include "vtr_geometry.h"
|
|
|
|
TEST_CASE("Point", "[vtr_geometry/Point]") {
|
|
vtr::Point<int> p1(5, 3);
|
|
vtr::Point<float> p2(5.3, 3.9);
|
|
SECTION("location") {
|
|
REQUIRE(p1.x() == 5);
|
|
REQUIRE(p1.y() == 3);
|
|
|
|
REQUIRE(p2.x() == Approx(5.3));
|
|
REQUIRE(p2.y() == Approx(3.9));
|
|
}
|
|
|
|
SECTION("equality") {
|
|
REQUIRE(p1 == p1);
|
|
REQUIRE(p2 == p2);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Rect", "[vtr_geometry/Rect]") {
|
|
vtr::Point<int> pi_1(5, 3);
|
|
vtr::Point<int> pi_2(10, 11);
|
|
|
|
vtr::Rect<int> r1(pi_1.x(), pi_1.y(), pi_2.x(), pi_2.y());
|
|
vtr::Rect<int> r2(pi_1, pi_2);
|
|
|
|
SECTION("equality") {
|
|
REQUIRE(r1 == r2);
|
|
}
|
|
|
|
SECTION("location") {
|
|
REQUIRE(r1.xmin() == pi_1.x());
|
|
REQUIRE(r1.xmax() == pi_2.x());
|
|
REQUIRE(r1.ymin() == pi_1.y());
|
|
REQUIRE(r1.ymax() == pi_2.y());
|
|
}
|
|
|
|
SECTION("point_accessors") {
|
|
REQUIRE(r1.bottom_left() == pi_1);
|
|
REQUIRE(r1.top_right() == pi_2);
|
|
REQUIRE(r2.bottom_left() == pi_1);
|
|
REQUIRE(r2.top_right() == pi_2);
|
|
}
|
|
|
|
SECTION("dimensions") {
|
|
REQUIRE(r1.width() == 5);
|
|
REQUIRE(r1.height() == 8);
|
|
REQUIRE(r2.width() == 5);
|
|
REQUIRE(r2.height() == 8);
|
|
}
|
|
|
|
SECTION("contains_int") {
|
|
REQUIRE(r2.contains(pi_1));
|
|
REQUIRE(r2.contains({6, 4}));
|
|
REQUIRE_FALSE(r2.contains({100, 4}));
|
|
REQUIRE_FALSE(r2.contains(pi_2));
|
|
}
|
|
|
|
SECTION("strictly_contains_int") {
|
|
REQUIRE_FALSE(r2.strictly_contains(pi_1));
|
|
REQUIRE(r2.strictly_contains({6, 4}));
|
|
REQUIRE_FALSE(r2.strictly_contains({100, 4}));
|
|
REQUIRE_FALSE(r2.strictly_contains(pi_2));
|
|
}
|
|
|
|
SECTION("coincident_int") {
|
|
REQUIRE(r2.coincident(pi_1));
|
|
REQUIRE(r2.coincident({6, 4}));
|
|
REQUIRE_FALSE(r2.coincident({100, 4}));
|
|
REQUIRE(r2.coincident(pi_2));
|
|
}
|
|
|
|
vtr::Point<float> pf_1(5.3, 3.9);
|
|
vtr::Point<float> pf_2(10.5, 11.1);
|
|
|
|
vtr::Rect<float> r3(pf_1.x(), pf_1.y(), pf_2.x(), pf_2.y());
|
|
vtr::Rect<float> r4(pf_1, pf_2);
|
|
|
|
SECTION("equality_float") {
|
|
REQUIRE(r3 == r4);
|
|
}
|
|
|
|
SECTION("location_float") {
|
|
REQUIRE(r3.xmin() == pf_1.x());
|
|
REQUIRE(r3.xmax() == pf_2.x());
|
|
REQUIRE(r3.ymin() == pf_1.y());
|
|
REQUIRE(r3.ymax() == pf_2.y());
|
|
}
|
|
|
|
SECTION("point_accessors_float") {
|
|
REQUIRE(r3.bottom_left() == pf_1);
|
|
REQUIRE(r3.top_right() == pf_2);
|
|
REQUIRE(r4.bottom_left() == pf_1);
|
|
REQUIRE(r4.top_right() == pf_2);
|
|
}
|
|
|
|
SECTION("dimensions") {
|
|
REQUIRE(r3.width() == Approx(5.2));
|
|
REQUIRE(r3.height() == Approx(7.2));
|
|
REQUIRE(r4.width() == Approx(5.2));
|
|
REQUIRE(r4.height() == Approx(7.2));
|
|
}
|
|
|
|
SECTION("contains_float") {
|
|
REQUIRE(r4.contains(pf_1));
|
|
REQUIRE(r4.contains({6, 4}));
|
|
REQUIRE_FALSE(r4.contains({100, 4}));
|
|
REQUIRE_FALSE(r4.contains(pf_2));
|
|
}
|
|
|
|
SECTION("strictly_contains_float") {
|
|
REQUIRE_FALSE(r4.strictly_contains(pf_1));
|
|
REQUIRE(r4.strictly_contains({6, 4}));
|
|
REQUIRE_FALSE(r4.strictly_contains({100, 4}));
|
|
REQUIRE_FALSE(r4.strictly_contains(pf_2));
|
|
}
|
|
|
|
SECTION("coincident_float") {
|
|
REQUIRE(r4.coincident(pf_1));
|
|
REQUIRE(r4.coincident({6, 4}));
|
|
REQUIRE_FALSE(r4.coincident({100, 4}));
|
|
REQUIRE(r4.coincident(pf_2));
|
|
}
|
|
}
|
|
|
|
TEST_CASE("Line", "[vtr_geometry/Line]") {
|
|
std::vector<vtr::Point<int>> points = {{0, 0},
|
|
{0, 2},
|
|
{1, 0},
|
|
{1, -2}};
|
|
|
|
vtr::Line<int> line(points);
|
|
|
|
SECTION("points") {
|
|
auto line_points = line.points();
|
|
|
|
REQUIRE(line_points.size() == points.size());
|
|
|
|
int i = 0;
|
|
for (auto point : line_points) {
|
|
REQUIRE(points[i] == point);
|
|
++i;
|
|
}
|
|
}
|
|
|
|
SECTION("bounding_box") {
|
|
auto bb = line.bounding_box();
|
|
|
|
REQUIRE(bb.xmin() == 0);
|
|
REQUIRE(bb.xmax() == 1);
|
|
REQUIRE(bb.ymin() == -2);
|
|
REQUIRE(bb.ymax() == 2);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("RectUnion", "[vtr_geometry/RectUnion]") {
|
|
std::vector<vtr::Rect<int>> rects = {{0, 0, 2, 2},
|
|
{1, 1, 3, 3}};
|
|
|
|
vtr::RectUnion<int> rect_union(rects);
|
|
|
|
SECTION("rects") {
|
|
auto union_rects = rect_union.rects();
|
|
|
|
REQUIRE(union_rects.size() == rects.size());
|
|
|
|
int i = 0;
|
|
for (auto rect : union_rects) {
|
|
REQUIRE(rects[i] == rect);
|
|
++i;
|
|
}
|
|
}
|
|
SECTION("bounding_box") {
|
|
auto bb = rect_union.bounding_box();
|
|
|
|
REQUIRE(bb.xmin() == 0);
|
|
REQUIRE(bb.xmax() == 3);
|
|
REQUIRE(bb.ymin() == 0);
|
|
REQUIRE(bb.ymax() == 3);
|
|
}
|
|
|
|
SECTION("contains") {
|
|
REQUIRE(rect_union.contains({0, 0}));
|
|
REQUIRE(rect_union.contains({1, 1}));
|
|
REQUIRE(rect_union.contains({2, 2}));
|
|
REQUIRE_FALSE(rect_union.contains({3, 3}));
|
|
}
|
|
|
|
SECTION("strictly_contains") {
|
|
REQUIRE_FALSE(rect_union.strictly_contains({0, 0}));
|
|
REQUIRE(rect_union.strictly_contains({1, 1}));
|
|
REQUIRE(rect_union.strictly_contains({2, 2}));
|
|
REQUIRE_FALSE(rect_union.strictly_contains({3, 3}));
|
|
}
|
|
|
|
SECTION("coincident") {
|
|
REQUIRE(rect_union.coincident({0, 0}));
|
|
REQUIRE(rect_union.coincident({1, 1}));
|
|
REQUIRE(rect_union.coincident({2, 2}));
|
|
REQUIRE(rect_union.coincident({3, 3}));
|
|
}
|
|
}
|