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 */
016package org.ini4j.spi;
017
018import org.easymock.EasyMock;
019
020import org.ini4j.Config;
021import org.ini4j.Ini4jCase;
022import org.ini4j.InvalidFileFormatException;
023
024import org.ini4j.sample.Dwarf;
025import org.ini4j.sample.Dwarfs;
026
027import org.ini4j.test.DwarfsData;
028import org.ini4j.test.Helper;
029
030import static org.junit.Assert.assertEquals;
031import static org.junit.Assert.assertSame;
032import static org.junit.Assert.fail;
033
034import org.junit.Test;
035
036import java.io.ByteArrayInputStream;
037import java.io.StringReader;
038
039public 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}