package gov.nasa.jpf.util; import org.junit.Test; import gov.nasa.jpf.util.test.TestJPF; public class SparseIntVectorTest extends TestJPF { void assertEquals( SparseIntVector v1, SparseIntVector v2) { assertTrue( v1.size() == v2.size()); int n = v1.size(); for (int i=0; i<n; i++) { int a = v1.get(i); int b = v2.get(i); assertTrue(a == b); } } @Test public void testSetGet () { SparseIntVector v = new SparseIntVector(); v.set(0, 10); v.set(42, 11); v.set(111111111, 12); assertTrue( v.get(0) == 10); assertTrue( v.get(42) == 11); assertTrue( v.get(111111111) == 12); assertTrue( v.get(10) == 0); v.clear(42); assertTrue( v.get(42) == 0); } @Test public void testSnapshot () { SparseIntVector v = new SparseIntVector(); // all empty snapshot SparseIntVector.Snapshot snap = v.getSnapshot(); int val = 42; v.set(0, val); assertTrue(v.size() == 1 && v.get(0) == val); v.restore(snap); assertTrue(v.size() == 0); //--- all full snapshot for (int i=0; i<100; i++) { v.set(i, i); assertTrue( "size out of sync: " + i, v.size() == (i+1)); } SparseIntVector.Snapshot snap0 = v.getSnapshot(); v.clear(); v.restore(snap0); for (int i=0; i<100; i++) { assertTrue( i == v.get(i)); } //--- punch holes into it v.setRange(11, 20, 0); v.set( 25,0); v.set( 26, 0); v.set( 42, 0); v.setRange(70, 85, 0); SparseIntVector.Snapshot snap1 = v.getSnapshot(); SparseIntVector v1 = v.clone(); v.clear(); v.restore(snap1); //v.printOn( System.out); assertEquals( v1, v); //--- chop off the ends v.restore(snap0); v.setRange(81, 99, 0); v.setRange(0, 19, 0); SparseIntVector.Snapshot snap2 = v.getSnapshot(); SparseIntVector v2 = v.clone(); v.clear(); v.restore(snap2); assertEquals( v2, v); } static final int MAX_SIZE = 10000; static final int MAX_ROUNDS = 1000; public void benchmark() { long t1, t2; for (int rep = 0; rep < 2; rep++) { Runtime.getRuntime().gc(); SparseIntVector siv = new SparseIntVector(); t1 = System.currentTimeMillis(); for (int i = 0; i < MAX_ROUNDS; i++) { SparseIntVector.Snapshot snap = siv.getSnapshot(); for (int j = 0; j < MAX_SIZE; j++) { siv.set(j, j); assert siv.get(j) == j; // assert siv.size() == (j+1) : "size differs: " + siv.size() + " / " // + (j+1); } assert siv.size() == MAX_SIZE : "wrong size: " + siv.size(); siv.restore(snap); } t2 = System.currentTimeMillis(); System.out.printf("SparseIntVector size %d, rounds %d: %d\n", MAX_SIZE, MAX_ROUNDS, (t2 - t1)); Runtime.getRuntime().gc(); IntTable<Integer> tbl = new IntTable<Integer>(); t1 = System.currentTimeMillis(); for (int i = 0; i < MAX_ROUNDS; i++) { IntTable.Snapshot<Integer> snap = tbl.getSnapshot(); for (int j = 0; j < MAX_SIZE; j++) { tbl.put(j, j); IntTable.Entry<Integer> e = tbl.get(j); assert e != null && e.val == j : "wrong IntTable entry for index: " + j + " : " + e + " in round: " + i; } assert tbl.size() == MAX_SIZE : "wrong size: " + tbl.size(); tbl.restore(snap); } t2 = System.currentTimeMillis(); System.out.printf("IntTable size %d, rounds %d: %d\n", MAX_SIZE, MAX_ROUNDS, (t2 - t1)); } } }