View Javadoc

1   /*
2    * Copyright 2005,2009 Ivan SZKIBA
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.ini4j.spi;
17  
18  import org.easymock.EasyMock;
19  
20  import org.ini4j.Config;
21  import org.ini4j.Ini4jCase;
22  import org.ini4j.InvalidFileFormatException;
23  
24  import org.ini4j.sample.Dwarf;
25  import org.ini4j.sample.Dwarfs;
26  
27  import org.ini4j.test.DwarfsData;
28  import org.ini4j.test.Helper;
29  
30  import static org.junit.Assert.assertEquals;
31  import static org.junit.Assert.assertSame;
32  import static org.junit.Assert.fail;
33  
34  import org.junit.Test;
35  
36  import java.io.ByteArrayInputStream;
37  import java.io.StringReader;
38  
39  public class IniParserTest extends Ini4jCase
40  {
41      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" };
42      private static final String CFG_LOWER = "[SectioN]\n\nOptioN=ValuE\n";
43      private static final String CFG_UNNAMED = "[]\noption=value\n";
44      private static final String CFG_EMPTY_OPTION = "[section]\noption\n";
45      private static final String CFG_GLOBAL = "option=value\n";
46      private static final String[] CFG_EXTRA = { CFG_EMPTY_OPTION, CFG_UNNAMED, CFG_GLOBAL };
47      private static final String ANONYMOUS = "?";
48      private static final String EMPTY = "";
49      private static final String SECTION = "section";
50      private static final String OPTION = "option";
51      private static final String VALUE = "value";
52  
53      @Test public void testEmpty() throws Exception
54      {
55          IniParser parser = new IniParser();
56          IniHandler handler = EasyMock.createMock(IniHandler.class);
57  
58          handler.startIni();
59          handler.endIni();
60          EasyMock.replay(handler);
61          parser.parse(new StringReader(EMPTY), handler);
62          EasyMock.verify(handler);
63      }
64  
65      @Test public void testEmptyOption() throws Exception
66      {
67          IniParser parser = new IniParser();
68          IniHandler handler = EasyMock.createMock(IniHandler.class);
69  
70          handler.startIni();
71          handler.startSection(SECTION);
72          handler.handleOption(OPTION, null);
73          handler.endSection();
74          handler.endIni();
75          EasyMock.replay(handler);
76          Config cfg = new Config();
77  
78          cfg.setEmptyOption(true);
79          parser.setConfig(cfg);
80          parser.parse(new StringReader(CFG_EMPTY_OPTION), handler);
81          EasyMock.verify(handler);
82      }
83  
84      @Test public void testGlobalSection() throws Exception
85      {
86          IniParser parser = new IniParser();
87          IniHandler handler = EasyMock.createMock(IniHandler.class);
88  
89          handler.startIni();
90          handler.startSection(ANONYMOUS);
91          handler.handleOption(OPTION, VALUE);
92          handler.endSection();
93          handler.endIni();
94          EasyMock.replay(handler);
95          Config cfg = new Config();
96  
97          cfg.setGlobalSection(true);
98          parser.setConfig(cfg);
99          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 }