/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2004-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.factory.wms;
import java.util.Collection;
import org.opengis.metadata.citation.Citation;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CRSAuthorityFactory;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.crs.GeographicCRS;
import org.geotools.metadata.iso.citation.Citations;
import org.geotools.referencing.CRS;
import org.geotools.referencing.ReferencingFactoryFinder;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.geotools.referencing.factory.AbstractAuthorityFactory;
import org.geotools.referencing.factory.CachedCRSAuthorityDecorator;
import org.geotools.referencing.factory.IdentifiedObjectFinder;
import org.junit.*;
import static org.junit.Assert.*;
/**
* Tests {@link WebCRSFactory}.
*
* @source $URL$
* @version $Id$
* @author Martin Desruisseaux
*/
public final class CRSTest {
/**
* The factory to test.
*/
private WebCRSFactory factory;
/**
* Initializes the factory to test.
*/
@Before
public void setUp() {
factory = new WebCRSFactory();
}
/**
* Tests the registration in {@link ReferencingFactoryFinder}.
*/
@Test
public void testFactoryFinder() {
final Collection authorities = ReferencingFactoryFinder.getAuthorityNames();
assertTrue(authorities.contains("CRS"));
CRSAuthorityFactory found = ReferencingFactoryFinder.getCRSAuthorityFactory("CRS", null);
assertTrue(found instanceof WebCRSFactory);
}
/**
* Checks the authority names.
*/
@Test
public void testAuthority() {
final Citation authority = factory.getAuthority();
assertTrue (Citations.identifierMatches(authority, "CRS"));
assertFalse(Citations.identifierMatches(authority, "EPSG"));
assertFalse(Citations.identifierMatches(authority, "AUTO"));
assertFalse(Citations.identifierMatches(authority, "AUTO2"));
}
/**
* Tests the CRS:84 code.
*/
@Test
public void testCRS84() throws FactoryException {
GeographicCRS crs = factory.createGeographicCRS("CRS:84");
assertSame(crs, factory.createGeographicCRS("84"));
assertSame(crs, factory.createGeographicCRS("CRS84"));
assertSame(crs, factory.createGeographicCRS("CRS:CRS84"));
assertSame(crs, factory.createGeographicCRS("crs : crs84"));
assertNotSame(crs, factory.createGeographicCRS("CRS:83"));
assertFalse(DefaultGeographicCRS.WGS84.equals(crs));
assertTrue(CRS.equalsIgnoreMetadata(DefaultGeographicCRS.WGS84, crs));
}
/**
* Tests the CRS:83 code.
*/
@Test
public void testCRS83() throws FactoryException {
GeographicCRS crs = factory.createGeographicCRS("CRS:83");
assertSame(crs, factory.createGeographicCRS("83"));
assertSame(crs, factory.createGeographicCRS("CRS83"));
assertSame(crs, factory.createGeographicCRS("CRS:CRS83"));
assertNotSame(crs, factory.createGeographicCRS("CRS:84"));
assertFalse(CRS.equalsIgnoreMetadata(DefaultGeographicCRS.WGS84, crs));
}
/**
* Tests the {@link IdentifiedObjectFinder#find} method.
*/
@Test
public void testFind() throws FactoryException {
final GeographicCRS CRS84 = factory.createGeographicCRS("CRS:84");
final IdentifiedObjectFinder finder = factory.getIdentifiedObjectFinder(CoordinateReferenceSystem.class);
assertTrue("Newly created finder should default to full scan.", finder.isFullScanAllowed());
finder.setFullScanAllowed(false);
assertSame("Should find without the need for scan, since we can use the CRS:84 identifier.",
CRS84, finder.find(CRS84));
finder.setFullScanAllowed(true);
assertSame("Allowing scanning should not make any difference for this CRS84 instance.",
CRS84, finder.find(CRS84));
assertNotSame("Required condition for next test.", CRS84, DefaultGeographicCRS.WGS84);
assertFalse ("Required condition for next test.", CRS84.equals(DefaultGeographicCRS.WGS84));
assertTrue ("Required condition for next test.", CRS.equalsIgnoreMetadata(CRS84, DefaultGeographicCRS.WGS84));
finder.setFullScanAllowed(false);
assertNull("Should not find WGS84 without a full scan, since it doesn't contains the CRS:84 identifier.",
finder.find(DefaultGeographicCRS.WGS84));
finder.setFullScanAllowed(true);
assertSame("A full scan should allow us to find WGS84, since it is equals ignoring metadata to CRS:84.",
CRS84, finder.find(DefaultGeographicCRS.WGS84));
finder.setFullScanAllowed(false);
assertNull("The scan result should not be cached.",
finder.find(DefaultGeographicCRS.WGS84));
// --------------------------------------------------
// Same test than above, using a CRS created from WKT
// --------------------------------------------------
String wkt = "GEOGCS[\"WGS 84\",\n" +
" DATUM[\"WGS84\",\n" +
" SPHEROID[\"WGS 84\", 6378137.0, 298.257223563]],\n" +
" PRIMEM[\"Greenwich\", 0.0],\n" +
" UNIT[\"degree\", 0.017453292519943295]]";
CoordinateReferenceSystem search = CRS.parseWKT(wkt);
assertFalse("Required condition for next test.", CRS84.equals(search));
assertTrue ("Required condition for next test.", CRS.equalsIgnoreMetadata(CRS84, search));
finder.setFullScanAllowed(false);
assertNull("Should not find WGS84 without a full scan, since it doesn't contains the CRS:84 identifier.",
finder.find(search));
finder.setFullScanAllowed(true);
assertSame("A full scan should allow us to find WGS84, since it is equals ignoring metadata to CRS:84.",
CRS84, finder.find(search));
assertEquals("CRS:84", finder.findIdentifier(search));
}
/**
* Tests the {@link IdentifiedObjectFinder#find} method through a buffered authority factory.
* The objects found are expected to be cached.
*/
@Test
public void testBufferedFind() throws FactoryException {
final AbstractAuthorityFactory factory = new CachedCRSAuthorityDecorator(this.factory);
final GeographicCRS CRS84 = factory.createGeographicCRS("CRS:84");
final IdentifiedObjectFinder finder = factory.getIdentifiedObjectFinder(CoordinateReferenceSystem.class);
finder.setFullScanAllowed(false);
assertSame("Should find without the need for scan, since we can use the CRS:84 identifier.",
CRS84, finder.find(CRS84));
finder.setFullScanAllowed(false);
assertNull("Should not find WGS84 without a full scan, since it doesn't contains the CRS:84 identifier.",
finder.find(DefaultGeographicCRS.WGS84));
finder.setFullScanAllowed(true);
assertSame("A full scan should allow us to find WGS84, since it is equals ignoring metadata to CRS:84.",
CRS84, finder.find(DefaultGeographicCRS.WGS84));
finder.setFullScanAllowed(false);
assertSame("At the contrary of testFind(), the scan result should be cached.",
CRS84, finder.find(DefaultGeographicCRS.WGS84));
assertEquals("CRS:84", finder.findIdentifier(DefaultGeographicCRS.WGS84));
}
}