// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.validation.tests; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.openstreetmap.josm.data.osm.OsmUtils.createPrimitive; import java.util.List; import org.junit.Before; import org.junit.Test; import org.openstreetmap.josm.JOSMFixture; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.data.validation.TestError; import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets; public class RelationCheckerTest { /** * Setup test. */ @Before public void setUp() { JOSMFixture.createUnitTestFixture().init(); getRelationChecker(); } private static RelationChecker getRelationChecker() { RelationChecker checker = new RelationChecker(); TaggingPresets.readFromPreferences(); checker.initialize(); return checker; } private static List<TestError> testRelation(Relation r) { RelationChecker checker = getRelationChecker(); checker.visit(r); return checker.getErrors(); } private static Relation createRelation(String tags) { return (Relation) createPrimitive("relation "+ tags); } @Test public void testUnknownType() { List<TestError> errors = testRelation(createRelation("type=foobar")); assertTrue(errors.size() >= 1); assertEquals("Relation type is unknown", errors.get(0).getMessage()); } @Test public void testEmpty() { List<TestError> errors = testRelation(createRelation("type=multipolygon")); assertEquals(1, errors.size()); assertEquals("Relation is empty", errors.get(0).getMessage()); } @Test public void testNormal() { Relation r = createRelation("type=multipolygon"); r.addMember(new RelationMember("outer", new Way())); r.addMember(new RelationMember("inner", new Way())); assertTrue(testRelation(r).isEmpty()); } @Test public void testOuter2() { Relation r = createRelation("type=multipolygon"); r.addMember(new RelationMember("outer", new Way())); r.addMember(new RelationMember("outer2", new Way())); List<TestError> errors = testRelation(r); assertEquals(1, errors.size()); assertEquals("Role 'outer2' unknown in templates 'outer/inner'", errors.get(0).getDescription()); } @Test public void testRestrictionViaMissing() { Relation r = createRelation("type=restriction"); r.addMember(new RelationMember("from", new Way())); r.addMember(new RelationMember("to", new Way())); List<TestError> errors = testRelation(r); assertEquals(1, errors.size()); assertEquals("Role 'via' missing", errors.get(0).getDescription()); } @Test public void testRestrictionViaRelation() { Relation r = createRelation("type=restriction"); r.addMember(new RelationMember("from", new Way())); r.addMember(new RelationMember("to", new Way())); r.addMember(new RelationMember("via", new Relation())); List<TestError> errors = testRelation(r); assertEquals(1, errors.size()); assertEquals("Type 'relation' of relation member with role 'via' does not match accepted types 'node/way' in template Turn Restriction", errors.get(0).getDescription()); } @Test public void testRestrictionTwoFrom() { Relation r = createRelation("type=restriction"); r.addMember(new RelationMember("from", new Way())); r.addMember(new RelationMember("from", new Way())); r.addMember(new RelationMember("to", new Way())); r.addMember(new RelationMember("via", new Way())); List<TestError> errors = testRelation(r); assertEquals(1, errors.size()); assertEquals("Number of 'from' roles too high (2)", errors.get(0).getDescription()); } @Test public void testRestrictionEmpty() { Relation r = createRelation("type=restriction"); r.addMember(new RelationMember("from", new Way())); r.addMember(new RelationMember("to", new Way())); r.addMember(new RelationMember("via", new Way())); r.addMember(new RelationMember("", new Way())); List<TestError> errors = testRelation(r); assertEquals(1, errors.size()); assertTrue(errors.get(0).getDescription().startsWith("Empty role type found when expecting one of")); } @Test public void testPowerMemberExpression() { Relation r = createRelation("type=route route=power"); r.addMember(new RelationMember("", new Way())); List<TestError> errors = testRelation(r); assertEquals(1, errors.size()); assertEquals("Role of relation member does not match expression 'power' in template Power Route", errors.get(0).getDescription()); } @Test public void testRouteMemberExpression() { Relation r = createRelation("type=route route=tram public_transport:version=2"); r.addMember(new RelationMember("", createPrimitive("way railway=tram"))); r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position tram=yes"))); r.addMember(new RelationMember("platform", createPrimitive("node public_transport=platform tram=yes"))); assertTrue(testRelation(r).isEmpty()); r.addMember(new RelationMember("", createPrimitive("way no-rail-way=yes"))); assertEquals(1, testRelation(r).size()); assertEquals("Role of relation member does not match expression 'railway' in template Public Transport Route (Rail)", testRelation(r).get(0).getDescription()); r.removeMember(3); r.addMember(new RelationMember("stop", createPrimitive("way no-rail-way=yes"))); assertEquals(1, testRelation(r).size()); assertEquals( "Type 'way' of relation member with role 'stop' does not match accepted types 'node' in template Public Transport Route (Rail)", testRelation(r).get(0).getDescription()); r.removeMember(3); r.addMember(new RelationMember("stop", createPrimitive("node public_transport=stop_position bus=yes"))); assertEquals(1, testRelation(r).size()); assertEquals("Role of relation member does not match expression 'public_transport=stop_position && "+ "(train=yes || subway=yes || monorail=yes || tram=yes || light_rail=yes)' in template Public Transport Route (Rail)", testRelation(r).get(0).getDescription()); } }