1/*
2 * Copyright (c) 2015, 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 * @compile Basic.java
27 * @run testng p.Basic
28 * @summary Basic test for java.lang.Class::getPackageName
29 */
30
31package p;
32
33import org.testng.annotations.Test;
34import org.testng.annotations.DataProvider;
35import static org.testng.Assert.*;
36
37public class Basic {
38
39
40    // -- member classes --
41
42    static class Nested {
43        static class Foo { }
44    }
45
46    Class<?> getNestedClass1() {
47        return Nested.class;
48    }
49    Class<?> getNestedClass2() {
50        return Nested.Foo.class;
51    }
52
53    class Inner {
54        class Foo { }
55    }
56
57    Class<?> getInnerClass1() {
58        return Inner.class;
59    }
60    Class<?> getInnerClass2() {
61        return Inner.Foo.class;
62    }
63
64    // -- local and anonymous classes --
65
66    Class<?> getLocalClass1() {
67        class Local { }
68        return Local.class;
69    }
70
71    Class<?> getLocalClass2() {
72        class Local {
73            class Foo { }
74        }
75        return Local.Foo.class;
76    }
77
78    Class<?> getLocalClass3() {
79        class Local {
80            final Class<?> c;
81            Local() {
82                class Foo { }
83                this.c = Foo.class;
84            }
85            Class<?> get() {
86                return c;
87            }
88        }
89        return new Local().get();
90    }
91
92    Class<?> getAnonymousClass1() {
93        Runnable r = new Runnable() { public void run() { } };
94        return r.getClass();
95    }
96
97    Class<?> getAnonymousClass2() {
98        class Local {
99            Class<?> get() {
100                Runnable r = new Runnable() { public void run() { } };
101                return r.getClass();
102            }
103        }
104        return new Local().get();
105    }
106
107    Class<?> getAnonymousClass3() {
108        Runnable r = () -> { };
109        return r.getClass();
110    }
111
112    Class<?> getAnonymousClass4() {
113        class Local {
114            Class<?> get() {
115                Runnable r = () -> { };
116                return r.getClass();
117            }
118        }
119        return new Local().get();
120    }
121
122    Class<?> getAnonymousClass5() {
123        class Local {
124            final Class<?> c;
125            Local() {
126                Runnable r = new Runnable() { public void run() { } };
127                this.c = r.getClass();
128            }
129            Class<?> get() {
130                return c;
131            }
132        }
133        return new Local().get();
134    }
135
136    Class<?> getAnonymousClass6() {
137        class Local {
138            final Class<?> c;
139            Local() {
140                Runnable r = () -> { };
141                this.c = r.getClass();
142            }
143            Class<?> get() {
144                return c;
145            }
146        }
147        return new Local().get();
148    }
149
150    static final String TEST_PACKAGE = Basic.class.getPackage().getName();
151
152    @DataProvider(name = "classes")
153    public Object[][] classes() {
154        return new Object[][] {
155
156            { Basic.class,                  TEST_PACKAGE },
157            { Basic[].class,                TEST_PACKAGE },
158            { Basic[][].class,              TEST_PACKAGE },
159
160            { getNestedClass1(),            TEST_PACKAGE },
161            { getNestedClass2(),            TEST_PACKAGE },
162            { getInnerClass1(),             TEST_PACKAGE },
163            { getInnerClass2(),             TEST_PACKAGE },
164
165            { getLocalClass1(),             TEST_PACKAGE },
166            { getLocalClass2(),             TEST_PACKAGE },
167            { getLocalClass3(),             TEST_PACKAGE },
168
169            { getAnonymousClass1(),         TEST_PACKAGE },
170            { getAnonymousClass2(),         TEST_PACKAGE },
171            { getAnonymousClass3(),         TEST_PACKAGE },
172            { getAnonymousClass4(),         TEST_PACKAGE },
173            { getAnonymousClass5(),         TEST_PACKAGE },
174            { getAnonymousClass6(),         TEST_PACKAGE },
175
176            { Object.class,                 "java.lang" },
177            { Object[].class,               "java.lang" },
178            { Object[][].class,             "java.lang" },
179
180            { int.class,                    "java.lang" },
181            { int[].class,                  "java.lang" },
182            { int[][].class,                "java.lang" },
183
184            { void.class,                   "java.lang" },
185
186        };
187    }
188
189    @Test(dataProvider = "classes")
190    public void testPackageName(Class<?> type, String expected) {
191        assertEquals(type.getPackageName(), expected);
192    }
193
194}
195