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}