1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190
|
/*
* Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 5033583 6316717 6470106 8004979 8161500 8162539
* @summary Check toGenericString() and toString() methods
* @author Joseph D. Darcy
*/
import java.lang.reflect.*;
import java.lang.annotation.*;
import java.util.*;
public class GenericStringTest {
public static void main(String argv[]) throws Exception {
int failures = 0;
for(Class<?> clazz: List.of(TestClass1.class, TestClass2.class,
Roebling.class, TestInterface1.class))
for(Method method: clazz.getDeclaredMethods()) {
ExpectedGenericString egs = method.getAnnotation(ExpectedGenericString.class);
if (egs != null) {
String actual = method.toGenericString();
System.out.println(actual);
if (method.isBridge()) {
failures += checkForFailure(egs.bridgeValue(), actual);
} else {
failures += checkForFailure(egs.value(), actual);
}
}
if (method.isAnnotationPresent(ExpectedString.class)) {
ExpectedString es = method.getAnnotation(ExpectedString.class);
String actual = method.toString();
failures += checkForFailure(es.value(), actual);
}
}
// Bridge Test; no "volatile" methods
for(Method method: Roebling.class.getDeclaredMethods()) {
String s1 = method.toGenericString();
String s2 = method.toString();
System.out.println("Generic: " + s1);
System.out.println("Regular: " + s2);
if (s1.indexOf("volatile") != -1 ||
s2.indexOf("volatile") != -1) {
failures++;
System.err.println("ERROR: Bad string; unexpected ``volatile''");
}
}
if (failures > 0) {
System.err.println("Test failed.");
throw new RuntimeException();
}
}
private static int checkForFailure(String expected, String actual) {
if (!expected.equals(actual)) {
System.err.printf("ERROR: Expected ''%s'';%ngot ''%s''.\n",
expected, actual);
return 1;
} else
return 0;
}
}
class TestClass1 {
@ExpectedGenericString(
"void TestClass1.method1(int,double)")
void method1(int x, double y) {}
@ExpectedGenericString(
"private static java.lang.String TestClass1.method2(int,int)")
private static String method2(int x, int param2) {return null;}
@ExpectedGenericString(
"static void TestClass1.method3() throws java.lang.RuntimeException")
static void method3() throws RuntimeException {return;}
@ExpectedGenericString(
"protected <S,T> S TestClass1.method4(S,T) throws java.lang.Exception")
protected <S, T> S method4(S s, T t) throws Exception {return null;}
}
class TestClass2<E, F extends Exception> {
@ExpectedGenericString(
"public <T> T TestClass2.method1(E,T)")
public <T> T method1(E e, T t) {return null;}
@ExpectedGenericString(
"public void TestClass2.method2() throws F")
@ExpectedString(
"public void TestClass2.method2() throws java.lang.Exception")
public void method2() throws F {return;}
@ExpectedGenericString(
"public E[] TestClass2.method3()")
public E[] method3() {return null;}
@ExpectedGenericString(
"public E[][] TestClass2.method4()")
public E[][] method4() {return null;}
@ExpectedGenericString(
"public java.util.List<E[]> TestClass2.method5()")
public List<E[]> method5() {return null;}
@ExpectedGenericString(
"public java.util.List<?> TestClass2.method6()")
public List<?> method6() {return null;}
@ExpectedGenericString(
"public java.util.List<?>[] TestClass2.method7()")
public List<?>[] method7() {return null;}
@ExpectedGenericString(
"public <K,V> java.util.Map<K, V> TestClass2.method8()")
public <K, V> Map<K, V> method8() {return null;}
}
class Roebling implements Comparable<Roebling> {
@ExpectedGenericString(
value="public int Roebling.compareTo(Roebling)",
bridgeValue="public int Roebling.compareTo(java.lang.Object)")
public int compareTo(Roebling r) {
throw new IllegalArgumentException();
}
// Not a transient method, (transient var-arg overlap)
@ExpectedGenericString(
"void Roebling.varArg(java.lang.Object...)")
@ExpectedString(
"void Roebling.varArg(java.lang.Object[])")
void varArg(Object ... arg) {}
}
interface TestInterface1 {
@ExpectedGenericString(
"public default void TestInterface1.foo()")
@ExpectedString(
"public default void TestInterface1.foo()")
public default void foo(){;}
@ExpectedString(
"public default java.lang.Object TestInterface1.bar()")
@ExpectedGenericString(
"public default <A> A TestInterface1.bar()")
default <A> A bar(){return null;}
@ExpectedString(
"public default strictfp double TestInterface1.quux()")
@ExpectedGenericString(
"public default strictfp double TestInterface1.quux()")
strictfp default double quux(){return 1.0;}
}
@Retention(RetentionPolicy.RUNTIME)
@interface ExpectedGenericString {
String value();
String bridgeValue() default "";
}
@Retention(RetentionPolicy.RUNTIME)
@interface ExpectedString {
String value();
}
|