/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2010-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.map;
import java.awt.Rectangle;
import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Unit tests for the viewport class.
*
* @author Michael Bedward
* @source $URL$
*/
public class MapViewportTest {
// World bounds with aspect ratio 1:1
private static final ReferencedEnvelope WORLD_1_1 = new ReferencedEnvelope(
150, 152, -33, -35, DefaultGeographicCRS.WGS84);
// Screen area with aspect ratio 1:1
private static final Rectangle SCREEN_1_1 = new Rectangle(100, 100);
// Screen area with aspect ratio 2:1
private static final Rectangle SCREEN_2_1 = new Rectangle(200, 100);
// Screen area with aspect ratio 1:2
private static final Rectangle SCREEN_1_2 = new Rectangle(100, 200);
private static final double TOL = 1.0e-6d;
@Test
public void defaultCtor() {
MapViewport vp = new MapViewport();
assertTrue(vp.isEmpty());
assertFalse(vp.isMatchingAspectRatio());
assertTrue(vp.getBounds().isEmpty());
assertTrue(vp.getScreenArea().isEmpty());
}
@Test
public void boundsCtor() {
MapViewport vp = new MapViewport(WORLD_1_1);
assertTrue(vp.isEmpty());
assertFalse(vp.isMatchingAspectRatio());
assertTrue(vp.getScreenArea().isEmpty());
assertTrue( WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL) );
}
@Test
public void booleanCtor() {
MapViewport vp = new MapViewport(true);
assertTrue(vp.isEmpty());
assertTrue(vp.isMatchingAspectRatio());
assertTrue(vp.getBounds().isEmpty());
assertTrue(vp.getScreenArea().isEmpty());
}
@Test
public void fullCtor() {
MapViewport vp = new MapViewport(WORLD_1_1, true);
assertTrue(vp.isEmpty());
assertTrue(vp.isMatchingAspectRatio());
assertTrue(vp.getScreenArea().isEmpty());
assertTrue( WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL) );
}
@Test
public void setBoundsNoAspectCorrection() {
MapViewport vp = new MapViewport();
vp.setScreenArea(SCREEN_2_1);
vp.setBounds(WORLD_1_1);
assertTrue( WORLD_1_1.boundsEquals2D(vp.getBounds(), TOL) );
}
@Test
public void setBoundsWithAspectCorrection_2_1() {
double w = WORLD_1_1.getWidth();
ReferencedEnvelope expected = new ReferencedEnvelope(
WORLD_1_1.getMinX() - w/2, WORLD_1_1.getMaxX() + w/2,
WORLD_1_1.getMinY(), WORLD_1_1.getMaxY(),
WORLD_1_1.getCoordinateReferenceSystem());
assertAspectCorrection(SCREEN_2_1, expected);
}
@Test
public void setBoundsWithAspectCorrection_1_2() {
double h = WORLD_1_1.getHeight();
ReferencedEnvelope expected = new ReferencedEnvelope(
WORLD_1_1.getMinX(), WORLD_1_1.getMaxX(),
WORLD_1_1.getMinY() - h/2, WORLD_1_1.getMaxY() + h/2,
WORLD_1_1.getCoordinateReferenceSystem());
assertAspectCorrection(SCREEN_1_2, expected);
}
private void assertAspectCorrection(Rectangle screenArea, ReferencedEnvelope expectedBounds) {
MapViewport vp = new MapViewport(WORLD_1_1, true);
vp.setScreenArea(screenArea);
assertTrue( expectedBounds.boundsEquals2D(vp.getBounds(), TOL) );
}
@Test
public void boundsChangeWithScreenArea() {
MapViewport vp = new MapViewport(true);
vp.setScreenArea(SCREEN_1_1);
vp.setBounds(WORLD_1_1);
vp.setScreenArea(SCREEN_2_1);
ReferencedEnvelope expectedBounds = new ReferencedEnvelope(
WORLD_1_1.getMinX(), WORLD_1_1.getMaxX() + WORLD_1_1.getWidth(),
WORLD_1_1.getMinY(), WORLD_1_1.getMaxY(),
WORLD_1_1.getCoordinateReferenceSystem());
assertTrue( expectedBounds.boundsEquals2D(vp.getBounds(), TOL));
}
}