package net.varkhan.base.containers.array;
import junit.framework.TestCase;
import net.varkhan.base.containers.Iterator;
import net.varkhan.base.containers.list.List;
import net.varkhan.base.containers.map.Map;
import java.util.Comparator;
import java.util.Random;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 3/24/12
* @time 9:39 PM
*/
public class ArraysTest extends TestCase {
public static <T> void assertArrayEquals(String message, T[] expected, T[] actual) {
if(!Arrays.equals(expected,actual)) fail(message+";\n expected: ["+Arrays.join(",",expected)+"];\n actual: ["+Arrays.join(",",actual)+"]");
}
public void testEquals() throws Exception {
assertTrue("equals([],[])", Arrays.equals(new Object[] {}, new Object[] {}));
assertTrue("equals([1,2,3,\"6\"],[1,2,3,\"6\"])", Arrays.equals(new Object[] { 1, 2, 3, "6" }, new Object[] { 1, 2, 3, "6" }));
assertFalse("equals([1,2,3,\"6\"],[5,2,3,\"6\"])", Arrays.equals(new Object[] { 1, 2, 3, "6" }, new Object[] { 5, 2, 3, "6" }));
assertFalse("equals([1,2,3,\"6\"],[1,2,3,null])", Arrays.equals(new Object[] { 1, 2, 3, "6" }, new Object[] { 5, 2, 3, null }));
assertFalse("equals([1,2,3,\"6\"],[1,2,3,\"6\",10])", Arrays.equals(new Object[] { 1, 2, 3, "6" }, new Object[] { 5, 2, 3, "6", 10 }));
}
public void testIndexOf() throws Exception {
assertEquals("indexOf(null,1,2,\"3\",null)", 3, Arrays.indexOf(null,1,2,"3",null));
assertEquals("indexOf(null,null,2,\"3\",4)", 0, Arrays.indexOf(null, null, 2, "3", 4));
assertEquals("indexOf(null,1,2,\"3\",4)", -1, Arrays.indexOf(null, 1, 2, "3", 4));
assertEquals("indexOf(1,1,2,\"3\",null)", 0, Arrays.indexOf(1, 1, 2, "3", null));
assertEquals("indexOf(4,1,2,\"3\",null)", -1, Arrays.indexOf(4, 1, 2, "3", null));
assertEquals("indexOf(4,1,2,\"3\",4)", 3, Arrays.indexOf(4, 1, 2, "3", 4));
assertEquals("indexOf(\"3\",1,2,\"3\",4)", 2, Arrays.indexOf("3", 1, 2, "3", 4));
}
public void testSort() throws Exception {
Integer[] ary = {0};
Arrays.sort(ary);
assertArrayEquals("heapSort(0)", new Integer[] { 0 }, ary);
ary = new Integer[]{3,2,1,1,4,4,6,5,7,2};
Arrays.sort(ary);
assertArrayEquals("heapSort(3,2,1,1,4,4,6,5,7,2)", new Object[] { 1, 1, 2, 2, 3, 4, 4, 5, 6, 7 }, ary);
int N = 500; // Max number of objects that will fit in normal heap size: 16*500^2 = 4m
Integer[][] a = new Integer[N][];
Integer[][] a1 = new Integer[N][];
Integer[][] a2 = new Integer[N][];
Random rand = new Random();
int n = 0;
int c = 0;
for(int i=0; i<N; i++) {
int l = rand.nextInt(N);
Integer[] s = new Integer[l];
for(int j=0; j<l; j++) s[j]=rand.nextInt();
a[i] = s;
a1[i] = s.clone();
a2[i] = s.clone();
n += l;
}
System.out.println("Sorting "+N+" arrays of "+n+" elements");
long t0 = System.currentTimeMillis();
for(int i=0; i<N; i++) {
c+=Arrays.sort(a1[i]);
}
long t1 = System.currentTimeMillis();
for(int i=0; i<N; i++) {
java.util.Arrays.sort(a2[i]);
}
long t2 = System.currentTimeMillis();
for(int i=0; i<N; i++) {
assertArrayEquals("sort("+Arrays.join(",",a[i])+")",a2[i],a1[i]);
}
System.out.println("Sorted "+N+" arrays of "+n+" elements in "+(t1-t0)+"ms, "+c+" operations ("+(t2-t1)+"ms for java.util.Arrays.sort)");
}
public void testSortCmp() throws Exception {
Comparator<String> cmp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
// if (o1.equals(o2)) return 0;
// if (o1.length() == 0 && o2.length() == 0) return 0;
// if (o1.length() == 0) return -1;
// if (o2.length() == 0) return +1;
// return o1.charAt(0) - o2.charAt(0);
}
};
String[] ary = {"0"};
Arrays.sort(cmp, ary);
assertArrayEquals("heapSort(0)", new String[] { "0" }, ary);
ary = new String[]{"3","2","1","1","4","4","6","5","7","2"};
Arrays.sort(cmp, ary);
assertArrayEquals("heapSort(3,2,1,1,4,4,6,5,7,2)", new Object[] { "1", "1", "2", "2", "3", "4", "4", "5", "6", "7" }, ary);
int N = 500; // Max number of objects that will fit in normal heap size: 16*500^2 = 4m
String[][] a = new String[N][];
String[][] a1 = new String[N][];
String[][] a2 = new String[N][];
Random rand = new Random();
int n = 0;
int c = 0;
for(int i=0; i<N; i++) {
int l = rand.nextInt(N);
String[] s = new String[l];
for(int j=0; j<l; j++) s[j]=""+(char)('a'+rand.nextInt(26));
a[i] = s;
a1[i] = s.clone();
a2[i] = s.clone();
n += l;
}
System.out.println("Sorting "+N+" arrays of "+n+" elements");
long t0 = System.currentTimeMillis();
for(int i=0; i<N; i++) {
c+=Arrays.sort(cmp, a1[i]);
}
long t1 = System.currentTimeMillis();
for(int i=0; i<N; i++) {
java.util.Arrays.sort(a2[i],cmp);
}
long t2 = System.currentTimeMillis();
for(int i=0; i<N; i++) {
assertArrayEquals("sort("+Arrays.join(",",a[i])+")",a2[i],a1[i]);
}
System.out.println("Sorted "+N+" arrays of "+n+" elements in "+(t1-t0)+"ms, "+c+" operations ("+(t2-t1)+"ms for java.util.Arrays.sort)");
}
public void testSearch() throws Exception {
String[] a1 = new String[] {};
assertEquals("",-1,Arrays.search(a1,0,0,"1"));
String[] a2 = new String[] { "2"};
assertEquals("",-2,Arrays.search(a2,0,1,"3"));
String[] a3 = new String[] { "2"};
assertEquals("",-1,Arrays.search(a3,0,1,"1"));
assertEquals("",0,Arrays.search(a3,0,1,"2"));
String[] a4 = new String[]{"2", "3", "4", "7", "8"};
assertEquals("",-4,Arrays.search(a4,0,5,"5"));
assertEquals("",2,Arrays.search(a4,0,5,"4"));
}
public void testSearchCmp() throws Exception {
Comparator<String> cmp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
// if (o1.equals(o2)) return 0;
// if (o1.length() == 0 && o2.length() == 0) return 0;
// if (o1.length() == 0) return -1;
// if (o2.length() == 0) return +1;
// return o1.charAt(0) - o2.charAt(0);
}
};
String[] a1 = new String[] {};
assertEquals("",-1,Arrays.search(a1,0,0,"1",cmp));
String[] a2 = new String[] { "2"};
assertEquals("",-2,Arrays.search(a2,0,1,"3",cmp));
String[] a3 = new String[] { "2"};
assertEquals("",-1,Arrays.search(a3,0,1,"1",cmp));
assertEquals("",0,Arrays.search(a3,0,1,"2",cmp));
String[] a4 = new String[]{"2", "3", "4", "7", "8"};
assertEquals("",-4,Arrays.search(a4,0,5,"5",cmp));
assertEquals("",2,Arrays.search(a4,0,5,"4",cmp));
}
public void testInsert() throws Exception {
String[] a1 = new String[] {null};
assertEquals("",0,Arrays.insert(a1,0,0,"1"));
assertArrayEquals("",new String[]{"1"},a1);
String[] a2 = new String[] { "2", null};
assertEquals("",1,Arrays.insert(a2,0,1,"3"));
assertArrayEquals("",new String[]{"2","3"},a2);
String[] a3 = new String[] { "2", null};
assertEquals("",0,Arrays.insert(a3,0,1,"1"));
assertArrayEquals("",new String[]{"1","2"},a3);
String[] a4 = new String[]{"2", "3", "4", "7", "8", null};
assertEquals("",3,Arrays.insert(a4,0,5,"5"));
assertArrayEquals("",new String[]{"2", "3", "4", "5", "7", "8"},a4);
}
public void testInsertCmp() throws Exception {
Comparator<String> cmp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
// if (o1.equals(o2)) return 0;
// if (o1.length() == 0 && o2.length() == 0) return 0;
// if (o1.length() == 0) return -1;
// if (o2.length() == 0) return +1;
// return o1.charAt(0) - o2.charAt(0);
}
};
String[] a1 = new String[] {null};
assertEquals("",0,Arrays.insert(a1,0,0,"1",cmp));
assertArrayEquals("",new String[]{"1"},a1);
String[] a2 = new String[] { "2", null};
assertEquals("",1,Arrays.insert(a2,0,1,"3",cmp));
assertArrayEquals("",new String[]{"2","3"},a2);
String[] a3 = new String[] { "2", null};
assertEquals("",0,Arrays.insert(a3,0,1,"1",cmp));
assertArrayEquals("",new String[]{"1","2"},a3);
String[] a4 = new String[]{"2", "3", "4", "7", "8", null};
assertEquals("",3,Arrays.insert(a4,0,5,"5",cmp));
assertArrayEquals("",new String[]{"2", "3", "4", "5", "7", "8"},a4);
}
public void testUnion() throws Exception {
assertArrayEquals("",
new String[]{},
Arrays.union(new String[]{}, 0, 0, new String[]{}, 0, 0));
assertArrayEquals("",
new String[]{"2", "3", "4", "5", "6"},
Arrays.union(new String[]{}, 0, 0, new String[]{"2", "3", "4", "5", "6"}, 0, 5));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6", "7"},
Arrays.union(new String[]{"1", "3", "7"}, 0, 3, new String[]{"2", "3", "4", "5", "6"}, 0, 5));
}
public void testUnionCmp() throws Exception {
Comparator<String> cmp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.equals(o2)) return 0;
if (o1.length() == 0 && o2.length() == 0) return 0;
if (o1.length() == 0) return -1;
if (o2.length() == 0) return +1;
return o1.charAt(0) - o2.charAt(0);
}
};
assertArrayEquals("",
new String[]{},
Arrays.union(new String[]{}, 0, 0, new String[]{}, 0, 0, cmp));
assertArrayEquals("",
new String[]{"2", "3", "4", "5", "6"},
Arrays.union(new String[]{}, 0, 0, new String[]{"2", "3", "4", "5", "6"}, 0, 5, cmp));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6", "7"},
Arrays.union(new String[]{"1", "3", "7"}, 0, 3, new String[]{"2", "3", "4", "5", "6"}, 0, 5, cmp));
}
public void testInter() throws Exception {
assertArrayEquals("",
new String[]{},
Arrays.inter(new String[]{}, 0, 0, new String[]{}, 0, 0));
assertArrayEquals("",
new String[]{},
Arrays.inter(new String[]{}, 0, 0, new String[]{"2", "3", "4", "5", "6"}, 0, 5));
assertArrayEquals("",
new String[]{"3"},
Arrays.inter(new String[]{"1", "3", "7"}, 0, 3, new String[]{"2", "3", "4", "5", "6"}, 0, 5));
assertArrayEquals("",
new String[]{"3", "6"},
Arrays.inter(new String[]{"1", "3", "6"}, 0, 3, new String[]{"2", "3", "4", "5", "6"}, 0, 5));
}
public void testInterCmp() throws Exception {
Comparator<String> cmp = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.equals(o2)) return 0;
if (o1.length() == 0 && o2.length() == 0) return 0;
if (o1.length() == 0) return -1;
if (o2.length() == 0) return +1;
return o1.charAt(0) - o2.charAt(0);
}
};
assertArrayEquals("",
new String[]{},
Arrays.inter(new String[]{}, 0, 0, new String[]{}, 0, 0, cmp));
assertArrayEquals("",
new String[]{},
Arrays.inter(new String[]{}, 0, 0, new String[]{"2", "3", "4", "5", "6"}, 0, 5, cmp));
assertArrayEquals("",
new String[]{"3"},
Arrays.inter(new String[]{"1", "3", "7"}, 0, 3, new String[]{"2", "3", "4", "5", "6"}, 0, 5, cmp));
assertArrayEquals("",
new String[]{"3", "6"},
Arrays.inter(new String[]{"1", "3", "6"}, 0, 3, new String[]{"2", "3", "4", "5", "6"}, 0, 5, cmp));
}
public void testAppend() throws Exception {
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6"},
Arrays.append(new String[]{"1", "2", "3"}, "4", "5", "6"));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6"},
Arrays.append(new String[]{}, "1", "2", "3", "4", "5", "6"));
assertArrayEquals("",
new String[]{},
Arrays.append(new String[]{}));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5"},
Arrays.append(new String[]{"1", "2", "3"}, "4", "5"));
assertArrayEquals("",
new String[]{"1", "2", "3"},
Arrays.append(new String[]{"1", "2", "3"}));
}
public void testPrepend() throws Exception {
assertArrayEquals("",
new String[]{"4", "5", "6", "1", "2", "3"},
Arrays.prepend(new String[]{"1", "2", "3"}, "4", "5", "6"));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6"},
Arrays.prepend(new String[]{}, "1", "2", "3", "4", "5", "6"));
assertArrayEquals("",
new String[]{},
Arrays.prepend(new String[]{}));
assertArrayEquals("",
new String[]{"4", "5", "1", "2", "3"},
Arrays.prepend(new String[]{"1", "2", "3"}, "4", "5"));
assertArrayEquals("",
new String[]{"1", "2", "3"},
Arrays.prepend(new String[]{"1", "2", "3"}));
}
public void testConcat() throws Exception {
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6"},
Arrays.concat(new String[]{"1", "2", "3"}, new String[]{"4", "5", "6"}));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6"},
Arrays.concat(new String[]{}, new String[]{"1", "2", "3", "4", "5", "6"}));
assertArrayEquals("",
new String[]{},
Arrays.concat(new String[]{}));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6"},
Arrays.concat(new String[]{"1", "2", "3"}, new String[]{"4", "5"}, new String[]{"6"}));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6"},
Arrays.concat(new String[]{"1", "2", "3"}, new String[]{}, new String[]{"4", "5"}, new String[]{"6"}));
assertArrayEquals("",
new String[]{"1", "2", "3", "4", "5", "6"},
Arrays.concat(new String[]{}, new String[]{"1", "2", "3"}, new String[]{"4", "5"}, new String[]{"6"}));
}
public void testSubarray() throws Exception {
assertArrayEquals("subarray([],0,0)", new Object[] { }, Arrays.subarray(new String[]{}, 0, 0));
assertArrayEquals("subarray([1,2,3,4,5,6],0,0)", new Object[] { }, Arrays.subarray(new Object[] { 1, 2, 3, 4, 5, 6 }, 0, 0));
assertArrayEquals("subarray([1,2,3,4,5,6],6,6)", new Object[] { }, Arrays.subarray(new Object[] { 1, 2, 3, 4, 5, 6 }, 6, 6));
assertArrayEquals("subarray([1,2,3,4,5,6],1,4)", new Object[] { 2, 3, 4 }, Arrays.subarray(new Object[] { 1, 2, 3, 4, 5, 6 }, 1, 4));
assertArrayEquals("subarray([1,2,3,4,5,6],2,3)", new Object[] { 3 }, Arrays.subarray(new Object[] { 1, 2, 3, 4, 5, 6 }, 2, 3));
assertArrayEquals("subarray([1,2,3,4,5,6],0,6)", new Object[] { 1, 2, 3, 4, 5, 6 }, Arrays.subarray(new Object[] { 1, 2, 3, 4, 5, 6 }, 0, 6));
assertArrayEquals("subarray([1,2,3,4,5,6],1,1)", new Object[] { }, Arrays.subarray(new Object[] { 1, 2, 3, 4, 5, 6 }, 1, 1));
try {
Arrays.subarray(new Object[] { }, 0, 1);
fail("subarray([],0,1)");
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
Arrays.subarray(new Object[] { }, 1, 0);
fail("subarray([],1,0)");
} catch (ArrayIndexOutOfBoundsException e) {
}
try {
Arrays.subarray(new Object[] { 1, 2, 3, 4, 5, 6 }, 3, 7);
fail("subarray([1,2,3,4,5,6],3,7)");
} catch (ArrayIndexOutOfBoundsException e) {
}
assertArrayEquals("subarray(['1','2','3','4','5','6'],0,6)", new String[] { "1", "2", "3", "4", "5", "6" },
Arrays.subarray(new String[] { "1", "2", "3", "4", "5", "6" }, 0, 6));
}
public void testAsList() throws Exception {
List<String> list = Arrays.asList("val1", "val2", "val3", "val4");
assertEquals("asList(...).size()", 4, list.size());
Iterator<? extends String> it=list.iterator();
assertEquals("asList(...).iterator().next()", "val1", it.next());
assertEquals("asList(...).iterator().next()2", "val2", it.next());
assertEquals("asList(...).iterator().next()3", "val3", it.next());
assertEquals("asList(...).iterator().next()4", "val4", it.next());
assertFalse("asList(...).iterator().next()4.hasNext()", it.hasNext());
List<String> slist = list.sublist(1,2);
assertEquals("asList(...).sublist(1,2).size()", 1, slist.size());
Iterator<? extends String> sit=slist.iterator();
assertEquals("asList(...).sublist(1,2).iterator().next()", "val2", sit.next());
assertFalse("asList(...).sublist(1,2).iterator().next().hasNext()", sit.hasNext());
slist = list.sublist(1,4);
assertEquals("asList(...).sublist(1,4).size()", 3, slist.size());
sit=slist.iterator();
assertEquals("asList(...).sublist(1,4).iterator().next()", "val2", sit.next());
assertEquals("asList(...).sublist(1,4).iterator().next()2", "val3", sit.next());
assertEquals("asList(...).sublist(1,4).iterator().next()3", "val4", sit.next());
assertFalse("asList(...).sublist(1,4).iterator().next()3.hasNext()", sit.hasNext());
}
public void testAsMap() throws Exception {
Map<String, String> map0 = Arrays.asMap(String.class, String.class);
assertEquals("asMap().isEmpty()", true, map0.isEmpty());
Map<String, String> map1 = Arrays.asMap(String.class, String.class, "key1", "val1", "key2", "val2");
assertEquals("asMap(...).has(key1)", true, map1.has("key1"));
assertEquals("asMap(...).get(key2) = val2", "val2", map1.get("key2"));
try {
Map<String, String> map2 = Arrays.asMap(String.class, String.class, "key1", "val1", "key2", "val2", "key3");
fail("asMap(odd args) = IAE!");
} catch (IllegalArgumentException e) {
}
try {
Map<Integer, String> map3 = Arrays.asMap(Integer.class, String.class, "key1", "val1", "key2", "val2");
fail("asMap(other key type) = IAE!");
} catch (IllegalArgumentException e) {
}
try {
Map<String, Long> map4 = Arrays.asMap(String.class, Long.class, "key1", "val1", "key2", "val2");
fail("asMap(other val type) = IAE!");
} catch (IllegalArgumentException e) {
}
}
public void testStrg() throws Exception {
assertEquals("[0|]",Arrays.toString(new Object[]{}));
assertEquals("[1|0]",Arrays.toString(0));
assertEquals("[1|1]",Arrays.toString(1));
assertEquals("[1|]",Arrays.toString((Object)null));
assertEquals("[1|247]",Arrays.toString(0xF7));
assertEquals("[1|foo]",Arrays.toString("foo"));
assertEquals("[5|0,true,2.2,,foo]",Arrays.toString(0,true,2.2,null,"foo"));
assertEquals("[5|0,true,2.2,,foo]",Arrays.toString(new StringBuilder(),0,true,2.2,null,"foo").toString());
assertEquals("[5|0,true,2.2,,foo]",Arrays.toString(new StringBuffer(),0,true,2.2,null,"foo").toString());
}
public void testJoin() throws Exception {
assertEquals("",Arrays.join(":"));
assertEquals("0",Arrays.join(":",0));
assertEquals("1",Arrays.join(":",1));
assertEquals("",Arrays.join(":",(Object)null));
assertEquals("247",Arrays.join(":",0xF7));
assertEquals("foo",Arrays.join(":","foo"));
assertEquals("0:true:2.2::foo",Arrays.join(":",0,true,2.2,null,"foo"));
assertEquals("<0>:<true>:<2.2>::<foo>",Arrays.join(new StringBuilder(),":","<",">",0,true,2.2,null,"foo").toString());
assertEquals("<0>:<true>:<2.2>::<foo>",Arrays.join(new StringBuffer(),":","<",">",0,true,2.2,null,"foo").toString());
}
}