1 /*
2  * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @bug 8170595
27  * @summary Checks Class.isAnonymousClass, isMemberClass and isLocalClass
28  *          attributes
29  */
30 
31 public class ClassAttributesTest {
32 
33     class NestedClass {}
34 
test(Class<?> clazz, boolean anonymous, boolean local, boolean member)35     static int test(Class<?> clazz, boolean anonymous, boolean local, boolean member) {
36         if (clazz.isAnonymousClass() != anonymous) {
37             System.err.println("Unexpected isAnonymousClass value for " +
38                                clazz.getName() + " expected: " + anonymous +
39                                " got: " + (!anonymous));
40             return 1;
41         }
42         if (clazz.isLocalClass() != local) {
43             System.err.println("Unexpected isLocalClass value for " +
44                                clazz.getName() + " expected: " + local +
45                                " got: " + (!local));
46             return 1;
47         }
48         if (clazz.isMemberClass() != member) {
49             System.err.println("Unexpected isMemberClass status for " +
50                                clazz.getName() + " expected: " + member +
51                                " got: " + (!member));
52             return 1;
53         }
54         return 0;
55     }
56 
main(String argv[])57     public static void main(String argv[]) {
58         int failures = 0;
59 
60         class LocalClass {}
61         Cloneable clone = new Cloneable() {};
62         Runnable lambda = () -> System.out.println("run");
63 
64         failures += test(ClassAttributesTest.class,       false, false, false);
65         failures += test(NestedClass.class,               false, false, true);
66         failures += test(LocalClass.class,                false, true,  false);
67         failures += test(clone.getClass(),                true,  false, false);
68 
69         // Lambdas may be VM anonymous classes, but are named, non-local classes
70         // in this sense
71         failures += test(lambda.getClass(),               false, false, false);
72 
73         if (failures != 0)
74             throw new RuntimeException("Test failed with " + failures  + " failures.");
75     }
76 }
77