001    /*
002     * Copyright 2005,2009 Ivan SZKIBA
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.ini4j;
017    
018    import org.ini4j.sample.Dwarf;
019    import org.ini4j.sample.DwarfBean;
020    
021    import org.ini4j.test.DwarfsData;
022    import org.ini4j.test.DwarfsData.DwarfData;
023    import org.ini4j.test.Helper;
024    
025    import static org.junit.Assert.assertArrayEquals;
026    import static org.junit.Assert.assertEquals;
027    import static org.junit.Assert.assertNotNull;
028    import static org.junit.Assert.assertNull;
029    import static org.junit.Assert.assertTrue;
030    
031    import org.junit.Test;
032    
033    import java.net.URI;
034    
035    public class BasicOptionMapTest extends Ini4jCase
036    {
037        private static BasicOptionMap _map;
038    
039        static
040        {
041            _map = new BasicOptionMap();
042            _map.putAll(Helper.newDwarfsOpt());
043        }
044    
045        @Test public void testAddPutNullAndString()
046        {
047            OptionMap map = new BasicOptionMap();
048            Object o;
049    
050            // null
051            o = null;
052            map.add(Dwarf.PROP_AGE, o);
053            assertNull(map.get(Dwarf.PROP_AGE));
054            map.put(Dwarf.PROP_AGE, new Integer(DwarfsData.doc.age));
055            assertNotNull(map.get(Dwarf.PROP_AGE));
056            map.add(Dwarf.PROP_AGE, o, 0);
057            assertNull(map.get(Dwarf.PROP_AGE, 0));
058            map.put(Dwarf.PROP_AGE, new Integer(DwarfsData.doc.age), 0);
059            assertNotNull(map.get(Dwarf.PROP_AGE, 0));
060            map.put(Dwarf.PROP_AGE, o, 0);
061            assertNull(map.get(Dwarf.PROP_AGE, 0));
062            map.remove(Dwarf.PROP_AGE);
063            map.put(Dwarf.PROP_AGE, o);
064            assertNull(map.get(Dwarf.PROP_AGE));
065    
066            // str
067            map.remove(Dwarf.PROP_AGE);
068            o = String.valueOf(DwarfsData.doc.age);
069            map.add(Dwarf.PROP_AGE, o);
070            assertEquals(o, map.get(Dwarf.PROP_AGE));
071            map.remove(Dwarf.PROP_AGE);
072            map.put(Dwarf.PROP_AGE, o);
073            assertEquals(o, map.get(Dwarf.PROP_AGE));
074            o = String.valueOf(DwarfsData.happy.age);
075            map.add(Dwarf.PROP_AGE, o, 0);
076            assertEquals(new Integer(DwarfsData.happy.age), (Integer) map.get(Dwarf.PROP_AGE, 0, int.class));
077            o = String.valueOf(DwarfsData.doc.age);
078            map.put(Dwarf.PROP_AGE, o, 0);
079            assertEquals(DwarfsData.doc.age, (int) map.get(Dwarf.PROP_AGE, 0, int.class));
080        }
081    
082        @Test public void testFetch()
083        {
084            OptionMap map = new BasicOptionMap();
085    
086            Helper.addDwarf(map, DwarfsData.dopey, false);
087            Helper.addDwarf(map, DwarfsData.bashful);
088            Helper.addDwarf(map, DwarfsData.doc);
089    
090            // dopey
091            assertEquals(DwarfsData.dopey.weight, map.fetch(Dwarf.PROP_WEIGHT, double.class), Helper.DELTA);
092            map.add(Dwarf.PROP_HEIGHT, map.get(Dwarf.PROP_HEIGHT));
093            assertEquals(DwarfsData.dopey.height, map.fetch(Dwarf.PROP_HEIGHT, 1, double.class), Helper.DELTA);
094    
095            // sneezy
096            map.clear();
097            Helper.addDwarf(map, DwarfsData.happy);
098            Helper.addDwarf(map, DwarfsData.sneezy, false);
099            assertEquals(DwarfsData.sneezy.homePage, map.fetch(Dwarf.PROP_HOME_PAGE, URI.class));
100    
101            // null
102            map = new BasicOptionMap();
103            map.add(Dwarf.PROP_AGE, null);
104            assertNull(map.fetch(Dwarf.PROP_AGE, 0));
105        }
106    
107        @Test public void testFetchAllException()
108        {
109            OptionMap map = new BasicOptionMap();
110    
111            try
112            {
113                map.fetchAll(Dwarf.PROP_FORTUNE_NUMBER, String.class);
114                missing(IllegalArgumentException.class);
115            }
116            catch (IllegalArgumentException x)
117            {
118                //
119            }
120        }
121    
122        @Test public void testFromToAs() throws Exception
123        {
124            DwarfBean bean = new DwarfBean();
125    
126            _map.to(bean);
127            Helper.assertEquals(DwarfsData.dopey, bean);
128            OptionMap map = new BasicOptionMap();
129    
130            map.from(bean);
131            bean = new DwarfBean();
132            map.to(bean);
133            Helper.assertEquals(DwarfsData.dopey, bean);
134            Dwarf proxy = map.as(Dwarf.class);
135    
136            Helper.assertEquals(DwarfsData.dopey, proxy);
137            map.clear();
138            _map.to(proxy);
139            Helper.assertEquals(DwarfsData.dopey, proxy);
140        }
141    
142        @Test public void testFromToAsPrefixed() throws Exception
143        {
144            fromToAs(DwarfsData.bashful);
145            fromToAs(DwarfsData.doc);
146            fromToAs(DwarfsData.dopey);
147            fromToAs(DwarfsData.grumpy);
148            fromToAs(DwarfsData.happy);
149            fromToAs(DwarfsData.sleepy);
150            fromToAs(DwarfsData.sneezy);
151        }
152    
153        @Test public void testGet()
154        {
155            OptionMap map = new BasicOptionMap();
156    
157            // bashful
158            Helper.addDwarf(map, DwarfsData.bashful, false);
159            assertEquals(DwarfsData.bashful.weight, map.get(Dwarf.PROP_WEIGHT, double.class), Helper.DELTA);
160            map.add(Dwarf.PROP_HEIGHT, map.get(Dwarf.PROP_HEIGHT));
161            assertEquals(DwarfsData.bashful.height, map.get(Dwarf.PROP_HEIGHT, 1, double.class), Helper.DELTA);
162            assertEquals(DwarfsData.bashful.homePage, map.fetch(Dwarf.PROP_HOME_PAGE, URI.class));
163        }
164    
165        @Test public void testGetAllException()
166        {
167            OptionMap map = new BasicOptionMap();
168    
169            try
170            {
171                map.getAll(Dwarf.PROP_FORTUNE_NUMBER, String.class);
172                missing(IllegalArgumentException.class);
173            }
174            catch (IllegalArgumentException x)
175            {
176                //
177            }
178        }
179    
180        @Test public void testPropertyFirstUpper()
181        {
182            DwarfBean bean;
183            OptionMap map = new BasicOptionMap(true);
184    
185            map.from(DwarfsData.bashful);
186            assertTrue(map.containsKey("Age"));
187            assertTrue(map.containsKey("Height"));
188            assertTrue(map.containsKey("Weight"));
189            assertTrue(map.containsKey("HomePage"));
190            assertTrue(map.containsKey("HomeDir"));
191            bean = new DwarfBean();
192            map.to(bean);
193            Helper.assertEquals(DwarfsData.bashful, bean);
194            Helper.assertEquals(DwarfsData.bashful, map.as(Dwarf.class));
195        }
196    
197        @Test public void testPut()
198        {
199            OptionMap map = new BasicOptionMap();
200    
201            map.add(Dwarf.PROP_AGE, new Integer(DwarfsData.sneezy.age));
202            map.put(Dwarf.PROP_HEIGHT, new Double(DwarfsData.sneezy.height));
203            map.add(Dwarf.PROP_HOME_DIR, DwarfsData.sneezy.homeDir);
204            map.add(Dwarf.PROP_WEIGHT, new Double(DwarfsData.sneezy.weight), 0);
205            map.put(Dwarf.PROP_HOME_PAGE, null);
206            map.put(Dwarf.PROP_HOME_PAGE, DwarfsData.sneezy.homePage);
207            map.add(Dwarf.PROP_FORTUNE_NUMBER, new Integer(DwarfsData.sneezy.fortuneNumber[1]));
208            map.add(Dwarf.PROP_FORTUNE_NUMBER, new Integer(DwarfsData.sneezy.fortuneNumber[2]));
209            map.add(Dwarf.PROP_FORTUNE_NUMBER, new Integer(0));
210            map.put(Dwarf.PROP_FORTUNE_NUMBER, new Integer(DwarfsData.sneezy.fortuneNumber[3]), 2);
211            map.add(Dwarf.PROP_FORTUNE_NUMBER, new Integer(DwarfsData.sneezy.fortuneNumber[0]), 0);
212            Helper.assertEquals(DwarfsData.sneezy, map.as(Dwarf.class));
213        }
214    
215        @Test public void testPutAllException()
216        {
217            OptionMap map = new BasicOptionMap();
218    
219            try
220            {
221                map.putAll(Dwarf.PROP_FORTUNE_NUMBER, new Integer(0));
222                missing(IllegalArgumentException.class);
223            }
224            catch (IllegalArgumentException x)
225            {
226                //
227            }
228        }
229    
230        @Test public void testPutGetFetchAll()
231        {
232            OptionMap map = new BasicOptionMap();
233    
234            map.putAll(Dwarf.PROP_FORTUNE_NUMBER, DwarfsData.sneezy.fortuneNumber);
235            assertEquals(DwarfsData.sneezy.fortuneNumber.length, map.length(Dwarf.PROP_FORTUNE_NUMBER));
236            assertArrayEquals(DwarfsData.sneezy.fortuneNumber, map.getAll(Dwarf.PROP_FORTUNE_NUMBER, int[].class));
237            assertArrayEquals(DwarfsData.sneezy.fortuneNumber, map.fetchAll(Dwarf.PROP_FORTUNE_NUMBER, int[].class));
238            map.putAll(Dwarf.PROP_FORTUNE_NUMBER, (int[]) null);
239            assertEquals(0, map.length(Dwarf.PROP_FORTUNE_NUMBER));
240            assertEquals(0, map.getAll(Dwarf.PROP_FORTUNE_NUMBER, int[].class).length);
241            assertEquals(0, map.fetchAll(Dwarf.PROP_FORTUNE_NUMBER, int[].class).length);
242        }
243    
244        @Test public void testResolve() throws Exception
245        {
246            StringBuilder buffer;
247            String input;
248    
249            // simple value
250            input = "${height}";
251            buffer = new StringBuilder(input);
252    
253            _map.resolve(buffer);
254            assertEquals("" + DwarfsData.dopey.getHeight(), buffer.toString());
255    
256            // system property
257            input = "${@prop/user.home}";
258            buffer = new StringBuilder(input);
259    
260            _map.resolve(buffer);
261            assertEquals(System.getProperty("user.home"), buffer.toString());
262    
263            // system environment
264            input = "${@env/PATH}";
265            buffer = new StringBuilder(input);
266            try
267            {
268                _map.resolve(buffer);
269                assertEquals(System.getenv("PATH"), buffer.toString());
270            }
271            catch (Error e)
272            {
273                // retroweaver + JDK 1.4 throws Error on getenv
274            }
275    
276            // unknown variable
277            input = "${no such name}";
278            buffer = new StringBuilder(input);
279    
280            _map.resolve(buffer);
281            assertEquals(input, buffer.toString());
282    
283            // small input
284            input = "${";
285            buffer = new StringBuilder(input);
286    
287            _map.resolve(buffer);
288            assertEquals(input, buffer.toString());
289    
290            // incorrect references
291            input = "${weight";
292            buffer = new StringBuilder(input);
293    
294            _map.resolve(buffer);
295            assertEquals(input, buffer.toString());
296    
297            // empty references
298            input = "jim${}";
299            buffer = new StringBuilder(input);
300    
301            _map.resolve(buffer);
302            assertEquals(input, buffer.toString());
303    
304            // escaped references
305            input = "${weight}";
306            buffer = new StringBuilder(input);
307    
308            _map.resolve(buffer);
309            assertEquals("" + DwarfsData.dopey.getWeight(), buffer.toString());
310            input = "\\" + input;
311            buffer = new StringBuilder(input);
312    
313            assertEquals(input, buffer.toString());
314        }
315    
316        private void fromToAs(DwarfData dwarf)
317        {
318            String prefix = dwarf.name + '.';
319            DwarfBean bean = new DwarfBean();
320    
321            _map.to(bean, prefix);
322            Helper.assertEquals(dwarf, bean);
323            OptionMap map = new BasicOptionMap();
324    
325            map.from(bean, prefix);
326            bean = new DwarfBean();
327            map.to(bean, prefix);
328            Helper.assertEquals(dwarf, bean);
329            Dwarf proxy = map.as(Dwarf.class, prefix);
330    
331            Helper.assertEquals(dwarf, proxy);
332            map.clear();
333            _map.to(proxy, prefix);
334            Helper.assertEquals(dwarf, proxy);
335        }
336    }