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
033 import org.junit.Test;
034
035 import java.io.BufferedReader;
036 import java.io.ByteArrayInputStream;
037 import java.io.ByteArrayOutputStream;
038 import java.io.InputStreamReader;
039 import java.io.OutputStreamWriter;
040 import java.io.PrintWriter;
041 import java.io.Reader;
042 import java.io.StringReader;
043
044 public class OptionsParserTest extends Ini4jCase
045 {
046 private static final String CFG_EMPTY_OPTION = "option\n";
047 private static final String NONAME = "=value\n";
048 private static final String OPTION = "option";
049 private static final String UNICODE_STRING = "????????????????????????????????????-????????????";
050
051 @Test public void testBad() throws Exception
052 {
053 OptionsParser parser = new OptionsParser();
054 OptionsHandler handler = EasyMock.createNiceMock(OptionsHandler.class);
055
056 try
057 {
058 parser.parse(new ByteArrayInputStream(NONAME.getBytes()), handler);
059 missing(InvalidFileFormatException.class);
060 }
061 catch (InvalidFileFormatException x)
062 {
063 //
064 }
065 }
066
067 @Test public void testEmptyOption() throws Exception
068 {
069 OptionsParser parser = new OptionsParser();
070 OptionsHandler handler = EasyMock.createMock(OptionsHandler.class);
071
072 handler.startOptions();
073 handler.handleOption(OPTION, null);
074 handler.endOptions();
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 testNewInstance() throws Exception
085 {
086 Config cfg = new Config();
087 OptionsParser parser = OptionsParser.newInstance();
088
089 assertEquals(OptionsParser.class, parser.getClass());
090 parser = OptionsParser.newInstance(cfg);
091 assertEquals(OptionsParser.class, parser.getClass());
092 assertSame(cfg, parser.getConfig());
093 }
094
095 @Test public void testParse() throws Exception
096 {
097 OptionsParser parser = new OptionsParser();
098 OptionsHandler handler = EasyMock.createMock(OptionsHandler.class);
099 Dwarf dwarf;
100 String prefix;
101
102 handler.startOptions();
103 handler.handleComment(Helper.HEADER_COMMENT);
104 handler.handleComment((String) EasyMock.anyObject());
105 handler.handleComment((String) EasyMock.anyObject());
106 dwarf = DwarfsData.dopey;
107 handler.handleOption(Dwarf.PROP_WEIGHT, DwarfsData.OPT_DOPEY_WEIGHT);
108 handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.OPT_DOPEY_HEIGHT);
109 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
110 handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
111 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
112 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "11");
113 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "33");
114 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "55");
115 //
116 handler.handleComment((String) EasyMock.anyObject());
117
118 //
119 handler.handleComment(" " + Dwarfs.PROP_BASHFUL);
120 dwarf = DwarfsData.bashful;
121 prefix = Dwarfs.PROP_BASHFUL + ".";
122
123 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
124 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
125 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
126 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
127 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
128 handler.handleComment(" " + Dwarfs.PROP_DOC);
129 dwarf = DwarfsData.doc;
130 prefix = Dwarfs.PROP_DOC + ".";
131
132 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
133 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
134 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
135 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
136 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
137 handler.handleComment(" " + Dwarfs.PROP_DOPEY);
138 dwarf = DwarfsData.dopey;
139 prefix = Dwarfs.PROP_DOPEY + ".";
140
141 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, DwarfsData.OPT_DOPEY_WEIGHT);
142 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_DOPEY_HEIGHT);
143 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
144 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
145 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
146 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
147 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1]));
148 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2]));
149 handler.handleComment(" " + Dwarfs.PROP_GRUMPY);
150 dwarf = DwarfsData.grumpy;
151 prefix = Dwarfs.PROP_GRUMPY + ".";
152
153 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
154 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_GRUMPY_HEIGHT);
155 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
156 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
157 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
158 handler.handleComment(" " + Dwarfs.PROP_HAPPY);
159 dwarf = DwarfsData.happy;
160 prefix = Dwarfs.PROP_HAPPY + ".";
161
162 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
163 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
164 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
165 handler.handleOption(EasyMock.eq(prefix + Dwarf.PROP_HOME_PAGE), (String) EasyMock.anyObject());
166 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
167 handler.handleComment(" " + Dwarfs.PROP_SLEEPY);
168 dwarf = DwarfsData.sleepy;
169 prefix = Dwarfs.PROP_SLEEPY + ".";
170
171 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
172 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_SLEEPY_HEIGHT);
173 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
174 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
175 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
176 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
177 handler.handleComment(" " + Dwarfs.PROP_SNEEZY);
178 dwarf = DwarfsData.sneezy;
179 prefix = Dwarfs.PROP_SNEEZY + ".";
180
181 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
182 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
183 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
184 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, DwarfsData.OPT_SNEEZY_HOME_PAGE);
185 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
186 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
187 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1]));
188 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2]));
189 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[3]));
190 handler.handleComment(" " + Dwarfs.PROP_HAPPY + " again");
191 dwarf = DwarfsData.happy;
192 prefix = Dwarfs.PROP_HAPPY + ".";
193
194 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
195 handler.handleComment("}");
196 handler.endOptions();
197
198 //
199 EasyMock.replay(handler);
200 parser.parse(Helper.getResourceURL(Helper.DWARFS_OPT), handler);
201 EasyMock.verify(handler);
202 }
203
204 @Test public void testUnicode() throws Exception
205 {
206 ByteArrayOutputStream out = new ByteArrayOutputStream();
207 OptionsFormatter formatter = new OptionsFormatter();
208
209 formatter.setOutput(new PrintWriter(new OutputStreamWriter(out)));
210 formatter.handleOption(OPTION, UNICODE_STRING);
211 formatter.getOutput().flush();
212 Reader in = new InputStreamReader(new ByteArrayInputStream(out.toByteArray()));
213 String line = new BufferedReader(in).readLine();
214
215 assertEquals(OPTION + " = " + UNICODE_STRING, EscapeTool.getInstance().unescape(line));
216 }
217 }