1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 }