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    }