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

public class MyQueueImpl12Tester {
	private static final int N = 100;

	@Test public void testEnqueueDequeueSimple () {
		QueueImpl12 list = new QueueImpl12(3);
		Assert.assertTrue(list.enqueue(1));
		Assert.assertTrue(list.enqueue(2));
		Assert.assertTrue(list.enqueue(3));
		Assert.assertTrue(list.dequeue().equals(1));
		Assert.assertTrue(list.dequeue().equals(2));
		Assert.assertTrue(list.dequeue().equals(3));

		System.out.println("testEnqueueDequeueSimple: +2");
	}

	@Test public void testSizeCapacity () {
		QueueImpl12 list = new QueueImpl12(3);
		Assert.assertTrue(list.capacity() == 3);
		list.enqueue(1);
		list.enqueue(2);
		Assert.assertTrue(list.size() == 2);

		System.out.println("testSizeCapacity: +1");
	}

	@Test public void testExceptions () {
		QueueImpl12 list = new QueueImpl12(3);
		list.enqueue(1);
		list.enqueue(2);
		list.enqueue(3);
		Assert.assertFalse(list.enqueue(4));
		list.dequeue();
		list.dequeue();
		list.dequeue();
		try {
			list.dequeue();
		} catch (NoSuchElementException nsee) {
		}
		try {
			list.peek();
		} catch (NoSuchElementException nsee) {
		}
		System.out.println("testExceptions: +1");
	}

	@Test public void testClear () {
		QueueImpl12 list = new QueueImpl12(3);
		list.enqueue(1);
		list.enqueue(2);
		list.clear();
		Assert.assertTrue(list.size() == 0);
		list.enqueue(3);
		Assert.assertTrue(list.enqueue(4));
		Assert.assertTrue(list.size() == 2);
		Assert.assertTrue(list.dequeue().equals(3));
		Assert.assertTrue(list.dequeue().equals(4));
		Assert.assertTrue(list.size() == 0);
		System.out.println("testClear: +1");
	}

	@Test public void testEnqueueDequeueHeavy () {
		QueueImpl12 list = new QueueImpl12(97);
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < 20; j++) {  // relatively prime to 97
				list.enqueue(j);
			}
			Assert.assertTrue(list.size() == 20);
			for (int j = 0; j < 20; j++) {  // relatively prime to 97
				Assert.assertTrue(list.dequeue().equals(j));
			}
			Assert.assertTrue(list.size() == 0);
		}
		System.out.println("testEnqueueDequeueHeavy: +3");
	}
}
