/** 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 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 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));
 }
  /** 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());
  }