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}