/*******************************************************************************
 * Copyright (c) 2005, 2007 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.tests.internal.databinding;

import java.util.LinkedList;
import java.util.List;

import junit.framework.TestCase;

import org.eclipse.core.internal.databinding.RandomAccessListIterator;

public class RandomAccessListIteratorTest extends TestCase {

	private List emptyList = new LinkedList();
	private RandomAccessListIterator rali0 = new RandomAccessListIterator(emptyList);
	private List listWithOne;
	private RandomAccessListIterator rali1;
	private List list;
	private RandomAccessListIterator raliN;
	
	protected void setUp() throws Exception {
		listWithOne = new LinkedList();
		listWithOne.add("Uno");
		rali1 = new RandomAccessListIterator(listWithOne);
		list = new LinkedList();
		list.add("One");
		list.add("Two");
		list.add("three");
		list.add("four");
		raliN = new RandomAccessListIterator(list);
	}

	public void testGet_emptyList() {
		try {
			rali0.get(0);
			fail("Should have thrown exception");
		} catch (IndexOutOfBoundsException e) {
			// success
		}
	}

	public void testGet_withOne() {
		try {
			assertEquals("Uno", "Uno", rali1.get(0));
			
			rali1.get(1);
			fail("Should have thrown IndexOutOfBoundsException");
		} catch (Exception e) {
			// success
		}
	}
	
	public void testGet_alreadyAtItem() {
		assertEquals("one", "One", raliN.get(0));
	}
	
	public void testGet_moveForward() throws Exception {
		assertEquals("three", "three", raliN.get(2));
	}
	
	public void testGet_moveBackward() throws Exception {
		raliN.next();
		raliN.next();
		assertEquals("one", "One", raliN.get(0));
	}
	
	public void testGet_getLast() throws Exception {
		assertEquals("four", "four", raliN.get(3));
	}
	
	public void testGet_indexTooHigh() throws Exception {
		try {
			raliN.get(4);
			fail("Should have thrown exception");
		} catch (IndexOutOfBoundsException e) {
			// success
		}
	}

	public void testGet_indexTooLow() throws Exception {
		try {
			raliN.get(-100);
			fail("Should have thrown exception");
		} catch (IndexOutOfBoundsException e) {
			// success
		}
	}

}
