mcimadamore@792: /* mcimadamore@792: * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. mcimadamore@792: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. mcimadamore@792: * mcimadamore@792: * This code is free software; you can redistribute it and/or modify it mcimadamore@792: * under the terms of the GNU General Public License version 2 only, as mcimadamore@792: * published by the Free Software Foundation. mcimadamore@792: * mcimadamore@792: * This code is distributed in the hope that it will be useful, but WITHOUT mcimadamore@792: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or mcimadamore@792: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License mcimadamore@792: * version 2 for more details (a copy is included in the LICENSE file that mcimadamore@792: * accompanied this code). mcimadamore@792: * mcimadamore@792: * You should have received a copy of the GNU General Public License version mcimadamore@792: * 2 along with this work; if not, write to the Free Software Foundation, mcimadamore@792: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. mcimadamore@792: * mcimadamore@792: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA mcimadamore@792: * or visit www.oracle.com if you need additional information or have any mcimadamore@792: * questions. mcimadamore@792: */ mcimadamore@792: mcimadamore@792: /* mcimadamore@792: * @test mcimadamore@792: * @bug 7006109 mcimadamore@792: * @summary Add test library to simplify the task of writing automated type-system tests mcimadamore@792: * @author mcimadamore mcimadamore@792: * @library . mcimadamore@792: * @run main CastTest mcimadamore@792: */ mcimadamore@792: mcimadamore@792: import com.sun.tools.javac.code.Type; mcimadamore@792: import com.sun.tools.javac.code.Type.*; mcimadamore@792: import com.sun.tools.javac.code.Symbol.*; mcimadamore@792: import java.lang.reflect.Array; mcimadamore@792: mcimadamore@792: import static com.sun.tools.javac.code.Flags.*; mcimadamore@792: mcimadamore@792: /** mcimadamore@792: * Check invariants in cast conversion involving primitive types and arrays mcimadamore@792: */ mcimadamore@792: public class CastTest extends TypeHarness { mcimadamore@792: mcimadamore@1007: Type[] types_no_boxing; mcimadamore@1007: Type[] types_boxing; mcimadamore@792: mcimadamore@792: static final boolean T = true; mcimadamore@792: static final boolean F = false; mcimadamore@792: mcimadamore@1007: boolean[][] cast_result_no_boxing = { mcimadamore@792: //byte, short, int, long, float, double, char, bool, C, +C, I, T, byte[], short[], int[], long[], float[], double[], char[], bool[], C[], +C[], I[], T[] mcimadamore@792: /*byte*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*short*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*int*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*long*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*float*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*double*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*char*/ { T , T , T , T , T , T , T , F , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*bool*/ { F , F , F , F , F , F , F , T , F, F , F, F, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*C*/ { F , F , F , F , F , F , F , F , T, F , T, T, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*+C*/ { F , F , F , F , F , F , F , F , F, T , F, T, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*I*/ { F , F , F , F , F , F , F , F , T, F , T, T, F , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*T*/ { F , F , F , F , F , F , F , F , T, T , T, T, T , T , T , T , T , T , T , T , T , T , T , T }, mcimadamore@792: /*byte[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, T , F , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*short[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , T , F , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*int[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , T , F , F , F , F , F , F , F , F , F }, mcimadamore@792: /*long[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , T , F , F , F , F , F , F , F , F }, mcimadamore@792: /*float[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , T , F , F , F , F , F , F , F }, mcimadamore@792: /*double[]*/{ F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , T , F , F , F , F , F , F }, mcimadamore@792: /*char[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , T , F , F , F , F , F }, mcimadamore@792: /*bool[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , T , F , F , F , F }, mcimadamore@792: /*C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T }, mcimadamore@792: /*+C[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , F , T , F , T }, mcimadamore@792: /*I[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , F , T , T }, mcimadamore@792: /*T[]*/ { F , F , F , F , F , F , F , F , F, F , F, T, F , F , F , F , F , F , F , F , T , T , T , T }}; mcimadamore@792: mcimadamore@1007: boolean[][] cast_result_boxing = { mcimadamore@1007: //byte, short, int, long, float, double, char, bool, Byte, Short, Integer, Long, Float, Double, Character, Boolean, Object mcimadamore@1007: /*byte*/ { T , T , T , T , T , T , T , F , T , F , F , F , F , F , F , F , T }, mcimadamore@1007: /*short*/ { T , T , T , T , T , T , T , F , F , T , F , F , F , F , F , F , T }, mcimadamore@1007: /*int*/ { T , T , T , T , T , T , T , F , F , F , T , F , F , F , F , F , T }, mcimadamore@1007: /*long*/ { T , T , T , T , T , T , T , F , F , F , F , T , F , F , F , F , T }, mcimadamore@1007: /*float*/ { T , T , T , T , T , T , T , F , F , F , F , F , T , F , F , F , T }, mcimadamore@1007: /*double*/ { T , T , T , T , T , T , T , F , F , F , F , F , F , T , F , F , T }, mcimadamore@1007: /*char*/ { T , T , T , T , T , T , T , F , F , F , F , F , F , F , T , F , T }, mcimadamore@1007: /*bool*/ { F , F , F , F , F , F , F , T , F , F , F , F , F , F , F , T , T }, mcimadamore@1007: /*Byte*/ { T , T , T , T , T , T , F , F , T , F , F , F , F , F , F , F , T }, mcimadamore@1007: /*Short*/ { F , T , T , T , T , T , F , F , F , T , F , F , F , F , F , F , T }, mcimadamore@1007: /*Integer*/ { F , F , T , T , T , T , F , F , F , F , T , F , F , F , F , F , T }, mcimadamore@1007: /*Long*/ { F , F , F , T , T , T , F , F , F , F , F , T , F , F , F , F , T }, mcimadamore@1007: /*Float*/ { F , F , F , F , T , T , F , F , F , F , F , F , T , F , F , F , T }, mcimadamore@1007: /*Double*/ { F , F , F , F , F , T , F , F , F , F , F , F , F , T , F , F , T }, mcimadamore@1007: /*Character*/ { F , F , T , T , T , T , T , F , F , F , F , F , F , F , T , F , T }, mcimadamore@1007: /*Boolean*/ { F , F , F , F , F , F , F , T , F , F , F , F , F , F , F , T , T }, mcimadamore@1007: /*Object*/ { T , T , T , T , T , T , T , T , T , T , T , T , T , T , T , T , T }}; mcimadamore@792: CastTest() { mcimadamore@792: Type[] primitiveTypes = { mcimadamore@792: predef.byteType, mcimadamore@792: predef.shortType, mcimadamore@792: predef.intType, mcimadamore@792: predef.longType, mcimadamore@792: predef.floatType, mcimadamore@792: predef.doubleType, mcimadamore@792: predef.charType, mcimadamore@792: predef.booleanType }; mcimadamore@792: mcimadamore@1007: Type[] boxedTypes = new Type[primitiveTypes.length + 1]; mcimadamore@1007: for (int i = 0 ; i < primitiveTypes.length ; i++) { mcimadamore@1007: boxedTypes[i] = box(primitiveTypes[i]); mcimadamore@1007: } mcimadamore@1007: mcimadamore@1007: boxedTypes[primitiveTypes.length] = predef.objectType; mcimadamore@1007: mcimadamore@1007: types_boxing = join(Type.class, primitiveTypes, boxedTypes); mcimadamore@1007: mcimadamore@792: Type[] referenceTypes = { mcimadamore@792: fac.Class(), mcimadamore@792: fac.Class(FINAL), mcimadamore@792: fac.Interface(), mcimadamore@792: fac.TypeVariable() }; mcimadamore@792: mcimadamore@792: Type[] arrayTypes = new Type[primitiveTypes.length + referenceTypes.length]; mcimadamore@792: int idx = 0; mcimadamore@792: for (Type t : join(Type.class, primitiveTypes, referenceTypes)) { mcimadamore@792: arrayTypes[idx++] = fac.Array(t); mcimadamore@792: } mcimadamore@792: mcimadamore@1007: types_no_boxing = join(Type.class, primitiveTypes, referenceTypes, arrayTypes); mcimadamore@792: } mcimadamore@792: mcimadamore@1007: void test(Type[] all_types, boolean[][] cast_result) { mcimadamore@1007: for (int i = 0; i < all_types.length ; i++) { mcimadamore@1007: for (int j = 0; j < all_types.length ; j++) { mcimadamore@1007: assertCastable(all_types[i], all_types[j], cast_result[i][j]); mcimadamore@792: } mcimadamore@792: } mcimadamore@792: } mcimadamore@792: mcimadamore@1007: void runTests() { mcimadamore@1007: test(types_no_boxing, cast_result_no_boxing); mcimadamore@1007: test(types_boxing, cast_result_boxing); mcimadamore@1007: } mcimadamore@1007: mcimadamore@792: @SuppressWarnings("unchecked") mcimadamore@792: T[] join(Class type, T[]... args) { mcimadamore@792: int totalLength = 0; mcimadamore@792: for (T[] arr : args) { mcimadamore@792: totalLength += arr.length; mcimadamore@792: } mcimadamore@792: T[] new_arr = (T[])Array.newInstance(type, totalLength); mcimadamore@792: int idx = 0; mcimadamore@792: for (T[] arr : args) { mcimadamore@792: System.arraycopy(arr, 0, new_arr, idx, arr.length); mcimadamore@792: idx += arr.length; mcimadamore@792: } mcimadamore@792: return new_arr; mcimadamore@792: } mcimadamore@792: mcimadamore@792: public static void main(String[] args) { mcimadamore@1007: new CastTest().runTests(); mcimadamore@792: } mcimadamore@792: }