/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2007-2008, 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.referencing.cs; import javax.measure.unit.SI; import org.opengis.referencing.cs.AxisDirection; import org.opengis.referencing.cs.CoordinateSystem; import org.geotools.referencing.CRS; import org.junit.*; import static org.junit.Assert.*; /** * Tests the {@link CartesianCS} class. * * * * @source $URL$ * @version $Id$ * @author Martin Desruisseaux */ public final class DefaultCartesianCSTest { /** * Tests the creation of a cartesian CS with legal and illegal axis. */ @Test public void testAxis() { DefaultCartesianCS cs; try { cs = new DefaultCartesianCS("Test", DefaultCoordinateSystemAxis.LONGITUDE, DefaultCoordinateSystemAxis.LATITUDE); fail("Angular units should not be accepted."); } catch (IllegalArgumentException e) { // Expected exception: illegal angular units. } // Legal CS (the most usual one). cs = new DefaultCartesianCS("Test", DefaultCoordinateSystemAxis.EASTING, DefaultCoordinateSystemAxis.NORTHING); try { cs = new DefaultCartesianCS("Test", DefaultCoordinateSystemAxis.SOUTHING, DefaultCoordinateSystemAxis.NORTHING); fail("Colinear units should not be accepted."); } catch (IllegalArgumentException e) { // Expected exception: colinear axis. } // Legal CS rotated 45° cs = create(AxisDirection.NORTH_EAST, AxisDirection.SOUTH_EAST); try { cs = create(AxisDirection.NORTH_EAST, AxisDirection.EAST); fail("Non-perpendicular axis should not be accepted."); } catch (IllegalArgumentException e) { // Expected exception: non-perpendicular axis. } // Legal CS, but no perpendicularity check. cs = create(AxisDirection.NORTH_EAST, AxisDirection.UP); // Inconsistent axis direction. try { cs = new DefaultCartesianCS("Test", DefaultCoordinateSystemAxis.EASTING, new DefaultCoordinateSystemAxis("Northing", AxisDirection.SOUTH, SI.METER)); } catch (IllegalArgumentException e) { // Expected exception: inconsistent direction. } } /** * Tests {@link AbstractCS#standard} with cartesian CS, especially * the ones that leads to the creation of right-handed CS. */ @Test public void testStandard() { // ----------- Axis to test ------ Expected axis -- assertOrdered("East", "North", "East", "North"); assertOrdered("North", "East", "East", "North"); assertOrdered("South", "East", "East", "North"); assertOrdered("South", "West", "East", "North"); assertOrdered("East", "North"); assertOrdered("South-East", "North-East"); assertOrdered("North along 90 deg East", "North along 0 deg"); assertOrdered("North along 90 deg East", "North along 0 deg"); assertOrdered("North along 75 deg West", "North along 165 deg West"); assertOrdered("South along 90 deg West", "South along 0 deg"); assertOrdered("South along 180 deg", "South along 90 deg West"); assertOrdered("North along 130 deg West", "North along 140 deg East"); } /** * Creates an axis for testing purpose for the specified direction. */ private static DefaultCoordinateSystemAxis create(final AxisDirection direction) { if (direction.equals(AxisDirection.NORTH)) { return DefaultCoordinateSystemAxis.NORTHING; } if (direction.equals(AxisDirection.EAST)) { return DefaultCoordinateSystemAxis.EASTING; } if (direction.equals(AxisDirection.SOUTH)) { return DefaultCoordinateSystemAxis.SOUTHING; } if (direction.equals(AxisDirection.WEST)) { return DefaultCoordinateSystemAxis.WESTING; } return new DefaultCoordinateSystemAxis("Test", direction, SI.METER); } /** * Creates a coordinate system with the specified axis directions. */ private static DefaultCartesianCS create(final AxisDirection x, final AxisDirection y) { return new DefaultCartesianCS("Test", create(x), create(y)); } /** * Creates a coordinate system with the specified axis directions. */ private static DefaultCartesianCS create(final String x, final String y) { return create(DefaultCoordinateSystemAxis.getDirection(x), DefaultCoordinateSystemAxis.getDirection(y)); } /** * Tests ordering with a CS created from the specified axis. */ private static void assertOrdered(final String expectedX, final String expectedY) { assertOrdered(expectedY, expectedX, expectedX, expectedY); assertOrdered(expectedX, expectedY, expectedX, expectedY); } /** * Creates a cartesian CS using the provided test axis, invoke {@link AbstractCS#standard} * with it and compare with the expected axis. */ private static void assertOrdered(final String testX, final String testY, final String expectedX, final String expectedY) { final CoordinateSystem cs = AbstractCS.standard(create(testX, testY)); assertTrue(CRS.equalsIgnoreMetadata(create(expectedX, expectedY), cs)); } }