blob: 2a809c51efbce576bb6c37cc0d0b0465f03a51ad [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 v1.0, which accompanies this distribution
* and is available at http://www.eclipse.org/legal/epl-v10.html.
*
* Contributors:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.common.utility.tests.internal.deque;
import java.util.Arrays;
import org.eclipse.jpt.common.utility.deque.Deque;
import org.eclipse.jpt.common.utility.internal.ObjectTools;
import org.eclipse.jpt.common.utility.internal.deque.DequeTools;
import org.eclipse.jpt.common.utility.internal.deque.LinkedDeque;
import org.eclipse.jpt.common.utility.tests.internal.TestTools;
@SuppressWarnings("nls")
public class LinkedDequeTests
extends DequeTests
{
public LinkedDequeTests(String name) {
super(name);
}
@Override
Deque<String> buildDeque() {
return DequeTools.linkedDeque();
}
public void testConstructorInt_IAE() {
boolean exCaught = false;
try {
Deque<String> queue = DequeTools.linkedDeque(-3);
fail("bogus deque: " + queue);
} catch (IllegalArgumentException ex) {
exCaught = true;
}
assertTrue(exCaught);
}
public void testSize() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
String third = "third";
assertEquals(0, ((Integer) ObjectTools.execute(queue, "size")).intValue());
queue.enqueueTail(first);
queue.enqueueTail(second);
assertEquals(2, ((Integer) ObjectTools.execute(queue, "size")).intValue());
queue.enqueueTail(third);
assertEquals(3, ((Integer) ObjectTools.execute(queue, "size")).intValue());
queue.dequeueHead();
assertEquals(2, ((Integer) ObjectTools.execute(queue, "size")).intValue());
queue.dequeueHead();
queue.dequeueHead();
assertEquals(0, ((Integer) ObjectTools.execute(queue, "size")).intValue());
}
public void testSize_reverse() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
String third = "third";
assertEquals(0, ((Integer) ObjectTools.execute(queue, "size")).intValue());
queue.enqueueHead(first);
queue.enqueueHead(second);
assertEquals(2, ((Integer) ObjectTools.execute(queue, "size")).intValue());
queue.enqueueHead(third);
assertEquals(3, ((Integer) ObjectTools.execute(queue, "size")).intValue());
queue.dequeueTail();
assertEquals(2, ((Integer) ObjectTools.execute(queue, "size")).intValue());
queue.dequeueTail();
queue.dequeueTail();
assertEquals(0, ((Integer) ObjectTools.execute(queue, "size")).intValue());
}
public void testBuildElements() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
String third = "third";
queue.enqueueTail(first);
queue.enqueueTail(second);
queue.enqueueTail(third);
Object[] elements = new Object[] { first, second, third };
assertTrue(Arrays.equals(elements, ((Object[]) ObjectTools.execute(queue, "buildElements"))));
}
public void testBuildElements_reverse() {
Deque<String> queue = this.buildDeque();
String first = "first";
String second = "second";
String third = "third";
queue.enqueueHead(first);
queue.enqueueHead(second);
queue.enqueueHead(third);
Object[] elements = new Object[] { third, second, first };
assertTrue(Arrays.equals(elements, ((Object[]) ObjectTools.execute(queue, "buildElements"))));
}
public void testNodeCache_max() {
Deque<String> queue = new LinkedDeque<String>(2);
String first = "first";
String second = "second";
String third = "third";
String fourth = "fourth";
String fifth = "fifth";
Object factory = ObjectTools.get(queue, "nodeFactory");
this.verifyNodeCache(0, factory);
queue.enqueueTail(first);
this.verifyNodeCache(0, factory);
queue.enqueueTail(second);
queue.enqueueHead(third);
queue.enqueueHead(fourth);
queue.enqueueTail(fifth);
this.verifyNodeCache(0, factory);
assertNull(ObjectTools.get(factory, "cacheHead"));
queue.dequeueHead();
this.verifyNodeCache(1, factory);
queue.dequeueHead();
this.verifyNodeCache(2, factory);
queue.dequeueTail();
this.verifyNodeCache(2, factory);
queue.dequeueHead();
this.verifyNodeCache(2, factory);
queue.dequeueTail();
this.verifyNodeCache(2, factory);
queue.enqueueTail(first);
this.verifyNodeCache(1, factory);
queue.enqueueTail(second);
this.verifyNodeCache(0, factory);
queue.enqueueTail(third);
this.verifyNodeCache(0, factory);
}
public void testNodeCache_unlimited() {
Deque<String> queue = DequeTools.linkedDeque(-1);
String first = "first";
String second = "second";
String third = "third";
String fourth = "fourth";
String fifth = "fifth";
Object factory = ObjectTools.get(queue, "nodeFactory");
this.verifyNodeCache(0, factory);
queue.enqueueTail(first);
this.verifyNodeCache(0, factory);
queue.enqueueTail(second);
queue.enqueueHead(third);
queue.enqueueHead(fourth);
queue.enqueueTail(fifth);
this.verifyNodeCache(0, factory);
assertNull(ObjectTools.get(factory, "cacheHead"));
queue.dequeueHead();
this.verifyNodeCache(1, factory);
queue.dequeueHead();
this.verifyNodeCache(2, factory);
queue.dequeueTail();
this.verifyNodeCache(3, factory);
queue.dequeueHead();
this.verifyNodeCache(4, factory);
queue.dequeueTail();
this.verifyNodeCache(5, factory);
queue.enqueueTail(first);
this.verifyNodeCache(4, factory);
queue.enqueueTail(second);
this.verifyNodeCache(3, factory);
queue.enqueueTail(third);
this.verifyNodeCache(2, factory);
queue.enqueueTail(fourth);
this.verifyNodeCache(1, factory);
queue.enqueueTail(fifth);
this.verifyNodeCache(0, factory);
}
public void verifyNodeCache(int size, Object factory) {
assertEquals(size, ((Integer) ObjectTools.get(factory, "cacheSize")).intValue());
int nodeCount = 0;
for (Object node = ObjectTools.get(factory, "cacheHead"); node != null; node = ObjectTools.get(node, "next")) {
nodeCount++;
}
assertEquals(size, nodeCount);
}
public void testNodeToString() {
Deque<String> queue = DequeTools.linkedDeque();
String first = "first";
String second = "second";
String third = "third";
queue.enqueueTail(first);
queue.enqueueTail(second);
queue.enqueueHead(third);
Object head = ObjectTools.get(queue, "head");
assertTrue(head.toString().startsWith("LinkedDeque.Node"));
assertTrue(head.toString().endsWith("(third)"));
}
public void testSimpleNodeFactoryToString() {
Deque<String> queue = DequeTools.linkedDeque();
Object factory = ObjectTools.get(queue, "nodeFactory");
assertEquals("LinkedDeque.SimpleNodeFactory", factory.toString());
}
public void testCachingNodeFactoryToString() {
Deque<String> queue = DequeTools.linkedDeque(20);
Object factory = ObjectTools.get(queue, "nodeFactory");
assertTrue(factory.toString().startsWith("LinkedDeque.CachingNodeFactory"));
assertTrue(factory.toString().endsWith("(0)"));
}
public void testClone_caching() throws Exception {
LinkedDeque<String> original = DequeTools.linkedDeque(20);
original.enqueueTail("first");
LinkedDeque<String> clone = original.clone();
assertEquals(original.peekHead(), clone.peekHead());
assertEquals(original.dequeueHead(), clone.dequeueHead());
assertNotSame(original, clone);
assertTrue(original.isEmpty());
assertEquals(original.isEmpty(), clone.isEmpty());
original.enqueueTail("second");
assertFalse(original.isEmpty());
// clone should still be empty
assertTrue(clone.isEmpty());
Object factory = ObjectTools.get(original, "nodeFactory");
assertTrue(factory.toString().startsWith("LinkedDeque.CachingNodeFactory"));
}
public void testSerialization_caching() throws Exception {
Deque<String> original = DequeTools.linkedDeque(20);
original.enqueueTail("first");
Deque<String> clone = TestTools.serialize(original);
assertEquals(original.peekHead(), clone.peekHead());
assertEquals(original.dequeueHead(), clone.dequeueHead());
assertNotSame(original, clone);
assertTrue(original.isEmpty());
assertEquals(original.isEmpty(), clone.isEmpty());
original.enqueueTail("second");
assertFalse(original.isEmpty());
// clone should still be empty
assertTrue(clone.isEmpty());
Object factory = ObjectTools.get(original, "nodeFactory");
assertTrue(factory.toString().startsWith("LinkedDeque.CachingNodeFactory"));
}
}