1 | // License: GPL. For details, see LICENSE file.
|
---|
2 | package org.openstreetmap.josm.data.validation.tests
|
---|
3 |
|
---|
4 | import static org.openstreetmap.josm.data.osm.OsmUtils.createPrimitive
|
---|
5 |
|
---|
6 | import org.openstreetmap.josm.JOSMFixture
|
---|
7 | import org.openstreetmap.josm.data.osm.Relation
|
---|
8 | import org.openstreetmap.josm.data.osm.RelationMember
|
---|
9 | import org.openstreetmap.josm.data.osm.Way
|
---|
10 | import org.openstreetmap.josm.data.validation.TestError
|
---|
11 | import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
|
---|
12 |
|
---|
13 | class RelationCheckerTest extends GroovyTestCase {
|
---|
14 |
|
---|
15 | @Override
|
---|
16 | void setUp() {
|
---|
17 | JOSMFixture.createUnitTestFixture().init();
|
---|
18 | getRelationChecker()
|
---|
19 | }
|
---|
20 |
|
---|
21 | static def RelationChecker getRelationChecker() {
|
---|
22 | def checker = new RelationChecker()
|
---|
23 | TaggingPresets.readFromPreferences()
|
---|
24 | checker.initialize()
|
---|
25 | return checker
|
---|
26 | }
|
---|
27 |
|
---|
28 | static def List<TestError> testRelation(Relation r) {
|
---|
29 | def checker = getRelationChecker()
|
---|
30 | checker.visit(r)
|
---|
31 | return checker.getErrors()
|
---|
32 | }
|
---|
33 |
|
---|
34 | static def Relation createRelation(String tags) {
|
---|
35 | return (Relation) createPrimitive("relation "+ tags)
|
---|
36 | }
|
---|
37 |
|
---|
38 | void testUnknownType() {
|
---|
39 | def errors = testRelation(createRelation("type=foobar"))
|
---|
40 | assert errors.size() >= 1
|
---|
41 | assert errors.get(0).getMessage() == "Relation type is unknown"
|
---|
42 | }
|
---|
43 |
|
---|
44 | void testEmpty() {
|
---|
45 | def errors = testRelation(createRelation("type=multipolygon"))
|
---|
46 | assert errors.size() == 1
|
---|
47 | assert errors.get(0).getMessage() == "Relation is empty"
|
---|
48 | }
|
---|
49 |
|
---|
50 | void testNormal() {
|
---|
51 | def r = createRelation("type=multipolygon")
|
---|
52 | r.addMember(new RelationMember("outer", new Way()))
|
---|
53 | r.addMember(new RelationMember("inner", new Way()))
|
---|
54 | assert testRelation(r).isEmpty()
|
---|
55 | }
|
---|
56 |
|
---|
57 | void testOuter2() {
|
---|
58 | def r = createRelation("type=multipolygon")
|
---|
59 | r.addMember(new RelationMember("outer", new Way()))
|
---|
60 | r.addMember(new RelationMember("outer2", new Way()))
|
---|
61 |
|
---|
62 | def errors = testRelation(r)
|
---|
63 | assert errors.size() == 1
|
---|
64 | assert errors.get(0).getDescription() == "Role outer2 unknown in templates outer/inner"
|
---|
65 | }
|
---|
66 |
|
---|
67 | void testRestrictionViaMissing() {
|
---|
68 | def r = createRelation("type=restriction")
|
---|
69 | r.addMember(new RelationMember("from", new Way()))
|
---|
70 | r.addMember(new RelationMember("to", new Way()))
|
---|
71 |
|
---|
72 | def errors = testRelation(r)
|
---|
73 | assert errors.size() == 1
|
---|
74 | assert errors.get(0).getDescription() == "Role via missing"
|
---|
75 | }
|
---|
76 |
|
---|
77 | void testRestrictionViaRelation() {
|
---|
78 | def r = createRelation("type=restriction")
|
---|
79 | r.addMember(new RelationMember("from", new Way()))
|
---|
80 | r.addMember(new RelationMember("to", new Way()))
|
---|
81 | r.addMember(new RelationMember("via", new Relation()))
|
---|
82 |
|
---|
83 | def errors = testRelation(r)
|
---|
84 | assert errors.size() == 1
|
---|
85 | assert errors.get(0).getDescription() == "Role member type relation does not match accepted list of node/way in template Turn Restriction"
|
---|
86 | }
|
---|
87 |
|
---|
88 | void testRestrictionTwoFrom() {
|
---|
89 | def r = createRelation("type=restriction")
|
---|
90 | r.addMember(new RelationMember("from", new Way()))
|
---|
91 | r.addMember(new RelationMember("from", new Way()))
|
---|
92 | r.addMember(new RelationMember("to", new Way()))
|
---|
93 | r.addMember(new RelationMember("via", new Way()))
|
---|
94 |
|
---|
95 | def errors = testRelation(r)
|
---|
96 | assert errors.size() == 1
|
---|
97 | assert errors.get(0).getDescription() == "Number of from roles too high (2)"
|
---|
98 | }
|
---|
99 |
|
---|
100 | void testRestrictionEmpty() {
|
---|
101 | def r = createRelation("type=restriction")
|
---|
102 | r.addMember(new RelationMember("from", new Way()))
|
---|
103 | r.addMember(new RelationMember("to", new Way()))
|
---|
104 | r.addMember(new RelationMember("via", new Way()))
|
---|
105 | r.addMember(new RelationMember("", new Way()))
|
---|
106 |
|
---|
107 | def errors = testRelation(r)
|
---|
108 | assert errors.size() == 1
|
---|
109 | assert errors.get(0).getDescription().startsWith("Empty role type found when expecting one of")
|
---|
110 | }
|
---|
111 |
|
---|
112 | void testPowerMemberExpression() {
|
---|
113 | def r = createRelation("type=route route=power")
|
---|
114 | r.addMember(new RelationMember("", new Way()))
|
---|
115 |
|
---|
116 | def errors = testRelation(r)
|
---|
117 | assert errors.size() == 1
|
---|
118 | assert errors.get(0).getDescription() == "Role member does not match expression power in template Power Route"
|
---|
119 | }
|
---|
120 | }
|
---|