1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dot.junit.opcodes.invoke_super_range;
18 
19 import dot.junit.DxTestCase;
20 import dot.junit.DxUtil;
21 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_1;
22 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_10;
23 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_14;
24 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_15;
25 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_17;
26 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_18;
27 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_19;
28 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_2;
29 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_20;
30 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_24;
31 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_4;
32 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_5;
33 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_6;
34 import dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_7;
35 
36 public class Test_invoke_super_range extends DxTestCase {
37 
38     /**
39      * @title invoke method of superclass
40      */
testN1()41     public void testN1() {
42         //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_1
43         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
44         T_invoke_super_range_1 t = new T_invoke_super_range_1();
45         assertEquals(5, t.run());
46     }
47 
48 
49     /**
50      * @title Invoke protected method of superclass
51      */
testN3()52     public void testN3() {
53         //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_7
54         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
55         T_invoke_super_range_7 t = new T_invoke_super_range_7();
56         assertEquals(5, t.run());
57     }
58 
59     /**
60      * @title Check that new frame is created by invoke_super_range and
61      * arguments are passed to method
62      */
testN5()63     public void testN5() {
64         //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_14
65         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
66         T_invoke_super_range_14 t = new T_invoke_super_range_14();
67         assertTrue(t.run());
68     }
69 
70     /**
71      * @title Recursion of method lookup procedure
72      */
testN6()73     public void testN6() {
74         //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_17
75         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
76         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper2
77         T_invoke_super_range_17 t = new T_invoke_super_range_17();
78         assertEquals(5, t.run());
79     }
80 
81     /**
82      * @title invoke-super in conflict class
83      */
testN7()84     public void testN7() {
85         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_26", null);
86     }
87 
88     /**
89      * @title obj ref is null
90      */
testE1()91     public void testE1() {
92         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
93         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_2",
94                    NullPointerException.class);
95     }
96 
97     /**
98      * @title Native method can't be linked
99      */
testE2()100     public void testE2() {
101         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
102         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_4",
103                    UnsatisfiedLinkError.class);
104     }
105 
106     /**
107      * @title Attempt to invoke abstract method
108      */
testE4()109     public void testE4() {
110         //@uses dot.junit.opcodes.invoke_super_range.ATest
111         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_6",
112                    AbstractMethodError.class);
113     }
114 
115     /**
116      * @title Attempt to invoke abstract interface method
117      */
testE5()118     public void testE5() {
119         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_27", AbstractMethodError.class);
120     }
121 
122     /**
123      * @title Attempt to invoke abstract interface method
124      */
testE6()125     public void testE6() {
126         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_28",
127                    IncompatibleClassChangeError.class);
128     }
129 
130 
131     /**
132      * @constraint A14
133      * @title invalid constant pool index
134      */
testVFE1()135     public void testVFE1() {
136         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_8", VerifyError.class);
137     }
138 
139     /**
140      * @constraint A15
141      * @title <clinit> may not be called using invoke-super
142      */
testVFE3()143     public void testVFE3() {
144         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_10", VerifyError.class);
145     }
146 
147     /**
148      * @constraint B1
149      * @title number of arguments passed to method
150      */
testVFE4()151     public void testVFE4() {
152         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_11", VerifyError.class);
153     }
154 
155     /**
156      * @constraint B9
157      * @title types of arguments passed to method.
158      */
testVFE5()159     public void testVFE5() {
160         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
161         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_12", VerifyError.class);
162     }
163 
164     /**
165      * @constraint A15
166      * @title <init> may not be called using invoke_super_range
167      */
testVFE6()168     public void testVFE6() {
169         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_16", VerifyError.class);
170     }
171 
172     /**
173      * @constraint B10
174      * @title assignment incompatible references when accessing
175      *                  protected method
176      */
testVFE8()177     public void testVFE8() {
178         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
179         //@uses dot.junit.opcodes.invoke_super_range.d.TPlain
180         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_22", VerifyError.class);
181     }
182 
183     /**
184      * @constraint B10
185      * @title assignment incompatible references when accessing
186      *                  public method
187      */
testVFE9()188     public void testVFE9() {
189         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
190         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper2
191         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_23", VerifyError.class);
192     }
193 
194     /**
195      * @constraint n/a
196      * @title Attempt to call static method.
197      */
testVFE10()198     public void testVFE10() {
199         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
200         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_5",
201                    IncompatibleClassChangeError.class);
202     }
203 
204 
205     /**
206      * @constraint n/a
207      * @title Attempt to invoke non-existing method.
208      */
testVFE12()209     public void testVFE12() {
210         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_15",
211                    NoSuchMethodError.class);
212     }
213 
214     /**
215      * @constraint n/a
216      * @title Attempt to invoke private method of other class.
217      */
testVFE13()218     public void testVFE13() {
219         //@uses dot.junit.opcodes.invoke_super_range.TestStubs
220         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_18",
221                    IllegalAccessError.class, new TestStubs());
222     }
223 
224     /**
225      * @constraint B12
226      * @title Attempt to invoke protected method of unrelated class.
227      */
testVFE14()228     public void testVFE14() {
229         //@uses dot.junit.opcodes.invoke_super_range.TestStubs
230         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_20",
231                    IllegalAccessError.class, new TestStubs());
232     }
233 
234     /**
235      * @constraint n/a
236      * @title Method has different signature.
237      */
testVFE15()238     public void testVFE15() {
239         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
240         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_19",
241                    NoSuchMethodError.class);
242     }
243 
244     /**
245      * @constraint n/a
246      * @title invoke-super/range shall be used to invoke private methods
247      */
testVFE16()248     public void testVFE16() {
249         //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_13
250         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
251         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_13", VerifyError.class);
252     }
253 
254     /**
255      * @constraint A23
256      * @title number of registers
257      */
testVFE17()258     public void testVFE17() {
259         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_9", VerifyError.class);
260     }
261 
262     /**
263      * @constraint A14
264      * @title attempt to invoke interface method
265      */
testVFE18()266     public void testVFE18() {
267         //@uses dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_24
268         loadAndRun("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_24",
269                    AbstractMethodError.class);
270     }
271 
272     /**
273      * @constraint B6
274      * @title instance methods may only be invoked on already initialized instances.
275      */
testVFE19()276     public void testVFE19() {
277         //@uses dot.junit.opcodes.invoke_super_range.d.TSuper
278         load("dot.junit.opcodes.invoke_super_range.d.T_invoke_super_range_25", VerifyError.class);
279     }
280 
281 }
282