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.ini4j.BasicOptionMapGate; 019 import org.ini4j.Ini4jCase; 020 021 import org.ini4j.sample.Dwarf; 022 import org.ini4j.sample.DwarfBean; 023 024 import org.ini4j.test.DwarfsData; 025 import org.ini4j.test.Helper; 026 027 import static org.junit.Assert.assertArrayEquals; 028 import static org.junit.Assert.assertEquals; 029 import static org.junit.Assert.assertFalse; 030 import static org.junit.Assert.assertNotNull; 031 import static org.junit.Assert.assertNull; 032 import static org.junit.Assert.assertSame; 033 import static org.junit.Assert.fail; 034 035 import org.junit.Before; 036 import org.junit.Test; 037 038 import java.io.File; 039 import java.io.IOException; 040 041 import java.net.URI; 042 import java.net.URL; 043 044 import java.util.TimeZone; 045 046 public class BeanToolTest extends Ini4jCase 047 { 048 protected BeanTool instance; 049 050 @Before @Override public void setUp() throws Exception 051 { 052 super.setUp(); 053 instance = BeanTool.getInstance(); 054 } 055 056 @Test public void testInject() throws Exception 057 { 058 testInject(null); 059 testInject("dummy"); 060 } 061 062 @Test public void testInjectIllegalArgument1() throws Exception 063 { 064 TestMap map = new TestMap(); 065 066 try 067 { 068 instance.inject(map.newBeanAccess(), new BadBean()); 069 missing(IllegalArgumentException.class); 070 } 071 catch (IllegalArgumentException x) 072 { 073 // 074 } 075 } 076 077 @Test public void testInjectIllegalArgument2() throws Exception 078 { 079 TestMap map = new TestMap(); 080 081 map.put("name", "bad"); 082 try 083 { 084 instance.inject(new BadBean(), map.newBeanAccess()); 085 missing(IllegalArgumentException.class); 086 } 087 catch (IllegalArgumentException x) 088 { 089 // 090 } 091 } 092 093 @SuppressWarnings("empty-statement") 094 @Test public void testParse() throws Exception 095 { 096 String input = "6"; 097 int value = 6; 098 099 assertEquals(value, instance.parse(input, byte.class).byteValue()); 100 assertEquals(value, instance.parse(input, short.class).shortValue()); 101 assertEquals(value, instance.parse(input, int.class).intValue()); 102 assertEquals(value, instance.parse(input, long.class).longValue()); 103 assertEquals((float) value, instance.parse(input, float.class).floatValue(), Helper.DELTA); 104 assertEquals((double) value, instance.parse(input, double.class).doubleValue(), Helper.DELTA); 105 assertFalse(instance.parse(input, boolean.class)); 106 assertEquals('6', instance.parse(input, char.class).charValue()); 107 108 // parse null mean zero 109 assertEquals(0, instance.parse(null, byte.class).byteValue()); 110 111 // parse to null class mean exception 112 try 113 { 114 instance.parse(input, null); 115 fail(); 116 } 117 catch (IllegalArgumentException x) 118 { 119 ; 120 } 121 122 // invalid primitive value mean exception 123 try 124 { 125 instance.parse("?", int.class); 126 fail(); 127 } 128 catch (IllegalArgumentException x) 129 { 130 ; 131 } 132 133 // standard, but not primitive types 134 assertSame(input, instance.parse(input, String.class)); 135 assertEquals(new Character('6'), instance.parse(input, Character.class)); 136 assertEquals(new Byte(input), instance.parse(input, Byte.class)); 137 138 // special values 139 input = "http://www.ini4j.org"; 140 assertEquals(new URL(input), instance.parse(input, URL.class)); 141 assertEquals(new URI(input), instance.parse(input, URI.class)); 142 assertEquals(new File(input), instance.parse(input, File.class)); 143 input = "Europe/Budapest"; 144 assertEquals(input, instance.parse(input, TimeZone.class).getID()); 145 input = "java.lang.String"; 146 assertEquals(String.class, instance.parse(input, Class.class)); 147 148 // invalid value should throw IllegalArgumentException 149 try 150 { 151 instance.parse("", URL.class); 152 } 153 catch (IllegalArgumentException x) 154 { 155 ; 156 } 157 } 158 159 @Test public void testSetGet() throws Exception 160 { 161 TestMap map = new TestMap(); 162 Dwarf proxy = instance.proxy(Dwarf.class, map.newBeanAccess()); 163 164 assertNull(proxy.getHomeDir()); 165 assertFalse(proxy.hasHomePage()); 166 assertNull(proxy.getFortuneNumber()); 167 proxy.setAge(DwarfsData.sneezy.age); 168 proxy.setHeight(DwarfsData.sneezy.height); 169 proxy.setWeight(DwarfsData.sneezy.weight); 170 proxy.setHomePage(DwarfsData.sneezy.homePage); 171 proxy.setHomeDir(DwarfsData.sneezy.homeDir); 172 proxy.setFortuneNumber(DwarfsData.sneezy.fortuneNumber); 173 Helper.assertEquals(DwarfsData.sneezy, proxy); 174 assertArrayEquals(DwarfsData.sneezy.fortuneNumber, proxy.getFortuneNumber()); 175 } 176 177 @Test public void testSingleton() throws Exception 178 { 179 assertEquals(BeanTool.class, BeanTool.getInstance().getClass()); 180 } 181 182 @Test public void testZero() throws Exception 183 { 184 assertEquals(null, instance.zero(Object.class)); 185 assertEquals(0, instance.zero(byte.class).byteValue()); 186 assertEquals(0, instance.zero(short.class).shortValue()); 187 assertEquals(0, instance.zero(int.class).intValue()); 188 assertEquals(0, instance.zero(long.class).longValue()); 189 assertEquals(0.0f, instance.zero(float.class).floatValue(), Helper.DELTA); 190 assertEquals(0.0, instance.zero(double.class).doubleValue(), Helper.DELTA); 191 assertNotNull((instance.zero(boolean.class))); 192 assertFalse(instance.zero(boolean.class)); 193 assertEquals('\0', instance.zero(char.class).charValue()); 194 } 195 196 protected void testInject(String prefix) throws Exception 197 { 198 String p = (prefix == null) ? "" : prefix; 199 Dwarf bean = new DwarfBean(); 200 201 bean.setAge(23); 202 bean.setHeight(5.3); 203 URI uri = new URI("http://www.ini4j.org"); 204 205 bean.setHomePage(uri); 206 String dir = "/home/happy"; 207 208 bean.setHomeDir(dir); 209 bean.setFortuneNumber(new int[] { 1, 2, 3 }); 210 TestMap map = new TestMap(); 211 212 instance.inject(map.newBeanAccess(prefix), bean); 213 assertEquals(6, map.size()); 214 assertEquals("23", map.get(p + Dwarf.PROP_AGE)); 215 assertEquals("5.3", map.get(p + Dwarf.PROP_HEIGHT)); 216 assertEquals(uri.toString(), map.get(p + Dwarf.PROP_HOME_PAGE)); 217 assertEquals(dir, map.get(p + Dwarf.PROP_HOME_DIR)); 218 assertEquals(3, map.length(p + Dwarf.PROP_FORTUNE_NUMBER)); 219 assertEquals("1", map.get(p + Dwarf.PROP_FORTUNE_NUMBER, 0)); 220 assertEquals("2", map.get(p + Dwarf.PROP_FORTUNE_NUMBER, 1)); 221 assertEquals("3", map.get(p + Dwarf.PROP_FORTUNE_NUMBER, 2)); 222 bean.setAge(0); 223 bean.setHeight(0); 224 bean.setHomePage(null); 225 instance.inject(bean, map.newBeanAccess(prefix)); 226 assertEquals(23, bean.getAge()); 227 assertEquals(5.3, bean.getHeight(), Helper.DELTA); 228 assertEquals(uri, bean.getHomePage()); 229 assertEquals(dir, bean.getHomeDir()); 230 assertArrayEquals(new int[] { 1, 2, 3 }, bean.getFortuneNumber()); 231 232 // 233 // bean interface 234 // 235 Dwarf proxy = instance.proxy(Dwarf.class, map.newBeanAccess(prefix)); 236 237 assertEquals(23, proxy.getAge()); 238 assertEquals(5.3, proxy.getHeight(), Helper.DELTA); 239 assertEquals(uri, proxy.getHomePage()); 240 assertEquals(dir, proxy.getHomeDir()); 241 assertArrayEquals(new int[] { 1, 2, 3 }, proxy.getFortuneNumber()); 242 } 243 244 static class TestMap extends BasicOptionMapGate 245 { 246 private static final long serialVersionUID = 4818386732025655044L; 247 } 248 249 private static class BadBean 250 { 251 public String getName() throws IOException 252 { 253 throw new IOException(); 254 } 255 256 public void setName(String value) throws IOException 257 { 258 throw new IOException(); 259 } 260 } 261 }