1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/test/tools/javac/types/CastTest.java Mon Dec 13 14:56:50 2010 +0000 1.3 @@ -0,0 +1,129 @@ 1.4 +/* 1.5 + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 1.6 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 1.7 + * 1.8 + * This code is free software; you can redistribute it and/or modify it 1.9 + * under the terms of the GNU General Public License version 2 only, as 1.10 + * published by the Free Software Foundation. 1.11 + * 1.12 + * This code is distributed in the hope that it will be useful, but WITHOUT 1.13 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1.14 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1.15 + * version 2 for more details (a copy is included in the LICENSE file that 1.16 + * accompanied this code). 1.17 + * 1.18 + * You should have received a copy of the GNU General Public License version 1.19 + * 2 along with this work; if not, write to the Free Software Foundation, 1.20 + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1.21 + * 1.22 + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 1.23 + * or visit www.oracle.com if you need additional information or have any 1.24 + * questions. 1.25 + */ 1.26 + 1.27 +/* 1.28 + * @test 1.29 + * @bug 7006109 1.30 + * @summary Add test library to simplify the task of writing automated type-system tests 1.31 + * @author mcimadamore 1.32 + * @library . 1.33 + * @run main CastTest 1.34 + */ 1.35 + 1.36 +import com.sun.tools.javac.code.Type; 1.37 +import com.sun.tools.javac.code.Type.*; 1.38 +import com.sun.tools.javac.code.Symbol.*; 1.39 +import java.lang.reflect.Array; 1.40 + 1.41 +import static com.sun.tools.javac.code.Flags.*; 1.42 + 1.43 +/** 1.44 + * Check invariants in cast conversion involving primitive types and arrays 1.45 + */ 1.46 +public class CastTest extends TypeHarness { 1.47 + 1.48 + Type[] allTypes; 1.49 + 1.50 + static final boolean T = true; 1.51 + static final boolean F = false; 1.52 + 1.53 + boolean[][] cast_result = { 1.54 + //byte, short, int, long, float, double, char, bool, C, +C, I, T, byte[], short[], int[], long[], float[], double[], char[], bool[], C[], +C[], I[], T[] 1.55 + /*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 }, 1.56 + /*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 }, 1.57 + /*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 }, 1.58 + /*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 }, 1.59 + /*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 }, 1.60 + /*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 }, 1.61 + /*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 }, 1.62 + /*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 }, 1.63 + /*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 }, 1.64 + /*+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 }, 1.65 + /*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 }, 1.66 + /*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 }, 1.67 + /*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 }, 1.68 + /*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 }, 1.69 + /*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 }, 1.70 + /*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 }, 1.71 + /*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 }, 1.72 + /*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 }, 1.73 + /*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 }, 1.74 + /*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 }, 1.75 + /*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 }, 1.76 + /*+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 }, 1.77 + /*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 }, 1.78 + /*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 }}; 1.79 + 1.80 + CastTest() { 1.81 + Type[] primitiveTypes = { 1.82 + predef.byteType, 1.83 + predef.shortType, 1.84 + predef.intType, 1.85 + predef.longType, 1.86 + predef.floatType, 1.87 + predef.doubleType, 1.88 + predef.charType, 1.89 + predef.booleanType }; 1.90 + 1.91 + Type[] referenceTypes = { 1.92 + fac.Class(), 1.93 + fac.Class(FINAL), 1.94 + fac.Interface(), 1.95 + fac.TypeVariable() }; 1.96 + 1.97 + Type[] arrayTypes = new Type[primitiveTypes.length + referenceTypes.length]; 1.98 + int idx = 0; 1.99 + for (Type t : join(Type.class, primitiveTypes, referenceTypes)) { 1.100 + arrayTypes[idx++] = fac.Array(t); 1.101 + } 1.102 + 1.103 + allTypes = join(Type.class, primitiveTypes, referenceTypes, arrayTypes); 1.104 + } 1.105 + 1.106 + void test() { 1.107 + for (int i = 0; i < allTypes.length ; i++) { 1.108 + for (int j = 0; j < allTypes.length ; j++) { 1.109 + assertCastable(allTypes[i], allTypes[j], cast_result[i][j]); 1.110 + } 1.111 + } 1.112 + } 1.113 + 1.114 + @SuppressWarnings("unchecked") 1.115 + <T> T[] join(Class<T> type, T[]... args) { 1.116 + int totalLength = 0; 1.117 + for (T[] arr : args) { 1.118 + totalLength += arr.length; 1.119 + } 1.120 + T[] new_arr = (T[])Array.newInstance(type, totalLength); 1.121 + int idx = 0; 1.122 + for (T[] arr : args) { 1.123 + System.arraycopy(arr, 0, new_arr, idx, arr.length); 1.124 + idx += arr.length; 1.125 + } 1.126 + return new_arr; 1.127 + } 1.128 + 1.129 + public static void main(String[] args) { 1.130 + new CastTest().test(); 1.131 + } 1.132 +}