| 1 | /** \file |
| 2 | * \brief Tests for geometry.h |
| 3 | * |
| 4 | * \author Max Ilsen |
| 5 | * |
| 6 | * \par License: |
| 7 | * This file is part of the Open Graph Drawing Framework (OGDF). |
| 8 | * |
| 9 | * \par |
| 10 | * Copyright (C)<br> |
| 11 | * See README.md in the OGDF root directory for details. |
| 12 | * |
| 13 | * \par |
| 14 | * This program is free software; you can redistribute it and/or |
| 15 | * modify it under the terms of the GNU General Public License |
| 16 | * Version 2 or 3 as published by the Free Software Foundation; |
| 17 | * see the file LICENSE.txt included in the packaging of this file |
| 18 | * for details. |
| 19 | * |
| 20 | * \par |
| 21 | * This program is distributed in the hope that it will be useful, |
| 22 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 23 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 24 | * GNU General Public License for more details. |
| 25 | * |
| 26 | * \par |
| 27 | * You should have received a copy of the GNU General Public |
| 28 | * License along with this program; if not, see |
| 29 | * http://www.gnu.org/copyleft/gpl.html |
| 30 | */ |
| 31 | |
| 32 | #include <ogdf/basic/geometry.h> |
| 33 | #include <testing.h> |
| 34 | |
| 35 | go_bandit([]() { |
| 36 | describe("DPolyline" , [](){ |
| 37 | describe("normalize, trivial cases" , [](){ |
| 38 | it("works on an empty polyline" , [](){ |
| 39 | DPolyline dpline; |
| 40 | dpline.normalize(); |
| 41 | AssertThat(dpline, Equals(dpline)); |
| 42 | }); |
| 43 | |
| 44 | it("works on a polyline with one point" , [](){ |
| 45 | DPolyline dpline({DPoint(1,1)}); |
| 46 | dpline.normalize(); |
| 47 | AssertThat(dpline, Equals(dpline)); |
| 48 | }); |
| 49 | |
| 50 | it("works on a polyline with two points" , [](){ |
| 51 | DPolyline dpline({DPoint(1,1), DPoint(2,2)}); |
| 52 | dpline.normalize(); |
| 53 | AssertThat(dpline, Equals(dpline)); |
| 54 | }); |
| 55 | |
| 56 | it("works on a polyline with three points" , [](){ |
| 57 | DPolyline dpline({DPoint(1,1), DPoint(2,2), DPoint(3,3)}); |
| 58 | DPolyline result({DPoint(1,1), DPoint(3,3)}); |
| 59 | dpline.normalize(); |
| 60 | AssertThat(dpline, Equals(result)); |
| 61 | }); |
| 62 | }); |
| 63 | |
| 64 | describe("normalize, non-trivial cases" , [](){ |
| 65 | DPoint p0(0,0); |
| 66 | DPoint p1(1,1); // 180 degree |
| 67 | DPoint p2(2,2); // 180 degree |
| 68 | DPoint p3(3,3); // 135 degree |
| 69 | DPoint p4(3,4); // 90 degree |
| 70 | DPoint p5(4,4); // 90 degree |
| 71 | DPoint p6(4,6); // 45 degree |
| 72 | DPoint p7(5,5); // 45 degree |
| 73 | DPoint p8(5,6); // 135 degree |
| 74 | DPoint p9(6,7); // 135 degree |
| 75 | DPoint p10(7,7); // 180 degree |
| 76 | DPoint p11(8,7); // 180 degree |
| 77 | DPoint p12(9,7); // 90 degree |
| 78 | DPoint p13(9,8); |
| 79 | DPolyline dpline; |
| 80 | |
| 81 | before_each([&](){ |
| 82 | dpline = DPolyline({p1, p2, p3, p4, p5, p6, |
| 83 | p7, p8, p9, p10, p11, p12}); |
| 84 | }); |
| 85 | |
| 86 | it("works without parameters" , [&](){ |
| 87 | DPolyline result({p1, p3, p4, p5, p6, p7, p8, p9, p12}); |
| 88 | dpline.normalize(); |
| 89 | AssertThat(dpline, Equals(result)); |
| 90 | }); |
| 91 | |
| 92 | it("works with a minimum angle of 3/4 Pi" , [&](){ |
| 93 | DPolyline result({p1, p4, p5, p6, p7, p9, p12}); |
| 94 | dpline.normalize(0.75*Math::pi); |
| 95 | AssertThat(dpline, Equals(result)); |
| 96 | }); |
| 97 | |
| 98 | it("works with a minimum angle of 1/2 Pi" , [&](){ |
| 99 | DPolyline result({p1, p12}); |
| 100 | dpline.normalize(Math::pi_2); |
| 101 | AssertThat(dpline, Equals(result)); |
| 102 | }); |
| 103 | |
| 104 | it("works with source/target points" , [&](){ |
| 105 | DPolyline result({p3, p4, p5, p6, p7, p8, p9, p12}); |
| 106 | dpline.normalize(p0, p13); |
| 107 | AssertThat(dpline, Equals(result)); |
| 108 | }); |
| 109 | |
| 110 | it("works with source/target points and a minimum angle of 3/4 Pi" , [&](){ |
| 111 | DPolyline result({p4, p5, p6, p7, p9, p12}); |
| 112 | dpline.normalize(p0, p13, 0.75*Math::pi); |
| 113 | AssertThat(dpline, Equals(result)); |
| 114 | }); |
| 115 | |
| 116 | it("works with source/target points and a minimum angle of 1/2 Pi" , [&](){ |
| 117 | dpline.normalize(p0, p13, Math::pi_2); |
| 118 | AssertThat(dpline.empty(), IsTrue()); |
| 119 | }); |
| 120 | |
| 121 | it("works with source/target points equaling the polyline's first/last point" , [&](){ |
| 122 | DPolyline result({p3, p4, p5, p6, p7, p8, p9}); |
| 123 | dpline.normalize(DPoint(p1), DPoint(p12)); |
| 124 | AssertThat(dpline, Equals(result)); |
| 125 | }); |
| 126 | }); |
| 127 | }); |
| 128 | }); |
| 129 | |