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.InvalidFileFormatException; 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 import static org.junit.Assert.fail; 033 034 import org.junit.Test; 035 036 import java.io.ByteArrayInputStream; 037 import java.io.StringReader; 038 039 public class IniParserTest extends Ini4jCase 040 { 041 private static final String[] BAD = { "[section\noption=value\n", "[]\noption=value", "section\noption=value", "[section]\noption\n", "[section]\n=value\n", "[section]\n\\u000d\\u000d=value\n" }; 042 private static final String CFG_LOWER = "[SectioN]\n\nOptioN=ValuE\n"; 043 private static final String CFG_UNNAMED = "[]\noption=value\n"; 044 private static final String CFG_EMPTY_OPTION = "[section]\noption\n"; 045 private static final String CFG_GLOBAL = "option=value\n"; 046 private static final String[] CFG_EXTRA = { CFG_EMPTY_OPTION, CFG_UNNAMED, CFG_GLOBAL }; 047 private static final String ANONYMOUS = "?"; 048 private static final String EMPTY = ""; 049 private static final String SECTION = "section"; 050 private static final String OPTION = "option"; 051 private static final String VALUE = "value"; 052 053 @Test public void testEmpty() throws Exception 054 { 055 IniParser parser = new IniParser(); 056 IniHandler handler = EasyMock.createMock(IniHandler.class); 057 058 handler.startIni(); 059 handler.endIni(); 060 EasyMock.replay(handler); 061 parser.parse(new StringReader(EMPTY), handler); 062 EasyMock.verify(handler); 063 } 064 065 @Test public void testEmptyOption() throws Exception 066 { 067 IniParser parser = new IniParser(); 068 IniHandler handler = EasyMock.createMock(IniHandler.class); 069 070 handler.startIni(); 071 handler.startSection(SECTION); 072 handler.handleOption(OPTION, null); 073 handler.endSection(); 074 handler.endIni(); 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 testGlobalSection() throws Exception 085 { 086 IniParser parser = new IniParser(); 087 IniHandler handler = EasyMock.createMock(IniHandler.class); 088 089 handler.startIni(); 090 handler.startSection(ANONYMOUS); 091 handler.handleOption(OPTION, VALUE); 092 handler.endSection(); 093 handler.endIni(); 094 EasyMock.replay(handler); 095 Config cfg = new Config(); 096 097 cfg.setGlobalSection(true); 098 parser.setConfig(cfg); 099 parser.parse(new StringReader(CFG_GLOBAL), handler); 100 EasyMock.verify(handler); 101 } 102 103 @Test public void testLower() throws Exception 104 { 105 IniParser parser = new IniParser(); 106 IniHandler handler = EasyMock.createMock(IniHandler.class); 107 108 handler.startIni(); 109 handler.startSection(SECTION); 110 handler.handleOption(OPTION, "ValuE"); 111 handler.endSection(); 112 handler.endIni(); 113 EasyMock.replay(handler); 114 Config cfg = new Config(); 115 116 cfg.setLowerCaseOption(true); 117 cfg.setLowerCaseSection(true); 118 parser.setConfig(cfg); 119 parser.parse(new StringReader(CFG_LOWER), handler); 120 EasyMock.verify(handler); 121 } 122 123 @Test public void testNewInstance() throws Exception 124 { 125 Config cfg = new Config(); 126 IniParser parser = IniParser.newInstance(); 127 128 assertEquals(IniParser.class, parser.getClass()); 129 parser = IniParser.newInstance(cfg); 130 assertEquals(IniParser.class, parser.getClass()); 131 assertSame(cfg, parser.getConfig()); 132 } 133 134 @Test public void testParse() throws Exception 135 { 136 IniParser parser = new IniParser(); 137 IniHandler handler = EasyMock.createMock(IniHandler.class); 138 Dwarf dwarf; 139 140 handler.startIni(); 141 handler.handleComment(Helper.HEADER_COMMENT); 142 handler.handleComment((String) EasyMock.anyObject()); 143 handler.handleComment(" " + Dwarfs.PROP_BASHFUL); 144 dwarf = DwarfsData.bashful; 145 handler.startSection(Dwarfs.PROP_BASHFUL); 146 handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 147 handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight())); 148 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 149 handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 150 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 151 handler.endSection(); 152 handler.handleComment(" " + Dwarfs.PROP_DOC); 153 dwarf = DwarfsData.doc; 154 handler.startSection(Dwarfs.PROP_DOC); 155 handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 156 handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight())); 157 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 158 handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 159 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 160 handler.endSection(); 161 handler.handleComment(" " + Dwarfs.PROP_DOPEY); 162 dwarf = DwarfsData.dopey; 163 handler.startSection(Dwarfs.PROP_DOPEY); 164 handler.handleOption(Dwarf.PROP_WEIGHT, DwarfsData.INI_DOPEY_WEIGHT); 165 handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_DOPEY_HEIGHT); 166 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 167 handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 168 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 169 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0])); 170 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1])); 171 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2])); 172 handler.endSection(); 173 handler.handleComment(" " + Dwarfs.PROP_GRUMPY); 174 dwarf = DwarfsData.grumpy; 175 handler.startSection(Dwarfs.PROP_GRUMPY); 176 handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 177 handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_GRUMPY_HEIGHT); 178 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 179 handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 180 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 181 handler.endSection(); 182 handler.handleComment(" " + Dwarfs.PROP_HAPPY); 183 dwarf = DwarfsData.happy; 184 handler.startSection(Dwarfs.PROP_HAPPY); 185 handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 186 handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight())); 187 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 188 handler.handleOption(EasyMock.eq(Dwarf.PROP_HOME_PAGE), (String) EasyMock.anyObject()); 189 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 190 handler.endSection(); 191 handler.handleComment(" " + Dwarfs.PROP_SLEEPY); 192 dwarf = DwarfsData.sleepy; 193 handler.startSection(Dwarfs.PROP_SLEEPY); 194 handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 195 handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.INI_SLEEPY_HEIGHT); 196 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 197 handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 198 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 199 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0])); 200 handler.endSection(); 201 handler.handleComment(" " + Dwarfs.PROP_SNEEZY); 202 dwarf = DwarfsData.sneezy; 203 handler.startSection(Dwarfs.PROP_SNEEZY); 204 handler.handleOption(Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 205 handler.handleOption(Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight())); 206 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 207 handler.handleOption(Dwarf.PROP_HOME_PAGE, DwarfsData.INI_SNEEZY_HOME_PAGE); 208 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 209 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0])); 210 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1])); 211 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2])); 212 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[3])); 213 handler.endSection(); 214 handler.handleComment(" " + Dwarfs.PROP_HAPPY + " again"); 215 dwarf = DwarfsData.happy; 216 handler.startSection(Dwarfs.PROP_HAPPY); 217 handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 218 handler.handleComment("}"); 219 handler.endSection(); 220 handler.endIni(); 221 222 // 223 EasyMock.replay(handler); 224 parser.parse(Helper.getResourceURL(Helper.DWARFS_INI), handler); 225 EasyMock.verify(handler); 226 } 227 228 @Test public void testParseExceptions() throws Exception 229 { 230 assertBad(BAD); 231 assertBad(CFG_EXTRA); 232 } 233 234 @Test public void testUnnamedSection() throws Exception 235 { 236 IniParser parser = new IniParser(); 237 IniHandler handler = EasyMock.createMock(IniHandler.class); 238 239 handler.startIni(); 240 handler.startSection(EMPTY); 241 handler.handleOption(OPTION, VALUE); 242 handler.endSection(); 243 handler.endIni(); 244 EasyMock.replay(handler); 245 Config cfg = new Config(); 246 247 cfg.setUnnamedSection(true); 248 parser.setConfig(cfg); 249 parser.parse(new StringReader(CFG_UNNAMED), handler); 250 EasyMock.verify(handler); 251 } 252 253 @SuppressWarnings("empty-statement") 254 private void assertBad(String[] values) throws Exception 255 { 256 IniParser parser = new IniParser(); 257 IniHandler handler = EasyMock.createNiceMock(IniHandler.class); 258 259 for (String s : values) 260 { 261 try 262 { 263 parser.parse(new ByteArrayInputStream(s.getBytes()), handler); 264 fail("expected InvalidIniFormatException: " + s); 265 } 266 catch (InvalidFileFormatException x) 267 { 268 ; 269 } 270 } 271 } 272 }