001package daikon.test.diff; 002 003import static java.util.logging.Level.INFO; 004import static org.junit.Assert.assertEquals; 005 006import daikon.*; 007import daikon.diff.*; 008import daikon.inv.*; 009import daikon.test.*; 010import java.util.Arrays; 011import junit.framework.*; 012import org.checkerframework.checker.nullness.qual.NonNull; 013import org.junit.BeforeClass; 014import org.junit.Test; 015 016public class MinusVisitorTester { 017 018 private Diff diff = new Diff(true, new Invariant.ClassVarnameFormulaComparator()); 019 020 /** prepare for tests */ 021 @BeforeClass 022 public static void setUpClass() { 023 daikon.LogHelper.setupLogs(INFO); 024 FileIO.new_decl_format = true; 025 } 026 027 // X1 and X2 have the same class and vars, but different formula 028 // map1: A->{W, X1, Y}, B->{Y}, D->{M, N_unjusitifed, O_unjustified} 029 // map2: A->{W, X2, Z}, C->{Z}, D->{M_unjustified, N} 030 // map1-map2: A->{X1, Y}, B->{Y}, D->{M} 031 @Test 032 public void testMinus() { 033 VarInfo[] vars = { 034 DiffTester.newIntVarInfo("w"), 035 DiffTester.newIntVarInfo("x"), 036 DiffTester.newIntVarInfo("y"), 037 DiffTester.newIntVarInfo("z"), 038 DiffTester.newIntVarInfo("m"), 039 DiffTester.newIntVarInfo("n"), 040 DiffTester.newIntVarInfo("o"), 041 }; 042 PptTopLevel A = Common.makePptTopLevel("A:::OBJECT", vars); 043 PptTopLevel B = Common.makePptTopLevel("B:::OBJECT", vars); 044 PptTopLevel C = Common.makePptTopLevel("C:::OBJECT", vars); 045 PptTopLevel D = Common.makePptTopLevel("D:::OBJECT", vars); 046 PptSlice slicew = new PptSlice1(A, new VarInfo[] {vars[0]}); 047 PptSlice slicex = new PptSlice1(A, new VarInfo[] {vars[1]}); 048 PptSlice slicey = new PptSlice1(A, new VarInfo[] {vars[2]}); 049 PptSlice slicez = new PptSlice1(A, new VarInfo[] {vars[3]}); 050 PptSlice slicem = new PptSlice1(A, new VarInfo[] {vars[4]}); 051 PptSlice slicen = new PptSlice1(A, new VarInfo[] {vars[5]}); 052 PptSlice sliceo = new PptSlice1(A, new VarInfo[] {vars[6]}); 053 Invariant W = new DiffDummyInvariant(slicew, "W", true); 054 Invariant X1 = new DiffDummyInvariant(slicex, "X1", true); 055 Invariant X2 = new DiffDummyInvariant(slicex, "X2", true); 056 Invariant Y = new DiffDummyInvariant(slicey, "Y", true); 057 Invariant Z = new DiffDummyInvariant(slicez, "Z", true); 058 Invariant M = new DiffDummyInvariant(slicem, "M", true); 059 Invariant unjM = new DiffDummyInvariant(slicem, "M", false); 060 Invariant N = new DiffDummyInvariant(slicen, "N", true); 061 Invariant unjN = new DiffDummyInvariant(slicen, "N", false); 062 Invariant unjO = new DiffDummyInvariant(sliceo, "O", false); 063 064 InvMap map1 = new InvMap(); 065 map1.put(A, Arrays.<@NonNull Invariant>asList(W, X1, Y)); 066 map1.put(B, Arrays.<@NonNull Invariant>asList(Y)); 067 map1.put(D, Arrays.<@NonNull Invariant>asList(M, unjN, unjO)); 068 069 InvMap map2 = new InvMap(); 070 map2.put(A, Arrays.<@NonNull Invariant>asList(W, X2, Z)); 071 map2.put(C, Arrays.<@NonNull Invariant>asList(Z)); 072 map2.put(D, Arrays.<@NonNull Invariant>asList(unjM, N)); 073 074 RootNode root = diff.diffInvMap(map1, map2, false); 075 MinusVisitor v = new MinusVisitor(); 076 root.accept(v); 077 InvMap result = v.getResult(); 078 079 InvMap expected = new InvMap(); 080 expected.put(A, Arrays.<@NonNull Invariant>asList(X1, Y)); 081 expected.put(B, Arrays.<@NonNull Invariant>asList(Y)); 082 expected.put(D, Arrays.<@NonNull Invariant>asList(M)); 083 084 assertEquals(expected.toString(), result.toString()); 085 } 086}