| #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})); |
| } |
| } |