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