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 */
016package org.ini4j.spi;
017
018import org.easymock.EasyMock;
019
020import org.ini4j.Config;
021import org.ini4j.Ini4jCase;
022import org.ini4j.InvalidFileFormatException;
023
024import org.ini4j.sample.Dwarf;
025import org.ini4j.sample.Dwarfs;
026
027import org.ini4j.test.DwarfsData;
028import org.ini4j.test.Helper;
029
030import static org.junit.Assert.assertEquals;
031import static org.junit.Assert.assertSame;
032
033import org.junit.Test;
034
035import java.io.BufferedReader;
036import java.io.ByteArrayInputStream;
037import java.io.ByteArrayOutputStream;
038import java.io.InputStreamReader;
039import java.io.OutputStreamWriter;
040import java.io.PrintWriter;
041import java.io.Reader;
042import java.io.StringReader;
043
044public 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}