/* * 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.metadata; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.opengis.metadata.Identifier; import org.opengis.metadata.citation.Citation; import org.opengis.util.InternationalString; import org.geotools.util.SimpleInternationalString; import org.geotools.metadata.iso.citation.CitationImpl; import org.geotools.metadata.iso.citation.Citations; import org.junit.*; import static org.junit.Assert.*; /** * Tests the {@link PropertyAccessor} class. * * * @source $URL$ * @version $Id$ * @author Martin Desruisseaux */ public final class PropertyAccessorTest { /** * Creates a property accessor for the given citation. */ private static PropertyAccessor createPropertyAccessor(final Citation citation) { final Class<?> implementation = citation.getClass(); final Class<?> type = PropertyAccessor.getType(implementation, "org.opengis.metadata"); assertNotNull(type); return new PropertyAccessor(implementation, type); } /** * Tests the constructor. */ @Test public void testConstructor() { final Citation citation = Citations.EPSG; PropertyAccessor accessor; assertNull("No dummy interface expected.", PropertyAccessor.getType(citation.getClass(), "org.opengis.dummy")); accessor = createPropertyAccessor(citation); assertTrue("Count of 'get' methods.", accessor.count() >= 13); } /** * Tests the {@code indexOf} and {code name} methods. */ @Test public void testName() { final Citation citation = Citations.EPSG; final PropertyAccessor accessor = createPropertyAccessor(citation); assertEquals("Non-existent property", -1, accessor.indexOf("dummy")); assertEquals("getTitle() property", "title", accessor.name(accessor.indexOf("title"))); assertEquals("getTitle() property", "title", accessor.name(accessor.indexOf("TITLE"))); assertEquals("getISBN() property", "ISBN", accessor.name(accessor.indexOf("ISBN"))); assertNull(accessor.name(-1)); } /** * Tests the get method. */ @Test public void testGet() { Citation citation = Citations.EPSG; final PropertyAccessor accessor = createPropertyAccessor(citation); final int index = accessor.indexOf("identifiers"); assertTrue(index >= 0); final Object identifiers = accessor.get(index, citation); assertNotNull(identifiers); assertTrue(containsEPSG(identifiers)); } /** * Returns {@code true} if the specified identifiers contains the {@code "EPSG"} code. */ static boolean containsEPSG(final Object identifiers) { assertTrue(identifiers instanceof Collection); @SuppressWarnings("unchecked") final Collection<Identifier> collection = (Collection) identifiers; for (final Identifier id : collection) { if (id.getCode().equals("EPSG")) { return true; } } return false; } /** * Tests the set method. */ @Test public void testSet() { Citation citation = new CitationImpl(); final PropertyAccessor accessor = createPropertyAccessor(citation); // Tries with ISBN, which expect a String. Object value = "Random number"; int index = accessor.indexOf("ISBN"); assertTrue(index >= 0); assertNull(accessor.set(index, citation, value)); assertSame(value, accessor.get(index, citation)); assertSame(value, citation.getISBN()); // Tries with the title. Automatic conversion from String to InternationalString expected. index = accessor.indexOf("title"); assertTrue(index >= 0); assertNull(accessor.set(index, citation, "A random title")); value = accessor.get(index, citation); assertTrue(value instanceof InternationalString); assertEquals("A random title", value.toString()); assertSame(value, citation.getTitle()); // Tries with an element to be added in a collection. index = accessor.indexOf("alternateTitle"); assertTrue(index >= 0); value = accessor.get(index, citation); assertTrue(value instanceof Collection); assertTrue(((Collection) value).isEmpty()); value = accessor.set(index, citation, "An other title"); assertTrue(value instanceof Collection); assertEquals(1, ((Collection) value).size()); value = accessor.set(index, citation, "Yet an other title"); assertTrue(value instanceof Collection); assertEquals(2, ((Collection) value).size()); } /** * Tests the shallow equals and copy methods. */ @Test public void testEquals() { Citation citation = Citations.EPSG; final PropertyAccessor accessor = createPropertyAccessor(citation); assertFalse(accessor.shallowEquals(citation, Citations.GEOTIFF, true )); assertFalse(accessor.shallowEquals(citation, Citations.GEOTIFF, false)); assertTrue (accessor.shallowEquals(citation, Citations.EPSG, false)); citation = new CitationImpl(); assertTrue (accessor.shallowCopy (Citations.EPSG, citation, true )); assertFalse(accessor.shallowEquals(citation, Citations.GEOTIFF, true )); assertFalse(accessor.shallowEquals(citation, Citations.GEOTIFF, false)); assertTrue (accessor.shallowEquals(citation, Citations.EPSG, false)); final int index = accessor.indexOf("identifiers"); final Object source = accessor.get(index, Citations.EPSG); final Object target = accessor.get(index, citation); assertNotNull(source); assertNotNull(target); assertNotSame(source, target); assertEquals (source, target); assertTrue(containsEPSG(target)); assertSame(target, accessor.set(index, citation, null)); final Object value = accessor.get(index, citation); assertNotNull(value); assertTrue(((Collection) value).isEmpty()); try { accessor.shallowCopy(citation, Citations.EPSG, true); fail("Citations.EPSG should be unmodifiable."); } catch (UnmodifiableMetadataException e) { // This is the expected exception. } } /** * Tests the hash code computation. */ @Test public void testHashCode() { final CitationImpl citation = new CitationImpl(); final PropertyAccessor accessor = createPropertyAccessor(citation); int hashCode = accessor.hashCode(citation); assertEquals("Empty metadata.", 0, hashCode); final String ISBN = "Dummy ISBN"; citation.setISBN(ISBN); hashCode = accessor.hashCode(citation); assertEquals("Metadata with a single String value.", ISBN.hashCode(), hashCode); final Set<Object> set = new HashSet<Object>(); assertEquals("By Set.hashCode() contract.", 0, set.hashCode()); assertTrue(set.add(ISBN)); assertEquals("Expected Metadata.hashCode() == Set.hashCode().", set.hashCode(), hashCode); final InternationalString title = new SimpleInternationalString("Dummy title"); citation.setTitle(title); hashCode = accessor.hashCode(citation); assertEquals("Metadata with two values.", ISBN.hashCode() + title.hashCode(), hashCode); assertTrue(set.add(title)); assertEquals("Expected Metadata.hashCode() == Set.hashCode().", set.hashCode(), hashCode); assertEquals("CitationsImpl.hashCode() should delegate.", hashCode, citation.hashCode()); final Collection<Object> values = citation.asMap().values(); assertEquals(hashCode, new HashSet<Object>(values).hashCode()); assertTrue(values.containsAll(set)); assertTrue(set.containsAll(values)); } }