/******************************************************************************
* Copyright (c) 2006, 2010 VMware Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Apache License v2.0 which accompanies this distribution.
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html and the Apache License v2.0
* is available at http://www.opensource.org/licenses/apache2.0.php.
* You may elect to redistribute this code under either of these licenses.
*
* Contributors:
* VMware Inc.
*****************************************************************************/
package org.eclipse.gemini.blueprint.internal.service.collection;
import java.util.List;
import java.util.ListIterator;
import java.util.NoSuchElementException;
import junit.framework.TestCase;
import org.eclipse.gemini.blueprint.service.importer.support.internal.collection.DynamicList;
/**
* @author Costin Leau
*
*/
public class DynamicListTest extends TestCase {
private List dynamicList;
private ListIterator iter;
protected void setUp() throws Exception {
dynamicList = new DynamicList();
iter = dynamicList.listIterator();
}
protected void tearDown() throws Exception {
dynamicList = null;
iter = null;
}
public void testAddWhileListIterating() throws Exception {
assertTrue(dynamicList.isEmpty());
assertFalse(iter.hasNext());
Object a = new Object();
dynamicList.add(a);
assertTrue(iter.hasNext());
assertFalse(iter.hasPrevious());
assertSame(a, iter.next());
assertFalse(iter.hasNext());
assertTrue(iter.hasPrevious());
assertSame(a, iter.previous());
}
public void testRemoveWhileListIterating() throws Exception {
assertTrue(dynamicList.isEmpty());
assertFalse(iter.hasNext());
Object a = new Object();
Object b = new Object();
Object c = new Object();
dynamicList.add(a);
dynamicList.add(b);
dynamicList.add(c);
assertTrue(iter.hasNext());
assertSame(a, iter.next());
// remove b
dynamicList.remove(b);
assertTrue(iter.hasNext());
assertSame(c, iter.next());
assertFalse(iter.hasNext());
assertSame(c, iter.previous());
// remove c
dynamicList.remove(c);
assertFalse(iter.hasNext());
assertTrue(iter.hasPrevious());
assertSame(a, iter.previous());
}
public void testRemovePreviouslyIteratedWhileIterating() throws Exception {
assertTrue(dynamicList.isEmpty());
assertFalse(iter.hasNext());
Object a = new Object();
Object b = new Object();
dynamicList.add(a);
dynamicList.add(b);
assertTrue(iter.hasNext());
assertSame(a, iter.next());
assertTrue(iter.hasNext());
dynamicList.remove(a);
// still have b
assertTrue(iter.hasNext());
assertFalse(iter.hasPrevious());
}
public void testListIteratorIndexes() throws Exception {
assertTrue(dynamicList.isEmpty());
assertFalse(iter.hasNext());
Object a = new Object();
Object b = new Object();
dynamicList.add(a);
dynamicList.add(b);
assertTrue(iter.hasNext());
assertEquals(0, iter.nextIndex());
assertEquals(-1, iter.previousIndex());
assertSame(a, iter.next());
assertEquals(1, iter.nextIndex());
assertEquals(0, iter.previousIndex());
dynamicList.remove(b);
assertEquals(1, iter.nextIndex());
assertEquals(0, iter.previousIndex());
assertSame(a, iter.previous());
assertEquals(0, iter.nextIndex());
assertEquals(-1, iter.previousIndex());
dynamicList.remove(a);
assertEquals(0, iter.nextIndex());
assertEquals(-1, iter.previousIndex());
}
public void testListIteratorAdd() {
Object a = new Object();
Object b = new Object();
Object c = new Object();
assertFalse(iter.hasNext());
assertFalse(iter.hasPrevious());
iter.add(a);
assertTrue(iter.hasNext());
assertFalse(iter.hasPrevious());
assertEquals(1, dynamicList.size());
iter.add(b);
assertEquals(2, dynamicList.size());
assertFalse(iter.hasPrevious());
iter.add(c);
assertEquals(3, dynamicList.size());
assertFalse(iter.hasPrevious());
assertSame(c, iter.next());
assertEquals(1, iter.nextIndex());
assertSame(b, iter.next());
assertTrue(iter.hasPrevious());
assertSame(a, iter.next());
}
public void testListIteratorHasNextHasPrevious() {
Object a = new Object();
dynamicList.add(a);
assertEquals(1, dynamicList.size());
// go forward and back
assertSame(iter.next(), iter.previous());
assertFalse(iter.hasPrevious());
assertSame(a, iter.next());
try {
iter.previous();
}
catch (NoSuchElementException nsee) {
// expected (since the previous hasPrevious returned false
}
assertTrue(iter.hasPrevious());
assertSame(iter.previous(), iter.next());
assertFalse(iter.hasNext());
}
public void testListIteratorNextIndexPreviousIndex() {
Object a = new Object();
assertEquals(-1, iter.previousIndex());
assertEquals(0, iter.nextIndex());
dynamicList.add(a);
iter.next();
assertEquals(0, iter.previousIndex());
assertEquals(dynamicList.size(), iter.nextIndex());
assertFalse(iter.hasNext());
iter.remove();
assertEquals(-1, iter.previousIndex());
assertEquals(dynamicList.size(), iter.nextIndex());
}
public void testListIteratorPreviousException() {
try {
iter.previous();
fail("should have thrown " + NoSuchElementException.class);
}
catch (NoSuchElementException ex) {
// expected
}
try {
iter.remove();
fail("should have thrown " + IndexOutOfBoundsException.class + " or one of its subclasses");
}
catch (IndexOutOfBoundsException ex) {
// expected
}
}
public void testListIteratorRemoveBetweenOperations() {
Object a = new Object();
Object b = new Object();
dynamicList.add(a);
iter.next();
iter.add(b);
try {
iter.remove();
fail("should have thrown " + IllegalStateException.class);
}
catch (IllegalStateException ex) {
// expected
}
Object o = iter.next();
iter.set(o);
iter.remove();
try {
iter.remove();
fail("should have thrown " + IllegalStateException.class);
}
catch (IllegalStateException ex) {
// expected
}
}
public void testListIteratorSetWithNext() {
Object a = new Object();
Object b = new Object();
Object c = new Object();
dynamicList.add(a);
try {
iter.set(c);
fail("should have thrown " + IllegalStateException.class);
}
catch (IllegalStateException ex) {
// expected
}
iter.next();
iter.set(b);
assertEquals(1, dynamicList.size());
assertSame(b, dynamicList.get(0));
assertFalse(iter.hasNext());
iter.set(c);
assertEquals(1, dynamicList.size());
assertSame(c, dynamicList.get(0));
assertFalse(iter.hasNext());
iter.add(b);
try {
iter.set(c);
fail("should have thrown " + IllegalStateException.class);
}
catch (IllegalStateException ex) {
// expected
}
assertTrue(iter.hasNext());
iter.next();
iter.set(c);
iter.remove();
try {
iter.set(c);
fail("should have thrown " + IllegalStateException.class);
}
catch (IllegalStateException ex) {
// expected
}
}
public void testListIteratorSetWithPrevious() {
Object a = new Object();
Object b = new Object();
Object c = new Object();
dynamicList.add(a);
try {
iter.set(c);
fail("should have thrown " + IllegalStateException.class);
}
catch (IllegalStateException ex) {
// expected
}
iter.next();
iter.previous();
iter.set(b);
assertEquals(1, dynamicList.size());
assertSame(b, dynamicList.get(0));
assertTrue(iter.hasNext());
// move forward and back
assertSame(iter.next(), iter.previous());
iter.set(c);
assertEquals(1, dynamicList.size());
assertSame(c, dynamicList.get(0));
assertTrue(iter.hasNext());
// move forward and back
assertSame(iter.next(), iter.previous());
iter.add(b);
try {
iter.set(c);
fail("should have thrown " + IllegalStateException.class);
}
catch (IllegalStateException ex) {
// expected
}
assertTrue(iter.hasNext());
// move forward and back
assertSame(iter.next(), iter.previous());
iter.set(c);
assertSame(c, dynamicList.get(1));
iter.remove();
try {
iter.set(c);
fail("should have thrown " + IllegalStateException.class);
}
catch (IllegalStateException ex) {
// expected
}
assertSame(c, dynamicList.get(0));
}
}