// CHECKSTYLE_OFF: Copyrighted to ASF
/*
 * Copyright 1999-2004 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
// CHECKSTYLE_ON
package com.google.gwt.emultest.java.util;

import java.util.Iterator;
import java.util.NoSuchElementException;

/** Base class for testing Iterator interface */
@SuppressWarnings("rawtypes")
abstract class TestIterator extends TestObject {

  public abstract Iterator makeEmptyIterator();

  public abstract Iterator makeFullIterator();

  /**
   * Whether or not we are testing an iterator that can be empty. Default is true.
   *
   * @return true if Iterators can be empty
   */
  public boolean supportsEmptyIterator() {
    return true;
  }

  /**
   * Whether or not we are testing an iterator that can contain elements. Default is true.
   *
   * @return true if Iterators can be empty
   */
  public boolean supportsFullIterator() {
    return true;
  }

  /**
   * Whether or not we are testing an iterator that supports remove. Default is true.
   *
   * @return true if Iterators can remove elements
   */
  public boolean supportsRemove() {
    return true;
  }

  /** Should throw a NoSuchElementException. */
  public void testEmptyIterator() {
    if (!supportsEmptyIterator()) {
      return;
    }

    Iterator iter = makeEmptyIterator();
    assertTrue("hasNext() should return false for empty iterators", !iter.hasNext());
    try {
      iter.next();
      fail("NoSuchElementException must be thrown when Iterator is exhausted");
    } catch (NoSuchElementException e) {
    }
  }

  /**
   * NoSuchElementException (or any other exception) should not be thrown for the first element.
   * NoSuchElementException must be thrown when hasNext() returns false
   */
  public void testFullIterator() {
    if (!supportsFullIterator()) {
      return;
    }

    Iterator iter = makeFullIterator();

    assertTrue("hasNext() should return true for at least one element", iter.hasNext());

    try {
      iter.next();
    } catch (NoSuchElementException e) {
      fail("Full iterators must have at least one element");
    }

    while (iter.hasNext()) {
      iter.next();
    }

    try {
      iter.next();
      fail("NoSuchElementException must be thrown when Iterator is exhausted");
    } catch (NoSuchElementException e) {
    }
  }
}
