/*
 * 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.
 */
package org.apache.commons.collections;

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

/**
 * Base class for tetsing Iterator interface
 * 
 * @author Morgan Delagrange
 */
public 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;
    }

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

        Iterator iter = makeEmptyIterator();
        assertTrue("hasNext() should return false for empty iterators",iter.hasNext() == false);
        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() == false) {
            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) {
	}
    }

}
