// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.osm.visitor.paint; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import javax.imageio.ImageIO; import org.junit.Rule; import org.junit.Test; import org.junit.rules.Timeout; import org.openstreetmap.josm.JOSMFixture; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.data.Bounds; import org.openstreetmap.josm.data.osm.DataSet; import org.openstreetmap.josm.gui.NavigatableComponent; import org.openstreetmap.josm.gui.progress.NullProgressMonitor; import org.openstreetmap.josm.io.Compression; import org.openstreetmap.josm.io.OsmReader; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; /** * Abstract superclass of {@code StyledMapRendererPerformanceTest} and {@code WireframeMapRendererPerformanceTest}. */ public abstract class AbstractMapRendererPerformanceTestParent { private static final int IMG_WIDTH = 1400; private static final int IMG_HEIGHT = 1050; @SuppressFBWarnings(value = "MS_PKGPROTECT") protected static Graphics2D g; @SuppressFBWarnings(value = "MS_PKGPROTECT") protected static BufferedImage img; @SuppressFBWarnings(value = "MS_PKGPROTECT") protected static NavigatableComponent nc; private static DataSet dsRestriction; private static DataSet dsMultipolygon; private static DataSet dsCity; /** * Global timeout applied to all test methods. */ @Rule @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") public Timeout globalTimeout = Timeout.seconds(15*60); protected static void load() throws Exception { JOSMFixture.createPerformanceTestFixture().init(true); img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB); g = (Graphics2D) img.getGraphics(); g.setClip(0, 0, IMG_WIDTH, IMG_WIDTH); g.setColor(Color.BLACK); g.fillRect(0, 0, IMG_WIDTH, IMG_WIDTH); nc = Main.map.mapView; nc.setBounds(0, 0, IMG_WIDTH, IMG_HEIGHT); try ( InputStream fisR = new FileInputStream("data_nodist/restriction.osm"); InputStream fisM = new FileInputStream("data_nodist/multipolygon.osm"); InputStream fisC = Compression.getUncompressedFileInputStream(new File("data_nodist/neubrandenburg.osm.bz2")); ) { dsRestriction = OsmReader.parseDataSet(fisR, NullProgressMonitor.INSTANCE); dsMultipolygon = OsmReader.parseDataSet(fisM, NullProgressMonitor.INSTANCE); dsCity = OsmReader.parseDataSet(fisC, NullProgressMonitor.INSTANCE); } } protected static void clean() throws Exception { g = null; img = null; nc = null; dsRestriction = null; dsMultipolygon = null; dsCity = null; } protected abstract Rendering buildRenderer(); protected final void test(int iterations, DataSet ds, Bounds bounds) throws Exception { Rendering visitor = buildRenderer(); nc.zoomTo(bounds); for (int i = 0; i < iterations; i++) { visitor.render(ds, true, bounds); } } @Test public void testRestriction() throws Exception { test(700, dsRestriction, new Bounds(51.12, 14.147472381591795, 51.128, 14.162492752075195)); } @Test public void testRestrictionSmall() throws Exception { test(1500, dsRestriction, new Bounds(51.125, 14.147, 51.128, 14.152)); } @Test public void testMultipolygon() throws Exception { test(400, dsMultipolygon, new Bounds(60, -180, 85, -122)); } @Test public void testMultipolygonSmall() throws Exception { test(850, dsMultipolygon, new Bounds(-90, -180, 90, 180)); } @Test public void testCity() throws Exception { test(50, dsCity, new Bounds(53.51, 13.20, 53.59, 13.34)); } @Test public void testCitySmall() throws Exception { test(70, dsCity, new Bounds(52, 11, 55, 14)); } @Test public void testCityPart1() throws Exception { test(250, dsCity, new Bounds(53.56, 13.25, 53.57, 13.26)); } @Test public void testCityPart2() throws Exception { test(200, dsCity, new Bounds(53.55, 13.29, 53.57, 13.30)); } @Test public void testCitySmallPart2() throws Exception { test(200, dsCity, new Bounds(53.56, 13.295, 53.57, 13.30)); } /** * run this manually to verify that the rendering is set up properly * @throws IOException if any I/O error occurs */ @SuppressFBWarnings(value = "UPM_UNCALLED_PRIVATE_METHOD") private void dumpRenderedImage() throws IOException { ImageIO.write(img, "png", new File("test-neubrandenburg.png")); } }