adding a test case
[IRC.git] / Robust / src / Tests / OwnershipAnalysisTest / testTokens / Main.java
1 import IR.*;
2 import IR.Flat.*;
3 import Analysis.OwnershipAnalysis.*;
4 import java.util.*;
5 import java.io.*;
6
7
8 public class Main {
9
10   static boolean aTestFailed;
11
12
13   protected static void test( String test,
14                               boolean expected,
15                               boolean result ) {
16     String outcome;
17     if( expected == result ) {
18       outcome = "...\tpassed";
19     } else {
20       outcome = "...\tFAILED";
21       aTestFailed = true;
22     }
23
24     System.out.println( test+" expect "+expected+outcome );
25   }
26
27
28   public static void main(String args[]) throws Exception {
29     aTestFailed = false;
30
31
32     testExample();
33     System.out.println( "---------------------------------------" );
34     /*
35     testTokenTuple();
36     System.out.println( "---------------------------------------" );
37     testTokenTupleSet();
38     System.out.println( "---------------------------------------" );
39     testChangeTupleAndChangeTupleSet();
40     System.out.println( "---------------------------------------" );
41     testReachabilitySet();
42     System.out.println( "---------------------------------------" );
43     */
44     testNewMethods();
45     System.out.println( "---------------------------------------" );
46
47
48     if( aTestFailed ) {
49       System.out.println( "<><><><><><><><><><><><><><><><><><><><><><><><>" );
50       System.out.println( "<><><> WARNING: At least one test failed. <><><>" );
51       System.out.println( "<><><><><><><><><><><><><><><><><><><><><><><><>" );
52     } else {
53       System.out.println( "<><> All tests passed. <><>" );
54     }
55   }
56
57
58   public static void testExample() {
59     // example test to know the testing routine is correct!
60     test( "4 == 5?", false, 4 == 5 );
61     test( "3 == 3?", true,  3 == 3 );
62   }
63
64
65   public static void testTokenTuple() {
66     /*
67     TokenTuple tt0 = new TokenTuple( new Integer( 1 ), true,  TokenTuple.ARITY_ONE  );
68     TokenTuple tt1 = new TokenTuple( new Integer( 1 ), true,  TokenTuple.ARITY_ONE  );
69     TokenTuple tt2 = new TokenTuple( new Integer( 2 ), true,  TokenTuple.ARITY_ONE  );
70     TokenTuple tt3 = new TokenTuple( new Integer( 1 ), true,  TokenTuple.ARITY_MANY );
71     TokenTuple tt4 = new TokenTuple( new Integer( 3 ), false, TokenTuple.ARITY_ONE  );
72     TokenTuple tt5 = new TokenTuple( new Integer( 3 ), false, TokenTuple.ARITY_ONE  );
73
74     test( "tt0 equals tt1?", true,  tt0.equals( tt1 ) );
75     test( "tt1 equals tt0?", true,  tt1.equals( tt0 ) );
76     test( "tt1.hashCode == tt0.hashCode?", true, tt1.hashCode() == tt0.hashCode() );
77
78     test( "tt0 equals tt2?", false, tt0.equals( tt2 ) );
79     test( "tt2 equals tt0?", false, tt2.equals( tt0 ) );
80     test( "tt2.hashCode == tt0.hashCode?", false, tt2.hashCode() == tt0.hashCode() );
81
82     test( "tt0 equals tt3?", false, tt0.equals( tt3 ) );
83     test( "tt3 equals tt0?", false, tt3.equals( tt0 ) );
84     test( "tt3.hashCode == tt0.hashCode?", false, tt3.hashCode() == tt0.hashCode() );
85
86     test( "tt2 equals tt3?", false, tt2.equals( tt3 ) );
87     test( "tt3 equals tt2?", false, tt3.equals( tt2 ) );
88     test( "tt3.hashCode == tt2.hashCode?", false, tt3.hashCode() == tt2.hashCode() );
89
90     tt1 = tt1.increaseArity();
91
92     test( "tt1 equals tt2?", false, tt1.equals( tt2 ) );
93     test( "tt2 equals tt1?", false, tt2.equals( tt1 ) );
94     test( "tt2.hashCode == tt1.hashCode?", false, tt2.hashCode() == tt1.hashCode() );
95
96     test( "tt1 equals tt3?", true,  tt1.equals( tt3 ) );
97     test( "tt3 equals tt1?", true,  tt3.equals( tt1 ) );
98     test( "tt3.hashCode == tt1.hashCode?", true, tt3.hashCode() == tt1.hashCode() );
99
100     test( "tt4 equals tt5?", true,  tt4.equals( tt5 ) );
101     test( "tt5 equals tt4?", true,  tt5.equals( tt4 ) );
102     test( "tt5.hashCode == tt4.hashCode?", true, tt5.hashCode() == tt4.hashCode() );
103
104     tt4 = tt4.increaseArity();
105
106     test( "tt4 equals tt5?", true,  tt4.equals( tt5 ) );
107     test( "tt5 equals tt4?", true,  tt5.equals( tt4 ) );
108     test( "tt5.hashCode == tt4.hashCode?", true, tt5.hashCode() == tt4.hashCode() );
109
110
111     TokenTuple tt6 = new TokenTuple( new Integer( 6 ), false, TokenTuple.ARITY_ONE  );
112     TokenTuple tt7 = new TokenTuple( new Integer( 6 ), false, TokenTuple.ARITY_ONE  );
113     TokenTuple tt8 = new TokenTuple( new Integer( 8 ), false, TokenTuple.ARITY_ONE  );
114     TokenTuple tt9 = new TokenTuple( new Integer( 9 ), false, TokenTuple.ARITY_ONE  );
115
116     test( "tt6 equals tt7?",               true,  tt6.equals( tt7 )                );
117     test( "tt6.hashCode == tt7.hashCode?", true,  tt6.hashCode() == tt7.hashCode() );
118
119     test( "tt8 equals tt7?",               false, tt8.equals( tt7 )                );
120     test( "tt8.hashCode == tt7.hashCode?", false, tt8.hashCode() == tt7.hashCode() );
121
122     // notice that this makes tt7 canonical
123     tt7 = tt7.changeTokenTo( new Integer( 8 ) );
124
125     test( "tt6 equals tt7?",               false, tt6.equals( tt7 )                );
126     test( "tt6.hashCode == tt7.hashCode?", false, tt6.hashCode() == tt7.hashCode() );
127
128     test( "tt8 equals tt7?",               true,  tt8.equals( tt7 )                );
129     test( "tt8.hashCode == tt7.hashCode?", true,  tt8.hashCode() == tt7.hashCode() );
130
131     test( "tt6 == tt7?", false, tt6 == tt7 );
132     test( "tt8 == tt7?", false, tt8 == tt7 );
133     test( "tt9 == tt7?", false, tt9 == tt7 );
134
135     tt6 = tt6.makeCanonical();
136     tt8 = tt8.makeCanonical();
137     tt9 = tt9.makeCanonical();
138
139     test( "tt6 == tt7?", false, tt6 == tt7 );
140     test( "tt8 == tt7?", true,  tt8 == tt7 );
141     test( "tt9 == tt7?", false, tt9 == tt7 );
142     */
143   }
144
145
146   public static void testTokenTupleSet() {
147     /*
148     TokenTuple tt0 = new TokenTuple( new Integer( 0 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
149     TokenTuple tt1 = new TokenTuple( new Integer( 1 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
150     TokenTuple tt2 = new TokenTuple( new Integer( 2 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
151
152     TokenTupleSet tts0  = new TokenTupleSet( tt0 );
153     TokenTupleSet tts1  = new TokenTupleSet( tt1 );
154     TokenTupleSet tts2a = new TokenTupleSet( tt2 );
155     TokenTupleSet tts2b = new TokenTupleSet( tt2 );
156
157     test( "tts0.equals( null )?", false, tts0.equals( null ) );
158     test( "tts0.equals( tts1 )?", false, tts0.equals( tts1 ) );
159     test( "tts0.hashCode == tts1.hashCode?", false, tts0.hashCode() == tts1.hashCode() );
160
161     test( "tts2a.equals( tts2b )?", true, tts2a.equals( tts2b ) );
162     test( "tts2b.equals( tts2a )?", true, tts2b.equals( tts2a ) );
163     test( "tts2a.hashCode == tts2b.hashCode?", true, tts2a.hashCode() == tts2b.hashCode() );
164
165
166     TokenTupleSet tts012a = new TokenTupleSet();
167     tts012a = tts012a.add( tt0 );
168     tts012a = tts012a.add( tt1 );
169     tts012a = tts012a.add( tt2 );
170
171     TokenTupleSet tts012b = tts0.union( tts1.union( tts2b.union( tts2a ) ) );
172
173     test( "tts012a.equals( tts012b )?", true, tts012a.equals( tts012b ) );
174     test( "tts012a.hashCode == tts012b.hashCode?", true, tts012a.hashCode() == tts012b.hashCode() );
175
176
177     TokenTupleSet ttsEmpty = new TokenTupleSet();
178
179     test( "tts012a.isEmpty()?",  false, tts012a.isEmpty()  );
180     test( "ttsEmpty.isEmpty()?", true,  ttsEmpty.isEmpty() );
181     test( "ttsEmpty.isSubset( tts012a )?", true,  ttsEmpty.isSubset( tts012a  ) );
182     test( "tts012a.isSubset( ttsEmpty )?", false, tts012a.isSubset ( ttsEmpty ) );
183     test( "tts2a.isSubset( tts012a )?",    true,  tts2a.isSubset   ( tts012a  ) );
184     test( "tts012a.isSubset( tts2a )?",    false, tts012a.isSubset ( tts2a    ) );
185     test( "tts2a.isSubset( tts2b )?",      true,  tts2a.isSubset   ( tts2b    ) );
186
187
188     TokenTuple tt1star = new TokenTuple( new Integer( 1 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
189     TokenTuple tt3     = new TokenTuple( new Integer( 3 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
190
191     test( "ttsEmpty.containsTuple( tt2     )?", false, ttsEmpty.containsTuple( tt2     ) );
192     test( "ttsEmpty.containsTuple( tt1     )?", false, ttsEmpty.containsTuple( tt1     ) );
193     test( "ttsEmpty.containsTuple( tt1star )?", false, ttsEmpty.containsTuple( tt1star ) );
194     test( "ttsEmpty.containsTuple( tt3     )?", false, ttsEmpty.containsTuple( tt3     ) );
195
196     test( "tts2a.containsTuple( tt2     )?", true,  tts2a.containsTuple( tt2     ) );
197     test( "tts2a.containsTuple( tt1     )?", false, tts2a.containsTuple( tt1     ) );
198     test( "tts2a.containsTuple( tt1star )?", false, tts2a.containsTuple( tt1star ) );
199     test( "tts2a.containsTuple( tt3     )?", false, tts2a.containsTuple( tt3     ) );
200
201     test( "tts012a.containsTuple( tt2     )?", true,  tts012a.containsTuple( tt2     ) );
202     test( "tts012a.containsTuple( tt1     )?", true,  tts012a.containsTuple( tt1     ) );
203     test( "tts012a.containsTuple( tt1star )?", false, tts012a.containsTuple( tt1star ) );
204     test( "tts012a.containsTuple( tt3     )?", false, tts012a.containsTuple( tt3     ) );
205
206
207     TokenTuple tt4 = new TokenTuple( new Integer( 4 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
208     TokenTuple tt5 = new TokenTuple( new Integer( 5 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
209     TokenTuple tt6 = new TokenTuple( new Integer( 6 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
210     TokenTuple tt7 = new TokenTuple( new Integer( 7 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
211
212     TokenTuple tt5star = new TokenTuple( new Integer( 5 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
213     TokenTuple tt6star = new TokenTuple( new Integer( 6 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
214
215     TokenTupleSet tts4567a = new TokenTupleSet();
216     tts4567a = tts4567a.add( tt4 ).add( tt5 ).add( tt6 ).add( tt7 );
217
218     TokenTupleSet tts4567b = new TokenTupleSet( tts4567a );
219
220     TokenTupleSet tts4567c = new TokenTupleSet();
221     tts4567c = tts4567c.add( tt4 ).add( tt5star ).add( tt6 ).add( tt7 );
222
223     TokenTupleSet tts4567d = new TokenTupleSet();
224     tts4567d = tts4567d.add( tt4 ).add( tt5star ).add( tt6star ).add( tt7 );
225
226     test( "tts4567a.equals( tts4567b )?", true, tts4567a.equals( tts4567b ) );
227     test( "tts4567a.hashCode == tts4567b.hashCode?", true, tts4567a.hashCode() == tts4567b.hashCode() );
228
229     test( "tts4567a.equals( tts4567c )?", false, tts4567a.equals( tts4567c ) );
230     test( "tts4567a.hashCode == tts4567c.hashCode?", false, tts4567a.hashCode() == tts4567c.hashCode() );
231
232     test( "tts4567a.equals( tts4567d )?", false, tts4567a.equals( tts4567d ) );
233     test( "tts4567a.hashCode == tts4567d.hashCode?", false, tts4567a.hashCode() == tts4567d.hashCode() );
234
235     tts4567a = tts4567a.increaseArity( new Integer( 6 ) );
236
237     test( "tts4567a.equals( tts4567b )?", false, tts4567a.equals( tts4567b ) );
238     test( "tts4567a.hashCode == tts4567b.hashCode?", false, tts4567a.hashCode() == tts4567b.hashCode() );
239
240     test( "tts4567a.equals( tts4567c )?", false, tts4567a.equals( tts4567c ) );
241     // it's okay if the objects are not equal but hashcodes are, its a collision
242     //test( "tts4567a.hashCode == tts4567c.hashCode?", false, tts4567a.hashCode() == tts4567c.hashCode() );
243
244     test( "tts4567a.equals( tts4567d )?", false, tts4567a.equals( tts4567d ) );
245     test( "tts4567a.hashCode == tts4567d.hashCode?", false, tts4567a.hashCode() == tts4567d.hashCode() );
246
247     tts4567a = tts4567a.increaseArity( new Integer( 5 ) );
248
249
250     test( "tts4567a.equals( tts4567b )?", false, tts4567a.equals( tts4567b ) );
251     test( "tts4567a.hashCode == tts4567b.hashCode?", false, tts4567a.hashCode() == tts4567b.hashCode() );
252
253     test( "tts4567a.equals( tts4567c )?", false, tts4567a.equals( tts4567c ) );
254     test( "tts4567a.hashCode == tts4567c.hashCode?", false, tts4567a.hashCode() == tts4567c.hashCode() );
255
256     test( "tts4567a.equals( tts4567d )?", true, tts4567a.equals( tts4567d ) );
257     test( "tts4567a.hashCode == tts4567d.hashCode?", true, tts4567a.hashCode() == tts4567d.hashCode() );
258
259
260     test( "tts4567a.containsToken( new Integer( 1 ) )?", false, tts4567a.containsToken( new Integer( 1 ) ) );
261     test( "tts4567a.containsToken( new Integer( 4 ) )?", true,  tts4567a.containsToken( new Integer( 4 ) ) );
262     test( "tts4567a.containsToken( new Integer( 5 ) )?", true,  tts4567a.containsToken( new Integer( 5 ) ) );
263     test( "tts4567a.containsToken( new Integer( 7 ) )?", true,  tts4567a.containsToken( new Integer( 7 ) ) );
264     test( "tts4567a.containsToken( new Integer( 8 ) )?", false, tts4567a.containsToken( new Integer( 8 ) ) );
265
266     // they should be canonical
267     test( "tts4567a.equals( tts4567d )?", true, tts4567a.equals( tts4567d ) );
268     test( "tts4567a == tts4567d?",        true, tts4567a == tts4567d );
269
270
271
272     TokenTuple tt10     = new TokenTuple( new Integer( 10 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
273     TokenTuple tt11     = new TokenTuple( new Integer( 11 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
274     TokenTuple tt12     = new TokenTuple( new Integer( 12 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
275     TokenTuple tt13     = new TokenTuple( new Integer( 13 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
276     TokenTuple tt13star = new TokenTuple( new Integer( 13 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
277     TokenTuple tt42     = new TokenTuple( new Integer( 42 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
278     TokenTuple tt52     = new TokenTuple( new Integer( 52 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
279     TokenTuple tt62star = new TokenTuple( new Integer( 62 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
280
281     AllocationSite as = new AllocationSite( 3, null );
282     as.setIthOldest( 0, new Integer( 10 ) );
283     as.setIthOldest( 1, new Integer( 11 ) );
284     as.setIthOldest( 2, new Integer( 12 ) );
285     as.setSummary  (    new Integer( 13 ) );
286
287
288     TokenTupleSet ttsAgeTest0a = new TokenTupleSet();
289     ttsAgeTest0a = ttsAgeTest0a.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star );
290
291     TokenTupleSet ttsAgeTest0b = new TokenTupleSet();
292     ttsAgeTest0b = ttsAgeTest0b.add( tt12 ).add( tt52 ).add( tt42 ).add( tt62star );
293
294     System.out.println( ttsAgeTest0a );
295     test( "ttsAgeTest0a.equals( ttsAgeTest0b )?", false, ttsAgeTest0a.equals( ttsAgeTest0b ) );
296     ttsAgeTest0a = ttsAgeTest0a.ageTokens( as );
297     test( "ttsAgeTest0a.equals( ttsAgeTest0b )?", true,  ttsAgeTest0a.equals( ttsAgeTest0b ) );
298     System.out.println( ttsAgeTest0a );
299
300
301     TokenTupleSet ttsAgeTest1a = new TokenTupleSet();
302     ttsAgeTest1a = ttsAgeTest1a.add( tt10 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 );
303
304     TokenTupleSet ttsAgeTest1b = new TokenTupleSet();
305     ttsAgeTest1b = ttsAgeTest1b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 );
306
307     System.out.println( ttsAgeTest1a );
308     test( "ttsAgeTest1a.equals( ttsAgeTest1b )?", false, ttsAgeTest1a.equals( ttsAgeTest1b ) );
309     ttsAgeTest1a = ttsAgeTest1a.ageTokens( as );
310     test( "ttsAgeTest1a.equals( ttsAgeTest1b )?", true,  ttsAgeTest1a.equals( ttsAgeTest1b ) );
311     System.out.println( ttsAgeTest1a );
312
313
314     TokenTupleSet ttsAgeTest2a = new TokenTupleSet();
315     ttsAgeTest2a = ttsAgeTest2a.add( tt10 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt12 ).add( tt11 );
316
317     TokenTupleSet ttsAgeTest2b = new TokenTupleSet();
318     ttsAgeTest2b = ttsAgeTest2b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 ).add( tt12 );
319
320     System.out.println( ttsAgeTest2a );
321     test( "ttsAgeTest2a.equals( ttsAgeTest2b )?", false, ttsAgeTest2a.equals( ttsAgeTest2b ) );
322     ttsAgeTest2a = ttsAgeTest2a.ageTokens( as );
323     test( "ttsAgeTest2a.equals( ttsAgeTest2b )?", true,  ttsAgeTest2a.equals( ttsAgeTest2b ) );
324     System.out.println( ttsAgeTest2a );
325
326
327     TokenTupleSet ttsAgeTest3a = new TokenTupleSet();
328     ttsAgeTest3a = ttsAgeTest3a.add( tt13 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt12 ).add( tt10 );
329
330     TokenTupleSet ttsAgeTest3b = new TokenTupleSet();
331     ttsAgeTest3b = ttsAgeTest3b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13star );
332
333     System.out.println( ttsAgeTest3a );
334     test( "ttsAgeTest3a.equals( ttsAgeTest3b )?", false, ttsAgeTest3a.equals( ttsAgeTest3b ) );
335     ttsAgeTest3a = ttsAgeTest3a.ageTokens( as );
336     test( "ttsAgeTest3a.equals( ttsAgeTest3b )?", true,  ttsAgeTest3a.equals( ttsAgeTest3b ) );
337     System.out.println( ttsAgeTest3a );
338
339
340     // they should be canonical
341     test( "ttsAgeTest3a.equals( ttsAgeTest3b )?", true, ttsAgeTest3a.equals( ttsAgeTest3b ) );
342     test( "ttsAgeTest3a == ttsAgeTest3b?",        true, ttsAgeTest3a == ttsAgeTest3b );
343     */
344   }
345
346
347   public static void testChangeTupleAndChangeTupleSet() {
348     /*
349     TokenTuple tt0 = new TokenTuple( new Integer( 0 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
350     TokenTuple tt1 = new TokenTuple( new Integer( 1 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
351     TokenTuple tt2 = new TokenTuple( new Integer( 2 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
352     TokenTuple tt8 = new TokenTuple( new Integer( 8 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
353     TokenTuple tt8b = new TokenTuple( new Integer( 8 ), true, TokenTuple.ARITY_MANY ).makeCanonical();
354
355     TokenTupleSet tts01   = new TokenTupleSet().add( tt0 ).add( tt1 );
356     TokenTupleSet tts12   = new TokenTupleSet().add( tt1 ).add( tt2 );
357     TokenTupleSet tts128  = new TokenTupleSet().add( tt1 ).add( tt2 ).add( tt8 );
358     TokenTupleSet tts128b = new TokenTupleSet().add( tt1 ).add( tt2 ).add( tt8b );
359
360     ChangeTuple ct0 = new ChangeTuple( tts01, tts12 );
361     ChangeTuple ct1 = new ChangeTuple( tts12, tts01 );
362     ChangeTuple ct2 = new ChangeTuple( tts01, tts128 );
363     ChangeTuple ct3 = new ChangeTuple( tts01, tts128b );
364     ChangeTuple ct4 = new ChangeTuple( tts01, tts128 );
365
366     test( "ct0.equals(       ct1 )?",          false, ct0.equals(       ct1 ) );
367     test( "ct0            == ct1?",            false, ct0 ==            ct1 );
368     test( "ct0.hashCode() == ct1.hashCode()?", false, ct0.hashCode() == ct1.hashCode() );
369
370     test( "ct0.equals(       ct2 )?",          false, ct0.equals(       ct2 ) );
371     test( "ct0            == ct2?",            false, ct0 ==            ct2 );
372     test( "ct0.hashCode() == ct2.hashCode()?", false, ct0.hashCode() == ct2.hashCode() );
373
374     test( "ct3.equals(       ct2 )?",          false, ct3.equals(       ct2 ) );
375     test( "ct3            == ct2?",            false, ct3 ==            ct2 );
376     test( "ct3.hashCode() == ct2.hashCode()?", false, ct3.hashCode() == ct2.hashCode() );
377
378     test( "ct4.equals(       ct2 )?",          true,  ct4.equals(       ct2 ) );
379     test( "ct4            == ct2?",            false, ct4 ==            ct2 );
380     test( "ct4.hashCode() == ct2.hashCode()?", true,  ct4.hashCode() == ct2.hashCode() );
381
382     ct2 = ct2.makeCanonical();
383     ct4 = ct4.makeCanonical();
384
385     test( "ct4.equals(       ct2 )?",          true,  ct4.equals(       ct2 ) );
386     test( "ct4            == ct2?",            true,  ct4 ==            ct2 );
387     test( "ct4.hashCode() == ct2.hashCode()?", true,  ct4.hashCode() == ct2.hashCode() );
388
389
390     ChangeTupleSet cts0 = new ChangeTupleSet();
391     ChangeTupleSet cts1 = new ChangeTupleSet( ct0 );
392     ChangeTupleSet cts2 = new ChangeTupleSet( cts1 );
393
394     test( "cts1.equals(       cts0 )?",          false, cts1.equals(       cts0 ) );
395     test( "cts1            == cts0?",            false, cts1 ==            cts0 );
396     test( "cts1.hashCode() == cts0.hashCode()?", false, cts1.hashCode() == cts0.hashCode() );
397
398     test( "cts1.equals(       cts2 )?",          true,  cts1.equals(       cts2 ) );
399     test( "cts1            == cts2?",            false, cts1 ==            cts2 );
400     test( "cts1.hashCode() == cts2.hashCode()?", true,  cts1.hashCode() == cts2.hashCode() );
401
402     cts1 = cts1.makeCanonical();
403     cts2 = cts2.makeCanonical();
404
405     test( "cts1.equals(       cts2 )?",          true,  cts1.equals(       cts2 ) );
406     test( "cts1            == cts2?",            true,  cts1 ==            cts2 );
407     test( "cts1.hashCode() == cts2.hashCode()?", true,  cts1.hashCode() == cts2.hashCode() );
408
409     ChangeTupleSet cts3 = new ChangeTupleSet( ct1 ).union( ct0 );
410
411     test( "cts0.isEmpty()?", true,  cts0.isEmpty() );
412     test( "cts1.isEmpty()?", false, cts1.isEmpty() );
413
414     test( "cts0.isSubset( cts1 )?", true,  cts0.isSubset( cts1 ) );
415     test( "cts1.isSubset( cts0 )?", false, cts1.isSubset( cts0 ) );
416
417     test( "cts1.isSubset( cts2 )?", true,  cts1.isSubset( cts2 ) );
418     test( "cts2.isSubset( cts1 )?", true,  cts2.isSubset( cts1 ) );
419
420     test( "cts1.isSubset( cts3 )?", true,  cts1.isSubset( cts3 ) );
421     test( "cts3.isSubset( cts1 )?", false, cts3.isSubset( cts1 ) );
422     */
423   }
424
425
426   public static void testReachabilitySet() {
427     /*
428     TokenTuple tt0  = new TokenTuple( new Integer( 100 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
429     TokenTuple tt1  = new TokenTuple( new Integer( 101 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
430     TokenTuple tt2  = new TokenTuple( new Integer( 102 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
431     TokenTuple tt3  = new TokenTuple( new Integer( 103 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
432     TokenTuple tt4  = new TokenTuple( new Integer( 104 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
433     TokenTuple tt5  = new TokenTuple( new Integer( 105 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
434     TokenTuple tt6  = new TokenTuple( new Integer( 106 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
435     TokenTuple tt7  = new TokenTuple( new Integer( 107 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
436     TokenTuple tt8  = new TokenTuple( new Integer( 108 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
437     TokenTuple tt9  = new TokenTuple( new Integer( 109 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
438     TokenTuple tt8b = new TokenTuple( new Integer( 108 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
439
440
441     AllocationSite as = new AllocationSite( 3, null );
442     as.setIthOldest( 0, new Integer( 104 ) );
443     as.setIthOldest( 1, new Integer( 105 ) );
444     as.setIthOldest( 2, new Integer( 106 ) );
445     as.setSummary  (    new Integer( 108 ) );
446
447
448     TokenTupleSet tts01   = new TokenTupleSet().add( tt0 ).add( tt1 );
449     TokenTupleSet tts12   = new TokenTupleSet().add( tt1 ).add( tt2 );
450     TokenTupleSet tts128  = new TokenTupleSet().add( tt1 ).add( tt2 ).add( tt8 );
451     TokenTupleSet tts128b = new TokenTupleSet().add( tt1 ).add( tt2 ).add( tt8b );
452
453     ReachabilitySet rs0 = new ReachabilitySet( tts128 );
454
455     test( "rs0.contains( tts01  )?", false, rs0.contains( tts01  ) );
456     test( "rs0.contains( tts128 )?", true,  rs0.contains( tts128 ) );
457
458     test( "rs0.containsTuple( tt8b )?", false, rs0.containsTuple( tt8b ) );
459     test( "rs0.containsTuple( tt8  )?", true,  rs0.containsTuple( tt8  ) );
460
461
462     TokenTupleSet tts048  = new TokenTupleSet().add( tt0 ).add( tt4 ).add( tt8 );
463     TokenTupleSet tts048b = new TokenTupleSet().add( tt0 ).add( tt4 ).add( tt8b );
464
465     ReachabilitySet rs1 = new ReachabilitySet( tts128 ).add( tts048 ).add( tts01 );
466     ReachabilitySet rs2 = rs1.increaseArity( new Integer( 108 ) );
467
468     test( "rs1.equals( rs2 )?",                false, rs1.equals( rs2 ) );
469     test( "rs1 == rs2?",                       false, rs1 == rs2 );
470     test( "rs1.hashCode() == rs2.hashCode()?", false, rs1.hashCode() == rs2.hashCode() );
471
472     ReachabilitySet rs3 = new ReachabilitySet( tts128b ).add( tts048b ).add( tts01 );
473
474     test( "rs2.equals( rs3 )?",                true, rs2.equals( rs3 ) );
475     test( "rs2 == rs3?",                       true, rs2 == rs3 );
476     test( "rs2.hashCode() == rs3.hashCode()?", true, rs2.hashCode() == rs3.hashCode() );
477
478
479     ReachabilitySet rs4 = rs0.union( rs3 );
480     ReachabilitySet rs5 = new ReachabilitySet().union( tts128 ).union( tts128b ).union( tts048b ).union( tts01 );
481
482     test( "rs4.equals( rs5 )?",                true, rs4.equals( rs5 ) );
483     test( "rs4 == rs5?",                       true, rs4 == rs5 );
484     test( "rs4.hashCode() == rs5.hashCode()?", true, rs4.hashCode() == rs5.hashCode() );
485
486
487     ReachabilitySet rs6 = new ReachabilitySet().add( tts128b ).add( tts048b ).add( tts01 ).add( tts12 );
488     ReachabilitySet rs7 = rs6.intersection( rs5 );
489
490     test( "rs6.equals(       rs7 )?",          false, rs6.equals(       rs7 ) );
491     test( "rs6 ==            rs7?",            false, rs6 ==            rs7 );
492     test( "rs6.hashCode() == rs7.hashCode()?", false, rs6.hashCode() == rs7.hashCode() );
493
494     test( "rs3.equals(       rs7 )?",          true, rs3.equals(       rs7 ) );
495     test( "rs3 ==            rs7?",            true, rs3 ==            rs7 );
496     test( "rs3.hashCode() == rs7.hashCode()?", true, rs3.hashCode() == rs7.hashCode() );
497
498
499     TokenTupleSet tts67  = new TokenTupleSet().add( tt6 ).add( tt7 );
500     TokenTupleSet tts806 = new TokenTupleSet().add( tt8 ).add( tt0 ).add( tt6 );
501
502     TokenTupleSet tts058b = new TokenTupleSet().add( tt8b ).add( tt0 ).add( tt5 );
503     TokenTupleSet tts87   = new TokenTupleSet().add( tt8 ).add( tt7 );
504     TokenTupleSet tts08b  = new TokenTupleSet().add( tt0 ).add( tt8b );
505
506     ReachabilitySet rs8 = new ReachabilitySet().add( tts128 ).add( tts048b ).add( tts01 ).add( tts67 ).add( tts806 );
507     ReachabilitySet rs9 = new ReachabilitySet().add( tts128 ).add( tts058b ).add( tts01 ).add( tts87 ).add( tts08b );
508
509     test( "rs8.equals(       rs9 )?",          false, rs8.equals(       rs9 ) );
510     test( "rs8 ==            rs9?",            false, rs8 ==            rs9 );
511     test( "rs8.hashCode() == rs9.hashCode()?", false, rs8.hashCode() == rs9.hashCode() );
512
513     rs8 = rs8.ageTokens( as );
514
515     test( "rs8.equals(       rs9 )?",          true, rs8.equals(       rs9 ) );
516     test( "rs8 ==            rs9?",            true, rs8 ==            rs9 );
517     test( "rs8.hashCode() == rs9.hashCode()?", true, rs8.hashCode() == rs9.hashCode() );
518
519     ReachabilitySet rs10 = new ReachabilitySet().add( tts08b ).add( tts01 );
520     ReachabilitySet rs11 = new ReachabilitySet().add( tts058b ).add( tts01 ).add( tts08b );
521     ReachabilitySet rs12 = new ReachabilitySet().add( tts128 ).add( tts058b ).add( tts01 ).add( tts87 ).add( tts08b );
522
523     test( "rs11.equals(       rs12 )?",          false, rs11.equals(       rs12 ) );
524     test( "rs11 ==            rs12?",            false, rs11 ==            rs12 );
525     test( "rs11.hashCode() == rs12.hashCode()?", false, rs11.hashCode() == rs12.hashCode() );
526
527     rs12 = rs12.pruneBy( rs10 );
528
529     test( "rs11.equals(       rs12 )?",          true, rs11.equals(       rs12 ) );
530     test( "rs11 ==            rs12?",            true, rs11 ==            rs12 );
531     test( "rs11.hashCode() == rs12.hashCode()?", true, rs11.hashCode() == rs12.hashCode() );
532
533
534     ReachabilitySet rs13 = new ReachabilitySet( tts128 ).add( tts048 ).add( tts01 );
535     ReachabilitySet rs14 = new ReachabilitySet( tts87 ).add( tts01 );
536
537     ChangeTupleSet cts0 = rs14.unionUpArityToChangeSet( rs13 );
538     System.out.println( cts0 );
539
540
541     TokenTuple tt0b = new TokenTuple( new Integer( 100 ), true,  TokenTuple.ARITY_MANY  ).makeCanonical();
542     TokenTuple tt1b = new TokenTuple( new Integer( 101 ), true,  TokenTuple.ARITY_MANY  ).makeCanonical();
543
544     TokenTupleSet tts01b28 = new TokenTupleSet().add( tt1b ).add( tt0 ).add( tt2 ).add( tt8 );
545     TokenTupleSet tts0b148 = new TokenTupleSet().add( tt0b ).add( tt1 ).add( tt4 ).add( tt8 );
546     TokenTupleSet tts0b1b  = new TokenTupleSet().add( tt1b ).add( tt0b );
547     TokenTupleSet tts1278b = new TokenTupleSet().add( tt1  ).add( tt7 ).add( tt2 ).add( tt8b );
548     TokenTupleSet tts0478b = new TokenTupleSet().add( tt0  ).add( tt7 ).add( tt4 ).add( tt8b );
549     TokenTupleSet tts1078  = new TokenTupleSet().add( tt1  ).add( tt7 ).add( tt0 ).add( tt8 );
550
551     ChangeTuple ct0 = new ChangeTuple( tts01, tts01b28 );
552     ChangeTuple ct1 = new ChangeTuple( tts01, tts0b148 );
553     ChangeTuple ct2 = new ChangeTuple( tts01, tts0b1b  );
554     ChangeTuple ct3 = new ChangeTuple( tts87, tts1278b );
555     ChangeTuple ct4 = new ChangeTuple( tts87, tts0478b );
556     ChangeTuple ct5 = new ChangeTuple( tts87, tts1078  );
557
558     ChangeTupleSet cts1
559       = new ChangeTupleSet( ct0 ).union( ct1 ).union( ct2 ).union( ct3 ).union( ct4 ).union( ct5 );
560
561     test( "cts1.equals(       cts0 )?",          true,  cts1.equals(       cts0 ) );
562     test( "cts1            == cts0?",            true,  cts1 ==            cts0 );
563     test( "cts1.hashCode() == cts0.hashCode()?", true,  cts1.hashCode() == cts0.hashCode() );
564
565
566     TokenTuple tt173  = new TokenTuple( new Integer( 173 ), false, TokenTuple.ARITY_ONE  ).makeCanonical();
567     TokenTuple tt174  = new TokenTuple( new Integer( 174 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
568     TokenTuple tt174b = new TokenTuple( new Integer( 174 ), true,  TokenTuple.ARITY_MANY ).makeCanonical();
569     TokenTuple tt177  = new TokenTuple( new Integer( 177 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
570
571     TokenTupleSet tts3   = new TokenTupleSet().add( tt173 );
572     TokenTupleSet tts4   = new TokenTupleSet().add( tt174 );
573     TokenTupleSet tts7   = new TokenTupleSet().add( tt177 );
574     TokenTupleSet tts4b7 = new TokenTupleSet().add( tt174b ).add( tt177 );
575     TokenTupleSet tts43  = new TokenTupleSet().add( tt174 ).add( tt173 );
576
577     ReachabilitySet rs100 = new ReachabilitySet().add( tts3 ).add( tts4 ).add( tts7 ).add( tts4b7 ).add( tts43 );
578     ReachabilitySet rs101 = rs100.exhaustiveArityCombinations();
579
580     System.out.println( "#####################\nrs100 = \n"+rs100 );
581     System.out.println( "#####################\nrs101 = \n"+rs101 );
582     */
583   }
584
585
586   public static void testNewMethods() {
587     TokenTuple tt1 = new TokenTuple( new Integer( 1 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
588     TokenTuple tt2 = new TokenTuple( new Integer( 2 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
589     TokenTuple tt3 = new TokenTuple( new Integer( 3 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
590     TokenTuple tt4 = new TokenTuple( new Integer( 4 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
591     TokenTuple tt5 = new TokenTuple( new Integer( 5 ), true,  TokenTuple.ARITY_ONE  ).makeCanonical();
592
593     TokenTupleSet tts12   = new TokenTupleSet().add( tt1 ).add( tt2 ).                      makeCanonical();
594     TokenTupleSet tts123  = new TokenTupleSet().add( tt1 ).add( tt2 ).add( tt3 ).           makeCanonical();
595     TokenTupleSet tts4    = new TokenTupleSet().add( tt4 ).                                 makeCanonical();
596     TokenTupleSet tts125  = new TokenTupleSet().add( tt1 ).add( tt2 ).add( tt5 ).           makeCanonical();
597     TokenTupleSet tts1235 = new TokenTupleSet().add( tt1 ).add( tt2 ).add( tt3 ).add( tt5 ).makeCanonical();
598
599     ReachabilitySet rs = new ReachabilitySet().add( tts12 ).add( tts123 ).add( tts4 ).makeCanonical();
600
601     ChangeTuple ct0 = new ChangeTuple( tts12,  tts125  );
602     ChangeTuple ct1 = new ChangeTuple( tts123, tts1235 );
603
604     ChangeTupleSet cts0 = new ChangeTupleSet( ct0 ).union( ct1 );
605
606     System.out.println( "#####################\nrs = \n"+rs );
607     System.out.println( "#####################\nafter change set = \n"+rs.applyChangeSet( cts0 ) );
608   }
609 }