package kodkod.test.unit;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
import java.util.Iterator;
import kodkod.util.ints.ArraySequence;
import kodkod.util.ints.IndexedEntry;
import kodkod.util.ints.IntSet;
import kodkod.util.ints.IntTreeSet;
import kodkod.util.ints.Ints;
import kodkod.util.ints.RangeSequence;
import kodkod.util.ints.SparseSequence;
import kodkod.util.ints.TreeSequence;
import org.junit.Before;
import org.junit.Test;
/**
* Tests sparse sequence implementation(s).
*
* @author Emina Torlak
*/
public class SparseSequenceTest {
private SparseSequence<Integer> s0;
@Before
public void setUp() throws Exception {
s0 = new TreeSequence<Integer>();
}
@Test
public final void testPutGetRemoveSize() {
assertTrue(s0.size()==0);
s0.put(0,0);
assertTrue(s0.get(0).intValue()==0);
assertTrue(s0.size()==1);
s0.put(Integer.MIN_VALUE, Integer.MIN_VALUE);
assertTrue(s0.get(Integer.MIN_VALUE).intValue()==Integer.MIN_VALUE);
assertTrue(s0.size()==2);
s0.put(Integer.MAX_VALUE, Integer.MAX_VALUE);
assertTrue(s0.get(Integer.MAX_VALUE).intValue()==Integer.MAX_VALUE);
assertTrue(s0.size()==3);
s0.put(2,0);
assertTrue(s0.get(0).intValue()==0);
assertTrue(s0.size()==4);
s0.put(1,0);
assertTrue(s0.get(1).intValue()==0);
assertTrue(s0.size()==5);
s0.put(-1,0);
assertTrue(s0.get(-1).intValue()==0);
assertTrue(s0.size()==6);
s0.put(3,0);
assertTrue(s0.get(3).intValue()==0);
assertTrue(s0.size()==7);
s0.remove(0);
assertTrue(s0.size()==6);
s0.remove(Integer.MIN_VALUE);
assertTrue(s0.size()==5);
s0.remove(3);
assertTrue(s0.size()==4);
s0.put(2, 2);
assertTrue(s0.get(2).intValue()==2);
assertTrue(s0.size()==4);
s0.put(0, 2);
assertTrue(s0.get(0).intValue()==2);
assertTrue(s0.size()==5);
s0.put(1, 2);
assertTrue(s0.get(1).intValue()==2);
assertTrue(s0.size()==5);
//System.out.println(s0);
}
@Test
public final void testIterator() {
for(int i = 0; i < 10; i++)
s0.put(i, 0);
// System.out.println(s0);
Iterator<IndexedEntry<Integer>> iter = s0.iterator();
for(int i = 0; i < 10; i++ ) {
iter.next();
// System.out.println(iter.next());
}
// if (iter.hasNext())
// System.out.println(iter.next());
assertFalse(iter.hasNext());
}
@Test
public final void testRange() {
s0 = new RangeSequence<Integer>();
s0.put(16, 0);
s0.put(17, 0);
//System.out.println(s0);
s0.put(16, 1);
s0.put(17, 2);
//System.out.println(s0);
}
@Test
public final void testRemove() {
// [2597 b NIL [2630 r [2616 b [2604 b NIL NIL] [2623 b NIL NIL]]
// [2658 b [2644 r [2637 b NIL NIL] [2651 b NIL [2655 r NIL NIL]]] [2660 b NIL NIL]]]]
// s0 = new TreeSequence<Integer>();
// s0.put(2597, 0);
// s0.put(2630, 0);
// s0.put(2616, 0);
// s0.put(2604, 0);
// s0.put(2623, 0);
// s0.put(2658, 0);
// s0.put(2644, 0);
// s0.put(2637, 0);
// s0.put(2651, 0);
// System.out.println(s0);
// s0.remove(2616);
// System.out.println(s0);
// root: [221 b [51 r [45 b NIL NIL] [168 b NIL NIL]] [331 b NIL NIL]]
// z: [51 b null null]
// root: [221 b [168 b [45 r NIL NIL] NIL] [331 b NIL NIL]]
s0.clear();
s0.put(331, 0);
s0.put(221,0);
s0.put(168, 0);
// s0.put(48, 0);
// s0.put(42, 0);
s0.put(45, 0);
s0.put(51, 0);
// System.out.println(s0);
s0.remove(51);
// System.out.println(s0);
}
// @Test
// public final void testFirstLast() {
// for(int i = 0; i < 10; i++)
// s0.put(i, 0);
// IndexedEntry<Integer> e0 = s0.first();
// while (e0 != null) {
// System.out.println(e0);
// e0 = s0.successor(e0.index());
// }
// }
@Test
public final void testClone() {
final IntSet s = Ints.bestSet(3);
s.add(1); s.add(2);
s0 = new ArraySequence<Integer>(s);
s0.put(1, 0);
s0.put(2, 0);
try {
SparseSequence<Integer> s1 = s0.clone();
assertTrue(s1.equals(s0));
assertNotSame(s1, s0);
SparseSequence<Integer> s2 = new ArraySequence<Integer>(s);
s2.putAll(s0);
s1.remove(1);
assertTrue(s2.equals(s0));
assertFalse(s1.equals(s0));
} catch (CloneNotSupportedException e) {
assert false;
}
}
@Test
public final void testIntTreeSet() {
IntTreeSet s = new IntTreeSet();
// s.add(1);
// System.out.println(s);
// s.add(3);
// System.out.println(s);
// s.add(2);
// System.out.println(s);
s.add(331);
s.add(221);
for(int i = 42; i <=45; i++)
s.add(i);
for(int i = 47; i <=51; i++)
s.add(i);
s.add(167); s.add(168);
s.add(220);
// System.out.println(s);
s.add(46);
// System.out.println(s);
}
}