import java.util.*;
import org.junit.Assert.*;
import org.junit.*;

public class MyDoublyLinkedList12Tester {
	private DoublyLinkedList12 _list = new DoublyLinkedList12();
	private static final int N = 100;

	@Test public void testAdd () {
		for (int i = 0; i < N; i++) {
			_list.add(new Integer(i));
		}
		for (int i = 0; i < N; i++) {
			Assert.assertTrue(_list.contains(i));
		}
		Assert.assertTrue(! _list.contains(N));
		System.out.println("+3 testAdd");
	}

	@Test public void testBackFront () {
		_list.add(2);
		_list.addToBack(3);
		_list.addToFront(1);
		Assert.assertTrue(_list.size() == 3);
		Assert.assertTrue(_list.get(0).equals(1));
		Assert.assertTrue(_list.get(1).equals(2));
		Assert.assertTrue(_list.get(2).equals(3));
		System.out.println("+1 testBackFront");
	}

	@Test public void testRemove () {
		for (int i = 0; i < N; i++) {
			_list.add(new Integer(i));
		}
		for (int i = 0; i < N; i++) {
			Assert.assertTrue(_list.removeFront().equals(new Integer(i)));
		}
		Assert.assertTrue(_list.size() == 0);

		System.out.println("+2 testRemove");
	}
	
	@Test public void testAddNull () {
		Assert.assertTrue(! _list.contains(null));
		_list.add(1);
		_list.add(null);
		_list.add(2);
		Assert.assertTrue(_list.contains(null));
		Assert.assertTrue(! _list.contains(3));
		Assert.assertTrue(_list.size() == 3);

		_list.clear();
		Assert.assertTrue(_list.size() == 0);
		
		System.out.println("+1 testRest");
	}

	@Test public void testIteratorBasic () {
		for (int i = 0; i < N; i++) {
			_list.add(new Integer(i));
		}
		Iterator iterator = _list.iterator();
		int i = 0;
		while (iterator.hasNext()) {
			Assert.assertTrue(iterator.next().equals(i++));
		}
		Assert.assertTrue(i == N);

		System.out.println("+2 testIteratorBasic");
	}

	@Test public void testIteratorRest () {
		for (int i = 0; i < N; i++) {
			_list.add(new Integer(i));
		}
		Iterator iterator = _list.iterator();
		try {
			iterator.remove();
			Assert.assertTrue(false);
		} catch (IllegalStateException ise) {
			Assert.assertTrue(true);
		}
		iterator = _list.iterator();

		int i = 0;
		while (iterator.hasNext()) {
			iterator.next();
			if (i++ % 2 == 0) {  // remove every other element
				iterator.remove();
			}
		}
		Assert.assertTrue(_list.size() == N/2);
		System.out.println("+1 testIteratorRest");
	}
}
