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