blob: bf05303b37dbaacbf59a4126a25ec6a651996e54 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 Oracle. All rights reserved.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0, which accompanies this distribution
* and is available at https://www.eclipse.org/legal/epl-2.0/.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.common.utility.tests.internal.deque;
import java.util.NoSuchElementException;
import org.eclipse.jpt.common.utility.deque.Deque;
import org.eclipse.jpt.common.utility.internal.ObjectTools;
import org.eclipse.jpt.common.utility.tests.internal.MultiThreadedTestCase;
import org.eclipse.jpt.common.utility.tests.internal.TestTools;
// subclass MultiThreadedTestCase for subclasses of this class
@SuppressWarnings("nls")
public abstract class DequeTests
extends MultiThreadedTestCase
{
public DequeTests(String name) {
super(name);
}
abstract Deque<String> buildDeque();
public void testIsEmpty() {
Deque<String> queue = this.buildDeque();
assertTrue(queue.isEmpty());
queue.enqueueTail("first");
assertFalse(queue.isEmpty());
queue.enqueueTail("second");
assertFalse(queue.isEmpty());
queue.enqueueHead("zero");
assertFalse(queue.isEmpty());
queue.dequeueHead();
assertFalse(queue.isEmpty());
queue.dequeueHead();
assertFalse(queue.isEmpty());
queue.dequeueTail();
assertTrue(queue.isEmpty());
}
public void testEnqueueTailAndDequeueHead() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
queue.enqueueTail(first);
queue.enqueueTail(second);
assertEquals(first, queue.dequeueHead());
assertEquals(second, queue.dequeueHead());
}
public void testEnqueueHeadAndDequeueTail() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
queue.enqueueHead(first);
queue.enqueueHead(second);
assertEquals(first, queue.dequeueTail());
assertEquals(second, queue.dequeueTail());
}
public void testEnqueueAndDequeue() {
Deque<String> queue = this.buildDeque();
String negative = "negative";
String zero = "zero";
String first = "first";
String second = "second";
queue.enqueueTail(first);
queue.enqueueTail(second);
queue.enqueueHead(zero);
queue.enqueueHead(negative);
assertEquals(negative, queue.dequeueHead());
assertEquals(second, queue.dequeueTail());
assertEquals(zero, queue.dequeueHead());
assertEquals(first, queue.dequeueTail());
assertTrue(queue.isEmpty());
}
public void testEnqueueTailAndPeekHead() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
queue.enqueueTail(first);
queue.enqueueTail(second);
assertEquals(first, queue.peekHead());
assertEquals(first, queue.peekHead());
assertEquals(first, queue.dequeueHead());
assertEquals(second, queue.peekHead());
assertEquals(second, queue.peekHead());
assertEquals(second, queue.dequeueHead());
}
public void testEnqueueHeadAndPeekTail() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
queue.enqueueHead(first);
queue.enqueueHead(second);
assertEquals(first, queue.peekTail());
assertEquals(first, queue.peekTail());
assertEquals(first, queue.dequeueTail());
assertEquals(second, queue.peekTail());
assertEquals(second, queue.peekTail());
assertEquals(second, queue.dequeueTail());
}
public void testEnqueueAndPeek() {
Deque<String> queue = this.buildDeque();
String negative = "negative";
String zero = "zero";
String first = "first";
String second = "second";
queue.enqueueTail(first);
queue.enqueueTail(second);
queue.enqueueHead(zero);
queue.enqueueHead(negative);
assertEquals(negative, queue.peekHead());
assertEquals(negative, queue.peekHead());
assertEquals(second, queue.peekTail());
assertEquals(second, queue.peekTail());
assertEquals(negative, queue.dequeueHead());
assertEquals(zero, queue.peekHead());
assertEquals(zero, queue.peekHead());
assertEquals(second, queue.peekTail());
assertEquals(second, queue.peekTail());
assertEquals(second, queue.dequeueTail());
assertEquals(zero, queue.peekHead());
assertEquals(first, queue.peekTail());
assertEquals(first, queue.dequeueTail());
assertEquals(zero, queue.peekHead());
assertEquals(zero, queue.peekTail());
assertEquals(zero, queue.dequeueTail());
assertTrue(queue.isEmpty());
}
public void testEmptyDequeExceptionPeekHead() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
queue.enqueueTail(first);
queue.enqueueTail(second);
assertEquals(first, queue.peekHead());
assertEquals(first, queue.dequeueHead());
assertEquals(second, queue.peekHead());
assertEquals(second, queue.dequeueHead());
boolean exCaught = false;
try {
queue.peekHead();
fail();
} catch (NoSuchElementException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
public void testEmptyDequeExceptionPeekTail() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
queue.enqueueHead(first);
queue.enqueueHead(second);
assertEquals(first, queue.peekTail());
assertEquals(first, queue.dequeueTail());
assertEquals(second, queue.peekTail());
assertEquals(second, queue.dequeueTail());
boolean exCaught = false;
try {
queue.peekTail();
fail();
} catch (NoSuchElementException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
public void testEmptyDequeExceptionDequeueHead() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
queue.enqueueTail(first);
queue.enqueueTail(second);
assertEquals(first, queue.peekHead());
assertEquals(first, queue.dequeueHead());
assertEquals(second, queue.peekHead());
assertEquals(second, queue.dequeueHead());
boolean exCaught = false;
try {
queue.dequeueHead();
fail();
} catch (NoSuchElementException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
public void testEmptyDequeExceptionDequeueTail() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
queue.enqueueHead(first);
queue.enqueueHead(second);
assertEquals(first, queue.peekTail());
assertEquals(first, queue.dequeueTail());
assertEquals(second, queue.peekTail());
assertEquals(second, queue.dequeueTail());
boolean exCaught = false;
try {
queue.dequeueTail();
fail();
} catch (NoSuchElementException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
public void testClone() {
Deque<String> queue = this.buildDeque();
queue.enqueueTail("first");
queue.enqueueTail("second");
queue.enqueueTail("third");
@SuppressWarnings("unchecked")
Deque<String> clone = (Deque<String>) ObjectTools.execute(queue, "clone");
this.verifyClone(queue, clone);
}
public void testSerialization() throws Exception {
Deque<String> queue = this.buildDeque();
queue.enqueueTail("first");
queue.enqueueTail("second");
queue.enqueueTail("third");
this.verifyClone(queue, TestTools.serialize(queue));
}
protected void verifyClone(Deque<String> original, Deque<String> clone) {
assertNotSame(original, clone);
assertEquals(original.peekHead(), clone.peekHead());
assertEquals(original.dequeueHead(), clone.dequeueHead());
assertEquals(original.peekHead(), clone.peekHead());
assertEquals(original.dequeueHead(), clone.dequeueHead());
assertEquals(original.isEmpty(), clone.isEmpty());
assertEquals(original.peekTail(), clone.peekTail());
assertEquals(original.dequeueTail(), clone.dequeueTail());
assertTrue(original.isEmpty());
assertEquals(original.isEmpty(), clone.isEmpty());
original.enqueueTail("fourth");
assertFalse(original.isEmpty());
// clone should still be empty
assertTrue(clone.isEmpty());
}
public void testToString() throws Exception {
Deque<String> queue = this.buildDeque();
assertEquals("[]", queue.toString());
queue.enqueueTail("first");
assertEquals("[first]", queue.toString());
queue.enqueueTail("second");
assertEquals("[first, second]", queue.toString());
queue.enqueueTail("third");
assertEquals("[first, second, third]", queue.toString());
queue.enqueueHead("foo");
assertEquals("[foo, first, second, third]", queue.toString());
}
}