source: josm/trunk/test/unit/org/openstreetmap/josm/data/validation/tests/RelationCheckerTest.java@ 17946

Last change on this file since 17946 was 17946, checked in by Klumbumbus, 3 years ago

see #21048 - Fix unit test again

  • Property svn:eol-style set to native
File size: 8.3 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;
6import static org.openstreetmap.josm.data.osm.OsmUtils.createPrimitive;
7
8import java.util.List;
9
10import org.junit.jupiter.api.extension.RegisterExtension;
11import org.junit.jupiter.api.Test;
12import org.openstreetmap.josm.data.osm.Node;
13import org.openstreetmap.josm.data.osm.OsmUtils;
14import org.openstreetmap.josm.data.osm.Relation;
15import org.openstreetmap.josm.data.osm.RelationMember;
16import org.openstreetmap.josm.data.osm.Way;
17import org.openstreetmap.josm.data.validation.TestError;
18import org.openstreetmap.josm.testutils.JOSMTestRules;
19
20import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
21
22/**
23 * Unit tests of {@link RelationChecker} class.
24 */
25class RelationCheckerTest {
26 /**
27 * Setup test.
28 */
29 @RegisterExtension
30 @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
31 public JOSMTestRules rule = new JOSMTestRules().presets();
32
33 private static RelationChecker getRelationChecker() {
34 RelationChecker checker = new RelationChecker();
35 checker.initialize();
36 return checker;
37 }
38
39 private static List<TestError> testRelation(Relation r) {
40 RelationChecker checker = getRelationChecker();
41 checker.visit(r);
42 return checker.getErrors();
43 }
44
45 private static Relation createRelation(String tags) {
46 return (Relation) createPrimitive("relation "+ tags);
47 }
48
49 @Test
50 void testUnknownType() {
51 Relation r = createRelation("type=foobar");
52 r.addMember(new RelationMember("", new Way()));
53 List<TestError> errors = testRelation(r);
54
55 assertTrue(errors.size() >= 1);
56 assertEquals("Relation type is unknown", errors.get(0).getMessage());
57 }
58
59 @Test
60 void testEmpty() {
61 List<TestError> errors = testRelation(createRelation("type=multipolygon"));
62 assertEquals(1, errors.size());
63 assertEquals("Relation is empty", errors.get(0).getMessage());
64 }
65
66 @Test
67 void testNormal() {
68 Relation r = createRelation("type=multipolygon");
69 r.addMember(new RelationMember("outer", new Way()));
70 r.addMember(new RelationMember("inner", new Way()));
71 assertTrue(testRelation(r).isEmpty());
72 }
73
74 @Test
75 void testOuter2() {
76 Relation r = createRelation("type=multipolygon");
77 r.addMember(new RelationMember("outer", new Way()));
78 r.addMember(new RelationMember("outer2", new Way()));
79
80 List<TestError> errors = testRelation(r);
81 assertEquals(1, errors.size());
82 assertEquals("Role 'outer2' is not among expected values 'outer/inner'", errors.get(0).getDescription());
83 }
84
85 @Test
86 void testRestrictionViaMissing() {
87 Relation r = createRelation("type=restriction");
88 r.addMember(new RelationMember("from", new Way()));
89 r.addMember(new RelationMember("to", new Way()));
90
91 List<TestError> errors = testRelation(r);
92 assertEquals(1, errors.size());
93 assertEquals("Role 'via' missing", errors.get(0).getDescription());
94 }
95
96 @Test
97 void testRestrictionViaRelation() {
98 Relation r = createRelation("type=restriction");
99 r.addMember(new RelationMember("from", new Way()));
100 r.addMember(new RelationMember("to", new Way()));
101 r.addMember(new RelationMember("via", new Relation()));
102
103 List<TestError> errors = testRelation(r);
104 assertEquals(1, errors.size());
105 assertEquals("Type 'relation' of relation member with role 'via' does not match accepted types 'node/way' in preset Turn Restriction",
106 errors.get(0).getDescription());
107 }
108
109 @Test
110 void testRestrictionTwoFrom() {
111 Relation r = createRelation("type=restriction");
112 r.addMember(new RelationMember("from", new Way()));
113 r.addMember(new RelationMember("from", new Way()));
114 r.addMember(new RelationMember("to", new Way()));
115 r.addMember(new RelationMember("via", new Way()));
116
117 List<TestError> errors = testRelation(r);
118 assertEquals(1, errors.size());
119 assertEquals("Number of 'from' roles too high (2)", errors.get(0).getDescription());
120 }
121
122 @Test
123 void testRestrictionEmpty() {
124 Relation r = createRelation("type=restriction");
125 r.addMember(new RelationMember("from", new Way()));
126 r.addMember(new RelationMember("to", new Way()));
127 r.addMember(new RelationMember("via", new Way()));
128 r.addMember(new RelationMember("", new Way()));
129
130 List<TestError> errors = testRelation(r);
131 assertEquals(1, errors.size());
132 assertTrue(errors.get(0).getDescription().startsWith("Empty role found when expecting one of"));
133 }
134
135 @Test
136 void testPowerMemberExpression() {
137 Relation r = createRelation("type=route route=power");
138 r.addMember(new RelationMember("", new Way()));
139
140 List<TestError> errors = testRelation(r);
141 assertEquals(2, errors.size());
142 assertEquals("Role 'line' missing", errors.get(0).getDescription());
143 assertEquals("Empty role found when expecting one of 'line/substation'", errors.get(1).getDescription());
144 }
145
146 @Test
147 void testBuildingMemberExpression() {
148 Relation r = createRelation("type=building");
149 r.addMember(new RelationMember("outline", new Way()));
150 r.addMember(new RelationMember("part", new Way()));
151 r.addMember(new RelationMember("level_-12", new Relation())); // fails (old tagging schema, #21048)
152
153 List<TestError> errors = testRelation(r);
154 assertEquals(1, errors.size());
155 assertEquals("Role 'level_-12' is not among expected values 'outline/part/ridge/edge'",
156 errors.get(0).getDescription());
157 }
158
159 @Test
160 void testHikingRouteMembers() {
161 Relation r = createRelation("type=route route=hiking");
162 r.addMember(new RelationMember("", OsmUtils.createPrimitive("way highway=path")));
163 r.addMember(new RelationMember("route", OsmUtils.createPrimitive("way highway=path"))); // fails
164 r.addMember(new RelationMember("guidepost", new Node())); // fails
165
166 List<TestError> errors = testRelation(r);
167 assertEquals(2, errors.size());
168 assertEquals("Role of relation member does not match template expression 'information=guidepost' in preset Hiking Route",
169 errors.get(0).getDescription());
170 assertEquals("Role 'route' is not among expected values '<empty>/alternative/approach/excursion/connection/guidepost'",
171 errors.get(1).getDescription());
172 }
173
174 @Test
175 void testRouteMemberExpression() {
176 Relation r = createRelation("type=route route=tram public_transport:version=2");
177 r.addMember(new RelationMember("", createPrimitive("way railway=tram")));
178 r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position tram=yes")));
179 r.addMember(new RelationMember("platform", createPrimitive("node public_transport=platform tram=yes")));
180 assertTrue(testRelation(r).isEmpty());
181
182 r.addMember(new RelationMember("", createPrimitive("way no-rail-way=yes")));
183 assertEquals(1, testRelation(r).size());
184 assertEquals("Role of relation member does not match template expression 'railway' in preset Public Transport Route (Rail)",
185 testRelation(r).get(0).getDescription());
186
187 r.removeMember(3);
188 r.addMember(new RelationMember("stop", createPrimitive("way no-rail-way=yes")));
189 assertEquals(1, testRelation(r).size());
190 assertEquals(
191 "Type 'way' of relation member with role 'stop' does not match accepted types 'node' in preset Public Transport Route (Rail)",
192 testRelation(r).get(0).getDescription());
193
194 r.removeMember(3);
195 r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position bus=yes")));
196 assertEquals(1, testRelation(r).size());
197 assertEquals("Role of relation member does not match template expression 'public_transport=stop_position && "+
198 "(train=yes || subway=yes || monorail=yes || tram=yes || light_rail=yes)' in preset Public Transport Route (Rail)",
199 testRelation(r).get(0).getDescription());
200 }
201}
Note: See TracBrowser for help on using the repository browser.