/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2011, Open Source Geospatial Foundation (OSGeo) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library 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 * Lesser General Public License for more details. */ package org.geotools.swing.event; import java.awt.Rectangle; import java.awt.event.MouseEvent; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import org.geotools.geometry.DirectPosition2D; import org.geotools.geometry.jts.ReferencedEnvelope; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.swing.testutils.MockMapPane; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; /** * Unit tests for MapMouseEvent. * * @author Michael Bedward * @since 8.0 * @source $URL$ * @version $Id$ */ public class MapMouseEventTest { private static final double TOL = 1.0e-6; // screen area with aspect 1:1 private static final Rectangle SCREEN = new Rectangle(100, 100); // world area with aspect 2:1 private static final ReferencedEnvelope WORLD = new ReferencedEnvelope( 149.0, 153.0, -33, -35, DefaultGeographicCRS.WGS84); private static final int x = SCREEN.width / 2; private static final int y = SCREEN.height / 2; private static final MockMapPane pane = new MockMapPane(); @Before public void setup() { pane.setScreenArea(SCREEN); pane.setDisplayArea(WORLD); } @Test public void getSource() { MapMouseEvent ev = createEvent(0, 0); assertEquals(pane, ev.getSource()); } @Test public void getWorldPos() { AffineTransform tr = pane.getMapContent().getViewport().getScreenToWorld(); Point2D p = new Point2D.Double(x, y); tr.transform(p, p); MapMouseEvent ev = createEvent(x, y); DirectPosition2D pos = ev.getWorldPos(); assertEquals(p.getX(), pos.x, TOL); assertEquals(p.getY(), pos.y, TOL); } @Test public void getEnvelopeByPixels() { AffineTransform tr = pane.getMapContent().getViewport().getScreenToWorld(); Rectangle2D screenRect = new Rectangle2D.Double(x - 0.5, y - 0.5, 1, 1); Rectangle2D expected = tr.createTransformedShape(screenRect).getBounds2D(); MapMouseEvent ev = createEvent(x, y); ReferencedEnvelope actual = ev.getEnvelopeByPixels(1); assertRect(expected, actual); } @Test public void getEnvelopeByWorld() { final double w = 0.1; AffineTransform tr = pane.getMapContent().getViewport().getScreenToWorld(); Point2D p = new Point2D.Double(x, y); tr.transform(p, p); Rectangle2D expected = new Rectangle2D.Double(p.getX() - w/2, p.getY() - w/2, w, w); MapMouseEvent ev = createEvent(x, y); ReferencedEnvelope actual = ev.getEnvelopeByWorld(0.1); assertRect(expected, actual); } private MapMouseEvent createEvent(int x, int y) { MouseEvent ev = new MouseEvent(pane, MouseEvent.MOUSE_PRESSED, 0L, 0, x, y, 1, false); MapMouseEvent mapEv = new MapMouseEvent(pane, ev); return mapEv; } private void assertRect(Rectangle2D expected, ReferencedEnvelope actual) { assertEquals(expected.getMinX(), actual.getMinX(), TOL); assertEquals(expected.getMaxX(), actual.getMaxX(), TOL); assertEquals(expected.getMinY(), actual.getMinY(), TOL); assertEquals(expected.getMaxY(), actual.getMaxY(), TOL); } }