package net.varkhan.base.containers.list;
import junit.framework.TestCase;
import net.varkhan.base.containers.Visitable;
import java.io.*;
import java.util.*;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 11/2/13
* @time 3:47 PM
*/
public abstract class AbstractListTest extends TestCase {
protected static Integer[] genIntegerList(Random rand, int size, double sparsityratio) {
Integer[] lst=new Integer[size];
for(int i=0;i<size;i++) {
if(rand.nextFloat()<sparsityratio) lst[i]=null;
else {
lst[i]=i;
}
}
return lst;
}
public <T> void featureTestAdd(Random rand, T[] vals, List<T> lst) throws Exception {
Set<Integer> add=new HashSet<Integer>();
int size=0;
int[] pos = new int[vals.length];
while(add.size()<vals.length) {
int i=rand.nextInt(vals.length);
if(add.contains(i)) continue;
add.add(i);
if(vals[i]==null) {
continue;
}
pos[size++] = i;
assertTrue("add("+i+")",lst.add(vals[i]));
assertEquals("size()", size, lst.size());
}
assertEquals("size()", size, lst.size());
for(int i=0; i<size; i++) {
assertSame("get(i)",vals[pos[i]],lst.get(i));
}
System.out.println("add(T) OK");
}
public <T> void featureTestAddI(Random rand, T[] vals, List<T> lst) throws Exception {
Set<Integer> add=new HashSet<Integer>();
int size=0;
int[] pos = new int[vals.length];
while(add.size()<vals.length) {
int i=rand.nextInt(vals.length);
if(add.contains(i)) continue;
add.add(i);
if(vals[i]==null) {
continue;
}
int j = rand.nextInt(size+1);
System.arraycopy(pos,j,pos,j+1,size-j);
pos[j] = i;
size++;
assertTrue("add("+j+","+i+")",lst.add(j,vals[i]));
assertEquals("size()", size, lst.size());
}
assertEquals("size()", size, lst.size());
for(int i=0; i<size; i++) {
assertSame("get(i)",vals[pos[i]],lst.get(i));
}
System.out.println("add(i,T) OK");
}
public <T> void featureTestSet(Random rand, T[] vals, List<T> lst) throws Exception {
Set<Integer> add=new HashSet<Integer>();
int size=0;
int[] pos = new int[vals.length];
while(add.size()<vals.length) {
int i=rand.nextInt(vals.length);
if(add.contains(i)) continue;
add.add(i);
if(vals[i]==null) {
continue;
}
pos[size++] = i;
assertTrue("add("+i+")",lst.add(vals[i]));
assertEquals("size()", size, lst.size());
}
assertEquals("size()", size, lst.size());
for(int i=0; i<size; i++) {
assertSame("get(i)",vals[pos[i]],lst.get(i));
}
Map<Integer,Integer> ref = new HashMap<Integer,Integer>();
while(ref.size()<size/2) {
int i=rand.nextInt(vals.length);
int j=rand.nextInt(size);
if(ref.containsKey(j)) continue;
ref.put(j,i);
if(vals[i]==null) {
continue;
}
assertTrue("set("+j+")", lst.set(j, vals[i]));
}
for(Map.Entry<Integer,Integer> e: ref.entrySet()) {
int j= e.getKey();
int i= e.getValue();
if(vals[i]!=null) assertSame("get("+j+")", vals[i], lst.get(j));
}
System.out.println("set(T) OK");
}
public <T> void featureTestDel(Random rand, T[] vals, List<T> lst) throws Exception {
Set<Integer> add=new HashSet<Integer>();
int size=0;
int[] pos = new int[vals.length];
while(add.size()<vals.length) {
int i=rand.nextInt(vals.length);
if(add.contains(i)) continue;
add.add(i);
if(vals[i]==null) {
continue;
}
pos[size++] = i;
assertTrue("add("+i+")", lst.add(vals[i]));
assertEquals("size()", size, lst.size());
}
assertEquals("size()", size, lst.size());
for(int i=0; i<size; i++) {
assertSame("get(i)",vals[pos[i]],lst.get(i));
}
for(int c=0;c<=size/2;c++) {
int i=rand.nextInt((int)lst.size());
System.arraycopy(pos,i+1,pos,i,pos.length-i-1);
size--;
assertTrue("del("+i+")",lst.del(i));
assertEquals("size()", size, lst.size());
}
assertEquals("size()", size, lst.size());
for(int i=0; i<size; i++) {
assertSame("get(i)",vals[pos[i]],lst.get(i));
}
System.out.println("del(T) OK");
}
public <T> void featureTestClear(Random rand, T[] vals, List<T> lst) throws Exception {
for(int i=0;i<vals.length;i++) if(vals[i]!=null) lst.add(vals[i]);
lst.clear();
assertTrue("isEmpty", lst.isEmpty());
assertEquals("size()", 0, lst.size());
System.out.println("clear() OK");
}
public <T> void featureTestFree(Random rand, T[] vals, IndexedList<T> ilst) throws Exception {
ilst.clear();
long maxidx=0;
for(int i=0;i<vals.length;i++) if(vals[i]!=null) {
long idx = ilst.set(i, vals[i]);
if(maxidx<idx) maxidx=idx;
}
assertFalse("!has(free())",ilst.has(ilst.free()));
assertTrue("free()<=head()",ilst.free()<=maxidx);
System.out.println("free() OK");
}
public <T> void featureTestIterator(Random rand, T[] vals, List<T> lst) throws Exception {
for(int i=0;i<vals.length;i++) if(vals[i]!=null) lst.add(vals[i]);
Iterator<? extends T> it=lst.iterator();
for(int i=0;i<vals.length;i++) {
if(vals[i]!=null) {
assertTrue(i+": hasNext()", it.hasNext());
assertEquals(i+": next()", vals[i], it.next());
}
}
assertFalse("hasNext()", it.hasNext());
System.out.println("iterator() OK");
}
public <T> void featureTestVisit(Random rand, T[] vals, List<T> lst) throws Exception {
java.util.Set<T> ref = new HashSet<T>();
for(int i=0;i<vals.length;i++) if(vals[i]!=null) {
lst.add(vals[i]);
ref.add(vals[i]);
}
Visitable.Visitor<T,java.util.Set<T>> vv= new Visitable.Visitor<T,java.util.Set<T>>() {
@Override
public long invoke(T obj, java.util.Set<T> ts) {
return ts.contains(obj)?1:-1;
}
};
assertEquals("size()==visit()", lst.size(), lst.visit(vv, ref));
System.out.println("visit(Visitor) OK");
}
public <T> void featureTestSublist(Random rand, T[] vals, T ext, List<T> lst, int beg, int end) {
for(int i=0;i<vals.length;i++) lst.add(vals[i]);
List<T> sl = lst.sublist(beg, end);
assertEquals("size()==end-beg",end-beg,sl.size());
assertEquals("isEmpty() iff beg==end",beg==end,sl.isEmpty());
assertEquals("hashCode()",lst.sublist(beg, end).hashCode(),sl.hashCode());
assertEquals("hashCode()",lst.hashCode(),lst.sublist(0, lst.size()).hashCode());
assertTrue("equals()",lst.sublist(beg, end).equals(sl));
assertTrue("equals()",lst.sublist(0, lst.size()).equals(lst));
assertTrue("equals()",lst.equals(lst.sublist(0, lst.size())));
Iterator<? extends T> it=sl.iterator();
for(int i=0;i<end-beg;i++) {
// if(vals[beg+i]!=null) {
assertTrue(i+": hasNext()", it.hasNext());
assertEquals(i+": next()", vals[beg+i], it.next());
// }
}
assertFalse("hasNext()", it.hasNext());
assertTrue("add()",sl.add(ext));
assertEquals("add()?",ext,lst.get(end));
assertTrue("add(i)",sl.add(0,ext));
assertEquals("add(i)?",ext,lst.get(beg));
System.out.println("sublist() OK");
}
public <T> void featureTestSerialize(Random rand, T[] vals, List<T> lst) throws Exception {
for(int i=0;i<vals.length;i++) if(vals[i]!=null) lst.add(vals[i]);
File t=null;
try {
t=File.createTempFile("serial-", ".ser");
ObjectOutputStream os=null;
try {
os=new ObjectOutputStream(new FileOutputStream(t));
os.writeObject(lst);
}
finally {
if(os!=null) os.close();
}
ObjectInputStream is=null;
List<T> slst=null;
try {
is=new ObjectInputStream(new FileInputStream(t));
slst=(List<T>) is.readObject();
}
finally {
if(is!=null) is.close();
}
// assertTrue("serialize(lst)==lst", lst.equals(slst));
assertEquals("size(lst)==lst", lst.size(),slst.size());
for(int i=0;i<lst.size();i++) {
assertEquals("get("+i+")", lst.get(i), slst.get(i));
}
System.out.println("serial OK");
}
finally {
if(t!=null) t.delete();
}
}
public <T> void featureTestEquals(Random rand, T[] vals, List<T> lst, List<T> eql) throws Exception {
for(int i=0;i<vals.length;i++) if(vals[i]!=null) lst.add(vals[i]);
assertFalse("lst.equals(eql)", lst.equals(eql));
for(int i=0;i<vals.length;i++) if(vals[i]!=null) eql.add(vals[i]);
assertTrue("lst.equals(eql)", lst.equals(eql));
assertEquals("lst.hashCode()", lst.hashCode(), eql.hashCode());
for(int i=0; i<100; i++) {
int p = rand.nextInt();
if(lst.del(p)) assertFalse("lst.equals(eql)", lst.equals(eql));
else assertTrue("lst.equals(eql)", lst.equals(eql));
eql.del(p);
assertTrue("lst.equals(eql)", lst.equals(eql));
assertEquals("lst.hashCode()", lst.hashCode(), eql.hashCode());
}
System.out.println("equals OK");
}
public <T,L extends List<T> & Cloneable> void featureTestClone(Random rand, T[] vals, L lst) throws Exception {
for(int i=0;i<vals.length;i++) if(vals[i]!=null) lst.add(vals[i]);
List<T> cln = clone(lst);
assertEquals("size(lst)==lst", lst.size(),cln.size());
for(int i=0;i<lst.size();i++) {
assertEquals("get("+i+")", lst.get(i), cln.get(i));
}
System.out.println("clone OK");
}
@SuppressWarnings("unchecked")
public static <C extends Cloneable> C clone(C obj) {
try {
return (C) obj.getClass().getMethod("clone").invoke(obj);
}
catch(Exception e) {
return null;
}
}
public <T> void featureTestString(Random rand, T[] vals, List<T> lst) throws Exception {
lst.clear();
assertEquals("[].toString()","[ ]",lst.toString());
StringBuilder b = new StringBuilder("[");
boolean f=true;
for(int i=0;i<vals.length && i<100;i++) {
if(vals[i]!=null) {
lst.add(vals[i]);
if(f) f=false;
else b.append(",");
b.append(" ").append(vals[i]);
assertEquals("toString() ["+i+"]",b.toString()+" ]",lst.toString());
}
}
}
}