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