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_interface_range;
18 
19 import dot.junit.DxTestCase;
20 import dot.junit.DxUtil;
21 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_1;
22 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_11;
23 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_12;
24 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_13;
25 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_14;
26 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_16;
27 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_18;
28 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_20;
29 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_21;
30 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_23;
31 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_24;
32 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_25;
33 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_3;
34 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_4;
35 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_5;
36 import dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_7;
37 
38 public class Test_invoke_interface_range extends DxTestCase {
39 
40     /**
41      * @title invoke interface method
42      */
testN1()43     public void testN1() {
44         T_invoke_interface_range_1 t = new T_invoke_interface_range_1();
45         assertEquals(0, t.run("aa", "aa"));
46         assertEquals(-1, t.run("aa", "bb"));
47         assertEquals(1, t.run("bb", "aa"));
48     }
49 
50     /**
51      * @title Check that new frame is created by invoke_interface_range and
52      * arguments are passed to method
53      */
testN2()54     public void testN2() {
55         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_14
56         //@uses dot.junit.opcodes.invoke_interface_range.ITest
57         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
58         T_invoke_interface_range_14 t = new T_invoke_interface_range_14();
59         ITestImpl impl = new ITestImpl();
60         assertEquals(1, t.run(impl));
61     }
62 
63     /**
64      * @title invoke default interface method
65      */
testN3()66     public void testN3() {
67         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_25", null);
68     }
69 
70     /**
71      * @title objref is null
72      */
testE3()73     public void testE3() {
74         //@uses dot.junit.opcodes.invoke_interface_range.ITest
75         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_3",
76                    NullPointerException.class);
77     }
78 
79     /**
80      * @title object doesn't implement interface
81      */
testE4()82     public void testE4() {
83         //@uses dot.junit.opcodes.invoke_interface_range.ITest
84         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
85         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_11",
86                    IncompatibleClassChangeError.class);
87     }
88 
89     /**
90      * @title Native method can't be linked
91      */
testE5()92     public void testE5() {
93         //@uses dot.junit.opcodes.invoke_interface_range.ITest
94         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
95         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_12",
96                    UnsatisfiedLinkError.class, new ITestImpl());
97     }
98 
99     /**
100      * @title Attempt to invoke abstract method
101      */
testE6()102     public void testE6() {
103         //@uses dot.junit.opcodes.invoke_interface_range.ITest
104         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
105         //@uses dot.junit.opcodes.invoke_interface_range.ITestImplAbstract
106         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_13",
107                    AbstractMethodError.class);
108     }
109 
110     /**
111      * @title Attempt to invoke conflict method
112      */
testE7()113     public void testE7() {
114         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_23",
115                    IncompatibleClassChangeError.class);
116     }
117 
118     /**
119      * @title Attempt to invoke abstract method
120      */
testE8()121     public void testE8() {
122         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_24",
123                    AbstractMethodError.class);
124     }
125 
126 
127     /**
128      * @constraint A17
129      * @title invalid constant pool index
130      */
testVFE1()131     public void testVFE1() {
132         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_2",
133              VerifyError.class);
134     }
135 
136     /**
137      * @constraint A17
138      * @title The referenced method_id must belong to an interface (not a class).
139      */
testVFE2()140     public void testVFE2() {
141         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_4",
142                    IncompatibleClassChangeError.class);
143     }
144 
145     /**
146      * @constraint B1
147      * @title number of arguments
148      */
testVFE5()149     public void testVFE5() {
150         //@uses dot.junit.opcodes.invoke_interface_range.ITest
151         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
152         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_5",
153              VerifyError.class);
154     }
155 
156     /**
157      * @constraint B1
158      * @title int is passed instead of objref
159      */
testVFE6()160     public void testVFE6() {
161         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_10",
162              VerifyError.class);
163     }
164 
165     /**
166      * @constraint B9
167      * @title number of arguments passed to method
168      */
testVFE9()169     public void testVFE9() {
170         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_9",
171              VerifyError.class);
172     }
173 
174     /**
175      * @constraint A15
176      * @title invoke-interface may not be used to call <init>.
177      */
testVFE10()178     public void testVFE10() {
179         //@uses dot.junit.opcodes.invoke_interface_range.ITest
180         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
181         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_18",
182              VerifyError.class);
183     }
184 
185     /**
186      * @constraint A15
187      * @title invoke-interface may not be used to call <clinit>.
188      */
testVFE11()189     public void testVFE11() {
190         //@uses dot.junit.opcodes.invoke_interface_range.ITest
191         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
192         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_20",
193              VerifyError.class);
194     }
195 
196     /**
197      * @constraint B9
198      * @title types of arguments passed to method
199      */
testVFE12()200     public void testVFE12() {
201         //@uses dot.junit.opcodes.invoke_interface_range.ITest
202         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
203         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_21",
204              VerifyError.class);
205     }
206 
207     /**
208      * @constraint A23
209      * @title number of registers
210      */
testVFE13()211     public void testVFE13() {
212         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_8",
213              VerifyError.class);
214     }
215 
216     /**
217      * @constraint n/a
218      * @title Attempt to call undefined method.
219      */
testVFE14()220     public void testVFE14() {
221         //@uses dot.junit.opcodes.invoke_interface_range.ITest
222         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
223         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_7",
224                    NoSuchMethodError.class, new ITestImpl());
225     }
226 
227     /**
228      * @constraint n/a
229      * @title Method has different signature.
230      */
testVFE15()231     public void testVFE15() {
232         //@uses dot.junit.opcodes.invoke_interface_range.ITest
233         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
234         loadAndRun("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_16",
235                    NoSuchMethodError.class, new ITestImpl());
236     }
237 
238     /**
239      * @constraint B6
240      * @title instance methods may only be invoked on already initialized instances.
241      */
testVFE21()242     public void testVFE21() {
243         //@uses dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_22
244         //@uses dot.junit.opcodes.invoke_interface_range.ITest
245         //@uses dot.junit.opcodes.invoke_interface_range.ITestImpl
246         load("dot.junit.opcodes.invoke_interface_range.d.T_invoke_interface_range_22",
247              VerifyError.class);
248     }
249 }
250