1*c8dee2aaSAndroid Build Coastguard Worker // Copyright 2023 Google LLC
2*c8dee2aaSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
3*c8dee2aaSAndroid Build Coastguard Worker
4*c8dee2aaSAndroid Build Coastguard Worker #include "modules/bentleyottmann/include/Segment.h"
5*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
6*c8dee2aaSAndroid Build Coastguard Worker
7*c8dee2aaSAndroid Build Coastguard Worker using namespace bentleyottmann;
8*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BO_SegmentBasic,reporter)9*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BO_SegmentBasic, reporter) {
10*c8dee2aaSAndroid Build Coastguard Worker {
11*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{0, 0}, {1, 1}};
12*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, s.upper() == s.p0);
13*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, s.lower() == s.p1);
14*c8dee2aaSAndroid Build Coastguard Worker }
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker {
17*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{1, 0}, {0, 1}};
18*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, s.upper() == s.p0);
19*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, s.lower() == s.p1);
20*c8dee2aaSAndroid Build Coastguard Worker }
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker {
23*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{1, 1}, {0, 0}};
24*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, s.upper() == s.p1);
25*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, s.lower() == s.p0);
26*c8dee2aaSAndroid Build Coastguard Worker }
27*c8dee2aaSAndroid Build Coastguard Worker
28*c8dee2aaSAndroid Build Coastguard Worker {
29*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{0, 1}, {1, 0}};
30*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, s.upper() == s.p1);
31*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, s.lower() == s.p0);
32*c8dee2aaSAndroid Build Coastguard Worker }
33*c8dee2aaSAndroid Build Coastguard Worker }
34*c8dee2aaSAndroid Build Coastguard Worker
swap_ends(const Segment & s)35*c8dee2aaSAndroid Build Coastguard Worker static Segment swap_ends(const Segment& s) {
36*c8dee2aaSAndroid Build Coastguard Worker return {s.p1, s.p0};
37*c8dee2aaSAndroid Build Coastguard Worker }
38*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BO_no_intersection_bounding_box,reporter)39*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BO_no_intersection_bounding_box, reporter) {
40*c8dee2aaSAndroid Build Coastguard Worker Segment interesting[] = {{Point::Smallest(), Point::Smallest()+ Point{10, 5}},
41*c8dee2aaSAndroid Build Coastguard Worker {Point::Largest(), Point::Largest() - Point{10, 5}},
42*c8dee2aaSAndroid Build Coastguard Worker {{-10, -5}, {10, 5}}};
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Worker // Intersection
45*c8dee2aaSAndroid Build Coastguard Worker for (auto& s0 : interesting) {
46*c8dee2aaSAndroid Build Coastguard Worker auto [l, t, r, b] = s0.bounds();
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker // Points in the interior of interesting rectangles
49*c8dee2aaSAndroid Build Coastguard Worker for(Point p : {Point {l + 1, t + 1},
50*c8dee2aaSAndroid Build Coastguard Worker Point {r - 1, t + 1},
51*c8dee2aaSAndroid Build Coastguard Worker Point {r - 1, b - 1},
52*c8dee2aaSAndroid Build Coastguard Worker Point {l + 1, b - 1}}) {
53*c8dee2aaSAndroid Build Coastguard Worker Segment s1 = {p, {0, 0}};
54*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !no_intersection_by_bounding_box(s0, s1));
55*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !no_intersection_by_bounding_box(s1, s0));
56*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
57*c8dee2aaSAndroid Build Coastguard Worker !no_intersection_by_bounding_box(swap_ends(s0), swap_ends(s1)));
58*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
59*c8dee2aaSAndroid Build Coastguard Worker !no_intersection_by_bounding_box(swap_ends(s0), swap_ends(s1)));
60*c8dee2aaSAndroid Build Coastguard Worker }
61*c8dee2aaSAndroid Build Coastguard Worker }
62*c8dee2aaSAndroid Build Coastguard Worker
63*c8dee2aaSAndroid Build Coastguard Worker int32_t small = Point::Smallest().x,
64*c8dee2aaSAndroid Build Coastguard Worker big = Point::Largest().x;
65*c8dee2aaSAndroid Build Coastguard Worker
66*c8dee2aaSAndroid Build Coastguard Worker // No Intersection
67*c8dee2aaSAndroid Build Coastguard Worker for (auto& s0 : interesting) {
68*c8dee2aaSAndroid Build Coastguard Worker auto [l, t, r, b] = s0.bounds();
69*c8dee2aaSAndroid Build Coastguard Worker
70*c8dee2aaSAndroid Build Coastguard Worker Segment outside[] = {{{r, t}, {big, b}},
71*c8dee2aaSAndroid Build Coastguard Worker {{r, b}, {big, big}},
72*c8dee2aaSAndroid Build Coastguard Worker {{l, b}, {r, big}},
73*c8dee2aaSAndroid Build Coastguard Worker {{l, b}, {small, big}},
74*c8dee2aaSAndroid Build Coastguard Worker {{l, t}, {small, b}},
75*c8dee2aaSAndroid Build Coastguard Worker {{l, t}, {small, small}},
76*c8dee2aaSAndroid Build Coastguard Worker {{l, t}, {r, small}},
77*c8dee2aaSAndroid Build Coastguard Worker {{r, t}, {small, small}}};
78*c8dee2aaSAndroid Build Coastguard Worker
79*c8dee2aaSAndroid Build Coastguard Worker for (auto& s1 : outside) {
80*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, no_intersection_by_bounding_box(s0, s1));
81*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, no_intersection_by_bounding_box(s1, s0));
82*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
83*c8dee2aaSAndroid Build Coastguard Worker no_intersection_by_bounding_box(swap_ends(s0), swap_ends(s1)));
84*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter,
85*c8dee2aaSAndroid Build Coastguard Worker no_intersection_by_bounding_box(swap_ends(s0), swap_ends(s1)));
86*c8dee2aaSAndroid Build Coastguard Worker }
87*c8dee2aaSAndroid Build Coastguard Worker }
88*c8dee2aaSAndroid Build Coastguard Worker }
89*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BO_intersectBasic,reporter)90*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BO_intersectBasic, reporter) {
91*c8dee2aaSAndroid Build Coastguard Worker
92*c8dee2aaSAndroid Build Coastguard Worker auto checkIntersection = [reporter](Segment s0, Segment s1, Point expected) {
93*c8dee2aaSAndroid Build Coastguard Worker {
94*c8dee2aaSAndroid Build Coastguard Worker auto answer = intersect(s0, s1);
95*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, answer.has_value());
96*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, answer.value() == expected);
97*c8dee2aaSAndroid Build Coastguard Worker }
98*c8dee2aaSAndroid Build Coastguard Worker {
99*c8dee2aaSAndroid Build Coastguard Worker auto answer = intersect(s1, s0);
100*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, answer.has_value());
101*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, answer.value() == expected);
102*c8dee2aaSAndroid Build Coastguard Worker }
103*c8dee2aaSAndroid Build Coastguard Worker {
104*c8dee2aaSAndroid Build Coastguard Worker auto answer = intersect(swap_ends(s0), swap_ends(s1));
105*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, answer.has_value());
106*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, answer.value() == expected);
107*c8dee2aaSAndroid Build Coastguard Worker }
108*c8dee2aaSAndroid Build Coastguard Worker {
109*c8dee2aaSAndroid Build Coastguard Worker auto answer = intersect(swap_ends(s1), swap_ends(s0));
110*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, answer.has_value());
111*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, answer.value() == expected);
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker };
114*c8dee2aaSAndroid Build Coastguard Worker
115*c8dee2aaSAndroid Build Coastguard Worker {
116*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-1, 0}, {1, 0}},
117*c8dee2aaSAndroid Build Coastguard Worker s1 = {{ 0, 1}, {0, -1}};
118*c8dee2aaSAndroid Build Coastguard Worker
119*c8dee2aaSAndroid Build Coastguard Worker checkIntersection(s0, s1, Point{0, 0});
120*c8dee2aaSAndroid Build Coastguard Worker }
121*c8dee2aaSAndroid Build Coastguard Worker {
122*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-1, 0}, {5, 0}},
123*c8dee2aaSAndroid Build Coastguard Worker s1 = {{ 0, 1}, {0, -1}};
124*c8dee2aaSAndroid Build Coastguard Worker
125*c8dee2aaSAndroid Build Coastguard Worker checkIntersection(s0, s1, Point{0, 0});
126*c8dee2aaSAndroid Build Coastguard Worker }
127*c8dee2aaSAndroid Build Coastguard Worker
128*c8dee2aaSAndroid Build Coastguard Worker {
129*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{5, 0}, {-1, 0}},
130*c8dee2aaSAndroid Build Coastguard Worker s1 = {{ 0, -1}, {0, 1}};
131*c8dee2aaSAndroid Build Coastguard Worker
132*c8dee2aaSAndroid Build Coastguard Worker checkIntersection(s0, s1, Point{0, 0});
133*c8dee2aaSAndroid Build Coastguard Worker }
134*c8dee2aaSAndroid Build Coastguard Worker
135*c8dee2aaSAndroid Build Coastguard Worker {
136*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-5, -5}, {5, 5}},
137*c8dee2aaSAndroid Build Coastguard Worker s1 = {{-5, 5}, {5, -5}};
138*c8dee2aaSAndroid Build Coastguard Worker
139*c8dee2aaSAndroid Build Coastguard Worker checkIntersection(s0, s1, Point{0, 0});
140*c8dee2aaSAndroid Build Coastguard Worker }
141*c8dee2aaSAndroid Build Coastguard Worker
142*c8dee2aaSAndroid Build Coastguard Worker // Test very close segments (x0, 0) -> (x1, 1) & (x2, 0) -> (x3, 1)
143*c8dee2aaSAndroid Build Coastguard Worker for (int32_t x0 = -10; x0 <= 10; x0++) {
144*c8dee2aaSAndroid Build Coastguard Worker for (int32_t x1 = -10; x1 <= 10; x1++) {
145*c8dee2aaSAndroid Build Coastguard Worker for (int32_t x2 = -10; x2 <= 10; x2++) {
146*c8dee2aaSAndroid Build Coastguard Worker for (int32_t x3 = -10; x3 <= 10; x3++) {
147*c8dee2aaSAndroid Build Coastguard Worker Point P0 = {x0, 0},
148*c8dee2aaSAndroid Build Coastguard Worker P1 = {x1, 1},
149*c8dee2aaSAndroid Build Coastguard Worker P2 = {x2, 0},
150*c8dee2aaSAndroid Build Coastguard Worker P3 = {x3, 1};
151*c8dee2aaSAndroid Build Coastguard Worker auto actual = intersect({P0, P1}, {P2, P3});
152*c8dee2aaSAndroid Build Coastguard Worker bool expected = (x0 < x2 && x3 < x1) || (x2 < x0 && x1 < x3);
153*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, actual.has_value() == expected);
154*c8dee2aaSAndroid Build Coastguard Worker if (actual) {
155*c8dee2aaSAndroid Build Coastguard Worker int32_t y = std::abs(x2 - x0) >= std::abs(x3 - x1);
156*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, actual.value().y == y);
157*c8dee2aaSAndroid Build Coastguard Worker }
158*c8dee2aaSAndroid Build Coastguard Worker }
159*c8dee2aaSAndroid Build Coastguard Worker }
160*c8dee2aaSAndroid Build Coastguard Worker }
161*c8dee2aaSAndroid Build Coastguard Worker }
162*c8dee2aaSAndroid Build Coastguard Worker
163*c8dee2aaSAndroid Build Coastguard Worker {
164*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{0, -100}, {0, -50}},
165*c8dee2aaSAndroid Build Coastguard Worker s1 = {{100, -100}, {-100, 100}}; // goes through (0,0)
166*c8dee2aaSAndroid Build Coastguard Worker auto answer = intersect(s0, s1);
167*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !answer.has_value());
168*c8dee2aaSAndroid Build Coastguard Worker answer = intersect(s1, s0);
169*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !answer.has_value());
170*c8dee2aaSAndroid Build Coastguard Worker }
171*c8dee2aaSAndroid Build Coastguard Worker {
172*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{0, 100}, {0, 50}},
173*c8dee2aaSAndroid Build Coastguard Worker s1 = {{100, -100}, {-100, 100}}; // goes through (0,0)
174*c8dee2aaSAndroid Build Coastguard Worker auto answer = intersect(s0, s1);
175*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !answer.has_value());
176*c8dee2aaSAndroid Build Coastguard Worker answer = intersect(s1, s0);
177*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !answer.has_value());
178*c8dee2aaSAndroid Build Coastguard Worker }
179*c8dee2aaSAndroid Build Coastguard Worker }
180*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BO_lessAtBasic,reporter)181*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BO_lessAtBasic, reporter) {
182*c8dee2aaSAndroid Build Coastguard Worker { // Parallel lines
183*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-1, 1}, {-1, -1}},
184*c8dee2aaSAndroid Build Coastguard Worker s1 = {{1, 1}, {1, -1}};
185*c8dee2aaSAndroid Build Coastguard Worker
186*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, less_than_at(s0, s1, -1));
187*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s1, s0, -1));
188*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, less_than_at(s0, s1, 0));
189*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s1, s0, 0));
190*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, less_than_at(s0, s1, 1));
191*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s1, s0, 1));
192*c8dee2aaSAndroid Build Coastguard Worker }
193*c8dee2aaSAndroid Build Coastguard Worker { // Crossed lines
194*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-1, -1}, {1, 1}},
195*c8dee2aaSAndroid Build Coastguard Worker s1 = {{1, -1}, {-1, 1}};
196*c8dee2aaSAndroid Build Coastguard Worker
197*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, less_than_at(s0, s1, -1));
198*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s1, s0, -1));
199*c8dee2aaSAndroid Build Coastguard Worker
200*c8dee2aaSAndroid Build Coastguard Worker // When they are == neither is less.
201*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s0, s1, 0));
202*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s1, s0, 0));
203*c8dee2aaSAndroid Build Coastguard Worker
204*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s0, s1, 1));
205*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, less_than_at(s1, s0, 1));
206*c8dee2aaSAndroid Build Coastguard Worker }
207*c8dee2aaSAndroid Build Coastguard Worker { // Near crossing
208*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{0, -100}, {0, 100}},
209*c8dee2aaSAndroid Build Coastguard Worker s1 = {{-3, 98}, {3, 104}};
210*c8dee2aaSAndroid Build Coastguard Worker
211*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s0, s1, 98));
212*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, less_than_at(s1, s0, 98));
213*c8dee2aaSAndroid Build Coastguard Worker
214*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s0, s1, 99));
215*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, less_than_at(s1, s0, 99));
216*c8dee2aaSAndroid Build Coastguard Worker
217*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !less_than_at(s0, s1, 100));
218*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, less_than_at(s1, s0, 100));
219*c8dee2aaSAndroid Build Coastguard Worker }
220*c8dee2aaSAndroid Build Coastguard Worker }
221*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BO_compareSlopesBasic,reporter)222*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BO_compareSlopesBasic, reporter) {
223*c8dee2aaSAndroid Build Coastguard Worker { // Both horizontal
224*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-1, 1}, {0, 1}},
225*c8dee2aaSAndroid Build Coastguard Worker s1 = {{-2, 1}, {1, 1}};
226*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s0, s1) == 0);
227*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s1, s0) == 0);
228*c8dee2aaSAndroid Build Coastguard Worker }
229*c8dee2aaSAndroid Build Coastguard Worker { // One horizontal
230*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-1, 1}, {0, 0}},
231*c8dee2aaSAndroid Build Coastguard Worker s1 = {{-2, 1}, {1, 1}};
232*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s0, s1) == -1);
233*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s1, s0) == 1);
234*c8dee2aaSAndroid Build Coastguard Worker }
235*c8dee2aaSAndroid Build Coastguard Worker { // One vertical
236*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-1, 1}, {-1, 0}}, // Vertical
237*c8dee2aaSAndroid Build Coastguard Worker s1 = {{-2, 1}, {-1, 0}},
238*c8dee2aaSAndroid Build Coastguard Worker s2 = {{2, 1}, {-1, 0}};
239*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s0, s1) == 1);
240*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s1, s0) == -1);
241*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s0, s2) == -1);
242*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s2, s0) == 1);
243*c8dee2aaSAndroid Build Coastguard Worker }
244*c8dee2aaSAndroid Build Coastguard Worker
245*c8dee2aaSAndroid Build Coastguard Worker { // Equal slope
246*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-2, 1}, {0, 0}},
247*c8dee2aaSAndroid Build Coastguard Worker s1 = {{-4, 2}, {0, 0}};
248*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s0, s1) == 0);
249*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s1, s0) == 0);
250*c8dee2aaSAndroid Build Coastguard Worker }
251*c8dee2aaSAndroid Build Coastguard Worker
252*c8dee2aaSAndroid Build Coastguard Worker { // Equal slope
253*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{2, 1}, {0, 0}},
254*c8dee2aaSAndroid Build Coastguard Worker s1 = {{4, 2}, {0, 0}};
255*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s0, s1) == 0);
256*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s1, s0) == 0);
257*c8dee2aaSAndroid Build Coastguard Worker }
258*c8dee2aaSAndroid Build Coastguard Worker
259*c8dee2aaSAndroid Build Coastguard Worker {
260*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-2, 1}, {0, 0}},
261*c8dee2aaSAndroid Build Coastguard Worker s1 = {{4, 2}, {0, 0}};
262*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s0, s1) == -1);
263*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s1, s0) == 1);
264*c8dee2aaSAndroid Build Coastguard Worker }
265*c8dee2aaSAndroid Build Coastguard Worker
266*c8dee2aaSAndroid Build Coastguard Worker {
267*c8dee2aaSAndroid Build Coastguard Worker Segment s0 = {{-2, 1}, {0, 0}},
268*c8dee2aaSAndroid Build Coastguard Worker s1 = {{-3, 1}, {0, 0}};
269*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s0, s1) == 1);
270*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, compare_slopes(s1, s0) == -1);
271*c8dee2aaSAndroid Build Coastguard Worker }
272*c8dee2aaSAndroid Build Coastguard Worker }
273*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BO_rounded_point_less_than_segment_in_x_lower,reporter)274*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BO_rounded_point_less_than_segment_in_x_lower, reporter) {
275*c8dee2aaSAndroid Build Coastguard Worker { // Vertical segment
276*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{3, -50}, {3, 50}};
277*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_lower(s, {4, 7}));
278*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {3, 7}));
279*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {2, 7}));
280*c8dee2aaSAndroid Build Coastguard Worker }
281*c8dee2aaSAndroid Build Coastguard Worker { // Horizontal segment
282*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{-10, 3}, {10, 3}};
283*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_lower(s, {11, 3}));
284*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {10, 3}));
285*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {4, 3}));
286*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {-10, 3}));
287*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {-11, 3}));
288*c8dee2aaSAndroid Build Coastguard Worker }
289*c8dee2aaSAndroid Build Coastguard Worker { // Pass through {0, 0}
290*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{-100, -100}, {100, 100}};
291*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_lower(s, {1, 0}));
292*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {0, 0}));
293*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {-1, 0}));
294*c8dee2aaSAndroid Build Coastguard Worker }
295*c8dee2aaSAndroid Build Coastguard Worker { // Just left of {0, 0}, but still rounds to {0, 0}
296*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{-100, -100}, {199, 200}};
297*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_lower(s, {1, 0}));
298*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {0, 0}));
299*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {-1, 0}));
300*c8dee2aaSAndroid Build Coastguard Worker }
301*c8dee2aaSAndroid Build Coastguard Worker { // Just right of {0, 0}, but still rounds to {0, 0}
302*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{-100, -100}, {201, 200}};
303*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_lower(s, {1, 0}));
304*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {0, 0}));
305*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_lower(s, {-1, 0}));
306*c8dee2aaSAndroid Build Coastguard Worker }
307*c8dee2aaSAndroid Build Coastguard Worker }
308*c8dee2aaSAndroid Build Coastguard Worker
DEF_TEST(BO_rounded_point_less_than_segment_in_x_upper,reporter)309*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(BO_rounded_point_less_than_segment_in_x_upper, reporter) {
310*c8dee2aaSAndroid Build Coastguard Worker { // Vertical segment
311*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{3, -50}, {3, 50}};
312*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {4, 7}));
313*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {3, 7}));
314*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_upper(s, {2, 7}));
315*c8dee2aaSAndroid Build Coastguard Worker }
316*c8dee2aaSAndroid Build Coastguard Worker { // Horizontal segment
317*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{-10, 3}, {10, 3}};
318*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {11, 3}));
319*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {10, 3}));
320*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_upper(s, {4, 3}));
321*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_upper(s, {-10, 3}));
322*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_upper(s, {-11, 3}));
323*c8dee2aaSAndroid Build Coastguard Worker }
324*c8dee2aaSAndroid Build Coastguard Worker { // Pass through {0, 0}
325*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{-100, -100}, {100, 100}};
326*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {1, 0}));
327*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {0, 0}));
328*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_upper(s, {-1, 0}));
329*c8dee2aaSAndroid Build Coastguard Worker }
330*c8dee2aaSAndroid Build Coastguard Worker { // Just left of {0, 0}, but still rounds to {0, 0}
331*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{-100, -100}, {199, 200}};
332*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {1, 0}));
333*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {0, 0}));
334*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_upper(s, {-1, 0}));
335*c8dee2aaSAndroid Build Coastguard Worker }
336*c8dee2aaSAndroid Build Coastguard Worker { // Just right of {0, 0}, but still rounds to {0, 0}
337*c8dee2aaSAndroid Build Coastguard Worker Segment s = {{-100, -100}, {201, 200}};
338*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {1, 0}));
339*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, rounded_point_less_than_segment_in_x_upper(s, {0, 0}));
340*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(reporter, !rounded_point_less_than_segment_in_x_upper(s, {-1, 0}));
341*c8dee2aaSAndroid Build Coastguard Worker }
342*c8dee2aaSAndroid Build Coastguard Worker }
343