You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

76 lines
2.7 KiB
C++

#include <gtest/gtest.h>
#include "clipper2/clipper.h"
using namespace Clipper2Lib;
TEST(Clipper2Tests, TestRectClip)
{
Paths64 sub, clp, sol;
Rect64 rect = Rect64(100, 100, 700, 500);
clp.push_back(rect.AsPath());
sub.push_back(MakePath({ 100,100, 700,100, 700,500, 100,500 }));
sol = RectClip(rect, sub);
EXPECT_TRUE(Area(sol) == Area(sub));
sub.clear();
sub.push_back(MakePath({ 110,110, 700,100, 700,500, 100,500 }));
sol = RectClip(rect, sub);
EXPECT_TRUE(Area(sol) == Area(sub));
sub.clear();
sub.push_back(MakePath({ 90,90, 700,100, 700,500, 100,500 }));
sol = RectClip(rect, sub);
EXPECT_TRUE(Area(sol) == Area(clp));
sub.clear();
sub.push_back(MakePath({ 110,110, 690,110, 690,490, 110,490 }));
sol = RectClip(rect, sub);
EXPECT_TRUE(Area(sol) == Area(sub));
sub.clear();
clp.clear();
rect = Rect64(390, 290, 410, 310);
clp.push_back(rect.AsPath());
sub.push_back(MakePath({ 410,290, 500,290, 500,310, 410,310 }));
sol = RectClip(rect, sub);
EXPECT_TRUE(sol.empty());
sub.clear();
sub.push_back(MakePath({ 430,290, 470,330, 390,330 }));
sol = RectClip(rect, sub);
EXPECT_TRUE(sol.empty());
sub.clear();
sub.push_back(MakePath({ 450,290, 480,330, 450,330 }));
sol = RectClip(rect, sub);
EXPECT_TRUE(sol.empty());
sub.clear();
sub.push_back(MakePath({ 208,66, 366,112, 402,303,
234,332, 233,262, 243,140, 215,126, 40,172 }));
rect = Rect64(237, 164, 322, 248);
sol = RectClip(rect, sub);
const auto solBounds = GetBounds(sol);
EXPECT_EQ(solBounds.Width(), rect.Width());
EXPECT_EQ(solBounds.Height(), rect.Height());
}
TEST(Clipper2Tests, TestRectClip2) //#597
{
Clipper2Lib::Rect64 rect(54690, 0, 65628, 6000);
Clipper2Lib::Paths64 subject {{{700000, 6000}, { 0, 6000 }, { 0, 5925 }, { 700000, 5925 }}};
Clipper2Lib::Paths64 solution = Clipper2Lib::RectClip(rect, subject);
//std::cout << solution << std::endl;
EXPECT_TRUE(solution.size() == 1 && solution[0].size() == 4);
}
TEST(Clipper2Tests, TestRectClip3) //#637
{
Rect64 r(-1800000000LL, -137573171LL, -1741475021LL, 3355443LL);
Paths64 subject, clip, solution;
subject.push_back(MakePath({ -1800000000LL, 10005000LL,
-1800000000LL, -5000LL, -1789994999LL, -5000LL, -1789994999LL, 10005000LL }));
clip.push_back(r.AsPath());
solution = RectClip(r, subject);
//std::cout << solution << std::endl;
EXPECT_TRUE(solution.size() == 1);
}
TEST(Clipper2Tests, TestRectClipOrientation) //#864
{
const Rect64 rect(1222, 1323, 3247, 3348);
const Path64 subject = MakePath({ 375,1680, 1915,4716, 5943,586, 3987,152 });
RectClip64 clip(rect);
const auto solution = clip.Execute({ subject });
ASSERT_EQ(solution.size(), 1);
EXPECT_EQ(IsPositive(subject), IsPositive(solution.front()));
}