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.InvalidFileFormatException; 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.BufferedReader; 036import java.io.ByteArrayInputStream; 037import java.io.ByteArrayOutputStream; 038import java.io.InputStreamReader; 039import java.io.OutputStreamWriter; 040import java.io.PrintWriter; 041import java.io.Reader; 042import java.io.StringReader; 043 044public class OptionsParserTest extends Ini4jCase 045{ 046 private static final String CFG_EMPTY_OPTION = "option\n"; 047 private static final String NONAME = "=value\n"; 048 private static final String OPTION = "option"; 049 private static final String UNICODE_STRING = "????????????????????????????????????-????????????"; 050 051 @Test public void testBad() throws Exception 052 { 053 OptionsParser parser = new OptionsParser(); 054 OptionsHandler handler = EasyMock.createNiceMock(OptionsHandler.class); 055 056 try 057 { 058 parser.parse(new ByteArrayInputStream(NONAME.getBytes()), handler); 059 missing(InvalidFileFormatException.class); 060 } 061 catch (InvalidFileFormatException x) 062 { 063 // 064 } 065 } 066 067 @Test public void testEmptyOption() throws Exception 068 { 069 OptionsParser parser = new OptionsParser(); 070 OptionsHandler handler = EasyMock.createMock(OptionsHandler.class); 071 072 handler.startOptions(); 073 handler.handleOption(OPTION, null); 074 handler.endOptions(); 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 testNewInstance() throws Exception 085 { 086 Config cfg = new Config(); 087 OptionsParser parser = OptionsParser.newInstance(); 088 089 assertEquals(OptionsParser.class, parser.getClass()); 090 parser = OptionsParser.newInstance(cfg); 091 assertEquals(OptionsParser.class, parser.getClass()); 092 assertSame(cfg, parser.getConfig()); 093 } 094 095 @Test public void testParse() throws Exception 096 { 097 OptionsParser parser = new OptionsParser(); 098 OptionsHandler handler = EasyMock.createMock(OptionsHandler.class); 099 Dwarf dwarf; 100 String prefix; 101 102 handler.startOptions(); 103 handler.handleComment(Helper.HEADER_COMMENT); 104 handler.handleComment((String) EasyMock.anyObject()); 105 handler.handleComment((String) EasyMock.anyObject()); 106 dwarf = DwarfsData.dopey; 107 handler.handleOption(Dwarf.PROP_WEIGHT, DwarfsData.OPT_DOPEY_WEIGHT); 108 handler.handleOption(Dwarf.PROP_HEIGHT, DwarfsData.OPT_DOPEY_HEIGHT); 109 handler.handleOption(Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 110 handler.handleOption(Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 111 handler.handleOption(Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 112 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "11"); 113 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "33"); 114 handler.handleOption(Dwarf.PROP_FORTUNE_NUMBER, "55"); 115// 116 handler.handleComment((String) EasyMock.anyObject()); 117 118 // 119 handler.handleComment(" " + Dwarfs.PROP_BASHFUL); 120 dwarf = DwarfsData.bashful; 121 prefix = Dwarfs.PROP_BASHFUL + "."; 122 123 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 124 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight())); 125 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 126 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 127 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 128 handler.handleComment(" " + Dwarfs.PROP_DOC); 129 dwarf = DwarfsData.doc; 130 prefix = Dwarfs.PROP_DOC + "."; 131 132 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 133 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight())); 134 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 135 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 136 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 137 handler.handleComment(" " + Dwarfs.PROP_DOPEY); 138 dwarf = DwarfsData.dopey; 139 prefix = Dwarfs.PROP_DOPEY + "."; 140 141 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, DwarfsData.OPT_DOPEY_WEIGHT); 142 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_DOPEY_HEIGHT); 143 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 144 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 145 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 146 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0])); 147 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1])); 148 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2])); 149 handler.handleComment(" " + Dwarfs.PROP_GRUMPY); 150 dwarf = DwarfsData.grumpy; 151 prefix = Dwarfs.PROP_GRUMPY + "."; 152 153 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 154 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_GRUMPY_HEIGHT); 155 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 156 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 157 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 158 handler.handleComment(" " + Dwarfs.PROP_HAPPY); 159 dwarf = DwarfsData.happy; 160 prefix = Dwarfs.PROP_HAPPY + "."; 161 162 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 163 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight())); 164 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 165 handler.handleOption(EasyMock.eq(prefix + Dwarf.PROP_HOME_PAGE), (String) EasyMock.anyObject()); 166 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 167 handler.handleComment(" " + Dwarfs.PROP_SLEEPY); 168 dwarf = DwarfsData.sleepy; 169 prefix = Dwarfs.PROP_SLEEPY + "."; 170 171 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 172 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, DwarfsData.OPT_SLEEPY_HEIGHT); 173 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 174 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 175 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 176 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0])); 177 handler.handleComment(" " + Dwarfs.PROP_SNEEZY); 178 dwarf = DwarfsData.sneezy; 179 prefix = Dwarfs.PROP_SNEEZY + "."; 180 181 handler.handleOption(prefix + Dwarf.PROP_WEIGHT, String.valueOf(dwarf.getWeight())); 182 handler.handleOption(prefix + Dwarf.PROP_HEIGHT, String.valueOf(dwarf.getHeight())); 183 handler.handleOption(prefix + Dwarf.PROP_AGE, String.valueOf(dwarf.getAge())); 184 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, DwarfsData.OPT_SNEEZY_HOME_PAGE); 185 handler.handleOption(prefix + Dwarf.PROP_HOME_DIR, String.valueOf(dwarf.getHomeDir())); 186 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[0])); 187 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[1])); 188 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[2])); 189 handler.handleOption(prefix + Dwarf.PROP_FORTUNE_NUMBER, String.valueOf(dwarf.getFortuneNumber()[3])); 190 handler.handleComment(" " + Dwarfs.PROP_HAPPY + " again"); 191 dwarf = DwarfsData.happy; 192 prefix = Dwarfs.PROP_HAPPY + "."; 193 194 handler.handleOption(prefix + Dwarf.PROP_HOME_PAGE, String.valueOf(dwarf.getHomePage())); 195 handler.handleComment("}"); 196 handler.endOptions(); 197 198 // 199 EasyMock.replay(handler); 200 parser.parse(Helper.getResourceURL(Helper.DWARFS_OPT), handler); 201 EasyMock.verify(handler); 202 } 203 204 @Test public void testUnicode() throws Exception 205 { 206 ByteArrayOutputStream out = new ByteArrayOutputStream(); 207 OptionsFormatter formatter = new OptionsFormatter(); 208 209 formatter.setOutput(new PrintWriter(new OutputStreamWriter(out))); 210 formatter.handleOption(OPTION, UNICODE_STRING); 211 formatter.getOutput().flush(); 212 Reader in = new InputStreamReader(new ByteArrayInputStream(out.toByteArray())); 213 String line = new BufferedReader(in).readLine(); 214 215 assertEquals(OPTION + " = " + UNICODE_STRING, EscapeTool.getInstance().unescape(line)); 216 } 217}