// // Copyright (C) 2012 United States Government as represented by the // Administrator of the National Aeronautics and Space Administration // (NASA). All Rights Reserved. // // This software is distributed under the NASA Open Source Agreement // (NOSA), version 1.3. The NOSA has been approved by the Open Source // Initiative. See the file NOSA-1.3-JPF at the top of the distribution // directory tree for the complete NOSA document. // // THE SUBJECT SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY OF ANY // KIND, EITHER EXPRESSED, IMPLIED, OR STATUTORY, INCLUDING, BUT NOT // LIMITED TO, ANY WARRANTY THAT THE SUBJECT SOFTWARE WILL CONFORM TO // SPECIFICATIONS, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR // A PARTICULAR PURPOSE, OR FREEDOM FROM INFRINGEMENT, ANY WARRANTY THAT // THE SUBJECT SOFTWARE WILL BE ERROR FREE, OR ANY WARRANTY THAT // DOCUMENTATION, IF PROVIDED, WILL CONFORM TO THE SUBJECT SOFTWARE. // package gov.nasa.jpf.util; import org.junit.Test; import gov.nasa.jpf.util.test.TestJPF; /** * regression test for ObjVector */ public class ObjVectorTest extends TestJPF { void assertEquals( ObjVector<Integer> v1, ObjVector<Integer> v2) { assertTrue( v1.size() == v2.size()); int n = v1.size(); for (int i=0; i<n; i++) { Object a = v1.get(i); Object b = v2.get(i); if (a == null) { assertTrue( b == null); } else { assertTrue( a.equals(b)); } } } @Test public void testSnapshot () { ObjVector<Integer> v = new ObjVector<Integer>(100); // all empty snapshot ObjVector.Snapshot<Integer> snap = v.getSnapshot(); Integer val = Integer.valueOf(42); v.set(0, val); assertTrue(v.size() == 1 && v.get(0) == val); v.restore(snap); assertTrue(v.size() == 0 && v.get(0) == null); //--- all full snapshot for (int i=0; i<100; i++) { v.set(i, i); } ObjVector<Integer> v0 = v.clone(); ObjVector.Snapshot<Integer> snap0 = v.getSnapshot(); v.clear(); v.restore(snap0); assertEquals( v0, v); //--- punch holes into it v.setRange(11, 20, null); v.set( 25,null); v.set( 26, null); v.set( 42, null); v.setRange(70, 85, null); ObjVector.Snapshot<Integer> snap1 = v.getSnapshot(); ObjVector<Integer> 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, null); v.setRange(0, 19, null); ObjVector.Snapshot<Integer> snap2 = v.getSnapshot(); ObjVector<Integer> v2 = v.clone(); v.clear(); v.restore(snap2); assertEquals( v2, v); } //--- mutating snapshot static class X { int val; X (Integer o) { val = o.intValue(); } } static class IXTransformer implements Transformer<Integer,X> { public X transform( Integer obj) { return new X(obj); } } static class XITransformer implements Transformer<X,Integer>{ public Integer transform( X obj) { return Integer.valueOf(obj.val); } } @Test public void testMutatingSnapshot() { ObjVector<Integer> v = new ObjVector<Integer>(100); for (int i=0; i<100; i+=2) { v.set(i, Integer.valueOf(i)); } print(v); System.out.println("now storing snapshot for ObjVector of size " + v.size()); ObjVector.MutatingSnapshot<Integer,X> snap = v.getSnapshot(new IXTransformer()); System.out.println("now modifying ObjVector"); v.clear(); v.setRange(0, 30, Integer.valueOf(42)); print(v); System.out.println("now restoring ObjVector"); v.restore(snap, new XITransformer()); int n = print(v); assert n == 50 : "got wrong number of non-null elements: " + n; } // utilities int print(ObjVector<Integer> v) { int n = 0; for (int i=0; i<=v.size(); i++) { Integer e = v.get(i); if (e != null) { if (n++ > 0) { System.out.print(','); } System.out.print(e); } } System.out.println(); return n; } }