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    *     http://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  
18  package org.apache.commons.configuration2;
19  
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.assertInstanceOf;
24  import static org.junit.jupiter.api.Assertions.assertNotNull;
25  import static org.junit.jupiter.api.Assertions.assertNull;
26  import static org.junit.jupiter.api.Assertions.assertThrows;
27  import static org.junit.jupiter.api.Assertions.assertTrue;
28  import static org.mockito.Mockito.mock;
29  import static org.mockito.Mockito.verify;
30  import static org.mockito.Mockito.verifyNoMoreInteractions;
31  
32  import java.awt.Color;
33  import java.math.BigDecimal;
34  import java.math.BigInteger;
35  import java.net.InetAddress;
36  import java.net.URI;
37  import java.net.URL;
38  import java.text.DateFormat;
39  import java.text.ParseException;
40  import java.text.SimpleDateFormat;
41  import java.util.ArrayList;
42  import java.util.Calendar;
43  import java.util.Date;
44  import java.util.Iterator;
45  import java.util.List;
46  import java.util.Locale;
47  import java.util.NoSuchElementException;
48  
49  import org.apache.commons.configuration2.convert.DefaultConversionHandler;
50  import org.apache.commons.configuration2.convert.DefaultListDelimiterHandler;
51  import org.apache.commons.configuration2.ex.ConversionException;
52  import org.junit.jupiter.api.BeforeEach;
53  import org.junit.jupiter.api.Test;
54  
55  import jakarta.mail.internet.InternetAddress;
56  
57  /**
58   */
59  public class TestDataConfiguration {
60      /** Constant for the date pattern used by tests. */
61      private static final String DATE_PATTERN = "yyyy-MM-dd";
62  
63      /**
64       * Returns the expected test date.
65       *
66       * @return the expected test date
67       * @throws ParseException if the date cannot be parsed
68       */
69      private static Date expectedDate() throws ParseException {
70          final DateFormat format = new SimpleDateFormat(DATE_PATTERN);
71          return format.parse("2004-01-01");
72      }
73  
74      /** The test instance. */
75      private DataConfiguration conf;
76  
77      @BeforeEach
78      public void setUp() throws Exception {
79          final BaseConfiguration baseConfig = new BaseConfiguration();
80          baseConfig.setListDelimiterHandler(new DefaultListDelimiterHandler(','));
81          conf = new DataConfiguration(baseConfig);
82  
83          // empty value
84          conf.addProperty("empty", "");
85  
86          // lists of boolean
87          conf.addProperty("boolean.list1", "true");
88          conf.addProperty("boolean.list1", "false");
89          conf.addProperty("boolean.list2", "true, false");
90          conf.addProperty("boolean.list3", Boolean.TRUE);
91          conf.addProperty("boolean.list3", Boolean.FALSE);
92          conf.addPropertyDirect("boolean.list4", new Boolean[] {Boolean.TRUE, Boolean.FALSE});
93          conf.addPropertyDirect("boolean.list5", new boolean[] {true, false});
94          final List<Object> booleans = new ArrayList<>();
95          booleans.add(Boolean.TRUE);
96          booleans.add(Boolean.FALSE);
97          conf.addProperty("boolean.list6", booleans);
98          conf.addProperty("boolean.string", "true");
99          conf.addProperty("boolean.object", Boolean.TRUE);
100         conf.addProperty("boolean.list.interpolated", "${boolean.string},false");
101 
102         // lists of bytes
103         conf.addProperty("byte.list1", "1");
104         conf.addProperty("byte.list1", "2");
105         conf.addProperty("byte.list2", "1, 2");
106         conf.addProperty("byte.list3", Byte.valueOf("1"));
107         conf.addProperty("byte.list3", Byte.valueOf("2"));
108         conf.addPropertyDirect("byte.list4", new Byte[] {Byte.valueOf("1"), Byte.valueOf("2")});
109         conf.addPropertyDirect("byte.list5", new byte[] {1, 2});
110         final List<Object> bytes = new ArrayList<>();
111         bytes.add(Byte.valueOf("1"));
112         bytes.add(Byte.valueOf("2"));
113         conf.addProperty("byte.list6", bytes);
114         conf.addProperty("byte.string", "1");
115         conf.addProperty("byte.object", Byte.valueOf("1"));
116         conf.addProperty("byte.list.interpolated", "${byte.string},2");
117 
118         // lists of shorts
119         conf.addProperty("short.list1", "1");
120         conf.addProperty("short.list1", "2");
121         conf.addProperty("short.list2", "1, 2");
122         conf.addProperty("short.list3", Short.valueOf("1"));
123         conf.addProperty("short.list3", Short.valueOf("2"));
124         conf.addPropertyDirect("short.list4", new Short[] {Short.valueOf("1"), Short.valueOf("2")});
125         conf.addPropertyDirect("short.list5", new short[] {1, 2});
126         final List<Object> shorts = new ArrayList<>();
127         shorts.add(Short.valueOf("1"));
128         shorts.add(Short.valueOf("2"));
129         conf.addProperty("short.list6", shorts);
130         conf.addProperty("short.string", "1");
131         conf.addProperty("short.object", Short.valueOf("1"));
132         conf.addProperty("short.list.interpolated", "${short.string},2");
133 
134         // lists of integers
135         conf.addProperty("integer.list1", "1");
136         conf.addProperty("integer.list1", "2");
137         conf.addProperty("integer.list2", "1, 2");
138         conf.addProperty("integer.list3", Integer.valueOf("1"));
139         conf.addProperty("integer.list3", Integer.valueOf("2"));
140         conf.addPropertyDirect("integer.list4", new Integer[] {Integer.valueOf("1"), Integer.valueOf("2")});
141         conf.addPropertyDirect("integer.list5", new int[] {1, 2});
142         final List<Object> integers = new ArrayList<>();
143         integers.add(Integer.valueOf("1"));
144         integers.add(Integer.valueOf("2"));
145         conf.addProperty("integer.list6", integers);
146         conf.addProperty("integer.string", "1");
147         conf.addProperty("integer.object", Integer.valueOf("1"));
148         conf.addProperty("integer.list.interpolated", "${integer.string},2");
149 
150         // lists of longs
151         conf.addProperty("long.list1", "1");
152         conf.addProperty("long.list1", "2");
153         conf.addProperty("long.list2", "1, 2");
154         conf.addProperty("long.list3", Long.valueOf("1"));
155         conf.addProperty("long.list3", Long.valueOf("2"));
156         conf.addPropertyDirect("long.list4", new Long[] {Long.valueOf("1"), Long.valueOf("2")});
157         conf.addPropertyDirect("long.list5", new long[] {1, 2});
158         final List<Object> longs = new ArrayList<>();
159         longs.add(Long.valueOf("1"));
160         longs.add(Long.valueOf("2"));
161         conf.addProperty("long.list6", longs);
162         conf.addProperty("long.string", "1");
163         conf.addProperty("long.object", Long.valueOf("1"));
164         conf.addProperty("long.list.interpolated", "${long.string},2");
165 
166         // lists of floats
167         conf.addProperty("float.list1", "1");
168         conf.addProperty("float.list1", "2");
169         conf.addProperty("float.list2", "1, 2");
170         conf.addProperty("float.list3", Float.valueOf("1"));
171         conf.addProperty("float.list3", Float.valueOf("2"));
172         conf.addPropertyDirect("float.list4", new Float[] {Float.valueOf("1"), Float.valueOf("2")});
173         conf.addPropertyDirect("float.list5", new float[] {1, 2});
174         final List<Object> floats = new ArrayList<>();
175         floats.add(Float.valueOf("1"));
176         floats.add(Float.valueOf("2"));
177         conf.addProperty("float.list6", floats);
178         conf.addProperty("float.string", "1");
179         conf.addProperty("float.object", Float.valueOf("1"));
180         conf.addProperty("float.list.interpolated", "${float.string},2");
181 
182         // lists of doubles
183         conf.addProperty("double.list1", "1");
184         conf.addProperty("double.list1", "2");
185         conf.addProperty("double.list2", "1, 2");
186         conf.addProperty("double.list3", Double.valueOf("1"));
187         conf.addProperty("double.list3", Double.valueOf("2"));
188         conf.addPropertyDirect("double.list4", new Double[] {Double.valueOf("1"), Double.valueOf("2")});
189         conf.addPropertyDirect("double.list5", new double[] {1, 2});
190         final List<Object> doubles = new ArrayList<>();
191         doubles.add(Double.valueOf("1"));
192         doubles.add(Double.valueOf("2"));
193         conf.addProperty("double.list6", doubles);
194         conf.addProperty("double.string", "1");
195         conf.addProperty("double.object", Double.valueOf("1"));
196         conf.addProperty("double.list.interpolated", "${double.string},2");
197 
198         // lists of big integers
199         conf.addProperty("biginteger.list1", "1");
200         conf.addProperty("biginteger.list1", "2");
201         conf.addProperty("biginteger.list2", "1, 2");
202         conf.addProperty("biginteger.list3", new BigInteger("1"));
203         conf.addProperty("biginteger.list3", new BigInteger("2"));
204         conf.addPropertyDirect("biginteger.list4", new BigInteger[] {new BigInteger("1"), new BigInteger("2")});
205         final List<Object> bigintegers = new ArrayList<>();
206         bigintegers.add(new BigInteger("1"));
207         bigintegers.add(new BigInteger("2"));
208         conf.addProperty("biginteger.list6", bigintegers);
209         conf.addProperty("biginteger.string", "1");
210         conf.addProperty("biginteger.object", new BigInteger("1"));
211         conf.addProperty("biginteger.list.interpolated", "${biginteger.string},2");
212 
213         // lists of big decimals
214         conf.addProperty("bigdecimal.list1", "1");
215         conf.addProperty("bigdecimal.list1", "2");
216         conf.addProperty("bigdecimal.list2", "1, 2");
217         conf.addProperty("bigdecimal.list3", new BigDecimal("1"));
218         conf.addProperty("bigdecimal.list3", new BigDecimal("2"));
219         conf.addPropertyDirect("bigdecimal.list4", new BigDecimal[] {new BigDecimal("1"), new BigDecimal("2")});
220         final List<Object> bigdecimals = new ArrayList<>();
221         bigdecimals.add(new BigDecimal("1"));
222         bigdecimals.add(new BigDecimal("2"));
223         conf.addProperty("bigdecimal.list6", bigdecimals);
224         conf.addProperty("bigdecimal.string", "1");
225         conf.addProperty("bigdecimal.object", new BigDecimal("1"));
226         conf.addProperty("bigdecimal.list.interpolated", "${bigdecimal.string},2");
227 
228         // URIs
229         final String uri1 = "http://jakarta.apache.org";
230         final String uri2 = "http://www.apache.org";
231         conf.addProperty("uri.string", uri1);
232         conf.addProperty("uri.string.interpolated", "${uri.string}");
233         conf.addProperty("uri.object", new URI(uri1));
234         conf.addProperty("uri.list1", uri1);
235         conf.addProperty("uri.list1", uri2);
236         conf.addProperty("uri.list2", uri1 + ", " + uri2);
237         conf.addProperty("uri.list3", new URI(uri1));
238         conf.addProperty("uri.list3", new URI(uri2));
239         conf.addPropertyDirect("uri.list4", new URI[] {new URI(uri1), new URI(uri2)});
240         final List<Object> uris = new ArrayList<>();
241         uris.add(new URI(uri1));
242         uris.add(new URI(uri2));
243         conf.addProperty("uri.list6", uris);
244         conf.addProperty("uri.list.interpolated", "${uri.string}," + uri2);
245 
246         // URLs
247         final String url1 = "http://jakarta.apache.org";
248         final String url2 = "http://www.apache.org";
249         conf.addProperty("url.string", url1);
250         conf.addProperty("url.string.interpolated", "${url.string}");
251         conf.addProperty("url.object", new URL(url1));
252         conf.addProperty("url.list1", url1);
253         conf.addProperty("url.list1", url2);
254         conf.addProperty("url.list2", url1 + ", " + url2);
255         conf.addProperty("url.list3", new URL(url1));
256         conf.addProperty("url.list3", new URL(url2));
257         conf.addPropertyDirect("url.list4", new URL[] {new URL(url1), new URL(url2)});
258         final List<Object> urls = new ArrayList<>();
259         urls.add(new URL(url1));
260         urls.add(new URL(url2));
261         conf.addProperty("url.list6", urls);
262         conf.addProperty("url.list.interpolated", "${url.string}," + url2);
263 
264         // Locales
265         conf.addProperty("locale.string", "fr");
266         conf.addProperty("locale.string.interpolated", "${locale.string}");
267         conf.addProperty("locale.object", Locale.FRENCH);
268         conf.addProperty("locale.list1", "fr");
269         conf.addProperty("locale.list1", "de");
270         conf.addProperty("locale.list2", "fr, de");
271         conf.addProperty("locale.list3", Locale.FRENCH);
272         conf.addProperty("locale.list3", Locale.GERMAN);
273         conf.addPropertyDirect("locale.list4", new Locale[] {Locale.FRENCH, Locale.GERMAN});
274         final List<Object> locales = new ArrayList<>();
275         locales.add(Locale.FRENCH);
276         locales.add(Locale.GERMAN);
277         conf.addProperty("locale.list6", locales);
278         conf.addProperty("locale.list.interpolated", "${locale.string},de");
279 
280         // Colors
281         final String color1 = "FF0000";
282         final String color2 = "0000FF";
283         conf.addProperty("color.string", color1);
284         conf.addProperty("color.string.interpolated", "${color.string}");
285         conf.addProperty("color.object", Color.red);
286         conf.addProperty("color.list1", color1);
287         conf.addProperty("color.list1", color2);
288         conf.addProperty("color.list2", color1 + ", " + color2);
289         conf.addProperty("color.list3", Color.red);
290         conf.addProperty("color.list3", Color.blue);
291         conf.addPropertyDirect("color.list4", new Color[] {Color.red, Color.blue});
292         final List<Object> colors = new ArrayList<>();
293         colors.add(Color.red);
294         colors.add(Color.blue);
295         conf.addProperty("color.list6", colors);
296         conf.addProperty("color.list.interpolated", "${color.string}," + color2);
297 
298         // Dates & Calendars
299         final String pattern = DATE_PATTERN;
300         final DateFormat format = new SimpleDateFormat(pattern);
301         conf.setProperty(DataConfiguration.DATE_FORMAT_KEY, pattern);
302 
303         final Date date1 = format.parse("2004-01-01");
304         final Date date2 = format.parse("2004-12-31");
305         final Calendar calendar1 = Calendar.getInstance();
306         calendar1.setTime(date1);
307         final Calendar calendar2 = Calendar.getInstance();
308         calendar2.setTime(date2);
309 
310         conf.addProperty("date.string", "2004-01-01");
311         conf.addProperty("date.string.interpolated", "${date.string}");
312         conf.addProperty("date.object", date1);
313         conf.addProperty("date.list1", "2004-01-01");
314         conf.addProperty("date.list1", "2004-12-31");
315         conf.addProperty("date.list2", "2004-01-01, 2004-12-31");
316         conf.addProperty("date.list3", date1);
317         conf.addProperty("date.list3", date2);
318         conf.addPropertyDirect("date.list4", new Date[] {date1, date2});
319         conf.addPropertyDirect("date.list5", new Calendar[] {calendar1, calendar2});
320         final List<Object> dates = new ArrayList<>();
321         dates.add(date1);
322         dates.add(date2);
323         conf.addProperty("date.list6", dates);
324         conf.addProperty("date.list.interpolated", "${date.string},2004-12-31");
325         conf.addPropertyDirect("date.list7", new String[] {"2004-01-01", "2004-12-31"});
326 
327         conf.addProperty("calendar.string", "2004-01-01");
328         conf.addProperty("calendar.string.interpolated", "${calendar.string}");
329         conf.addProperty("calendar.object", calendar1);
330         conf.addProperty("calendar.list1", "2004-01-01");
331         conf.addProperty("calendar.list1", "2004-12-31");
332         conf.addProperty("calendar.list2", "2004-01-01, 2004-12-31");
333         conf.addProperty("calendar.list3", calendar1);
334         conf.addProperty("calendar.list3", calendar2);
335         conf.addPropertyDirect("calendar.list4", new Calendar[] {calendar1, calendar2});
336         conf.addPropertyDirect("calendar.list5", new Date[] {date1, date2});
337         final List<Object> calendars = new ArrayList<>();
338         calendars.add(date1);
339         calendars.add(date2);
340         conf.addProperty("calendar.list6", calendars);
341         conf.addProperty("calendar.list.interpolated", "${calendar.string},2004-12-31");
342         conf.addPropertyDirect("calendar.list7", new String[] {"2004-01-01", "2004-12-31"});
343 
344         // host address
345         conf.addProperty("ip.string", "127.0.0.1");
346         conf.addProperty("ip.string.interpolated", "${ip.string}");
347         conf.addProperty("ip.object", InetAddress.getByName("127.0.0.1"));
348 
349         // email address
350         conf.addProperty("email.string", "dev@test.org");
351         conf.addProperty("email.string.interpolated", "${email.string}");
352         conf.addProperty("email.object", new InternetAddress("dev@test.org"));
353     }
354 
355     /**
356      * Tests whether properties can be cleared.
357      */
358     @Test
359     public void testClearProperty() {
360         final String key = "test.property";
361         conf.addProperty(key, "someValue");
362         conf.clearProperty(key);
363         assertFalse(conf.containsKey(key));
364     }
365 
366     /**
367      * Tests the implementation of clearPropertyDirect().
368      */
369     @Test
370     public void testClearPropertyDirect() {
371         final String key = "test.property";
372         conf.addProperty(key, "someValue");
373         conf.clearPropertyDirect(key);
374         assertFalse(conf.containsKey(key));
375     }
376 
377     /**
378      * Tests clearPropertyDirect() if the wrapped configuration does not extend AbstractConfiguration.
379      */
380     @Test
381     public void testClearPropertyDirectNoAbstractConf() {
382         final Configuration wrapped = mock(Configuration.class);
383         final String key = "test.property";
384         conf = new DataConfiguration(wrapped);
385         conf.clearPropertyDirect(key);
386 
387         verify(wrapped).clearProperty(key);
388         verifyNoMoreInteractions(wrapped);
389     }
390 
391     @Test
392     public void testContainsKey() {
393         final Configuration baseconf = new BaseConfiguration();
394         final DataConfiguration conf = new DataConfiguration(baseconf);
395 
396         assertFalse(conf.containsKey("foo"));
397 
398         baseconf.setProperty("foo", "bar");
399 
400         assertTrue(conf.containsKey("foo"));
401     }
402 
403     @Test
404     public void testConversionException() throws Exception {
405         conf.addProperty("key1", new Object());
406         conf.addProperty("key2", "xxxxxx");
407 
408         assertThrows(ConversionException.class, () -> conf.getBooleanArray("key1"));
409         assertThrows(ConversionException.class, () -> conf.getBooleanArray("key2"));
410 
411         assertThrows(ConversionException.class, () -> conf.getBooleanList("key1"));
412         assertThrows(ConversionException.class, () -> conf.getBooleanList("key2"));
413 
414         assertThrows(ConversionException.class, () -> conf.getByteArray("key1"));
415         assertThrows(ConversionException.class, () -> conf.getByteArray("key2"));
416 
417         assertThrows(ConversionException.class, () -> conf.getByteList("key1"));
418         assertThrows(ConversionException.class, () -> conf.getByteList("key2"));
419 
420         assertThrows(ConversionException.class, () -> conf.getShortArray("key1"));
421         assertThrows(ConversionException.class, () -> conf.getShortArray("key2"));
422 
423         assertThrows(ConversionException.class, () -> conf.getShortList("key1"));
424         assertThrows(ConversionException.class, () -> conf.getShortList("key2"));
425 
426         assertThrows(ConversionException.class, () -> conf.getIntArray("key1"));
427         assertThrows(ConversionException.class, () -> conf.getIntArray("key2"));
428 
429         assertThrows(ConversionException.class, () -> conf.getIntegerList("key1"));
430         assertThrows(ConversionException.class, () -> conf.getIntegerList("key2"));
431 
432         assertThrows(ConversionException.class, () -> conf.getLongArray("key1"));
433         assertThrows(ConversionException.class, () -> conf.getLongArray("key2"));
434 
435         assertThrows(ConversionException.class, () -> conf.getLongList("key1"));
436         assertThrows(ConversionException.class, () -> conf.getLongList("key2"));
437 
438         assertThrows(ConversionException.class, () -> conf.getFloatArray("key1"));
439         assertThrows(ConversionException.class, () -> conf.getFloatArray("key2"));
440 
441         assertThrows(ConversionException.class, () -> conf.getFloatList("key1"));
442         assertThrows(ConversionException.class, () -> conf.getFloatList("key2"));
443 
444         assertThrows(ConversionException.class, () -> conf.getDoubleArray("key1"));
445         assertThrows(ConversionException.class, () -> conf.getDoubleArray("key2"));
446 
447         assertThrows(ConversionException.class, () -> conf.getDoubleList("key1"));
448         assertThrows(ConversionException.class, () -> conf.getDoubleList("key2"));
449 
450         assertThrows(ConversionException.class, () -> conf.getBigIntegerArray("key1"));
451         assertThrows(ConversionException.class, () -> conf.getBigIntegerArray("key2"));
452 
453         assertThrows(ConversionException.class, () -> conf.getBigIntegerList("key1"));
454         assertThrows(ConversionException.class, () -> conf.getBigIntegerList("key2"));
455 
456         assertThrows(ConversionException.class, () -> conf.getBigDecimalArray("key1"));
457         assertThrows(ConversionException.class, () -> conf.getBigDecimalArray("key2"));
458 
459         assertThrows(ConversionException.class, () -> conf.getBigDecimalList("key1"));
460         assertThrows(ConversionException.class, () -> conf.getBigDecimalList("key2"));
461 
462         assertThrows(ConversionException.class, () -> conf.getURLArray("key1"));
463         assertThrows(ConversionException.class, () -> conf.getURLArray("key2"));
464 
465         assertThrows(ConversionException.class, () -> conf.getURLList("key1"));
466         assertThrows(ConversionException.class, () -> conf.getURLList("key2"));
467 
468         assertThrows(ConversionException.class, () -> conf.getLocaleArray("key1"));
469         assertThrows(ConversionException.class, () -> conf.getLocaleArray("key2"));
470 
471         assertThrows(ConversionException.class, () -> conf.getLocaleList("key1"));
472         assertThrows(ConversionException.class, () -> conf.getLocaleList("key2"));
473 
474         assertThrows(ConversionException.class, () -> conf.getColorArray("key1"));
475         assertThrows(ConversionException.class, () -> conf.getColorArray("key2"));
476 
477         assertThrows(ConversionException.class, () -> conf.getColorList("key1"));
478         assertThrows(ConversionException.class, () -> conf.getColorList("key2"));
479 
480         assertThrows(ConversionException.class, () -> conf.getDateArray("key1"));
481         assertThrows(ConversionException.class, () -> conf.getDateArray("key2"));
482 
483         assertThrows(ConversionException.class, () -> conf.getDate("key1", DATE_PATTERN));
484         assertThrows(ConversionException.class, () -> conf.getDate("key2", DATE_PATTERN));
485 
486         assertThrows(ConversionException.class, () -> conf.getDateList("key1"));
487         assertThrows(ConversionException.class, () -> conf.getDateList("key2"));
488 
489         assertThrows(ConversionException.class, () -> conf.getCalendar("key1", DATE_PATTERN));
490         assertThrows(ConversionException.class, () -> conf.getCalendar("key2", DATE_PATTERN));
491 
492         assertThrows(ConversionException.class, () -> conf.getCalendarArray("key1"));
493         assertThrows(ConversionException.class, () -> conf.getCalendarArray("key2"));
494 
495         assertThrows(ConversionException.class, () -> conf.getCalendarList("key1"));
496         assertThrows(ConversionException.class, () -> conf.getCalendarList("key2"));
497 
498         assertThrows(ConversionException.class, () -> conf.get(InetAddress.class, "key1"));
499 
500         assertThrows(ConversionException.class, () -> conf.get(InternetAddress.class, "key1"));
501     }
502 
503     /**
504      * Tests that the cause of a conversion exception is kept.
505      */
506     @Test
507     public void testConversionExceptionCause() {
508         final ConversionException cex = assertThrows(ConversionException.class, () -> conf.get(Integer.TYPE, "uri.string"));
509         assertInstanceOf(NumberFormatException.class, cex.getCause());
510     }
511 
512     @Test
513     public void testGetArrayInvalidDefaultType() {
514         assertThrows(IllegalArgumentException.class, () -> conf.getArray(Boolean.class, "unknownkey", new URL[] {}));
515     }
516 
517     @Test
518     public void testGetBigDecimalArray() {
519         // missing list
520         final BigDecimal[] defaultValue = {new BigDecimal("2"), new BigDecimal("1")};
521         assertArrayEquals(defaultValue, conf.getBigDecimalArray("bigdecimal.list", defaultValue));
522 
523         final BigDecimal[] expected = {new BigDecimal("1"), new BigDecimal("2")};
524 
525         // list of strings
526         assertArrayEquals(expected, conf.getBigDecimalArray("bigdecimal.list1"));
527 
528         // list of strings, comma separated
529         assertArrayEquals(expected, conf.getBigDecimalArray("bigdecimal.list2"));
530 
531         // list of BigDecimal objects
532         assertArrayEquals(expected, conf.getBigDecimalArray("bigdecimal.list3"));
533 
534         // array of BigDecimal objects
535         assertArrayEquals(expected, conf.getBigDecimalArray("bigdecimal.list4"));
536 
537         // list of BigDecimal objects
538         assertArrayEquals(expected, conf.getBigDecimalArray("bigdecimal.list6"));
539 
540         // list of interpolated values
541         assertArrayEquals(expected, conf.getBigDecimalArray("bigdecimal.list.interpolated"));
542 
543         // single BigDecimal values
544         assertArrayEquals(new BigDecimal[] {new BigDecimal("1")}, conf.getBigDecimalArray("bigdecimal.string"));
545         assertArrayEquals(new BigDecimal[] {new BigDecimal("1")}, conf.getBigDecimalArray("bigdecimal.object"));
546 
547         // empty array
548         assertArrayEquals(new BigDecimal[] {}, conf.getBigDecimalArray("empty"));
549     }
550 
551     @Test
552     public void testGetBigDecimalList() {
553         // missing list
554         assertEquals(null, conf.getBigDecimalList("bigdecimal.list", null));
555 
556         List<Object> expected = new ArrayList<>();
557         expected.add(new BigDecimal("1"));
558         expected.add(new BigDecimal("2"));
559 
560         // list of strings
561         assertEquals(expected, conf.getBigDecimalList("bigdecimal.list1"));
562 
563         // list of strings, comma separated
564         assertEquals(expected, conf.getBigDecimalList("bigdecimal.list2"));
565 
566         // list of BigDecimal objects
567         assertEquals(expected, conf.getBigDecimalList("bigdecimal.list3"));
568 
569         // array of BigDecimal objects
570         assertEquals(expected, conf.getBigDecimalList("bigdecimal.list4"));
571 
572         // list of BigDecimal objects
573         assertEquals(expected, conf.getBigDecimalList("bigdecimal.list6"));
574 
575         // list of interpolated values
576         assertEquals(expected, conf.getBigDecimalList("bigdecimal.list.interpolated"));
577 
578         // single BigDecimal values
579         expected = new ArrayList<>();
580         expected.add(new BigDecimal("1"));
581         assertEquals(expected, conf.getBigDecimalList("bigdecimal.string"));
582         assertEquals(expected, conf.getBigDecimalList("bigdecimal.object"));
583 
584         // empty list
585         assertEquals(new ArrayList<>(), conf.getBigDecimalList("empty"));
586     }
587 
588     @Test
589     public void testGetBigIntegerArray() {
590         // missing list
591         final BigInteger[] defaultValue = {new BigInteger("2"), new BigInteger("1")};
592         assertArrayEquals(defaultValue, conf.getBigIntegerArray("biginteger.list", defaultValue));
593 
594         final BigInteger[] expected = {new BigInteger("1"), new BigInteger("2")};
595 
596         // list of strings
597         assertArrayEquals(expected, conf.getBigIntegerArray("biginteger.list1"));
598 
599         // list of strings, comma separated
600         assertArrayEquals(expected, conf.getBigIntegerArray("biginteger.list2"));
601 
602         // list of BigInteger objects
603         assertArrayEquals(expected, conf.getBigIntegerArray("biginteger.list3"));
604 
605         // array of BigInteger objects
606         assertArrayEquals(expected, conf.getBigIntegerArray("biginteger.list4"));
607 
608         // list of BigInteger objects
609         assertArrayEquals(expected, conf.getBigIntegerArray("biginteger.list6"));
610 
611         // list of interpolated values
612         assertArrayEquals(expected, conf.getBigIntegerArray("biginteger.list.interpolated"));
613 
614         // single BigInteger values
615         assertArrayEquals(new BigInteger[] {new BigInteger("1")}, conf.getBigIntegerArray("biginteger.string"));
616         assertArrayEquals(new BigInteger[] {new BigInteger("1")}, conf.getBigIntegerArray("biginteger.object"));
617 
618         // empty array
619         assertArrayEquals(new BigInteger[] {}, conf.getBigIntegerArray("empty"));
620     }
621 
622     @Test
623     public void testGetBigIntegerList() {
624         // missing list
625         final List<BigInteger> bigIntegerList = conf.getBigIntegerList("biginteger.list", null);
626         assertEquals(null, bigIntegerList);
627 
628         List<Object> expected = new ArrayList<>();
629         expected.add(new BigInteger("1"));
630         expected.add(new BigInteger("2"));
631 
632         // list of strings
633         assertEquals(expected, conf.getBigIntegerList("biginteger.list1"));
634 
635         // list of strings, comma separated
636         assertEquals(expected, conf.getBigIntegerList("biginteger.list2"));
637 
638         // list of BigInteger objects
639         assertEquals(expected, conf.getBigIntegerList("biginteger.list3"));
640 
641         // array of BigInteger objects
642         assertEquals(expected, conf.getBigIntegerList("biginteger.list4"));
643 
644         // list of BigInteger objects
645         assertEquals(expected, conf.getBigIntegerList("biginteger.list6"));
646 
647         // list of interpolated values
648         assertEquals(expected, conf.getBigIntegerList("biginteger.list.interpolated"));
649 
650         // single BigInteger values
651         expected = new ArrayList<>();
652         expected.add(new BigInteger("1"));
653         assertEquals(expected, conf.getBigIntegerList("biginteger.string"));
654         assertEquals(expected, conf.getBigIntegerList("biginteger.object"));
655 
656         // empty list
657         assertEquals(new ArrayList<>(), conf.getBigIntegerList("empty"));
658     }
659 
660     @Test
661     public void testGetBooleanArray() {
662         // missing list
663         final boolean[] defaultValue = {false, true};
664         assertArrayEquals(defaultValue, conf.getBooleanArray("boolean.list", defaultValue));
665 
666         final boolean[] expected = {true, false};
667 
668         // list of strings
669         assertArrayEquals(expected, conf.getBooleanArray("boolean.list1"));
670 
671         // list of strings, comma separated
672         assertArrayEquals(expected, conf.getBooleanArray("boolean.list2"));
673 
674         // list of Boolean objects
675         assertArrayEquals(expected, conf.getBooleanArray("boolean.list3"));
676 
677         // array of Boolean objects
678         assertArrayEquals(expected, conf.getBooleanArray("boolean.list4"));
679 
680         // array of boolean primitives
681         assertArrayEquals(expected, conf.getBooleanArray("boolean.list5"));
682 
683         // list of Boolean objects
684         assertArrayEquals(expected, conf.getBooleanArray("boolean.list6"));
685 
686         // list of interpolated values
687         assertArrayEquals(expected, conf.getBooleanArray("boolean.list.interpolated"));
688 
689         // single boolean values
690         assertArrayEquals(new boolean[] {true}, conf.getBooleanArray("boolean.string"));
691         assertArrayEquals(new boolean[] {true}, conf.getBooleanArray("boolean.object"));
692 
693         // empty array
694         assertArrayEquals(new boolean[] {}, conf.getBooleanArray("empty"));
695     }
696 
697     @Test
698     public void testGetBooleanList() {
699         // missing list
700         assertEquals(null, conf.getBooleanList("boolean.list", null));
701 
702         List<Object> expected = new ArrayList<>();
703         expected.add(Boolean.TRUE);
704         expected.add(Boolean.FALSE);
705 
706         // list of strings
707         assertEquals(expected, conf.getBooleanList("boolean.list1"));
708 
709         // list of strings, comma separated
710         assertEquals(expected, conf.getBooleanList("boolean.list2"));
711 
712         // list of Boolean objects
713         assertEquals(expected, conf.getBooleanList("boolean.list3"));
714 
715         // array of Boolean objects
716         assertEquals(expected, conf.getBooleanList("boolean.list4"));
717 
718         // array of boolean primitives
719         assertEquals(expected, conf.getBooleanList("boolean.list5"));
720 
721         // list of Boolean objects
722         assertEquals(expected, conf.getBooleanList("boolean.list6"));
723 
724         // list of interpolated values
725         assertEquals(expected, conf.getBooleanList("boolean.list.interpolated"));
726 
727         // single boolean values
728         expected = new ArrayList<>();
729         expected.add(Boolean.TRUE);
730         assertEquals(expected, conf.getBooleanList("boolean.string"));
731         assertEquals(expected, conf.getBooleanList("boolean.object"));
732 
733         // empty list
734         assertEquals(new ArrayList<>(), conf.getBooleanList("empty"));
735     }
736 
737     @Test
738     public void testGetByteArray() {
739         // missing list
740         final byte[] defaultValue = {1, 2};
741         assertArrayEquals(defaultValue, conf.getByteArray("byte.list", defaultValue));
742 
743         final byte[] expected = {1, 2};
744 
745         // list of strings
746         assertArrayEquals(expected, conf.getByteArray("byte.list1"));
747 
748         // list of strings, comma separated
749         assertArrayEquals(expected, conf.getByteArray("byte.list2"));
750 
751         // list of Byte objects
752         assertArrayEquals(expected, conf.getByteArray("byte.list3"));
753 
754         // array of Byte objects
755         assertArrayEquals(expected, conf.getByteArray("byte.list4"));
756 
757         // array of byte primitives
758         assertArrayEquals(expected, conf.getByteArray("byte.list5"));
759 
760         // list of Byte objects
761         assertArrayEquals(expected, conf.getByteArray("byte.list6"));
762 
763         // list of interpolated values
764         assertArrayEquals(expected, conf.getByteArray("byte.list.interpolated"));
765 
766         // single byte values
767         assertArrayEquals(new byte[] {1}, conf.getByteArray("byte.string"));
768         assertArrayEquals(new byte[] {1}, conf.getByteArray("byte.object"));
769 
770         // empty array
771         assertArrayEquals(new byte[] {}, conf.getByteArray("empty"));
772     }
773 
774     @Test
775     public void testGetByteList() {
776         // missing list
777         assertEquals(null, conf.getByteList("byte.list", null));
778 
779         List<Object> expected = new ArrayList<>();
780         expected.add(Byte.valueOf("1"));
781         expected.add(Byte.valueOf("2"));
782 
783         // list of strings
784         assertEquals(expected, conf.getByteList("byte.list1"));
785 
786         // list of strings, comma separated
787         assertEquals(expected, conf.getByteList("byte.list2"));
788 
789         // list of Byte objects
790         assertEquals(expected, conf.getByteList("byte.list3"));
791 
792         // array of Byte objects
793         assertEquals(expected, conf.getByteList("byte.list4"));
794 
795         // array of byte primitives
796         assertEquals(expected, conf.getByteList("byte.list5"));
797 
798         // list of Byte objects
799         assertEquals(expected, conf.getByteList("byte.list6"));
800 
801         // list of interpolated values
802         assertEquals(expected, conf.getByteList("byte.list.interpolated"));
803 
804         // single byte values
805         expected = new ArrayList<>();
806         expected.add(Byte.valueOf("1"));
807         assertEquals(expected, conf.getByteList("byte.string"));
808         assertEquals(expected, conf.getByteList("byte.object"));
809 
810         // empty list
811         assertEquals(new ArrayList<>(), conf.getByteList("empty"));
812     }
813 
814     @Test
815     public void testGetCalendar() throws Exception {
816         final DateFormat format = new SimpleDateFormat(DATE_PATTERN);
817 
818         // missing Date
819         final Calendar defaultValue = Calendar.getInstance();
820         defaultValue.setTime(new Date());
821         assertEquals(conf.getCalendar("calendar", defaultValue), defaultValue);
822         assertNull(conf.getCalendar("unknownkey", DATE_PATTERN));
823 
824         conf.setThrowExceptionOnMissing(true);
825 
826         assertThrows(NoSuchElementException.class, () -> conf.getCalendar("unknownkey", DATE_PATTERN));
827 
828         final Calendar expected = Calendar.getInstance();
829         expected.setTime(format.parse("2004-01-01"));
830 
831         // Calendar string
832         assertEquals(expected, conf.getCalendar("calendar.string"));
833         assertEquals(conf.getCalendar("calendar.string", DATE_PATTERN), expected);
834 
835         // Calendar object
836         assertEquals(expected, conf.getCalendar("calendar.object"));
837 
838         // Date object
839         assertEquals(expected, conf.getCalendar("date.object"));
840 
841         // interpolated value
842         assertEquals(expected, conf.getCalendar("calendar.string.interpolated"));
843     }
844 
845     @Test
846     public void testGetCalendarArray() throws Exception {
847         final DateFormat format = new SimpleDateFormat(DATE_PATTERN);
848         final Date date1 = format.parse("2004-01-01");
849         final Date date2 = format.parse("2004-12-31");
850         final Calendar calendar1 = Calendar.getInstance();
851         calendar1.setTime(date1);
852         final Calendar calendar2 = Calendar.getInstance();
853         calendar2.setTime(date2);
854 
855         // missing list
856         final Calendar[] defaultValue = {calendar2, calendar1};
857         assertArrayEquals(defaultValue, conf.getCalendarArray("calendar.list", defaultValue));
858 
859         final Calendar[] expected = {calendar1, calendar2};
860 
861         // list of strings
862         assertArrayEquals(expected, conf.getCalendarArray("calendar.list1"));
863 
864         // list of strings, comma separated
865         assertArrayEquals(expected, conf.getCalendarArray("calendar.list2"));
866 
867         // list of Calendar objects
868         assertArrayEquals(expected, conf.getCalendarArray("calendar.list3"));
869 
870         // array of Calendar objects
871         assertArrayEquals(expected, conf.getCalendarArray("calendar.list4"));
872 
873         // list of Date objects
874         assertArrayEquals(expected, conf.getCalendarArray("calendar.list5"));
875 
876         // list of Calendar objects
877         assertArrayEquals(expected, conf.getCalendarArray("calendar.list6"));
878 
879         // list of interpolated values
880         assertArrayEquals(expected, conf.getCalendarArray("calendar.list.interpolated"));
881 
882         // single Calendar values
883         assertArrayEquals(new Calendar[] {calendar1}, conf.getCalendarArray("calendar.string"));
884         assertArrayEquals(new Calendar[] {calendar1}, conf.getCalendarArray("calendar.object"));
885 
886         // empty array
887         assertArrayEquals(new Calendar[] {}, conf.getCalendarArray("empty"));
888     }
889 
890     @Test
891     public void testGetCalendarArrayWithFormat() throws Exception {
892         final DateFormat format = new SimpleDateFormat("MM/dd/yyyy");
893         final Date date1 = format.parse("01/01/2004");
894         final Date date2 = format.parse("12/31/2004");
895 
896         final Calendar calendar1 = Calendar.getInstance();
897         calendar1.setTime(date1);
898         final Calendar calendar2 = Calendar.getInstance();
899         calendar2.setTime(date2);
900         final Calendar[] expected = {calendar1, calendar2};
901 
902         conf.addProperty("calendar.format", "01/01/2004");
903         conf.addProperty("calendar.format", "12/31/2004");
904         assertArrayEquals(expected, conf.getCalendarArray("calendar.format", "MM/dd/yyyy"));
905     }
906 
907     @Test
908     public void testGetCalendarList() throws Exception {
909         final DateFormat format = new SimpleDateFormat(DATE_PATTERN);
910         final Date date1 = format.parse("2004-01-01");
911         final Date date2 = format.parse("2004-12-31");
912         final Calendar calendar1 = Calendar.getInstance();
913         calendar1.setTime(date1);
914         final Calendar calendar2 = Calendar.getInstance();
915         calendar2.setTime(date2);
916 
917         // missing list
918         final List<Calendar> nullList = null;
919         assertEquals(null, conf.getCalendarList("calendar.list", nullList));
920 
921         List<Object> expected = new ArrayList<>();
922         expected.add(calendar1);
923         expected.add(calendar2);
924 
925         // list of strings
926         assertEquals(expected, conf.getCalendarList("calendar.list1"));
927         assertEquals(conf.getList(Calendar.class, "calendar.list1"), expected);
928 
929         // list of strings, comma separated
930         assertEquals(expected, conf.getCalendarList("calendar.list2"));
931 
932         // list of Calendar objects
933         assertEquals(expected, conf.getCalendarList("calendar.list3"));
934 
935         // array of Calendar objects
936         assertEquals(expected, conf.getCalendarList("calendar.list4"));
937 
938         // list of Date objects
939         assertEquals(expected, conf.getCalendarList("calendar.list5"));
940 
941         // list of Calendar objects
942         assertEquals(expected, conf.getCalendarList("calendar.list6"));
943 
944         // array of strings
945         assertEquals(conf.getList(Calendar.class, "calendar.list7"), expected);
946 
947         // list of interpolated values
948         assertEquals(expected, conf.getCalendarList("calendar.list.interpolated"));
949 
950         // single Calendar values
951         expected = new ArrayList<>();
952         expected.add(calendar1);
953         assertEquals(expected, conf.getCalendarList("date.string"));
954         assertEquals(expected, conf.getCalendarList("date.object"));
955 
956         // empty list
957         assertEquals(new ArrayList<>(), conf.getCalendarList("empty"));
958     }
959 
960     @Test
961     public void testGetColor() {
962         // RRGGBB
963         conf.setProperty("color", "FF0000");
964         assertEquals(Color.red, conf.getColor("color"));
965 
966         // #RRGGBB
967         conf.setProperty("color", "#00FF00");
968         assertEquals(Color.green, conf.getColor("color"));
969 
970         // #RRGGBBAA
971         conf.setProperty("color", "#01030507");
972         final Color color = conf.getColor("color");
973         assertNotNull(color);
974         assertEquals(1, color.getRed());
975         assertEquals(3, color.getGreen());
976         assertEquals(5, color.getBlue());
977         assertEquals(7, color.getAlpha());
978 
979         // interpolated value
980         assertEquals(Color.red, conf.getColor("color.string.interpolated"));
981 
982         // default value
983         assertEquals(Color.cyan, conf.getColor("unknownkey", Color.cyan));
984     }
985 
986     @Test
987     public void testGetColorArray() throws Exception {
988         // missing list
989         final Color[] defaultValue = {Color.red, Color.blue};
990         assertArrayEquals(defaultValue, conf.getColorArray("color.list", defaultValue));
991 
992         final Color[] expected = {Color.red, Color.blue};
993 
994         // list of strings
995         assertArrayEquals(expected, conf.getColorArray("color.list1"));
996 
997         // list of strings, comma separated
998         assertArrayEquals(expected, conf.getColorArray("color.list2"));
999 
1000         // list of Color objects
1001         assertArrayEquals(expected, conf.getColorArray("color.list3"));
1002 
1003         // array of Color objects
1004         assertArrayEquals(expected, conf.getColorArray("color.list4"));
1005 
1006         // list of Color objects
1007         assertArrayEquals(expected, conf.getColorArray("color.list6"));
1008 
1009         // list of interpolated values
1010         assertArrayEquals(expected, conf.getColorArray("color.list.interpolated"));
1011 
1012         // single Color values
1013         assertArrayEquals(new Color[] {Color.red}, conf.getColorArray("color.string"));
1014         assertArrayEquals(new Color[] {Color.red}, conf.getColorArray("color.object"));
1015 
1016         // empty array
1017         assertArrayEquals(new Color[] {}, conf.getColorArray("empty"));
1018     }
1019 
1020     @Test
1021     public void testGetColorList() throws Exception {
1022         // missing list
1023         assertEquals(null, conf.getColorList("color.list", null));
1024 
1025         List<Object> expected = new ArrayList<>();
1026         expected.add(Color.red);
1027         expected.add(Color.blue);
1028 
1029         // list of strings
1030         assertEquals(expected, conf.getColorList("color.list1"));
1031 
1032         // list of strings, comma separated
1033         assertEquals(expected, conf.getColorList("color.list2"));
1034 
1035         // list of Color objects
1036         assertEquals(expected, conf.getColorList("color.list3"));
1037 
1038         // array of Color objects
1039         assertEquals(expected, conf.getColorList("color.list4"));
1040 
1041         // list of Color objects
1042         assertEquals(expected, conf.getColorList("color.list6"));
1043 
1044         // list of interpolated values
1045         assertEquals(expected, conf.getColorList("color.list.interpolated"));
1046 
1047         // single Color values
1048         expected = new ArrayList<>();
1049         expected.add(Color.red);
1050         assertEquals(expected, conf.getColorList("color.string"));
1051         assertEquals(expected, conf.getColorList("color.object"));
1052 
1053         // empty list
1054         assertEquals(new ArrayList<>(), conf.getColorList("empty"));
1055     }
1056 
1057     @Test
1058     public void testGetConfiguration() {
1059         final Configuration baseconf = new BaseConfiguration();
1060         final DataConfiguration conf = new DataConfiguration(baseconf);
1061 
1062         assertEquals(baseconf, conf.getConfiguration());
1063     }
1064 
1065     @Test
1066     public void testGetDate() throws Exception {
1067         final Date expected = expectedDate();
1068 
1069         // missing Date
1070         final Date defaultValue = new Date();
1071         assertEquals(conf.getDate("date", defaultValue), defaultValue);
1072         assertNull(conf.getDate("unknownkey", DATE_PATTERN));
1073 
1074         conf.setThrowExceptionOnMissing(true);
1075 
1076         assertThrows(NoSuchElementException.class, () -> conf.getDate("unknownkey", DATE_PATTERN));
1077 
1078         // Date string
1079         assertEquals(expected, conf.getDate("date.string"));
1080         assertEquals(conf.getDate("date.string", DATE_PATTERN), expected);
1081 
1082         // Date object
1083         assertEquals(expected, conf.getDate("date.object"));
1084 
1085         // Calendar object
1086         assertEquals(expected, conf.getDate("calendar.object"));
1087 
1088         // interpolated value
1089         assertEquals(expected, conf.getDate("date.string.interpolated"));
1090     }
1091 
1092     @Test
1093     public void testGetDateArray() throws Exception {
1094         final DateFormat format = new SimpleDateFormat(DATE_PATTERN);
1095         final Date date1 = format.parse("2004-01-01");
1096         final Date date2 = format.parse("2004-12-31");
1097 
1098         // missing list
1099         final Date[] defaultValue = {date2, date1};
1100         assertArrayEquals(defaultValue, conf.getDateArray("date.list", defaultValue));
1101 
1102         final Date[] expected = {date1, date2};
1103 
1104         // list of strings
1105         assertArrayEquals(expected, conf.getDateArray("date.list1"));
1106 
1107         // list of strings, comma separated
1108         assertArrayEquals(expected, conf.getDateArray("date.list2"));
1109 
1110         // list of Date objects
1111         assertArrayEquals(expected, conf.getDateArray("date.list3"));
1112 
1113         // array of Date objects
1114         assertArrayEquals(expected, conf.getDateArray("date.list4"));
1115 
1116         // list of Calendar objects
1117         assertArrayEquals(expected, conf.getDateArray("date.list5"));
1118 
1119         // list of Date objects
1120         assertArrayEquals(expected, conf.getDateArray("date.list6"));
1121 
1122         // list of interpolated values
1123         assertArrayEquals(expected, conf.getDateArray("date.list.interpolated"));
1124 
1125         // single Date values
1126         assertArrayEquals(new Date[] {date1}, conf.getDateArray("date.string"));
1127         assertArrayEquals(new Date[] {date1}, conf.getDateArray("date.object"));
1128 
1129         // empty array
1130         assertArrayEquals(new Date[] {}, conf.getDateArray("empty"));
1131     }
1132 
1133     @Test
1134     public void testGetDateArrayWithFormat() throws Exception {
1135         final DateFormat format = new SimpleDateFormat("MM/dd/yyyy");
1136         final Date date1 = format.parse("01/01/2004");
1137         final Date date2 = format.parse("12/31/2004");
1138         final Date[] expected = {date1, date2};
1139 
1140         conf.addProperty("date.format", "01/01/2004");
1141         conf.addProperty("date.format", "12/31/2004");
1142         assertArrayEquals(expected, conf.getDateArray("date.format", "MM/dd/yyyy"));
1143     }
1144 
1145     @Test
1146     public void testGetDateList() throws Exception {
1147         final DateFormat format = new SimpleDateFormat(DATE_PATTERN);
1148         final Date date1 = format.parse("2004-01-01");
1149         final Date date2 = format.parse("2004-12-31");
1150 
1151         // missing list
1152         final List<Date> nullList = null;
1153         assertEquals(null, conf.getDateList("date.list", nullList));
1154 
1155         List<Object> expected = new ArrayList<>();
1156         expected.add(date1);
1157         expected.add(date2);
1158 
1159         // list of strings
1160         assertEquals(expected, conf.getDateList("date.list1"));
1161         assertEquals(conf.getList(Date.class, "date.list1"), expected);
1162 
1163         // list of strings, comma separated
1164         assertEquals(expected, conf.getDateList("date.list2"));
1165 
1166         // list of Date objects
1167         assertEquals(expected, conf.getDateList("date.list3"));
1168 
1169         // array of Date objects
1170         assertEquals(expected, conf.getDateList("date.list4"));
1171 
1172         // list of Calendar objects
1173         assertEquals(expected, conf.getDateList("date.list5"));
1174 
1175         // list of Date objects
1176         assertEquals(expected, conf.getDateList("date.list6"));
1177 
1178         // array of strings
1179         assertEquals(conf.getList(Date.class, "date.list7"), expected);
1180 
1181         // list of interpolated values
1182         assertEquals(expected, conf.getDateList("date.list.interpolated"));
1183 
1184         // single Date values
1185         expected = new ArrayList<>();
1186         expected.add(date1);
1187         assertEquals(expected, conf.getDateList("date.string"));
1188         assertEquals(expected, conf.getDateList("date.object"));
1189 
1190         // empty list
1191         assertEquals(new ArrayList<>(), conf.getDateList("empty"));
1192     }
1193 
1194     /**
1195      * Tests a conversion to a Date if no property is set with the date format, and the format is specified in the
1196      * conversion handler.
1197      */
1198     @Test
1199     public void testGetDateNoFormatPropertyConversionHandler() throws Exception {
1200         conf.clearProperty(DataConfiguration.DATE_FORMAT_KEY);
1201         final DefaultConversionHandler handler = new DefaultConversionHandler();
1202         handler.setDateFormat(DATE_PATTERN);
1203         conf.setConversionHandler(handler);
1204         assertEquals(expectedDate(), conf.getDate("date.string"));
1205     }
1206 
1207     /**
1208      * Tests a conversion to a Date if no property is set with the date format, and the format is directly passed in.
1209      */
1210     @Test
1211     public void testGetDateNoFormatPropertyDirectlySpecified() throws Exception {
1212         conf.clearProperty(DataConfiguration.DATE_FORMAT_KEY);
1213         assertEquals(expectedDate(), conf.getDate("date.string", DATE_PATTERN));
1214     }
1215 
1216     @Test
1217     public void testGetDoubleArray() {
1218         // missing list
1219         final double[] defaultValue = {2, 1};
1220         assertArrayEquals(defaultValue, conf.getDoubleArray("double.list", defaultValue), 0);
1221 
1222         final double[] expected = {1, 2};
1223 
1224         // list of strings
1225         assertArrayEquals(expected, conf.getDoubleArray("double.list1"), 0);
1226 
1227         // list of strings, comma separated
1228         assertArrayEquals(expected, conf.getDoubleArray("double.list2"), 0);
1229 
1230         // list of Double objects
1231         assertArrayEquals(expected, conf.getDoubleArray("double.list3"), 0);
1232 
1233         // array of Double objects
1234         assertArrayEquals(expected, conf.getDoubleArray("double.list4"), 0);
1235 
1236         // array of double primitives
1237         assertArrayEquals(expected, conf.getDoubleArray("double.list5"), 0);
1238 
1239         // list of Double objects
1240         assertArrayEquals(expected, conf.getDoubleArray("double.list6"), 0);
1241 
1242         // list of interpolated values
1243         assertArrayEquals(expected, conf.getDoubleArray("double.list.interpolated"), 0);
1244 
1245         // single double values
1246         assertArrayEquals(new double[] {1}, conf.getDoubleArray("double.string"), 0);
1247         assertArrayEquals(new double[] {1}, conf.getDoubleArray("double.object"), 0);
1248 
1249         // empty array
1250         assertArrayEquals(new double[] {}, conf.getDoubleArray("empty"), 0);
1251     }
1252 
1253     @Test
1254     public void testGetDoubleList() {
1255         // missing list
1256         assertEquals(null, conf.getDoubleList("double.list", null));
1257 
1258         List<Object> expected = new ArrayList<>();
1259         expected.add(Double.valueOf("1"));
1260         expected.add(Double.valueOf("2"));
1261 
1262         // list of strings
1263         assertEquals(expected, conf.getDoubleList("double.list1"));
1264 
1265         // list of strings, comma separated
1266         assertEquals(expected, conf.getDoubleList("double.list2"));
1267 
1268         // list of Double objects
1269         assertEquals(expected, conf.getDoubleList("double.list3"));
1270 
1271         // array of Double objects
1272         assertEquals(expected, conf.getDoubleList("double.list4"));
1273 
1274         // array of double primitives
1275         assertEquals(expected, conf.getDoubleList("double.list5"));
1276 
1277         // list of Double objects
1278         assertEquals(expected, conf.getDoubleList("double.list6"));
1279 
1280         // list of interpolated values
1281         assertEquals(expected, conf.getDoubleList("double.list.interpolated"));
1282 
1283         // single double values
1284         expected = new ArrayList<>();
1285         expected.add(Double.valueOf("1"));
1286         assertEquals(expected, conf.getDoubleList("double.string"));
1287         assertEquals(expected, conf.getDoubleList("double.object"));
1288 
1289         // empty list
1290         assertEquals(new ArrayList<>(), conf.getDoubleList("empty"));
1291     }
1292 
1293     @Test
1294     public void testGetFloatArray() {
1295         // missing list
1296         final float[] defaultValue = {2, 1};
1297         assertArrayEquals(defaultValue, conf.getFloatArray("float.list", defaultValue), 0);
1298 
1299         final float[] expected = {1, 2};
1300 
1301         // list of strings
1302         assertArrayEquals(expected, conf.getFloatArray("float.list1"), 0);
1303 
1304         // list of strings, comma separated
1305         assertArrayEquals(expected, conf.getFloatArray("float.list2"), 0);
1306 
1307         // list of Float objects
1308         assertArrayEquals(expected, conf.getFloatArray("float.list3"), 0);
1309 
1310         // array of Float objects
1311         assertArrayEquals(expected, conf.getFloatArray("float.list4"), 0);
1312 
1313         // array of float primitives
1314         assertArrayEquals(expected, conf.getFloatArray("float.list5"), 0);
1315 
1316         // list of Float objects
1317         assertArrayEquals(expected, conf.getFloatArray("float.list6"), 0);
1318 
1319         // list of interpolated values
1320         assertArrayEquals(expected, conf.getFloatArray("float.list.interpolated"), 0);
1321 
1322         // single float values
1323         assertArrayEquals(new float[] {1}, conf.getFloatArray("float.string"), 0);
1324         assertArrayEquals(new float[] {1}, conf.getFloatArray("float.object"), 0);
1325 
1326         // empty array
1327         assertArrayEquals(new float[] {}, conf.getFloatArray("empty"), 0);
1328     }
1329 
1330     @Test
1331     public void testGetFloatList() {
1332         // missing list
1333         assertEquals(null, conf.getFloatList("float.list", null));
1334 
1335         List<Object> expected = new ArrayList<>();
1336         expected.add(Float.valueOf("1"));
1337         expected.add(Float.valueOf("2"));
1338 
1339         // list of strings
1340         assertEquals(expected, conf.getFloatList("float.list1"));
1341 
1342         // list of strings, comma separated
1343         assertEquals(expected, conf.getFloatList("float.list2"));
1344 
1345         // list of Float objects
1346         assertEquals(expected, conf.getFloatList("float.list3"));
1347 
1348         // array of Float objects
1349         assertEquals(expected, conf.getFloatList("float.list4"));
1350 
1351         // array of float primitives
1352         assertEquals(expected, conf.getFloatList("float.list5"));
1353 
1354         // list of Float objects
1355         assertEquals(expected, conf.getFloatList("float.list6"));
1356 
1357         // list of interpolated values
1358         assertEquals(expected, conf.getFloatList("float.list.interpolated"));
1359 
1360         // single float values
1361         expected = new ArrayList<>();
1362         expected.add(Float.valueOf("1"));
1363         assertEquals(expected, conf.getFloatList("float.string"));
1364         assertEquals(expected, conf.getFloatList("float.object"));
1365 
1366         // empty list
1367         assertEquals(new ArrayList<>(), conf.getFloatList("empty"));
1368     }
1369 
1370     @Test
1371     public void testGetInetAddress() throws Exception {
1372         final InetAddress expected = InetAddress.getByName("127.0.0.1");
1373 
1374         // address as string
1375         assertEquals(conf.get(InetAddress.class, "ip.string"), expected);
1376 
1377         // address object
1378         assertEquals(conf.get(InetAddress.class, "ip.object"), expected);
1379 
1380         // interpolated value
1381         assertEquals(conf.get(InetAddress.class, "ip.string.interpolated"), expected);
1382     }
1383 
1384     @Test
1385     public void testGetInetAddressInvalidType() {
1386         conf.setProperty("ip.unknownhost", "foo");
1387         assertThrows(ConversionException.class, () -> conf.get(InetAddress.class, "ip.unknownhost"));
1388     }
1389 
1390     @Test
1391     public void testGetIntegerArray() {
1392         // missing list
1393         final int[] defaultValue = {2, 1};
1394         assertArrayEquals(conf.getIntArray("integer.list", defaultValue), defaultValue);
1395 
1396         final int[] expected = {1, 2};
1397 
1398         // list of strings
1399         assertArrayEquals(expected, conf.getIntArray("integer.list1"));
1400 
1401         // list of strings, comma separated
1402         assertArrayEquals(expected, conf.getIntArray("integer.list2"));
1403 
1404         // list of Integer objects
1405         assertArrayEquals(expected, conf.getIntArray("integer.list3"));
1406 
1407         // array of Integer objects
1408         assertArrayEquals(expected, conf.getIntArray("integer.list4"));
1409 
1410         // array of int primitives
1411         assertArrayEquals(expected, conf.getIntArray("integer.list5"));
1412 
1413         // list of Integer objects
1414         assertArrayEquals(expected, conf.getIntArray("integer.list6"));
1415 
1416         // list of interpolated values
1417         assertArrayEquals(expected, conf.getIntArray("integer.list.interpolated"));
1418 
1419         // single int values
1420         assertArrayEquals(new int[] {1}, conf.getIntArray("integer.string"));
1421         assertArrayEquals(new int[] {1}, conf.getIntArray("integer.object"));
1422 
1423         // empty array
1424         assertArrayEquals(new int[] {}, conf.getIntArray("empty"));
1425     }
1426 
1427     @Test
1428     public void testGetIntegerList() {
1429         // missing list
1430         assertEquals(null, conf.getIntegerList("integer.list", null));
1431 
1432         List<Object> expected = new ArrayList<>();
1433         expected.add(Integer.valueOf("1"));
1434         expected.add(Integer.valueOf("2"));
1435 
1436         // list of strings
1437         assertEquals(expected, conf.getIntegerList("integer.list1"));
1438 
1439         // list of strings, comma separated
1440         assertEquals(expected, conf.getIntegerList("integer.list2"));
1441 
1442         // list of Integer objects
1443         assertEquals(expected, conf.getIntegerList("integer.list3"));
1444 
1445         // array of Integer objects
1446         assertEquals(expected, conf.getIntegerList("integer.list4"));
1447 
1448         // array of int primitives
1449         assertEquals(expected, conf.getIntegerList("integer.list5"));
1450 
1451         // list of Integer objects
1452         assertEquals(expected, conf.getIntegerList("integer.list6"));
1453 
1454         // list of interpolated values
1455         assertEquals(expected, conf.getIntegerList("integer.list.interpolated"));
1456 
1457         // single int values
1458         expected = new ArrayList<>();
1459         expected.add(Integer.valueOf("1"));
1460         assertEquals(expected, conf.getIntegerList("integer.string"));
1461         assertEquals(expected, conf.getIntegerList("integer.object"));
1462 
1463         // empty list
1464         assertEquals(new ArrayList<>(), conf.getIntegerList("empty"));
1465     }
1466 
1467     @Test
1468     public void testGetInternetAddress() throws Exception {
1469         final Object expected = new InternetAddress("dev@test.org");
1470 
1471         // address as string
1472         assertEquals(conf.get(expected.getClass(), "email.string"), expected);
1473 
1474         // address object
1475         assertEquals(conf.get(expected.getClass(), "email.object"), expected);
1476 
1477         // interpolated value
1478         assertEquals(conf.get(expected.getClass(), "email.string.interpolated"), expected);
1479 
1480         conf.setProperty("email.invalid", "dev@test@org");
1481         assertThrows(ConversionException.class, () -> conf.get(expected.getClass(), "email.invalid"));
1482     }
1483 
1484     @Test
1485     public void testGetInternetAddressInvalidType() throws Exception {
1486         final Object expected = new InternetAddress("dev@test.org");
1487         conf.setProperty("email.invalid", "dev@test@org");
1488         assertThrows(ConversionException.class, () -> conf.get(expected.getClass(), "email.invalid"));
1489     }
1490 
1491     @Test
1492     public void testGetInvalidType() {
1493         assertThrows(ConversionException.class, () -> conf.get(Boolean.class, "url.object", null));
1494     }
1495 
1496     @Test
1497     public void testGetKeys() {
1498         final Configuration baseconf = new BaseConfiguration();
1499         final DataConfiguration conf = new DataConfiguration(baseconf);
1500 
1501         baseconf.setProperty("foo", "bar");
1502 
1503         final Iterator<String> it = conf.getKeys();
1504         assertTrue(it.hasNext());
1505         assertEquals("foo", it.next());
1506         assertFalse(it.hasNext());
1507     }
1508 
1509     @Test
1510     public void testGetLocale() {
1511         // language
1512         conf.setProperty("locale", "fr");
1513         assertEquals(new Locale("fr", ""), conf.getLocale("locale"));
1514 
1515         // language + variant
1516         conf.setProperty("locale", "fr__POSIX");
1517         assertEquals(new Locale("fr", "", "POSIX"), conf.getLocale("locale"));
1518 
1519         // country
1520         conf.setProperty("locale", "_FR");
1521         assertEquals(new Locale("", "FR"), conf.getLocale("locale"));
1522 
1523         // country + variant
1524         conf.setProperty("locale", "_FR_WIN");
1525         assertEquals(new Locale("", "FR", "WIN"), conf.getLocale("locale"));
1526 
1527         // language + country
1528         conf.setProperty("locale", "fr_FR");
1529         assertEquals(new Locale("fr", "FR"), conf.getLocale("locale"));
1530 
1531         // language + country + variant
1532         conf.setProperty("locale", "fr_FR_MAC");
1533         assertEquals(new Locale("fr", "FR", "MAC"), conf.getLocale("locale"));
1534 
1535         // default value
1536         conf.setProperty("locale", "fr");
1537         assertEquals(Locale.FRENCH, conf.getLocale("locale", Locale.GERMAN));
1538         assertEquals(Locale.GERMAN, conf.getLocale("localeNotInConfig", Locale.GERMAN));
1539 
1540         // interpolated value
1541         assertEquals(Locale.FRENCH, conf.getLocale("locale.string.interpolated"));
1542     }
1543 
1544     @Test
1545     public void testGetLocaleArray() throws Exception {
1546         // missing list
1547         final Locale[] defaultValue = {Locale.GERMAN, Locale.FRENCH};
1548         assertArrayEquals(conf.getLocaleArray("locale.list", defaultValue), defaultValue);
1549 
1550         final Locale[] expected = {Locale.FRENCH, Locale.GERMAN};
1551 
1552         // list of strings
1553         assertArrayEquals(expected, conf.getLocaleArray("locale.list1"));
1554 
1555         // list of strings, comma separated
1556         assertArrayEquals(expected, conf.getLocaleArray("locale.list2"));
1557 
1558         // list of Locale objects
1559         assertArrayEquals(expected, conf.getLocaleArray("locale.list3"));
1560 
1561         // array of Locale objects
1562         assertArrayEquals(expected, conf.getLocaleArray("locale.list4"));
1563 
1564         // list of Locale objects
1565         assertArrayEquals(expected, conf.getLocaleArray("locale.list6"));
1566 
1567         // list of interpolated values
1568         assertArrayEquals(expected, conf.getLocaleArray("locale.list.interpolated"));
1569 
1570         // single Locale values
1571         assertArrayEquals(new Locale[] {Locale.FRENCH}, conf.getLocaleArray("locale.string"));
1572         assertArrayEquals(new Locale[] {Locale.FRENCH}, conf.getLocaleArray("locale.object"));
1573 
1574         // empty array
1575         assertArrayEquals(new Locale[] {}, conf.getLocaleArray("empty"));
1576     }
1577 
1578     @Test
1579     public void testGetLocaleList() throws Exception {
1580         // missing list
1581         assertEquals(null, conf.getLocaleList("locale.list", null));
1582 
1583         List<Object> expected = new ArrayList<>();
1584         expected.add(Locale.FRENCH);
1585         expected.add(Locale.GERMAN);
1586 
1587         // list of strings
1588         assertEquals(expected, conf.getLocaleList("locale.list1"));
1589 
1590         // list of strings, comma separated
1591         assertEquals(expected, conf.getLocaleList("locale.list2"));
1592 
1593         // list of Locale objects
1594         assertEquals(expected, conf.getLocaleList("locale.list3"));
1595 
1596         // array of Locale objects
1597         assertEquals(expected, conf.getLocaleList("locale.list4"));
1598 
1599         // list of Locale objects
1600         assertEquals(expected, conf.getLocaleList("locale.list6"));
1601 
1602         // list of interpolated values
1603         assertEquals(expected, conf.getLocaleList("locale.list.interpolated"));
1604 
1605         // single Locale values
1606         expected = new ArrayList<>();
1607         expected.add(Locale.FRENCH);
1608         assertEquals(expected, conf.getLocaleList("locale.string"));
1609         assertEquals(expected, conf.getLocaleList("locale.object"));
1610 
1611         // empty list
1612         assertEquals(new ArrayList<>(), conf.getLocaleList("empty"));
1613     }
1614 
1615     @Test
1616     public void testGetLongArray() {
1617         // missing list
1618         final long[] defaultValue = {2, 1};
1619         assertArrayEquals(conf.getLongArray("long.list", defaultValue), defaultValue);
1620 
1621         final long[] expected = {1, 2};
1622 
1623         // list of strings
1624         assertArrayEquals(expected, conf.getLongArray("long.list1"));
1625 
1626         // list of strings, comma separated
1627         assertArrayEquals(expected, conf.getLongArray("long.list2"));
1628 
1629         // list of Long objects
1630         assertArrayEquals(expected, conf.getLongArray("long.list3"));
1631 
1632         // array of Long objects
1633         assertArrayEquals(expected, conf.getLongArray("long.list4"));
1634 
1635         // array of long primitives
1636         assertArrayEquals(expected, conf.getLongArray("long.list5"));
1637 
1638         // list of Long objects
1639         assertArrayEquals(expected, conf.getLongArray("long.list6"));
1640 
1641         // list of interpolated values
1642         assertArrayEquals(expected, conf.getLongArray("long.list.interpolated"));
1643 
1644         // single long values
1645         assertArrayEquals(new long[] {1}, conf.getLongArray("long.string"));
1646         assertArrayEquals(new long[] {1}, conf.getLongArray("long.object"));
1647 
1648         // empty array
1649         assertArrayEquals(new long[] {}, conf.getLongArray("empty"));
1650     }
1651 
1652     @Test
1653     public void testGetLongList() {
1654         // missing list
1655         assertEquals(null, conf.getLongList("long.list", null));
1656 
1657         List<Object> expected = new ArrayList<>();
1658         expected.add(Long.valueOf("1"));
1659         expected.add(Long.valueOf("2"));
1660 
1661         // list of strings
1662         assertEquals(expected, conf.getLongList("long.list1"));
1663 
1664         // list of strings, comma separated
1665         assertEquals(expected, conf.getLongList("long.list2"));
1666 
1667         // list of Long objects
1668         assertEquals(expected, conf.getLongList("long.list3"));
1669 
1670         // array of Long objects
1671         assertEquals(expected, conf.getLongList("long.list4"));
1672 
1673         // array of long primitives
1674         assertEquals(expected, conf.getLongList("long.list5"));
1675 
1676         // list of Long objects
1677         assertEquals(expected, conf.getLongList("long.list6"));
1678 
1679         // list of interpolated values
1680         assertEquals(expected, conf.getLongList("long.list.interpolated"));
1681 
1682         // single long values
1683         expected = new ArrayList<>();
1684         expected.add(Long.valueOf("1"));
1685         assertEquals(expected, conf.getLongList("long.string"));
1686         assertEquals(expected, conf.getLongList("long.object"));
1687 
1688         // empty list
1689         assertEquals(new ArrayList<>(), conf.getLongList("empty"));
1690     }
1691 
1692     @Test
1693     public void testGetPrimitiveArrayInvalidType() {
1694         assertThrows(ConversionException.class, () -> conf.getArray(Boolean.TYPE, "calendar.list4"));
1695     }
1696 
1697     /**
1698      * Tests whether a string property can be obtained through get() if no type conversion is required.
1699      */
1700     @Test
1701     public void testGetPropertyWithoutConversion() {
1702         final String key = "test.str";
1703         final String value = "someTestValue";
1704         conf.addProperty(key, value);
1705         assertEquals(value, conf.get(String.class, key));
1706     }
1707 
1708     @Test
1709     public void testGetShortArray() {
1710         // missing list
1711         final short[] defaultValue = {2, 1};
1712         assertArrayEquals(conf.getShortArray("short.list", defaultValue), defaultValue);
1713 
1714         final short[] expected = {1, 2};
1715 
1716         // list of strings
1717         assertArrayEquals(expected, conf.getShortArray("short.list1"));
1718 
1719         // list of strings, comma separated
1720         assertArrayEquals(expected, conf.getShortArray("short.list2"));
1721 
1722         // list of Byte objects
1723         assertArrayEquals(expected, conf.getShortArray("short.list3"));
1724 
1725         // array of Byte objects
1726         assertArrayEquals(expected, conf.getShortArray("short.list4"));
1727 
1728         // array of byte primitives
1729         assertArrayEquals(expected, conf.getShortArray("short.list5"));
1730 
1731         // list of Byte objects
1732         assertArrayEquals(expected, conf.getShortArray("short.list6"));
1733 
1734         // list of interpolated values
1735         assertArrayEquals(expected, conf.getShortArray("short.list.interpolated"));
1736 
1737         // single byte values
1738         assertArrayEquals(new short[] {1}, conf.getShortArray("short.string"));
1739         assertArrayEquals(new short[] {1}, conf.getShortArray("short.object"));
1740 
1741         // empty array
1742         assertArrayEquals(new short[] {}, conf.getShortArray("empty"));
1743     }
1744 
1745     @Test
1746     public void testGetShortList() {
1747         // missing list
1748         assertEquals(null, conf.getShortList("short.list", null));
1749 
1750         List<Object> expected = new ArrayList<>();
1751         expected.add(Short.valueOf("1"));
1752         expected.add(Short.valueOf("2"));
1753 
1754         // list of strings
1755         assertEquals(expected, conf.getShortList("short.list1"));
1756 
1757         // list of strings, comma separated
1758         assertEquals(expected, conf.getShortList("short.list2"));
1759 
1760         // list of Short objects
1761         assertEquals(expected, conf.getShortList("short.list3"));
1762 
1763         // array of Short objects
1764         assertEquals(expected, conf.getShortList("short.list4"));
1765 
1766         // array of short primitives
1767         assertEquals(expected, conf.getShortList("short.list5"));
1768 
1769         // list of Short objects
1770         assertEquals(expected, conf.getShortList("short.list6"));
1771 
1772         // list of interpolated values
1773         assertEquals(expected, conf.getShortList("short.list.interpolated"));
1774 
1775         // single short values
1776         expected = new ArrayList<>();
1777         expected.add(Short.valueOf("1"));
1778         assertEquals(expected, conf.getShortList("short.string"));
1779         assertEquals(expected, conf.getShortList("short.object"));
1780 
1781         // empty list
1782         assertEquals(new ArrayList<>(), conf.getShortList("empty"));
1783     }
1784 
1785     @Test
1786     public void testGetUnknown() {
1787         assertNull(conf.get(Object.class, "unknownkey"));
1788     }
1789 
1790     @Test
1791     public void testGetUnknownException() {
1792         conf.setThrowExceptionOnMissing(true);
1793         assertThrows(NoSuchElementException.class, () -> conf.get(Object.class, "unknownkey"));
1794     }
1795 
1796     @Test
1797     public void testGetURI() throws Exception {
1798         // missing URI
1799         final URI defaultValue = new URI("http://www.google.com");
1800         assertEquals(conf.getURI("url", defaultValue), defaultValue);
1801 
1802         final URI expected = new URI("http://jakarta.apache.org");
1803 
1804         // URI string
1805         assertEquals(expected, conf.getURI("uri.string"));
1806 
1807         // URI object
1808         assertEquals(expected, conf.getURI("uri.object"));
1809 
1810         // interpolated value
1811         assertEquals(expected, conf.getURI("uri.string.interpolated"));
1812     }
1813 
1814     @Test
1815     public void testGetURIArray() throws Exception {
1816         // missing list
1817         final URI[] defaultValue = {new URI("http://www.apache.org"), new URI("http://jakarta.apache.org")};
1818         assertArrayEquals(conf.getURIArray("url.list", defaultValue), defaultValue);
1819 
1820         final URI[] expected = {new URI("http://jakarta.apache.org"), new URI("http://www.apache.org")};
1821 
1822         // list of strings
1823         assertArrayEquals(expected, conf.getURIArray("uri.list1"));
1824 
1825         // list of strings, comma separated
1826         assertArrayEquals(expected, conf.getURIArray("uri.list2"));
1827 
1828         // list of URI objects
1829         assertArrayEquals(expected, conf.getURIArray("uri.list3"));
1830 
1831         // array of URI objects
1832         assertArrayEquals(expected, conf.getURIArray("uri.list4"));
1833 
1834         // list of URI objects
1835         assertArrayEquals(expected, conf.getURIArray("uri.list6"));
1836 
1837         // list of interpolated values
1838         assertArrayEquals(expected, conf.getURIArray("uri.list.interpolated"));
1839 
1840         // single URI values
1841         assertArrayEquals(new URI[] {new URI("http://jakarta.apache.org")}, conf.getURIArray("uri.string"));
1842         assertArrayEquals(new URI[] {new URI("http://jakarta.apache.org")}, conf.getURIArray("uri.object"));
1843 
1844         // empty array
1845         assertArrayEquals(new URI[] {}, conf.getURIArray("empty"));
1846     }
1847 
1848     @Test
1849     public void testGetURIList() throws Exception {
1850         // missing list
1851         assertEquals(null, conf.getURIList("uri.list", null));
1852 
1853         List<Object> expected = new ArrayList<>();
1854         expected.add(new URI("http://jakarta.apache.org"));
1855         expected.add(new URI("http://www.apache.org"));
1856 
1857         // list of strings
1858         assertEquals(expected, conf.getURIList("uri.list1"));
1859 
1860         // list of strings, comma separated
1861         assertEquals(expected, conf.getURIList("uri.list2"));
1862 
1863         // list of URI objects
1864         assertEquals(expected, conf.getURIList("uri.list3"));
1865 
1866         // array of URI objects
1867         assertEquals(expected, conf.getURIList("uri.list4"));
1868 
1869         // list of URI objects
1870         assertEquals(expected, conf.getURIList("uri.list6"));
1871 
1872         // list of interpolated values
1873         assertEquals(expected, conf.getURIList("uri.list.interpolated"));
1874 
1875         // single URI values
1876         expected = new ArrayList<>();
1877         expected.add(new URI("http://jakarta.apache.org"));
1878         assertEquals(expected, conf.getURIList("uri.string"));
1879         assertEquals(expected, conf.getURIList("uri.object"));
1880 
1881         // empty list
1882         assertEquals(new ArrayList<>(), conf.getURIList("empty"));
1883     }
1884 
1885     @Test
1886     public void testGetURL() throws Exception {
1887         // missing URL
1888         final URL defaultValue = new URL("http://www.google.com");
1889         assertEquals(conf.getURL("url", defaultValue), defaultValue);
1890 
1891         final URL expected = new URL("http://jakarta.apache.org");
1892 
1893         // URL string
1894         assertEquals(expected, conf.getURL("url.string"));
1895 
1896         // URL object
1897         assertEquals(expected, conf.getURL("url.object"));
1898 
1899         // interpolated value
1900         assertEquals(expected, conf.getURL("url.string.interpolated"));
1901     }
1902 
1903     @Test
1904     public void testGetURLArray() throws Exception {
1905         // missing list
1906         final URL[] defaultValue = {new URL("http://www.apache.org"), new URL("http://jakarta.apache.org")};
1907         assertArrayEquals(conf.getURLArray("url.list", defaultValue), defaultValue);
1908 
1909         final URL[] expected = {new URL("http://jakarta.apache.org"), new URL("http://www.apache.org")};
1910 
1911         // list of strings
1912         assertArrayEquals(expected, conf.getURLArray("url.list1"));
1913 
1914         // list of strings, comma separated
1915         assertArrayEquals(expected, conf.getURLArray("url.list2"));
1916 
1917         // list of URL objects
1918         assertArrayEquals(expected, conf.getURLArray("url.list3"));
1919 
1920         // array of URL objects
1921         assertArrayEquals(expected, conf.getURLArray("url.list4"));
1922 
1923         // list of URL objects
1924         assertArrayEquals(expected, conf.getURLArray("url.list6"));
1925 
1926         // list of interpolated values
1927         assertArrayEquals(expected, conf.getURLArray("url.list.interpolated"));
1928 
1929         // single URL values
1930         assertArrayEquals(new URL[] {new URL("http://jakarta.apache.org")}, conf.getURLArray("url.string"));
1931         assertArrayEquals(new URL[] {new URL("http://jakarta.apache.org")}, conf.getURLArray("url.object"));
1932 
1933         // empty array
1934         assertArrayEquals(new URL[] {}, conf.getURLArray("empty"));
1935     }
1936 
1937     @Test
1938     public void testGetURLList() throws Exception {
1939         // missing list
1940         assertEquals(null, conf.getURLList("url.list", null));
1941 
1942         List<Object> expected = new ArrayList<>();
1943         expected.add(new URL("http://jakarta.apache.org"));
1944         expected.add(new URL("http://www.apache.org"));
1945 
1946         // list of strings
1947         assertEquals(expected, conf.getURLList("url.list1"));
1948 
1949         // list of strings, comma separated
1950         assertEquals(expected, conf.getURLList("url.list2"));
1951 
1952         // list of URL objects
1953         assertEquals(expected, conf.getURLList("url.list3"));
1954 
1955         // array of URL objects
1956         assertEquals(expected, conf.getURLList("url.list4"));
1957 
1958         // list of URL objects
1959         assertEquals(expected, conf.getURLList("url.list6"));
1960 
1961         // list of interpolated values
1962         assertEquals(expected, conf.getURLList("url.list.interpolated"));
1963 
1964         // single URL values
1965         expected = new ArrayList<>();
1966         expected.add(new URL("http://jakarta.apache.org"));
1967         assertEquals(expected, conf.getURLList("url.string"));
1968         assertEquals(expected, conf.getURLList("url.object"));
1969 
1970         // empty list
1971         assertEquals(new ArrayList<>(), conf.getURLList("empty"));
1972     }
1973 
1974     @Test
1975     public void testIsEmpty() {
1976         final Configuration baseconf = new BaseConfiguration();
1977         final DataConfiguration conf = new DataConfiguration(baseconf);
1978 
1979         assertTrue(conf.isEmpty());
1980         baseconf.setProperty("foo", "bar");
1981         assertFalse(conf.isEmpty());
1982     }
1983 
1984     @Test
1985     public void testNullConfiguration() {
1986         assertThrows(NullPointerException.class, () -> new DataConfiguration(null));
1987     }
1988 }