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 {
33 System.out.println( "---------------------------------------" );
36 System.out.println( "---------------------------------------" );
38 System.out.println( "---------------------------------------" );
39 testChangeTupleAndChangeTupleSet();
40 System.out.println( "---------------------------------------" );
41 testReachabilitySet();
42 System.out.println( "---------------------------------------" );
45 System.out.println( "---------------------------------------" );
49 System.out.println( "<><><><><><><><><><><><><><><><><><><><><><><><>" );
50 System.out.println( "<><><> WARNING: At least one test failed. <><><>" );
51 System.out.println( "<><><><><><><><><><><><><><><><><><><><><><><><>" );
53 System.out.println( "<><> All tests passed. <><>" );
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 );
65 public static void testTokenTuple() {
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 );
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() );
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() );
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() );
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() );
90 tt1 = tt1.increaseArity();
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() );
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() );
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() );
104 tt4 = tt4.increaseArity();
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() );
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 );
116 test( "tt6 equals tt7?", true, tt6.equals( tt7 ) );
117 test( "tt6.hashCode == tt7.hashCode?", true, tt6.hashCode() == tt7.hashCode() );
119 test( "tt8 equals tt7?", false, tt8.equals( tt7 ) );
120 test( "tt8.hashCode == tt7.hashCode?", false, tt8.hashCode() == tt7.hashCode() );
122 // notice that this makes tt7 canonical
123 tt7 = tt7.changeTokenTo( new Integer( 8 ) );
125 test( "tt6 equals tt7?", false, tt6.equals( tt7 ) );
126 test( "tt6.hashCode == tt7.hashCode?", false, tt6.hashCode() == tt7.hashCode() );
128 test( "tt8 equals tt7?", true, tt8.equals( tt7 ) );
129 test( "tt8.hashCode == tt7.hashCode?", true, tt8.hashCode() == tt7.hashCode() );
131 test( "tt6 == tt7?", false, tt6 == tt7 );
132 test( "tt8 == tt7?", false, tt8 == tt7 );
133 test( "tt9 == tt7?", false, tt9 == tt7 );
135 tt6 = tt6.makeCanonical();
136 tt8 = tt8.makeCanonical();
137 tt9 = tt9.makeCanonical();
139 test( "tt6 == tt7?", false, tt6 == tt7 );
140 test( "tt8 == tt7?", true, tt8 == tt7 );
141 test( "tt9 == tt7?", false, tt9 == tt7 );
146 public static void testTokenTupleSet() {
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();
152 TokenTupleSet tts0 = new TokenTupleSet( tt0 );
153 TokenTupleSet tts1 = new TokenTupleSet( tt1 );
154 TokenTupleSet tts2a = new TokenTupleSet( tt2 );
155 TokenTupleSet tts2b = new TokenTupleSet( tt2 );
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() );
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() );
166 TokenTupleSet tts012a = new TokenTupleSet();
167 tts012a = tts012a.add( tt0 );
168 tts012a = tts012a.add( tt1 );
169 tts012a = tts012a.add( tt2 );
171 TokenTupleSet tts012b = tts0.union( tts1.union( tts2b.union( tts2a ) ) );
173 test( "tts012a.equals( tts012b )?", true, tts012a.equals( tts012b ) );
174 test( "tts012a.hashCode == tts012b.hashCode?", true, tts012a.hashCode() == tts012b.hashCode() );
177 TokenTupleSet ttsEmpty = new TokenTupleSet();
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 ) );
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();
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 ) );
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 ) );
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 ) );
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();
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();
215 TokenTupleSet tts4567a = new TokenTupleSet();
216 tts4567a = tts4567a.add( tt4 ).add( tt5 ).add( tt6 ).add( tt7 );
218 TokenTupleSet tts4567b = new TokenTupleSet( tts4567a );
220 TokenTupleSet tts4567c = new TokenTupleSet();
221 tts4567c = tts4567c.add( tt4 ).add( tt5star ).add( tt6 ).add( tt7 );
223 TokenTupleSet tts4567d = new TokenTupleSet();
224 tts4567d = tts4567d.add( tt4 ).add( tt5star ).add( tt6star ).add( tt7 );
226 test( "tts4567a.equals( tts4567b )?", true, tts4567a.equals( tts4567b ) );
227 test( "tts4567a.hashCode == tts4567b.hashCode?", true, tts4567a.hashCode() == tts4567b.hashCode() );
229 test( "tts4567a.equals( tts4567c )?", false, tts4567a.equals( tts4567c ) );
230 test( "tts4567a.hashCode == tts4567c.hashCode?", false, tts4567a.hashCode() == tts4567c.hashCode() );
232 test( "tts4567a.equals( tts4567d )?", false, tts4567a.equals( tts4567d ) );
233 test( "tts4567a.hashCode == tts4567d.hashCode?", false, tts4567a.hashCode() == tts4567d.hashCode() );
235 tts4567a = tts4567a.increaseArity( new Integer( 6 ) );
237 test( "tts4567a.equals( tts4567b )?", false, tts4567a.equals( tts4567b ) );
238 test( "tts4567a.hashCode == tts4567b.hashCode?", false, tts4567a.hashCode() == tts4567b.hashCode() );
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() );
244 test( "tts4567a.equals( tts4567d )?", false, tts4567a.equals( tts4567d ) );
245 test( "tts4567a.hashCode == tts4567d.hashCode?", false, tts4567a.hashCode() == tts4567d.hashCode() );
247 tts4567a = tts4567a.increaseArity( new Integer( 5 ) );
250 test( "tts4567a.equals( tts4567b )?", false, tts4567a.equals( tts4567b ) );
251 test( "tts4567a.hashCode == tts4567b.hashCode?", false, tts4567a.hashCode() == tts4567b.hashCode() );
253 test( "tts4567a.equals( tts4567c )?", false, tts4567a.equals( tts4567c ) );
254 test( "tts4567a.hashCode == tts4567c.hashCode?", false, tts4567a.hashCode() == tts4567c.hashCode() );
256 test( "tts4567a.equals( tts4567d )?", true, tts4567a.equals( tts4567d ) );
257 test( "tts4567a.hashCode == tts4567d.hashCode?", true, tts4567a.hashCode() == tts4567d.hashCode() );
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 ) ) );
266 // they should be canonical
267 test( "tts4567a.equals( tts4567d )?", true, tts4567a.equals( tts4567d ) );
268 test( "tts4567a == tts4567d?", true, tts4567a == tts4567d );
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();
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 ) );
288 TokenTupleSet ttsAgeTest0a = new TokenTupleSet();
289 ttsAgeTest0a = ttsAgeTest0a.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star );
291 TokenTupleSet ttsAgeTest0b = new TokenTupleSet();
292 ttsAgeTest0b = ttsAgeTest0b.add( tt12 ).add( tt52 ).add( tt42 ).add( tt62star );
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 );
301 TokenTupleSet ttsAgeTest1a = new TokenTupleSet();
302 ttsAgeTest1a = ttsAgeTest1a.add( tt10 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 );
304 TokenTupleSet ttsAgeTest1b = new TokenTupleSet();
305 ttsAgeTest1b = ttsAgeTest1b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 );
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 );
314 TokenTupleSet ttsAgeTest2a = new TokenTupleSet();
315 ttsAgeTest2a = ttsAgeTest2a.add( tt10 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt12 ).add( tt11 );
317 TokenTupleSet ttsAgeTest2b = new TokenTupleSet();
318 ttsAgeTest2b = ttsAgeTest2b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13 ).add( tt12 );
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 );
327 TokenTupleSet ttsAgeTest3a = new TokenTupleSet();
328 ttsAgeTest3a = ttsAgeTest3a.add( tt13 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt12 ).add( tt10 );
330 TokenTupleSet ttsAgeTest3b = new TokenTupleSet();
331 ttsAgeTest3b = ttsAgeTest3b.add( tt11 ).add( tt52 ).add( tt42 ).add( tt62star ).add( tt13star );
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 );
340 // they should be canonical
341 test( "ttsAgeTest3a.equals( ttsAgeTest3b )?", true, ttsAgeTest3a.equals( ttsAgeTest3b ) );
342 test( "ttsAgeTest3a == ttsAgeTest3b?", true, ttsAgeTest3a == ttsAgeTest3b );
347 public static void testChangeTupleAndChangeTupleSet() {
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();
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 );
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 );
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() );
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() );
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() );
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() );
382 ct2 = ct2.makeCanonical();
383 ct4 = ct4.makeCanonical();
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() );
390 ChangeTupleSet cts0 = new ChangeTupleSet();
391 ChangeTupleSet cts1 = new ChangeTupleSet( ct0 );
392 ChangeTupleSet cts2 = new ChangeTupleSet( cts1 );
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() );
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() );
402 cts1 = cts1.makeCanonical();
403 cts2 = cts2.makeCanonical();
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() );
409 ChangeTupleSet cts3 = new ChangeTupleSet( ct1 ).union( ct0 );
411 test( "cts0.isEmpty()?", true, cts0.isEmpty() );
412 test( "cts1.isEmpty()?", false, cts1.isEmpty() );
414 test( "cts0.isSubset( cts1 )?", true, cts0.isSubset( cts1 ) );
415 test( "cts1.isSubset( cts0 )?", false, cts1.isSubset( cts0 ) );
417 test( "cts1.isSubset( cts2 )?", true, cts1.isSubset( cts2 ) );
418 test( "cts2.isSubset( cts1 )?", true, cts2.isSubset( cts1 ) );
420 test( "cts1.isSubset( cts3 )?", true, cts1.isSubset( cts3 ) );
421 test( "cts3.isSubset( cts1 )?", false, cts3.isSubset( cts1 ) );
426 public static void testReachabilitySet() {
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();
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 ) );
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 );
453 ReachabilitySet rs0 = new ReachabilitySet( tts128 );
455 test( "rs0.contains( tts01 )?", false, rs0.contains( tts01 ) );
456 test( "rs0.contains( tts128 )?", true, rs0.contains( tts128 ) );
458 test( "rs0.containsTuple( tt8b )?", false, rs0.containsTuple( tt8b ) );
459 test( "rs0.containsTuple( tt8 )?", true, rs0.containsTuple( tt8 ) );
462 TokenTupleSet tts048 = new TokenTupleSet().add( tt0 ).add( tt4 ).add( tt8 );
463 TokenTupleSet tts048b = new TokenTupleSet().add( tt0 ).add( tt4 ).add( tt8b );
465 ReachabilitySet rs1 = new ReachabilitySet( tts128 ).add( tts048 ).add( tts01 );
466 ReachabilitySet rs2 = rs1.increaseArity( new Integer( 108 ) );
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() );
472 ReachabilitySet rs3 = new ReachabilitySet( tts128b ).add( tts048b ).add( tts01 );
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() );
479 ReachabilitySet rs4 = rs0.union( rs3 );
480 ReachabilitySet rs5 = new ReachabilitySet().union( tts128 ).union( tts128b ).union( tts048b ).union( tts01 );
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() );
487 ReachabilitySet rs6 = new ReachabilitySet().add( tts128b ).add( tts048b ).add( tts01 ).add( tts12 );
488 ReachabilitySet rs7 = rs6.intersection( rs5 );
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() );
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() );
499 TokenTupleSet tts67 = new TokenTupleSet().add( tt6 ).add( tt7 );
500 TokenTupleSet tts806 = new TokenTupleSet().add( tt8 ).add( tt0 ).add( tt6 );
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 );
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 );
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() );
513 rs8 = rs8.ageTokens( as );
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() );
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 );
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() );
527 rs12 = rs12.pruneBy( rs10 );
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() );
534 ReachabilitySet rs13 = new ReachabilitySet( tts128 ).add( tts048 ).add( tts01 );
535 ReachabilitySet rs14 = new ReachabilitySet( tts87 ).add( tts01 );
537 ChangeTupleSet cts0 = rs14.unionUpArityToChangeSet( rs13 );
538 System.out.println( cts0 );
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();
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 );
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 );
559 = new ChangeTupleSet( ct0 ).union( ct1 ).union( ct2 ).union( ct3 ).union( ct4 ).union( ct5 );
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() );
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();
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 );
577 ReachabilitySet rs100 = new ReachabilitySet().add( tts3 ).add( tts4 ).add( tts7 ).add( tts4b7 ).add( tts43 );
578 ReachabilitySet rs101 = rs100.exhaustiveArityCombinations();
580 System.out.println( "#####################\nrs100 = \n"+rs100 );
581 System.out.println( "#####################\nrs101 = \n"+rs101 );
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();
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();
599 ReachabilitySet rs = new ReachabilitySet().add( tts12 ).add( tts123 ).add( tts4 ).makeCanonical();
601 ChangeTuple ct0 = new ChangeTuple( tts12, tts125 );
602 ChangeTuple ct1 = new ChangeTuple( tts123, tts1235 );
604 ChangeTupleSet cts0 = new ChangeTupleSet( ct0 ).union( ct1 );
606 System.out.println( "#####################\nrs = \n"+rs );
607 System.out.println( "#####################\nafter change set = \n"+rs.applyChangeSet( cts0 ) );