3 import Analysis.OwnershipAnalysis.*;
10 static boolean aTestFailed;
13 protected static void test( String test,
17 if( expected == result ) {
18 outcome = "...\tpassed";
20 outcome = "...\tFAILED";
24 System.out.println( test+" expect "+expected+outcome );
28 public static void main(String args[]) throws Exception {
32 System.out.println( "---------------------------------------" );
34 System.out.println( "---------------------------------------" );
36 System.out.println( "---------------------------------------" );
37 testChangeTupleAndChangeTupleSet();
38 System.out.println( "---------------------------------------" );
39 testReachabilitySet();
40 System.out.println( "---------------------------------------" );
43 System.out.println( "<><><><><><><><><><><><><><><><><><><><><><><><>" );
44 System.out.println( "<><><> WARNING: At least one test failed. <><><>" );
45 System.out.println( "<><><><><><><><><><><><><><><><><><><><><><><><>" );
47 System.out.println( "<><> All tests passed. <><>" );
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 );
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 );
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() );
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() );
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() );
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() );
83 tt1 = tt1.increaseArity();
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() );
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() );
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() );
97 tt4 = tt4.increaseArity();
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() );
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 );
109 test( "tt6 equals tt7?", true, tt6.equals( tt7 ) );
110 test( "tt6.hashCode == tt7.hashCode?", true, tt6.hashCode() == tt7.hashCode() );
112 test( "tt8 equals tt7?", false, tt8.equals( tt7 ) );
113 test( "tt8.hashCode == tt7.hashCode?", false, tt8.hashCode() == tt7.hashCode() );
115 // notice that this makes tt7 canonical
116 tt7 = tt7.changeTokenTo( new Integer( 8 ) );
118 test( "tt6 equals tt7?", false, tt6.equals( tt7 ) );
119 test( "tt6.hashCode == tt7.hashCode?", false, tt6.hashCode() == tt7.hashCode() );
121 test( "tt8 equals tt7?", true, tt8.equals( tt7 ) );
122 test( "tt8.hashCode == tt7.hashCode?", true, tt8.hashCode() == tt7.hashCode() );
124 test( "tt6 == tt7?", false, tt6 == tt7 );
125 test( "tt8 == tt7?", false, tt8 == tt7 );
126 test( "tt9 == tt7?", false, tt9 == tt7 );
128 tt6 = tt6.makeCanonical();
129 tt8 = tt8.makeCanonical();
130 tt9 = tt9.makeCanonical();
132 test( "tt6 == tt7?", false, tt6 == tt7 );
133 test( "tt8 == tt7?", true, tt8 == tt7 );
134 test( "tt9 == tt7?", false, tt9 == tt7 );
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();
143 TokenTupleSet tts0 = new TokenTupleSet( tt0 );
144 TokenTupleSet tts1 = new TokenTupleSet( tt1 );
145 TokenTupleSet tts2a = new TokenTupleSet( tt2 );
146 TokenTupleSet tts2b = new TokenTupleSet( tt2 );
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() );
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() );
157 TokenTupleSet tts012a = new TokenTupleSet();
158 tts012a = tts012a.add( tt0 );
159 tts012a = tts012a.add( tt1 );
160 tts012a = tts012a.add( tt2 );
162 TokenTupleSet tts012b = tts0.union( tts1.union( tts2b.union( tts2a ) ) );
164 test( "tts012a.equals( tts012b )?", true, tts012a.equals( tts012b ) );
165 test( "tts012a.hashCode == tts012b.hashCode?", true, tts012a.hashCode() == tts012b.hashCode() );
168 TokenTupleSet ttsEmpty = new TokenTupleSet();
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 ) );
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();
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 ) );
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 ) );
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 ) );
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();
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();
206 TokenTupleSet tts4567a = new TokenTupleSet();
207 tts4567a = tts4567a.add( tt4 ).add( tt5 ).add( tt6 ).add( tt7 );
209 TokenTupleSet tts4567b = new TokenTupleSet( tts4567a );
211 TokenTupleSet tts4567c = new TokenTupleSet();
212 tts4567c = tts4567c.add( tt4 ).add( tt5star ).add( tt6 ).add( tt7 );
214 TokenTupleSet tts4567d = new TokenTupleSet();
215 tts4567d = tts4567d.add( tt4 ).add( tt5star ).add( tt6star ).add( tt7 );
217 test( "tts4567a.equals( tts4567b )?", true, tts4567a.equals( tts4567b ) );
218 test( "tts4567a.hashCode == tts4567b.hashCode?", true, tts4567a.hashCode() == tts4567b.hashCode() );
220 test( "tts4567a.equals( tts4567c )?", false, tts4567a.equals( tts4567c ) );
221 test( "tts4567a.hashCode == tts4567c.hashCode?", false, tts4567a.hashCode() == tts4567c.hashCode() );
223 test( "tts4567a.equals( tts4567d )?", false, tts4567a.equals( tts4567d ) );
224 test( "tts4567a.hashCode == tts4567d.hashCode?", false, tts4567a.hashCode() == tts4567d.hashCode() );
226 tts4567a = tts4567a.increaseArity( new Integer( 6 ) );
228 test( "tts4567a.equals( tts4567b )?", false, tts4567a.equals( tts4567b ) );
229 test( "tts4567a.hashCode == tts4567b.hashCode?", false, tts4567a.hashCode() == tts4567b.hashCode() );
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() );
235 test( "tts4567a.equals( tts4567d )?", false, tts4567a.equals( tts4567d ) );
236 test( "tts4567a.hashCode == tts4567d.hashCode?", false, tts4567a.hashCode() == tts4567d.hashCode() );
238 tts4567a = tts4567a.increaseArity( new Integer( 5 ) );
241 test( "tts4567a.equals( tts4567b )?", false, tts4567a.equals( tts4567b ) );
242 test( "tts4567a.hashCode == tts4567b.hashCode?", false, tts4567a.hashCode() == tts4567b.hashCode() );
244 test( "tts4567a.equals( tts4567c )?", false, tts4567a.equals( tts4567c ) );
245 test( "tts4567a.hashCode == tts4567c.hashCode?", false, tts4567a.hashCode() == tts4567c.hashCode() );
247 test( "tts4567a.equals( tts4567d )?", true, tts4567a.equals( tts4567d ) );
248 test( "tts4567a.hashCode == tts4567d.hashCode?", true, tts4567a.hashCode() == tts4567d.hashCode() );
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 ) ) );
257 // they should be canonical
258 test( "tts4567a.equals( tts4567d )?", true, tts4567a.equals( tts4567d ) );
259 test( "tts4567a == tts4567d?", true, tts4567a == tts4567d );
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();
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 ) );
279 TokenTupleSet ttsAgeTest0a = new TokenTupleSet();
280 ttsAgeTest0a = ttsAgeTest0a.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star );
282 TokenTupleSet ttsAgeTest0b = new TokenTupleSet();
283 ttsAgeTest0b = ttsAgeTest0b.add( tt12 ).add( tt52 ).add( tt42 ).add( tt62star );
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 );
292 TokenTupleSet ttsAgeTest1a = new TokenTupleSet();
293 ttsAgeTest1a = ttsAgeTest1a.add( tt10 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 );
295 TokenTupleSet ttsAgeTest1b = new TokenTupleSet();
296 ttsAgeTest1b = ttsAgeTest1b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 );
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 );
305 TokenTupleSet ttsAgeTest2a = new TokenTupleSet();
306 ttsAgeTest2a = ttsAgeTest2a.add( tt10 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt12 ).add( tt11 );
308 TokenTupleSet ttsAgeTest2b = new TokenTupleSet();
309 ttsAgeTest2b = ttsAgeTest2b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 ).add( tt12 );
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 );
318 TokenTupleSet ttsAgeTest3a = new TokenTupleSet();
319 ttsAgeTest3a = ttsAgeTest3a.add( tt13 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt12 ).add( tt10 );
321 TokenTupleSet ttsAgeTest3b = new TokenTupleSet();
322 ttsAgeTest3b = ttsAgeTest3b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13star );
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 );
331 // they should be canonical
332 test( "ttsAgeTest3a.equals( ttsAgeTest3b )?", true, ttsAgeTest3a.equals( ttsAgeTest3b ) );
333 test( "ttsAgeTest3a == ttsAgeTest3b?", true, ttsAgeTest3a == ttsAgeTest3b );
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();
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 );
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 );
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() );
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() );
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() );
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() );
371 ct2 = ct2.makeCanonical();
372 ct4 = ct4.makeCanonical();
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() );
379 ChangeTupleSet cts0 = new ChangeTupleSet();
380 ChangeTupleSet cts1 = new ChangeTupleSet( ct0 );
381 ChangeTupleSet cts2 = new ChangeTupleSet( cts1 );
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() );
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() );
391 cts1 = cts1.makeCanonical();
392 cts2 = cts2.makeCanonical();
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() );
398 ChangeTupleSet cts3 = new ChangeTupleSet( ct1 ).union( ct0 );
400 test( "cts0.isEmpty()?", true, cts0.isEmpty() );
401 test( "cts1.isEmpty()?", false, cts1.isEmpty() );
403 test( "cts0.isSubset( cts1 )?", true, cts0.isSubset( cts1 ) );
404 test( "cts1.isSubset( cts0 )?", false, cts1.isSubset( cts0 ) );
406 test( "cts1.isSubset( cts2 )?", true, cts1.isSubset( cts2 ) );
407 test( "cts2.isSubset( cts1 )?", true, cts2.isSubset( cts1 ) );
409 test( "cts1.isSubset( cts3 )?", true, cts1.isSubset( cts3 ) );
410 test( "cts3.isSubset( cts1 )?", false, cts3.isSubset( cts1 ) );
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();
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 ) );
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 );
440 ReachabilitySet rs0 = new ReachabilitySet( tts128 );
442 test( "rs0.contains( tts01 )?", false, rs0.contains( tts01 ) );
443 test( "rs0.contains( tts128 )?", true, rs0.contains( tts128 ) );
445 test( "rs0.containsTuple( tt8b )?", false, rs0.containsTuple( tt8b ) );
446 test( "rs0.containsTuple( tt8 )?", true, rs0.containsTuple( tt8 ) );
449 TokenTupleSet tts048 = new TokenTupleSet().add( tt0 ).add( tt4 ).add( tt8 );
450 TokenTupleSet tts048b = new TokenTupleSet().add( tt0 ).add( tt4 ).add( tt8b );
452 ReachabilitySet rs1 = new ReachabilitySet( tts128 ).add( tts048 ).add( tts01 );
453 ReachabilitySet rs2 = rs1.increaseArity( new Integer( 108 ) );
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() );
459 ReachabilitySet rs3 = new ReachabilitySet( tts128b ).add( tts048b ).add( tts01 );
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() );
466 ReachabilitySet rs4 = rs0.union( rs3 );
467 ReachabilitySet rs5 = new ReachabilitySet().union( tts128 ).union( tts128b ).union( tts048b ).union( tts01 );
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() );
474 ReachabilitySet rs6 = new ReachabilitySet().add( tts128b ).add( tts048b ).add( tts01 ).add( tts12 );
475 ReachabilitySet rs7 = rs6.intersection( rs5 );
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() );
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() );
486 TokenTupleSet tts67 = new TokenTupleSet().add( tt6 ).add( tt7 );
487 TokenTupleSet tts806 = new TokenTupleSet().add( tt8 ).add( tt0 ).add( tt6 );
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 );
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 );
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() );
500 rs8 = rs8.ageTokens( as );
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() );
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 );
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() );
514 rs12 = rs12.pruneBy( rs10 );
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() );
521 ReachabilitySet rs13 = new ReachabilitySet( tts128 ).add( tts048 ).add( tts01 );
522 ReachabilitySet rs14 = new ReachabilitySet( tts87 ).add( tts01 );
524 ChangeTupleSet cts0 = rs14.unionUpArityToChangeSet( rs13 );
525 System.out.println( cts0 );
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();
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 );
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 );
546 = new ChangeTupleSet( ct0 ).union( ct1 ).union( ct2 ).union( ct3 ).union( ct4 ).union( ct5 );
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() );