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;
017
018import org.ini4j.sample.Dwarfs;
019
020import org.ini4j.test.DwarfsData;
021import org.ini4j.test.Helper;
022
023import static org.junit.Assert.assertEquals;
024
025import org.junit.Test;
026
027import java.io.ByteArrayInputStream;
028import java.io.ByteArrayOutputStream;
029import java.io.File;
030import java.io.FileNotFoundException;
031import java.io.InputStreamReader;
032import java.io.OutputStreamWriter;
033import java.io.StringReader;
034import java.io.StringWriter;
035
036public class IniTest extends Ini4jCase
037{
038    private static final String COMMENT_ONLY = "# first line\n# second line\n";
039    private static final String COMMENT_ONLY_VALUE = " first line\n second line";
040    private static final String INI_ONE_HEADER = COMMENT_ONLY + "\n\n[section]\nkey=value\n";
041    private static final String COMMENTED_OPTION = COMMENT_ONLY + "\n\n[section]\n;comment\nkey=value\n";
042    private static final String MULTI = "[section]\noption=value\noption=value2\n[section]\noption=value3\noption=value4\noption=value5\n";
043
044    @Test public void testCommentedOption() throws Exception
045    {
046        Ini ini = new Ini(new StringReader(COMMENTED_OPTION));
047
048        assertEquals("comment", ini.get("section").getComment("key"));
049    }
050
051    @Test public void testCommentOnly() throws Exception
052    {
053        Ini ini = new Ini(new StringReader(COMMENT_ONLY));
054
055        assertEquals(COMMENT_ONLY_VALUE, ini.getComment());
056    }
057
058    @Test public void testLoad() throws Exception
059    {
060        Ini ini;
061
062        ini = new Ini(Helper.getResourceURL(Helper.DWARFS_INI));
063        Helper.assertEquals(DwarfsData.dwarfs, ini.as(Dwarfs.class));
064        ini = new Ini(Helper.getResourceStream(Helper.DWARFS_INI));
065        Helper.assertEquals(DwarfsData.dwarfs, ini.as(Dwarfs.class));
066        ini = new Ini(Helper.getResourceReader(Helper.DWARFS_INI));
067        Helper.assertEquals(DwarfsData.dwarfs, ini.as(Dwarfs.class));
068        ini = new Ini(Helper.getSourceFile(Helper.DWARFS_INI));
069        Helper.assertEquals(DwarfsData.dwarfs, ini.as(Dwarfs.class));
070        ini = new Ini();
071        ini.setFile(Helper.getSourceFile(Helper.DWARFS_INI));
072        ini.load();
073        Helper.assertEquals(DwarfsData.dwarfs, ini.as(Dwarfs.class));
074    }
075
076    @Test public void testLoadException() throws Exception
077    {
078        Ini ini = new Ini();
079
080        try
081        {
082            ini.load();
083            missing(FileNotFoundException.class);
084        }
085        catch (FileNotFoundException x)
086        {
087            //
088        }
089    }
090
091    @Test public void testMulti() throws Exception
092    {
093        Ini ini = new Ini(new StringReader(MULTI));
094        Ini.Section sec;
095
096        assertEquals(1, ini.length("section"));
097        assertEquals(5, ini.get("section", 0).length("option"));
098        ini.clear();
099        Config cfg = new Config();
100
101        cfg.setMultiSection(true);
102        ini.setConfig(cfg);
103        ini.load(new StringReader(MULTI));
104        assertEquals(2, ini.get("section", 0).length("option"));
105        assertEquals(3, ini.get("section", 1).length("option"));
106
107        //
108        StringWriter writer = new StringWriter();
109
110        cfg.setMultiOption(false);
111        ini.store(writer);
112        ini.clear();
113        cfg.setMultiOption(true);
114        ini.load(new StringReader(writer.toString()));
115        assertEquals(1, ini.get("section", 0).length("option"));
116        assertEquals(1, ini.get("section", 1).length("option"));
117        assertEquals("value2", ini.get("section", 0).get("option"));
118        assertEquals("value5", ini.get("section", 1).get("option"));
119
120        //
121        ini.clear();
122        cfg.setMultiOption(false);
123        ini.load(new StringReader(MULTI));
124        assertEquals(1, ini.get("section", 0).length("option"));
125        assertEquals(1, ini.get("section", 1).length("option"));
126    }
127
128    @Test public void testOneHeaderOnly() throws Exception
129    {
130        Ini ini = new Ini(new StringReader(INI_ONE_HEADER));
131
132        assertEquals(COMMENT_ONLY_VALUE, ini.getComment());
133    }
134
135    @Test public void testStore() throws Exception
136    {
137        Ini ini = Helper.newDwarfsIni();
138        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
139
140        ini.store(buffer);
141        Ini dup = new Ini();
142
143        dup.load(new ByteArrayInputStream(buffer.toByteArray()));
144        Helper.assertEquals(DwarfsData.dwarfs, dup.as(Dwarfs.class));
145        buffer = new ByteArrayOutputStream();
146        ini.store(new OutputStreamWriter(buffer));
147        dup = new Ini();
148        dup.load(new InputStreamReader(new ByteArrayInputStream(buffer.toByteArray())));
149        Helper.assertEquals(DwarfsData.dwarfs, dup.as(Dwarfs.class));
150
151        //
152        File file = File.createTempFile("test", ".ini");
153
154        file.deleteOnExit();
155        ini.setFile(file);
156        assertEquals(file, ini.getFile());
157        ini.store();
158        dup = new Ini();
159        dup.setFile(file);
160        dup.load();
161        Helper.assertEquals(DwarfsData.dwarfs, dup.as(Dwarfs.class));
162        file.delete();
163    }
164
165    @Test public void testStoreException() throws Exception
166    {
167        Ini ini = new Ini();
168
169        try
170        {
171            ini.store();
172            missing(FileNotFoundException.class);
173        }
174        catch (FileNotFoundException x)
175        {
176            //
177        }
178    }
179
180    @Test public void testWithComment() throws Exception
181    {
182        Ini ini = new Ini();
183
184        ini.load(Helper.getResourceStream(Helper.DWARFS_INI));
185        assertNotNull(ini.getComment());
186        for (Ini.Section sec : ini.values())
187        {
188            assertNotNull(ini.getComment(sec.getName()));
189        }
190    }
191
192    @Test public void testWithoutComment() throws Exception
193    {
194        Ini ini = new Ini();
195        Config cfg = new Config();
196
197        cfg.setComment(false);
198        ini.setConfig(cfg);
199        ini.load(Helper.getResourceStream(Helper.DWARFS_INI));
200        assertNull(ini.getComment());
201        for (Ini.Section sec : ini.values())
202        {
203            assertNull(ini.getComment(sec.getName()));
204        }
205
206        ini = new Ini();
207        ini.setConfig(cfg);
208        ini.setComment("comment");
209        Ini.Section sec = ini.add("section");
210
211        sec.add("option", "value");
212        ini.putComment("section", "section-comment");
213        StringWriter writer = new StringWriter();
214
215        ini.store(writer);
216        assertEquals("[section]\noption = value\n\n", writer.toString());
217    }
218
219    @Test public void testWithoutHeaderComment() throws Exception
220    {
221        Ini ini = new Ini();
222        Config cfg = new Config();
223
224        cfg.setHeaderComment(false);
225        cfg.setComment(true);
226        ini.setConfig(cfg);
227        ini.load(Helper.getResourceStream(Helper.DWARFS_INI));
228        assertNull(ini.getComment());
229        for (Ini.Section sec : ini.values())
230        {
231            assertNotNull(ini.getComment(sec.getName()));
232        }
233
234        ini = new Ini();
235        ini.setConfig(cfg);
236        ini.setComment("comment");
237        Ini.Section sec = ini.add("section");
238
239        sec.add("option", "value");
240        ini.putComment("section", "section-comment");
241        StringWriter writer = new StringWriter();
242
243        ini.store(writer);
244        assertEquals("#section-comment\n[section]\noption = value\n\n", writer.toString());
245    }
246}