From 9164dd55e6c84cba1e9fff0387306e1f3b4f5a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20=C5=A0ach?= Date: Fri, 15 Dec 2023 16:46:14 +0100 Subject: [PATCH] Rewrite xs/t/09_polyline.t to c++ --- tests/libslic3r/test_polyline.cpp | 91 +++++++++++++++++++++++++++++++ xs/t/09_polyline.t | 86 ----------------------------- 2 files changed, 91 insertions(+), 86 deletions(-) delete mode 100644 xs/t/09_polyline.t diff --git a/tests/libslic3r/test_polyline.cpp b/tests/libslic3r/test_polyline.cpp index 89a84d40a3..3a51b78dd8 100644 --- a/tests/libslic3r/test_polyline.cpp +++ b/tests/libslic3r/test_polyline.cpp @@ -1,3 +1,6 @@ +/** +* Ported from xs/t/09_polyline.t +*/ #include #include "libslic3r/Point.hpp" @@ -5,6 +8,74 @@ using namespace Slic3r; +struct PolylineTestCase { + Polyline polyline{ + {100, 100}, + {200, 100}, + {200, 200} + }; +}; + +TEST_CASE_METHOD(PolylineTestCase, "Lines can be retrieved", "[Polyline]") { + + CHECK(polyline.lines() == Lines{ + {{100, 100}, {200, 100}}, + {{200, 100}, {200, 200}}, + }); +} + +TEST_CASE_METHOD(PolylineTestCase, "Clip", "[Polyline]") { + const double len = polyline.length(); + polyline.clip_end(len/3); + CHECK(std::abs(polyline.length() - 2.0/3.0*len) < 1); +} + +TEST_CASE_METHOD(PolylineTestCase, "Append", "[Polyline]") { + Polyline tested_polyline{polyline}; + tested_polyline.append(tested_polyline); + Points expected{polyline.points}; + expected.insert(expected.end(), polyline.points.begin(), polyline.points.end()); + + CHECK(tested_polyline.points == expected); +} + +TEST_CASE_METHOD(PolylineTestCase, "Extend end", "[Polyline]") { + CHECK(polyline.length() == 100*2); + polyline.extend_end(50); + CHECK(polyline.length() == 100*2 + 50); +} + +TEST_CASE_METHOD(PolylineTestCase, "Extend start", "[Polyline]") { + CHECK(polyline.length() == 100*2); + polyline.extend_start(50); + CHECK(polyline.length() == 100*2 + 50); +} + +TEST_CASE_METHOD(PolylineTestCase, "Split", "[Polyline]") { + Polyline p1; + Polyline p2; + const Point point{150, 100}; + polyline.split_at(point, &p1, &p2); + CHECK(p1.size() == 2); + CHECK(p2.size() == 3); + CHECK(p1.last_point() == point); + CHECK(p2.first_point() == point); +} + +TEST_CASE_METHOD(PolylineTestCase, "Split at first point", "[Polyline]") { + Polyline to_split{ + polyline.points[0], + polyline.points[1], + polyline.points[2], + polyline.points[0] + }; + Polyline p1; + Polyline p2; + to_split.split_at(to_split.first_point(), &p1, &p2); + CHECK(p1.size() == 1); + CHECK(p2.size() == 4); +} + SCENARIO("Simplify polyne, template", "[Polyline]") { Points polyline{ {0,0}, {1000,0}, {2000,0}, {2000,1000}, {2000,2000}, {1000,2000}, {0,2000}, {0,1000}, {0,0} }; @@ -44,4 +115,24 @@ SCENARIO("Simplify polyline", "[Polyline]") } } } + + GIVEN("polyline 3") { + auto polyline = Polyline{ {0,0}, {100,0}, {50,10} }; + WHEN("simplified with Douglas-Peucker") { + polyline.simplify(25.); + THEN("not simplified") { + REQUIRE(polyline == Polyline{ {0,0}, {100, 0}, {50,10} }); + } + } + } + + GIVEN("polyline 4") { + auto polyline = Polyline{ {0,0}, {20,0}, {50,0}, {80,0}, {100,0} }; + WHEN("simplified with Douglas-Peucker") { + polyline.simplify(2.); + THEN("not simplified") { + REQUIRE(polyline == Polyline{ {0,0}, {100,0} }); + } + } + } } diff --git a/xs/t/09_polyline.t b/xs/t/09_polyline.t deleted file mode 100644 index 7da74b93da..0000000000 --- a/xs/t/09_polyline.t +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; - -use Slic3r::XS; -use Test::More tests => 15; - -my $points = [ - [100, 100], - [200, 100], - [200, 200], -]; - -my $polyline = Slic3r::Polyline->new(@$points); - -my $lines = $polyline->lines; -is_deeply [ map $_->pp, @$lines ], [ - [ [100, 100], [200, 100] ], - [ [200, 100], [200, 200] ], -], 'polyline lines'; - -$polyline->append_polyline($polyline->clone); -is_deeply $polyline->pp, [ @$points, @$points ], 'append_polyline'; - -{ - my $len = $polyline->length; - $polyline->clip_end($len/3); - ok abs($polyline->length - ($len-($len/3))) < 1, 'clip_end'; -} - -{ - my $polyline = Slic3r::Polyline->new( - [0,0], [20,0], [50,0], [80,0], [100,0], - ); - $polyline->simplify(2); - is_deeply $polyline->pp, [ [0,0], [100,0] ], 'Douglas-Peucker'; -} - -{ - my $polyline = Slic3r::Polyline->new( - [0,0], [50,50], [100,0], [125,-25], [150,50], - ); - $polyline->simplify(25); - is_deeply $polyline->pp, [ [0, 0], [50, 50], [125, -25], [150, 50] ], 'Douglas-Peucker'; -} - -{ - my $polyline = Slic3r::Polyline->new( - [0,0], [100,0], [50,10], - ); - $polyline->simplify(25); - is_deeply $polyline->pp, [ [0,0], [100,0], [50,10] ], 'Douglas-Peucker uses shortest distance instead of perpendicular distance'; -} - -{ - my $polyline = Slic3r::Polyline->new(@$points); - is $polyline->length, 100*2, 'length'; - $polyline->extend_end(50); - is $polyline->length, 100*2 + 50, 'extend_end'; - $polyline->extend_start(50); - is $polyline->length, 100*2 + 50 + 50, 'extend_start'; -} - -{ - my $polyline = Slic3r::Polyline->new(@$points); - my $p1 = Slic3r::Polyline->new; - my $p2 = Slic3r::Polyline->new; - my $point = Slic3r::Point->new(150, 100); - $polyline->split_at($point, $p1, $p2); - is scalar(@$p1), 2, 'split_at'; - is scalar(@$p2), 3, 'split_at'; - ok $p1->last_point->coincides_with($point), 'split_at'; - ok $p2->first_point->coincides_with($point), 'split_at'; -} - -{ - my $polyline = Slic3r::Polyline->new(@$points[0,1,2,0]); - my $p1 = Slic3r::Polyline->new; - my $p2 = Slic3r::Polyline->new; - $polyline->split_at($polyline->first_point, $p1, $p2); - is scalar(@$p1), 1, 'split_at'; - is scalar(@$p2), 4, 'split_at'; -} - -__END__