1   /*
2    * Copyright 2002-2009 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.json;
18  
19  import java.util.HashMap;
20  import java.util.Map;
21  
22  import junit.framework.TestCase;
23  import net.sf.ezmorph.bean.MorphDynaBean;
24  import net.sf.ezmorph.bean.MorphDynaClass;
25  import net.sf.json.sample.BeanA;
26  import net.sf.json.sample.JsonEventAdpater;
27  import net.sf.json.sample.PropertyBean;
28  
29  import org.apache.commons.beanutils.DynaBean;
30  
31  /**
32   * @author Andres Almiray <aalmiray@users.sourceforge.net>
33   */
34  public class TestJSONObjectEvents extends TestCase {
35     public static void main( String[] args ) {
36        junit.textui.TestRunner.run( TestJSONObjectEvents.class );
37     }
38  
39     private JsonConfig jsonConfig;
40     private JsonEventAdpater jsonEventAdpater;
41  
42     public TestJSONObjectEvents( String name ) {
43        super( name );
44     }
45  
46     public void testFromObject_bean() {
47        JSONObject.fromObject( new BeanA(), jsonConfig );
48        assertEvents();
49     }
50  
51     public void testFromObject_bean2() {
52        JSONObject.fromObject( new PropertyBean(), jsonConfig );
53        assertEquals( 0, jsonEventAdpater.getError() );
54        assertEquals( 1, jsonEventAdpater.getWarning() );
55        assertEquals( 0, jsonEventAdpater.getArrayStart() );
56        assertEquals( 0, jsonEventAdpater.getArrayEnd() );
57        assertEquals( 1, jsonEventAdpater.getObjectStart() );
58        assertEquals( 1, jsonEventAdpater.getObjectEnd() );
59        assertEquals( 0, jsonEventAdpater.getElementAdded() );
60        assertEquals( 1, jsonEventAdpater.getPropertySet() );
61     }
62  
63     public void testFromObject_dynaBean() throws Exception {
64        JSONObject.fromObject( createDynaBean(), jsonConfig );
65        assertEvents();
66     }
67  
68     public void testFromObject_error() {
69        try{
70           JSONObject.fromObject( "[]", jsonConfig );
71           fail( "A JSONException was expected" );
72        }catch( JSONException expected ){
73           assertEquals( 1, jsonEventAdpater.getError() );
74           assertEquals( 0, jsonEventAdpater.getWarning() );
75           assertEquals( 0, jsonEventAdpater.getArrayStart() );
76           assertEquals( 0, jsonEventAdpater.getArrayEnd() );
77           assertEquals( 0, jsonEventAdpater.getObjectStart() );
78           assertEquals( 0, jsonEventAdpater.getObjectEnd() );
79           assertEquals( 0, jsonEventAdpater.getElementAdded() );
80           assertEquals( 0, jsonEventAdpater.getPropertySet() );
81        }
82     }
83  
84     public void testFromObject_JSONObject() {
85        JSONObject jsonObject = new JSONObject().element( "name", "json" )
86              .element( "func", new JSONFunction( "return this;" ) )
87              .element( "int", new Integer( 1 ) );
88        JSONObject.fromObject( jsonObject, jsonConfig );
89        assertEvents();
90     }
91  
92     public void testFromObject_map() {
93        Map map = new HashMap();
94        map.put( "name", "json" );
95        map.put( "func", new JSONFunction( "return this;" ) );
96        map.put( "int", new Integer( 1 ) );
97        JSONObject.fromObject( map, jsonConfig );
98        assertEvents();
99     }
100 
101    public void testFromObject_string() {
102       JSONObject.fromObject( "{name:'json',int:1,func:function(){ return this; }}", jsonConfig );
103       assertEvents();
104    }
105 
106    protected void setUp() throws Exception {
107       jsonEventAdpater = new JsonEventAdpater();
108       jsonConfig = new JsonConfig();
109       jsonConfig.addJsonEventListener( jsonEventAdpater );
110       jsonConfig.enableEventTriggering();
111 
112    }
113 
114    protected void tearDown() throws Exception {
115       jsonEventAdpater.reset();
116    }
117 
118    private void assertEvents() {
119       assertEquals( 0, jsonEventAdpater.getError() );
120       assertEquals( 0, jsonEventAdpater.getWarning() );
121       assertEquals( 0, jsonEventAdpater.getArrayStart() );
122       assertEquals( 0, jsonEventAdpater.getArrayEnd() );
123       assertEquals( 1, jsonEventAdpater.getObjectStart() );
124       assertEquals( 1, jsonEventAdpater.getObjectEnd() );
125       assertEquals( 0, jsonEventAdpater.getElementAdded() );
126       assertEquals( 3, jsonEventAdpater.getPropertySet() );
127    }
128 
129    private DynaBean createDynaBean() throws Exception {
130       Map properties = new HashMap();
131       properties.put( "name", String.class );
132       properties.put( "func", JSONFunction.class );
133       properties.put( "int", Integer.class );
134       MorphDynaClass dynaClass = new MorphDynaClass( properties );
135       MorphDynaBean dynaBean = (MorphDynaBean) dynaClass.newInstance();
136       dynaBean.setDynaBeanClass( dynaClass );
137       dynaBean.set( "name", "json" );
138       dynaBean.set( "func", new JSONFunction( "return this;" ) );
139       dynaBean.set( "int", new Integer( 1 ) );
140       return dynaBean;
141    }
142 }