001package daikon.test;
002
003import static java.util.logging.Level.INFO;
004import static org.junit.Assert.assertFalse;
005import static org.junit.Assert.assertTrue;
006
007import daikon.*;
008import junit.framework.*;
009import org.junit.BeforeClass;
010import org.junit.Test;
011
012@SuppressWarnings("UnusedVariable") // test code
013public class VarComparabilityTest {
014
015  static final int NONE = VarComparability.NONE;
016  static final int IMPLICIT = VarComparability.IMPLICIT;
017
018  /** prepare for tests */
019  @BeforeClass
020  public static void setUpClass() {
021    daikon.LogHelper.setupLogs(INFO);
022    FileIO.new_decl_format = true;
023  }
024
025  boolean comp(VarComparability v1, VarComparability v2) {
026    return VarComparability.comparable(v1, v2);
027  }
028
029  VarComparability parsei(String rep) {
030    // count number of dimensions
031    int dims = rep.split("\\[").length;
032    return parsei(rep, dims);
033  }
034
035  VarComparability parsei(String rep, int dims) {
036    String typerep = "int";
037    for (int i = 0; i < dims; i++) {
038      typerep += "[]";
039    }
040    ProglangType type = ProglangType.parse(typerep);
041    return VarComparability.parse(IMPLICIT, rep, type);
042  }
043
044  @Test
045  public void test_VarComparabilityImplicit_scalar() {
046    VarComparability v1 = parsei("1");
047    VarComparability v1a = parsei("1");
048    VarComparability v2 = parsei("2");
049    VarComparability v_1 = parsei("-1");
050    // VarComparability v_1a = parsei("-1");
051    VarComparability v_2 = parsei("-2");
052    VarComparability v_3 = parsei("-3");
053
054    assertTrue(comp(v1, v1));
055    assertTrue(comp(v1, v1a));
056    assertTrue(comp(v1a, v1));
057    assertFalse(comp(v1, v2));
058    assertFalse(comp(v2, v1));
059    assertTrue(comp(v2, v2));
060
061    assertTrue(comp(v1, v_1));
062    assertTrue(comp(v1a, v_1));
063    assertTrue(comp(v2, v_1));
064    assertTrue(comp(v_1, v_1));
065    assertTrue(comp(v_2, v_1));
066    assertTrue(comp(v_3, v_1));
067
068    assertTrue(comp(v1, v_2));
069    assertTrue(comp(v1a, v_2));
070    assertTrue(comp(v2, v_2));
071    assertTrue(comp(v_1, v_2));
072    assertTrue(comp(v_2, v_2));
073    assertTrue(comp(v_3, v_2));
074
075    assertTrue(comp(v1, v_3));
076    assertTrue(comp(v1a, v_3));
077    assertTrue(comp(v2, v_3));
078    assertTrue(comp(v_1, v_3));
079    assertTrue(comp(v_2, v_3));
080    assertTrue(comp(v_3, v_3));
081  }
082
083  @Test
084  public void test_VarComparabilityImplicit_1Darray_parts() {
085
086    VarComparability v1 = parsei("1");
087    VarComparability v1a = parsei("1");
088    VarComparability v2 = parsei("2");
089    VarComparability v_1 = parsei("-1");
090    VarComparability v_1a = parsei("-1");
091    VarComparability v_2 = parsei("-2");
092    VarComparability v_3 = parsei("-3");
093
094    VarComparability v12 = parsei("1[2]");
095    VarComparability v12a = parsei("1[2]");
096    VarComparability v13 = parsei("1[3]");
097    VarComparability v13a = parsei("1[3]");
098    VarComparability v23 = parsei("2[3]");
099    VarComparability v23a = parsei("2[3]");
100    VarComparability v1_1 = parsei("1[-1]");
101    VarComparability v_12 = parsei("-1[2]");
102    VarComparability v_1_1 = parsei("-1[-1]");
103
104    assertTrue(comp(v1, v12.elementType()));
105    assertTrue(comp(v1, v13.elementType()));
106    assertFalse(comp(v1, v23.elementType()));
107    assertTrue(comp(v1, v1_1.elementType()));
108    assertTrue(comp(v1, v_1_1.elementType()));
109    assertFalse(comp(v1, v12.indexType(0)));
110    assertFalse(comp(v1, v13.indexType(0)));
111    assertFalse(comp(v1, v23.indexType(0)));
112    assertTrue(comp(v1, v1_1.indexType(0)));
113    assertTrue(comp(v1, v_1_1.indexType(0)));
114
115    assertFalse(comp(v2, v12.elementType()));
116    assertFalse(comp(v2, v13.elementType()));
117    assertTrue(comp(v2, v23.elementType()));
118    assertFalse(comp(v2, v1_1.elementType()));
119    assertTrue(comp(v2, v_1_1.elementType()));
120    assertTrue(comp(v2, v12.indexType(0)));
121    assertFalse(comp(v2, v13.indexType(0)));
122    assertFalse(comp(v2, v23.indexType(0)));
123    assertTrue(comp(v2, v1_1.indexType(0)));
124    assertTrue(comp(v2, v_1_1.indexType(0)));
125  }
126
127  @Test
128  public void test_VarComparabilityImplicit_1Darray_whole() {
129    VarComparability v12 = parsei("1[2]");
130    VarComparability v12a = parsei("1[2]");
131    VarComparability v13 = parsei("1[3]");
132    VarComparability v13a = parsei("1[3]");
133    VarComparability v23 = parsei("2[3]");
134    VarComparability v23a = parsei("2[3]");
135    VarComparability v1_1 = parsei("1[-1]");
136    VarComparability v_12 = parsei("-1[2]");
137    VarComparability v_1_1 = parsei("-1[-1]");
138
139    assertTrue(comp(v12, v12));
140    assertTrue(comp(v12, v12a));
141    assertFalse(comp(v12, v13));
142    assertFalse(comp(v12, v23));
143    assertFalse(comp(v13, v12));
144    assertTrue(comp(v13, v13));
145    assertTrue(comp(v13, v13a));
146    assertFalse(comp(v13, v23));
147    assertFalse(comp(v23, v12));
148    assertFalse(comp(v23, v13));
149    assertTrue(comp(v23, v23));
150    assertTrue(comp(v23, v23a));
151
152    assertTrue(comp(v1_1, v12));
153    assertTrue(comp(v1_1, v13));
154    assertFalse(comp(v1_1, v23));
155    assertTrue(comp(v1_1, v1_1));
156    assertTrue(comp(v1_1, v_12));
157    assertTrue(comp(v1_1, v_1_1));
158
159    assertTrue(comp(v_12, v12));
160    assertFalse(comp(v_12, v13));
161    assertFalse(comp(v_12, v23));
162    assertTrue(comp(v_12, v1_1));
163    assertTrue(comp(v_12, v_12));
164    assertTrue(comp(v_12, v_1_1));
165
166    assertTrue(comp(v_1_1, v12));
167    assertTrue(comp(v_1_1, v13));
168    assertTrue(comp(v_1_1, v23));
169    assertTrue(comp(v_1_1, v1_1));
170    assertTrue(comp(v_1_1, v_12));
171    assertTrue(comp(v_1_1, v_1_1));
172  }
173
174  @Test
175  public void test_VarComparabilityImplicit_nDarray_whole() {
176    VarComparability v12 = parsei("1[2]");
177    VarComparability v12a = parsei("1[2]");
178    VarComparability v123 = parsei("1[2][3]");
179    VarComparability v123a = parsei("1[2][3]");
180    VarComparability v1234 = parsei("1[2][3][4]");
181    VarComparability v1234a = parsei("1[2][3][4]");
182    VarComparability v_34 = parsei("-3[4]");
183    VarComparability v_234 = parsei("-2[3][4]");
184    VarComparability v_1234 = parsei("-1[2][3][4]");
185    VarComparability v_1 = parsei("-1");
186
187    assertTrue(comp(v12, v12));
188    assertTrue(comp(v123, v123));
189    assertTrue(comp(v1234, v1234));
190    assertTrue(comp(v12a, v12));
191    assertFalse(comp(v12a, v123));
192    assertFalse(comp(v12a, v1234));
193    assertFalse(comp(v123a, v12));
194    assertTrue(comp(v123a, v123));
195    assertFalse(comp(v123a, v1234));
196    assertFalse(comp(v1234a, v12));
197    assertFalse(comp(v1234a, v123));
198    assertTrue(comp(v1234a, v1234));
199
200    assertTrue(comp(v12, v123.elementType()));
201    assertTrue(comp(v123, v1234.elementType()));
202
203    assertTrue(comp(v_1, v12));
204    assertTrue(comp(v_1, v123));
205    assertTrue(comp(v_1, v1234));
206
207    assertFalse(comp(v_1234, v12));
208    assertFalse(comp(v_1234, v123));
209    assertTrue(comp(v_1234, v1234));
210
211    assertFalse(comp(v_234, v12));
212    assertFalse(comp(v_234, v123));
213    assertTrue(comp(v_234, v1234));
214
215    assertFalse(comp(v_34, v12));
216    assertFalse(comp(v_34, v123));
217    assertTrue(comp(v_34, v1234));
218  }
219}