jdk/test/java/lang/reflect/Method/GenericStringTest.java
changeset 2 90ce3da70b43
child 4347 ab0a9f495844
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/reflect/Method/GenericStringTest.java	Sat Dec 01 00:00:00 2007 +0000
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2004-2006 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 5033583 6316717 6470106
+ * @summary Check toGenericString() and toString() methods
+ * @author Joseph D. Darcy
+ * @compile -source 1.5 GenericStringTest.java
+ * @run main GenericStringTest
+ */
+
+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;
+        List<Class<?>> classList = new LinkedList<Class<?>>();
+        classList.add(TestClass1.class);
+        classList.add(TestClass2.class);
+        classList.add(Roebling.class);
+
+
+        for(Class<?> clazz: classList)
+            for(Method method: clazz.getDeclaredMethods()) {
+                ExpectedGenericString egs = method.getAnnotation(ExpectedGenericString.class);
+                if (egs != null) {
+                    String actual = method.toGenericString();
+                    System.out.println(actual);
+                    if (! egs.value().equals(actual)) {
+                        failures++;
+                        System.err.printf("ERROR: Expected ''%s''; got ''%s''.\n",
+                                          egs.value(), actual);
+                    }
+                }
+
+                if (method.isAnnotationPresent(ExpectedString.class)) {
+                    ExpectedString es = method.getAnnotation(ExpectedString.class);
+                    String actual = method.toString();
+                    if (! es.value().equals(actual)) {
+                        failures++;
+                        System.err.printf("ERROR: Expected ''%s''; got ''%s''.\n",
+                                          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();
+        }
+    }
+}
+
+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")
+    public void method2() throws F {return;}
+}
+
+class Roebling implements Comparable<Roebling> {
+    @ExpectedGenericString(
+   "public int Roebling.compareTo(Roebling)")
+    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) {}
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@interface ExpectedGenericString {
+    String value();
+}
+
+@Retention(RetentionPolicy.RUNTIME)
+@interface ExpectedString {
+    String value();
+}