/*
 * 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
 */
@SuppressWarnings({"unchecked", "rawtypes"})
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;
    }

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

}
