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.Ini;
022import org.ini4j.Ini4jCase;
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 IniFormatterTest 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        Ini ini = Helper.newDwarfsIni();
047        IniHandler handler = EasyMock.createMock(IniHandler.class);
048        Dwarf dwarf;
049
050        handler.startIni();
051        handler.handleComment(Helper.HEADER_COMMENT);
052        handler.handleComment(" " + Dwarfs.PROP_BASHFUL);
053        dwarf = DwarfsData.bashful;
054        handler.startSection(Dwarfs.PROP_BASHFUL);
055        handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
056        handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
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.endSection();
061        handler.handleComment(" " + Dwarfs.PROP_DOC);
062        dwarf = DwarfsData.doc;
063        handler.startSection(Dwarfs.PROP_DOC);
064        handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
065        handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
066        handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
067        handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
068        handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
069        handler.endSection();
070        handler.handleComment(" " + Dwarfs.PROP_DOPEY);
071        dwarf = DwarfsData.dopey;
072        handler.startSection(Dwarfs.PROP_DOPEY);
073        handler.handleOption(Dwarf.PROP_WEIGHT, DwarfsData.INI_DOPEY_WEIGHT);
074        handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_DOPEY_HEIGHT);
075        handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
076        handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
077        handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
078        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
079        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1]));
080        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2]));
081        handler.endSection();
082        handler.handleComment(" " + Dwarfs.PROP_GRUMPY);
083        dwarf = DwarfsData.grumpy;
084        handler.startSection(Dwarfs.PROP_GRUMPY);
085        handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
086        handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_GRUMPY_HEIGHT);
087        handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
088        handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
089        handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
090        handler.endSection();
091        handler.handleComment(" " + Dwarfs.PROP_HAPPY);
092        dwarf = DwarfsData.happy;
093        handler.startSection(Dwarfs.PROP_HAPPY);
094        handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
095        handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
096        handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
097        handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
098        handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
099        handler.endSection();
100        handler.handleComment(" " + Dwarfs.PROP_SLEEPY);
101        dwarf = DwarfsData.sleepy;
102        handler.startSection(Dwarfs.PROP_SLEEPY);
103        handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
104        handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_SLEEPY_HEIGHT);
105        handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
106        handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage()));
107        handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
108        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
109        handler.endSection();
110        handler.handleComment(" " + Dwarfs.PROP_SNEEZY);
111        dwarf = DwarfsData.sneezy;
112        handler.startSection(Dwarfs.PROP_SNEEZY);
113        handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight()));
114        handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight()));
115        handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge()));
116        handler.handleOption(Dwarf.PROP_HOME_PAGE, DwarfsData.INI_SNEEZY_HOME_PAGE);
117        handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir()));
118        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0]));
119        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1]));
120        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2]));
121        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[3]));
122        handler.endSection();
123        handler.endIni();
124        EasyMock.replay(handler);
125        verify(ini, handler);
126    }
127
128    @Test public void testNewInstance() throws Exception
129    {
130        StringWriter stringWriter;
131        PrintWriter printWriter;
132        Config cfg = new Config();
133        IniFormatter instance;
134
135        stringWriter = new StringWriter();
136        instance = IniFormatter.newInstance(stringWriter, cfg);
137
138        instance.getOutput().print(DUMMY);
139        instance.getOutput().flush();
140        assertEquals(DUMMY, stringWriter.toString());
141        assertSame(cfg, instance.getConfig());
142
143        //
144        stringWriter = new StringWriter();
145        instance = IniFormatter.newInstance(stringWriter, cfg);
146
147        instance.getOutput().print(DUMMY);
148        instance.getOutput().flush();
149        assertEquals(DUMMY, stringWriter.toString());
150
151        //
152        printWriter = new PrintWriter(stringWriter);
153        instance = IniFormatter.newInstance(printWriter, cfg);
154
155        assertSame(printWriter, instance.getOutput());
156    }
157
158    @Test public void testWithEmptyOption() throws Exception
159    {
160        Config cfg = new Config();
161
162        cfg.setEmptyOption(true);
163        Ini ini = new Ini();
164        Ini.Section sec = ini.add(Dwarfs.PROP_BASHFUL);
165
166        sec.put(Dwarf.PROP_FORTUNE_NUMBER, null);
167        ini.setConfig(cfg);
168        IniHandler handler = EasyMock.createMock(IniHandler.class);
169
170        handler.startIni();
171        handler.startSection(Dwarfs.PROP_BASHFUL);
172        handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "");
173        handler.endSection();
174        handler.endIni();
175        EasyMock.replay(handler);
176        verify(ini, handler);
177    }
178
179    @Test public void testWithoutConfig() throws Exception
180    {
181        Ini ini = new Ini();
182        Ini.Section sec = ini.add(Dwarfs.PROP_BASHFUL);
183
184        sec.put(Dwarf.PROP_FORTUNE_NUMBER, null);
185        IniHandler handler = EasyMock.createMock(IniHandler.class);
186
187        handler.startIni();
188        handler.startSection(Dwarfs.PROP_BASHFUL);
189        handler.endSection();
190        handler.endIni();
191        EasyMock.replay(handler);
192        verify(ini, handler);
193    }
194
195    @Test public void testWithStrictOperator() throws Exception
196    {
197        Config cfg = new Config();
198
199        cfg.setStrictOperator(true);
200        Ini ini = new Ini();
201        Ini.Section sec = ini.add(Dwarfs.PROP_BASHFUL);
202
203        sec.put(Dwarf.PROP_AGE, DwarfsData.bashful.age);
204        ini.setConfig(cfg);
205        StringWriter writer = new StringWriter();
206
207        ini.store(writer);
208        StringBuilder exp = new StringBuilder();
209
210        exp.append(IniParser.SECTION_BEGIN);
211        exp.append(Dwarfs.PROP_BASHFUL);
212        exp.append(IniParser.SECTION_END);
213        exp.append(NL);
214        exp.append(Dwarf.PROP_AGE);
215        exp.append('=');
216        exp.append(DwarfsData.bashful.age);
217        exp.append(NL);
218        exp.append(NL);
219        assertEquals(exp.toString(), writer.toString());
220    }
221
222    private void verify(Ini ini, IniHandler mock) throws Exception
223    {
224        StringWriter writer = new StringWriter();
225
226        ini.store(writer);
227        IniParser parser = new IniParser();
228
229        parser.parse(new StringReader(writer.toString()), mock);
230        EasyMock.verify(mock);
231    }
232}