1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.geometry.euclidean.twod;
18
19 import java.util.ArrayList;
20 import java.util.List;
21
22 import org.apache.commons.geometry.core.precision.DoublePrecisionContext;
23 import org.apache.commons.geometry.core.precision.EpsilonDoublePrecisionContext;
24 import org.junit.Assert;
25
26
27
28 public class LinecastChecker2D {
29
30 private static final double TEST_EPS = 1e-10;
31
32 private static final DoublePrecisionContext TEST_PRECISION =
33 new EpsilonDoublePrecisionContext(TEST_EPS);
34
35
36 private final Linecastable2D target;
37
38
39 private final List<ExpectedResult> expectedResults = new ArrayList<>();
40
41
42
43
44
45 LinecastChecker2D(final Linecastable2D target) {
46 this.target = target;
47 }
48
49
50
51
52
53
54 public LinecastChecker2D expectNothing() {
55 expectedResults.clear();
56
57 return this;
58 }
59
60
61
62
63
64
65
66
67 public LinecastChecker2D expect(final Vector2D point, final Vector2D normal) {
68 expectedResults.add(new ExpectedResult(point, normal));
69
70 return this;
71 }
72
73
74
75
76
77
78 public LinecastChecker2D and(final Vector2D point, final Vector2D normal) {
79 return expect(point, normal);
80 }
81
82
83
84
85
86
87 public void whenGiven(final Line line) {
88 checkLinecastResults(target.linecast(line), line);
89 checkLinecastFirstResult(target.linecastFirst(line), line);
90 }
91
92
93
94
95
96
97 public void whenGiven(final LineConvexSubset segment) {
98 final Line line = segment.getLine();
99
100 checkLinecastResults(target.linecast(segment), line);
101 checkLinecastFirstResult(target.linecastFirst(segment), line);
102 }
103
104
105
106
107
108 private void checkLinecastResults(final List<LinecastPoint2D> results, final Line line) {
109 Assert.assertNotNull("Linecast result list cannot be null", results);
110 Assert.assertEquals("Unexpected result size for linecast", expectedResults.size(), results.size());
111
112 for (int i = 0; i < expectedResults.size(); ++i) {
113 final LinecastPoint2D expected = toLinecastPoint(expectedResults.get(i), line);
114 final LinecastPoint2D actual = results.get(i);
115
116 if (!eq(expected, actual)) {
117 Assert.fail("Unexpected linecast point at index " + i + " expected " + expected +
118 " but was " + actual);
119 }
120 }
121 }
122
123
124
125
126
127 private void checkLinecastFirstResult(final LinecastPoint2D result, final Line line) {
128 if (expectedResults.isEmpty()) {
129 Assert.assertNull("Expected linecastFirst result to be null", result);
130 } else {
131 final LinecastPoint2D expected = toLinecastPoint(expectedResults.get(0), line);
132
133 Assert.assertNotNull("Expected linecastFirst result to not be null", result);
134
135 if (!eq(expected, result)) {
136 Assert.fail("Unexpected result from linecastFirst: expected " + expected +
137 " but was " + result);
138 }
139 }
140 }
141
142
143
144
145
146 public static LinecastChecker2D with(final Linecastable2D src) {
147 return new LinecastChecker2D(src);
148 }
149
150
151
152
153
154
155 private static boolean eq(final LinecastPoint2D a, final LinecastPoint2D b) {
156 return a.getPoint().eq(b.getPoint(), TEST_PRECISION) &&
157 a.getNormal().eq(b.getNormal(), TEST_PRECISION) &&
158 a.getLine().equals(b.getLine()) &&
159 TEST_PRECISION.eq(a.getAbscissa(), b.getAbscissa());
160 }
161
162
163
164
165
166
167
168 private static LinecastPoint2D toLinecastPoint(final ExpectedResult expected, final Line line) {
169 return new LinecastPoint2D(expected.getPoint(), expected.getNormal(), line);
170 }
171
172
173
174 private static final class ExpectedResult {
175 private final Vector2D point;
176 private final Vector2D normal;
177
178 ExpectedResult(final Vector2D point, final Vector2D normal) {
179 this.point = point;
180 this.normal = normal;
181 }
182
183 public Vector2D getPoint() {
184 return point;
185 }
186
187 public Vector2D getNormal() {
188 return normal;
189 }
190 }
191 }