1 /* 2 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @summary Test of method selection and resolution cases that 27 * generate InvokeVirtualSuccessTest 28 * @run main InvokeVirtualSuccessTest 29 */ 30 31 import java.util.function.Consumer; 32 import java.util.Collection; 33 import java.util.Collections; 34 import java.util.Arrays; 35 import java.util.EnumSet; 36 37 public class InvokeVirtualSuccessTest extends SelectionResolutionTest { 38 39 private static final SelectionResolutionTestCase.Builder initBuilder = 40 new SelectionResolutionTestCase.Builder(); 41 42 static { 43 initBuilder.invoke = SelectionResolutionTestCase.InvokeInstruction.INVOKEVIRTUAL; 44 } 45 46 private static final Collection<TestGroup> testgroups = 47 Arrays.asList( 48 /* invokevirtual tests */ 49 /* Group 16: callsite = methodref = expected, no override */ 50 new TestGroup.Simple(initBuilder, 51 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 52 EnumSet.of(MethodData.Access.PRIVATE), 53 EnumSet.of(MethodData.Context.INSTANCE), 54 EnumSet.of(ClassData.Package.SAME)), 55 Template.OverrideAbstractExpectedClass, 56 Template.MethodrefEqualsExpected, 57 Template.IgnoredAbstract, 58 Template.CallsiteEqualsMethodref, 59 Template.MethodrefSelectionResolvedIsClassNoOverride), 60 /* Group 17: callsite = methodref = expected, override allowed */ 61 new TestGroup.Simple(initBuilder, 62 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 63 EnumSet.of(MethodData.Access.PROTECTED, 64 MethodData.Access.PUBLIC), 65 EnumSet.of(MethodData.Context.INSTANCE, 66 MethodData.Context.ABSTRACT), 67 EnumSet.of(ClassData.Package.SAME)), 68 Template.OverrideAbstractExpectedClass, 69 Template.MethodrefEqualsExpected, 70 Template.IgnoredAbstract, 71 Template.CallsiteEqualsMethodref, 72 Template.MethodrefSelectionResolvedIsClass, 73 Template.SelectionOverrideAbstract), 74 /* Group 18: callsite = methodref = resolved, possibly 75 * skip different package in selection. 76 */ 77 new TestGroup.Simple(initBuilder, 78 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 79 EnumSet.of(MethodData.Access.PACKAGE), 80 EnumSet.of(MethodData.Context.INSTANCE, 81 MethodData.Context.ABSTRACT), 82 EnumSet.of(ClassData.Package.SAME)), 83 Template.OverrideAbstractExpectedClass, 84 Template.MethodrefEqualsExpected, 85 Template.IgnoredAbstract, 86 Template.CallsiteEqualsMethodref, 87 Template.MethodrefSelectionPackageSkip, 88 Template.SelectionOverrideAbstract), 89 /* Group 19: callsite = methodref, methodref != expected, 90 * expected is class, expected and callsite in the same package 91 */ 92 new TestGroup.Simple(initBuilder, 93 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 94 EnumSet.of(MethodData.Access.PUBLIC, 95 MethodData.Access.PROTECTED), 96 EnumSet.of(MethodData.Context.INSTANCE, 97 MethodData.Context.ABSTRACT), 98 EnumSet.of(ClassData.Package.SAME)), 99 Template.OverrideAbstractExpectedClass, 100 Template.MethodrefNotEqualsExpectedClass, 101 Template.IgnoredAbstract, 102 Template.CallsiteEqualsMethodref, 103 Template.MethodrefSelectionResolvedIsClass, 104 Template.SelectionOverrideAbstract), 105 /* Group 20: callsite = methodref, methodref \!= 106 * expected, possibly skip different package in 107 * selection. 108 */ 109 new TestGroup.Simple(initBuilder, 110 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 111 EnumSet.of(MethodData.Access.PACKAGE), 112 EnumSet.of(MethodData.Context.INSTANCE, 113 MethodData.Context.ABSTRACT), 114 EnumSet.of(ClassData.Package.SAME)), 115 Template.OverrideAbstractExpectedClass, 116 Template.MethodrefNotEqualsExpectedClass, 117 Template.IgnoredAbstract, 118 Template.CallsiteEqualsMethodref, 119 Template.MethodrefSelectionPackageSkip, 120 Template.SelectionOverrideAbstract), 121 /* Group 21: callsite = methodref, methodref != expected, 122 * expected is interface, expected and callsite in the same package 123 */ 124 new TestGroup.Simple(initBuilder, 125 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 126 EnumSet.of(MethodData.Access.PUBLIC), 127 EnumSet.of(MethodData.Context.INSTANCE, 128 MethodData.Context.ABSTRACT), 129 EnumSet.of(ClassData.Package.SAME)), 130 Template.OverrideAbstractExpectedIface, 131 Template.MethodrefNotEqualsExpectedIface, 132 Template.IgnoredAbstract, 133 Template.CallsiteEqualsMethodref, 134 Template.MethodrefSelectionResolvedIsIface, 135 Template.SelectionOverrideAbstract), 136 /* Group 22: callsite :> methodref, methodref = expected, 137 * expected is class, expected and callsite in the same package 138 */ 139 new TestGroup.Simple(initBuilder, 140 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 141 EnumSet.of(MethodData.Access.PUBLIC, 142 MethodData.Access.PROTECTED), 143 EnumSet.of(MethodData.Context.INSTANCE, 144 MethodData.Context.ABSTRACT), 145 EnumSet.of(ClassData.Package.SAME)), 146 Template.OverrideAbstractExpectedClass, 147 Template.MethodrefEqualsExpected, 148 Template.IgnoredAbstract, 149 Template.CallsiteSubclassMethodref, 150 Template.MethodrefSelectionResolvedIsClass, 151 Template.SelectionOverrideAbstract), 152 /* Group 23: callsite :>, methodref = expected, 153 * possibly skip different package in selection 154 */ 155 new TestGroup.Simple(initBuilder, 156 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 157 EnumSet.of(MethodData.Access.PACKAGE), 158 EnumSet.of(MethodData.Context.INSTANCE, 159 MethodData.Context.ABSTRACT), 160 EnumSet.of(ClassData.Package.SAME)), 161 Template.OverrideAbstractExpectedClass, 162 Template.MethodrefEqualsExpected, 163 Template.IgnoredAbstract, 164 Template.CallsiteSubclassMethodref, 165 Template.MethodrefSelectionPackageSkip, 166 Template.SelectionOverrideAbstract), 167 /* Group 24: callsite :> methodref, methodref != expected, 168 * expected is class, expected and callsite in the same package 169 */ 170 new TestGroup.Simple(initBuilder, 171 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 172 EnumSet.of(MethodData.Access.PUBLIC, 173 MethodData.Access.PROTECTED), 174 EnumSet.of(MethodData.Context.INSTANCE, 175 MethodData.Context.ABSTRACT), 176 EnumSet.of(ClassData.Package.SAME)), 177 Template.OverrideAbstractExpectedClass, 178 Template.MethodrefNotEqualsExpectedClass, 179 Template.IgnoredAbstract, 180 Template.CallsiteSubclassMethodref, 181 Template.MethodrefSelectionResolvedIsClass, 182 Template.SelectionOverrideAbstract), 183 /* Group 25: callsite :>, methodref = expected, 184 * possibly skip different package in selection 185 */ 186 new TestGroup.Simple(initBuilder, 187 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 188 EnumSet.of(MethodData.Access.PACKAGE), 189 EnumSet.of(MethodData.Context.INSTANCE, 190 MethodData.Context.ABSTRACT), 191 EnumSet.of(ClassData.Package.SAME)), 192 Template.OverrideAbstractExpectedClass, 193 Template.MethodrefNotEqualsExpectedClass, 194 Template.IgnoredAbstract, 195 Template.CallsiteSubclassMethodref, 196 Template.MethodrefSelectionPackageSkip, 197 Template.SelectionOverrideAbstract), 198 /* Group 26: callsite :> methodref, methodref != expected, 199 * expected is interface, expected and callsite in the same package 200 */ 201 new TestGroup.Simple(initBuilder, 202 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 203 EnumSet.of(MethodData.Access.PUBLIC), 204 EnumSet.of(MethodData.Context.INSTANCE, 205 MethodData.Context.ABSTRACT), 206 EnumSet.of(ClassData.Package.SAME)), 207 Template.OverrideAbstractExpectedIface, 208 Template.MethodrefNotEqualsExpectedIface, 209 Template.IgnoredAbstract, 210 Template.CallsiteSubclassMethodref, 211 Template.MethodrefSelectionResolvedIsIface, 212 Template.SelectionOverrideAbstract), 213 /* Group 27: callsite unrelated to methodref, methodref = expected, 214 * expected is class, expected and callsite in the same package 215 */ 216 new TestGroup.Simple(initBuilder, 217 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 218 EnumSet.of(MethodData.Access.PUBLIC, 219 MethodData.Access.PROTECTED), 220 EnumSet.of(MethodData.Context.INSTANCE, 221 MethodData.Context.ABSTRACT), 222 EnumSet.of(ClassData.Package.SAME)), 223 Template.OverrideAbstractExpectedClass, 224 Template.MethodrefEqualsExpected, 225 Template.IgnoredAbstract, 226 Template.CallsiteUnrelatedToMethodref, 227 Template.MethodrefSelectionResolvedIsClass, 228 Template.SelectionOverrideAbstract), 229 /* Group 28: callsite unrelated to methodref, 230 * methodref = expected, possibly skip different 231 * package in selection 232 */ 233 new TestGroup.Simple(initBuilder, 234 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 235 EnumSet.of(MethodData.Access.PACKAGE), 236 EnumSet.of(MethodData.Context.INSTANCE, 237 MethodData.Context.ABSTRACT), 238 EnumSet.of(ClassData.Package.SAME)), 239 Template.OverrideAbstractExpectedClass, 240 Template.MethodrefEqualsExpected, 241 Template.IgnoredAbstract, 242 Template.CallsiteUnrelatedToMethodref, 243 Template.MethodrefSelectionPackageSkip, 244 Template.SelectionOverrideAbstract), 245 /* Group 29: callsite unrelated to methodref, methodref != expected, 246 * expected is class, expected and callsite in the same package 247 */ 248 new TestGroup.Simple(initBuilder, 249 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 250 EnumSet.of(MethodData.Access.PUBLIC, 251 MethodData.Access.PROTECTED), 252 EnumSet.of(MethodData.Context.INSTANCE, 253 MethodData.Context.ABSTRACT), 254 EnumSet.of(ClassData.Package.SAME)), 255 Template.OverrideAbstractExpectedClass, 256 Template.MethodrefNotEqualsExpectedClass, 257 Template.IgnoredAbstract, 258 Template.CallsiteUnrelatedToMethodref, 259 Template.MethodrefSelectionResolvedIsClass, 260 Template.SelectionOverrideAbstract), 261 /* Group 30: callsite unrelated to methodref, 262 * methodref \!= expected, possibly skip different 263 * package in selection 264 */ 265 new TestGroup.Simple(initBuilder, 266 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 267 EnumSet.of(MethodData.Access.PACKAGE), 268 EnumSet.of(MethodData.Context.INSTANCE, 269 MethodData.Context.ABSTRACT), 270 EnumSet.of(ClassData.Package.SAME)), 271 Template.OverrideAbstractExpectedClass, 272 Template.MethodrefNotEqualsExpectedClass, 273 Template.IgnoredAbstract, 274 Template.CallsiteUnrelatedToMethodref, 275 Template.MethodrefSelectionPackageSkip, 276 Template.SelectionOverrideAbstract), 277 /* Group 31: callsite unrelated to methodref, methodref != expected, 278 * expected is interface, expected and callsite in the same package 279 */ 280 new TestGroup.Simple(initBuilder, 281 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 282 EnumSet.of(MethodData.Access.PUBLIC), 283 EnumSet.of(MethodData.Context.INSTANCE, 284 MethodData.Context.ABSTRACT), 285 EnumSet.of(ClassData.Package.SAME)), 286 Template.OverrideAbstractExpectedIface, 287 Template.MethodrefNotEqualsExpectedIface, 288 Template.IgnoredAbstract, 289 Template.CallsiteUnrelatedToMethodref, 290 Template.MethodrefSelectionResolvedIsIface, 291 Template.SelectionOverrideAbstract), 292 /* Group 32: callsite = methodref, methodref != expected, 293 * expected is class, expected and callsite not in the same package 294 */ 295 new TestGroup.Simple(initBuilder, 296 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 297 EnumSet.of(MethodData.Access.PUBLIC, 298 MethodData.Access.PROTECTED), 299 EnumSet.of(MethodData.Context.INSTANCE, 300 MethodData.Context.ABSTRACT), 301 EnumSet.of(ClassData.Package.DIFFERENT)), 302 Template.OverrideAbstractExpectedClass, 303 Template.MethodrefNotEqualsExpectedClass, 304 Template.IgnoredAbstract, 305 Template.CallsiteEqualsMethodref, 306 Template.MethodrefSelectionResolvedIsClass, 307 Template.SelectionOverrideAbstract), 308 /* Group 33: callsite = methodref, methodref != expected, 309 * expected is interface, expected and callsite not in the same package 310 */ 311 new TestGroup.Simple(initBuilder, 312 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 313 EnumSet.of(MethodData.Access.PUBLIC), 314 EnumSet.of(MethodData.Context.INSTANCE, 315 MethodData.Context.ABSTRACT), 316 EnumSet.of(ClassData.Package.DIFFERENT)), 317 Template.OverrideAbstractExpectedIface, 318 Template.MethodrefNotEqualsExpectedIface, 319 Template.IgnoredAbstract, 320 Template.CallsiteEqualsMethodref, 321 Template.MethodrefSelectionResolvedIsIface, 322 Template.SelectionOverrideAbstract), 323 /* Group 34: callsite :> methodref, methodref = expected, 324 * expected is class, expected and callsite not in the same package 325 */ 326 new TestGroup.Simple(initBuilder, 327 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 328 EnumSet.of(MethodData.Access.PUBLIC), 329 EnumSet.of(MethodData.Context.INSTANCE, 330 MethodData.Context.ABSTRACT), 331 EnumSet.of(ClassData.Package.DIFFERENT)), 332 Template.OverrideAbstractExpectedClass, 333 Template.MethodrefEqualsExpected, 334 Template.IgnoredAbstract, 335 Template.CallsiteSubclassMethodref, 336 Template.MethodrefSelectionResolvedIsClass, 337 Template.SelectionOverrideAbstract), 338 339 /* Group 35: callsite :> methodref, methodref != expected, 340 * expected is class, expected and callsite not in the same package 341 */ 342 new TestGroup.Simple(initBuilder, 343 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 344 EnumSet.of(MethodData.Access.PUBLIC), 345 EnumSet.of(MethodData.Context.INSTANCE, 346 MethodData.Context.ABSTRACT), 347 EnumSet.of(ClassData.Package.DIFFERENT)), 348 Template.OverrideAbstractExpectedClass, 349 Template.MethodrefNotEqualsExpectedClass, 350 Template.IgnoredAbstract, 351 Template.CallsiteSubclassMethodref, 352 Template.MethodrefSelectionResolvedIsClass, 353 Template.SelectionOverrideAbstract), 354 /* Group 36: callsite :> methodref, methodref != expected, 355 * expected is interface, expected and callsite not in the same package 356 */ 357 new TestGroup.Simple(initBuilder, 358 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 359 EnumSet.of(MethodData.Access.PUBLIC), 360 EnumSet.of(MethodData.Context.INSTANCE, 361 MethodData.Context.ABSTRACT), 362 EnumSet.of(ClassData.Package.DIFFERENT)), 363 Template.OverrideAbstractExpectedIface, 364 Template.MethodrefNotEqualsExpectedIface, 365 Template.IgnoredAbstract, 366 Template.CallsiteSubclassMethodref, 367 Template.MethodrefSelectionResolvedIsIface, 368 Template.SelectionOverrideAbstract), 369 /* Group 37: callsite unrelated to methodref, methodref = expected, 370 * expected is class, expected and callsite not in the same package 371 */ 372 new TestGroup.Simple(initBuilder, 373 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 374 EnumSet.of(MethodData.Access.PUBLIC), 375 EnumSet.of(MethodData.Context.INSTANCE, 376 MethodData.Context.ABSTRACT), 377 EnumSet.of(ClassData.Package.DIFFERENT)), 378 Template.OverrideAbstractExpectedClass, 379 Template.MethodrefEqualsExpected, 380 Template.IgnoredAbstract, 381 Template.CallsiteUnrelatedToMethodref, 382 Template.MethodrefSelectionResolvedIsClass, 383 Template.SelectionOverrideAbstract), 384 /* Group 38: callsite unrelated to methodref, methodref != expected, 385 * expected is class, expected and callsite not in the same package 386 */ 387 new TestGroup.Simple(initBuilder, 388 Template.ResultCombo(EnumSet.of(Template.Kind.CLASS), 389 EnumSet.of(MethodData.Access.PUBLIC), 390 EnumSet.of(MethodData.Context.INSTANCE, 391 MethodData.Context.ABSTRACT), 392 EnumSet.of(ClassData.Package.DIFFERENT)), 393 Template.OverrideAbstractExpectedClass, 394 Template.MethodrefNotEqualsExpectedClass, 395 Template.IgnoredAbstract, 396 Template.CallsiteUnrelatedToMethodref, 397 Template.MethodrefSelectionResolvedIsClass, 398 Template.SelectionOverrideAbstract), 399 /* Group 39: callsite unrelated to methodref, methodref != expected, 400 * expected is interface, expected and callsite not in the same package 401 */ 402 new TestGroup.Simple(initBuilder, 403 Template.ResultCombo(EnumSet.of(Template.Kind.INTERFACE), 404 EnumSet.of(MethodData.Access.PUBLIC), 405 EnumSet.of(MethodData.Context.INSTANCE, 406 MethodData.Context.ABSTRACT), 407 EnumSet.of(ClassData.Package.DIFFERENT)), 408 Template.OverrideAbstractExpectedIface, 409 Template.MethodrefNotEqualsExpectedIface, 410 Template.IgnoredAbstract, 411 Template.CallsiteUnrelatedToMethodref, 412 Template.MethodrefSelectionResolvedIsIface, 413 Template.SelectionOverrideAbstract) 414 ); 415 416 private InvokeVirtualSuccessTest() { 417 super(testgroups); 418 } 419 420 public static void main(final String... args) { 421 new InvokeVirtualSuccessTest().run(); 422 } 423 }