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

Last change on this file since 14990 was 14990, checked in by GerdP, 5 years ago

see #17567: improve messages created by RelationChecker

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