Forráskód Böngészése

new: AIntList#listIterator - default implementation
new: IntArrayList.IntArrayFragment - specialization
test (90)

Ranides Atterwim 10 éve
szülő
commit
2b5a3837ea

+ 187 - 189
assira/pom.xml

@@ -1,190 +1,188 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
-	<parent>
-		<groupId>net.ranides</groupId>
-		<artifactId>assira.common</artifactId>
-		<version>2.0.1</version>
-	</parent>
-	<name>assira</name>
-	<groupId>net.ranides</groupId>
-	<artifactId>assira</artifactId>
-	<version>2.0.1</version>
-	<packaging>jar</packaging>
-    
-	<profiles>
-		<profile>
-			<id>recent-coverage</id>
-			<build>
-				<plugins>
-					<plugin>
-						<groupId>org.jacoco</groupId>
-						<artifactId>jacoco-maven-plugin</artifactId>
-						<version>0.7.5.201505241946</version>
-						<configuration>
-							<excludes>
-								<exclude>net/ranides/assira/test/**</exclude>
-								
-								<!--  klasy dostatecznie przetestowane -->
-								
-								<exclude>net/ranides/assira/collection/maps/AMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/AMap$*</exclude>
-								<exclude>net/ranides/assira/collection/maps/IntMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/IntMap$*</exclude>
-								<exclude>net/ranides/assira/collection/maps/AIntMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/AIntMap$*</exclude>
-
-								<exclude>net/ranides/assira/collection/maps/ASortedMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/ASortedMap$*</exclude>
-								<exclude>net/ranides/assira/collection/maps/AIntSortedMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/AIntSortedMap$*</exclude>
-
-								<exclude>net/ranides/assira/collection/maps/AHashMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/AHashMap$*</exclude>
-								<exclude>net/ranides/assira/collection/maps/HashMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/HashMap$*</exclude>
-								<exclude>net/ranides/assira/collection/maps/IntHashMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/IntHashMap$*</exclude>
-
-								<exclude>net/ranides/assira/collection/maps/AVLTreeMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/AVLTreeMap$*</exclude>
-								<exclude>net/ranides/assira/collection/maps/IntAVLTreeMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/IntAVLTreeMap$*</exclude>
-
-								<exclude>net/ranides/assira/collection/maps/RBTreeMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/RBTreeMap$*</exclude>
-								<exclude>net/ranides/assira/collection/maps/IntRBTreeMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/IntRBTreeMap$*</exclude>
-
-								<exclude>net/ranides/assira/collection/maps/CustomMap.class</exclude>
-								<exclude>net/ranides/assira/collection/maps/IdentMap.class</exclude>
-
-								<exclude>net/ranides/assira/collection/sets/ASet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/AIntSet.class</exclude>
-
-								<exclude>net/ranides/assira/collection/sets/ASortedSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/ASortedSet$*</exclude>
-								<exclude>net/ranides/assira/collection/sets/AIntSortedSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/AIntSortedSet$*</exclude>
-
-								<exclude>net/ranides/assira/collection/sets/AHashSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/AHashSet$*</exclude>
-								<exclude>net/ranides/assira/collection/sets/HashSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/IntHashSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/IntHashSet$*</exclude>
-
-								<exclude>net/ranides/assira/collection/sets/AVLTreeSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/AVLTreeSet$*</exclude>
-								<exclude>net/ranides/assira/collection/sets/IntAVLTreeSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/IntAVLTreeSet$*</exclude>
-
-								<exclude>net/ranides/assira/collection/sets/RBTreeSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/RBTreeSet$*</exclude>
-								<exclude>net/ranides/assira/collection/sets/IntRBTreeSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/IntRBTreeSet$*</exclude>
-
-								<exclude>net/ranides/assira/collection/sets/CustomSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/IdentSet.class</exclude>
-								<exclude>net/ranides/assira/collection/sets/AIdentSet.class</exclude>
-                                
-								<exclude>net/ranides/assira/collection/lookups/Lookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/Lookup$*</exclude>
-								<exclude>net/ranides/assira/collection/lookups/ALookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/ALookup$*</exclude>
-								<exclude>net/ranides/assira/collection/lookups/ASortedLookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/ASortedLookup$*</exclude>
-                                
-								<exclude>net/ranides/assira/collection/lookups/AHashLookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/AHashLookup$*</exclude>
-                                
-								<exclude>net/ranides/assira/collection/lookups/AVLTreeLookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/AVLTreeLookup$*</exclude>
-								<exclude>net/ranides/assira/collection/lookups/RBTreeLookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/RBTreeLookup$*</exclude>
-                                
-								<exclude>net/ranides/assira/collection/lookups/CustomLookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/HashLookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/IdentLookup.class</exclude>
-                                
-								<exclude>net/ranides/assira/collection/lookups/AHashLookup.class</exclude>
-								<exclude>net/ranides/assira/collection/lookups/AHashLookup$*</exclude>
-                                
-								<exclude>net/ranides/assira/collection/arrays/ArrayAllocator.class</exclude>
-								<exclude>net/ranides/assira/collection/arrays/ArraySearch.class</exclude>
-								<exclude>net/ranides/assira/collection/arrays/ArraySort.class</exclude>
-								<exclude>net/ranides/assira/collection/arrays/ArrayUtils.class</exclude>
-								<exclude>net/ranides/assira/collection/arrays/ArrayUtils$*</exclude>
-                                
-								<exclude>net/ranides/assira/collection/arrays/IntArrayAllocator.class</exclude>
-								<exclude>net/ranides/assira/collection/arrays/IntArraySearch.class</exclude>
-								<exclude>net/ranides/assira/collection/arrays/IntArraySort.class</exclude>
-								<exclude>net/ranides/assira/collection/arrays/IntArrayUtils.class</exclude>
-								<exclude>net/ranides/assira/collection/arrays/IntArrayUtils$*</exclude>
-
-                                <!--								
-                                <exclude>net/ranides/assira/collection/lists/AIntList.class</exclude>
-								<exclude>net/ranides/assira/collection/lists/AIntList$*</exclude>
-								<exclude>net/ranides/assira/collection/lists/IntArrayList.class</exclude>
-								<exclude>net/ranides/assira/collection/lists/IntArrayList$*</exclude>
--->
-								<exclude>net/ranides/assira/collection/lists/IntRange.class</exclude>
-								<exclude>net/ranides/assira/collection/lists/IntRange$*</exclude>
-							</excludes>
-						</configuration>
-					</plugin>
-				</plugins>
-			</build>
-		</profile>
-	</profiles>
-	
-	<build>
-		<plugins>
-			<plugin>
-				<groupId>org.jacoco</groupId>
-				<artifactId>jacoco-maven-plugin</artifactId>
-				<version>0.7.5.201505241946</version>
-				<configuration>
-					<excludes>
-						<exclude>net/ranides/assira/test/**</exclude>
-					</excludes>
-				</configuration>
-			</plugin>
-		</plugins>
-	</build>
-    
-	<repositories>
-		<repository>
-			<id>ranides.net</id>
-			<name>ranides.net</name>
-			<url>http://maven.ranides.net</url>
-		</repository>
-	</repositories>
-    
-	<dependencies>
-		<dependency>
-			<artifactId>assira.asm</artifactId>
-			<groupId>net.ranides</groupId>
-		</dependency>
-		<dependency>
-			<groupId>eu.vitaliy</groupId>
-			<artifactId>mazovia-charset</artifactId>
-			<optional>true</optional>
-		</dependency>
-		<dependency>
-			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>net.ranides</groupId>
-			<artifactId>assira.junit</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.slf4j</groupId>
-			<artifactId>slf4j-simple</artifactId>
-		</dependency>
-	</dependencies>
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>net.ranides</groupId>
+		<artifactId>assira.common</artifactId>
+		<version>2.0.1</version>
+	</parent>
+	<name>assira</name>
+	<groupId>net.ranides</groupId>
+	<artifactId>assira</artifactId>
+	<version>2.0.1</version>
+	<packaging>jar</packaging>
+    
+	<profiles>
+		<profile>
+			<id>recent-coverage</id>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.jacoco</groupId>
+						<artifactId>jacoco-maven-plugin</artifactId>
+						<version>0.7.5.201505241946</version>
+						<configuration>
+							<excludes>
+								<exclude>net/ranides/assira/test/**</exclude>
+								
+								<!--  klasy dostatecznie przetestowane -->
+								
+								<exclude>net/ranides/assira/collection/maps/AMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/AMap$*</exclude>
+								<exclude>net/ranides/assira/collection/maps/IntMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/IntMap$*</exclude>
+								<exclude>net/ranides/assira/collection/maps/AIntMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/AIntMap$*</exclude>
+
+								<exclude>net/ranides/assira/collection/maps/ASortedMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/ASortedMap$*</exclude>
+								<exclude>net/ranides/assira/collection/maps/AIntSortedMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/AIntSortedMap$*</exclude>
+
+								<exclude>net/ranides/assira/collection/maps/AHashMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/AHashMap$*</exclude>
+								<exclude>net/ranides/assira/collection/maps/HashMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/HashMap$*</exclude>
+								<exclude>net/ranides/assira/collection/maps/IntHashMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/IntHashMap$*</exclude>
+
+								<exclude>net/ranides/assira/collection/maps/AVLTreeMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/AVLTreeMap$*</exclude>
+								<exclude>net/ranides/assira/collection/maps/IntAVLTreeMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/IntAVLTreeMap$*</exclude>
+
+								<exclude>net/ranides/assira/collection/maps/RBTreeMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/RBTreeMap$*</exclude>
+								<exclude>net/ranides/assira/collection/maps/IntRBTreeMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/IntRBTreeMap$*</exclude>
+
+								<exclude>net/ranides/assira/collection/maps/CustomMap.class</exclude>
+								<exclude>net/ranides/assira/collection/maps/IdentMap.class</exclude>
+
+								<exclude>net/ranides/assira/collection/sets/ASet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/AIntSet.class</exclude>
+
+								<exclude>net/ranides/assira/collection/sets/ASortedSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/ASortedSet$*</exclude>
+								<exclude>net/ranides/assira/collection/sets/AIntSortedSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/AIntSortedSet$*</exclude>
+
+								<exclude>net/ranides/assira/collection/sets/AHashSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/AHashSet$*</exclude>
+								<exclude>net/ranides/assira/collection/sets/HashSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/IntHashSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/IntHashSet$*</exclude>
+
+								<exclude>net/ranides/assira/collection/sets/AVLTreeSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/AVLTreeSet$*</exclude>
+								<exclude>net/ranides/assira/collection/sets/IntAVLTreeSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/IntAVLTreeSet$*</exclude>
+
+								<exclude>net/ranides/assira/collection/sets/RBTreeSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/RBTreeSet$*</exclude>
+								<exclude>net/ranides/assira/collection/sets/IntRBTreeSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/IntRBTreeSet$*</exclude>
+
+								<exclude>net/ranides/assira/collection/sets/CustomSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/IdentSet.class</exclude>
+								<exclude>net/ranides/assira/collection/sets/AIdentSet.class</exclude>
+                                
+								<exclude>net/ranides/assira/collection/lookups/Lookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/Lookup$*</exclude>
+								<exclude>net/ranides/assira/collection/lookups/ALookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/ALookup$*</exclude>
+								<exclude>net/ranides/assira/collection/lookups/ASortedLookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/ASortedLookup$*</exclude>
+                                
+								<exclude>net/ranides/assira/collection/lookups/AHashLookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/AHashLookup$*</exclude>
+                                
+								<exclude>net/ranides/assira/collection/lookups/AVLTreeLookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/AVLTreeLookup$*</exclude>
+								<exclude>net/ranides/assira/collection/lookups/RBTreeLookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/RBTreeLookup$*</exclude>
+                                
+								<exclude>net/ranides/assira/collection/lookups/CustomLookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/HashLookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/IdentLookup.class</exclude>
+                                
+								<exclude>net/ranides/assira/collection/lookups/AHashLookup.class</exclude>
+								<exclude>net/ranides/assira/collection/lookups/AHashLookup$*</exclude>
+                                
+								<exclude>net/ranides/assira/collection/arrays/ArrayAllocator.class</exclude>
+								<exclude>net/ranides/assira/collection/arrays/ArraySearch.class</exclude>
+								<exclude>net/ranides/assira/collection/arrays/ArraySort.class</exclude>
+								<exclude>net/ranides/assira/collection/arrays/ArrayUtils.class</exclude>
+								<exclude>net/ranides/assira/collection/arrays/ArrayUtils$*</exclude>
+                                
+								<exclude>net/ranides/assira/collection/arrays/IntArrayAllocator.class</exclude>
+								<exclude>net/ranides/assira/collection/arrays/IntArraySearch.class</exclude>
+								<exclude>net/ranides/assira/collection/arrays/IntArraySort.class</exclude>
+								<exclude>net/ranides/assira/collection/arrays/IntArrayUtils.class</exclude>
+								<exclude>net/ranides/assira/collection/arrays/IntArrayUtils$*</exclude>
+
+                                <exclude>net/ranides/assira/collection/lists/AIntList.class</exclude>
+								<exclude>net/ranides/assira/collection/lists/AIntList$*</exclude>
+								<exclude>net/ranides/assira/collection/lists/IntArrayList.class</exclude>
+								<exclude>net/ranides/assira/collection/lists/IntArrayList$*</exclude>
+								<exclude>net/ranides/assira/collection/lists/IntRange.class</exclude>
+								<exclude>net/ranides/assira/collection/lists/IntRange$*</exclude>
+							</excludes>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+	</profiles>
+	
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+				<version>0.7.5.201505241946</version>
+				<configuration>
+					<excludes>
+						<exclude>net/ranides/assira/test/**</exclude>
+					</excludes>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+    
+	<repositories>
+		<repository>
+			<id>ranides.net</id>
+			<name>ranides.net</name>
+			<url>http://maven.ranides.net</url>
+		</repository>
+	</repositories>
+    
+	<dependencies>
+		<dependency>
+			<artifactId>assira.asm</artifactId>
+			<groupId>net.ranides</groupId>
+		</dependency>
+		<dependency>
+			<groupId>eu.vitaliy</groupId>
+			<artifactId>mazovia-charset</artifactId>
+			<optional>true</optional>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>net.ranides</groupId>
+			<artifactId>assira.junit</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-simple</artifactId>
+		</dependency>
+	</dependencies>
 </project>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 688 - 682
assira/src/main/java/net/ranides/assira/collection/lists/AIntList.java


+ 144 - 7
assira/src/main/java/net/ranides/assira/collection/lists/IntArrayList.java

@@ -6,7 +6,6 @@
  */
 package net.ranides.assira.collection.lists;
 
-import net.ranides.assira.collection.iterators.IntListIterator;
 import net.ranides.assira.collection.arrays.IntArrayUtils;
 import java.util.Collection;
 import java.util.Iterator;
@@ -44,8 +43,6 @@ import net.ranides.assira.collection.BlockCollection;
  */
 public class IntArrayList extends AIntList implements BlockCollection<Integer>, RandomAccess {
     
-    // @todo (assira # 1) IntArrayList - sublist
-
     private static final long serialVersionUID = 2;
     
     protected enum Wrap { WRAP };
@@ -455,11 +452,15 @@ public class IntArrayList extends AIntList implements BlockCollection<Integer>,
     }
 
     @Override
-    public IntListIterator listIterator(int index) {
-        checkIndex(index);
-        return new IIterator(index);
+    public IntList subList(int from, int to) {
+        checkIndex(from);
+        checkIndex(to);
+        if (from > to) {
+            throw new IllegalArgumentException("Start index (" + from + ") is greater than end index (" + to + ")");
+        }
+        return new IntArrayFragment(from, to);
     }
-
+    
     /**
      * Compares this array list to another array list.
      *
@@ -501,4 +502,140 @@ public class IntArrayList extends AIntList implements BlockCollection<Integer>,
         }
     }
     
+    private final class IntArrayFragment extends AIntList implements RandomAccess {
+        
+        private static final long serialVersionUID = 2;
+
+        protected int begin;
+        protected int end;
+
+        protected IntArrayFragment(int begin, int end) {
+            this.begin = begin;
+            this.end = end;
+        }
+
+        @Override
+        public void add(int index, int k) {
+            IntArrayList.this.add(begin+index, k);
+            end++;
+        }
+
+        @Override
+        public boolean add(int k) {
+            IntArrayList.this.add(end++, k);
+            return true;
+        }
+
+        @Override
+        public int getInt(int index) {
+            return IntArrayList.this.getInt(begin+index);
+        }
+
+        @Override
+        public int indexOf(int k) {
+            for (int i = begin; i <end; i++) {
+                if (k == data[i]) {
+                    return i-begin;
+                }
+            }
+            return -1;
+        }
+
+        @Override
+        public int lastIndexOf(int k) {
+            for (int i = end; i-- != begin;) {
+                if (k == data[i]) {
+                    return i-begin;
+                }
+            }
+            return -1;
+        }
+
+        @Override
+        public int removeInt(int index) {
+            int old = IntArrayList.this.removeInt(begin+index);
+            end--;
+            return old;
+        }
+
+        @Override
+        public int set(int index, int k) {
+            return IntArrayList.this.set(begin+index, k);
+        }
+
+        @Override
+        public void clear() {
+            IntArrayList.this.removeElements(begin, end);
+            end = begin;
+        }
+
+        @Override
+        public int size() {
+            return end-begin;
+        }
+
+        @Override
+        public void getElements(int from, int[] target, int offset, int length) {
+            IntArrayList.this.getElements(begin+from, target, offset, Math.min(size(),length));
+        }
+
+        @Override
+        public void removeElements(int from, int to) {
+            IntArrayList.this.removeElements(begin+from, begin+to);
+            end -= (to-from);
+        }
+
+        /**
+         * Adds elements to this type-specific list using optimized system calls.
+         *
+         * @param index the index at which to add elements.
+         * @param array the array containing the elements.
+         * @param offset the offset of the first element to add.
+         * @param length the number of elements to add.
+         */
+        @Override
+        public void addElements(int index, int array[], int offset, int length) {
+            IntArrayList.this.addElements(begin+index, array, offset, length);
+            end += length;
+        }
+
+        @Override
+        public int[] toIntArray(int target[]) {
+            target = IntArrayAllocator.ensureCapacity(target, size(), 0);
+            System.arraycopy(data, begin, target, 0, size());
+            return target;
+        }
+
+        @Override
+        public boolean addAll(int index, IntCollection values) {
+            IntArrayList.this.addAll(index+begin, values);
+            end += values.size();
+            return true;
+        }
+
+        @Override
+        public boolean addAll(int index, IntList values) {
+            IntArrayList.this.addAll(index+begin, values);
+            end += values.size();
+            return true;
+            
+        }
+
+        public int compareTo(IntArrayList list) {
+            int s1 = size(), s2 = list.size();
+            int a1[] = data, a2[] = list.data;
+            int e1, e2;
+            int r, i;
+            for (i = 0; i < s1 && i < s2; i++) {
+                e1 = a1[ i];
+                e2 = a2[ i];
+                if ((r = ((e1) < (e2) ? -1 : ((e1) == (e2) ? 0 : 1))) != 0) {
+                    return r;
+                }
+            }
+            return i < s2 ? -1 : (i < s1 ? 1 : 0);
+        }
+
+    }
+    
 }

+ 1 - 10
assira/src/test/java/net/ranides/assira/collection/lists/AIntListTest.java

@@ -25,6 +25,7 @@ public class AIntListTest {
         CollectionSuite.SUITE
 			.param("set!", $list)
 			.param("list!", $list)
+            .param("nest!", true)
 			.run(() -> new FIntList());
     }
     
@@ -47,16 +48,6 @@ public class AIntListTest {
             data.add(index, k);
         }
 
-        @Override
-        public void addElements(int index, int[] array, int offset, int length) {
-            data.addElements(index, array, offset, length);
-        }
-
-        @Override
-        public void getElements(int from, int[] target, int offset, int length) {
-            data.getElements(from, target, offset, length);
-        }
-
         @Override
         public int getInt(int index) {
             return data.getInt(index);

+ 216 - 215
assira/src/test/java/net/ranides/assira/collection/suite/lists/IntListTester.java

@@ -1,215 +1,216 @@
-/*
- * @author Ranides Atterwim <ranides@gmail.com>
- * @copyright Ranides Atterwim
- * @license WTFPL
- * @url http://ranides.net/projects/assira
- */
-package net.ranides.assira.collection.suite.lists;
-
-import java.util.ArrayList;
-import java.util.NoSuchElementException;
-import javax.annotation.Resource;
-import net.ranides.assira.collection.IntCollection;
-import net.ranides.assira.collection.lists.IntArrayList;
-import net.ranides.assira.collection.lists.IntList;
-import net.ranides.assira.collection.sets.IntAVLTreeSet;
-import net.ranides.assira.junit.InterfaceTest;
-import net.ranides.assira.test.TCollection;
-import static net.ranides.assira.junit.NewAssert.*;
-
-/**
- *
- * @author Ranides Atterwim <ranides@gmail.com>
- */
-public class IntListTester {
-    
-    private static final int[] ITEMS_ADD_0 = new int[]{1,3,5,7,9};
-    private static final int[] ITEMS_ADD_1 = new int[]{1,11,12,13,3,5,7,9};
-    private static final int[] ITEMS_ADD_2 = new int[]{21,22,1,11,12,13,3,5,7,9};
-    private static final int[] ITEMS_ADD_3 = new int[]{21,22,1,11,12,13,3,5,7,31,32,33,9};
-    private static final int[] ITEMS_ADD_4 = new int[]{21,22,1,11,12,13,3,5,7,31,32,33,9,41,42,43};
-    private static final int[] ITEMS_ADD_5 = new int[]{21,22,1,11,12,13,3,5,7,31,32,33,9,41,42,43,51,52,53};
-    
-    @Resource(name = "list!")
-    private TCollection<?> $list;
-    
-    @InterfaceTest
-    public void basicGetElements(IntList target) {
-		$list.list(1,3,5,7,9,11).intoInt(target);
-        
-        int[] buffer = new int[5];
-        target.getElements(2, buffer, 1, 3);
-        assertArrayEquals($list.list(0,5,7,9,0).valuesInt(), buffer);
-    }
-    
-    @InterfaceTest
-    public void basicRemoveElements(IntList target) {
-        $list.list(1,3,5,7,9,11).intoInt(target);
-        
-        target.removeElements(0, 0);
-        target.removeElements(1, 1);
-        
-        assertEquals($list.list(1,3,5,7,9,11).into(new ArrayList<>()), target);
-        
-        // IllegalArgumentException | IndexOutOfBoundsException | ArrayIndexOutOfBoundsException
-        assertThrows(Exception.class, ()->{
-            target.removeElements(0, -1);
-        });
-        // IllegalArgumentException | IndexOutOfBoundsException | ArrayIndexOutOfBoundsException
-        assertThrows(Exception.class, ()->{
-            target.removeElements(3, 2);
-        });
-        // IllegalArgumentException | IndexOutOfBoundsException | ArrayIndexOutOfBoundsException
-        assertThrows(Exception.class, ()->{
-            target.removeElements(-1, 1);
-        });
-        // IllegalArgumentException | IndexOutOfBoundsException | ArrayIndexOutOfBoundsException
-        assertThrows(Exception.class, ()->{
-            target.removeElements(2, 8);
-        });
-        
-        target.removeElements(1, 2);
-        assertEquals($list.list(1,5,7,9,11).into(new ArrayList<>()), target);
-        
-        target.removeElements(2, 4);
-        assertEquals($list.list(1,5,11).into(new ArrayList<>()), target);
-    }
-    
-    @InterfaceTest
-    public void basicAddElements(IntList target) {
-        $list.list(1,3,5,7,9).intoInt(target);
-
-        target.addElements(2, $list.list(31,32,33,34,35,36,37,38,39).valuesInt(), 3, 4);
-        assertEquals($list.list(1,3,34,35,36,37,5,7,9).into(new ArrayList<>()), target);
-        
-        target.addElements(7, $list.list(41,42,43).valuesInt());
-        assertEquals($list.list(1,3,34,35,36,37,5,41,42,43,7,9).into(new ArrayList<>()), target);
-        
-        target.addElements(target.size(), $list.list(51,52).valuesInt());
-        assertEquals($list.list(1,3,34,35,36,37,5,41,42,43,7,9,51,52).into(new ArrayList<>()), target);
-    }
-    
-    @InterfaceTest
-    public void basicAddAll_Collection(IntList target) {
-        $list.list(ITEMS_ADD_0).intoInt(target);
-        
-        target.addAll(1, icollection(11,12,13));
-        assertEquals($list.list(ITEMS_ADD_1).into(new ArrayList<>()), target);
-        
-        target.addAll(0,icollection(21,22));
-        assertEquals($list.list(ITEMS_ADD_2).into(new ArrayList<>()), target);
-        
-        target.addAll(target.size()-1, icollection(31,32,33));
-        assertEquals($list.list(ITEMS_ADD_3).into(new ArrayList<>()), target);
-        
-        target.addAll(target.size(),icollection(41,42,43));
-        assertEquals($list.list(ITEMS_ADD_4).into(new ArrayList<>()), target);
-        
-        target.addAll(target.size(),icollection());
-        assertEquals($list.list(ITEMS_ADD_4).into(new ArrayList<>()), target);
-        
-        target.addAll(icollection(51,52,53));
-        assertEquals($list.list(ITEMS_ADD_5).into(new ArrayList<>()), target);
-    }
-        
-    @InterfaceTest
-    public void basicAddAll_List(IntList target) {
-        $list.list(ITEMS_ADD_0).intoInt(target);
-        
-        target.addAll(1, ilist(11,12,13));
-        assertEquals($list.list(ITEMS_ADD_1).into(new ArrayList<>()), target);
-        
-        target.addAll(0,ilist(21,22));
-        assertEquals($list.list(ITEMS_ADD_2).into(new ArrayList<>()), target);
-        
-        target.addAll(target.size()-1, ilist(31,32,33));
-        assertEquals($list.list(ITEMS_ADD_3).into(new ArrayList<>()), target);
-        
-        target.addAll(target.size(),ilist(41,42,43));
-        assertEquals($list.list(ITEMS_ADD_4).into(new ArrayList<>()), target);
-        
-        target.addAll(target.size(),ilist());
-        assertEquals($list.list(ITEMS_ADD_4).into(new ArrayList<>()), target);
-        
-        target.addAll(ilist(51,52,53));
-        assertEquals($list.list(ITEMS_ADD_5).into(new ArrayList<>()), target);
-    }
-    
-    private IntCollection icollection(int... values) {
-        return $list.list(values).intoInt(new IntAVLTreeSet());
-    }
-    
-    private IntList ilist(int... values) {
-        return $list.list(values).intoInt(new IntArrayList());
-    }
-    
-    @InterfaceTest
-    public void basicToIntArray(IntList target) {
-        $list.list(1,3,5,7,9).intoInt(target);
-        
-        assertArrayEquals($list.list(1,3,5,7,9).valuesInt(), target.toIntArray());
-        assertArrayEquals($list.list(1,3,5,7,9).valuesInt(), target.toIntArray(null));
-        assertArrayEquals($list.list(1,3,5,7,9).valuesInt(), target.toIntArray(new int[0]));
-        assertArrayEquals($list.list(1,3,5,7,9).valuesInt(), target.toIntArray(new int[1]));
-        assertArrayEquals($list.list(1,3,5,7,9,0,0).valuesInt(), target.toIntArray(new int[7]));
-    }
-	
-	@InterfaceTest
-    public void basicPop(IntList target) {
-        $list.list(1,3,5,7,9).intoInt(target);
-        
-		assertEquals($list.item(9).valueInt(), target.pop());
-		assertEquals($list.item(7).valueInt(), target.pop());
-		assertEquals($list.item(5).valueInt(), target.pop());
-		assertEquals($list.item(3).valueInt(), target.pop());
-		assertEquals($list.item(1).valueInt(), target.pop());
-		
-		assertThrows(NoSuchElementException.class, ()->{ 
-			target.pop();
-		});
-    }
-	
-	@InterfaceTest
-    public void basicPush(IntList target) {
-        target.push($list.item(1).valueInt());
-        target.push($list.item(2).valueInt());
-        target.push($list.item(3).valueInt());
-		
-		assertEquals($list.item(3).valueInt(), target.pop());
-		assertEquals($list.item(2).valueInt(), target.pop());
-		assertEquals($list.item(1).valueInt(), target.pop());
-        
-		assertThrows(NoSuchElementException.class, ()->{ 
-			target.pop();
-		});
-    }
-	
-	@InterfaceTest
-    public void basicTopPeek(IntList target) {
-        $list.list(1,3,5,7).intoInt(target);
-        
-		target.push($list.item(9).valueInt());
-		
-		assertEquals($list.item(9).valueInt(), target.top());
-		assertEquals($list.item(9).valueInt(), target.pop());
-		
-		assertEquals($list.item(7).valueInt(), target.top());
-		assertEquals($list.item(7).valueInt(), target.pop());
-		
-		assertEquals($list.item(5).valueInt(), target.peek(0));
-		assertEquals($list.item(3).valueInt(), target.peek(1));
-		assertEquals($list.item(1).valueInt(), target.peek(2));
-		
-		assertThrows(NoSuchElementException.class, ()->{
-			target.peek(3);
-		});
-		
-		target.clear();
-		assertThrows(NoSuchElementException.class, ()->{
-			target.top();
-		});
-		assertThrows(NoSuchElementException.class, ()->{
-			target.peek(0);
-		});
-    }
-}
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.collection.suite.lists;
+
+import java.util.ArrayList;
+import java.util.NoSuchElementException;
+import javax.annotation.Resource;
+import net.ranides.assira.collection.IntCollection;
+import net.ranides.assira.collection.lists.IntArrayList;
+import net.ranides.assira.collection.lists.IntList;
+import net.ranides.assira.collection.sets.IntAVLTreeSet;
+import net.ranides.assira.junit.InterfaceTest;
+import net.ranides.assira.test.TCollection;
+import static net.ranides.assira.junit.NewAssert.*;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public class IntListTester {
+    
+    private static final int[] ITEMS_ADD_0 = new int[]{1,3,5,7,9};
+    private static final int[] ITEMS_ADD_1 = new int[]{1,11,12,13,3,5,7,9};
+    private static final int[] ITEMS_ADD_2 = new int[]{21,22,1,11,12,13,3,5,7,9};
+    private static final int[] ITEMS_ADD_3 = new int[]{21,22,1,11,12,13,3,5,7,31,32,33,9};
+    private static final int[] ITEMS_ADD_4 = new int[]{21,22,1,11,12,13,3,5,7,31,32,33,9,41,42,43};
+    private static final int[] ITEMS_ADD_5 = new int[]{21,22,1,11,12,13,3,5,7,31,32,33,9,41,42,43,51,52,53};
+    
+    @Resource(name = "list!")
+    private TCollection<?> $list;
+    
+    @InterfaceTest
+    public void basicGetElements(IntList target) {
+        System.out.printf("%s%n", target.getClass());
+		$list.list(1,3,5,7,9,11).intoInt(target);
+        
+        int[] buffer = new int[5];
+        target.getElements(2, buffer, 1, 3);
+        assertArrayEquals($list.list(0,5,7,9,0).valuesInt(), buffer);
+    }
+    
+    @InterfaceTest
+    public void basicRemoveElements(IntList target) {
+        $list.list(1,3,5,7,9,11).intoInt(target);
+        
+        target.removeElements(0, 0);
+        target.removeElements(1, 1);
+        
+        assertEquals($list.list(1,3,5,7,9,11).into(new ArrayList<>()), target);
+        
+        // IllegalArgumentException | IndexOutOfBoundsException | ArrayIndexOutOfBoundsException
+        assertThrows(Exception.class, ()->{
+            target.removeElements(0, -1);
+        });
+        // IllegalArgumentException | IndexOutOfBoundsException | ArrayIndexOutOfBoundsException
+        assertThrows(Exception.class, ()->{
+            target.removeElements(3, 2);
+        });
+        // IllegalArgumentException | IndexOutOfBoundsException | ArrayIndexOutOfBoundsException
+        assertThrows(Exception.class, ()->{
+            target.removeElements(-1, 1);
+        });
+        // IllegalArgumentException | IndexOutOfBoundsException | ArrayIndexOutOfBoundsException
+        assertThrows(Exception.class, ()->{
+            target.removeElements(2, 8);
+        });
+        
+        target.removeElements(1, 2);
+        assertEquals($list.list(1,5,7,9,11).into(new ArrayList<>()), target);
+        
+        target.removeElements(2, 4);
+        assertEquals($list.list(1,5,11).into(new ArrayList<>()), target);
+    }
+    
+    @InterfaceTest
+    public void basicAddElements(IntList target) {
+        $list.list(1,3,5,7,9).intoInt(target);
+
+        target.addElements(2, $list.list(31,32,33,34,35,36,37,38,39).valuesInt(), 3, 4);
+        assertEquals($list.list(1,3,34,35,36,37,5,7,9).into(new ArrayList<>()), target);
+        
+        target.addElements(7, $list.list(41,42,43).valuesInt());
+        assertEquals($list.list(1,3,34,35,36,37,5,41,42,43,7,9).into(new ArrayList<>()), target);
+        
+        target.addElements(target.size(), $list.list(51,52).valuesInt());
+        assertEquals($list.list(1,3,34,35,36,37,5,41,42,43,7,9,51,52).into(new ArrayList<>()), target);
+    }
+    
+    @InterfaceTest
+    public void basicAddAll_Collection(IntList target) {
+        $list.list(ITEMS_ADD_0).intoInt(target);
+        
+        target.addAll(1, icollection(11,12,13));
+        assertEquals($list.list(ITEMS_ADD_1).into(new ArrayList<>()), target);
+        
+        target.addAll(0,icollection(21,22));
+        assertEquals($list.list(ITEMS_ADD_2).into(new ArrayList<>()), target);
+        
+        target.addAll(target.size()-1, icollection(31,32,33));
+        assertEquals($list.list(ITEMS_ADD_3).into(new ArrayList<>()), target);
+        
+        target.addAll(target.size(),icollection(41,42,43));
+        assertEquals($list.list(ITEMS_ADD_4).into(new ArrayList<>()), target);
+        
+        target.addAll(target.size(),icollection());
+        assertEquals($list.list(ITEMS_ADD_4).into(new ArrayList<>()), target);
+        
+        target.addAll(icollection(51,52,53));
+        assertEquals($list.list(ITEMS_ADD_5).into(new ArrayList<>()), target);
+    }
+        
+    @InterfaceTest
+    public void basicAddAll_List(IntList target) {
+        $list.list(ITEMS_ADD_0).intoInt(target);
+        
+        target.addAll(1, ilist(11,12,13));
+        assertEquals($list.list(ITEMS_ADD_1).into(new ArrayList<>()), target);
+        
+        target.addAll(0,ilist(21,22));
+        assertEquals($list.list(ITEMS_ADD_2).into(new ArrayList<>()), target);
+        
+        target.addAll(target.size()-1, ilist(31,32,33));
+        assertEquals($list.list(ITEMS_ADD_3).into(new ArrayList<>()), target);
+        
+        target.addAll(target.size(),ilist(41,42,43));
+        assertEquals($list.list(ITEMS_ADD_4).into(new ArrayList<>()), target);
+        
+        target.addAll(target.size(),ilist());
+        assertEquals($list.list(ITEMS_ADD_4).into(new ArrayList<>()), target);
+        
+        target.addAll(ilist(51,52,53));
+        assertEquals($list.list(ITEMS_ADD_5).into(new ArrayList<>()), target);
+    }
+    
+    private IntCollection icollection(int... values) {
+        return $list.list(values).intoInt(new IntAVLTreeSet());
+    }
+    
+    private IntList ilist(int... values) {
+        return $list.list(values).intoInt(new IntArrayList());
+    }
+    
+    @InterfaceTest
+    public void basicToIntArray(IntList target) {
+        $list.list(1,3,5,7,9).intoInt(target);
+        
+        assertArrayEquals($list.list(1,3,5,7,9).valuesInt(), target.toIntArray());
+        assertArrayEquals($list.list(1,3,5,7,9).valuesInt(), target.toIntArray(null));
+        assertArrayEquals($list.list(1,3,5,7,9).valuesInt(), target.toIntArray(new int[0]));
+        assertArrayEquals($list.list(1,3,5,7,9).valuesInt(), target.toIntArray(new int[1]));
+        assertArrayEquals($list.list(1,3,5,7,9,0,0).valuesInt(), target.toIntArray(new int[7]));
+    }
+	
+	@InterfaceTest
+    public void basicPop(IntList target) {
+        $list.list(1,3,5,7,9).intoInt(target);
+        
+		assertEquals($list.item(9).valueInt(), target.pop());
+		assertEquals($list.item(7).valueInt(), target.pop());
+		assertEquals($list.item(5).valueInt(), target.pop());
+		assertEquals($list.item(3).valueInt(), target.pop());
+		assertEquals($list.item(1).valueInt(), target.pop());
+		
+		assertThrows(NoSuchElementException.class, ()->{ 
+			target.pop();
+		});
+    }
+	
+	@InterfaceTest
+    public void basicPush(IntList target) {
+        target.push($list.item(1).valueInt());
+        target.push($list.item(2).valueInt());
+        target.push($list.item(3).valueInt());
+		
+		assertEquals($list.item(3).valueInt(), target.pop());
+		assertEquals($list.item(2).valueInt(), target.pop());
+		assertEquals($list.item(1).valueInt(), target.pop());
+        
+		assertThrows(NoSuchElementException.class, ()->{ 
+			target.pop();
+		});
+    }
+	
+	@InterfaceTest
+    public void basicTopPeek(IntList target) {
+        $list.list(1,3,5,7).intoInt(target);
+        
+		target.push($list.item(9).valueInt());
+		
+		assertEquals($list.item(9).valueInt(), target.top());
+		assertEquals($list.item(9).valueInt(), target.pop());
+		
+		assertEquals($list.item(7).valueInt(), target.top());
+		assertEquals($list.item(7).valueInt(), target.pop());
+		
+		assertEquals($list.item(5).valueInt(), target.peek(0));
+		assertEquals($list.item(3).valueInt(), target.peek(1));
+		assertEquals($list.item(1).valueInt(), target.peek(2));
+		
+		assertThrows(NoSuchElementException.class, ()->{
+			target.peek(3);
+		});
+		
+		target.clear();
+		assertThrows(NoSuchElementException.class, ()->{
+			target.top();
+		});
+		assertThrows(NoSuchElementException.class, ()->{
+			target.peek(0);
+		});
+    }
+}

+ 449 - 449
assira/src/test/java/net/ranides/assira/collection/suite/lists/ListTester.java

@@ -1,449 +1,449 @@
-/*
- * @author Ranides Atterwim <ranides@gmail.com>
- * @copyright Ranides Atterwim
- * @license WTFPL
- * @url http://ranides.net/projects/assira
- */
-package net.ranides.assira.collection.suite.lists;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.function.Supplier;
-import javax.annotation.Resource;
-import net.ranides.assira.collection.suite.IteratorTester;
-import net.ranides.assira.junit.InterfaceSuite;
-import net.ranides.assira.junit.InterfaceTest;
-import net.ranides.assira.test.TCollection;
-import net.ranides.assira.test.TCollection.TItems;
-import static net.ranides.assira.junit.NewAssert.*;
-
-/**
- *
- * @author Ranides Atterwim <ranides@gmail.com>
- */
-public class ListTester<T> {
-    
-    @Resource(name = "list!")
-    private TCollection<T> $list;
-
-    @Resource(name = "nest!")
-    private boolean $nest = false;
-    
-    @InterfaceTest
-    public void basicAdd(List<T> target) {
-        assertEquals(0, target.size());
-        
-        for(TCollection.TItem<T> item : $list.range(32)) {
-            target.add(item.value());
-        }
-        
-        assertEquals(32, target.size());
-        assertEquals($list.item(4).value(), target.get(4));
-		assertEquals($list.range(32).into(new ArrayList<>()), target);
-    }
-	
-	@InterfaceTest
-    public void basicAddAt(List<T> target) {
-		assertEquals(0, target.size());
-		$list.range(8).into(target);
-		target.add(0, $list.item(71).value());
-		target.add(0, $list.item(72).value());
-		target.add(4, $list.item(73).value());
-		target.add(6, $list.item(74).value());
-		target.add(11, $list.item(75).value());
-		target.add(13, $list.item(76).value());
-
-		assertEquals( $list.list(72, 71, 0, 1, 73, 2, 74, 3, 4, 5, 6, 75, 7, 76).into(new ArrayList<>()), target);
-        
-                
-        assertThrows(IndexOutOfBoundsException.class, ()->{
-            target.add(-1, $list.item(66).value());
-        });
-        assertThrows(IndexOutOfBoundsException.class, ()->{
-            target.add(100, $list.item(66).value());
-        });
-        
-	}
-	
-	@InterfaceTest
-    public void basicAddAll(List<T> target) {
-        assertEquals(0, target.size());
-        
-		assertTrue(target.addAll($list.range(0,8).into(new ArrayList<>())));
-		assertTrue(target.addAll(4, $list.range(10,18).into(new ArrayList<>())));
-		assertFalse(target.addAll(4, new ArrayList<>()));
-        
-        assertEquals(16, target.size());
-        assertEquals($list.list(0,1,2,3,10,11,12,13,14,15,16,17,4,5,6,7).into(new ArrayList<>()), target);
-    }
-    
-    @InterfaceTest
-    public void basicGet(List<T> target) {
-        assertEquals(0, target.size());
-        $list.range(0,8).into(target);
-        
-        assertEquals(8, target.size());
-        
-		assertEquals($list.item(3).value(), target.get(3));
-		assertEquals($list.item(5).value(), target.get(5));
-		assertEquals($list.item(7).value(), target.get(7));
-        assertThrows(IndexOutOfBoundsException.class, ()->{
-            target.get(-1);
-        });
-        assertThrows(IndexOutOfBoundsException.class, ()->{
-            target.get(20);
-        });
-        assertThrows(IndexOutOfBoundsException.class, ()->{
-            target.get(8);
-        });
-    }
-	
-	@InterfaceTest
-    public void basicSet(List<T> target) {
-		$list.range(8).into(target);
-		target.set(0, $list.item(21).value());
-		target.set(2, $list.item(22).value());
-		target.set(7, $list.item(23).value());
-
-		assertThrows(IndexOutOfBoundsException.class, ()->{
-			target.set(8, $list.item(26).value());
-		});
-		assertThrows(IndexOutOfBoundsException.class, ()->{
-			target.set(-1, $list.item(27).value());
-		});
-		assertEquals( $list.list(21,1,22,3,4,5,6,23).into(new ArrayList<>()), target);
-	}
-	
-	@InterfaceTest
-    public void basicIndexOf(List<T> target) {
-		$list.list(1,3,5,7,9,3,3,11).into(target);
-		
-		assertEquals(0, target.indexOf(1));
-		assertEquals(1, target.indexOf(3));
-		assertEquals(2, target.indexOf(5));
-		assertEquals(3, target.indexOf(7));
-		assertEquals(4, target.indexOf(9));
-		assertEquals(7, target.indexOf(11));
-		assertEquals(-1, target.indexOf(0));
-	}
-	
-	@InterfaceTest
-    public void basicLastIndexOf(List<T> target) {
-		$list.list(1,3,5,7,9,3,3,11).into(target);
-		
-		assertEquals(6, target.lastIndexOf(3));
-        assertEquals(0, target.lastIndexOf(1));
-		assertEquals(2, target.lastIndexOf(5));
-		assertEquals(3, target.lastIndexOf(7));
-		assertEquals(4, target.lastIndexOf(9));
-		assertEquals(7, target.lastIndexOf(11));
-		assertEquals(-1, target.lastIndexOf(0));
-	}
-	
-	@InterfaceTest
-    public void basicRemove(List<T> target) {
-		$list.list(1,3,5,7,9,11).into(target);
-		
-		assertTrue(target.remove( $list.item(5).value()));
-		assertEquals( $list.list(1,3,7,9,11).into(new ArrayList<>()), target);
-		
-		assertTrue(target.remove( $list.item(1).value()));
-		assertEquals( $list.list(3,7,9,11).into(new ArrayList<>()), target);
-		
-		assertTrue(target.remove( $list.item(11).value()));
-		assertEquals( $list.list(3,7,9).into(new ArrayList<>()), target);
-		
-		assertFalse(target.remove( $list.item(0).value()));
-		assertEquals( $list.list(3,7,9).into(new ArrayList<>()), target);
-	}
-	
-	@InterfaceTest
-    public void basicRemoveIndex(List<T> target) {
-		$list.list(1,3,5,7,9,11).into(target);
-		
-		assertEquals($list.item(5).value(), target.remove(2));
-		assertEquals( $list.list(1,3,7,9,11).into(new ArrayList<>()), target);
-		
-		assertEquals($list.item(1).value(), target.remove(0));
-		assertEquals( $list.list(3,7,9,11).into(new ArrayList<>()), target);
-		
-		assertEquals($list.item(11).value(), target.remove(3));
-		assertEquals( $list.list(3,7,9).into(new ArrayList<>()), target);
-		
-		assertThrows(IndexOutOfBoundsException.class, ()->{
-			target.remove(20);
-		});
-		assertThrows(IndexOutOfBoundsException.class, ()->{
-			target.remove(-1);
-		});
-		assertEquals( $list.list(3,7,9).into(new ArrayList<>()), target);
-		
-		target.clear();
-		assertThrows(IndexOutOfBoundsException.class, ()->{
-			target.remove(0);
-		});
-	}
-    
-    @InterfaceTest
-    public void basicClear(List<T> target) {
-		$list.list(1,3,5,7,9,11).into(target);
-        assertEquals(6, target.size());
-        assertFalse(target.isEmpty());
-        
-        target.clear();
-        assertEquals(0, target.size());
-        assertTrue(target.isEmpty());
-        
-        $list.list(21,22).into(target);
-        assertEquals(2, target.size());
-        assertFalse(target.isEmpty());
-    }
-        
-    
-    @InterfaceTest
-    public void basicSerializable(List<T> target) {
-        $list.list(1,2,3,4).into(target);
-        assertSerializable(target);
-    }
-    
-    @InterfaceTest
-    public void basicEquals(Supplier<List<T>> generator) {
-        List<T> list1 = $list.list(1,2,3,4).into(generator.get());
-        List<T> list2 = $list.list(1,2,3,4).into(generator.get());
-        List<T> list3 = $list.list(1,5,6,8).into(generator.get());
-        List<T> list4 = $list.list(1,2,3).into(generator.get());
-        List<T> list5 = $list.list(1,2,4,3).into(generator.get());
-        
-        assertEquality(list1, list2, list3);
-        assertEquality(list1, list2, list4);
-        assertEquality(list1, list2, list5);
-    }
-    
-    @InterfaceTest
-    public void basicSublist(List<T> target) {
-        $list.list(1,3,5,7,9).into(target);
-        
-        assertEquals($values(3,5,7,9), target.subList(1, 5));
-        assertEquals($values(3,5,7), target.subList(1, 4));
-        assertEquals($values(1,3,5,7,9), target.subList(0, 5));
-        
-        assertThrows(IndexOutOfBoundsException.class, ()->{
-            target.subList(-1, 3);
-        });
-        assertThrows(IndexOutOfBoundsException.class, ()->{
-            target.subList(1, 30);
-        });
-        assertThrows(IndexOutOfBoundsException.class, ()->{
-            target.subList(0, 6);
-        });
-        assertThrows(IllegalArgumentException.class, ()->{
-            target.subList(4, 1);
-        });
-    }
-    
-    @InterfaceTest
-    public void basicSublist_indexOf(List<T> target) {
-        $list.list(1,3,5,7,9).into(target);
-        
-        assertEquals(-1, target.subList(1, 3).indexOf($list.item(9).value()));
-        assertEquals(-1, target.subList(1, 3).indexOf($list.item(1).value()));
-        assertEquals(1, target.subList(1, 3).indexOf($list.item(5).value()));
-    }
-    
-    @InterfaceTest
-    public void basicSublist_lastIndexOf(List<T> target) {
-        $list.list(1,3,5,7,9).into(target);
-        
-        assertEquals(-1, target.subList(1, 3).lastIndexOf($list.item(9).value()));
-        assertEquals(-1, target.subList(1, 3).lastIndexOf($list.item(1).value()));
-        assertEquals(1, target.subList(1, 3).lastIndexOf($list.item(5).value()));
-    }
-    
-    @InterfaceTest
-    public void basicSublist_add(List<T> target) {
-        $list.list(1,3,5,7,9).into(target);
-        List<T> sub = target.subList(1, 3);
-        
-        assertEquals($values(3,5), sub);
-        assertEquals($values(1,3,5,7,9), target);
-        
-        sub.add(1, $list.item(21).value());
-        assertEquals($values(3,21,5), sub);
-        assertEquals($values(1,3,21,5,7,9), target);
-        
-        sub.add($list.item(31).value());
-        assertEquals($values(3,21,5,31), sub);
-        assertEquals($values(1,3,21,5,31,7,9), target);
-    }
-    
-    @InterfaceTest
-    public void basicSublist_addAll(List<T> target) {
-        $list.list(1,3,5,7,9).into(target);
-        List<T> sub = target.subList(1, 3);
-        
-        assertEquals($values(3,5), sub);
-        assertEquals($values(1,3,5,7,9), target);
-        
-        sub.addAll(1, $values(21,22));
-        assertEquals($values(3,21,22,5), sub);
-        assertEquals($values(1,3,21,22,5,7,9), target);
-        
-        sub.addAll($values(31,32));
-        assertEquals($values(3,21,22,5,31,32), sub);
-        assertEquals($values(1,3,21,22,5,31,32,7,9), target);
-    }
-    
-    @InterfaceTest
-    public void basicSublist_clear(List<T> target) {
-        $list.list(1,3,5,7,9).into(target);
-        List<T> sub = target.subList(1, 3);
-        
-        sub.clear();
-        assertEquals(Collections.emptyList(), sub);
-        assertEquals($values(1,7,9), target);
-        
-        sub.addAll($values(31,32));
-        assertEquals($values(31,32), sub);
-        assertEquals($values(1,31,32,7,9), target);
-    }
-    
-    @InterfaceTest
-    public void basicSublist_set(List<T> target) {
-        $list.list(1,3,5,7,9).into(target);
-        List<T> sub = target.subList(1, 3);
-        
-        assertEquals($list.item(3).value(), sub.set(0, $list.item(21).value()));
-        assertEquals($list.item(5).value(), sub.set(1, $list.item(22).value()));
-        
-        assertEquals($list.item(21).value(), sub.get(0));
-        assertEquals($list.item(22).value(), sub.get(1));
-        
-        assertEquals($values(21,22), sub);
-        assertEquals($values(1,21,22,7,9), target);
-    }
-    
-    @SuppressWarnings("unchecked")
-    @InterfaceTest
-    public void basicIterator(List<T> target) {
-        TItems<T> list1 = $list.list();
-        TItems<T> list2 = $list.list(3, 4, 5, 6, 7);
-        
-        IteratorTester.listIterator(target.listIterator(), 0, list1.values());
-        
-        list2.into(target);
-        
-        IteratorTester.listIterator(target.listIterator(), 0, list2.values());
-    }
-    
-    @InterfaceTest
-    public void basicIteratorFrom(List<T> target) {
-        TItems<T> list1 = $list.list();
-        TItems<T> list2 = $list.list(3, 4, 5, 6, 7);
-        
-        IteratorTester.listIterator(target.listIterator(0), 0, list1.values());
-        
-        list2.into(target);
-        IteratorTester.listIterator(target.listIterator(2), 2, list2.values());
-    }
-    
-    @InterfaceTest
-    public void basicIterator_Remove(List<T> target) {
-		assertEquals(0, target.size());
-        
-		$list.list(1,2,3,5).into(target);
-		T v1 = $list.item(1).value();
-		T v2 = $list.item(3).value();
-        
-		Iterator<T> iterator = target.iterator();
-		while(iterator.hasNext()) {
-			T var = iterator.next();
-			if(v1.equals(var)) {
-                iterator.remove();
-            }
-            if(v2.equals(var)) {
-                iterator.remove();
-                assertThrows(IllegalStateException.class, ()-> iterator.remove());
-            }
-		}
-        
-        assertEquals(2, target.size());
-        assertEquals(-1, target.indexOf(v1));
-        assertEquals(-1, target.indexOf(v2));
-        assertEquals($values(2,5), target);
-        
-        target.clear();
-        assertEquals(0, target.size());
-	}
-    
-    @InterfaceTest
-    public void basicIterator_Set(List<T> target) {
-		assertEquals(0, target.size());
-        
-		$list.list(1,2,3,5).into(target);
-		T v1 = $list.item(1).value();
-		T v2 = $list.item(3).value();
-        
-		ListIterator<T> iterator = target.listIterator();
-        
-        assertThrows(IllegalStateException.class, ()->{
-            iterator.set($list.item(41).value());
-        });
-        
-		while(iterator.hasNext()) {
-			T var = iterator.next();
-			if(v1.equals(var)) {
-                iterator.set($list.item(21).value());
-            }
-            if(v2.equals(var)) {
-                iterator.set($list.item(31).value());
-                iterator.set($list.item(32).value());
-            }
-		}
-        assertEquals($values(21,2,32,5), target);
-	}
-    
-    @InterfaceTest
-    public void basicIterator_Add(List<T> target) {
-		assertEquals(0, target.size());
-        
-		$list.list(1,2,3,5).into(target);
-		T v1 = $list.item(1).value();
-		T v2 = $list.item(3).value();
-        
-		ListIterator<T> iterator = target.listIterator();
-        
-        iterator.add($list.item(41).value());
-        
-		while(iterator.hasNext()) {
-			T var = iterator.next();
-			if(v1.equals(var)) {
-                iterator.add($list.item(21).value());
-            }
-            if(v2.equals(var)) {
-                iterator.add($list.item(31).value());
-                iterator.add($list.item(32).value());
-            }
-		}
-        assertEquals($values(41, 1, 21, 2, 3, 31, 32, 5), target);
-	}
-    
-    @InterfaceTest
-    public void nestedSublistTest(Supplier<List<T>> target) {
-        if(!$nest) {
-            throw new UnsupportedOperationException("TEST.SILENT");
-        }
-        new InterfaceSuite(System.err)
-            .append(new ListTester<>())
-            .append(new IntListTester())
-            .param("list!", $list)
-            .run(()->target.get().subList(0, 0));
-        
-    }
-    
-    private List<T> $values(int... values) {
-        return $list.list(values).into(new ArrayList<>());
-    }
-}
+/*
+ * @author Ranides Atterwim <ranides@gmail.com>
+ * @copyright Ranides Atterwim
+ * @license WTFPL
+ * @url http://ranides.net/projects/assira
+ */
+package net.ranides.assira.collection.suite.lists;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.function.Supplier;
+import javax.annotation.Resource;
+import net.ranides.assira.collection.suite.IteratorTester;
+import net.ranides.assira.junit.InterfaceSuite;
+import net.ranides.assira.junit.InterfaceTest;
+import net.ranides.assira.test.TCollection;
+import net.ranides.assira.test.TCollection.TItems;
+import static net.ranides.assira.junit.NewAssert.*;
+
+/**
+ *
+ * @author Ranides Atterwim <ranides@gmail.com>
+ */
+public class ListTester<T> {
+    
+    @Resource(name = "list!")
+    private TCollection<T> $list;
+
+    @Resource(name = "nest!")
+    private boolean $nest = false;
+    
+    @InterfaceTest
+    public void basicAdd(List<T> target) {
+        assertEquals(0, target.size());
+        
+        for(TCollection.TItem<T> item : $list.range(32)) {
+            target.add(item.value());
+        }
+        
+        assertEquals(32, target.size());
+        assertEquals($list.item(4).value(), target.get(4));
+		assertEquals($list.range(32).into(new ArrayList<>()), target);
+    }
+	
+	@InterfaceTest
+    public void basicAddAt(List<T> target) {
+		assertEquals(0, target.size());
+		$list.range(8).into(target);
+		target.add(0, $list.item(71).value());
+		target.add(0, $list.item(72).value());
+		target.add(4, $list.item(73).value());
+		target.add(6, $list.item(74).value());
+		target.add(11, $list.item(75).value());
+		target.add(13, $list.item(76).value());
+
+		assertEquals( $list.list(72, 71, 0, 1, 73, 2, 74, 3, 4, 5, 6, 75, 7, 76).into(new ArrayList<>()), target);
+        
+                
+        assertThrows(IndexOutOfBoundsException.class, ()->{
+            target.add(-1, $list.item(66).value());
+        });
+        assertThrows(IndexOutOfBoundsException.class, ()->{
+            target.add(100, $list.item(66).value());
+        });
+        
+	}
+	
+	@InterfaceTest
+    public void basicAddAll(List<T> target) {
+        assertEquals(0, target.size());
+        
+		assertTrue(target.addAll($list.range(0,8).into(new ArrayList<>())));
+		assertTrue(target.addAll(4, $list.range(10,18).into(new ArrayList<>())));
+		assertFalse(target.addAll(4, new ArrayList<>()));
+        
+        assertEquals(16, target.size());
+        assertEquals($list.list(0,1,2,3,10,11,12,13,14,15,16,17,4,5,6,7).into(new ArrayList<>()), target);
+    }
+    
+    @InterfaceTest
+    public void basicGet(List<T> target) {
+        assertEquals(0, target.size());
+        $list.range(0,8).into(target);
+        
+        assertEquals(8, target.size());
+        
+		assertEquals($list.item(3).value(), target.get(3));
+		assertEquals($list.item(5).value(), target.get(5));
+		assertEquals($list.item(7).value(), target.get(7));
+        assertThrows(IndexOutOfBoundsException.class, ()->{
+            target.get(-1);
+        });
+        assertThrows(IndexOutOfBoundsException.class, ()->{
+            target.get(20);
+        });
+        assertThrows(IndexOutOfBoundsException.class, ()->{
+            target.get(8);
+        });
+    }
+	
+	@InterfaceTest
+    public void basicSet(List<T> target) {
+		$list.range(8).into(target);
+		target.set(0, $list.item(21).value());
+		target.set(2, $list.item(22).value());
+		target.set(7, $list.item(23).value());
+
+		assertThrows(IndexOutOfBoundsException.class, ()->{
+			target.set(8, $list.item(26).value());
+		});
+		assertThrows(IndexOutOfBoundsException.class, ()->{
+			target.set(-1, $list.item(27).value());
+		});
+		assertEquals( $list.list(21,1,22,3,4,5,6,23).into(new ArrayList<>()), target);
+	}
+	
+	@InterfaceTest
+    public void basicIndexOf(List<T> target) {
+		$list.list(1,3,5,7,9,3,3,11).into(target);
+		
+		assertEquals(0, target.indexOf(1));
+		assertEquals(1, target.indexOf(3));
+		assertEquals(2, target.indexOf(5));
+		assertEquals(3, target.indexOf(7));
+		assertEquals(4, target.indexOf(9));
+		assertEquals(7, target.indexOf(11));
+		assertEquals(-1, target.indexOf(0));
+	}
+	
+	@InterfaceTest
+    public void basicLastIndexOf(List<T> target) {
+		$list.list(1,3,5,7,9,3,3,11).into(target);
+		
+		assertEquals(6, target.lastIndexOf(3));
+        assertEquals(0, target.lastIndexOf(1));
+		assertEquals(2, target.lastIndexOf(5));
+		assertEquals(3, target.lastIndexOf(7));
+		assertEquals(4, target.lastIndexOf(9));
+		assertEquals(7, target.lastIndexOf(11));
+		assertEquals(-1, target.lastIndexOf(0));
+	}
+	
+	@InterfaceTest
+    public void basicRemove(List<T> target) {
+		$list.list(1,3,5,7,9,11).into(target);
+		
+		assertTrue(target.remove( $list.item(5).value()));
+		assertEquals( $list.list(1,3,7,9,11).into(new ArrayList<>()), target);
+		
+		assertTrue(target.remove( $list.item(1).value()));
+		assertEquals( $list.list(3,7,9,11).into(new ArrayList<>()), target);
+		
+		assertTrue(target.remove( $list.item(11).value()));
+		assertEquals( $list.list(3,7,9).into(new ArrayList<>()), target);
+		
+		assertFalse(target.remove( $list.item(0).value()));
+		assertEquals( $list.list(3,7,9).into(new ArrayList<>()), target);
+	}
+	
+	@InterfaceTest
+    public void basicRemoveIndex(List<T> target) {
+		$list.list(1,3,5,7,9,11).into(target);
+		
+		assertEquals($list.item(5).value(), target.remove(2));
+		assertEquals( $list.list(1,3,7,9,11).into(new ArrayList<>()), target);
+		
+		assertEquals($list.item(1).value(), target.remove(0));
+		assertEquals( $list.list(3,7,9,11).into(new ArrayList<>()), target);
+		
+		assertEquals($list.item(11).value(), target.remove(3));
+		assertEquals( $list.list(3,7,9).into(new ArrayList<>()), target);
+		
+		assertThrows(IndexOutOfBoundsException.class, ()->{
+			target.remove(20);
+		});
+		assertThrows(IndexOutOfBoundsException.class, ()->{
+			target.remove(-1);
+		});
+		assertEquals( $list.list(3,7,9).into(new ArrayList<>()), target);
+		
+		target.clear();
+		assertThrows(IndexOutOfBoundsException.class, ()->{
+			target.remove(0);
+		});
+	}
+    
+    @InterfaceTest
+    public void basicClear(List<T> target) {
+		$list.list(1,3,5,7,9,11).into(target);
+        assertEquals(6, target.size());
+        assertFalse(target.isEmpty());
+        
+        target.clear();
+        assertEquals(0, target.size());
+        assertTrue(target.isEmpty());
+        
+        $list.list(21,22).into(target);
+        assertEquals(2, target.size());
+        assertFalse(target.isEmpty());
+    }
+        
+    
+    @InterfaceTest
+    public void basicSerializable(List<T> target) {
+        $list.list(1,2,3,4).into(target);
+        assertSerializable(target);
+    }
+    
+    @InterfaceTest
+    public void basicEquals(Supplier<List<T>> generator) {
+        List<T> list1 = $list.list(1,2,3,4).into(generator.get());
+        List<T> list2 = $list.list(1,2,3,4).into(generator.get());
+        List<T> list3 = $list.list(1,5,6,8).into(generator.get());
+        List<T> list4 = $list.list(1,2,3).into(generator.get());
+        List<T> list5 = $list.list(1,2,4,3).into(generator.get());
+        
+        assertEquality(list1, list2, list3);
+        assertEquality(list1, list2, list4);
+        assertEquality(list1, list2, list5);
+    }
+    
+    @InterfaceTest
+    public void basicSublist(List<T> target) {
+        $list.list(1,3,5,7,9).into(target);
+        
+        assertEquals($values(3,5,7,9), target.subList(1, 5));
+        assertEquals($values(3,5,7), target.subList(1, 4));
+        assertEquals($values(1,3,5,7,9), target.subList(0, 5));
+        
+        assertThrows(IndexOutOfBoundsException.class, ()->{
+            target.subList(-1, 3);
+        });
+        assertThrows(IndexOutOfBoundsException.class, ()->{
+            target.subList(1, 30);
+        });
+        assertThrows(IndexOutOfBoundsException.class, ()->{
+            target.subList(0, 6);
+        });
+        assertThrows(IllegalArgumentException.class, ()->{
+            target.subList(4, 1);
+        });
+    }
+    
+    @InterfaceTest
+    public void basicSublist_indexOf(List<T> target) {
+        $list.list(1,3,5,7,9).into(target);
+        
+        assertEquals(-1, target.subList(1, 3).indexOf($list.item(9).value()));
+        assertEquals(-1, target.subList(1, 3).indexOf($list.item(1).value()));
+        assertEquals(1, target.subList(1, 3).indexOf($list.item(5).value()));
+    }
+    
+    @InterfaceTest
+    public void basicSublist_lastIndexOf(List<T> target) {
+        $list.list(1,3,5,7,9).into(target);
+        
+        assertEquals(-1, target.subList(1, 3).lastIndexOf($list.item(9).value()));
+        assertEquals(-1, target.subList(1, 3).lastIndexOf($list.item(1).value()));
+        assertEquals(1, target.subList(1, 3).lastIndexOf($list.item(5).value()));
+    }
+    
+    @InterfaceTest
+    public void basicSublist_add(List<T> target) {
+        $list.list(1,3,5,7,9).into(target);
+        List<T> sub = target.subList(1, 3);
+        
+        assertEquals($values(3,5), sub);
+        assertEquals($values(1,3,5,7,9), target);
+        
+        sub.add(1, $list.item(21).value());
+        assertEquals($values(3,21,5), sub);
+        assertEquals($values(1,3,21,5,7,9), target);
+        
+        sub.add($list.item(31).value());
+        assertEquals($values(3,21,5,31), sub);
+        assertEquals($values(1,3,21,5,31,7,9), target);
+    }
+    
+    @InterfaceTest
+    public void basicSublist_addAll(List<T> target) {
+        $list.list(1,3,5,7,9).into(target);
+        List<T> sub = target.subList(1, 3);
+        
+        assertEquals($values(3,5), sub);
+        assertEquals($values(1,3,5,7,9), target);
+        
+        sub.addAll(1, $values(21,22));
+        assertEquals($values(3,21,22,5), sub);
+        assertEquals($values(1,3,21,22,5,7,9), target);
+        
+        sub.addAll($values(31,32));
+        assertEquals($values(3,21,22,5,31,32), sub);
+        assertEquals($values(1,3,21,22,5,31,32,7,9), target);
+    }
+    
+    @InterfaceTest
+    public void basicSublist_clear(List<T> target) {
+        $list.list(1,3,5,7,9).into(target);
+        List<T> sub = target.subList(1, 3);
+        
+        sub.clear();
+        assertEquals(Collections.emptyList(), sub);
+        assertEquals($values(1,7,9), target);
+        
+        sub.addAll($values(31,32));
+        assertEquals($values(31,32), sub);
+        assertEquals($values(1,31,32,7,9), target);
+    }
+    
+    @InterfaceTest
+    public void basicSublist_set(List<T> target) {
+        $list.list(1,3,5,7,9).into(target);
+        List<T> sub = target.subList(1, 3);
+        
+        assertEquals($list.item(3).value(), sub.set(0, $list.item(21).value()));
+        assertEquals($list.item(5).value(), sub.set(1, $list.item(22).value()));
+        
+        assertEquals($list.item(21).value(), sub.get(0));
+        assertEquals($list.item(22).value(), sub.get(1));
+        
+        assertEquals($values(21,22), sub);
+        assertEquals($values(1,21,22,7,9), target);
+    }
+    
+    @SuppressWarnings("unchecked")
+    @InterfaceTest
+    public void basicIterator(List<T> target) {
+        TItems<T> list1 = $list.list();
+        TItems<T> list2 = $list.list(3, 4, 5, 6, 7);
+        
+        IteratorTester.listIterator(target.listIterator(), 0, list1.values());
+        
+        list2.into(target);
+        
+        IteratorTester.listIterator(target.listIterator(), 0, list2.values());
+    }
+    
+    @InterfaceTest
+    public void basicIteratorFrom(List<T> target) {
+        TItems<T> list1 = $list.list();
+        TItems<T> list2 = $list.list(3, 4, 5, 6, 7);
+        
+        IteratorTester.listIterator(target.listIterator(0), 0, list1.values());
+        
+        list2.into(target);
+        IteratorTester.listIterator(target.listIterator(2), 2, list2.values());
+    }
+    
+    @InterfaceTest
+    public void basicIterator_Remove(List<T> target) {
+		assertEquals(0, target.size());
+        
+		$list.list(1,2,3,5).into(target);
+		T v1 = $list.item(1).value();
+		T v2 = $list.item(3).value();
+        
+		Iterator<T> iterator = target.iterator();
+		while(iterator.hasNext()) {
+			T var = iterator.next();
+			if(v1.equals(var)) {
+                iterator.remove();
+            }
+            if(v2.equals(var)) {
+                iterator.remove();
+                assertThrows(IllegalStateException.class, ()-> iterator.remove());
+            }
+		}
+        
+        assertEquals(2, target.size());
+        assertEquals(-1, target.indexOf(v1));
+        assertEquals(-1, target.indexOf(v2));
+        assertEquals($values(2,5), target);
+        
+        target.clear();
+        assertEquals(0, target.size());
+	}
+    
+    @InterfaceTest
+    public void basicIterator_Set(List<T> target) {
+		assertEquals(0, target.size());
+        
+		$list.list(1,2,3,5).into(target);
+		T v1 = $list.item(1).value();
+		T v2 = $list.item(3).value();
+        
+		ListIterator<T> iterator = target.listIterator();
+        
+        assertThrows(IllegalStateException.class, ()->{
+            iterator.set($list.item(41).value());
+        });
+        
+		while(iterator.hasNext()) {
+			T var = iterator.next();
+			if(v1.equals(var)) {
+                iterator.set($list.item(21).value());
+            }
+            if(v2.equals(var)) {
+                iterator.set($list.item(31).value());
+                iterator.set($list.item(32).value());
+            }
+		}
+        assertEquals($values(21,2,32,5), target);
+	}
+    
+    @InterfaceTest
+    public void basicIterator_Add(List<T> target) {
+		assertEquals(0, target.size());
+        
+		$list.list(1,2,3,5).into(target);
+		T v1 = $list.item(1).value();
+		T v2 = $list.item(3).value();
+        
+		ListIterator<T> iterator = target.listIterator();
+        
+        iterator.add($list.item(41).value());
+        
+		while(iterator.hasNext()) {
+			T var = iterator.next();
+			if(v1.equals(var)) {
+                iterator.add($list.item(21).value());
+            }
+            if(v2.equals(var)) {
+                iterator.add($list.item(31).value());
+                iterator.add($list.item(32).value());
+            }
+		}
+        assertEquals($values(41, 1, 21, 2, 3, 31, 32, 5), target);
+	}
+    
+    @InterfaceTest
+    public void nestedSublistTest(Supplier<List<T>> target) {
+        if(!$nest) {
+            throw new UnsupportedOperationException("TEST.SILENT");
+        }
+        new InterfaceSuite(System.err)
+            .append(new ListTester<>())
+            .append(new IntListTester())
+            .param("list!", $list)
+            .run(()->target.get().subList(0, 0));
+        
+    }
+    
+    private List<T> $values(int... values) {
+        return $list.list(values).into(new ArrayList<>());
+    }
+}