/*
* 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 org.geotools.swing.testutils.GraphicsTestBase;
import java.awt.Frame;
import java.awt.Dimension;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import org.fest.swing.core.KeyPressInfo;
import org.fest.swing.edt.GuiActionRunner;
import org.fest.swing.edt.GuiQuery;
import org.fest.swing.fixture.FrameFixture;
import static org.fest.swing.core.KeyPressInfo.*;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.swing.testutils.GraphicsTestRunner;
import org.geotools.swing.testutils.MockMapPane;
import org.opengis.geometry.Envelope;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.Ignore;
import static org.junit.Assert.*;
/**
* Unit tests for MapPaneKeyHandler. Requires graphics environment.
*
* @author Michael Bedward
* @since 8.0
*
* @source $URL$
* @version $Id$
*/
@RunWith(GraphicsTestRunner.class)
public class MapPaneKeyHandlerTest extends GraphicsTestBase<Frame> {
private static final long WAIT_TIMEOUT = 1000;
private static final int WIDTH = 200;
private static final int HEIGHT = 150;
private MapPaneKeyHandler handler;
private MockMapPane2 mapPane;
@Before
public void setup() {
TestFrame frame = GuiActionRunner.execute(new GuiQuery<TestFrame>(){
@Override
protected TestFrame executeInEDT() throws Throwable {
mapPane = new MockMapPane2();
mapPane.setName("pane");
handler = new MapPaneKeyHandler(mapPane);
mapPane.addKeyListener(handler);
TestFrame frame = new TestFrame(mapPane);
return frame;
}
});
windowFixture = new FrameFixture(frame);
((FrameFixture) windowFixture).show(new Dimension(WIDTH, HEIGHT));
}
@Test
public void scrollLeft() throws Exception {
assertScroll(MapPaneKeyHandler.Action.SCROLL_LEFT, 1, 0);
}
@Test
public void scrollRight() throws Exception {
assertScroll(MapPaneKeyHandler.Action.SCROLL_RIGHT, -1, 0);
}
@Test
public void scrollUp() throws Exception {
assertScroll(MapPaneKeyHandler.Action.SCROLL_UP, 0, 1);
}
@Test
public void scrollDown() throws Exception {
assertScroll(MapPaneKeyHandler.Action.SCROLL_DOWN, 0, -1);
}
@Ignore("problem with this test")
@Test
public void zoomIn() throws Exception {
ReferencedEnvelope startEnv = mapPane.getDisplayArea();
KeyPressInfo info = getKeyPressInfo(MapPaneKeyHandler.Action.ZOOM_IN);
windowFixture.panel("pane").pressAndReleaseKey(info);
assertTrue(mapPane.latch.await(WAIT_TIMEOUT, TimeUnit.MILLISECONDS));
ReferencedEnvelope endEnv = mapPane.getDisplayArea();
assertEquals(-1, sign(endEnv.getWidth() - startEnv.getWidth()));
}
private void assertScroll(MapPaneKeyHandler.Action action, int expectedDx, int expectedDy)
throws Exception {
KeyPressInfo info = getKeyPressInfo(action);
windowFixture.panel("pane").pressAndReleaseKey(info);
assertTrue(mapPane.latch.await(WAIT_TIMEOUT, TimeUnit.MILLISECONDS));
assertEquals(sign(expectedDx), sign(mapPane.dx));
assertEquals(sign(expectedDy), sign(mapPane.dy));
}
private int sign(int i) {
return (i < 0 ? -1 : (i > 0 ? 1 : 0));
}
private int sign(double d) {
return Double.compare(d, 0);
}
/**
* Looks up the key binding for an action and converts it to a FEST
* KeyPressInfo object.
*
* @param action the action
* @return a new KeyPressInfo object
*/
private KeyPressInfo getKeyPressInfo(MapPaneKeyHandler.Action action) {
KeyInfo keyId = handler.getBindingForAction(action);
return keyCode(keyId.getKeyCode()).modifiers(keyId.getModifiers());
}
/**
* A frame containing a mock map pane.
*/
private static class TestFrame extends JFrame {
public TestFrame(final MockMapPane mapPane) {
add(mapPane);
}
}
private static class MockMapPane2 extends MockMapPane {
CountDownLatch latch = new CountDownLatch(1);
ReferencedEnvelope env = new ReferencedEnvelope(0, 100, 0, 100, null);
int dx = 0;
int dy = 0;
private boolean gotReset = false;
@Override
public void moveImage(int dx, int dy) {
this.dx = dx;
this.dy = dy;
latch.countDown();
}
@Override
public ReferencedEnvelope getDisplayArea() {
return new ReferencedEnvelope(env);
}
@Override
public void setDisplayArea(Envelope envelope) {
this.env = new ReferencedEnvelope(envelope);
latch.countDown();
}
@Override
public void reset() {
gotReset = true;
latch.countDown();
}
}
}