/** Test that the full list iterator contract is correct. */
  @Override
  public void testFullMapIterator() {
    if (!supportsFullIterator()) {
      return;
    }

    super.testFullMapIterator();

    final OrderedMapIterator<K, V> it = makeObject();
    final Map<K, V> map = getMap();

    assertEquals(true, it.hasNext());
    assertEquals(false, it.hasPrevious());
    final Set<K> set = new HashSet<K>();
    while (it.hasNext()) {
      // getKey
      final K key = it.next();
      assertSame("it.next() should equals getKey()", key, it.getKey());
      assertTrue("Key must be in map", map.containsKey(key));
      assertTrue("Key must be unique", set.add(key));

      // getValue
      final V value = it.getValue();
      if (!isGetStructuralModify()) {
        assertSame("Value must be mapped to key", map.get(key), value);
      }
      assertTrue("Value must be in map", map.containsValue(value));

      assertEquals(true, it.hasPrevious());

      verify();
    }
    while (it.hasPrevious()) {
      // getKey
      final Object key = it.previous();
      assertSame("it.previous() should equals getKey()", key, it.getKey());
      assertTrue("Key must be in map", map.containsKey(key));
      assertTrue("Key must be unique", set.remove(key));

      // getValue
      final Object value = it.getValue();
      if (!isGetStructuralModify()) {
        assertSame("Value must be mapped to key", map.get(key), value);
      }
      assertTrue("Value must be in map", map.containsValue(value));

      assertEquals(true, it.hasNext());

      verify();
    }
  }
  /** Test that the empty list iterator contract is correct. */
  @Override
  public void testEmptyMapIterator() {
    if (!supportsEmptyIterator()) {
      return;
    }

    super.testEmptyMapIterator();

    final OrderedMapIterator<K, V> it = makeEmptyIterator();
    assertEquals(false, it.hasPrevious());
    try {
      it.previous();
      fail();
    } catch (final NoSuchElementException ex) {
    }
  }