/* * Copyright (C) 2008 Steve Ratcliffe * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * * Author: Steve Ratcliffe * Create date: 02-Dec-2008 */ package uk.me.parabola.mkgmap.osmstyle; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import uk.me.parabola.imgfmt.app.Coord; import uk.me.parabola.imgfmt.app.net.GeneralRouteRestriction; import uk.me.parabola.mkgmap.general.MapCollector; import uk.me.parabola.mkgmap.general.MapLine; import uk.me.parabola.mkgmap.general.MapPoint; import uk.me.parabola.mkgmap.general.MapRoad; import uk.me.parabola.mkgmap.general.MapShape; import uk.me.parabola.mkgmap.reader.osm.OsmConverter; import uk.me.parabola.mkgmap.reader.osm.Style; import uk.me.parabola.mkgmap.reader.osm.Way; import uk.me.parabola.util.EnhancedProperties; import org.junit.Test; /** * High level tests of the complete converter chain, using an actual * rules file. */ public class StyledConverterTest { private static final String LOC = "classpath:teststyles"; private OsmConverter converter; private final List<MapLine> lines = new ArrayList<MapLine>(); @Test public void testConvertWay() throws FileNotFoundException { converter = makeConverter("simple"); Way way = makeWay(); way.addTag("highway", "primary"); way.addTag("x", "y"); converter.convertWay(way); converter.end(); assertEquals("line converted", 1, lines.size()); assertEquals("line from highway", 0x2, lines.get(0).getType()); } @Test public void testNullPointerFromSecondMatch() throws FileNotFoundException { converter = makeConverter("simple"); Way way = makeWay(); way.addTag("highway", "primary"); way.addTag("x", "z"); converter.convertWay(way); converter.end(); assertEquals("line converted", 1, lines.size()); assertEquals("line from x=y", 0x3, lines.get(0).getType()); } @Test public void testModifyingTagsInUse() throws FileNotFoundException { Way way = makeWay(); way.addTag("name", "bar"); way.addTag("highway", "other"); way.addTag("a", "z"); way.addTag("z", "z"); converter = makeConverter("simple"); converter.convertWay(way); converter.end(); assertEquals("line converted", 1, lines.size()); assertEquals("line", 0x12, lines.get(0).getType()); } /** * Test the overlay feature, when one line is duplicated with different * types. */ @Test public void testOverlay() throws FileNotFoundException { Way way = makeWay(); way.addTag("highway", "overlay"); converter = makeConverter("simple"); converter.convertWay(way); converter.end(); assertEquals("lines produced", 3, lines.size()); assertEquals("first line is 1", 1, lines.get(0).getType()); assertEquals("second line is 2", 2, lines.get(1).getType()); assertEquals("third line is 3", 3, lines.get(2).getType()); } /** * Test styles that are derived from others. Rules should behave as * if they were combined in order with the base rule last. * * This test contains the exact same rule that occurs in the base * style with a different type. It is the derived style type that we * should see. */ @Test public void testBaseStyle() throws FileNotFoundException { converter = makeConverter("derived"); Way way = makeWay(); way.addTag("overridden", "xyz"); converter.convertWay(way); // Now try a rule that is only in the base 'simple' file. way = makeWay(); way.addTag("highway", "primary"); converter.convertWay(way); converter.end(); assertEquals("lines converted", 2, lines.size()); assertEquals("derived type", 0x22, lines.get(0).getType()); assertEquals("from base style", 0x3, lines.get(1).getType()); } /** * The derived style has a rule that is not in the base style. Call with * a way that would match a rule in the base style and with the different * rule in the derived style. You should get the type from the derived * style. * @throws FileNotFoundException */ @Test public void testOverridePriority() throws FileNotFoundException { converter = makeConverter("derived"); Way way = makeWay(); way.addTag("highway", "other"); // this would match in the base way.addTag("derived", "first"); // this matches in the derived style converter.convertWay(way); converter.end(); assertEquals("lines converted", 1, lines.size()); assertEquals("derived type", 0x25, lines.get(0).getType()); } @Test public void testMultipleBase() throws FileNotFoundException { convertTag("a", "a"); assertEquals(1, lines.get(0).getType()); convertTag("b", "b"); assertEquals(1, lines.get(0).getType()); convertTag("c", "c"); assertEquals(1, lines.get(0).getType()); convertTag("d", "d"); assertEquals(1, lines.get(0).getType()); convertTag("override", "ab"); assertEquals(2, lines.get(0).getType()); for (String s : new String[]{"ac", "bc"}) { convertTag("override", s); assertEquals(3, lines.get(0).getType()); } for (String s : new String[]{"ad", "bd", "cd"}) { convertTag("override", s); assertEquals(4, lines.get(0).getType()); } } private Way convertTag(String key, String value) throws FileNotFoundException { lines.clear(); Way way = makeWay(); way.addTag(key, value); converter = makeConverter("d"); converter.convertWay(way); converter.end(); return way; } @Test public void testFileConflicts() throws FileNotFoundException { converter = makeConverter("waycombine"); Way w = makeWay(); w.addTag("highway", "pedestrian"); converter.convertWay(w); converter.end(); assertEquals("lines converted", 1, lines.size()); // In particular both 1 and 7 are wrong here. assertEquals("found pedestrian type", 6, lines.get(0).getType()); } @Test public void testFinalizer() throws FileNotFoundException { // test three ways // the first two ways should get the name "OK" by the finalize part // the third way should not be handled by the finalize part String[][] tests = new String[][] {{"residential","OK"}, {"track","OK"},{"secondary",null}}; for (String[] test : tests ) { // clear the lines list for each test lines.clear(); converter = makeConverter("finalize"); Way w = makeWay(); w.addTag("highway", test[0]); converter.convertWay(w); converter.end(); assertEquals("lines converted", 1, lines.size()); assertEquals("wrong name set by the finalize block", test[1], lines.get(0).getName()); } // check if continue works lines.clear(); converter = makeConverter("finalize"); Way w = makeWay(); w.addTag("highway", "trunk"); converter.convertWay(w); converter.end(); assertEquals("lines converted", 2, lines.size()); assertEquals("wrong name set by the finalize block", "OK", lines.get(0).getName()); assertEquals("wrong name set by the finalize block", null, lines.get(1).getName()); } private Way makeWay() { Way way = new Way(1); way.addPoint(new Coord(100, 100)); way.addPoint(new Coord(100, 102)); way.addPoint(new Coord(100, 103)); return way; } private StyledConverter makeConverter(String name) throws FileNotFoundException { Style style = new StyleImpl(LOC, name); MapCollector coll = new MapCollector() { public void addToBounds(Coord p) { } // could save points in the same way as lines to test them public void addPoint(MapPoint point) { } public void addLine(MapLine line) { // Save line so that it can be examined in the tests. assertNotNull("points are not null", line.getPoints()); lines.add(line); } public void addShape(MapShape shape) { } public void addRoad(MapRoad road) { lines.add(road); } public int addRestriction(GeneralRouteRestriction grr) { return 0; } public void addThroughRoute(int junctionNodeId, long roadIdA, long roadIdB) { } }; return new StyledConverter(style, coll, new EnhancedProperties()); } }