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.spi;
017    
018    import org.easymock.EasyMock;
019    
020    import org.ini4j.Config;
021    import org.ini4j.Ini4jCase;
022    import org.ini4j.InvalidFileFormatException;
023    
024    import org.ini4j.sample.Dwarf;
025    import org.ini4j.sample.Dwarfs;
026    
027    import org.ini4j.test.DwarfsData;
028    import org.ini4j.test.Helper;
029    
030    import static org.junit.Assert.assertEquals;
031    import static org.junit.Assert.assertSame;
032    import static org.junit.Assert.fail;
033    
034    import org.junit.Test;
035    
036    import java.io.ByteArrayInputStream;
037    import java.io.StringReader;
038    
039    public class IniParserTest extends Ini4jCase
040    {
041        private static final String[] BAD = { "[section\noption=value\n", "[]\noption=value", "section\noption=value", "[section]\noption\n", "[section]\n=value\n", "[section]\n\\u000d\\u000d=value\n" };
042        private static final String CFG_LOWER = "[SectioN]\n\nOptioN=ValuE\n";
043        private static final String CFG_UNNAMED = "[]\noption=value\n";
044        private static final String CFG_EMPTY_OPTION = "[section]\noption\n";
045        private static final String CFG_GLOBAL = "option=value\n";
046        private static final String[] CFG_EXTRA = { CFG_EMPTY_OPTION, CFG_UNNAMED, CFG_GLOBAL };
047        private static final String ANONYMOUS = "?";
048        private static final String EMPTY = "";
049        private static final String SECTION = "section";
050        private static final String OPTION = "option";
051        private static final String VALUE = "value";
052    
053        @Test public void testEmpty() throws Exception
054        {
055            IniParser parser = new IniParser();
056            IniHandler handler = EasyMock.createMock(IniHandler.class);
057    
058            handler.startIni();
059            handler.endIni();
060            EasyMock.replay(handler);
061            parser.parse(new StringReader(EMPTY), handler);
062            EasyMock.verify(handler);
063        }
064    
065        @Test public void testEmptyOption() throws Exception
066        {
067            IniParser parser = new IniParser();
068            IniHandler handler = EasyMock.createMock(IniHandler.class);
069    
070            handler.startIni();
071            handler.startSection(SECTION);
072            handler.handleOption(OPTION, null);
073            handler.endSection();
074            handler.endIni();
075            EasyMock.replay(handler);
076            Config cfg = new Config();
077    
078            cfg.setEmptyOption(true);
079            parser.setConfig(cfg);
080            parser.parse(new StringReader(CFG_EMPTY_OPTION), handler);
081            EasyMock.verify(handler);
082        }
083    
084        @Test public void testGlobalSection() throws Exception
085        {
086            IniParser parser = new IniParser();
087            IniHandler handler = EasyMock.createMock(IniHandler.class);
088    
089            handler.startIni();
090            handler.startSection(ANONYMOUS);
091            handler.handleOption(OPTION, VALUE);
092            handler.endSection();
093            handler.endIni();
094            EasyMock.replay(handler);
095            Config cfg = new Config();
096    
097            cfg.setGlobalSection(true);
098            parser.setConfig(cfg);
099            parser.parse(new StringReader(CFG_GLOBAL), handler);
100            EasyMock.verify(handler);
101        }
102    
103        @Test public void testLower() throws Exception
104        {
105            IniParser parser = new IniParser();
106            IniHandler handler = EasyMock.createMock(IniHandler.class);
107    
108            handler.startIni();
109            handler.startSection(SECTION);
110            handler.handleOption(OPTION, "ValuE");
111            handler.endSection();
112            handler.endIni();
113            EasyMock.replay(handler);
114            Config cfg = new Config();
115    
116            cfg.setLowerCaseOption(true);
117            cfg.setLowerCaseSection(true);
118            parser.setConfig(cfg);
119            parser.parse(new StringReader(CFG_LOWER), handler);
120            EasyMock.verify(handler);
121        }
122    
123        @Test public void testNewInstance() throws Exception
124        {
125            Config cfg = new Config();
126            IniParser parser = IniParser.newInstance();
127    
128            assertEquals(IniParser.class, parser.getClass());
129            parser = IniParser.newInstance(cfg);
130            assertEquals(IniParser.class, parser.getClass());
131            assertSame(cfg, parser.getConfig());
132        }
133    
134        @Test public void testParse() throws Exception
135        {
136            IniParser parser = new IniParser();
137            IniHandler handler = EasyMock.createMock(IniHandler.class);
138            Dwarf dwarf;
139    
140            handler.startIni();
141            handler.handleComment(Helper.HEADER_COMMENT);
142            handler.handleComment((String) EasyMock.anyObject());
143            handler.handleComment(" " + Dwarfs.PROP_BASHFUL);
144            dwarf = DwarfsData.bashful;
145            handler.startSection(Dwarfs.PROP_BASHFUL);
146            handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
147            handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
148            handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
149            handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
150            handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
151            handler.endSection();
152            handler.handleComment(" " + Dwarfs.PROP_DOC);
153            dwarf = DwarfsData.doc;
154            handler.startSection(Dwarfs.PROP_DOC);
155            handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
156            handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
157            handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
158            handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
159            handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
160            handler.endSection();
161            handler.handleComment(" " + Dwarfs.PROP_DOPEY);
162            dwarf = DwarfsData.dopey;
163            handler.startSection(Dwarfs.PROP_DOPEY);
164            handler.handleOption(Dwarf.PROP_WEIGHT, DwarfsData.INI_DOPEY_WEIGHT);
165            handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_DOPEY_HEIGHT);
166            handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
167            handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
168            handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
169            handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
170            handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1]));
171            handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2]));
172            handler.endSection();
173            handler.handleComment(" " + Dwarfs.PROP_GRUMPY);
174            dwarf = DwarfsData.grumpy;
175            handler.startSection(Dwarfs.PROP_GRUMPY);
176            handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
177            handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_GRUMPY_HEIGHT);
178            handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
179            handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
180            handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
181            handler.endSection();
182            handler.handleComment(" " + Dwarfs.PROP_HAPPY);
183            dwarf = DwarfsData.happy;
184            handler.startSection(Dwarfs.PROP_HAPPY);
185            handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
186            handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
187            handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
188            handler.handleOption(EasyMock.eq(Dwarf.PROP_HOME_PAGE), (String) EasyMock.anyObject());
189            handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
190            handler.endSection();
191            handler.handleComment(" " + Dwarfs.PROP_SLEEPY);
192            dwarf = DwarfsData.sleepy;
193            handler.startSection(Dwarfs.PROP_SLEEPY);
194            handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
195            handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_SLEEPY_HEIGHT);
196            handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
197            handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
198            handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
199            handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
200            handler.endSection();
201            handler.handleComment(" " + Dwarfs.PROP_SNEEZY);
202            dwarf = DwarfsData.sneezy;
203            handler.startSection(Dwarfs.PROP_SNEEZY);
204            handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
205            handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
206            handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
207            handler.handleOption(Dwarf.PROP_HOME_PAGE, DwarfsData.INI_SNEEZY_HOME_PAGE);
208            handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
209            handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
210            handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1]));
211            handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2]));
212            handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[3]));
213            handler.endSection();
214            handler.handleComment(" " + Dwarfs.PROP_HAPPY + " again");
215            dwarf = DwarfsData.happy;
216            handler.startSection(Dwarfs.PROP_HAPPY);
217            handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
218            handler.handleComment("}");
219            handler.endSection();
220            handler.endIni();
221    
222            //
223            EasyMock.replay(handler);
224            parser.parse(Helper.getResourceURL(Helper.DWARFS_INI), handler);
225            EasyMock.verify(handler);
226        }
227    
228        @Test public void testParseExceptions() throws Exception
229        {
230            assertBad(BAD);
231            assertBad(CFG_EXTRA);
232        }
233    
234        @Test public void testUnnamedSection() throws Exception
235        {
236            IniParser parser = new IniParser();
237            IniHandler handler = EasyMock.createMock(IniHandler.class);
238    
239            handler.startIni();
240            handler.startSection(EMPTY);
241            handler.handleOption(OPTION, VALUE);
242            handler.endSection();
243            handler.endIni();
244            EasyMock.replay(handler);
245            Config cfg = new Config();
246    
247            cfg.setUnnamedSection(true);
248            parser.setConfig(cfg);
249            parser.parse(new StringReader(CFG_UNNAMED), handler);
250            EasyMock.verify(handler);
251        }
252    
253        @SuppressWarnings("empty-statement")
254        private void assertBad(String[] values) throws Exception
255        {
256            IniParser parser = new IniParser();
257            IniHandler handler = EasyMock.createNiceMock(IniHandler.class);
258    
259            for (String s : values)
260            {
261                try
262                {
263                    parser.parse(new ByteArrayInputStream(s.getBytes()), handler);
264                    fail("expected InvalidIniFormatException: " + s);
265                }
266                catch (InvalidFileFormatException x)
267                {
268                    ;
269                }
270            }
271        }
272    }