source: josm/trunk/test/unit/org/openstreetmap/josm/data/validation/tests/SelfIntersectingWayTest.java

Last change on this file was 18853, checked in by taylor.smock, 8 months ago

See #16567: Update to JUnit 5

This removes new JOSMTestRules() with no additional setup and most
JOSMFixture calls.

Removing the bare JOSMTestRules speeds up the test suite since there are two
fewer System.gc() calls per test.

  • Property svn:eol-style set to native
File size: 7.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.data.validation.tests;
3
4import static org.junit.jupiter.api.Assertions.assertEquals;
5import static org.junit.jupiter.api.Assertions.assertTrue;
6
7import java.util.ArrayList;
8import java.util.Arrays;
9import java.util.List;
10import java.util.stream.Collectors;
11import java.util.stream.IntStream;
12
13import org.junit.jupiter.api.Test;
14import org.junit.jupiter.params.ParameterizedTest;
15import org.junit.jupiter.params.provider.Arguments;
16import org.junit.jupiter.params.provider.MethodSource;
17import org.openstreetmap.josm.data.coor.LatLon;
18import org.openstreetmap.josm.data.osm.Node;
19import org.openstreetmap.josm.data.osm.OsmUtils;
20import org.openstreetmap.josm.data.osm.Way;
21
22/**
23 * JUnit Test of {@link SelfIntersectingWay} validation test.
24 */
25class SelfIntersectingWayTest {
26
27 private static List<Node> createNodes() {
28 List<Node> nodes = IntStream.range(0, 6).mapToObj(i -> new Node(i + 1)).collect(Collectors.toList());
29 nodes.get(0).setCoor(new LatLon(34.2680, 133.563));
30 nodes.get(1).setCoor(new LatLon(34.2509, 133.548));
31 nodes.get(2).setCoor(new LatLon(34.2446, 133.566));
32 nodes.get(3).setCoor(new LatLon(34.2681, 133.560));
33 nodes.get(4).setCoor(new LatLon(34.2656, 133.561));
34 nodes.get(5).setCoor(new LatLon(34.2655, 133.562));
35 return nodes;
36 }
37
38 /**
39 * Self-Intersection at inner node (not first / last).
40 */
41 @Test
42 void testUnclosedWayNormal() {
43 List<Node> nodes = createNodes();
44
45 Way w = (Way) OsmUtils.createPrimitive("way ");
46 List<Node> wayNodes = new ArrayList<>();
47 wayNodes.add(nodes.get(0));
48 wayNodes.add(nodes.get(1));
49 wayNodes.add(nodes.get(2));
50 wayNodes.add(nodes.get(1)); // problem
51 wayNodes.add(nodes.get(3));
52 wayNodes.add(nodes.get(4));
53 w.setNodes(wayNodes);
54 SelfIntersectingWay test = new SelfIntersectingWay();
55 test.visit(w);
56 assertEquals(1, test.getErrors().size());
57 assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(1)));
58 }
59
60 static List<Arguments> testOkInnerNode() {
61 // The first two are duplicates
62 return Arrays.asList(
63 Arguments.of("testUnclosedWayFirst - First node is identical to an inner node (\"P\"-Shape)",
64 new int[] {0, 1, 2, 0 /* problem */, 3, 4}),
65 Arguments.of("testUnclosedWayFirstRepeated - First node is identical to an inner node (\"P\"-Shape)",
66 new int[] {0, 1, 2, 0 /* problem */, 3, 4}),
67 Arguments.of("testUnclosedWayLast - Last node is identical to an inner node (\"b\"-Shape)",
68 new int[] {0, 1 /* problem */, 2, 3, 4, 1})
69 );
70 }
71
72 /**
73 * The starting or ending nodes are also an inner node.
74 * This is considered okay.
75 */
76 @ParameterizedTest(name = "{0}")
77 @MethodSource("testOkInnerNode")
78 void testUnclosedWayFirst(String description, int[] nodeIndex) {
79 List<Node> nodes = createNodes();
80
81 Way w = (Way) OsmUtils.createPrimitive("way ");
82 List<Node> wayNodes = new ArrayList<>(nodeIndex.length);
83 for (int i : nodeIndex) {
84 wayNodes.add(nodes.get(i));
85 }
86 w.setNodes(wayNodes);
87 SelfIntersectingWay test = new SelfIntersectingWay();
88 test.visit(w);
89 assertEquals(0, test.getErrors().size());
90 }
91
92 /**
93 * Both endpoints join at one inner node ("8"-shape).
94 * This is considered to be an error.
95 */
96 @Test
97 void testClosedWay() {
98 List<Node> nodes = createNodes();
99
100 Way w = (Way) OsmUtils.createPrimitive("way ");
101 List<Node> wayNodes = new ArrayList<>();
102 wayNodes.add(nodes.get(0));
103 wayNodes.add(nodes.get(1));
104 wayNodes.add(nodes.get(2));
105 wayNodes.add(nodes.get(0)); // problem
106 wayNodes.add(nodes.get(3));
107 wayNodes.add(nodes.get(4));
108 wayNodes.add(nodes.get(0));
109 w.setNodes(wayNodes);
110 SelfIntersectingWay test = new SelfIntersectingWay();
111 test.visit(w);
112 assertEquals(1, test.getErrors().size());
113 assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(0)));
114 }
115
116 /**
117 * Closed way contains a spike.
118 * This is considered to be an error.
119 */
120 @Test
121 void testSpikeWithStartInClosedWay() {
122 List<Node> nodes = createNodes();
123
124 Way w = (Way) OsmUtils.createPrimitive("way ");
125 List<Node> wayNodes = new ArrayList<>();
126 wayNodes.add(nodes.get(0));
127 wayNodes.add(nodes.get(1));
128 wayNodes.add(nodes.get(0)); // problem
129 wayNodes.add(nodes.get(3));
130 wayNodes.add(nodes.get(4));
131 wayNodes.add(nodes.get(0));
132 w.setNodes(wayNodes);
133 SelfIntersectingWay test = new SelfIntersectingWay();
134 test.visit(w);
135 assertEquals(1, test.getErrors().size());
136 assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(0)));
137 }
138
139 /**
140 * Closed way contains a spike.
141 * This is considered to be an error.
142 */
143 @Test
144 void testSpikeWithEndInClosedWay() {
145 List<Node> nodes = createNodes();
146
147 Way w = (Way) OsmUtils.createPrimitive("way ");
148 List<Node> wayNodes = new ArrayList<>();
149 wayNodes.add(nodes.get(0));
150 wayNodes.add(nodes.get(1));
151 wayNodes.add(nodes.get(2));
152 wayNodes.add(nodes.get(0)); // problem
153 wayNodes.add(nodes.get(3));
154 wayNodes.add(nodes.get(0));
155 w.setNodes(wayNodes);
156 SelfIntersectingWay test = new SelfIntersectingWay();
157 test.visit(w);
158 assertEquals(1, test.getErrors().size());
159 assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(0)));
160 }
161
162 /**
163 * Closed way contains a spike.
164 * This is considered to be an error.
165 */
166 @Test
167 void testSpikeInClosedWay() {
168 List<Node> nodes = createNodes();
169
170 Way w = (Way) OsmUtils.createPrimitive("way ");
171 List<Node> wayNodes = new ArrayList<>();
172 wayNodes.add(nodes.get(0));
173 wayNodes.add(nodes.get(1));
174 wayNodes.add(nodes.get(2));
175 wayNodes.add(nodes.get(3));
176 wayNodes.add(nodes.get(2));
177 wayNodes.add(nodes.get(0));
178 w.setNodes(wayNodes);
179 SelfIntersectingWay test = new SelfIntersectingWay();
180 test.visit(w);
181 assertEquals(1, test.getErrors().size());
182 assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(2)));
183 }
184
185 /**
186 * Closed way with barbell shape (a-b-c-a-d-e-f-d).
187 * This is considered to be an error.
188 */
189 @Test
190 void testClosedWayBarbell() {
191 List<Node> nodes = createNodes();
192
193 Way w = (Way) OsmUtils.createPrimitive("way ");
194 List<Node> wayNodes = new ArrayList<>();
195 wayNodes.add(nodes.get(0));
196 wayNodes.add(nodes.get(1));
197 wayNodes.add(nodes.get(2));
198 wayNodes.add(nodes.get(0));
199 wayNodes.add(nodes.get(3));
200 wayNodes.add(nodes.get(4));
201 wayNodes.add(nodes.get(5));
202 wayNodes.add(nodes.get(3));
203 w.setNodes(wayNodes);
204 SelfIntersectingWay test = new SelfIntersectingWay();
205 test.visit(w);
206 assertEquals(1, test.getErrors().size());
207 assertTrue(test.getErrors().iterator().next().getHighlighted().contains(nodes.get(3)));
208 }
209
210}
Note: See TracBrowser for help on using the repository browser.