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.Options;
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.PrintWriter;
036    import java.io.StringReader;
037    import java.io.StringWriter;
038    
039    public 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    }