1   /*
2    * Copyright 2006-2007-2007 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package net.sf.ezmorph.bean;
18  
19  import java.math.BigDecimal;
20  import java.math.BigInteger;
21  import java.util.HashMap;
22  import java.util.List;
23  import java.util.Map;
24  
25  import junit.framework.Test;
26  import junit.framework.TestCase;
27  import junit.framework.TestSuite;
28  import junit.textui.TestRunner;
29  import net.sf.ezmorph.MorphException;
30  
31  /**
32   * @author Andres Almiray <aalmiray@users.sourceforge.net>
33   */
34  public class MorphDynaBeanTest extends TestCase
35  {
36     public static void main( String[] args )
37     {
38        TestRunner.run( suite() );
39     }
40  
41     public static Test suite()
42     {
43        TestSuite suite = new TestSuite( MorphDynaBeanTest.class );
44        suite.setName( "MorphDynaBean Tests" );
45        return suite;
46     }
47  
48     private MorphDynaBean dynaBean;
49     private MorphDynaBean primitiveDynaBean;
50  
51     public MorphDynaBeanTest( String name )
52     {
53        super( name );
54     }
55  
56     public void testConstructor_fail_Exception()
57     {
58        try{
59           dynaBean = new MorphDynaBean();
60           dynaBean.setDynaBeanClass( new MorphDynaClass( "J", String.class, null ) );
61           fail( "should have thrown a MorphException" );
62        }
63        catch( MorphException expected ){
64           // ok
65        }
66     }
67  
68     public void testConstructor_fail_invalidPropertyClass()
69     {
70        try{
71           Map properties = new HashMap();
72           properties.put( "object", new Object() );
73           dynaBean = new MorphDynaBean();
74           dynaBean.setDynaBeanClass( new MorphDynaClass( properties ) );
75           fail( "should have thrown a MorphException" );
76        }
77        catch( MorphException expected ){
78           // ok
79        }
80     }
81  
82     public void testConstructor_fail_unkownClass()
83     {
84        try{
85           Map properties = new HashMap();
86           properties.put( "object", "java.lang.Unknown" );
87           dynaBean = new MorphDynaBean();
88           dynaBean.setDynaBeanClass( new MorphDynaClass( properties ) );
89           fail( "should have thrown a MorphException" );
90        }
91        catch( MorphException expected ){
92           // ok
93        }
94     }
95  
96     public void testContains()
97     {
98        assertFalse( dynaBean.contains( "map", "key" ) );
99        dynaBean.set( "map", "key", "value" );
100       assertTrue( dynaBean.contains( "map", "key" ) );
101    }
102 
103    public void testContains_fail_Exception()
104    {
105       try{
106          dynaBean.contains( "byte", "key" );
107          fail( "should have thrown a MorphException" );
108       }
109       catch( MorphException expected ){
110          // ok
111       }
112    }
113 
114    public void testEquals()
115    {
116       assertTrue( dynaBean.equals( dynaBean ) );
117       assertFalse( dynaBean.equals( null ) );
118       assertFalse( dynaBean.equals( primitiveDynaBean ) );
119       assertFalse( dynaBean.equals( new Object() ) );
120    }
121 
122    public void testGet_simple_nullValue() throws Exception
123    {
124       Map properties = new HashMap();
125       properties.put( "int", Integer.class );
126       MorphDynaClass dynaClass = new MorphDynaClass( properties );
127       dynaBean = (MorphDynaBean) dynaClass.newInstance();
128       assertNull( dynaBean.get( "int" ) );
129 
130       properties.clear();
131       properties.put( "int", Integer.TYPE );
132       dynaClass = new MorphDynaClass( properties );
133       dynaBean = (MorphDynaBean) dynaClass.newInstance();
134       assertEquals( 0, ((Integer) dynaBean.get( "int" )).intValue() );
135    }
136 
137    public void testGet_mapped_nullValue() throws Exception
138    {
139       Map properties = new HashMap();
140       properties.put( "map", Map.class );
141       MorphDynaClass dynaClass = new MorphDynaClass( properties );
142       dynaBean = (MorphDynaBean) dynaClass.newInstance();
143       assertNull( dynaBean.get( "map","key" ) );
144    }
145 
146    public void testGet_unindexed()
147    {
148       try{
149          dynaBean.get( "byte", 0 );
150          fail( "should have thrown a MorphException" );
151       }
152       catch( MorphException expected ){
153          // ok
154       }
155    }
156 
157    public void testGet_unknownProperty()
158    {
159       try{
160          dynaBean.get( "unknown" );
161          fail( "should have thrown a MorphException" );
162       }
163       catch( MorphException expected ){
164          // ok
165       }
166    }
167 
168    public void testGet_unmapped()
169    {
170       try{
171          dynaBean.get( "byte", "key" );
172          fail( "should have thrown a MorphException" );
173       }
174       catch( MorphException expected ){
175          // ok
176       }
177    }
178 
179    public void testGetSet()
180    {
181       dynaBean.set( "byte", Byte.valueOf( "1" ) );
182       dynaBean.set( "short", Short.valueOf( "1" ) );
183       dynaBean.set( "int", Integer.valueOf( "1" ) );
184       dynaBean.set( "long", Long.valueOf( "1" ) );
185       dynaBean.set( "float", Float.valueOf( "1" ) );
186       dynaBean.set( "double", Double.valueOf( "1" ) );
187       dynaBean.set( "bi", new BigInteger( "1" ) );
188       dynaBean.set( "bd", new BigDecimal( "1" ) );
189       dynaBean.set( "boolean", Boolean.TRUE );
190       dynaBean.set( "char", new Character( 'a' ) );
191 
192       assertEquals( Byte.valueOf( "1" ), dynaBean.get( "byte" ) );
193       assertEquals( Short.valueOf( "1" ), dynaBean.get( "short" ) );
194       assertEquals( Integer.valueOf( "1" ), dynaBean.get( "int" ) );
195       assertEquals( Long.valueOf( "1" ), dynaBean.get( "long" ) );
196       assertEquals( Float.valueOf( "1" ), dynaBean.get( "float" ) );
197       assertEquals( Double.valueOf( "1" ), dynaBean.get( "double" ) );
198       assertEquals( new BigInteger( "1" ), dynaBean.get( "bi" ) );
199       assertEquals( new BigDecimal( "1" ), dynaBean.get( "bd" ) );
200       assertEquals( Boolean.TRUE, dynaBean.get( "boolean" ) );
201       assertEquals( new Character( 'a' ), dynaBean.get( "char" ) );
202    }
203 
204    public void testGetSet_primitives()
205    {
206       primitiveDynaBean.set( "byte", Byte.valueOf( "1" ) );
207       primitiveDynaBean.set( "short", Short.valueOf( "1" ) );
208       primitiveDynaBean.set( "int", Integer.valueOf( "1" ) );
209       primitiveDynaBean.set( "long", Long.valueOf( "1" ) );
210       primitiveDynaBean.set( "float", Float.valueOf( "1" ) );
211       primitiveDynaBean.set( "double", Double.valueOf( "1" ) );
212       primitiveDynaBean.set( "boolean", Boolean.TRUE );
213       primitiveDynaBean.set( "char", new Character( 'a' ) );
214 
215       assertEquals( Byte.valueOf( "1" ), primitiveDynaBean.get( "byte" ) );
216       assertEquals( Short.valueOf( "1" ), primitiveDynaBean.get( "short" ) );
217       assertEquals( Integer.valueOf( "1" ), primitiveDynaBean.get( "int" ) );
218       assertEquals( Long.valueOf( "1" ), primitiveDynaBean.get( "long" ) );
219       assertEquals( Float.valueOf( "1" ), primitiveDynaBean.get( "float" ) );
220       assertEquals( Double.valueOf( "1" ), primitiveDynaBean.get( "double" ) );
221       assertEquals( Boolean.TRUE, primitiveDynaBean.get( "boolean" ) );
222       assertEquals( new Character( 'a' ), primitiveDynaBean.get( "char" ) );
223    }
224 
225    public void testGetSetIndexed_Array()
226    {
227       dynaBean.set( "strs", 0, "hello" );
228       dynaBean.set( "strs", 1, "world" );
229 
230       assertEquals( "hello", dynaBean.get( "strs", 0 ) );
231       assertEquals( "world", dynaBean.get( "strs", 1 ) );
232    }
233 
234    public void testGetSetIndexed_List()
235    {
236       dynaBean.set( "list", 0, "hello" );
237       dynaBean.set( "list", 1, "world" );
238 
239       assertEquals( "hello", dynaBean.get( "list", 0 ) );
240       assertEquals( "world", dynaBean.get( "list", 1 ) );
241    }
242 
243    public void testGetSetMapped()
244    {
245       dynaBean.set( "map", "key", "value" );
246       assertEquals( "value", dynaBean.get( "map", "key" ) );
247    }
248 
249    public void testHashcode()
250    {
251       assertEquals( dynaBean.hashCode(), dynaBean.hashCode() );
252       assertTrue( dynaBean.hashCode() != primitiveDynaBean.hashCode() );
253    }
254 
255    public void testRemove()
256    {
257       dynaBean.set( "map", "key", "value" );
258       assertTrue( dynaBean.contains( "map", "key" ) );
259       dynaBean.remove( "map", "key" );
260       assertFalse( dynaBean.contains( "map", "key" ) );
261    }
262 
263    public void testRemove_fail_Exception()
264    {
265       try{
266          dynaBean.remove( "byte", "key" );
267          fail( "should have thrown a MorphException" );
268       }
269       catch( MorphException expected ){
270          // ok
271       }
272    }
273 
274    public void testSet_unindexed()
275    {
276       try{
277          dynaBean.set( "byte", 0, null );
278          fail( "should have thrown a MorphException" );
279       }
280       catch( MorphException expected ){
281          // ok
282       }
283    }
284 
285    public void testSet_unmapped()
286    {
287       try{
288          dynaBean.set( "byte", "key", null );
289          fail( "should have thrown a MorphException" );
290       }
291       catch( MorphException expected ){
292          // ok
293       }
294    }
295 
296    protected void setUp() throws Exception
297    {
298       Map properties = new HashMap();
299       properties.put( "byte", Byte.class );
300       properties.put( "short", Short.class );
301       properties.put( "int", Integer.class );
302       properties.put( "long", Long.class );
303       properties.put( "float", Float.class );
304       properties.put( "double", Double.class );
305       properties.put( "bi", BigInteger.class );
306       properties.put( "bd", BigDecimal.class );
307       properties.put( "boolean", Boolean.class );
308       properties.put( "char", Character.class );
309       properties.put( "map", Map.class );
310       properties.put( "list", List.class );
311       properties.put( "strs", String[].class );
312       MorphDynaClass dynaClass = new MorphDynaClass( properties );
313       dynaBean = (MorphDynaBean) dynaClass.newInstance();
314 
315       properties = new HashMap();
316       properties.put( "byte", byte.class );
317       properties.put( "short", short.class );
318       properties.put( "int", int.class );
319       properties.put( "long", long.class );
320       properties.put( "float", float.class );
321       properties.put( "double", double.class );
322       properties.put( "boolean", boolean.class );
323       properties.put( "char", char.class );
324       dynaClass = new MorphDynaClass( properties );
325       primitiveDynaBean = (MorphDynaBean) dynaClass.newInstance();
326    }
327 }