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.Options;
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.PrintWriter;
036import java.io.StringReader;
037import java.io.StringWriter;
038
039public class OptionsFormatterTest extends Ini4jCase
040{
041    private static final String NL = System.getProperty("line.separator");
042    private static final String DUMMY = "dummy";
043
044    @Test public void testFormat() throws Exception
045    {
046        Options opts = Helper.newDwarfsOpt();
047        OptionsHandler handler = EasyMock.createMock(OptionsHandler.class);
048        Dwarf dwarf;
049        String prefix;
050
051        handler.startOptions();
052        handler.handleComment(Helper.HEADER_COMMENT);
053        handler.handleComment((String) EasyMock.anyObject());
054        dwarf = DwarfsData.dopey;
055        handler.handleOption(Dwarf.PROP_WEIGHT, DwarfsData.OPT_DOPEY_WEIGHT);
056        handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.OPT_DOPEY_HEIGHT);
057        handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
058        handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
059        handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
060        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "11");
061        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "33");
062        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "55");
063//
064
065        //
066        handler.handleComment(" " + Dwarfs.PROP_BASHFUL);
067        dwarf = DwarfsData.bashful;
068        prefix = Dwarfs.PROP_BASHFUL + ".";
069
070        handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
071        handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
072        handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
073        handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
074        handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
075        handler.handleComment(" " + Dwarfs.PROP_DOC);
076        dwarf = DwarfsData.doc;
077        prefix = Dwarfs.PROP_DOC + ".";
078
079        handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
080        handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
081        handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
082        handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
083        handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
084        handler.handleComment(" " + Dwarfs.PROP_DOPEY);
085        dwarf = DwarfsData.dopey;
086        prefix = Dwarfs.PROP_DOPEY + ".";
087
088        handler.handleOption(prefix + Dwarf.PROP_WEIGHT, DwarfsData.OPT_DOPEY_WEIGHT);
089        handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_DOPEY_HEIGHT);
090        handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
091        handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
092        handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
093        handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
094        handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1]));
095        handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2]));
096        handler.handleComment(" " + Dwarfs.PROP_GRUMPY);
097        dwarf = DwarfsData.grumpy;
098        prefix = Dwarfs.PROP_GRUMPY + ".";
099
100        handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
101        handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_GRUMPY_HEIGHT);
102        handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
103        handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
104        handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
105        handler.handleComment(" " + Dwarfs.PROP_HAPPY);
106        dwarf = DwarfsData.happy;
107        prefix = Dwarfs.PROP_HAPPY + ".";
108
109        handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
110        handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
111        handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
112        handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
113        handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
114        handler.handleComment(" " + Dwarfs.PROP_SLEEPY);
115        dwarf = DwarfsData.sleepy;
116        prefix = Dwarfs.PROP_SLEEPY + ".";
117
118        handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
119        handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_SLEEPY_HEIGHT);
120        handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
121        handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
122        handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
123        handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
124        handler.handleComment(" " + Dwarfs.PROP_SNEEZY);
125        dwarf = DwarfsData.sneezy;
126        prefix = Dwarfs.PROP_SNEEZY + ".";
127
128        handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
129        handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
130        handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
131        handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, DwarfsData.OPT_SNEEZY_HOME_PAGE);
132        handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
133        handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
134        handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1]));
135        handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2]));
136        handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[3]));
137        handler.endOptions();
138
139        //
140        EasyMock.replay(handler);
141        verify(opts, handler);
142    }
143
144    @Test public void testNewInstance() throws Exception
145    {
146        StringWriter stringWriter;
147        PrintWriter printWriter;
148
149        ;
150        Config cfg = new Config();
151        OptionsFormatter instance;
152
153        stringWriter = new StringWriter();
154        instance = OptionsFormatter.newInstance(stringWriter, cfg);
155
156        instance.getOutput().print(DUMMY);
157        instance.getOutput().flush();
158        assertEquals(DUMMY, stringWriter.toString());
159        assertSame(cfg, instance.getConfig());
160
161        //
162        stringWriter = new StringWriter();
163        instance = OptionsFormatter.newInstance(stringWriter, cfg);
164
165        instance.getOutput().print(DUMMY);
166        instance.getOutput().flush();
167        assertEquals(DUMMY, stringWriter.toString());
168
169        //
170        printWriter = new PrintWriter(stringWriter);
171        instance = OptionsFormatter.newInstance(printWriter, cfg);
172
173        assertSame(printWriter, instance.getOutput());
174    }
175
176    @Test public void testWithStrictOperatorEmptyOptions() throws Exception
177    {
178        Config cfg = new Config();
179
180        cfg.setStrictOperator(true);
181        cfg.setEmptyOption(true);
182        Options opts = new Options();
183
184        opts.setConfig(cfg);
185        opts.put(Dwarf.PROP_AGE, DwarfsData.bashful.age);
186        opts.put(Dwarf.PROP_WEIGHT, null);
187        StringWriter writer = new StringWriter();
188
189        opts.store(writer);
190        StringBuilder exp = new StringBuilder();
191
192        exp.append(Dwarf.PROP_AGE);
193        exp.append('=');
194        exp.append(DwarfsData.bashful.age);
195        exp.append(NL);
196        exp.append(Dwarf.PROP_WEIGHT);
197        exp.append('=');
198        exp.append(NL);
199        assertEquals(exp.toString(), writer.toString());
200    }
201
202    @Test public void testWithStrictOperatorNoEmptyOptions() throws Exception
203    {
204        Config cfg = new Config();
205
206        cfg.setStrictOperator(true);
207        cfg.setEmptyOption(false);
208        Options opts = new Options();
209
210        opts.setConfig(cfg);
211        opts.put(Dwarf.PROP_AGE, DwarfsData.bashful.age);
212        opts.put(Dwarf.PROP_WEIGHT, null);
213        StringWriter writer = new StringWriter();
214
215        opts.store(writer);
216        StringBuilder exp = new StringBuilder();
217
218        exp.append(Dwarf.PROP_AGE);
219        exp.append('=');
220        exp.append(DwarfsData.bashful.age);
221        exp.append(NL);
222        assertEquals(exp.toString(), writer.toString());
223    }
224
225    private void verify(Options opts, OptionsHandler mock) throws Exception
226    {
227        StringWriter writer = new StringWriter();
228
229        opts.store(writer);
230        OptionsParser parser = new OptionsParser();
231
232        parser.parse(new StringReader(writer.toString()), mock);
233        EasyMock.verify(mock);
234    }
235}