xref: /aosp_15_r20/art/test/840-resolution/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker public class Main {
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker   // Testcase 1: the superclass has a package private version in the same package.
20*795d594fSAndroid Build Coastguard Worker   static Interface s = new SubClass();
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker   // Testcase 2: the class has a package private version.
23*795d594fSAndroid Build Coastguard Worker   static Interface s2;
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker   // Testcase 3: the superclass has a package private version in a different package.
26*795d594fSAndroid Build Coastguard Worker   static Interface s3 = new SubClassFromPkg();
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker   // Testcase 4: there is no implementation in the hierarchy.
29*795d594fSAndroid Build Coastguard Worker   static Interface s4 = new SubClassNoFoo();
30*795d594fSAndroid Build Coastguard Worker 
31*795d594fSAndroid Build Coastguard Worker   // Testcase 5: there is a private method in the hierarchy.
32*795d594fSAndroid Build Coastguard Worker   static Interface s5 = new SubClassPrivateFoo();
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker   // Testcase 6: there is a static method in the hierarchy.
35*795d594fSAndroid Build Coastguard Worker   static Interface s6 = new SubClassStaticFoo();
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker   static {
38*795d594fSAndroid Build Coastguard Worker     try {
39*795d594fSAndroid Build Coastguard Worker       s2 = (Interface) Class.forName("SubClass2").newInstance();
40*795d594fSAndroid Build Coastguard Worker     } catch (Exception e) {
41*795d594fSAndroid Build Coastguard Worker       throw new Error(e);
42*795d594fSAndroid Build Coastguard Worker     }
43*795d594fSAndroid Build Coastguard Worker   }
44*795d594fSAndroid Build Coastguard Worker 
assertEquals(Object expected, Object actual)45*795d594fSAndroid Build Coastguard Worker   public static void assertEquals(Object expected, Object actual) {
46*795d594fSAndroid Build Coastguard Worker     if (expected != actual) {
47*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected " + expected + ", got " + actual);
48*795d594fSAndroid Build Coastguard Worker     }
49*795d594fSAndroid Build Coastguard Worker   }
50*795d594fSAndroid Build Coastguard Worker 
assertTrue(boolean value)51*795d594fSAndroid Build Coastguard Worker   public static void assertTrue(boolean value) {
52*795d594fSAndroid Build Coastguard Worker     if (!value) {
53*795d594fSAndroid Build Coastguard Worker       throw new Error("");
54*795d594fSAndroid Build Coastguard Worker     }
55*795d594fSAndroid Build Coastguard Worker   }
56*795d594fSAndroid Build Coastguard Worker 
main(String[] args)57*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) throws Exception {
58*795d594fSAndroid Build Coastguard Worker     assertEquals(SuperClass.class, ((SubClass) s).foo());
59*795d594fSAndroid Build Coastguard Worker     assertEquals(SuperClass.class, ((SuperClass) s).foo());
60*795d594fSAndroid Build Coastguard Worker 
61*795d594fSAndroid Build Coastguard Worker     try {
62*795d594fSAndroid Build Coastguard Worker       s.foo();
63*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IllegalAccessError");
64*795d594fSAndroid Build Coastguard Worker     } catch (IllegalAccessError ie) {
65*795d594fSAndroid Build Coastguard Worker       // expected
66*795d594fSAndroid Build Coastguard Worker     }
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker     assertEquals(null, ((SuperClass) s2).foo());
69*795d594fSAndroid Build Coastguard Worker     try {
70*795d594fSAndroid Build Coastguard Worker       s2.foo();
71*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IllegalAccessError");
72*795d594fSAndroid Build Coastguard Worker     } catch (IllegalAccessError ie) {
73*795d594fSAndroid Build Coastguard Worker       // expected
74*795d594fSAndroid Build Coastguard Worker     }
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker     try {
77*795d594fSAndroid Build Coastguard Worker       ((pkg.PkgSuperClass) s3).foo();
78*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IllegalAccessError");
79*795d594fSAndroid Build Coastguard Worker     } catch (IllegalAccessError ie) {
80*795d594fSAndroid Build Coastguard Worker       // expected
81*795d594fSAndroid Build Coastguard Worker     }
82*795d594fSAndroid Build Coastguard Worker 
83*795d594fSAndroid Build Coastguard Worker     try {
84*795d594fSAndroid Build Coastguard Worker       ((SubClassFromPkg) s3).foo();
85*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IllegalAccessError");
86*795d594fSAndroid Build Coastguard Worker     } catch (IllegalAccessError ie) {
87*795d594fSAndroid Build Coastguard Worker       // expected
88*795d594fSAndroid Build Coastguard Worker     }
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker     try {
91*795d594fSAndroid Build Coastguard Worker       s3.foo();
92*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IllegalAccessError");
93*795d594fSAndroid Build Coastguard Worker     } catch (IllegalAccessError ie) {
94*795d594fSAndroid Build Coastguard Worker       // expected
95*795d594fSAndroid Build Coastguard Worker     }
96*795d594fSAndroid Build Coastguard Worker 
97*795d594fSAndroid Build Coastguard Worker     try {
98*795d594fSAndroid Build Coastguard Worker       ((SuperClassNoFoo) s4).foo();
99*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected NoSuchMethodError");
100*795d594fSAndroid Build Coastguard Worker     } catch (NoSuchMethodError e) {
101*795d594fSAndroid Build Coastguard Worker       // expected
102*795d594fSAndroid Build Coastguard Worker     }
103*795d594fSAndroid Build Coastguard Worker 
104*795d594fSAndroid Build Coastguard Worker     try {
105*795d594fSAndroid Build Coastguard Worker       ((SubClassNoFoo) s4).foo();
106*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected AbstractMethodError");
107*795d594fSAndroid Build Coastguard Worker     } catch (AbstractMethodError e) {
108*795d594fSAndroid Build Coastguard Worker       // expected
109*795d594fSAndroid Build Coastguard Worker     }
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker     try {
112*795d594fSAndroid Build Coastguard Worker       s4.foo();
113*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected AbstractMethodError");
114*795d594fSAndroid Build Coastguard Worker     } catch (AbstractMethodError e) {
115*795d594fSAndroid Build Coastguard Worker       // expected
116*795d594fSAndroid Build Coastguard Worker     }
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker     try {
119*795d594fSAndroid Build Coastguard Worker       ((SuperClassPrivateFoo) s5).foo();
120*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IllegalAccessError");
121*795d594fSAndroid Build Coastguard Worker     } catch (IllegalAccessError e) {
122*795d594fSAndroid Build Coastguard Worker       // expected
123*795d594fSAndroid Build Coastguard Worker     }
124*795d594fSAndroid Build Coastguard Worker 
125*795d594fSAndroid Build Coastguard Worker     try {
126*795d594fSAndroid Build Coastguard Worker       ((SubClassPrivateFoo) s5).foo();
127*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IllegalAccessError");
128*795d594fSAndroid Build Coastguard Worker     } catch (IllegalAccessError e) {
129*795d594fSAndroid Build Coastguard Worker       // expected
130*795d594fSAndroid Build Coastguard Worker     }
131*795d594fSAndroid Build Coastguard Worker 
132*795d594fSAndroid Build Coastguard Worker     try {
133*795d594fSAndroid Build Coastguard Worker       s5.foo();
134*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected AbstractMethodError on RI, IllegalAccessError on ART");
135*795d594fSAndroid Build Coastguard Worker     } catch (AbstractMethodError | IllegalAccessError e) {
136*795d594fSAndroid Build Coastguard Worker       // expected
137*795d594fSAndroid Build Coastguard Worker     }
138*795d594fSAndroid Build Coastguard Worker 
139*795d594fSAndroid Build Coastguard Worker     try {
140*795d594fSAndroid Build Coastguard Worker       ((SuperClassStaticFoo) s6).foo();
141*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IncompatibleClassChangeError");
142*795d594fSAndroid Build Coastguard Worker     } catch (IncompatibleClassChangeError e) {
143*795d594fSAndroid Build Coastguard Worker       // expected
144*795d594fSAndroid Build Coastguard Worker     }
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker     try {
147*795d594fSAndroid Build Coastguard Worker       ((SubClassStaticFoo) s6).foo();
148*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected IncompatibleClassChangeError");
149*795d594fSAndroid Build Coastguard Worker     } catch (IncompatibleClassChangeError e) {
150*795d594fSAndroid Build Coastguard Worker       // expected
151*795d594fSAndroid Build Coastguard Worker     }
152*795d594fSAndroid Build Coastguard Worker 
153*795d594fSAndroid Build Coastguard Worker     try {
154*795d594fSAndroid Build Coastguard Worker       s6.foo();
155*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected AbstractMethodError");
156*795d594fSAndroid Build Coastguard Worker     } catch (AbstractMethodError e) {
157*795d594fSAndroid Build Coastguard Worker       // expected
158*795d594fSAndroid Build Coastguard Worker     }
159*795d594fSAndroid Build Coastguard Worker   }
160*795d594fSAndroid Build Coastguard Worker }
161*795d594fSAndroid Build Coastguard Worker 
162*795d594fSAndroid Build Coastguard Worker interface Interface {
foo()163*795d594fSAndroid Build Coastguard Worker   public Class<?> foo();
164*795d594fSAndroid Build Coastguard Worker }
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker class SubClass extends SuperClass implements Interface {
167*795d594fSAndroid Build Coastguard Worker }
168*795d594fSAndroid Build Coastguard Worker 
169*795d594fSAndroid Build Coastguard Worker class SubClassFromPkg extends pkg.PkgSuperClass implements Interface {
170*795d594fSAndroid Build Coastguard Worker }
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker class SubClassNoFoo extends SuperClassNoFoo implements Interface {
173*795d594fSAndroid Build Coastguard Worker }
174*795d594fSAndroid Build Coastguard Worker 
175*795d594fSAndroid Build Coastguard Worker class SubClassPrivateFoo extends SuperClassPrivateFoo implements Interface {
176*795d594fSAndroid Build Coastguard Worker }
177*795d594fSAndroid Build Coastguard Worker 
178*795d594fSAndroid Build Coastguard Worker class SubClassStaticFoo extends SuperClassStaticFoo implements Interface {
179*795d594fSAndroid Build Coastguard Worker }
180