Author: j16sdiz
Date: 2008-09-07 10:57:32 +0000 (Sun, 07 Sep 2008)
New Revision: 22512

Added:
   trunk/freenet/test/freenet/support/DoublyLinkedListImplTest.java
Log:
test case for DoublyLinkedListImpl (this fails! see next rev for fix)

Added: trunk/freenet/test/freenet/support/DoublyLinkedListImplTest.java
===================================================================
--- trunk/freenet/test/freenet/support/DoublyLinkedListImplTest.java            
                (rev 0)
+++ trunk/freenet/test/freenet/support/DoublyLinkedListImplTest.java    
2008-09-07 10:57:32 UTC (rev 22512)
@@ -0,0 +1,282 @@
+package freenet.support;
+
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+
+import junit.framework.TestCase;
+import freenet.support.DoublyLinkedListImpl.Item;
+
+public class DoublyLinkedListImplTest extends TestCase {
+       private static class T extends Item<T> {
+               int value;
+               boolean isClone;
+
+               T(int v) {
+                       value = v;
+               }
+
+               public T clone() {
+                       T c = new T(value);
+                       c.isClone = true;
+                       return c;
+               }
+
+               public String toString() {
+                       if (isClone)
+                               return "[" + value + "]";
+                       else
+                               return "(" + value + ")";
+               }
+
+               void assertV(int v) {
+                       assertEquals(v, value);
+               }
+
+               public void assertIsClone() {
+                       assertTrue("isClone", isClone);
+               }
+
+               public void assertIsNotClone() {
+                       assertFalse("isClone", isClone);
+               }
+       }
+
+       public void testForwardPushPop() {
+               DoublyLinkedList<T> list = new DoublyLinkedListImpl<T>();
+               list.push(new T(0));
+               list.push(new T(1));
+               list.push(new T(2));
+               list.push(new T(3));
+
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.pop()).assertV(3);
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.pop()).assertV(2);
+               assertFalse("isEmpty()", list.isEmpty());
+
+               // add again
+               list.push(new T(4));
+               list.push(new T(5));
+
+               ((T) list.pop()).assertV(5);
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.pop()).assertV(4);
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.pop()).assertV(1);
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.pop()).assertV(0);
+
+               assertTrue("isEmpty()", list.isEmpty());
+               assertNull("pop()", list.pop());
+       }
+
+       public void testForwardShiftUnshift() {
+               DoublyLinkedList<T> list = new DoublyLinkedListImpl<T>();
+               list.unshift(new T(0));
+               list.unshift(new T(1));
+               list.unshift(new T(2));
+               list.unshift(new T(3));
+
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.shift()).assertV(3);
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.shift()).assertV(2);
+               assertFalse("isEmpty()", list.isEmpty());
+
+               // add again
+               list.unshift(new T(4));
+               list.unshift(new T(5));
+
+               ((T) list.shift()).assertV(5);
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.shift()).assertV(4);
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.shift()).assertV(1);
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.shift()).assertV(0);
+
+               assertTrue("isEmpty()", list.isEmpty());
+               assertNull("shift()", list.shift());
+       }
+
+       public void testClearSize() {
+               DoublyLinkedList<T> list = new DoublyLinkedListImpl<T>();
+               list.unshift(new T(0));
+               list.unshift(new T(1));
+               list.unshift(new T(2));
+               list.unshift(new T(3));
+
+               assertEquals("size()", 4, list.size());
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.shift()).assertV(3);
+               assertEquals("size()", 3, list.size());
+               assertFalse("isEmpty()", list.isEmpty());
+               ((T) list.shift()).assertV(2);
+               assertEquals("size()", 2, list.size());
+               assertFalse("isEmpty()", list.isEmpty());
+
+               list.clear();
+
+               assertEquals("size()", 0, list.size());
+               assertTrue("isEmpty()", list.isEmpty());
+
+               // add again
+               list.unshift(new T(4));
+               list.unshift(new T(5));
+               assertEquals("size()", 2, list.size());
+               assertFalse("isEmpty()", list.isEmpty());
+
+               ((T) list.shift()).assertV(5);
+               ((T) list.shift()).assertV(4);
+
+               assertEquals("size()", 0, list.size());
+               assertTrue("isEmpty()", list.isEmpty());
+       }
+
+       public void testClone() {
+               DoublyLinkedList<T> list = new DoublyLinkedListImpl<T>();
+               for (int i = 0; i < 3; i++) {
+                       list.unshift(new T(i));
+               }
+
+               DoublyLinkedList<T> listClone = list.clone();
+
+               for (int i = 2; i >= 0; i--) {
+                       T t = (T) list.shift();
+                       t.assertV(i);
+                       t.assertIsNotClone();
+
+                       T tc = (T) listClone.shift();
+                       tc.assertV(i);
+                       tc.assertIsClone();
+               }
+       }
+       
+       public void testShiftN() {
+               DoublyLinkedList<T> list = new DoublyLinkedListImpl<T>();
+
+               for (int i = 0; i < 5; i++) {
+                       list.push(new T(i));
+               }
+
+               DoublyLinkedList<T> list2 = list.shift(2);
+               assertEquals("list2.size()", 2, list2.size());
+               ((T) list2.shift()).assertV(0);
+               ((T) list2.shift()).assertV(1);
+               assertTrue("list2.isEmpty()", list2.isEmpty());
+
+               assertEquals("list.size()", 3, list.size());
+               ((T) list.shift()).assertV(2);
+               
+               list2 = list.shift(2);
+               assertTrue("list.isEmpty()", list.isEmpty());
+               ((T) list2.shift()).assertV(3);
+               ((T) list2.shift()).assertV(4);
+               assertTrue("list2.isEmpty()", list2.isEmpty());
+       }
+
+       public void testPopN() {
+               DoublyLinkedList<T> list = new DoublyLinkedListImpl<T>();
+
+               for (int i = 0; i < 5; i++) {
+                       list.unshift(new T(i));
+               }
+
+               DoublyLinkedList<T> list2 = list.pop(2);
+               assertEquals("list2.size()", 2, list2.size());
+               ((T) list2.pop()).assertV(0);
+               ((T) list2.pop()).assertV(1);
+               assertTrue("list2.isEmpty()", list2.isEmpty());
+
+               assertEquals("list.size()", 3, list.size());
+               ((T) list.pop()).assertV(2);
+               
+               list2 = list.pop(2);
+               assertTrue("list.isEmpty()", list.isEmpty());
+               ((T) list2.pop()).assertV(3);
+               ((T) list2.pop()).assertV(4);
+               assertTrue("list2.isEmpty()", list2.isEmpty());
+       }
+       
+       public void testHeadTail() {
+               DoublyLinkedList<T> list = new DoublyLinkedListImpl<T>();
+               
+               assertNull("head() == null", list.head());
+               assertNull("tail() == null", list.tail());
+               
+               T[] array = new T[5];
+               for (int i = 0; i < 5; i++) {
+                       array[i] = new T(i);
+                       list.push(array[i]);
+               }
+
+               assertTrue("head() == 0", array[0] == list.head());
+               assertTrue("tail() == 4", array[4] == list.tail());
+
+               list.shift();
+               assertTrue("head() == 1", array[1] == list.head());
+               assertTrue("tail() == 4", array[4] == list.tail());
+
+               list.pop();
+               assertTrue("head() == 1", array[1] == list.head());
+               assertTrue("tail() == 3", array[3] == list.tail());
+
+               list.clear();
+
+               assertNull("head() == null", list.head());
+               assertNull("tail() == null", list.tail());
+       }
+       
+       public void testIternator() {
+               DoublyLinkedList<T> list = new DoublyLinkedListImpl<T>();
+               T[] array = new T[5];
+
+               for (int i = 0; i < 5; i++) {
+                       array[i] = new T(i);
+                       list.push(array[i]);
+               }
+
+               // manual, forward
+               T h = (T) list.head();
+               for (int i = 0; i < 5; i++) {
+                       assertEquals("manual iternate, forward", array[i], h);
+                       //assertEquals("DoublyLinkedList.next() == 
Item.next()", h.getNext(), list.next(h));
+                       assertEquals("hasNext()", i != 4, list.hasNext(h));
+                       assertEquals("hasPrev()", i != 0, list.hasPrev(h));
+
+                       h.assertV(i);
+
+                       h = (T) list.next(h);
+               }
+               assertEquals("h==null", null, h);
+
+               // manual, reverse
+               T t = (T) list.tail();
+               for (int i = 4; i >= 0; i--) {
+                       assertEquals("manual iternate, reverse", array[i], t);
+                       //assertEquals("DoublyLinkedList.prev() == 
Item.getPrev()", tail.getPrev(), list.prev(tail));
+                       assertEquals("hasNext()", i != 4, list.hasNext(t));
+                       assertEquals("hasPrev()", i != 0, list.hasPrev(t));
+
+                       t.assertV(i);
+
+                       t = (T) list.prev(t);
+               }
+               assertNull("t==null", t);
+
+               Enumeration<T> e = list.elements();
+               for (int i = 0; i < 5; i++) {
+                       assertTrue("hasMoreElements()", e.hasMoreElements());
+
+                       T n = e.nextElement();
+                       n.assertV(i);
+
+                       assertEquals("hasMoreElements()", i != 4, 
e.hasMoreElements());
+               }
+               try {
+                       e.nextElement();
+                       fail("NoSuchElementException");
+               } catch (NoSuchElementException nsee) {
+               }
+       }
+}


Reply via email to