jdk/test/java/lang/invoke/ExplicitCastArgumentsTest.java
author alanb
Fri, 10 Feb 2017 09:04:39 +0000
changeset 43712 5dfd0950317c
parent 35315 67dcc46f8241
child 45283 fcb2af038805
permissions -rw-r--r--
8173393: Module system implementation refresh (2/2017) Reviewed-by: dfuchs, psandoz, mchung, alanb Contributed-by: alan.bateman@oracle.com, mandy.chung@oracle.com, claes.redestad@oracle.com, alex.buckley@oracle.com, mark.reinhold@oracle.com, john.r.rose@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     1
/*
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
     2
 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     4
 *
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     7
 * published by the Free Software Foundation.
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     8
 *
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    13
 * accompanied this code).
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    14
 *
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    18
 *
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    21
 * questions.
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    22
 */
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    23
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    24
import com.oracle.testlibrary.jsr292.Helper;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    25
import java.io.File;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    26
import java.io.Serializable;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    27
import java.lang.invoke.MethodHandle;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    28
import java.lang.invoke.MethodHandles;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    29
import java.lang.invoke.MethodType;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    30
import java.lang.invoke.WrongMethodTypeException;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    31
import java.util.HashMap;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    32
import java.util.Map;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    33
import java.util.Random;
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    34
import sun.invoke.util.Wrapper;
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    35
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    36
/*
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    37
 * @test
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    38
 * @bug 8060483 8066746
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    39
 * @key randomness
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    40
 * @library /lib/testlibrary /lib/testlibrary/jsr292
35315
67dcc46f8241 8148147: Sync up @modules from jigsaw/jake
alanb
parents: 32214
diff changeset
    41
 * @modules java.base/sun.invoke.util
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    42
 * @summary unit tests for MethodHandles.explicitCastArguments()
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    43
 * @run main ExplicitCastArgumentsTest
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    44
 */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    45
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    46
/**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    47
 * Tests for MethodHandles.explicitCastArguments().
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    48
 */
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    49
public class ExplicitCastArgumentsTest {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    50
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    51
    private static final boolean VERBOSE = Helper.IS_VERBOSE;
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    52
    private static final Class<?> THIS_CLASS = ExplicitCastArgumentsTest.class;
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    53
    private static final Random RNG = Helper.RNG;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    54
    private static final Map<Wrapper, Object> RANDOM_VALUES = new HashMap<>(9);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    55
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    56
    static {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    57
        RANDOM_VALUES.put(Wrapper.BOOLEAN, RNG.nextBoolean());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    58
        RANDOM_VALUES.put(Wrapper.BYTE, (byte) RNG.nextInt());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    59
        RANDOM_VALUES.put(Wrapper.SHORT, (short) RNG.nextInt());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    60
        RANDOM_VALUES.put(Wrapper.CHAR, (char) RNG.nextInt());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    61
        RANDOM_VALUES.put(Wrapper.INT, RNG.nextInt());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    62
        RANDOM_VALUES.put(Wrapper.LONG, RNG.nextLong());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    63
        RANDOM_VALUES.put(Wrapper.FLOAT, RNG.nextFloat());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    64
        RANDOM_VALUES.put(Wrapper.DOUBLE, RNG.nextDouble());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    65
        RANDOM_VALUES.put(Wrapper.OBJECT, new Object());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    66
    }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    67
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
    68
    public static void main(String[] args) throws Throwable {
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    69
        testVarargsCollector();
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    70
        testNullRef2Prim();
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    71
        testRef2Prim();
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    72
        testPrim2Ref();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    73
        testPrim2Prim();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    74
        testNonBCPRef2NonBCPRef();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    75
        testBCPRef2BCPRef();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    76
        testNonBCPRef2BCPRef();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    77
        testReturnAny2Void();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    78
        testReturnVoid2Any();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    79
        testMultipleArgs();
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    80
        System.out.println("TEST PASSED");
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    81
    }
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    82
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    83
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    84
     * Dummy method used in {@link #testVarargsCollector} test to form a method
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    85
     * handle.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    86
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    87
     * @param args - any args
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    88
     * @return - returns args
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    89
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    90
    public static String[] f(String... args) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    91
        return args;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    92
    }
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
    93
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    94
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    95
     * Tests that MHs.explicitCastArguments does incorrect type checks for
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    96
     * VarargsCollector. Bug 8066746.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    97
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    98
     * @throws java.lang.Throwable
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
    99
     */
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
   100
    public static void testVarargsCollector() throws Throwable {
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
   101
        MethodType mt = MethodType.methodType(String[].class, String[].class);
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   102
        MethodHandle mh = MethodHandles.publicLookup()
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   103
                .findStatic(THIS_CLASS, "f", mt);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   104
        mh = MethodHandles.explicitCastArguments(mh,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   105
                MethodType.methodType(Object.class, Object.class));
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   106
        mh.invokeWithArguments((Object) (new String[]{"str1", "str2"}));
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   107
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   108
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   109
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   110
     * Tests that null wrapper reference is successfully converted to primitive
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   111
     * types. Converted result should be zero for a primitive. Bug 8060483.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   112
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   113
    public static void testNullRef2Prim() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   114
        for (Wrapper from : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   115
            for (Wrapper to : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   116
                if (from == Wrapper.VOID || to == Wrapper.VOID) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   117
                    continue;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   118
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   119
                // MHs.eCA javadoc:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   120
                //    If T0 is a reference and T1 a primitive, and if the reference
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   121
                //    is null at runtime, a zero value is introduced.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   122
                for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   123
                    testConversion(mode, from.wrapperType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   124
                            to.primitiveType(), null, to.zero(), false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   125
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   126
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   127
        }
27947
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
   128
    }
dba3bc0c087e 8066746: MHs.explicitCastArguments does incorrect type checks for VarargsCollector
vlivanov
parents: 27196
diff changeset
   129
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   130
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   131
     * Tests that non-null wrapper reference is successfully converted to
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   132
     * primitive types.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   133
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   134
    public static void testRef2Prim() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   135
        for (Wrapper from : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   136
            for (Wrapper to : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   137
                if (from == Wrapper.VOID || to == Wrapper.VOID
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   138
                        || to == Wrapper.OBJECT) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   139
                    continue;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   140
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   141
                Object value = RANDOM_VALUES.get(from);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   142
                for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   143
                    if (from != Wrapper.OBJECT) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   144
                        Object convValue = to.wrap(value);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   145
                        testConversion(mode, from.wrapperType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   146
                                to.primitiveType(), value, convValue, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   147
                    } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   148
                        testConversion(mode, from.wrapperType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   149
                                to.primitiveType(), value, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   150
                                true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   151
                    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   152
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   153
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   154
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   155
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   156
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   157
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   158
     * Tests that primitive is successfully converted to wrapper reference
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   159
     * types, to the Number type (if possible) and to the Object type.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   160
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   161
    public static void testPrim2Ref() {
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   162
        for (Wrapper from : Wrapper.values()) {
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   163
            for (Wrapper to : Wrapper.values()) {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   164
                if (from == Wrapper.VOID || from == Wrapper.OBJECT
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   165
                        || to == Wrapper.VOID || to == Wrapper.OBJECT) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   166
                    continue;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   167
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   168
                Object value = RANDOM_VALUES.get(from);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   169
                for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   170
                    if (from == to) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   171
                        testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   172
                                to.wrapperType(), value, value, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   173
                    } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   174
                        testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   175
                                to.wrapperType(), value, null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   176
                    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   177
                    if (from != Wrapper.BOOLEAN && from != Wrapper.CHAR) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   178
                        testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   179
                                Number.class, value, value, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   180
                    } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   181
                        testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   182
                                Number.class, value, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   183
                                true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   184
                    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   185
                    testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   186
                            Object.class, value, value, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   187
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   188
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   189
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   190
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   191
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   192
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   193
     * Tests that primitive is successfully converted to other primitive type.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   194
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   195
    public static void testPrim2Prim() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   196
        for (Wrapper from : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   197
            for (Wrapper to : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   198
                if (from == Wrapper.VOID || to == Wrapper.VOID
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   199
                        || from == Wrapper.OBJECT || to == Wrapper.OBJECT) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   200
                    continue;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   201
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   202
                Object value = RANDOM_VALUES.get(from);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   203
                Object convValue = to.wrap(value);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   204
                for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   205
                    testConversion(mode, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   206
                            to.primitiveType(), value, convValue, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   207
                }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   208
            }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   209
        }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   210
    }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   211
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   212
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   213
     * Dummy interface for {@link #testNonBCPRef2Ref} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   214
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   215
    public static interface TestInterface {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   216
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   217
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   218
     * Dummy class for {@link #testNonBCPRef2Ref} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   219
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   220
    public static class TestSuperClass implements TestInterface {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   221
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   222
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   223
     * Dummy class for {@link #testNonBCPRef2Ref} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   224
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   225
    public static class TestSubClass1 extends TestSuperClass {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   226
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   227
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   228
     * Dummy class for {@link #testNonBCPRef2Ref} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   229
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   230
    public static class TestSubClass2 extends TestSuperClass {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   231
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   232
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   233
     * Tests non-bootclasspath reference to reference conversions.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   234
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   235
     * @throws java.lang.Throwable
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   236
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   237
    public static void testNonBCPRef2NonBCPRef() throws Throwable {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   238
        Class testInterface = TestInterface.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   239
        Class testSuperClass = TestSuperClass.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   240
        Class testSubClass1 = TestSubClass1.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   241
        Class testSubClass2 = TestSubClass2.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   242
        Object testSuperObj = new TestSuperClass();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   243
        Object testObj01 = new TestSubClass1();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   244
        Object testObj02 = new TestSubClass2();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   245
        Class[] parents = {testInterface, testSuperClass};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   246
        Class[] children = {testSubClass1, testSubClass2};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   247
        Object[] childInst = {testObj01, testObj02};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   248
        for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   249
            for (Class parent : parents) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   250
                for (int j = 0; j < children.length; j++) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   251
                    // Child type to parent type non-null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   252
                    testConversion(mode, children[j], parent, childInst[j], childInst[j], false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   253
                    // Child type to parent type null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   254
                    testConversion(mode, children[j], parent, null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   255
                    // Parent type to child type non-null conversion with parent
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   256
                    // type instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   257
                    testConversion(mode, parent, children[j], testSuperObj, null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   258
                    // Parent type to child type non-null conversion with child
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   259
                    // type instance, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   260
                    testConversion(mode, parent, children[j], childInst[j], childInst[j], false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   261
                    // Parent type to child type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   262
                    testConversion(mode, parent, children[j], null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   263
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   264
                // Parent type to child type non-null conversion with sibling
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   265
                // type instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   266
                testConversion(mode, parent, testSubClass1, testObj02, null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   267
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   268
            // Sibling type non-null conversion, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   269
            testConversion(mode, testSubClass1,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   270
                    testSubClass2, testObj01, null, true,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   271
                    ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   272
            // Sibling type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   273
            testConversion(mode, testSubClass1,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   274
                    testSubClass2, null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   275
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   276
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   277
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   278
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   279
     * Dummy interface for {@link #testNonBCPRef2BCPRef} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   280
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   281
    public static interface TestSerializableInterface extends Serializable {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   282
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   283
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   284
     * Dummy class for {@link #testNonBCPRef2BCPRef} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   285
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   286
    public static class TestSerializableClass
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   287
            implements TestSerializableInterface {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   288
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   289
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   290
     * Dummy class for {@link #testNonBCPRef2BCPRef} test.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   291
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   292
    public static class TestFileChildClass extends File
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   293
            implements TestSerializableInterface {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   294
        public TestFileChildClass(String pathname) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   295
            super(pathname);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   296
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   297
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   298
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   299
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   300
     * Tests non-bootclasspath reference to bootclasspath reference conversions
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   301
     * and vice-versa.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   302
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   303
     * @throws java.lang.Throwable
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   304
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   305
    public static void testNonBCPRef2BCPRef() throws Throwable {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   306
        Class bcpInterface = Serializable.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   307
        Class bcpSuperClass = File.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   308
        Class nonBcpInterface = TestSerializableInterface.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   309
        Class nonBcpSuperSiblingClass = TestSerializableClass.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   310
        Class nonBcpSubClass = TestFileChildClass.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   311
        Object bcpSuperObj = new File(".");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   312
        Object testSuperSiblingObj = new TestSerializableClass();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   313
        Object testSubObj = new TestFileChildClass(".");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   314
        Class[] parents = {bcpInterface, bcpSuperClass};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   315
        for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   316
            for (Class parent : parents) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   317
                // Child type to parent type non-null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   318
                testConversion(mode, nonBcpSubClass, parent, testSubObj,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   319
                        testSubObj, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   320
                // Child type to parent type null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   321
                testConversion(mode, nonBcpSubClass, parent, null, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   322
                        false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   323
                // Parent type to child type non-null conversion with parent
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   324
                // type instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   325
                testConversion(mode, parent, nonBcpSubClass, bcpSuperObj, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   326
                        true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   327
                // Parent type to child type non-null conversion with child
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   328
                // type instance, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   329
                testConversion(mode, parent, nonBcpSubClass, testSubObj,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   330
                        testSubObj, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   331
                // Parent type to child type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   332
                testConversion(mode, parent, nonBcpSubClass, null, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   333
                        false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   334
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   335
            // Parent type to child type non-null conversion with
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   336
            // super sibling type instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   337
            testConversion(mode, bcpInterface, nonBcpSubClass,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   338
                    testSuperSiblingObj, null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   339
            Class[] siblings = {nonBcpSubClass, bcpSuperClass};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   340
            for (Class sibling : siblings) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   341
                // Non-bcp class to bcp/non-bcp sibling class non-null
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   342
                // conversion with nonBcpSuperSiblingClass instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   343
                testConversion(mode, nonBcpSuperSiblingClass, sibling,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   344
                        testSuperSiblingObj, null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   345
                // Non-bcp class to bcp/non-bcp sibling class null conversion,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   346
                // should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   347
                testConversion(mode, nonBcpSuperSiblingClass, sibling,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   348
                        null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   349
                // Non-bcp interface to bcp/non-bcp sibling class non-null
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   350
                // conversion with nonBcpSubClass instance, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   351
                testConversion(mode, nonBcpInterface, sibling, testSubObj,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   352
                        testSubObj, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   353
                // Non-bcp interface to bcp/non-bcp sibling class
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   354
                // null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   355
                testConversion(mode, nonBcpInterface, sibling, null, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   356
                        false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   357
                // Non-bcp interface to bcp/non-bcp sibling class non-null
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   358
                // conversion with nonBcpSuperSiblingClass instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   359
                testConversion(mode, nonBcpInterface, sibling,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   360
                        testSuperSiblingObj, testSubObj,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   361
                        true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   362
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   363
        }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   364
    }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   365
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   366
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   367
     * Tests bootclasspath reference to reference conversions.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   368
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   369
    public static void testBCPRef2BCPRef() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   370
        Class bcpInterface = CharSequence.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   371
        Class bcpSubClass1 = String.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   372
        Class bcpSubClass2 = StringBuffer.class;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   373
        Object testObj01 = new String("test");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   374
        Object testObj02 = new StringBuffer("test");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   375
        Class[] children = {bcpSubClass1, bcpSubClass2};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   376
        Object[] childInst = {testObj01, testObj02};
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   377
        for (TestConversionMode mode : TestConversionMode.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   378
            for (int i = 0; i < children.length; i++) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   379
                // Child type to parent type non-null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   380
                testConversion(mode, children[i], bcpInterface, childInst[i],
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   381
                        childInst[i], false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   382
                // Child type to parent type null conversion, shoud succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   383
                testConversion(mode, children[i], bcpInterface, null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   384
                        null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   385
                // Parent type to child type non-null conversion with child
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   386
                // type instance, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   387
                testConversion(mode, bcpInterface,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   388
                        children[i], childInst[i], childInst[i], false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   389
                // Parent type to child type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   390
                testConversion(mode, bcpInterface,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   391
                        children[i], null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   392
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   393
            // Sibling type non-null conversion, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   394
            testConversion(mode, bcpSubClass1,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   395
                    bcpSubClass2, testObj01, null, true,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   396
                    ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   397
            // Sibling type null conversion, should succeed
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   398
            testConversion(mode, bcpSubClass1,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   399
                    bcpSubClass2, null, null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   400
            // Parent type to child type non-null conversion with sibling
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   401
            // type instance, should fail
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   402
            testConversion(mode, bcpInterface, bcpSubClass1, testObj02,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   403
                    null, true, ClassCastException.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   404
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   405
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   406
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   407
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   408
     * Dummy method used in {@link #testReturnAny2Void} and
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   409
     * {@link #testReturnVoid2Any} tests to form a method handle.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   410
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   411
    public static void retVoid() {}
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   412
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   413
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   414
     * Tests that non-null any return is successfully converted to non-type
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   415
     * void.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   416
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   417
    public static void testReturnAny2Void() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   418
        for (Wrapper from : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   419
            testConversion(TestConversionMode.RETURN_VALUE, from.wrapperType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   420
                    void.class, RANDOM_VALUES.get(from),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   421
                    null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   422
            testConversion(TestConversionMode.RETURN_VALUE, from.primitiveType(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   423
                    void.class, RANDOM_VALUES.get(from),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   424
                    null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   425
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   426
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   427
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   428
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   429
     * Tests that void return is successfully converted to primitive and
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   430
     * reference. Result should be zero for primitives and null for references.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   431
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   432
    public static void testReturnVoid2Any() {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   433
        for (Wrapper to : Wrapper.values()) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   434
            testConversion(TestConversionMode.RETURN_VALUE, void.class,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   435
                    to.primitiveType(), null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   436
                    to.zero(), false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   437
            testConversion(TestConversionMode.RETURN_VALUE, void.class,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   438
                    to.wrapperType(), null,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   439
                    null, false, null);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   440
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   441
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   442
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   443
    private static void checkForWrongMethodTypeException(MethodHandle mh, MethodType mt) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   444
        try {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   445
            MethodHandles.explicitCastArguments(mh, mt);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   446
            throw new AssertionError("Expected WrongMethodTypeException is not thrown");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   447
        } catch (WrongMethodTypeException wmte) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   448
            if (VERBOSE) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   449
                System.out.printf("Expected exception %s: %s\n",
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   450
                        wmte.getClass(), wmte.getMessage());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   451
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   452
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   453
    }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   454
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   455
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   456
     * Tests that MHs.eCA method works correctly with MHs with multiple arguments.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   457
     * @throws Throwable
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   458
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   459
    public static void testMultipleArgs() throws Throwable {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   460
        int arity = 1 + RNG.nextInt(Helper.MAX_ARITY / 2 - 2);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   461
        int arityMinus = RNG.nextInt(arity);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   462
        int arityPlus = arity + RNG.nextInt(Helper.MAX_ARITY / 2 - arity) + 1;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   463
        MethodType mType = Helper.randomMethodTypeGenerator(arity);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   464
        MethodType mTypeNew = Helper.randomMethodTypeGenerator(arity);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   465
        MethodType mTypeNewMinus = Helper.randomMethodTypeGenerator(arityMinus);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   466
        MethodType mTypeNewPlus = Helper.randomMethodTypeGenerator(arityPlus);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   467
        Class<?> rType = mType.returnType();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   468
        MethodHandle original;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   469
        if (rType.equals(void.class)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   470
            MethodType mt = MethodType.methodType(void.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   471
            original = MethodHandles.publicLookup()
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   472
                    .findStatic(THIS_CLASS, "retVoid", mt);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   473
        } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   474
            Object rValue = Helper.castToWrapper(1, rType);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   475
            original = MethodHandles.constant(rType, rValue);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   476
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   477
        original = Helper.addTrailingArgs(original, arity, mType.parameterList());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   478
        MethodHandle target = MethodHandles
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   479
                    .explicitCastArguments(original, mTypeNew);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   480
        Object[] parList = Helper.randomArgs(mTypeNew.parameterList());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   481
        for (int i = 0; i < parList.length; i++) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   482
            if (parList[i] instanceof String) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   483
                parList[i] = null; //getting rid of Stings produced by randomArgs
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   484
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   485
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   486
        target.invokeWithArguments(parList);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   487
        checkForWrongMethodTypeException(original, mTypeNewMinus);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   488
        checkForWrongMethodTypeException(original, mTypeNewPlus);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   489
    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   490
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   491
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   492
     * Enumeration of test conversion modes.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   493
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   494
    public enum TestConversionMode {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   495
        RETURN_VALUE,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   496
        ARGUMENT;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   497
    }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   498
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   499
    /**
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   500
     * Tests type and value conversion. Comparing with the given expected result.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   501
     *
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   502
     * @param mode - test conversion mode. See {@link #TestConversionMode}.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   503
     * @param from - source type.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   504
     * @param to - destination type.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   505
     * @param param - value to be converted.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   506
     * @param expectedResult - expected value after conversion.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   507
     * @param failureExpected - true if conversion failure expected.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   508
     * @param expectedException - expected exception class if
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   509
     * {@code failureExpected} is true.
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   510
     */
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   511
    public static void testConversion(TestConversionMode mode,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   512
            Class<?> from, Class<?> to, Object param,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   513
            Object expectedResult, boolean failureExpected,
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   514
            Class<? extends Throwable> expectedException) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   515
        if (VERBOSE) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   516
            System.out.printf("Testing return value conversion: "
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   517
                    + "%-10s => %-10s: %5s: ", from.getSimpleName(),
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   518
                    to.getSimpleName(), param);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   519
        }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   520
        MethodHandle original = null;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   521
        MethodType newType = null;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   522
        switch (mode) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   523
            case RETURN_VALUE:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   524
                if (from.equals(void.class)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   525
                    MethodType mt = MethodType.methodType(void.class);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   526
                    try {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   527
                        original = MethodHandles.publicLookup()
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   528
                                .findStatic(THIS_CLASS, "retVoid", mt);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   529
                    } catch (NoSuchMethodException | IllegalAccessException ex) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   530
                        throw new Error("Unexpected issue", ex);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   531
                    }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   532
                } else {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   533
                    original = MethodHandles.constant(from, param);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   534
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   535
                newType = original.type().changeReturnType(to);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   536
                break;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   537
            case ARGUMENT:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   538
                if (from.equals(void.class) || to.equals(void.class)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   539
                    throw new Error("Test issue: argument conversion does not"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   540
                            + " work with non-type void");
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   541
                }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   542
                original = MethodHandles.identity(to);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   543
                newType = original.type().changeParameterType(0, from);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   544
                break;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   545
            default:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   546
                String msg = String.format("Test issue: unknown test"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   547
                        + " convertion mode %s.", mode.name());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   548
                throw new Error(msg);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   549
        }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   550
        try {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   551
            MethodHandle target = MethodHandles
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   552
                    .explicitCastArguments(original, newType);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   553
            Object result;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   554
            switch (mode) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   555
                case RETURN_VALUE:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   556
                    result = target.invokeWithArguments();
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   557
                    break;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   558
                case ARGUMENT:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   559
                    result = target.invokeWithArguments(param);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   560
                    break;
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   561
                default:
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   562
                    String msg = String.format("Test issue: unknown test"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   563
                            + " convertion mode %s.", mode.name());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   564
                    throw new Error(msg);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   565
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   566
            if (!failureExpected
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   567
                    && (expectedResult != null && !expectedResult.equals(result)
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   568
                    || expectedResult == null && result != null)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   569
                String msg = String.format("Conversion result %s is not equal"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   570
                        + " to the expected result %10s",
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   571
                        result, expectedResult);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   572
                throw new AssertionError(msg);
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   573
            }
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   574
            if (VERBOSE) {
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   575
                String resultStr;
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   576
                if (result != null) {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   577
                    resultStr = String.format("Converted value and type are"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   578
                            + " %10s (%10s)", "'" + result + "'",
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   579
                            result.getClass().getSimpleName());
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   580
                } else {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   581
                    resultStr = String.format("Converted value is %10s", result);
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   582
                }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   583
                System.out.println(resultStr);
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   584
            }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   585
            if (failureExpected) {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   586
                String msg = String.format("No exception thrown while testing"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   587
                        + " return value conversion: %10s => %10s;"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   588
                        + " parameter: %10s",
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   589
                        from, to, param);
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   590
                throw new AssertionError(msg);
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   591
            }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   592
        } catch (AssertionError e) {
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   593
            throw e; // report test failure
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   594
        } catch (Throwable e) {
32214
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   595
            if (VERBOSE) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   596
                System.out.printf("%s: %s\n", e.getClass(), e.getMessage());
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   597
            }
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   598
            if (!failureExpected || !e.getClass().equals(expectedException)) {
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   599
                String msg = String.format("Unexpected exception was thrown"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   600
                        + " while testing return value conversion:"
7e67ff2f61d4 8060717: [TESTBUG] Improve test coverage of MethodHandles.explicitCastArguments()
kshefov
parents: 27947
diff changeset
   601
                        + " %s => %s; parameter: %s", from, to, param);
27196
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   602
                throw new AssertionError(msg, e);
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   603
            }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   604
        }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   605
    }
fe9dbab34d1d 8060483: NPE with explicitCastArguments unboxing null
vlivanov
parents:
diff changeset
   606
}