Explorar o código

tests (87)
fix: JoinList#iterator

Ranides Atterwim %!s(int64=10) %!d(string=hai) anos
pai
achega
67ce87e95e

+ 33 - 43
assira/src/main/java/net/ranides/assira/collection/lists/JoinList.java

@@ -184,6 +184,7 @@ public class JoinList<T> extends AbstractSequentialList<T> implements Serializab
     private static final class JoinIterator<T> implements ListIterator<T> {
         
         private final ListIterator<List<T>> li;
+        private List<T> cc;
         private ListIterator<T> ci;
         private int csize;
         private int begin;
@@ -191,43 +192,40 @@ public class JoinList<T> extends AbstractSequentialList<T> implements Serializab
         public JoinIterator(List<List<T>> data, int index) {
             li = data.listIterator();
             csize = 0;
-            ci = null;
-            
-            if(index == 0) {
-                return;
-            }
-            
-            while(li.hasNext()) {
-                begin += csize;
-                index -= begin;
+			cc = Collections.emptyList();
+            ci = Collections.emptyListIterator();
+			
+			while(li.hasNext()) {
+				index -= csize;
+				begin += csize;
                 
-                List<T> list = li.next();
+				List<T> list = li.next();
                 csize = list.size();
-                
-                if(index < begin) {
-                    ci = list.listIterator(index - begin);
-                    return;
-                }
-            }
-            
-            throw new IndexOutOfBoundsException("index=" + index);
+				
+				if(index <= csize) {
+					cc = list;
+					ci = list.listIterator(index);
+					return;
+				}
+			}
+			throw new IndexOutOfBoundsException("index=" + index);
         }
 
         @Override
         public boolean hasNext() {
-            if(ci!=null && ci.hasNext()) {
+            if(ci.hasNext()) {
                 return true;
             }
             while(li.hasNext()) {
                 begin += csize;
                 List<T> list = li.next();
                 csize = list.size();
+				cc = list;
+				ci = list.listIterator();
                 if(csize>0) {
-                    ci = list.listIterator();
                     return true;
                 }
             }
-            ci = null;
             return false;
         }
 
@@ -241,25 +239,12 @@ public class JoinList<T> extends AbstractSequentialList<T> implements Serializab
 
         @Override
         public int nextIndex() {
-            return ci!=null ? begin + ci.nextIndex() : 0;
+            return begin + ci.nextIndex();
         }
 
         @Override
         public boolean hasPrevious() {
-            if(ci!=null && ci.hasPrevious()) {
-                return true;
-            }
-            while(li.hasPrevious()) {
-                begin -= csize;
-                List<T> list = li.previous();
-                csize = list.size();
-                if(csize > 0) {
-                    ci = list.listIterator();
-                    return true;
-                }
-            }
-            ci = null;
-            return false;
+            return begin>0 || ci.hasPrevious();
         }
 
         @Override
@@ -267,28 +252,33 @@ public class JoinList<T> extends AbstractSequentialList<T> implements Serializab
             if(!hasPrevious()) {
                 throw new NoSuchElementException();
             }
+			while(!ci.hasPrevious()) {
+                List<T> list = li.previous();
+				
+				if(cc == list) {
+					list = li.previous();
+				}
+				
+				csize = list.size();
+				begin -= csize;
+                ci = list.listIterator(list.size());
+			}
             return ci.previous();
         }
 
         @Override
         public int previousIndex() {
-            return ci!=null ? begin + ci.previousIndex() : -1;
+            return begin + ci.previousIndex();
         }
 
         @Override
         public void remove() {
-            if(ci==null) {
-                throw new IllegalStateException();
-            }
             ci.remove();
             csize--;
         }
 
         @Override
         public void set(T e) {
-            if(ci==null) {
-                throw new IllegalStateException();
-            }
             ci.set(e);
         }
 

+ 47 - 16
assira/src/test/java/net/ranides/assira/collection/lists/JoinListTest.java

@@ -7,12 +7,15 @@
 package net.ranides.assira.collection.lists;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.ListIterator;
 import net.ranides.assira.ContractTesters;
 import net.ranides.assira.collection.mockup.TMaps;
 import net.ranides.assira.collection.mockup.TPoint;
 import net.ranides.assira.test.TCollection;
+import org.junit.Ignore;
 import org.junit.Test;
-import static org.junit.Assert.*;
 
 /**
  *
@@ -24,22 +27,7 @@ public class JoinListTest {
 	
 	@Test
 	public void testContract() {
-		// @todo (assira #0) JoinList: test
-		
-		// to jest naprawdę na chama...
 		ContractTesters.runner()
-			.ignore("ListTester.basicIterator")
-			.ignore("ListTester.basicIteratorFrom")
-			.ignore("ListTester.basicLastIndexOf")
-			
-			.ignore("ListTester.basicSublist")
-			.ignore("ListTester.basicSublist_add")
-			.ignore("ListTester.basicSublist_addAll")
-			.ignore("ListTester.basicSublist_clear")
-			.ignore("ListTester.basicSublist_indexOf")
-			.ignore("ListTester.basicSublist_lastIndexOf")
-			.ignore("ListTester.basicSublist_set")
-			
 			.param("collection!", $var)
 			.function(new int[0], array -> {
 				JoinList<TPoint> ret = new JoinList<>();
@@ -47,6 +35,49 @@ public class JoinListTest {
 				return ret;
 			})
 			.run();
+		
+		ContractTesters.runner()
+			.param("collection!", $var)
+			.function(new int[0], array -> {
+				TPoint[] src = $var.list(array).values();
+				JoinList<TPoint> ret = new JoinList<>();
+				
+				List<TPoint> now = new ArrayList<>();
+				for(int i=0; i<src.length; i++) {
+					now.add(src[i]);
+					if(4 == i % 5) {
+						ret.join(now);
+						now = new ArrayList<>();
+					}
+				}
+				ret.join(now);
+				return ret;
+			})
+			.run();
+	}
+	
+	@Test
+	public void testIterator() {
+		JoinList<Integer> list = new JoinList<>();
+		list.join(Arrays.asList(1,2,3));
+		list.join(Arrays.asList(4,5,6,7));
+		list.join(Arrays.asList(8,9,10));
+		list.join(Arrays.asList(11));
+		
+		ListIterator<Integer> i = list.listIterator(11);
+		int c = 11;
+		while(i.hasPrevious()) {
+			c--;
+			Integer v = i.previous();
+			int pi = i.previousIndex();
+			int ni = i.nextIndex();
+
+			System.out.printf("%d[%d] = %d->%d%n", v, c, pi, ni);
+		}
+		System.out.printf("p = %s%n", i.hasPrevious());
+		System.out.printf("n = %s%n", i.hasNext());
+		System.out.printf("p = %s%n", i.hasPrevious());
+		System.out.printf("n = %s%n", i.hasNext());
 	}
 	
 }

+ 11 - 3
assira/src/test/java/net/ranides/assira/collection/suite/IteratorTester.java

@@ -6,6 +6,7 @@
  */
 package net.ranides.assira.collection.suite;
 
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.ListIterator;
 import java.util.NoSuchElementException;
@@ -63,24 +64,30 @@ public final class IteratorTester {
         assertEquals(index>0, iterator.hasPrevious());
         assertEquals(content.length>0, iterator.hasNext());
         
+//		System.err.printf("DATA = [%d] %s %n", index, Arrays.toString(content));
+//		System.err.printf(">>>>>>>>>>>>%n");
         for (int i=index; i<content.length; i++) {
             checkIndex(iterator, i);
             assertTrue(iterator.hasNext());
             assertEquals(content[i], iterator.next());
         }
-        
+//        System.err.printf("    * %d / %d%n", iterator.previousIndex(), iterator.nextIndex());
         assertFalse(iterator.hasNext());
+//		System.err.printf("    * %d / %d%n", iterator.previousIndex(), iterator.nextIndex());
         assertEquals(content.length>0, iterator.hasPrevious());
+//		System.err.printf("    * %d / %d%n", iterator.previousIndex(), iterator.nextIndex());
         assertThrows(NoSuchElementException.class, ()->
             iterator.next()
         );
-        
+//		System.err.printf("    * %d / %d%n", iterator.previousIndex(), iterator.nextIndex());
+//        System.err.printf("------------%n");
+		
         for (int i=content.length-1; i>=0; i--) {
             assertTrue(iterator.hasPrevious());
             assertEquals(content[i], iterator.previous());
             checkIndex(iterator, i);
         }
-        
+//        System.err.printf("<<<<<<<<<<<<%n");
         assertEquals(content.length>0, iterator.hasNext());
         assertFalse(iterator.hasPrevious());
         assertThrows(NoSuchElementException.class, ()->
@@ -102,6 +109,7 @@ public final class IteratorTester {
     }
     
     private static void checkIndex(ListIterator<?> iterator, int current) {
+//		System.err.printf("    - [%d]   %d  -> %d%n", current, iterator.previousIndex(), iterator.nextIndex());
         assertEquals(current, iterator.nextIndex());
         assertEquals(current-1, iterator.previousIndex());
     }