View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.commons.lang3;
20  
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.assertNull;
24  import static org.junit.jupiter.api.Assertions.assertThrows;
25  import static org.junit.jupiter.api.Assertions.assertTrue;
26  
27  import java.util.ArrayList;
28  import java.util.Arrays;
29  import java.util.EnumSet;
30  import java.util.HashMap;
31  import java.util.List;
32  import java.util.Map;
33  import java.util.function.Function;
34  
35  import org.junit.jupiter.api.Assertions;
36  import org.junit.jupiter.api.Test;
37  
38  enum Enum64 {
39      A00, A01, A02, A03, A04, A05, A06, A07, A08, A09, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22,
40      A23, A24, A25, A26, A27, A28, A29, A30, A31, A32, A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43, A44, A45,
41      A46, A47, A48, A49, A50, A51, A52, A53, A54, A55, A56, A57, A58, A59, A60, A61, A62, A63
42  }
43  
44  /**
45   */
46  public class EnumUtilsTest extends AbstractLangTest {
47  
48      private void assertArrayEquals(final long[] actual, final long... expected) {
49          Assertions.assertArrayEquals(expected, actual);
50      }
51  
52      @Test
53      public void test_generateBitVector() {
54          assertEquals(0L, EnumUtils.generateBitVector(Traffic.class, EnumSet.noneOf(Traffic.class)));
55          assertEquals(1L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.RED)));
56          assertEquals(2L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.AMBER)));
57          assertEquals(4L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.GREEN)));
58          assertEquals(3L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.RED, Traffic.AMBER)));
59          assertEquals(5L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.RED, Traffic.GREEN)));
60          assertEquals(6L, EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.AMBER, Traffic.GREEN)));
61          assertEquals(7L,
62              EnumUtils.generateBitVector(Traffic.class, EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN)));
63  
64          // 64 values Enum (to test whether no int<->long jdk conversion issue exists)
65          assertEquals(1L << 31, EnumUtils.generateBitVector(Enum64.class, EnumSet.of(Enum64.A31)));
66          assertEquals(1L << 32, EnumUtils.generateBitVector(Enum64.class, EnumSet.of(Enum64.A32)));
67          assertEquals(1L << 63, EnumUtils.generateBitVector(Enum64.class, EnumSet.of(Enum64.A63)));
68          assertEquals(Long.MIN_VALUE, EnumUtils.generateBitVector(Enum64.class, EnumSet.of(Enum64.A63)));
69      }
70  
71      @Test
72      public void test_generateBitVector_longClass() {
73          assertThrows(IllegalArgumentException.class,
74              () -> EnumUtils.generateBitVector(TooMany.class, EnumSet.of(TooMany.A1)));
75      }
76  
77      @Test
78      public void test_generateBitVector_longClassWithArray() {
79          assertThrows(IllegalArgumentException.class, () -> EnumUtils.generateBitVector(TooMany.class, TooMany.A1));
80      }
81  
82      @SuppressWarnings("unchecked")
83      @Test
84      public void test_generateBitVector_nonEnumClass() {
85          @SuppressWarnings("rawtypes")
86          final Class rawType = Object.class;
87          @SuppressWarnings("rawtypes")
88          final List rawList = new ArrayList();
89          assertThrows(IllegalArgumentException.class, () -> EnumUtils.generateBitVector(rawType, rawList));
90      }
91  
92      @SuppressWarnings("unchecked")
93      @Test
94      public void test_generateBitVector_nonEnumClassWithArray() {
95          @SuppressWarnings("rawtypes")
96          final Class rawType = Object.class;
97          assertThrows(IllegalArgumentException.class, () -> EnumUtils.generateBitVector(rawType));
98      }
99  
100     @Test
101     public void test_generateBitVector_nullArray() {
102         assertThrows(NullPointerException.class, () -> EnumUtils.generateBitVector(Traffic.class, (Traffic[]) null));
103     }
104 
105     @Test
106     public void test_generateBitVector_nullArrayElement() {
107         assertThrows(IllegalArgumentException.class,
108             () -> EnumUtils.generateBitVector(Traffic.class, Traffic.RED, null));
109     }
110 
111     @Test
112     public void test_generateBitVector_nullClass() {
113         assertThrows(NullPointerException.class, () -> EnumUtils.generateBitVector(null, EnumSet.of(Traffic.RED)));
114     }
115 
116     @Test
117     public void test_generateBitVector_nullClassWithArray() {
118         assertThrows(NullPointerException.class, () -> EnumUtils.generateBitVector(null, Traffic.RED));
119     }
120 
121     @Test
122     public void test_generateBitVector_nullElement() {
123         assertThrows(NullPointerException.class,
124             () -> EnumUtils.generateBitVector(Traffic.class, Arrays.asList(Traffic.RED, null)));
125     }
126 
127     @Test
128     public void test_generateBitVector_nullIterable() {
129         assertThrows(NullPointerException.class,
130             () -> EnumUtils.generateBitVector(Traffic.class, (Iterable<Traffic>) null));
131     }
132 
133     @Test
134     public void test_generateBitVectorFromArray() {
135         assertEquals(0L, EnumUtils.generateBitVector(Traffic.class));
136         assertEquals(1L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED));
137         assertEquals(2L, EnumUtils.generateBitVector(Traffic.class, Traffic.AMBER));
138         assertEquals(4L, EnumUtils.generateBitVector(Traffic.class, Traffic.GREEN));
139         assertEquals(3L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED, Traffic.AMBER));
140         assertEquals(5L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED, Traffic.GREEN));
141         assertEquals(6L, EnumUtils.generateBitVector(Traffic.class, Traffic.AMBER, Traffic.GREEN));
142         assertEquals(7L, EnumUtils.generateBitVector(Traffic.class, Traffic.RED, Traffic.AMBER, Traffic.GREEN));
143         // gracefully handles duplicates:
144         assertEquals(7L,
145             EnumUtils.generateBitVector(Traffic.class, Traffic.RED, Traffic.AMBER, Traffic.GREEN, Traffic.GREEN));
146 
147         // 64 values Enum (to test whether no int<->long jdk conversion issue exists)
148         assertEquals(1L << 31, EnumUtils.generateBitVector(Enum64.class, Enum64.A31));
149         assertEquals(1L << 32, EnumUtils.generateBitVector(Enum64.class, Enum64.A32));
150         assertEquals(1L << 63, EnumUtils.generateBitVector(Enum64.class, Enum64.A63));
151         assertEquals(Long.MIN_VALUE, EnumUtils.generateBitVector(Enum64.class, Enum64.A63));
152     }
153 
154     @Test
155     public void test_generateBitVectors() {
156         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.noneOf(Traffic.class)), 0L);
157         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.RED)), 1L);
158         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.AMBER)), 2L);
159         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.GREEN)), 4L);
160         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.RED, Traffic.AMBER)), 3L);
161         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.RED, Traffic.GREEN)), 5L);
162         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.AMBER, Traffic.GREEN)), 6L);
163         assertArrayEquals(
164             EnumUtils.generateBitVectors(Traffic.class, EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN)), 7L);
165 
166         // 64 values Enum (to test whether no int<->long jdk conversion issue exists)
167         assertArrayEquals(EnumUtils.generateBitVectors(Enum64.class, EnumSet.of(Enum64.A31)), 1L << 31);
168         assertArrayEquals(EnumUtils.generateBitVectors(Enum64.class, EnumSet.of(Enum64.A32)), 1L << 32);
169         assertArrayEquals(EnumUtils.generateBitVectors(Enum64.class, EnumSet.of(Enum64.A63)), 1L << 63);
170         assertArrayEquals(EnumUtils.generateBitVectors(Enum64.class, EnumSet.of(Enum64.A63)), Long.MIN_VALUE);
171 
172         // More than 64 values Enum
173         assertArrayEquals(EnumUtils.generateBitVectors(TooMany.class, EnumSet.of(TooMany.M2)), 1L, 0L);
174         assertArrayEquals(EnumUtils.generateBitVectors(TooMany.class, EnumSet.of(TooMany.L2, TooMany.M2)), 1L,
175             1L << 63);
176     }
177 
178     @SuppressWarnings("unchecked")
179     @Test
180     public void test_generateBitVectors_nonEnumClass() {
181         @SuppressWarnings("rawtypes")
182         final Class rawType = Object.class;
183         @SuppressWarnings("rawtypes")
184         final List rawList = new ArrayList();
185         assertThrows(IllegalArgumentException.class, () -> EnumUtils.generateBitVectors(rawType, rawList));
186     }
187 
188     @SuppressWarnings("unchecked")
189     @Test
190     public void test_generateBitVectors_nonEnumClassWithArray() {
191         @SuppressWarnings("rawtypes")
192         final Class rawType = Object.class;
193         assertThrows(IllegalArgumentException.class, () -> EnumUtils.generateBitVectors(rawType));
194     }
195 
196     @Test
197     public void test_generateBitVectors_nullArray() {
198         assertThrows(NullPointerException.class, () -> EnumUtils.generateBitVectors(Traffic.class, (Traffic[]) null));
199     }
200 
201     @Test
202     public void test_generateBitVectors_nullArrayElement() {
203         assertThrows(IllegalArgumentException.class,
204             () -> EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, null));
205     }
206 
207     @Test
208     public void test_generateBitVectors_nullClass() {
209         assertThrows(NullPointerException.class, () -> EnumUtils.generateBitVectors(null, EnumSet.of(Traffic.RED)));
210     }
211 
212     @Test
213     public void test_generateBitVectors_nullClassWithArray() {
214         assertThrows(NullPointerException.class, () -> EnumUtils.generateBitVectors(null, Traffic.RED));
215     }
216 
217     @Test
218     public void test_generateBitVectors_nullElement() {
219         assertThrows(NullPointerException.class,
220             () -> EnumUtils.generateBitVectors(Traffic.class, Arrays.asList(Traffic.RED, null)));
221     }
222 
223     @Test
224     public void test_generateBitVectors_nullIterable() {
225         assertThrows(NullPointerException.class, () -> EnumUtils.generateBitVectors(null, (Iterable<Traffic>) null));
226     }
227 
228     @Test
229     public void test_generateBitVectorsFromArray() {
230         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class), 0L);
231         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED), 1L);
232         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.AMBER), 2L);
233         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.GREEN), 4L);
234         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, Traffic.AMBER), 3L);
235         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, Traffic.GREEN), 5L);
236         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.AMBER, Traffic.GREEN), 6L);
237         assertArrayEquals(EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, Traffic.AMBER, Traffic.GREEN), 7L);
238         // gracefully handles duplicates:
239         assertArrayEquals(
240             EnumUtils.generateBitVectors(Traffic.class, Traffic.RED, Traffic.AMBER, Traffic.GREEN, Traffic.GREEN), 7L);
241 
242         // 64 values Enum (to test whether no int<->long jdk conversion issue exists)
243         assertArrayEquals(EnumUtils.generateBitVectors(Enum64.class, Enum64.A31), 1L << 31);
244         assertArrayEquals(EnumUtils.generateBitVectors(Enum64.class, Enum64.A32), 1L << 32);
245         assertArrayEquals(EnumUtils.generateBitVectors(Enum64.class, Enum64.A63), 1L << 63);
246         assertArrayEquals(EnumUtils.generateBitVectors(Enum64.class, Enum64.A63), Long.MIN_VALUE);
247 
248         // More than 64 values Enum
249         assertArrayEquals(EnumUtils.generateBitVectors(TooMany.class, TooMany.M2), 1L, 0L);
250         assertArrayEquals(EnumUtils.generateBitVectors(TooMany.class, TooMany.L2, TooMany.M2), 1L, 1L << 63);
251 
252     }
253 
254     @Test
255     public void test_getEnum() {
256         assertEquals(Traffic.RED, EnumUtils.getEnum(Traffic.class, "RED"));
257         assertEquals(Traffic.AMBER, EnumUtils.getEnum(Traffic.class, "AMBER"));
258         assertEquals(Traffic.GREEN, EnumUtils.getEnum(Traffic.class, "GREEN"));
259         assertNull(EnumUtils.getEnum(Traffic.class, "PURPLE"));
260         assertNull(EnumUtils.getEnum(Traffic.class, null));
261     }
262 
263     @Test
264     public void test_getEnum_defaultEnum() {
265         assertEquals(Traffic.RED, EnumUtils.getEnum(Traffic.class, "RED", Traffic.AMBER));
266         assertEquals(Traffic.AMBER, EnumUtils.getEnum(Traffic.class, "AMBER", Traffic.GREEN));
267         assertEquals(Traffic.GREEN, EnumUtils.getEnum(Traffic.class, "GREEN", Traffic.RED));
268         assertEquals(Traffic.AMBER, EnumUtils.getEnum(Traffic.class, "PURPLE", Traffic.AMBER));
269         assertEquals(Traffic.GREEN, EnumUtils.getEnum(Traffic.class, "PURPLE", Traffic.GREEN));
270         assertEquals(Traffic.RED, EnumUtils.getEnum(Traffic.class, "PURPLE", Traffic.RED));
271         assertEquals(Traffic.AMBER, EnumUtils.getEnum(Traffic.class, null, Traffic.AMBER));
272         assertEquals(Traffic.GREEN, EnumUtils.getEnum(Traffic.class, null, Traffic.GREEN));
273         assertEquals(Traffic.RED, EnumUtils.getEnum(Traffic.class, null, Traffic.RED));
274         assertNull(EnumUtils.getEnum(Traffic.class, "PURPLE", null));
275     }
276 
277     /**
278      * Tests raw type.
279      */
280     @SuppressWarnings("unchecked")
281     @Test
282     public void test_getEnum_nonEnumClass() {
283         @SuppressWarnings("rawtypes")
284         final Class rawType = Object.class;
285         assertNull(EnumUtils.getEnum(rawType, "rawType"));
286     }
287 
288     @Test
289     public void test_getEnum_nullClass() {
290         assertThrows(NullPointerException.class, () -> EnumUtils.getEnum((Class<Traffic>) null, "PURPLE"));
291     }
292 
293     @Test
294     public void test_getEnumIgnoreCase() {
295         assertEquals(Traffic.RED, EnumUtils.getEnumIgnoreCase(Traffic.class, "red"));
296         assertEquals(Traffic.AMBER, EnumUtils.getEnumIgnoreCase(Traffic.class, "Amber"));
297         assertEquals(Traffic.GREEN, EnumUtils.getEnumIgnoreCase(Traffic.class, "grEEn"));
298         assertNull(EnumUtils.getEnumIgnoreCase(Traffic.class, "purple"));
299         assertNull(EnumUtils.getEnumIgnoreCase(Traffic.class, null));
300     }
301 
302     @Test
303     public void test_getEnumIgnoreCase_defaultEnum() {
304         assertEquals(Traffic.RED, EnumUtils.getEnumIgnoreCase(Traffic.class, "red", Traffic.AMBER));
305         assertEquals(Traffic.AMBER, EnumUtils.getEnumIgnoreCase(Traffic.class, "Amber", Traffic.GREEN));
306         assertEquals(Traffic.GREEN, EnumUtils.getEnumIgnoreCase(Traffic.class, "grEEn", Traffic.RED));
307         assertEquals(Traffic.AMBER, EnumUtils.getEnumIgnoreCase(Traffic.class, "PURPLE", Traffic.AMBER));
308         assertEquals(Traffic.GREEN, EnumUtils.getEnumIgnoreCase(Traffic.class, "purple", Traffic.GREEN));
309         assertEquals(Traffic.RED, EnumUtils.getEnumIgnoreCase(Traffic.class, "pUrPlE", Traffic.RED));
310         assertEquals(Traffic.AMBER, EnumUtils.getEnumIgnoreCase(Traffic.class, null, Traffic.AMBER));
311         assertEquals(Traffic.GREEN, EnumUtils.getEnumIgnoreCase(Traffic.class, null, Traffic.GREEN));
312         assertEquals(Traffic.RED, EnumUtils.getEnumIgnoreCase(Traffic.class, null, Traffic.RED));
313         assertNull(EnumUtils.getEnumIgnoreCase(Traffic.class, "PURPLE", null));
314     }
315 
316     /**
317      * Tests raw type.
318      */
319     @SuppressWarnings("unchecked")
320     @Test
321     public void test_getEnumIgnoreCase_nonEnumClass() {
322         @SuppressWarnings("rawtypes")
323         final Class rawType = Object.class;
324         assertNull(EnumUtils.getEnumIgnoreCase(rawType, "rawType"));
325     }
326 
327     @Test
328     public void test_getEnumIgnoreCase_nullClass() {
329         assertThrows(NullPointerException.class, () -> EnumUtils.getEnumIgnoreCase((Class<Traffic>) null, "PURPLE"));
330     }
331 
332     @Test
333     public void test_getEnumList() {
334         final List<Traffic> test = EnumUtils.getEnumList(Traffic.class);
335         assertEquals(3, test.size());
336         assertEquals(Traffic.RED, test.get(0));
337         assertEquals(Traffic.AMBER, test.get(1));
338         assertEquals(Traffic.GREEN, test.get(2));
339     }
340 
341     @Test
342     public void test_getEnumMap() {
343         final Map<String, Traffic> test = EnumUtils.getEnumMap(Traffic.class);
344         final Map<String, Traffic> expected = new HashMap<>();
345         expected.put("RED", Traffic.RED);
346         expected.put("AMBER", Traffic.AMBER);
347         expected.put("GREEN", Traffic.GREEN);
348         assertEquals(expected, test, "getEnumMap not created correctly");
349         assertEquals(3, test.size());
350         assertTrue(test.containsKey("RED"));
351         assertEquals(Traffic.RED, test.get("RED"));
352         assertTrue(test.containsKey("AMBER"));
353         assertEquals(Traffic.AMBER, test.get("AMBER"));
354         assertTrue(test.containsKey("GREEN"));
355         assertEquals(Traffic.GREEN, test.get("GREEN"));
356         assertFalse(test.containsKey("PURPLE"));
357     }
358 
359     @Test
360     public void test_getEnumMap_keyFunction() {
361         final Map<Integer, Month> test = EnumUtils.getEnumMap(Month.class, Month::getId);
362         final Map<Integer, Month> expected = new HashMap<>();
363         expected.put(1, Month.JAN);
364         expected.put(2, Month.FEB);
365         expected.put(3, Month.MAR);
366         expected.put(4, Month.APR);
367         expected.put(5, Month.MAY);
368         expected.put(6, Month.JUN);
369         expected.put(7, Month.JUL);
370         expected.put(8, Month.AUG);
371         expected.put(9, Month.SEP);
372         expected.put(10, Month.OCT);
373         expected.put(11, Month.NOV);
374         expected.put(12, Month.DEC);
375         assertEquals(expected, test, "getEnumMap not created correctly");
376         assertEquals(12, test.size());
377         assertFalse(test.containsKey(0));
378         assertTrue(test.containsKey(1));
379         assertEquals(Month.JAN, test.get(1));
380         assertTrue(test.containsKey(2));
381         assertEquals(Month.FEB, test.get(2));
382         assertTrue(test.containsKey(3));
383         assertEquals(Month.MAR, test.get(3));
384         assertTrue(test.containsKey(4));
385         assertEquals(Month.APR, test.get(4));
386         assertTrue(test.containsKey(5));
387         assertEquals(Month.MAY, test.get(5));
388         assertTrue(test.containsKey(6));
389         assertEquals(Month.JUN, test.get(6));
390         assertTrue(test.containsKey(7));
391         assertEquals(Month.JUL, test.get(7));
392         assertTrue(test.containsKey(8));
393         assertEquals(Month.AUG, test.get(8));
394         assertTrue(test.containsKey(9));
395         assertEquals(Month.SEP, test.get(9));
396         assertTrue(test.containsKey(10));
397         assertEquals(Month.OCT, test.get(10));
398         assertTrue(test.containsKey(11));
399         assertEquals(Month.NOV, test.get(11));
400         assertTrue(test.containsKey(12));
401         assertEquals(Month.DEC, test.get(12));
402         assertFalse(test.containsKey(13));
403     }
404 
405     @Test
406     public void test_getEnumSystemProperty() {
407         final String key = getClass().getName();
408         System.setProperty(key, Traffic.RED.toString());
409         try {
410             assertEquals(Traffic.RED, EnumUtils.getEnumSystemProperty(Traffic.class, key, null));
411             assertEquals(Traffic.RED, EnumUtils.getEnumSystemProperty(Traffic.class, "?", Traffic.RED));
412             assertEquals(Traffic.RED, EnumUtils.getEnumSystemProperty(null, null, Traffic.RED));
413             assertEquals(Traffic.RED, EnumUtils.getEnumSystemProperty(null, "?", Traffic.RED));
414             assertEquals(Traffic.RED, EnumUtils.getEnumSystemProperty(Traffic.class, null, Traffic.RED));
415         } finally {
416             System.getProperties().remove(key);
417         }
418     }
419 
420     @Test
421     public void test_getFirstEnumIgnoreCase_defaultEnum() {
422         final Function<Traffic2, String> f = Traffic2::getLabel;
423         assertEquals(Traffic2.RED, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, "***red***", f, Traffic2.AMBER));
424         assertEquals(Traffic2.AMBER, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, "**Amber**", f, Traffic2.GREEN));
425         assertEquals(Traffic2.GREEN, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, "*grEEn*", f, Traffic2.RED));
426         assertEquals(Traffic2.AMBER, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, "PURPLE", f, Traffic2.AMBER));
427         assertEquals(Traffic2.GREEN, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, "purple", f, Traffic2.GREEN));
428         assertEquals(Traffic2.RED, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, "pUrPlE", f, Traffic2.RED));
429         assertEquals(Traffic2.AMBER, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, null, f, Traffic2.AMBER));
430         assertEquals(Traffic2.GREEN, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, null, f, Traffic2.GREEN));
431         assertEquals(Traffic2.RED, EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, null, f, Traffic2.RED));
432         assertNull(EnumUtils.getFirstEnumIgnoreCase(Traffic2.class, "PURPLE", f, null));
433     }
434 
435     @Test
436     public void test_isValidEnum() {
437         assertTrue(EnumUtils.isValidEnum(Traffic.class, "RED"));
438         assertTrue(EnumUtils.isValidEnum(Traffic.class, "AMBER"));
439         assertTrue(EnumUtils.isValidEnum(Traffic.class, "GREEN"));
440         assertFalse(EnumUtils.isValidEnum(Traffic.class, "PURPLE"));
441         assertFalse(EnumUtils.isValidEnum(Traffic.class, null));
442     }
443 
444     @Test
445     public void test_isValidEnum_nullClass() {
446         assertThrows(NullPointerException.class, () -> EnumUtils.isValidEnum(null, "PURPLE"));
447     }
448 
449     @Test
450     public void test_isValidEnumIgnoreCase() {
451         assertTrue(EnumUtils.isValidEnumIgnoreCase(Traffic.class, "red"));
452         assertTrue(EnumUtils.isValidEnumIgnoreCase(Traffic.class, "Amber"));
453         assertTrue(EnumUtils.isValidEnumIgnoreCase(Traffic.class, "grEEn"));
454         assertFalse(EnumUtils.isValidEnumIgnoreCase(Traffic.class, "purple"));
455         assertFalse(EnumUtils.isValidEnumIgnoreCase(Traffic.class, null));
456     }
457 
458     @Test
459     public void test_isValidEnumIgnoreCase_nullClass() {
460         assertThrows(NullPointerException.class, () -> EnumUtils.isValidEnumIgnoreCase(null, "PURPLE"));
461     }
462 
463     @Test
464     public void test_processBitVector() {
465         assertEquals(EnumSet.noneOf(Traffic.class), EnumUtils.processBitVector(Traffic.class, 0L));
466         assertEquals(EnumSet.of(Traffic.RED), EnumUtils.processBitVector(Traffic.class, 1L));
467         assertEquals(EnumSet.of(Traffic.AMBER), EnumUtils.processBitVector(Traffic.class, 2L));
468         assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER), EnumUtils.processBitVector(Traffic.class, 3L));
469         assertEquals(EnumSet.of(Traffic.GREEN), EnumUtils.processBitVector(Traffic.class, 4L));
470         assertEquals(EnumSet.of(Traffic.RED, Traffic.GREEN), EnumUtils.processBitVector(Traffic.class, 5L));
471         assertEquals(EnumSet.of(Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVector(Traffic.class, 6L));
472         assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN),
473             EnumUtils.processBitVector(Traffic.class, 7L));
474 
475         // 64 values Enum (to test whether no int<->long jdk conversion issue exists)
476         assertEquals(EnumSet.of(Enum64.A31), EnumUtils.processBitVector(Enum64.class, 1L << 31));
477         assertEquals(EnumSet.of(Enum64.A32), EnumUtils.processBitVector(Enum64.class, 1L << 32));
478         assertEquals(EnumSet.of(Enum64.A63), EnumUtils.processBitVector(Enum64.class, 1L << 63));
479         assertEquals(EnumSet.of(Enum64.A63), EnumUtils.processBitVector(Enum64.class, Long.MIN_VALUE));
480     }
481 
482     @Test
483     public void test_processBitVector_longClass() {
484         assertThrows(IllegalArgumentException.class, () -> EnumUtils.processBitVector(TooMany.class, 0L));
485     }
486 
487     @Test
488     public void test_processBitVector_nullClass() {
489         final Class<Traffic> empty = null;
490         assertThrows(NullPointerException.class, () -> EnumUtils.processBitVector(empty, 0L));
491     }
492 
493     @Test
494     public void test_processBitVectors() {
495         assertEquals(EnumSet.noneOf(Traffic.class), EnumUtils.processBitVectors(Traffic.class, 0L));
496         assertEquals(EnumSet.of(Traffic.RED), EnumUtils.processBitVectors(Traffic.class, 1L));
497         assertEquals(EnumSet.of(Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 2L));
498         assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 3L));
499         assertEquals(EnumSet.of(Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 4L));
500         assertEquals(EnumSet.of(Traffic.RED, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 5L));
501         assertEquals(EnumSet.of(Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 6L));
502         assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN),
503             EnumUtils.processBitVectors(Traffic.class, 7L));
504 
505         assertEquals(EnumSet.noneOf(Traffic.class), EnumUtils.processBitVectors(Traffic.class, 0L, 0L));
506         assertEquals(EnumSet.of(Traffic.RED), EnumUtils.processBitVectors(Traffic.class, 0L, 1L));
507         assertEquals(EnumSet.of(Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 0L, 2L));
508         assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 0L, 3L));
509         assertEquals(EnumSet.of(Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 0L, 4L));
510         assertEquals(EnumSet.of(Traffic.RED, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 0L, 5L));
511         assertEquals(EnumSet.of(Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 0L, 6L));
512         assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN),
513             EnumUtils.processBitVectors(Traffic.class, 0L, 7L));
514 
515         // demonstrate tolerance of irrelevant high-order digits:
516         assertEquals(EnumSet.noneOf(Traffic.class), EnumUtils.processBitVectors(Traffic.class, 666L, 0L));
517         assertEquals(EnumSet.of(Traffic.RED), EnumUtils.processBitVectors(Traffic.class, 666L, 1L));
518         assertEquals(EnumSet.of(Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 666L, 2L));
519         assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER), EnumUtils.processBitVectors(Traffic.class, 666L, 3L));
520         assertEquals(EnumSet.of(Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 666L, 4L));
521         assertEquals(EnumSet.of(Traffic.RED, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 666L, 5L));
522         assertEquals(EnumSet.of(Traffic.AMBER, Traffic.GREEN), EnumUtils.processBitVectors(Traffic.class, 666L, 6L));
523         assertEquals(EnumSet.of(Traffic.RED, Traffic.AMBER, Traffic.GREEN),
524             EnumUtils.processBitVectors(Traffic.class, 666L, 7L));
525 
526         // 64 values Enum (to test whether no int<->long jdk conversion issue exists)
527         assertEquals(EnumSet.of(Enum64.A31), EnumUtils.processBitVectors(Enum64.class, 1L << 31));
528         assertEquals(EnumSet.of(Enum64.A32), EnumUtils.processBitVectors(Enum64.class, 1L << 32));
529         assertEquals(EnumSet.of(Enum64.A63), EnumUtils.processBitVectors(Enum64.class, 1L << 63));
530         assertEquals(EnumSet.of(Enum64.A63), EnumUtils.processBitVectors(Enum64.class, Long.MIN_VALUE));
531     }
532 
533     @Test
534     public void test_processBitVectors_longClass() {
535         assertEquals(EnumSet.noneOf(TooMany.class), EnumUtils.processBitVectors(TooMany.class, 0L));
536         assertEquals(EnumSet.of(TooMany.A), EnumUtils.processBitVectors(TooMany.class, 1L));
537         assertEquals(EnumSet.of(TooMany.B), EnumUtils.processBitVectors(TooMany.class, 2L));
538         assertEquals(EnumSet.of(TooMany.A, TooMany.B), EnumUtils.processBitVectors(TooMany.class, 3L));
539         assertEquals(EnumSet.of(TooMany.C), EnumUtils.processBitVectors(TooMany.class, 4L));
540         assertEquals(EnumSet.of(TooMany.A, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 5L));
541         assertEquals(EnumSet.of(TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 6L));
542         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 7L));
543 
544         assertEquals(EnumSet.noneOf(TooMany.class), EnumUtils.processBitVectors(TooMany.class, 0L, 0L));
545         assertEquals(EnumSet.of(TooMany.A), EnumUtils.processBitVectors(TooMany.class, 0L, 1L));
546         assertEquals(EnumSet.of(TooMany.B), EnumUtils.processBitVectors(TooMany.class, 0L, 2L));
547         assertEquals(EnumSet.of(TooMany.A, TooMany.B), EnumUtils.processBitVectors(TooMany.class, 0L, 3L));
548         assertEquals(EnumSet.of(TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 4L));
549         assertEquals(EnumSet.of(TooMany.A, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 5L));
550         assertEquals(EnumSet.of(TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 6L));
551         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 7L));
552         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C), EnumUtils.processBitVectors(TooMany.class, 0L, 7L));
553 
554         assertEquals(EnumSet.of(TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 0L));
555         assertEquals(EnumSet.of(TooMany.A, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 1L));
556         assertEquals(EnumSet.of(TooMany.B, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 2L));
557         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 3L));
558         assertEquals(EnumSet.of(TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 4L));
559         assertEquals(EnumSet.of(TooMany.A, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 5L));
560         assertEquals(EnumSet.of(TooMany.B, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 1L, 6L));
561         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C, TooMany.M2),
562             EnumUtils.processBitVectors(TooMany.class, 1L, 7L));
563         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C, TooMany.M2),
564             EnumUtils.processBitVectors(TooMany.class, 1L, 7L));
565 
566         // demonstrate tolerance of irrelevant high-order digits:
567         assertEquals(EnumSet.of(TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 0L));
568         assertEquals(EnumSet.of(TooMany.A, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 1L));
569         assertEquals(EnumSet.of(TooMany.B, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 2L));
570         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 3L));
571         assertEquals(EnumSet.of(TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 4L));
572         assertEquals(EnumSet.of(TooMany.A, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 5L));
573         assertEquals(EnumSet.of(TooMany.B, TooMany.C, TooMany.M2), EnumUtils.processBitVectors(TooMany.class, 9L, 6L));
574         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C, TooMany.M2),
575             EnumUtils.processBitVectors(TooMany.class, 9L, 7L));
576         assertEquals(EnumSet.of(TooMany.A, TooMany.B, TooMany.C, TooMany.M2),
577             EnumUtils.processBitVectors(TooMany.class, 9L, 7L));
578     }
579 
580     @Test
581     public void test_processBitVectors_nullClass() {
582         final Class<Traffic> empty = null;
583         assertThrows(NullPointerException.class, () -> EnumUtils.processBitVectors(empty, 0L));
584     }
585 
586     @Test
587     public void testConstructable() {
588         // enforce public constructor
589         new EnumUtils();
590     }
591 
592 }
593 
594 enum Month {
595     JAN(1), FEB(2), MAR(3), APR(4), MAY(5), JUN(6), JUL(7), AUG(8), SEP(9), OCT(10), NOV(11), DEC(12);
596 
597     private final int id;
598 
599     Month(final int id) {
600         this.id = id;
601     }
602 
603     public int getId() {
604         return this.id;
605     }
606 }
607 
608 enum TooMany {
609     A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, A1, B1, C1, D1, E1, F1, G1, H1, I1,
610     J1, K1, L1, M1, N1, O1, P1, Q1, R1, S1, T1, U1, V1, W1, X1, Y1, Z1, A2, B2, C2, D2, E2, F2, G2, H2, I2, J2, K2, L2,
611     M2
612 }
613 
614 enum Traffic {
615     RED, AMBER, GREEN
616 }
617 
618 enum Traffic2 {
619 
620     RED("***Red***"), AMBER("**Amber**"), GREEN("*green*");
621 
622     final String label;
623 
624     Traffic2(final String label) {
625         this.label = label;
626     }
627 
628     public String getLabel() {
629         return label;
630     }
631 }