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.List;
21  import java.util.Map;
22  
23  import junit.framework.TestCase;
24  import net.sf.json.sample.ArrayJSONStringBean;
25  import net.sf.json.sample.BeanA;
26  import net.sf.json.sample.MappingBean;
27  import net.sf.json.sample.ObjectJSONStringBean;
28  import net.sf.json.sample.ValueBean;
29  import net.sf.json.util.JSONTokener;
30  
31  import org.apache.commons.beanutils.DynaBean;
32  import org.apache.commons.beanutils.PropertyUtils;
33  
34  /**
35   * @author Andres Almiray <aalmiray@users.sourceforge.net>
36   */
37  public class TestJSONSerializer extends TestCase {
38     public static void main( String[] args ) {
39        junit.textui.TestRunner.run( TestJSONSerializer.class );
40     }
41  
42     private JsonConfig jsonConfig;
43  
44     public TestJSONSerializer( String name ) {
45        super( name );
46     }
47  
48     public void testToJava_JSONArray_1() {
49        setName( "JSONArray('[]') -&gt; ToJava[default]" );
50        JSONArray jsonArray = JSONArray.fromObject( "[]" );
51        Object java = JSONSerializer.toJava( jsonArray );
52        assertNotNull( java );
53        assertTrue( java instanceof List );
54        List list = (List) java;
55        assertEquals( 0, list.size() );
56     }
57  
58     public void testToJava_JSONArray_2() {
59        setName( "JSONArray('[]') -&gt; ToJava[arrayMode:OBJECT_ARRAY]" );
60        JSONArray jsonArray = JSONArray.fromObject( "[]" );
61        jsonConfig.setArrayMode( JsonConfig.MODE_OBJECT_ARRAY );
62        Object java = JSONSerializer.toJava( jsonArray, jsonConfig );
63        assertNotNull( java );
64        assertTrue( Object[].class.isAssignableFrom( java.getClass() ) );
65        Object[] array = (Object[]) java;
66        assertEquals( 0, array.length );
67     }
68  
69     public void testToJava_JSONNull_1() {
70        setName( "JSONNull -&gt; ToJava[default]" );
71        Object java = JSONSerializer.toJava( JSONNull.getInstance() );
72        assertNull( java );
73     }
74  
75     public void testToJava_JSONObject_1() {
76        setName( "JSONObject(null:true) -&gt; ToJava[default]" );
77        Object java = JSONSerializer.toJava( new JSONObject( true ) );
78        assertNull( java );
79     }
80  
81     public void testToJava_JSONObject_2() throws Exception {
82        setName( "JSONObject -&gt; ToJava[default]" );
83        String json = "{name=\"json\",bool:true,int:1,double:2.2,func:function(a){ return a; },array:[1,2]}";
84        JSONObject jsonObject = JSONObject.fromObject( json );
85        Object bean = JSONSerializer.toJava( jsonObject );
86        assertNotNull( bean );
87        assertTrue( bean instanceof DynaBean );
88        assertEquals( jsonObject.get( "name" ), PropertyUtils.getProperty( bean, "name" ) );
89        assertEquals( jsonObject.get( "bool" ), PropertyUtils.getProperty( bean, "bool" ) );
90        assertEquals( jsonObject.get( "int" ), PropertyUtils.getProperty( bean, "int" ) );
91        assertEquals( jsonObject.get( "double" ), PropertyUtils.getProperty( bean, "double" ) );
92        assertEquals( jsonObject.get( "func" ), PropertyUtils.getProperty( bean, "func" ) );
93        List expected = (List) JSONArray.toCollection( jsonObject.getJSONArray( "array" ) );
94        Assertions.assertEquals( expected, (List) PropertyUtils.getProperty( bean, "array" ) );
95     }
96  
97     public void testToJava_JSONObject_3() throws Exception {
98        setName( "JSONObject -&gt; ToJava[rootClass:BeanA]" );
99        String json = "{bool:true,integer:1,string:\"json\"}";
100       JSONObject jsonObject = JSONObject.fromObject( json );
101       jsonConfig.setRootClass( BeanA.class );
102       Object java = JSONSerializer.toJava( jsonObject, jsonConfig );
103       assertNotNull( java );
104       assertTrue( java instanceof BeanA );
105       BeanA bean = (BeanA) java;
106       assertEquals( jsonObject.get( "bool" ), Boolean.valueOf( bean.isBool() ) );
107       assertEquals( jsonObject.get( "integer" ), new Integer( bean.getInteger() ) );
108       assertEquals( jsonObject.get( "string" ), bean.getString() );
109    }
110 
111    public void testToJava_JSONObject_4() {
112       setName( "JSONObject -&gt; ToJava[rootClass:BeanA,classMap]" );
113 
114       MappingBean mappingBean = new MappingBean();
115       ValueBean beanA = new ValueBean();
116       beanA.setValue( 90000 );
117       ValueBean beanB = new ValueBean();
118       beanB.setValue( 91000 );
119       mappingBean.addAttribute( "beanA", beanA );
120       mappingBean.addAttribute( "beanB", beanB );
121       Map classMap = new HashMap();
122       classMap.put( "bean.*", ValueBean.class );
123 
124       JSONObject jsonObject = JSONObject.fromObject( mappingBean );
125       jsonConfig.setRootClass( MappingBean.class );
126       jsonConfig.setClassMap( classMap );
127       Object java = JSONSerializer.toJava( jsonObject, jsonConfig );
128       assertNotNull( java );
129       assertTrue( java instanceof MappingBean );
130       MappingBean mappingBean2 = (MappingBean) java;
131 
132       Object ba = mappingBean2.getAttributes()
133             .get( "beanA" );
134       Object bb = mappingBean2.getAttributes()
135             .get( "beanB" );
136       assertTrue( ba instanceof ValueBean );
137       assertTrue( bb instanceof ValueBean );
138       assertEquals( beanA.getValue(), ((ValueBean) ba).getValue() );
139       assertEquals( beanB.getValue(), ((ValueBean) bb).getValue() );
140    }
141 
142    public void testToJava_JSONObject_and_reset() throws Exception {
143       String json = "{bool:true,integer:1,string:\"json\"}";
144       JSONObject jsonObject = JSONObject.fromObject( json );
145       jsonConfig.setRootClass( BeanA.class );
146       Object java = JSONSerializer.toJava( jsonObject, jsonConfig );
147       assertNotNull( java );
148       assertTrue( java instanceof BeanA );
149       BeanA bean = (BeanA) java;
150       assertEquals( jsonObject.get( "bool" ), Boolean.valueOf( bean.isBool() ) );
151       assertEquals( jsonObject.get( "integer" ), new Integer( bean.getInteger() ) );
152       assertEquals( jsonObject.get( "string" ), bean.getString() );
153       jsonConfig.reset();
154       java = JSONSerializer.toJava( jsonObject, jsonConfig );
155       assertTrue( java instanceof DynaBean );
156       assertEquals( jsonObject.get( "bool" ), PropertyUtils.getProperty( java, "bool" ) );
157       assertEquals( jsonObject.get( "integer" ), PropertyUtils.getProperty( java, "integer" ) );
158       assertEquals( jsonObject.get( "string" ), PropertyUtils.getProperty( java, "string" ) );
159    }
160 
161    public void testToJSON_JSONString_array() {
162       ArrayJSONStringBean bean = new ArrayJSONStringBean();
163       bean.setValue( "'json','json'" );
164       JSON json = JSONSerializer.toJSON( bean );
165       assertNotNull( json );
166       assertTrue( json instanceof JSONArray );
167       Assertions.assertEquals( JSONArray.fromObject( "['json','json']" ), (JSONArray) json );
168    }
169 
170    public void testToJSON_JSONString_null() {
171       JSON json = JSONSerializer.toJSON( (JSONString) null );
172       assertNotNull( json );
173       assertTrue( JSONNull.getInstance()
174             .equals( json ) );
175    }
176 
177    public void testToJSON_JSONString_object() {
178       ObjectJSONStringBean bean = new ObjectJSONStringBean();
179       bean.setName( "json" );
180       JSON json = JSONSerializer.toJSON( bean );
181       assertNotNull( json );
182       assertTrue( json instanceof JSONObject );
183       Assertions.assertEquals( JSONObject.fromObject( "{\"name\":\"json\"}" ), (JSONObject) json );
184    }
185 
186    public void testToJSON_Object_array() {
187       JSON json = JSONSerializer.toJSON( new int[] { 1, 2 } );
188       assertNotNull( json );
189       assertTrue( json instanceof JSONArray );
190       Assertions.assertEquals( JSONArray.fromObject( "[1,2]" ), (JSONArray) json );
191    }
192 
193    public void testToJSON_Object_JSONTokener_array() {
194       JSON json = JSONSerializer.toJSON( new JSONTokener( "[1,2]" ) );
195       assertNotNull( json );
196       assertTrue( json instanceof JSONArray );
197       Assertions.assertEquals( JSONArray.fromObject( "[1,2]" ), (JSONArray) json );
198    }
199 
200    public void testToJSON_Object_null() {
201       JSON json = JSONSerializer.toJSON( (Object) null );
202       assertNotNull( json );
203       assertTrue( JSONNull.getInstance()
204             .equals( json ) );
205    }
206 
207    public void testToJSON_Object_object() {
208       JSON json = JSONSerializer.toJSON( new BeanA() );
209       assertNotNull( json );
210       assertTrue( json instanceof JSONObject );
211       Assertions.assertEquals( JSONObject.fromObject( new BeanA() ), (JSONObject) json );
212    }
213 
214    public void testToJSON_String_array() {
215       JSON json = JSONSerializer.toJSON( "['json','json']" );
216       assertNotNull( json );
217       assertTrue( json instanceof JSONArray );
218       Assertions.assertEquals( JSONArray.fromObject( "['json','json']" ), (JSONArray) json );
219    }
220 
221    public void testToJSON_String_invalid() {
222       try{
223          JSONSerializer.toJSON( "garbage" );
224          fail( "Should have throwed a JSONException" );
225       }catch( JSONException expected ){
226          // ok
227       }
228    }
229 
230    public void testToJSON_String_null() {
231       JSON json = JSONSerializer.toJSON( (String) null );
232       assertNotNull( json );
233       assertTrue( JSONNull.getInstance()
234             .equals( json ) );
235    }
236 
237    public void testToJSON_String_null_literal() {
238       JSON json = JSONSerializer.toJSON( "null" );
239       assertNotNull( json );
240       assertTrue( JSONNull.getInstance()
241             .equals( json ) );
242    }
243 
244    public void testToJSON_String_object() {
245       JSON json = JSONSerializer.toJSON( "{'name':'json'}" );
246       assertNotNull( json );
247       assertTrue( json instanceof JSONObject );
248       Assertions.assertEquals( JSONObject.fromObject( "{\"name\":\"json\"}" ), (JSONObject) json );
249    }
250 
251    protected void setUp() throws Exception {
252       jsonConfig = new JsonConfig();
253    }
254 }