001package daikon.test.diff;
002
003import static java.util.logging.Level.INFO;
004import static org.junit.Assert.assertEquals;
005import static org.junit.Assert.assertFalse;
006import static org.junit.Assert.assertTrue;
007
008import daikon.*;
009import daikon.diff.*;
010import daikon.inv.*;
011import daikon.test.*;
012import java.lang.reflect.Method;
013import junit.framework.*;
014import org.checkerframework.checker.nullness.qual.NonNull;
015import org.checkerframework.checker.nullness.qual.Nullable;
016import org.junit.Before;
017import org.junit.BeforeClass;
018import org.junit.Test;
019
020public class DetailedStatisticsVisitorTester {
021
022  RootNode root = new RootNode();
023  DetailedStatisticsVisitor v = new DetailedStatisticsVisitor(false);
024
025  VarInfo[] vars = {
026    DiffTester.newIntVarInfo("x"), DiffTester.newIntVarInfo("y"), DiffTester.newIntVarInfo("z")
027  };
028  PptTopLevel ppt = Common.makePptTopLevel("Foo:::OBJECT", vars);
029
030  PptSlice slice0 = ppt.joiner_view;
031  Invariant null_1_just = new DiffDummyInvariant(slice0, "1", true);
032  Invariant null_1_unjust = new DiffDummyInvariant(slice0, "1", false);
033  Invariant null_2_just = new DiffDummyInvariant(slice0, "2", true);
034  Invariant null_2_unjust = new DiffDummyInvariant(slice0, "2", false);
035
036  Invariant null_noprint = new DiffDummyInvariant(slice0, "0", true, false);
037
038  PptSlice slice1 = new PptSlice1(ppt, new VarInfo[] {vars[0]});
039  Invariant unary_1_just = new DiffDummyInvariant(slice1, "1", true);
040  Invariant unary_1_unjust = new DiffDummyInvariant(slice1, "1", false);
041  Invariant unary_2_just = new DiffDummyInvariant(slice1, "2", true);
042  Invariant unary_2_unjust = new DiffDummyInvariant(slice1, "2", false);
043
044  PptSlice slice2 = new PptSlice2(ppt, new VarInfo[] {vars[0], vars[1]});
045  Invariant binary_1_just = new DiffDummyInvariant(slice2, "1", true);
046  Invariant binary_1_unjust = new DiffDummyInvariant(slice2, "1", false);
047  Invariant binary_2_just = new DiffDummyInvariant(slice2, "2", true);
048  Invariant binary_2_unjust = new DiffDummyInvariant(slice2, "2", false);
049
050  PptSlice slice3 = new PptSlice3(ppt, vars);
051  Invariant ternary_1_just = new DiffDummyInvariant(slice3, "1", true);
052  Invariant ternary_1_unjust = new DiffDummyInvariant(slice3, "1", false);
053  Invariant ternary_2_just = new DiffDummyInvariant(slice3, "2", true);
054  Invariant ternary_2_unjust = new DiffDummyInvariant(slice3, "2", false);
055
056  /** prepare for tests */
057  @BeforeClass
058  public static void setUpClass() {
059    daikon.LogHelper.setupLogs(INFO);
060    FileIO.new_decl_format = true;
061  }
062
063  @Before
064  public void setUp() {
065    PptNode pptNode = new PptNode(ppt, ppt);
066
067    pptNode.add(new InvNode(null_1_just, null_1_just));
068    pptNode.add(new InvNode(null_1_just, null_1_unjust));
069    pptNode.add(new InvNode(null_1_unjust, null_1_just));
070    pptNode.add(new InvNode(null_1_unjust, null_1_unjust));
071    pptNode.add(new InvNode(null_1_just, null_2_just));
072    pptNode.add(new InvNode(null_1_just, null_2_unjust));
073    pptNode.add(new InvNode(null_1_unjust, null_2_just));
074    pptNode.add(new InvNode(null_1_unjust, null_2_unjust));
075    pptNode.add(new InvNode(null_1_just, null));
076    pptNode.add(new InvNode(null_1_unjust, null));
077    pptNode.add(new InvNode(null, null_1_just));
078    pptNode.add(new InvNode(null, null_1_unjust));
079
080    pptNode.add(new InvNode(null_noprint, null_noprint));
081
082    pptNode.add(new InvNode(unary_1_just, unary_1_just));
083    pptNode.add(new InvNode(unary_1_just, unary_1_unjust));
084    pptNode.add(new InvNode(unary_1_unjust, unary_1_just));
085    pptNode.add(new InvNode(unary_1_unjust, unary_1_unjust));
086    pptNode.add(new InvNode(unary_1_just, unary_2_just));
087    pptNode.add(new InvNode(unary_1_just, unary_2_unjust));
088    pptNode.add(new InvNode(unary_1_unjust, unary_2_just));
089    pptNode.add(new InvNode(unary_1_unjust, unary_2_unjust));
090    pptNode.add(new InvNode(unary_1_just, null));
091    pptNode.add(new InvNode(unary_1_unjust, null));
092    pptNode.add(new InvNode(null, unary_1_just));
093    pptNode.add(new InvNode(null, unary_1_unjust));
094
095    pptNode.add(new InvNode(binary_1_just, binary_1_just));
096    pptNode.add(new InvNode(binary_1_just, binary_1_unjust));
097    pptNode.add(new InvNode(binary_1_unjust, binary_1_just));
098    pptNode.add(new InvNode(binary_1_unjust, binary_1_unjust));
099    pptNode.add(new InvNode(binary_1_just, binary_2_just));
100    pptNode.add(new InvNode(binary_1_just, binary_2_unjust));
101    pptNode.add(new InvNode(binary_1_unjust, binary_2_just));
102    pptNode.add(new InvNode(binary_1_unjust, binary_2_unjust));
103    pptNode.add(new InvNode(binary_1_just, null));
104    pptNode.add(new InvNode(binary_1_unjust, null));
105    pptNode.add(new InvNode(null, binary_1_just));
106    pptNode.add(new InvNode(null, binary_1_unjust));
107
108    pptNode.add(new InvNode(ternary_1_just, ternary_1_just));
109    pptNode.add(new InvNode(ternary_1_just, ternary_1_unjust));
110    pptNode.add(new InvNode(ternary_1_unjust, ternary_1_just));
111    pptNode.add(new InvNode(ternary_1_unjust, ternary_1_unjust));
112    pptNode.add(new InvNode(ternary_1_just, ternary_2_just));
113    pptNode.add(new InvNode(ternary_1_just, ternary_2_unjust));
114    pptNode.add(new InvNode(ternary_1_unjust, ternary_2_just));
115    pptNode.add(new InvNode(ternary_1_unjust, ternary_2_unjust));
116    pptNode.add(new InvNode(ternary_1_just, null));
117    pptNode.add(new InvNode(ternary_1_unjust, null));
118    pptNode.add(new InvNode(null, ternary_1_just));
119    pptNode.add(new InvNode(null, ternary_1_unjust));
120
121    root.add(pptNode);
122
123    root.accept(v);
124  }
125
126  /** Validate that this class's constructor added exactly one of each arity and relationship. */
127  @Test
128  public void testFreq() {
129    for (int arity = 0; arity < DetailedStatisticsVisitor.NUM_ARITIES; arity++) {
130      for (int rel = 0; rel < DetailedStatisticsVisitor.NUM_RELATIONSHIPS; rel++) {
131        assertEquals(1, (int) v.freq(arity, rel));
132      }
133    }
134  }
135
136  @Test
137  public void testShouldAddFrequency() throws Exception {
138    // Invoke private method using reflection
139    Method m =
140        DetailedStatisticsVisitor.class.getDeclaredMethod(
141            "shouldAddFrequency", new Class<?>[] {Invariant.class, Invariant.class});
142    m.setAccessible(true);
143
144    @SuppressWarnings("nullness") // static method, so null first arg is OK: shouldAddFrequency()
145    @NonNull Boolean b1 = (Boolean) m.invoke(null, new Object[] {null_noprint, null_noprint});
146    assertFalse(b1.booleanValue());
147
148    @SuppressWarnings("nullness") // static method, so null first arg is OK: shouldAddFrequency()
149    @NonNull Boolean b2 = (Boolean) m.invoke(null, new Object[] {null_1_just, null_1_just});
150    assertTrue(b2.booleanValue());
151
152    @SuppressWarnings("nullness") // static method, so null first arg is OK: shouldAddFrequency()
153    @NonNull Boolean b3 = (Boolean) m.invoke(null, new @Nullable Object[] {null, null_noprint});
154    assertFalse(b3.booleanValue());
155
156    @SuppressWarnings("nullness") // static method, so null first arg is OK: shouldAddFrequency()
157    @NonNull Boolean b4 = (Boolean) m.invoke(null, new @Nullable Object[] {null, null_1_just});
158    assertTrue(b4.booleanValue());
159  }
160}