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 }