adding a test case
[IRC.git] / Robust / src / Tests / OwnershipAnalysisTest / testGraphs / Main.java
1 import IR.*;
2 import IR.Flat.*;
3 import Analysis.OwnershipAnalysis.*;
4 import java.util.*;
5 import java.io.*;
6
7
8 ///////////////////////////////////////////
9 //
10 //  The testing of the ownership graph
11 //  components relies on the testTokens
12 //  test in another directory.  Those classes
13 //  are assumed to be fully tested here.
14 //
15 ///////////////////////////////////////////
16
17
18 public class Main {
19
20     static boolean aTestFailed;
21
22     protected static void test( String test,
23                                 boolean expected,
24                                 boolean result ) {
25         String outcome;
26         if( expected == result ) {
27             outcome = "...\tpassed";
28         } else {
29             outcome = "...\tFAILED";
30             aTestFailed = true;
31         }
32         
33         System.out.println( test+" expect "+expected+outcome );
34     }
35     
36     public static void main(String args[]) throws Exception {
37         aTestFailed = false;
38
39         testExample();
40         System.out.println( "---------------------------------------" );
41         testNodesAndEdges();
42         System.out.println( "---------------------------------------" );
43         testGraphs();
44         System.out.println( "---------------------------------------" );
45
46         if( aTestFailed ) {
47             System.out.println( "<><><><><><><><><><><><><><><><><><><><><><><><>" );
48             System.out.println( "<><><> WARNING: At least one test failed. <><><>" );
49             System.out.println( "<><><><><><><><><><><><><><><><><><><><><><><><>" );
50         } else {
51             System.out.println( "<><> All tests passed. <><>" );
52         }
53     }
54
55     public static void testExample() {
56         // example test to know the testing routine is correct!
57         test( "4 == 5?", false, 4 == 5 );
58         test( "3 == 3?", true,  3 == 3 );
59     }
60     
61
62     public static void testNodesAndEdges() {
63         TempDescriptor lnTestA = new TempDescriptor( "lnTestA" );
64         TempDescriptor lnTestB = new TempDescriptor( "lnTestB" );
65
66         LabelNode ln0 = new LabelNode( lnTestA );
67         LabelNode ln1 = new LabelNode( lnTestA );
68         LabelNode ln2 = new LabelNode( lnTestB );
69
70         test( "ln0 equals ln1?", true,  ln0.equals( ln1 ) );
71         test( "ln1 equals ln0?", true,  ln1.equals( ln0 ) );
72         test( "ln0 equals ln2?", false, ln0.equals( ln2 ) );
73         test( "ln2 equals ln1?", false, ln2.equals( ln1 ) );
74
75         /*
76         public HeapRegionNode( Integer         id,
77                                boolean         isSingleObject,
78                                boolean         isFlagged,
79                                boolean         isNewSummary,
80                                AllocationSite  allocSite,
81                                ReachabilitySet alpha,
82                                String          description );
83         */
84
85         TokenTuple tt00 = new TokenTuple( new Integer( 00 ), false, TokenTuple.ARITY_ONE );
86         TokenTuple tt01 = new TokenTuple( new Integer( 01 ), false, TokenTuple.ARITY_ONE );
87         TokenTupleSet tts0 = new TokenTupleSet( tt00 ).add( tt01 );
88         ReachabilitySet a0 = new ReachabilitySet( tts0 );
89
90         HeapRegionNode hrn00 = new HeapRegionNode( new Integer( 00 ),
91                                                    true,
92                                                    false,
93                                                    false,
94                                                    null,
95                                                    a0,
96                                                    "hrn00" );
97
98         HeapRegionNode hrn01 = new HeapRegionNode( new Integer( 01 ),
99                                                    true,
100                                                    false,
101                                                    false,
102                                                    null,
103                                                    a0,
104                                                    "hrn01" );
105
106         HeapRegionNode hrn02 = new HeapRegionNode( new Integer( 01 ),
107                                                    true,
108                                                    false,
109                                                    false,
110                                                    null,
111                                                    a0,
112                                                    "hrn01" );
113
114         test( "hrn01.equals( hrn00 )?", false, hrn01.equals( hrn00 ) );
115         test( "hrn01.equals( hrn02 )?", true,  hrn01.equals( hrn02 ) );
116
117         test( "hrn01.hashCode() == hrn00.hashCode()?", false, hrn01.hashCode() == hrn00.hashCode() );
118         test( "hrn01.hashCode() == hrn02.hashCode()?", true,  hrn01.hashCode() == hrn02.hashCode() );
119
120         HeapRegionNode hrn03 = new HeapRegionNode( new Integer( 00 ),
121                                                    true,
122                                                    false,
123                                                    false,
124                                                    null,
125                                                    a0,
126                                                    "hrn00" );
127
128
129         /*
130         public ReferenceEdge( OwnershipNode   src,
131                               HeapRegionNode  dst,                        
132                               FieldDescriptor fieldDesc, 
133                               boolean         isInitialParamReflexive,
134                               ReachabilitySet beta ) {
135         */
136
137         ReferenceEdge edge0 = new ReferenceEdge(  ln0,  hrn00, null, false, a0 );
138         ReferenceEdge edge1 = new ReferenceEdge(  ln0,  hrn00, null, false, a0 );
139         ReferenceEdge edge2 = new ReferenceEdge( hrn01, hrn00, null, false, a0 );
140         ReferenceEdge edge3 = new ReferenceEdge( hrn02, hrn03, null, false, a0 );
141         ReferenceEdge edge4 = new ReferenceEdge( hrn01, hrn00, null, false, a0 );
142
143         test( "edge0.equals(       edge1 )?",          true,  edge0.equals(       edge1 ) );
144         test( "edge0.hashCode() == edge1.hashCode()?", true,  edge0.hashCode() == edge1.hashCode() );
145
146         test( "edge2.equals(       edge1 )?",          false, edge2.equals(       edge1 ) );
147         test( "edge2.hashCode() == edge1.hashCode()?", false, edge2.hashCode() == edge1.hashCode() );
148
149         test( "edge2.equals(       edge3 )?",          false, edge2.equals(       edge3 ) );
150         // a collision, because even though src and dst are not same objects, they are equivalent and
151         // produce the same hashcode
152         //test( "edge2.hashCode() == edge3.hashCode()?", false, edge2.hashCode() == edge3.hashCode() );
153
154         test( "edge2.equals(       edge4 )?",          true,  edge2.equals(       edge4 ) );
155         test( "edge2.hashCode() == edge4.hashCode()?", true,  edge2.hashCode() == edge4.hashCode() );
156
157     }
158
159
160     public static void testGraphs() {
161         // test equality of label objects that are logically
162         // same/different but all separate objects
163         // these tests show how a label node object or other
164         // ownership graph element can be equivalent logically
165         // to a different object in another graph
166         TempDescriptor lnTestA = new TempDescriptor( "lnTestA" );
167         TempDescriptor lnTestB = new TempDescriptor( "lnTestB" );
168
169         LabelNode ln0 = new LabelNode( lnTestA );
170         LabelNode ln1 = new LabelNode( lnTestA );
171         LabelNode ln2 = new LabelNode( lnTestB );
172
173         test( "ln0 equals ln1?", true,  ln0.equals( ln1 ) );
174         test( "ln1 equals ln0?", true,  ln1.equals( ln0 ) );
175         test( "ln0 equals ln2?", false, ln0.equals( ln2 ) );
176         test( "ln2 equals ln1?", false, ln2.equals( ln1 ) );
177
178
179         // ownership graphs g3 and g4 are equivalent
180         // graphs as specified in OwnershipGraph.java, 
181         // just built from different objects that contain the
182         // equivalent values and merged in a different
183         // order
184         int allocationDepth = 3;
185
186         OwnershipGraph g0     = new OwnershipGraph( allocationDepth );
187         TempDescriptor g0tdp1 = new TempDescriptor( "p1" );
188         TempDescriptor g0tdx  = new TempDescriptor( "x" );
189         g0.assignParameterAllocationToTemp( true, g0tdp1, new Integer( 0 ) );
190         g0.assignTempYToTempX             ( g0tdp1, g0tdx );
191
192         OwnershipGraph g1     = new OwnershipGraph( allocationDepth );
193         TempDescriptor g1tdp2 = new TempDescriptor( "p2" );
194         TempDescriptor g1tdy  = new TempDescriptor( "y" );
195         TempDescriptor g1tdz  = new TempDescriptor( "z" );
196         g1.assignParameterAllocationToTemp( true, g1tdp2, new Integer( 0 ) );
197         g1.assignTempYToTempX             ( g1tdp2, g1tdy );
198         g1.assignTempYFieldFToTempX       ( g1tdp2, null, g1tdz );
199
200         OwnershipGraph g2     = new OwnershipGraph( allocationDepth );
201         TempDescriptor g2tdp3 = new TempDescriptor( "p3" );
202         TempDescriptor g2tdp4 = new TempDescriptor( "p4" );
203         TempDescriptor g2tdw  = new TempDescriptor( "w" );
204         g2.assignParameterAllocationToTemp( true, g2tdp3, new Integer( 0 ) );
205         g2.assignParameterAllocationToTemp( true, g2tdp4, new Integer( 1 ) );
206         g2.assignTempYToTempX             ( g2tdp4, g2tdw );
207         g2.assignTempYToTempXFieldF       ( g2tdw, g2tdp3, null );
208
209         OwnershipGraph g3 = new OwnershipGraph( allocationDepth );
210         g3.merge( g0 );
211         g3.merge( g1 );
212         g3.merge( g2 );
213
214         OwnershipGraph g4 = new OwnershipGraph( allocationDepth );
215         g4.merge( g1 );
216         g4.merge( g2 );
217         g4.merge( g0 );
218
219         OwnershipGraph g5     = new OwnershipGraph( allocationDepth );
220         TempDescriptor g5tdp1 = new TempDescriptor( "p1" );
221         TempDescriptor g5tdy  = new TempDescriptor( "y" );
222         g5.assignParameterAllocationToTemp( true, g5tdp1, new Integer( 0 ) );
223         g5.assignTempYToTempX             ( g5tdp1, g5tdy );
224
225         /*
226         try {
227             g3.writeGraph( "g3", true, false, false, false );
228             g4.writeGraph( "g4", true, false, false, false );
229         } catch( IOException e ) {}
230         */
231
232         test( "g0 equals to g1?", false, g0.equals( g1 ) );
233         test( "g1 equals to g0?", false, g1.equals( g0 ) );
234
235         test( "g0 equals to g2?", false, g0.equals( g2 ) );
236         test( "g2 equals to g0?", false, g2.equals( g0 ) );
237
238         test( "g1 equals to g2?", false, g1.equals( g2 ) );
239         test( "g2 equals to g1?", false, g2.equals( g1 ) );
240
241         test( "g3 equals to g0?", false, g3.equals( g0 ) );
242         test( "g3 equals to g1?", false, g3.equals( g1 ) );
243         test( "g3 equals to g2?", false, g3.equals( g2 ) );
244
245         test( "g4 equals to g0?", false, g4.equals( g0 ) );
246         test( "g4 equals to g1?", false, g4.equals( g1 ) );
247         test( "g4 equals to g2?", false, g4.equals( g2 ) );
248         
249         test( "g3 equals to g4?", true,  g3.equals( g4 ) );
250         test( "g4 equals to g3?", true,  g4.equals( g3 ) );
251
252         test( "g0 equals to g5?", false, g0.equals( g5 ) );
253         test( "g5 equals to g0?", false, g5.equals( g0 ) );
254     }
255 }