View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      https://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.lang3;
18  
19  import static org.apache.commons.lang3.LangAssertions.assertIllegalArgumentException;
20  import static org.junit.jupiter.api.Assertions.assertArrayEquals;
21  import static org.junit.jupiter.api.Assertions.assertEquals;
22  import static org.junit.jupiter.api.Assertions.assertFalse;
23  import static org.junit.jupiter.api.Assertions.assertNotNull;
24  import static org.junit.jupiter.api.Assertions.assertNotSame;
25  import static org.junit.jupiter.api.Assertions.assertNull;
26  import static org.junit.jupiter.api.Assertions.assertSame;
27  import static org.junit.jupiter.api.Assertions.assertThrows;
28  import static org.junit.jupiter.api.Assertions.assertTrue;
29  
30  import java.io.Serializable;
31  import java.lang.reflect.Constructor;
32  import java.lang.reflect.Method;
33  import java.lang.reflect.Modifier;
34  import java.util.ArrayList;
35  import java.util.Collections;
36  import java.util.HashSet;
37  import java.util.Iterator;
38  import java.util.List;
39  import java.util.Map;
40  import java.util.Set;
41  import java.util.TreeMap;
42  import java.util.function.Function;
43  
44  import org.apache.commons.lang3.ClassUtils.Interfaces;
45  import org.apache.commons.lang3.reflect.testbed.GenericConsumer;
46  import org.apache.commons.lang3.reflect.testbed.GenericParent;
47  import org.apache.commons.lang3.reflect.testbed.StringParameterizedChild;
48  import org.junit.jupiter.api.Assertions;
49  import org.junit.jupiter.api.DisplayName;
50  import org.junit.jupiter.api.Test;
51  
52  /**
53   * Tests {@link ClassUtils}.
54   */
55  @SuppressWarnings("boxing") // JUnit4 does not support primitive equality testing apart from long
56  class ClassUtilsTest extends AbstractLangTest {
57  
58      private static class CX implements IB, IA, IE {
59          // empty
60      }
61  
62      @SuppressWarnings("unused") // IB is redundant but what a test checks
63      private static final class CY extends CX implements IB, IC {
64          // empty
65      }
66  
67      private interface IA {
68          // empty
69      }
70  
71      private interface IB {
72          // empty
73      }
74  
75      private interface IC extends ID, IE {
76          // empty
77      }
78  
79      private interface ID {
80          // empty
81      }
82  
83      private interface IE extends IF {
84          // empty
85      }
86  
87      private interface IF {
88          // empty
89      }
90  
91      private static final class Inner {
92          private static final class DeeplyNested {
93              // empty
94          }
95      }
96  
97      private static final String OBJECT_CANONICAL_NAME = "java.lang.Object";
98  
99      private void assertGetClassReturnsClass(final Class<?> c) throws Exception {
100         assertEquals(c, ClassUtils.getClass(c.getName()));
101     }
102 
103     private void assertGetClassThrowsClassNotFound(final String className) {
104         assertGetClassThrowsException(className, ClassNotFoundException.class);
105     }
106 
107     private void assertGetClassThrowsException(final String className, final Class<? extends Exception> exceptionType) {
108         assertThrows(exceptionType, () -> ClassUtils.getClass(className),
109             "ClassUtils.getClass() should fail with an exception of type " + exceptionType.getName() + " when given class name \"" + className + "\".");
110     }
111 
112     private void assertGetClassThrowsNullPointerException(final String className) {
113         assertGetClassThrowsException(className, NullPointerException.class);
114     }
115 
116     @Test
117     void test_convertClassesToClassNames_List() {
118         final List<Class<?>> list = new ArrayList<>();
119         List<String> result = ClassUtils.convertClassesToClassNames(list);
120         assertEquals(0, result.size());
121 
122         list.add(String.class);
123         list.add(null);
124         list.add(Object.class);
125         result = ClassUtils.convertClassesToClassNames(list);
126         assertEquals(3, result.size());
127         assertEquals("java.lang.String", result.get(0));
128         assertNull(result.get(1));
129         assertEquals(OBJECT_CANONICAL_NAME, result.get(2));
130 
131         @SuppressWarnings("unchecked") // test what happens when non-generic code adds wrong type of element
132         final List<Object> olist = (List<Object>) (List<?>) list;
133         olist.add(new Object());
134         assertThrows(ClassCastException.class, () -> ClassUtils.convertClassesToClassNames(list), "Should not have been able to convert list");
135         assertNull(ClassUtils.convertClassesToClassNames(null));
136     }
137 
138     @Test
139     void test_convertClassNamesToClasses_List() {
140         final List<String> list = new ArrayList<>();
141         List<Class<?>> result = ClassUtils.convertClassNamesToClasses(list);
142         assertEquals(0, result.size());
143 
144         list.add("java.lang.String");
145         list.add("java.lang.xxx");
146         list.add(OBJECT_CANONICAL_NAME);
147         result = ClassUtils.convertClassNamesToClasses(list);
148         assertEquals(3, result.size());
149         assertEquals(String.class, result.get(0));
150         assertNull(result.get(1));
151         assertEquals(Object.class, result.get(2));
152 
153         @SuppressWarnings("unchecked") // test what happens when non-generic code adds wrong type of element
154         final List<Object> olist = (List<Object>) (List<?>) list;
155         olist.add(new Object());
156         assertThrows(ClassCastException.class, () -> ClassUtils.convertClassNamesToClasses(list), "Should not have been able to convert list");
157         assertNull(ClassUtils.convertClassNamesToClasses(null));
158     }
159 
160     @Test
161     void test_getAbbreviatedName_Class() {
162         assertEquals("", ClassUtils.getAbbreviatedName((Class<?>) null, 1));
163         assertEquals("j.l.String", ClassUtils.getAbbreviatedName(String.class, 1));
164         assertEquals("j.l.String", ClassUtils.getAbbreviatedName(String.class, 5));
165         assertEquals("o.a.c.l.ClassUtils", ClassUtils.getAbbreviatedName(ClassUtils.class, 18));
166         assertEquals("j.lang.String", ClassUtils.getAbbreviatedName(String.class, 13));
167         assertEquals("j.lang.String", ClassUtils.getAbbreviatedName(String.class, 15));
168         assertEquals("java.lang.String", ClassUtils.getAbbreviatedName(String.class, 20));
169     }
170 
171     @Test
172     @DisplayName("When the desired length is negative then exception is thrown")
173     void test_getAbbreviatedName_Class_NegativeLen() {
174         assertIllegalArgumentException(() -> ClassUtils.getAbbreviatedName(String.class, -10));
175     }
176 
177     @Test
178     @DisplayName("When the desired length is zero then exception is thrown")
179     void test_getAbbreviatedName_Class_ZeroLen() {
180         assertIllegalArgumentException(() -> ClassUtils.getAbbreviatedName(String.class, 0));
181     }
182 
183     @Test
184     void test_getAbbreviatedName_String() {
185         assertEquals("", ClassUtils.getAbbreviatedName((String) null, 1));
186         assertEquals("", ClassUtils.getAbbreviatedName("", 1));
187         assertEquals("WithoutPackage", ClassUtils.getAbbreviatedName("WithoutPackage", 1));
188         assertEquals("j.l.String", ClassUtils.getAbbreviatedName("java.lang.String", 1));
189         assertEquals("o.a.c.l.ClassUtils", ClassUtils.getAbbreviatedName("org.apache.commons.lang3.ClassUtils", 18));
190         assertEquals("org.apache.commons.lang3.ClassUtils",
191             ClassUtils.getAbbreviatedName("org.apache.commons.lang3.ClassUtils", "org.apache.commons.lang3.ClassUtils".length()));
192         assertEquals("o.a.c.l.ClassUtils", ClassUtils.getAbbreviatedName("o.a.c.l.ClassUtils", 18));
193         assertEquals("o..c.l.ClassUtils", ClassUtils.getAbbreviatedName("o..c.l.ClassUtils", 18));
194         assertEquals(".", ClassUtils.getAbbreviatedName(".", 18));
195         assertEquals(".", ClassUtils.getAbbreviatedName(".", 1));
196         assertEquals("..", ClassUtils.getAbbreviatedName("..", 1));
197         assertEquals("...", ClassUtils.getAbbreviatedName("...", 2));
198         assertEquals("...", ClassUtils.getAbbreviatedName("...", 3));
199         assertEquals("java.lang.String", ClassUtils.getAbbreviatedName("java.lang.String", Integer.MAX_VALUE));
200         assertEquals("j.lang.String", ClassUtils.getAbbreviatedName("java.lang.String", "j.lang.String".length()));
201         assertEquals("j.l.String", ClassUtils.getAbbreviatedName("java.lang.String", "j.lang.String".length() - 1));
202         assertEquals("j.l.String", ClassUtils.getAbbreviatedName("java.lang.String", "j.l.String".length()));
203         assertEquals("j.l.String", ClassUtils.getAbbreviatedName("java.lang.String", "j.l.String".length() - 1));
204     }
205 
206     /**
207      * Test that in case the required length is larger than the name and thus there is no need for any shortening then the
208      * returned string object is the same as the one passed as argument. Note, however, that this is tested as an internal
209      * implementation detail, but it is not a guaranteed feature of the implementation.
210      */
211     @Test
212     @DisplayName("When the length hint is longer than the actual length then the same String object is returned")
213     void test_getAbbreviatedName_TooLongHint() {
214         final String className = "java.lang.String";
215         Assertions.assertSame(className, ClassUtils.getAbbreviatedName(className, className.length() + 1));
216         Assertions.assertSame(className, ClassUtils.getAbbreviatedName(className, className.length()));
217     }
218 
219     @Test
220     void test_getAllInterfaces_Class() {
221         final List<?> list = ClassUtils.getAllInterfaces(CY.class);
222         assertEquals(6, list.size());
223         assertEquals(IB.class, list.get(0));
224         assertEquals(IC.class, list.get(1));
225         assertEquals(ID.class, list.get(2));
226         assertEquals(IE.class, list.get(3));
227         assertEquals(IF.class, list.get(4));
228         assertEquals(IA.class, list.get(5));
229 
230         assertNull(ClassUtils.getAllInterfaces(null));
231     }
232 
233     @Test
234     void test_getAllSuperclasses_Class() {
235         final List<?> list = ClassUtils.getAllSuperclasses(CY.class);
236         assertEquals(2, list.size());
237         assertEquals(CX.class, list.get(0));
238         assertEquals(Object.class, list.get(1));
239 
240         assertNull(ClassUtils.getAllSuperclasses(null));
241     }
242 
243     @Test
244     void test_getCanonicalName_Class() {
245         assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getCanonicalName(ClassUtils.class));
246         assertEquals("java.util.Map.Entry", ClassUtils.getCanonicalName(Map.Entry.class));
247         assertEquals("", ClassUtils.getCanonicalName((Class<?>) null));
248 
249         assertEquals("java.lang.String[]", ClassUtils.getCanonicalName(String[].class));
250         assertEquals("java.util.Map.Entry[]", ClassUtils.getCanonicalName(Map.Entry[].class));
251 
252         // Primitives
253         assertEquals("boolean", ClassUtils.getCanonicalName(boolean.class));
254         assertEquals("byte", ClassUtils.getCanonicalName(byte.class));
255         assertEquals("char", ClassUtils.getCanonicalName(char.class));
256         assertEquals("short", ClassUtils.getCanonicalName(short.class));
257         assertEquals("int", ClassUtils.getCanonicalName(int.class));
258         assertEquals("long", ClassUtils.getCanonicalName(long.class));
259         assertEquals("float", ClassUtils.getCanonicalName(float.class));
260         assertEquals("double", ClassUtils.getCanonicalName(double.class));
261 
262         // Primitive Arrays
263         assertEquals("boolean[]", ClassUtils.getCanonicalName(boolean[].class));
264         assertEquals("byte[]", ClassUtils.getCanonicalName(byte[].class));
265         assertEquals("char[]", ClassUtils.getCanonicalName(char[].class));
266         assertEquals("short[]", ClassUtils.getCanonicalName(short[].class));
267         assertEquals("int[]", ClassUtils.getCanonicalName(int[].class));
268         assertEquals("long[]", ClassUtils.getCanonicalName(long[].class));
269         assertEquals("float[]", ClassUtils.getCanonicalName(float[].class));
270         assertEquals("double[]", ClassUtils.getCanonicalName(double[].class));
271 
272         // Arrays of arrays of ...
273         assertEquals("java.lang.String[][]", ClassUtils.getCanonicalName(String[][].class));
274         assertEquals("java.lang.String[][][]", ClassUtils.getCanonicalName(String[][][].class));
275         assertEquals("java.lang.String[][][][]", ClassUtils.getCanonicalName(String[][][][].class));
276 
277         // Inner types
278         final class Named {
279             // empty
280         }
281         assertEquals(StringUtils.EMPTY, ClassUtils.getCanonicalName(new Object() {
282             // empty
283         }.getClass()));
284         assertEquals(StringUtils.EMPTY, ClassUtils.getCanonicalName(Named.class));
285         assertEquals("org.apache.commons.lang3.ClassUtilsTest.Inner", ClassUtils.getCanonicalName(Inner.class));
286     }
287 
288     @Test
289     void test_getCanonicalName_Class_String() {
290         assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getCanonicalName(ClassUtils.class, "X"));
291         assertEquals("java.util.Map.Entry", ClassUtils.getCanonicalName(Map.Entry.class, "X"));
292         assertEquals("X", ClassUtils.getCanonicalName((Class<?>) null, "X"));
293 
294         assertEquals("java.lang.String[]", ClassUtils.getCanonicalName(String[].class, "X"));
295         assertEquals("java.util.Map.Entry[]", ClassUtils.getCanonicalName(Map.Entry[].class, "X"));
296 
297         // Primitives
298         assertEquals("boolean", ClassUtils.getCanonicalName(boolean.class, "X"));
299         assertEquals("byte", ClassUtils.getCanonicalName(byte.class, "X"));
300         assertEquals("char", ClassUtils.getCanonicalName(char.class, "X"));
301         assertEquals("short", ClassUtils.getCanonicalName(short.class, "X"));
302         assertEquals("int", ClassUtils.getCanonicalName(int.class, "X"));
303         assertEquals("long", ClassUtils.getCanonicalName(long.class, "X"));
304         assertEquals("float", ClassUtils.getCanonicalName(float.class, "X"));
305         assertEquals("double", ClassUtils.getCanonicalName(double.class, "X"));
306 
307         // Primitive Arrays
308         assertEquals("boolean[]", ClassUtils.getCanonicalName(boolean[].class, "X"));
309         assertEquals("byte[]", ClassUtils.getCanonicalName(byte[].class, "X"));
310         assertEquals("char[]", ClassUtils.getCanonicalName(char[].class, "X"));
311         assertEquals("short[]", ClassUtils.getCanonicalName(short[].class, "X"));
312         assertEquals("int[]", ClassUtils.getCanonicalName(int[].class, "X"));
313         assertEquals("long[]", ClassUtils.getCanonicalName(long[].class, "X"));
314         assertEquals("float[]", ClassUtils.getCanonicalName(float[].class, "X"));
315         assertEquals("double[]", ClassUtils.getCanonicalName(double[].class, "X"));
316 
317         // Arrays of arrays of ...
318         assertEquals("java.lang.String[][]", ClassUtils.getCanonicalName(String[][].class, "X"));
319         assertEquals("java.lang.String[][][]", ClassUtils.getCanonicalName(String[][][].class, "X"));
320         assertEquals("java.lang.String[][][][]", ClassUtils.getCanonicalName(String[][][][].class, "X"));
321 
322         // Inner types
323         final class Named {
324             // empty
325         }
326         assertEquals("X", ClassUtils.getCanonicalName(new Object() {
327             // empty
328         }.getClass(), "X"));
329         assertEquals("X", ClassUtils.getCanonicalName(Named.class, "X"));
330         assertEquals("org.apache.commons.lang3.ClassUtilsTest.Inner", ClassUtils.getCanonicalName(Inner.class, "X"));
331         assertEquals("X", ClassUtils.getCanonicalName((Object) null, "X"));
332         assertEquals(OBJECT_CANONICAL_NAME, ClassUtils.getCanonicalName(new Object()));
333     }
334 
335     @Test
336     void test_getClass() {
337        // assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getName(ClassLoader.class, "@"));
338     }
339 
340     @Test
341     void test_getName_Class() {
342         assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getName(ClassUtils.class));
343         assertEquals("java.util.Map$Entry", ClassUtils.getName(Map.Entry.class));
344         assertEquals("", ClassUtils.getName((Class<?>) null));
345 
346         assertEquals("[Ljava.lang.String;", ClassUtils.getName(String[].class));
347         assertEquals("[Ljava.util.Map$Entry;", ClassUtils.getName(Map.Entry[].class));
348 
349         // Primitives
350         assertEquals("boolean", ClassUtils.getName(boolean.class));
351         assertEquals("byte", ClassUtils.getName(byte.class));
352         assertEquals("char", ClassUtils.getName(char.class));
353         assertEquals("short", ClassUtils.getName(short.class));
354         assertEquals("int", ClassUtils.getName(int.class));
355         assertEquals("long", ClassUtils.getName(long.class));
356         assertEquals("float", ClassUtils.getName(float.class));
357         assertEquals("double", ClassUtils.getName(double.class));
358 
359         // Primitive Arrays
360         assertEquals("[Z", ClassUtils.getName(boolean[].class));
361         assertEquals("[B", ClassUtils.getName(byte[].class));
362         assertEquals("[C", ClassUtils.getName(char[].class));
363         assertEquals("[S", ClassUtils.getName(short[].class));
364         assertEquals("[I", ClassUtils.getName(int[].class));
365         assertEquals("[J", ClassUtils.getName(long[].class));
366         assertEquals("[F", ClassUtils.getName(float[].class));
367         assertEquals("[D", ClassUtils.getName(double[].class));
368 
369         // Arrays of arrays of ...
370         assertEquals("[[Ljava.lang.String;", ClassUtils.getName(String[][].class));
371         assertEquals("[[[Ljava.lang.String;", ClassUtils.getName(String[][][].class));
372         assertEquals("[[[[Ljava.lang.String;", ClassUtils.getName(String[][][][].class));
373 
374         // Inner types
375         final class Named {
376             // empty
377         }
378         assertEquals("org.apache.commons.lang3.ClassUtilsTest$3", ClassUtils.getName(new Object() {
379             // empty
380         }.getClass()));
381         assertEquals("org.apache.commons.lang3.ClassUtilsTest$3Named", ClassUtils.getName(Named.class));
382         assertEquals("org.apache.commons.lang3.ClassUtilsTest$Inner", ClassUtils.getName(Inner.class));
383         assertEquals(OBJECT_CANONICAL_NAME, ClassUtils.getName(new Object()));
384     }
385 
386     @Test
387     void test_getName_Object() {
388         assertEquals("org.apache.commons.lang3.ClassUtils", ClassUtils.getName(new ClassUtils(), "<null>"));
389         assertEquals("org.apache.commons.lang3.ClassUtilsTest$Inner", ClassUtils.getName(new Inner(), "<null>"));
390         assertEquals("java.lang.String", ClassUtils.getName("hello", "<null>"));
391         assertEquals("<null>", ClassUtils.getName(null, "<null>"));
392 
393         // Inner types
394         final class Named {
395             // empty
396         }
397         assertEquals("org.apache.commons.lang3.ClassUtilsTest$4", ClassUtils.getName(new Object() {
398             // empty
399         }, "<null>"));
400         assertEquals("org.apache.commons.lang3.ClassUtilsTest$4Named", ClassUtils.getName(new Named(), "<null>"));
401         assertEquals("org.apache.commons.lang3.ClassUtilsTest$Inner", ClassUtils.getName(new Inner(), "<null>"));
402     }
403 
404     @Test
405     void test_getPackageCanonicalName_Class() {
406         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(ClassUtils.class));
407         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(ClassUtils[].class));
408         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(ClassUtils[][].class));
409         assertEquals("", ClassUtils.getPackageCanonicalName(int[].class));
410         assertEquals("", ClassUtils.getPackageCanonicalName(int[][].class));
411 
412         // Inner types
413         final class Named {
414             // empty
415         }
416         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Object() {
417             // empty
418         }.getClass()));
419         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(Named.class));
420         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(Inner.class));
421         assertEquals(StringUtils.EMPTY, ClassUtils.getPackageCanonicalName((Class<?>) null));
422     }
423 
424     @Test
425     void test_getPackageCanonicalName_Object() {
426         assertEquals("<null>", ClassUtils.getPackageCanonicalName(null, "<null>"));
427         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new ClassUtils(), "<null>"));
428         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new ClassUtils[0], "<null>"));
429         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new ClassUtils[0][0], "<null>"));
430         assertEquals("", ClassUtils.getPackageCanonicalName(new int[0], "<null>"));
431         assertEquals("", ClassUtils.getPackageCanonicalName(new int[0][0], "<null>"));
432 
433         // Inner types
434         final class Named {
435             // empty
436         }
437         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Object() {
438             // empty
439         }, "<null>"));
440         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Named(), "<null>"));
441         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName(new Inner(), "<null>"));
442     }
443 
444     @Test
445     void test_getPackageCanonicalName_String() {
446         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtils"));
447         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("[Lorg.apache.commons.lang3.ClassUtils;"));
448         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("[[Lorg.apache.commons.lang3.ClassUtils;"));
449         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[Lorg.apache.commons.lang3.ClassUtils;"));
450         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtils[]"));
451         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtils[][]"));
452         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtils[][][][][][][][][][][][][][][][]"));
453         assertEquals("", ClassUtils.getPackageCanonicalName("[I"));
454         assertEquals("", ClassUtils.getPackageCanonicalName("[[I"));
455         assertEquals("", ClassUtils.getPackageCanonicalName("int[]"));
456         assertEquals("", ClassUtils.getPackageCanonicalName("int[][]"));
457         // Inner types
458         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtilsTest$6"));
459         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtilsTest$5Named"));
460         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageCanonicalName("org.apache.commons.lang3.ClassUtilsTest$Inner"));
461         assertEquals("a.b.c.D.e.f", ClassUtils.getPackageCanonicalName("a.b.c.D.e.f.D"));
462     }
463 
464     @Test
465     void test_getPackageName_Class() {
466         assertEquals("java.lang", ClassUtils.getPackageName(String.class));
467         assertEquals("java.util", ClassUtils.getPackageName(Map.Entry.class));
468         assertEquals("", ClassUtils.getPackageName((Class<?>) null));
469         // LANG-535
470         assertEquals("java.lang", ClassUtils.getPackageName(String[].class));
471         // Primitive Arrays
472         assertEquals("", ClassUtils.getPackageName(boolean[].class));
473         assertEquals("", ClassUtils.getPackageName(byte[].class));
474         assertEquals("", ClassUtils.getPackageName(char[].class));
475         assertEquals("", ClassUtils.getPackageName(short[].class));
476         assertEquals("", ClassUtils.getPackageName(int[].class));
477         assertEquals("", ClassUtils.getPackageName(long[].class));
478         assertEquals("", ClassUtils.getPackageName(float[].class));
479         assertEquals("", ClassUtils.getPackageName(double[].class));
480         // Arrays of arrays of ...
481         assertEquals("java.lang", ClassUtils.getPackageName(String[][].class));
482         assertEquals("java.lang", ClassUtils.getPackageName(String[][][].class));
483         assertEquals("java.lang", ClassUtils.getPackageName(String[][][][].class));
484         // On-the-fly types
485         final class Named {
486             // empty
487         }
488         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(new Object() {
489             // empty
490         }.getClass()));
491         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(Named.class));
492         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(new Serializable() {
493             private static final long serialVersionUID = 1L;
494         }.getClass()));
495         assertEquals("java.util.function", ClassUtils.getPackageName(Function.identity().getClass()));
496     }
497 
498     @Test
499     void test_getPackageName_Object() {
500         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(new ClassUtils(), "<null>"));
501         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(new Inner(), "<null>"));
502         assertEquals("<null>", ClassUtils.getPackageName(null, "<null>"));
503     }
504 
505     @Test
506     void test_getPackageName_String() {
507         assertEquals("org.apache.commons.lang3", ClassUtils.getPackageName(ClassUtils.class.getName()));
508         assertEquals("java.util", ClassUtils.getPackageName(Map.Entry.class.getName()));
509         assertEquals("", ClassUtils.getPackageName((String) null));
510         assertEquals("", ClassUtils.getPackageName(""));
511     }
512 
513     @Test
514     void test_getShortCanonicalName_Class() {
515         assertEquals("ClassUtils", ClassUtils.getShortCanonicalName(ClassUtils.class));
516         assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName(ClassUtils[].class));
517         assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName(ClassUtils[][].class));
518         assertEquals("int[]", ClassUtils.getShortCanonicalName(int[].class));
519         assertEquals("int[][]", ClassUtils.getShortCanonicalName(int[][].class));
520         assertEquals("int[][][][][][][][][][]", ClassUtils.getShortCanonicalName(int[][][][][][][][][][].class));
521 
522         // Inner types
523         final class Named {
524             // empty
525         }
526         assertEquals("", ClassUtils.getShortCanonicalName(new Object() {
527             // empty
528         }.getClass()));
529         // WARNING: this is fragile, implementation may change, naming is not guaranteed
530         assertEquals("", ClassUtils.getShortCanonicalName(Named.class));
531         assertEquals("Inner", ClassUtils.getShortCanonicalName(Inner.class));
532         assertEquals(StringUtils.EMPTY, ClassUtils.getShortCanonicalName((Class<?>) null));
533     }
534 
535     @Test
536     void test_getShortCanonicalName_Object() {
537         assertEquals("<null>", ClassUtils.getShortCanonicalName(null, "<null>"));
538         assertEquals("ClassUtils", ClassUtils.getShortCanonicalName(new ClassUtils(), "<null>"));
539         assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName(new ClassUtils[0], "<null>"));
540         assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName(new ClassUtils[0][0], "<null>"));
541         assertEquals("int[]", ClassUtils.getShortCanonicalName(new int[0], "<null>"));
542         assertEquals("int[][]", ClassUtils.getShortCanonicalName(new int[0][0], "<null>"));
543         assertEquals("int[][][][][][][][][][]", ClassUtils.getShortCanonicalName(new int[0][0][0][0][0][0][0][0][0][0], "<null>"));
544 
545         // Inner types
546         final class Named {
547             // empty
548         }
549         assertEquals("", ClassUtils.getShortCanonicalName(new Object() {
550             // empty
551         }, "<null>"));
552         assertEquals("", ClassUtils.getShortCanonicalName(new Named(), "<null>"));
553         assertEquals("Inner", ClassUtils.getShortCanonicalName(new Inner(), "<null>"));
554     }
555 
556     @Test
557     void test_getShortCanonicalName_String() {
558         assertEquals("", ClassUtils.getShortCanonicalName((String) null));
559         assertEquals("Map.Entry", ClassUtils.getShortCanonicalName(java.util.Map.Entry.class.getName()));
560         assertEquals("Entry", ClassUtils.getShortCanonicalName(java.util.Map.Entry.class.getCanonicalName()));
561         assertEquals("ClassUtils", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtils"));
562         assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName("[Lorg.apache.commons.lang3.ClassUtils;"));
563         assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName("[[Lorg.apache.commons.lang3.ClassUtils;"));
564         assertEquals("ClassUtils[]", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtils[]"));
565         assertEquals("ClassUtils[][]", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtils[][]"));
566         assertEquals("int[]", ClassUtils.getShortCanonicalName("[I"));
567         assertEquals("int[]", ClassUtils.getShortCanonicalName(int[].class.getCanonicalName()));
568         assertEquals("int[]", ClassUtils.getShortCanonicalName(int[].class.getName()));
569         assertEquals("int[][]", ClassUtils.getShortCanonicalName("[[I"));
570         assertEquals("int[]", ClassUtils.getShortCanonicalName("int[]"));
571         assertEquals("int[][]", ClassUtils.getShortCanonicalName("int[][]"));
572         assertEquals("int[][][][][][][][][][][][]", ClassUtils.getShortCanonicalName("int[][][][][][][][][][][][]"));
573         // this is to demonstrate that the documentation and the naming of the methods
574         // uses the class name and canonical name totally mixed up, which cannot be
575         // fixed without backward compatibility break
576         assertEquals("int[]", int[].class.getCanonicalName());
577         assertEquals("[I", int[].class.getName());
578         assertIllegalArgumentException(() -> ClassUtils.getShortCanonicalName(StringUtils.repeat("[", 256) + "I"));
579         assertEquals("int" + StringUtils.repeat("[]", 255), ClassUtils.getShortCanonicalName(StringUtils.repeat("[", 255) + "I"));
580         // Inner types... the problem is that these are not canonical names, classes with this name do not even have canonical
581         // name
582         // WARNING: this is fragile, implementation may change, naming is not guaranteed
583         assertEquals("ClassUtilsTest.6", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtilsTest$6"));
584         // WARNING: this is fragile, implementation may change, naming is not guaranteed
585         assertEquals("ClassUtilsTest.5Named", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtilsTest$5Named"));
586         assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortCanonicalName("org.apache.commons.lang3.ClassUtilsTest$Inner"));
587         // demonstrating what a canonical name is... it is a bigger issue to clean this up
588         assertEquals("org.apache.commons.lang3.ClassUtilsTest$11", new org.apache.commons.lang3.ClassUtilsTest() {
589         }.getClass().getName());
590         assertNull(new org.apache.commons.lang3.ClassUtilsTest() {
591         }.getClass().getCanonicalName());
592         assertEquals("String[]", ClassUtils.getShortCanonicalName(String[].class.getName()));
593         assertEquals("String[]", ClassUtils.getShortCanonicalName(String[].class.getCanonicalName()));
594         assertEquals("String[]", ClassUtils.getShortCanonicalName("String[]"));
595         // Note that we throw IllegalArgumentException for the following bad inputs:
596         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName(""));
597         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("["));
598         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[]"));
599         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[;"));
600         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[];"));
601         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName(" "));
602         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[$"));
603         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[$a"));
604         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[["));
605         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[[L"));
606         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[org.apache.commons.lang3.ClassUtilsTest"));
607         assertThrows(IllegalArgumentException.class, () -> ClassUtils.getShortCanonicalName("[Lorg.apache.commons.lang3.ClassUtilsTest"));
608     }
609 
610     @Test
611     void test_getShortClassName_Class() {
612         assertEquals("ClassUtils", ClassUtils.getShortClassName(ClassUtils.class));
613         assertEquals("Map.Entry", ClassUtils.getShortClassName(Map.Entry.class));
614         assertEquals("", ClassUtils.getShortClassName((Class<?>) null));
615 
616         // LANG-535
617         assertEquals("String[]", ClassUtils.getShortClassName(String[].class));
618         assertEquals("Map.Entry[]", ClassUtils.getShortClassName(Map.Entry[].class));
619 
620         // Primitives
621         assertEquals("boolean", ClassUtils.getShortClassName(boolean.class));
622         assertEquals("byte", ClassUtils.getShortClassName(byte.class));
623         assertEquals("char", ClassUtils.getShortClassName(char.class));
624         assertEquals("short", ClassUtils.getShortClassName(short.class));
625         assertEquals("int", ClassUtils.getShortClassName(int.class));
626         assertEquals("long", ClassUtils.getShortClassName(long.class));
627         assertEquals("float", ClassUtils.getShortClassName(float.class));
628         assertEquals("double", ClassUtils.getShortClassName(double.class));
629 
630         // Primitive Arrays
631         assertEquals("boolean[]", ClassUtils.getShortClassName(boolean[].class));
632         assertEquals("byte[]", ClassUtils.getShortClassName(byte[].class));
633         assertEquals("char[]", ClassUtils.getShortClassName(char[].class));
634         assertEquals("short[]", ClassUtils.getShortClassName(short[].class));
635         assertEquals("int[]", ClassUtils.getShortClassName(int[].class));
636         assertEquals("long[]", ClassUtils.getShortClassName(long[].class));
637         assertEquals("float[]", ClassUtils.getShortClassName(float[].class));
638         assertEquals("double[]", ClassUtils.getShortClassName(double[].class));
639 
640         // Arrays of arrays of ...
641         assertEquals("String[][]", ClassUtils.getShortClassName(String[][].class));
642         assertEquals("String[][][]", ClassUtils.getShortClassName(String[][][].class));
643         assertEquals("String[][][][]", ClassUtils.getShortClassName(String[][][][].class));
644 
645         // Inner types
646         final class Named {
647             // empty
648         }
649         // WARNING: this is fragile, implementation may change, naming is not guaranteed
650         assertEquals("ClassUtilsTest.13", ClassUtils.getShortClassName(new Object() {
651             // empty
652         }.getClass()));
653         // WARNING: this is fragile, implementation may change, naming is not guaranteed
654         assertEquals("ClassUtilsTest.10Named", ClassUtils.getShortClassName(Named.class));
655         assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(Inner.class));
656     }
657 
658     @Test
659     void test_getShortClassName_Object() {
660         assertEquals("ClassUtils", ClassUtils.getShortClassName(new ClassUtils(), "<null>"));
661         assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(new Inner(), "<null>"));
662         assertEquals("String", ClassUtils.getShortClassName("hello", "<null>"));
663         assertEquals("<null>", ClassUtils.getShortClassName(null, "<null>"));
664 
665         // Inner types
666         final class Named {
667             // empty
668         }
669         // WARNING: this is fragile, implementation may change, naming is not guaranteed
670         assertEquals("ClassUtilsTest.14", ClassUtils.getShortClassName(new Object() {
671             // empty
672         }, "<null>"));
673         // WARNING: this is fragile, implementation may change, naming is not guaranteed
674         assertEquals("ClassUtilsTest.11Named", ClassUtils.getShortClassName(new Named(), "<null>"));
675         assertEquals("ClassUtilsTest.Inner", ClassUtils.getShortClassName(new Inner(), "<null>"));
676     }
677 
678     @Test
679     void test_getShortClassName_String() {
680         assertEquals("ClassUtils", ClassUtils.getShortClassName(ClassUtils.class.getName()));
681         assertEquals("Map.Entry", ClassUtils.getShortClassName(Map.Entry.class.getName()));
682         assertEquals("", ClassUtils.getShortClassName((String) null));
683         assertEquals("", ClassUtils.getShortClassName(""));
684     }
685 
686     @Test
687     void test_getSimpleName_Class() {
688         assertEquals("ClassUtils", ClassUtils.getSimpleName(ClassUtils.class));
689         assertEquals("Entry", ClassUtils.getSimpleName(Map.Entry.class));
690         assertEquals("", ClassUtils.getSimpleName(null));
691 
692         // LANG-535
693         assertEquals("String[]", ClassUtils.getSimpleName(String[].class));
694         assertEquals("Entry[]", ClassUtils.getSimpleName(Map.Entry[].class));
695 
696         // Primitives
697         assertEquals("boolean", ClassUtils.getSimpleName(boolean.class));
698         assertEquals("byte", ClassUtils.getSimpleName(byte.class));
699         assertEquals("char", ClassUtils.getSimpleName(char.class));
700         assertEquals("short", ClassUtils.getSimpleName(short.class));
701         assertEquals("int", ClassUtils.getSimpleName(int.class));
702         assertEquals("long", ClassUtils.getSimpleName(long.class));
703         assertEquals("float", ClassUtils.getSimpleName(float.class));
704         assertEquals("double", ClassUtils.getSimpleName(double.class));
705 
706         // Primitive Arrays
707         assertEquals("boolean[]", ClassUtils.getSimpleName(boolean[].class));
708         assertEquals("byte[]", ClassUtils.getSimpleName(byte[].class));
709         assertEquals("char[]", ClassUtils.getSimpleName(char[].class));
710         assertEquals("short[]", ClassUtils.getSimpleName(short[].class));
711         assertEquals("int[]", ClassUtils.getSimpleName(int[].class));
712         assertEquals("long[]", ClassUtils.getSimpleName(long[].class));
713         assertEquals("float[]", ClassUtils.getSimpleName(float[].class));
714         assertEquals("double[]", ClassUtils.getSimpleName(double[].class));
715 
716         // Arrays of arrays of ...
717         assertEquals("String[][]", ClassUtils.getSimpleName(String[][].class));
718         assertEquals("String[][][]", ClassUtils.getSimpleName(String[][][].class));
719         assertEquals("String[][][][]", ClassUtils.getSimpleName(String[][][][].class));
720 
721         // On-the-fly types
722         final class Named {
723             // empty
724         }
725         assertEquals("", ClassUtils.getSimpleName(new Object() {
726             // empty
727         }.getClass()));
728         assertEquals("Named", ClassUtils.getSimpleName(Named.class));
729     }
730 
731     @Test
732     void test_getSimpleName_Object() {
733         assertEquals("ClassUtils", ClassUtils.getSimpleName(new ClassUtils()));
734         assertEquals("Inner", ClassUtils.getSimpleName(new Inner()));
735         assertEquals("String", ClassUtils.getSimpleName("hello"));
736         assertEquals(StringUtils.EMPTY, ClassUtils.getSimpleName(null));
737         assertEquals(StringUtils.EMPTY, ClassUtils.getSimpleName(null));
738     }
739 
740     @Test
741     void test_getSimpleName_Object_String() {
742         assertEquals("ClassUtils", ClassUtils.getSimpleName(new ClassUtils(), "<null>"));
743         assertEquals("Inner", ClassUtils.getSimpleName(new Inner(), "<null>"));
744         assertEquals("String", ClassUtils.getSimpleName("hello", "<null>"));
745         assertEquals("<null>", ClassUtils.getSimpleName(null, "<null>"));
746         assertNull(ClassUtils.getSimpleName(null, null));
747     }
748 
749     @Test
750     void test_isAssignable() {
751         assertFalse(ClassUtils.isAssignable((Class<?>) null, null));
752         assertFalse(ClassUtils.isAssignable(String.class, null));
753 
754         assertTrue(ClassUtils.isAssignable(null, Object.class));
755         assertTrue(ClassUtils.isAssignable(null, Integer.class));
756         assertFalse(ClassUtils.isAssignable(null, Integer.TYPE));
757         assertTrue(ClassUtils.isAssignable(String.class, Object.class));
758         assertTrue(ClassUtils.isAssignable(String.class, String.class));
759         assertFalse(ClassUtils.isAssignable(Object.class, String.class));
760 
761         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.class));
762         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Object.class));
763         assertTrue(ClassUtils.isAssignable(Integer.class, Integer.TYPE));
764         assertTrue(ClassUtils.isAssignable(Integer.class, Object.class));
765         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE));
766         assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class));
767         assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.class));
768         assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Object.class));
769         assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE));
770         assertTrue(ClassUtils.isAssignable(Boolean.class, Object.class));
771         assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE));
772         assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class));
773     }
774 
775     @Test
776     void test_isAssignable_Autoboxing() {
777         assertFalse(ClassUtils.isAssignable((Class<?>) null, null, true));
778         assertFalse(ClassUtils.isAssignable(String.class, null, true));
779         assertTrue(ClassUtils.isAssignable(null, Object.class, true));
780         assertTrue(ClassUtils.isAssignable(null, Integer.class, true));
781         assertFalse(ClassUtils.isAssignable(null, Integer.TYPE, true));
782         assertTrue(ClassUtils.isAssignable(String.class, Object.class, true));
783         assertTrue(ClassUtils.isAssignable(String.class, String.class, true));
784         assertFalse(ClassUtils.isAssignable(Object.class, String.class, true));
785         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.class, true));
786         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Object.class, true));
787         assertTrue(ClassUtils.isAssignable(Integer.class, Integer.TYPE, true));
788         assertTrue(ClassUtils.isAssignable(Integer.class, Object.class, true));
789         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE, true));
790         assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class, true));
791         assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.class, true));
792         assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, true));
793         assertTrue(ClassUtils.isAssignable(Boolean.class, Object.class, true));
794         assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE, true));
795         assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class, true));
796     }
797 
798     @Test
799     void test_isAssignable_ClassArray_ClassArray() {
800         final Class<?>[] array2 = new Class[] {Object.class, Object.class};
801         final Class<?>[] array1 = new Class[] {Object.class};
802         final Class<?>[] array1s = new Class[] {String.class};
803         final Class<?>[] array0 = new Class[] {};
804         final Class<?>[] arrayPrimitives = {Integer.TYPE, Boolean.TYPE};
805         final Class<?>[] arrayWrappers = {Integer.class, Boolean.class};
806 
807         assertFalse(ClassUtils.isAssignable(array1, array2));
808         assertFalse(ClassUtils.isAssignable(null, array2));
809         assertTrue(ClassUtils.isAssignable(null, array0));
810         assertTrue(ClassUtils.isAssignable(array0, array0));
811         assertTrue(ClassUtils.isAssignable(array0, (Class<?>[]) null)); // explicit cast to avoid warning
812         assertTrue(ClassUtils.isAssignable(null, (Class<?>[]) null)); // explicit cast to avoid warning
813 
814         assertFalse(ClassUtils.isAssignable(array1, array1s));
815         assertTrue(ClassUtils.isAssignable(array1s, array1s));
816         assertTrue(ClassUtils.isAssignable(array1s, array1));
817 
818         assertTrue(ClassUtils.isAssignable(arrayPrimitives, arrayWrappers));
819         assertTrue(ClassUtils.isAssignable(arrayWrappers, arrayPrimitives));
820         assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1));
821         assertFalse(ClassUtils.isAssignable(arrayWrappers, array1));
822         assertTrue(ClassUtils.isAssignable(arrayPrimitives, array2));
823         assertTrue(ClassUtils.isAssignable(arrayWrappers, array2));
824     }
825 
826     @Test
827     void test_isAssignable_ClassArray_ClassArray_Autoboxing() {
828         final Class<?>[] array2 = new Class[] {Object.class, Object.class};
829         final Class<?>[] array1 = new Class[] {Object.class};
830         final Class<?>[] array1s = new Class[] {String.class};
831         final Class<?>[] array0 = new Class[] {};
832         final Class<?>[] arrayPrimitives = {Integer.TYPE, Boolean.TYPE};
833         final Class<?>[] arrayWrappers = {Integer.class, Boolean.class};
834 
835         assertFalse(ClassUtils.isAssignable(array1, array2, true));
836         assertFalse(ClassUtils.isAssignable(null, array2, true));
837         assertTrue(ClassUtils.isAssignable(null, array0, true));
838         assertTrue(ClassUtils.isAssignable(array0, array0, true));
839         assertTrue(ClassUtils.isAssignable(array0, null, true));
840         assertTrue(ClassUtils.isAssignable((Class[]) null, null, true));
841 
842         assertFalse(ClassUtils.isAssignable(array1, array1s, true));
843         assertTrue(ClassUtils.isAssignable(array1s, array1s, true));
844         assertTrue(ClassUtils.isAssignable(array1s, array1, true));
845 
846         assertTrue(ClassUtils.isAssignable(arrayPrimitives, arrayWrappers, true));
847         assertTrue(ClassUtils.isAssignable(arrayWrappers, arrayPrimitives, true));
848         assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1, true));
849         assertFalse(ClassUtils.isAssignable(arrayWrappers, array1, true));
850         assertTrue(ClassUtils.isAssignable(arrayPrimitives, array2, true));
851         assertTrue(ClassUtils.isAssignable(arrayWrappers, array2, true));
852     }
853 
854     @Test
855     void test_isAssignable_ClassArray_ClassArray_NoAutoboxing() {
856         final Class<?>[] array2 = new Class[] {Object.class, Object.class};
857         final Class<?>[] array1 = new Class[] {Object.class};
858         final Class<?>[] array1s = new Class[] {String.class};
859         final Class<?>[] array0 = new Class[] {};
860         final Class<?>[] arrayPrimitives = {Integer.TYPE, Boolean.TYPE};
861         final Class<?>[] arrayWrappers = {Integer.class, Boolean.class};
862 
863         assertFalse(ClassUtils.isAssignable(array1, array2, false));
864         assertFalse(ClassUtils.isAssignable(null, array2, false));
865         assertTrue(ClassUtils.isAssignable(null, array0, false));
866         assertTrue(ClassUtils.isAssignable(array0, array0, false));
867         assertTrue(ClassUtils.isAssignable(array0, null, false));
868         assertTrue(ClassUtils.isAssignable((Class[]) null, null, false));
869 
870         assertFalse(ClassUtils.isAssignable(array1, array1s, false));
871         assertTrue(ClassUtils.isAssignable(array1s, array1s, false));
872         assertTrue(ClassUtils.isAssignable(array1s, array1, false));
873 
874         assertFalse(ClassUtils.isAssignable(arrayPrimitives, arrayWrappers, false));
875         assertFalse(ClassUtils.isAssignable(arrayWrappers, arrayPrimitives, false));
876         assertFalse(ClassUtils.isAssignable(arrayPrimitives, array1, false));
877         assertFalse(ClassUtils.isAssignable(arrayWrappers, array1, false));
878         assertTrue(ClassUtils.isAssignable(arrayWrappers, array2, false));
879         assertFalse(ClassUtils.isAssignable(arrayPrimitives, array2, false));
880     }
881 
882     @Test
883     void test_isAssignable_DefaultUnboxing_Widening() {
884         // test byte conversions
885         assertFalse(ClassUtils.isAssignable(Byte.class, Character.TYPE), "byte -> char");
886         assertTrue(ClassUtils.isAssignable(Byte.class, Byte.TYPE), "byte -> byte");
887         assertTrue(ClassUtils.isAssignable(Byte.class, Short.TYPE), "byte -> short");
888         assertTrue(ClassUtils.isAssignable(Byte.class, Integer.TYPE), "byte -> int");
889         assertTrue(ClassUtils.isAssignable(Byte.class, Long.TYPE), "byte -> long");
890         assertTrue(ClassUtils.isAssignable(Byte.class, Float.TYPE), "byte -> float");
891         assertTrue(ClassUtils.isAssignable(Byte.class, Double.TYPE), "byte -> double");
892         assertFalse(ClassUtils.isAssignable(Byte.class, Boolean.TYPE), "byte -> boolean");
893 
894         // test short conversions
895         assertFalse(ClassUtils.isAssignable(Short.class, Character.TYPE), "short -> char");
896         assertFalse(ClassUtils.isAssignable(Short.class, Byte.TYPE), "short -> byte");
897         assertTrue(ClassUtils.isAssignable(Short.class, Short.TYPE), "short -> short");
898         assertTrue(ClassUtils.isAssignable(Short.class, Integer.TYPE), "short -> int");
899         assertTrue(ClassUtils.isAssignable(Short.class, Long.TYPE), "short -> long");
900         assertTrue(ClassUtils.isAssignable(Short.class, Float.TYPE), "short -> float");
901         assertTrue(ClassUtils.isAssignable(Short.class, Double.TYPE), "short -> double");
902         assertFalse(ClassUtils.isAssignable(Short.class, Boolean.TYPE), "short -> boolean");
903 
904         // test char conversions
905         assertTrue(ClassUtils.isAssignable(Character.class, Character.TYPE), "char -> char");
906         assertFalse(ClassUtils.isAssignable(Character.class, Byte.TYPE), "char -> byte");
907         assertFalse(ClassUtils.isAssignable(Character.class, Short.TYPE), "char -> short");
908         assertTrue(ClassUtils.isAssignable(Character.class, Integer.TYPE), "char -> int");
909         assertTrue(ClassUtils.isAssignable(Character.class, Long.TYPE), "char -> long");
910         assertTrue(ClassUtils.isAssignable(Character.class, Float.TYPE), "char -> float");
911         assertTrue(ClassUtils.isAssignable(Character.class, Double.TYPE), "char -> double");
912         assertFalse(ClassUtils.isAssignable(Character.class, Boolean.TYPE), "char -> boolean");
913 
914         // test int conversions
915         assertFalse(ClassUtils.isAssignable(Integer.class, Character.TYPE), "int -> char");
916         assertFalse(ClassUtils.isAssignable(Integer.class, Byte.TYPE), "int -> byte");
917         assertFalse(ClassUtils.isAssignable(Integer.class, Short.TYPE), "int -> short");
918         assertTrue(ClassUtils.isAssignable(Integer.class, Integer.TYPE), "int -> int");
919         assertTrue(ClassUtils.isAssignable(Integer.class, Long.TYPE), "int -> long");
920         assertTrue(ClassUtils.isAssignable(Integer.class, Float.TYPE), "int -> float");
921         assertTrue(ClassUtils.isAssignable(Integer.class, Double.TYPE), "int -> double");
922         assertFalse(ClassUtils.isAssignable(Integer.class, Boolean.TYPE), "int -> boolean");
923 
924         // test long conversions
925         assertFalse(ClassUtils.isAssignable(Long.class, Character.TYPE), "long -> char");
926         assertFalse(ClassUtils.isAssignable(Long.class, Byte.TYPE), "long -> byte");
927         assertFalse(ClassUtils.isAssignable(Long.class, Short.TYPE), "long -> short");
928         assertFalse(ClassUtils.isAssignable(Long.class, Integer.TYPE), "long -> int");
929         assertTrue(ClassUtils.isAssignable(Long.class, Long.TYPE), "long -> long");
930         assertTrue(ClassUtils.isAssignable(Long.class, Float.TYPE), "long -> float");
931         assertTrue(ClassUtils.isAssignable(Long.class, Double.TYPE), "long -> double");
932         assertFalse(ClassUtils.isAssignable(Long.class, Boolean.TYPE), "long -> boolean");
933 
934         // test float conversions
935         assertFalse(ClassUtils.isAssignable(Float.class, Character.TYPE), "float -> char");
936         assertFalse(ClassUtils.isAssignable(Float.class, Byte.TYPE), "float -> byte");
937         assertFalse(ClassUtils.isAssignable(Float.class, Short.TYPE), "float -> short");
938         assertFalse(ClassUtils.isAssignable(Float.class, Integer.TYPE), "float -> int");
939         assertFalse(ClassUtils.isAssignable(Float.class, Long.TYPE), "float -> long");
940         assertTrue(ClassUtils.isAssignable(Float.class, Float.TYPE), "float -> float");
941         assertTrue(ClassUtils.isAssignable(Float.class, Double.TYPE), "float -> double");
942         assertFalse(ClassUtils.isAssignable(Float.class, Boolean.TYPE), "float -> boolean");
943 
944         // test double conversions
945         assertFalse(ClassUtils.isAssignable(Double.class, Character.TYPE), "double -> char");
946         assertFalse(ClassUtils.isAssignable(Double.class, Byte.TYPE), "double -> byte");
947         assertFalse(ClassUtils.isAssignable(Double.class, Short.TYPE), "double -> short");
948         assertFalse(ClassUtils.isAssignable(Double.class, Integer.TYPE), "double -> int");
949         assertFalse(ClassUtils.isAssignable(Double.class, Long.TYPE), "double -> long");
950         assertFalse(ClassUtils.isAssignable(Double.class, Float.TYPE), "double -> float");
951         assertTrue(ClassUtils.isAssignable(Double.class, Double.TYPE), "double -> double");
952         assertFalse(ClassUtils.isAssignable(Double.class, Boolean.TYPE), "double -> boolean");
953 
954         // test boolean conversions
955         assertFalse(ClassUtils.isAssignable(Boolean.class, Character.TYPE), "boolean -> char");
956         assertFalse(ClassUtils.isAssignable(Boolean.class, Byte.TYPE), "boolean -> byte");
957         assertFalse(ClassUtils.isAssignable(Boolean.class, Short.TYPE), "boolean -> short");
958         assertFalse(ClassUtils.isAssignable(Boolean.class, Integer.TYPE), "boolean -> int");
959         assertFalse(ClassUtils.isAssignable(Boolean.class, Long.TYPE), "boolean -> long");
960         assertFalse(ClassUtils.isAssignable(Boolean.class, Float.TYPE), "boolean -> float");
961         assertFalse(ClassUtils.isAssignable(Boolean.class, Double.TYPE), "boolean -> double");
962         assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE), "boolean -> boolean");
963     }
964 
965     @Test
966     void test_isAssignable_NoAutoboxing() {
967         assertFalse(ClassUtils.isAssignable((Class<?>) null, null, false));
968         assertFalse(ClassUtils.isAssignable(String.class, null, false));
969         assertTrue(ClassUtils.isAssignable(null, Object.class, false));
970         assertTrue(ClassUtils.isAssignable(null, Integer.class, false));
971         assertFalse(ClassUtils.isAssignable(null, Integer.TYPE, false));
972         assertTrue(ClassUtils.isAssignable(String.class, Object.class, false));
973         assertTrue(ClassUtils.isAssignable(String.class, String.class, false));
974         assertFalse(ClassUtils.isAssignable(Object.class, String.class, false));
975         assertFalse(ClassUtils.isAssignable(Integer.TYPE, Integer.class, false));
976         assertFalse(ClassUtils.isAssignable(Integer.TYPE, Object.class, false));
977         assertFalse(ClassUtils.isAssignable(Integer.class, Integer.TYPE, false));
978         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE, false));
979         assertTrue(ClassUtils.isAssignable(Integer.class, Integer.class, false));
980         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Boolean.class, false));
981         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Object.class, false));
982         assertFalse(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, false));
983         assertTrue(ClassUtils.isAssignable(Boolean.class, Object.class, false));
984         assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE, false));
985         assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.class, false));
986     }
987 
988     @Test
989     void test_isAssignable_Unboxing_Widening() {
990         // test byte conversions
991         assertFalse(ClassUtils.isAssignable(Byte.class, Character.TYPE, true), "byte -> char");
992         assertTrue(ClassUtils.isAssignable(Byte.class, Byte.TYPE, true), "byte -> byte");
993         assertTrue(ClassUtils.isAssignable(Byte.class, Short.TYPE, true), "byte -> short");
994         assertTrue(ClassUtils.isAssignable(Byte.class, Integer.TYPE, true), "byte -> int");
995         assertTrue(ClassUtils.isAssignable(Byte.class, Long.TYPE, true), "byte -> long");
996         assertTrue(ClassUtils.isAssignable(Byte.class, Float.TYPE, true), "byte -> float");
997         assertTrue(ClassUtils.isAssignable(Byte.class, Double.TYPE, true), "byte -> double");
998         assertFalse(ClassUtils.isAssignable(Byte.class, Boolean.TYPE, true), "byte -> boolean");
999         // test short conversions
1000         assertFalse(ClassUtils.isAssignable(Short.class, Character.TYPE, true), "short -> char");
1001         assertFalse(ClassUtils.isAssignable(Short.class, Byte.TYPE, true), "short -> byte");
1002         assertTrue(ClassUtils.isAssignable(Short.class, Short.TYPE, true), "short -> short");
1003         assertTrue(ClassUtils.isAssignable(Short.class, Integer.TYPE, true), "short -> int");
1004         assertTrue(ClassUtils.isAssignable(Short.class, Long.TYPE, true), "short -> long");
1005         assertTrue(ClassUtils.isAssignable(Short.class, Float.TYPE, true), "short -> float");
1006         assertTrue(ClassUtils.isAssignable(Short.class, Double.TYPE, true), "short -> double");
1007         assertFalse(ClassUtils.isAssignable(Short.class, Boolean.TYPE, true), "short -> boolean");
1008         // test char conversions
1009         assertTrue(ClassUtils.isAssignable(Character.class, Character.TYPE, true), "char -> char");
1010         assertFalse(ClassUtils.isAssignable(Character.class, Byte.TYPE, true), "char -> byte");
1011         assertFalse(ClassUtils.isAssignable(Character.class, Short.TYPE, true), "char -> short");
1012         assertTrue(ClassUtils.isAssignable(Character.class, Integer.TYPE, true), "char -> int");
1013         assertTrue(ClassUtils.isAssignable(Character.class, Long.TYPE, true), "char -> long");
1014         assertTrue(ClassUtils.isAssignable(Character.class, Float.TYPE, true), "char -> float");
1015         assertTrue(ClassUtils.isAssignable(Character.class, Double.TYPE, true), "char -> double");
1016         assertFalse(ClassUtils.isAssignable(Character.class, Boolean.TYPE, true), "char -> boolean");
1017         // test int conversions
1018         assertFalse(ClassUtils.isAssignable(Integer.class, Character.TYPE, true), "int -> char");
1019         assertFalse(ClassUtils.isAssignable(Integer.class, Byte.TYPE, true), "int -> byte");
1020         assertFalse(ClassUtils.isAssignable(Integer.class, Short.TYPE, true), "int -> short");
1021         assertTrue(ClassUtils.isAssignable(Integer.class, Integer.TYPE, true), "int -> int");
1022         assertTrue(ClassUtils.isAssignable(Integer.class, Long.TYPE, true), "int -> long");
1023         assertTrue(ClassUtils.isAssignable(Integer.class, Float.TYPE, true), "int -> float");
1024         assertTrue(ClassUtils.isAssignable(Integer.class, Double.TYPE, true), "int -> double");
1025         assertFalse(ClassUtils.isAssignable(Integer.class, Boolean.TYPE, true), "int -> boolean");
1026         // test long conversions
1027         assertFalse(ClassUtils.isAssignable(Long.class, Character.TYPE, true), "long -> char");
1028         assertFalse(ClassUtils.isAssignable(Long.class, Byte.TYPE, true), "long -> byte");
1029         assertFalse(ClassUtils.isAssignable(Long.class, Short.TYPE, true), "long -> short");
1030         assertFalse(ClassUtils.isAssignable(Long.class, Integer.TYPE, true), "long -> int");
1031         assertTrue(ClassUtils.isAssignable(Long.class, Long.TYPE, true), "long -> long");
1032         assertTrue(ClassUtils.isAssignable(Long.class, Float.TYPE, true), "long -> float");
1033         assertTrue(ClassUtils.isAssignable(Long.class, Double.TYPE, true), "long -> double");
1034         assertFalse(ClassUtils.isAssignable(Long.class, Boolean.TYPE, true), "long -> boolean");
1035         // test float conversions
1036         assertFalse(ClassUtils.isAssignable(Float.class, Character.TYPE, true), "float -> char");
1037         assertFalse(ClassUtils.isAssignable(Float.class, Byte.TYPE, true), "float -> byte");
1038         assertFalse(ClassUtils.isAssignable(Float.class, Short.TYPE, true), "float -> short");
1039         assertFalse(ClassUtils.isAssignable(Float.class, Integer.TYPE, true), "float -> int");
1040         assertFalse(ClassUtils.isAssignable(Float.class, Long.TYPE, true), "float -> long");
1041         assertTrue(ClassUtils.isAssignable(Float.class, Float.TYPE, true), "float -> float");
1042         assertTrue(ClassUtils.isAssignable(Float.class, Double.TYPE, true), "float -> double");
1043         assertFalse(ClassUtils.isAssignable(Float.class, Boolean.TYPE, true), "float -> boolean");
1044         // test double conversions
1045         assertFalse(ClassUtils.isAssignable(Double.class, Character.TYPE, true), "double -> char");
1046         assertFalse(ClassUtils.isAssignable(Double.class, Byte.TYPE, true), "double -> byte");
1047         assertFalse(ClassUtils.isAssignable(Double.class, Short.TYPE, true), "double -> short");
1048         assertFalse(ClassUtils.isAssignable(Double.class, Integer.TYPE, true), "double -> int");
1049         assertFalse(ClassUtils.isAssignable(Double.class, Long.TYPE, true), "double -> long");
1050         assertFalse(ClassUtils.isAssignable(Double.class, Float.TYPE, true), "double -> float");
1051         assertTrue(ClassUtils.isAssignable(Double.class, Double.TYPE, true), "double -> double");
1052         assertFalse(ClassUtils.isAssignable(Double.class, Boolean.TYPE, true), "double -> boolean");
1053         // test boolean conversions
1054         assertFalse(ClassUtils.isAssignable(Boolean.class, Character.TYPE, true), "boolean -> char");
1055         assertFalse(ClassUtils.isAssignable(Boolean.class, Byte.TYPE, true), "boolean -> byte");
1056         assertFalse(ClassUtils.isAssignable(Boolean.class, Short.TYPE, true), "boolean -> short");
1057         assertFalse(ClassUtils.isAssignable(Boolean.class, Integer.TYPE, true), "boolean -> int");
1058         assertFalse(ClassUtils.isAssignable(Boolean.class, Long.TYPE, true), "boolean -> long");
1059         assertFalse(ClassUtils.isAssignable(Boolean.class, Float.TYPE, true), "boolean -> float");
1060         assertFalse(ClassUtils.isAssignable(Boolean.class, Double.TYPE, true), "boolean -> double");
1061         assertTrue(ClassUtils.isAssignable(Boolean.class, Boolean.TYPE, true), "boolean -> boolean");
1062     }
1063 
1064     @Test
1065     void test_isAssignable_Widening() {
1066         // test byte conversions
1067         assertFalse(ClassUtils.isAssignable(Byte.TYPE, Character.TYPE), "byte -> char");
1068         assertTrue(ClassUtils.isAssignable(Byte.TYPE, Byte.TYPE), "byte -> byte");
1069         assertTrue(ClassUtils.isAssignable(Byte.TYPE, Short.TYPE), "byte -> short");
1070         assertTrue(ClassUtils.isAssignable(Byte.TYPE, Integer.TYPE), "byte -> int");
1071         assertTrue(ClassUtils.isAssignable(Byte.TYPE, Long.TYPE), "byte -> long");
1072         assertTrue(ClassUtils.isAssignable(Byte.TYPE, Float.TYPE), "byte -> float");
1073         assertTrue(ClassUtils.isAssignable(Byte.TYPE, Double.TYPE), "byte -> double");
1074         assertFalse(ClassUtils.isAssignable(Byte.TYPE, Boolean.TYPE), "byte -> boolean");
1075         // test short conversions
1076         assertFalse(ClassUtils.isAssignable(Short.TYPE, Character.TYPE), "short -> char");
1077         assertFalse(ClassUtils.isAssignable(Short.TYPE, Byte.TYPE), "short -> byte");
1078         assertTrue(ClassUtils.isAssignable(Short.TYPE, Short.TYPE), "short -> short");
1079         assertTrue(ClassUtils.isAssignable(Short.TYPE, Integer.TYPE), "short -> int");
1080         assertTrue(ClassUtils.isAssignable(Short.TYPE, Long.TYPE), "short -> long");
1081         assertTrue(ClassUtils.isAssignable(Short.TYPE, Float.TYPE), "short -> float");
1082         assertTrue(ClassUtils.isAssignable(Short.TYPE, Double.TYPE), "short -> double");
1083         assertFalse(ClassUtils.isAssignable(Short.TYPE, Boolean.TYPE), "short -> boolean");
1084         // test char conversions
1085         assertTrue(ClassUtils.isAssignable(Character.TYPE, Character.TYPE), "char -> char");
1086         assertFalse(ClassUtils.isAssignable(Character.TYPE, Byte.TYPE), "char -> byte");
1087         assertFalse(ClassUtils.isAssignable(Character.TYPE, Short.TYPE), "char -> short");
1088         assertTrue(ClassUtils.isAssignable(Character.TYPE, Integer.TYPE), "char -> int");
1089         assertTrue(ClassUtils.isAssignable(Character.TYPE, Long.TYPE), "char -> long");
1090         assertTrue(ClassUtils.isAssignable(Character.TYPE, Float.TYPE), "char -> float");
1091         assertTrue(ClassUtils.isAssignable(Character.TYPE, Double.TYPE), "char -> double");
1092         assertFalse(ClassUtils.isAssignable(Character.TYPE, Boolean.TYPE), "char -> boolean");
1093         // test int conversions
1094         assertFalse(ClassUtils.isAssignable(Integer.TYPE, Character.TYPE), "int -> char");
1095         assertFalse(ClassUtils.isAssignable(Integer.TYPE, Byte.TYPE), "int -> byte");
1096         assertFalse(ClassUtils.isAssignable(Integer.TYPE, Short.TYPE), "int -> short");
1097         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Integer.TYPE), "int -> int");
1098         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Long.TYPE), "int -> long");
1099         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Float.TYPE), "int -> float");
1100         assertTrue(ClassUtils.isAssignable(Integer.TYPE, Double.TYPE), "int -> double");
1101         assertFalse(ClassUtils.isAssignable(Integer.TYPE, Boolean.TYPE), "int -> boolean");
1102         // test long conversions
1103         assertFalse(ClassUtils.isAssignable(Long.TYPE, Character.TYPE), "long -> char");
1104         assertFalse(ClassUtils.isAssignable(Long.TYPE, Byte.TYPE), "long -> byte");
1105         assertFalse(ClassUtils.isAssignable(Long.TYPE, Short.TYPE), "long -> short");
1106         assertFalse(ClassUtils.isAssignable(Long.TYPE, Integer.TYPE), "long -> int");
1107         assertTrue(ClassUtils.isAssignable(Long.TYPE, Long.TYPE), "long -> long");
1108         assertTrue(ClassUtils.isAssignable(Long.TYPE, Float.TYPE), "long -> float");
1109         assertTrue(ClassUtils.isAssignable(Long.TYPE, Double.TYPE), "long -> double");
1110         assertFalse(ClassUtils.isAssignable(Long.TYPE, Boolean.TYPE), "long -> boolean");
1111         // test float conversions
1112         assertFalse(ClassUtils.isAssignable(Float.TYPE, Character.TYPE), "float -> char");
1113         assertFalse(ClassUtils.isAssignable(Float.TYPE, Byte.TYPE), "float -> byte");
1114         assertFalse(ClassUtils.isAssignable(Float.TYPE, Short.TYPE), "float -> short");
1115         assertFalse(ClassUtils.isAssignable(Float.TYPE, Integer.TYPE), "float -> int");
1116         assertFalse(ClassUtils.isAssignable(Float.TYPE, Long.TYPE), "float -> long");
1117         assertTrue(ClassUtils.isAssignable(Float.TYPE, Float.TYPE), "float -> float");
1118         assertTrue(ClassUtils.isAssignable(Float.TYPE, Double.TYPE), "float -> double");
1119         assertFalse(ClassUtils.isAssignable(Float.TYPE, Boolean.TYPE), "float -> boolean");
1120         // test double conversions
1121         assertFalse(ClassUtils.isAssignable(Double.TYPE, Character.TYPE), "double -> char");
1122         assertFalse(ClassUtils.isAssignable(Double.TYPE, Byte.TYPE), "double -> byte");
1123         assertFalse(ClassUtils.isAssignable(Double.TYPE, Short.TYPE), "double -> short");
1124         assertFalse(ClassUtils.isAssignable(Double.TYPE, Integer.TYPE), "double -> int");
1125         assertFalse(ClassUtils.isAssignable(Double.TYPE, Long.TYPE), "double -> long");
1126         assertFalse(ClassUtils.isAssignable(Double.TYPE, Float.TYPE), "double -> float");
1127         assertTrue(ClassUtils.isAssignable(Double.TYPE, Double.TYPE), "double -> double");
1128         assertFalse(ClassUtils.isAssignable(Double.TYPE, Boolean.TYPE), "double -> boolean");
1129         // test boolean conversions
1130         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Character.TYPE), "boolean -> char");
1131         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Byte.TYPE), "boolean -> byte");
1132         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Short.TYPE), "boolean -> short");
1133         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Integer.TYPE), "boolean -> int");
1134         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Long.TYPE), "boolean -> long");
1135         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Float.TYPE), "boolean -> float");
1136         assertFalse(ClassUtils.isAssignable(Boolean.TYPE, Double.TYPE), "boolean -> double");
1137         assertTrue(ClassUtils.isAssignable(Boolean.TYPE, Boolean.TYPE), "boolean -> boolean");
1138     }
1139 
1140     @Test
1141     void test_isInnerClass_Class() {
1142         assertTrue(ClassUtils.isInnerClass(Inner.class));
1143         assertTrue(ClassUtils.isInnerClass(Map.Entry.class));
1144         assertTrue(ClassUtils.isInnerClass(new Cloneable() {
1145             // empty
1146         }.getClass()));
1147         assertFalse(ClassUtils.isInnerClass(this.getClass()));
1148         assertFalse(ClassUtils.isInnerClass(String.class));
1149         assertFalse(ClassUtils.isInnerClass(null));
1150     }
1151 
1152     @Test
1153     void testComparable() {
1154         final TreeMap<Class<?>, String> map = new TreeMap<>(ClassUtils.comparator());
1155         map.put(String.class, "lastEntry");
1156         map.toString();
1157         map.put(Character.class, "firstEntry");
1158         map.toString();
1159         assertEquals("firstEntry", map.firstEntry().getValue());
1160         assertEquals(Character.class, map.firstEntry().getKey());
1161         //
1162         assertEquals("lastEntry", map.lastEntry().getValue());
1163         assertEquals(String.class, map.lastEntry().getKey());
1164         //
1165         map.put(null, "null");
1166         map.toString();
1167         assertEquals("null", map.get(null));
1168     }
1169 
1170     @Test
1171     void testConstructor() {
1172         assertNotNull(new ClassUtils());
1173         final Constructor<?>[] cons = ClassUtils.class.getDeclaredConstructors();
1174         assertEquals(1, cons.length);
1175         assertTrue(Modifier.isPublic(cons[0].getModifiers()));
1176         assertTrue(Modifier.isPublic(ClassUtils.class.getModifiers()));
1177         assertFalse(Modifier.isFinal(ClassUtils.class.getModifiers()));
1178     }
1179 
1180     @Test
1181     void testGetClassByNormalNameArrays() throws ClassNotFoundException {
1182         assertEquals(int[].class, ClassUtils.getClass("int[]"));
1183         assertEquals(long[].class, ClassUtils.getClass("long[]"));
1184         assertEquals(short[].class, ClassUtils.getClass("short[]"));
1185         assertEquals(byte[].class, ClassUtils.getClass("byte[]"));
1186         assertEquals(char[].class, ClassUtils.getClass("char[]"));
1187         assertEquals(float[].class, ClassUtils.getClass("float[]"));
1188         assertEquals(double[].class, ClassUtils.getClass("double[]"));
1189         assertEquals(boolean[].class, ClassUtils.getClass("boolean[]"));
1190         assertEquals(String[].class, ClassUtils.getClass("java.lang.String[]"));
1191         assertEquals(java.util.Map.Entry[].class, ClassUtils.getClass("java.util.Map.Entry[]"));
1192         assertEquals(java.util.Map.Entry[].class, ClassUtils.getClass("java.util.Map$Entry[]"));
1193         assertEquals(java.util.Map.Entry[].class, ClassUtils.getClass("[Ljava.util.Map.Entry;"));
1194         assertEquals(java.util.Map.Entry[].class, ClassUtils.getClass("[Ljava.util.Map$Entry;"));
1195     }
1196 
1197     @Test
1198     void testGetClassByNormalNameArrays2D() throws ClassNotFoundException {
1199         assertEquals(int[][].class, ClassUtils.getClass("int[][]"));
1200         assertEquals(long[][].class, ClassUtils.getClass("long[][]"));
1201         assertEquals(short[][].class, ClassUtils.getClass("short[][]"));
1202         assertEquals(byte[][].class, ClassUtils.getClass("byte[][]"));
1203         assertEquals(char[][].class, ClassUtils.getClass("char[][]"));
1204         assertEquals(float[][].class, ClassUtils.getClass("float[][]"));
1205         assertEquals(double[][].class, ClassUtils.getClass("double[][]"));
1206         assertEquals(boolean[][].class, ClassUtils.getClass("boolean[][]"));
1207         assertEquals(String[][].class, ClassUtils.getClass("java.lang.String[][]"));
1208     }
1209 
1210     @Test
1211     void testGetClassClassNotFound() throws Exception {
1212         assertGetClassThrowsClassNotFound("bool");
1213         assertGetClassThrowsClassNotFound("bool[]");
1214         assertGetClassThrowsClassNotFound("integer[]");
1215     }
1216 
1217     @Test
1218     void testGetClassInvalidArguments() throws Exception {
1219         assertGetClassThrowsNullPointerException(null);
1220         assertGetClassThrowsClassNotFound("[][][]");
1221         assertGetClassThrowsClassNotFound("[[]");
1222         assertGetClassThrowsClassNotFound("[");
1223         assertGetClassThrowsClassNotFound("java.lang.String][");
1224         assertGetClassThrowsClassNotFound(".hello.world");
1225         assertGetClassThrowsClassNotFound("hello..world");
1226     }
1227 
1228     @Test
1229     void testGetClassRawPrimitives() throws ClassNotFoundException {
1230         assertEquals(int.class, ClassUtils.getClass("int"));
1231         assertEquals(long.class, ClassUtils.getClass("long"));
1232         assertEquals(short.class, ClassUtils.getClass("short"));
1233         assertEquals(byte.class, ClassUtils.getClass("byte"));
1234         assertEquals(char.class, ClassUtils.getClass("char"));
1235         assertEquals(float.class, ClassUtils.getClass("float"));
1236         assertEquals(double.class, ClassUtils.getClass("double"));
1237         assertEquals(boolean.class, ClassUtils.getClass("boolean"));
1238         assertEquals(void.class, ClassUtils.getClass("void"));
1239     }
1240 
1241     @Test
1242     void testGetClassWithArrayClasses() throws Exception {
1243         assertGetClassReturnsClass(String[].class);
1244         assertGetClassReturnsClass(int[].class);
1245         assertGetClassReturnsClass(long[].class);
1246         assertGetClassReturnsClass(short[].class);
1247         assertGetClassReturnsClass(byte[].class);
1248         assertGetClassReturnsClass(char[].class);
1249         assertGetClassReturnsClass(float[].class);
1250         assertGetClassReturnsClass(double[].class);
1251         assertGetClassReturnsClass(boolean[].class);
1252     }
1253 
1254     @Test
1255     void testGetClassWithArrayClasses2D() throws Exception {
1256         assertGetClassReturnsClass(String[][].class);
1257         assertGetClassReturnsClass(int[][].class);
1258         assertGetClassReturnsClass(long[][].class);
1259         assertGetClassReturnsClass(short[][].class);
1260         assertGetClassReturnsClass(byte[][].class);
1261         assertGetClassReturnsClass(char[][].class);
1262         assertGetClassReturnsClass(float[][].class);
1263         assertGetClassReturnsClass(double[][].class);
1264         assertGetClassReturnsClass(boolean[][].class);
1265     }
1266 
1267     @Test
1268     void testGetComponentType() {
1269         final CX[] newArray = {};
1270         @SuppressWarnings("unchecked")
1271         final Class<CX[]> classCxArray = (Class<CX[]>) newArray.getClass();
1272         // No type-cast required.
1273         final Class<CX> componentType = ClassUtils.getComponentType(classCxArray);
1274         assertEquals(CX.class, componentType);
1275         assertNull(ClassUtils.getComponentType(null));
1276     }
1277 
1278     @Test
1279     void testGetInnerClass() throws ClassNotFoundException {
1280         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass("org.apache.commons.lang3.ClassUtilsTest.Inner.DeeplyNested"));
1281         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass("org.apache.commons.lang3.ClassUtilsTest.Inner$DeeplyNested"));
1282         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass("org.apache.commons.lang3.ClassUtilsTest$Inner$DeeplyNested"));
1283         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass("org.apache.commons.lang3.ClassUtilsTest$Inner.DeeplyNested"));
1284         //
1285         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass("org.apache.commons.lang3.ClassUtilsTest.Inner.DeeplyNested", true));
1286         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass("org.apache.commons.lang3.ClassUtilsTest.Inner$DeeplyNested", true));
1287         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass("org.apache.commons.lang3.ClassUtilsTest$Inner$DeeplyNested", true));
1288         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass("org.apache.commons.lang3.ClassUtilsTest$Inner.DeeplyNested", true));
1289         //
1290         final ClassLoader classLoader = Inner.DeeplyNested.class.getClassLoader();
1291         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass(classLoader, "org.apache.commons.lang3.ClassUtilsTest.Inner.DeeplyNested"));
1292         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass(classLoader, "org.apache.commons.lang3.ClassUtilsTest.Inner$DeeplyNested"));
1293         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass(classLoader, "org.apache.commons.lang3.ClassUtilsTest$Inner$DeeplyNested"));
1294         assertEquals(Inner.DeeplyNested.class, ClassUtils.getClass(classLoader, "org.apache.commons.lang3.ClassUtilsTest$Inner.DeeplyNested"));
1295         //
1296     }
1297 
1298     @Test
1299     void testGetPublicMethod() throws Exception {
1300         // Tests with Collections$UnmodifiableSet
1301         final Set<?> set = Collections.unmodifiableSet(new HashSet<>());
1302         final Method isEmptyMethod = ClassUtils.getPublicMethod(set.getClass(), "isEmpty");
1303         assertTrue(Modifier.isPublic(isEmptyMethod.getDeclaringClass().getModifiers()));
1304         assertTrue((Boolean) isEmptyMethod.invoke(set));
1305 
1306         // Tests with a public Class
1307         final Method toStringMethod = ClassUtils.getPublicMethod(Object.class, "toString");
1308         assertEquals(Object.class.getMethod("toString"), toStringMethod);
1309     }
1310 
1311     @Test
1312     void testHierarchyExcludingInterfaces() {
1313         final Iterator<Class<?>> iter = ClassUtils.hierarchy(StringParameterizedChild.class).iterator();
1314         assertEquals(StringParameterizedChild.class, iter.next());
1315         assertEquals(GenericParent.class, iter.next());
1316         assertEquals(Object.class, iter.next());
1317         assertFalse(iter.hasNext());
1318     }
1319 
1320     @Test
1321     void testHierarchyIncludingInterfaces() {
1322         final Iterator<Class<?>> iter = ClassUtils.hierarchy(StringParameterizedChild.class, Interfaces.INCLUDE).iterator();
1323         assertEquals(StringParameterizedChild.class, iter.next());
1324         assertEquals(GenericParent.class, iter.next());
1325         assertEquals(GenericConsumer.class, iter.next());
1326         assertEquals(Object.class, iter.next());
1327         assertFalse(iter.hasNext());
1328     }
1329 
1330     @Test
1331     void testIsPrimitiveOrWrapper() {
1332         // test primitive wrapper classes
1333         assertTrue(ClassUtils.isPrimitiveOrWrapper(Boolean.class), "Boolean.class");
1334         assertTrue(ClassUtils.isPrimitiveOrWrapper(Byte.class), "Byte.class");
1335         assertTrue(ClassUtils.isPrimitiveOrWrapper(Character.class), "Character.class");
1336         assertTrue(ClassUtils.isPrimitiveOrWrapper(Short.class), "Short.class");
1337         assertTrue(ClassUtils.isPrimitiveOrWrapper(Integer.class), "Integer.class");
1338         assertTrue(ClassUtils.isPrimitiveOrWrapper(Long.class), "Long.class");
1339         assertTrue(ClassUtils.isPrimitiveOrWrapper(Double.class), "Double.class");
1340         assertTrue(ClassUtils.isPrimitiveOrWrapper(Float.class), "Float.class");
1341         // test primitive classes
1342         assertTrue(ClassUtils.isPrimitiveOrWrapper(Boolean.TYPE), "boolean");
1343         assertTrue(ClassUtils.isPrimitiveOrWrapper(Byte.TYPE), "byte");
1344         assertTrue(ClassUtils.isPrimitiveOrWrapper(Character.TYPE), "char");
1345         assertTrue(ClassUtils.isPrimitiveOrWrapper(Short.TYPE), "short");
1346         assertTrue(ClassUtils.isPrimitiveOrWrapper(Integer.TYPE), "int");
1347         assertTrue(ClassUtils.isPrimitiveOrWrapper(Long.TYPE), "long");
1348         assertTrue(ClassUtils.isPrimitiveOrWrapper(Double.TYPE), "double");
1349         assertTrue(ClassUtils.isPrimitiveOrWrapper(Float.TYPE), "float");
1350         assertTrue(ClassUtils.isPrimitiveOrWrapper(Void.TYPE), "Void.TYPE");
1351         // others
1352         assertFalse(ClassUtils.isPrimitiveOrWrapper(null), "null");
1353         assertFalse(ClassUtils.isPrimitiveOrWrapper(Void.class), "Void.class");
1354         assertFalse(ClassUtils.isPrimitiveOrWrapper(String.class), "String.class");
1355         assertFalse(ClassUtils.isPrimitiveOrWrapper(this.getClass()), "this.getClass()");
1356     }
1357 
1358     @Test
1359     void testIsPrimitiveWrapper() {
1360 
1361         // test primitive wrapper classes
1362         assertTrue(ClassUtils.isPrimitiveWrapper(Boolean.class), "Boolean.class");
1363         assertTrue(ClassUtils.isPrimitiveWrapper(Byte.class), "Byte.class");
1364         assertTrue(ClassUtils.isPrimitiveWrapper(Character.class), "Character.class");
1365         assertTrue(ClassUtils.isPrimitiveWrapper(Short.class), "Short.class");
1366         assertTrue(ClassUtils.isPrimitiveWrapper(Integer.class), "Integer.class");
1367         assertTrue(ClassUtils.isPrimitiveWrapper(Long.class), "Long.class");
1368         assertTrue(ClassUtils.isPrimitiveWrapper(Double.class), "Double.class");
1369         assertTrue(ClassUtils.isPrimitiveWrapper(Float.class), "Float.class");
1370 
1371         // test primitive classes
1372         assertFalse(ClassUtils.isPrimitiveWrapper(Boolean.TYPE), "boolean");
1373         assertFalse(ClassUtils.isPrimitiveWrapper(Byte.TYPE), "byte");
1374         assertFalse(ClassUtils.isPrimitiveWrapper(Character.TYPE), "char");
1375         assertFalse(ClassUtils.isPrimitiveWrapper(Short.TYPE), "short");
1376         assertFalse(ClassUtils.isPrimitiveWrapper(Integer.TYPE), "int");
1377         assertFalse(ClassUtils.isPrimitiveWrapper(Long.TYPE), "long");
1378         assertFalse(ClassUtils.isPrimitiveWrapper(Double.TYPE), "double");
1379         assertFalse(ClassUtils.isPrimitiveWrapper(Float.TYPE), "float");
1380 
1381         // others
1382         assertFalse(ClassUtils.isPrimitiveWrapper(null), "null");
1383         assertFalse(ClassUtils.isPrimitiveWrapper(Void.class), "Void.class");
1384         assertFalse(ClassUtils.isPrimitiveWrapper(Void.TYPE), "Void.TYPE");
1385         assertFalse(ClassUtils.isPrimitiveWrapper(String.class), "String.class");
1386         assertFalse(ClassUtils.isPrimitiveWrapper(this.getClass()), "this.getClass()");
1387     }
1388 
1389     @Test
1390     void testPrimitivesToWrappers() {
1391         // test null
1392 //        assertNull("null -> null", ClassUtils.primitivesToWrappers(null)); // generates warning
1393         assertNull(ClassUtils.primitivesToWrappers((Class<?>[]) null), "null -> null"); // equivalent cast to avoid warning
1394         // Other possible casts for null
1395         assertArrayEquals(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.primitivesToWrappers(), "empty -> empty");
1396         final Class<?>[] castNull = ClassUtils.primitivesToWrappers((Class<?>) null); // == new Class<?>[]{null}
1397         assertArrayEquals(new Class<?>[] {null}, castNull, "(Class<?>) null -> [null]");
1398         // test empty array is returned unchanged
1399         assertArrayEquals(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.primitivesToWrappers(ArrayUtils.EMPTY_CLASS_ARRAY), "empty -> empty");
1400 
1401         // test an array of various classes
1402         final Class<?>[] primitives = new Class[] {Boolean.TYPE, Byte.TYPE, Character.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Double.TYPE, Float.TYPE,
1403             String.class, ClassUtils.class};
1404         final Class<?>[] wrappers = ClassUtils.primitivesToWrappers(primitives);
1405 
1406         for (int i = 0; i < primitives.length; i++) {
1407             // test each returned wrapper
1408             final Class<?> primitive = primitives[i];
1409             final Class<?> expectedWrapper = ClassUtils.primitiveToWrapper(primitive);
1410 
1411             assertEquals(expectedWrapper, wrappers[i], primitive + " -> " + expectedWrapper);
1412         }
1413 
1414         // test an array of no primitive classes
1415         final Class<?>[] noPrimitives = new Class[] {String.class, ClassUtils.class, Void.TYPE};
1416         // This used to return the exact same array, but no longer does.
1417         assertNotSame(noPrimitives, ClassUtils.primitivesToWrappers(noPrimitives), "unmodified");
1418     }
1419 
1420     @Test
1421     void testPrimitiveToWrapper() {
1422 
1423         // test primitive classes
1424         assertEquals(Boolean.class, ClassUtils.primitiveToWrapper(Boolean.TYPE), "boolean -> Boolean.class");
1425         assertEquals(Byte.class, ClassUtils.primitiveToWrapper(Byte.TYPE), "byte -> Byte.class");
1426         assertEquals(Character.class, ClassUtils.primitiveToWrapper(Character.TYPE), "char -> Character.class");
1427         assertEquals(Short.class, ClassUtils.primitiveToWrapper(Short.TYPE), "short -> Short.class");
1428         assertEquals(Integer.class, ClassUtils.primitiveToWrapper(Integer.TYPE), "int -> Integer.class");
1429         assertEquals(Long.class, ClassUtils.primitiveToWrapper(Long.TYPE), "long -> Long.class");
1430         assertEquals(Double.class, ClassUtils.primitiveToWrapper(Double.TYPE), "double -> Double.class");
1431         assertEquals(Float.class, ClassUtils.primitiveToWrapper(Float.TYPE), "float -> Float.class");
1432 
1433         // test a few other classes
1434         assertEquals(String.class, ClassUtils.primitiveToWrapper(String.class), "String.class -> String.class");
1435         assertEquals(ClassUtils.class, ClassUtils.primitiveToWrapper(ClassUtils.class), "ClassUtils.class -> ClassUtils.class");
1436         assertEquals(Void.TYPE, ClassUtils.primitiveToWrapper(Void.TYPE), "Void.TYPE -> Void.TYPE");
1437 
1438         // test null
1439         assertNull(ClassUtils.primitiveToWrapper(null), "null -> null");
1440     }
1441 
1442     // Show the Java bug: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4071957
1443     // We may have to delete this if a JDK fixes the bug.
1444     @Test
1445     void testShowJavaBug() throws Exception {
1446         // Tests with Collections$UnmodifiableSet
1447         final Set<?> set = Collections.unmodifiableSet(new HashSet<>());
1448         final Method isEmptyMethod = set.getClass().getMethod("isEmpty");
1449         assertThrows(IllegalAccessException.class, () -> isEmptyMethod.invoke(set));
1450     }
1451 
1452     @Test
1453     void testToClass_object() {
1454 //        assertNull(ClassUtils.toClass(null)); // generates warning
1455         assertNull(ClassUtils.toClass((Object[]) null)); // equivalent explicit cast
1456 
1457         // Additional varargs tests
1458         assertArrayEquals(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.toClass(), "empty -> empty");
1459         final Class<?>[] castNull = ClassUtils.toClass((Object) null); // == new Object[]{null}
1460         assertArrayEquals(new Object[] {null}, castNull, "(Object) null -> [null]");
1461 
1462         assertSame(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.toClass(ArrayUtils.EMPTY_OBJECT_ARRAY));
1463 
1464         assertArrayEquals(new Class[] {String.class, Integer.class, Double.class}, ClassUtils.toClass("Test", Integer.valueOf(1), Double.valueOf(99d)));
1465 
1466         assertArrayEquals(new Class[] {String.class, null, Double.class}, ClassUtils.toClass("Test", null, Double.valueOf(99d)));
1467     }
1468 
1469     @Test
1470     void testWithInterleavingWhitespace() throws ClassNotFoundException {
1471         assertEquals(int[].class, ClassUtils.getClass(" int [ ] "));
1472         assertEquals(long[].class, ClassUtils.getClass("\rlong\t[\n]\r"));
1473         assertEquals(short[].class, ClassUtils.getClass("\tshort                \t\t[]"));
1474         assertEquals(byte[].class, ClassUtils.getClass("byte[\t\t\n\r]   "));
1475     }
1476 
1477     @Test
1478     void testWrappersToPrimitives() {
1479         // an array with classes to test
1480         final Class<?>[] classes = {Boolean.class, Byte.class, Character.class, Short.class, Integer.class, Long.class, Float.class, Double.class, String.class,
1481             ClassUtils.class, null};
1482 
1483         final Class<?>[] primitives = ClassUtils.wrappersToPrimitives(classes);
1484         // now test the result
1485         assertEquals(classes.length, primitives.length, "Wrong length of result array");
1486         for (int i = 0; i < classes.length; i++) {
1487             final Class<?> expectedPrimitive = ClassUtils.wrapperToPrimitive(classes[i]);
1488             assertEquals(expectedPrimitive, primitives[i], classes[i] + " -> " + expectedPrimitive);
1489         }
1490     }
1491 
1492     @Test
1493     void testWrappersToPrimitivesEmpty() {
1494         final Class<?>[] empty = new Class[0];
1495         assertArrayEquals(empty, ClassUtils.wrappersToPrimitives(empty), "Wrong result for empty input");
1496     }
1497 
1498     @Test
1499     void testWrappersToPrimitivesNull() {
1500 //        assertNull("Wrong result for null input", ClassUtils.wrappersToPrimitives(null)); // generates warning
1501         assertNull(ClassUtils.wrappersToPrimitives((Class<?>[]) null), "Wrong result for null input"); // equivalent cast
1502         // Other possible casts for null
1503         assertArrayEquals(ArrayUtils.EMPTY_CLASS_ARRAY, ClassUtils.wrappersToPrimitives(), "empty -> empty");
1504         final Class<?>[] castNull = ClassUtils.wrappersToPrimitives((Class<?>) null); // == new Class<?>[]{null}
1505         assertArrayEquals(new Class<?>[] {null}, castNull, "(Class<?>) null -> [null]");
1506     }
1507 
1508     @Test
1509     void testWrapperToPrimitive() {
1510         // an array with classes to convert
1511         final Class<?>[] primitives = {Boolean.TYPE, Byte.TYPE, Character.TYPE, Short.TYPE, Integer.TYPE, Long.TYPE, Float.TYPE, Double.TYPE};
1512         for (final Class<?> primitive : primitives) {
1513             final Class<?> wrapperCls = ClassUtils.primitiveToWrapper(primitive);
1514             assertFalse(wrapperCls.isPrimitive(), "Still primitive");
1515             assertEquals(primitive, ClassUtils.wrapperToPrimitive(wrapperCls), wrapperCls + " -> " + primitive);
1516         }
1517     }
1518 
1519     @Test
1520     void testWrapperToPrimitiveNoWrapper() {
1521         assertNull(ClassUtils.wrapperToPrimitive(String.class), "Wrong result for non wrapper class");
1522     }
1523 
1524     @Test
1525     void testWrapperToPrimitiveNull() {
1526         assertNull(ClassUtils.wrapperToPrimitive(null), "Wrong result for null class");
1527     }
1528 }