/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.wink.json4j.tests; import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import org.apache.wink.json4j.JSONObject; import org.apache.wink.json4j.OrderedJSONObject; /** * Tests for the basic Java OrderedJSONObject model */ public class OrderedJSONObjectTest extends JSONObjectTest { public void test_OrderedJson() { String JSON = "{\"attribute\":\"foo\",\"number\":100.959,\"boolean\":true}"; try { OrderedJSONObject obj = new OrderedJSONObject(JSON); String jsonStr = obj.write(false); assertTrue(jsonStr.equals(JSON)); } catch (Exception ex) { ex.printStackTrace(); assertTrue(false); } } /** * Rest of removing the first and then adding it back in to see if it shifts to the end. */ public void test_OrderedJsonMove() { String JSON = "{\"attribute\":\"foo\", \"number\":100.959, \"boolean\":true}"; try { OrderedJSONObject obj = new OrderedJSONObject(JSON); String attribute = (String)obj.remove("attribute"); obj.put("attribute",attribute); String jsonStr = obj.write(false); Iterator order = obj.getOrder(); String[] expectedOrder = new String[] { "number", "boolean", "attribute" }; int i = 0; while (order.hasNext()) { assertTrue(expectedOrder[i].equals((String)order.next())); i++; } } catch (Exception ex) { ex.printStackTrace(); assertTrue(false); } } /** * Test of removing two entries and ensuring the order is as expected in output */ public void test_OrderedJsonRemove() { String JSON = "{\"attribute\":\"foo\", \"number\":100.959, \"boolean\":true, \"banana\":\"sherbert\"}"; try { OrderedJSONObject obj = new OrderedJSONObject(JSON); obj.remove("attribute"); obj.remove("boolean"); assertTrue(obj.toString().equals("{\"number\":100.959,\"banana\":\"sherbert\"}")); } catch (Exception ex) { ex.printStackTrace(); assertTrue(false); } } /** * Test of removing two entries and ensuring the order is as expected in output */ public void test_OrderedJsonRemoveMove() { String JSON = "{\"attribute\":\"foo\", \"number\":100.959, \"boolean\":true, \"banana\":\"sherbert\"}"; try { OrderedJSONObject obj = new OrderedJSONObject(JSON); obj.remove("attribute"); Boolean b = (Boolean)obj.remove("boolean"); obj.put("boolean", b); System.out.println("Ordering: " + obj.toString()); assertTrue(obj.toString().equals("{\"number\":100.959,\"banana\":\"sherbert\",\"boolean\":true}")); } catch (Exception ex) { ex.printStackTrace(); assertTrue(false); } } /** * Test of multiple puts not affecting ordering. */ public void test_OrderedJsonMultiPut() { try { OrderedJSONObject obj = new OrderedJSONObject(); obj.put("Entry1", "Value1"); obj.put("Entry2", "Value2"); obj.put("Entry3", "Value3"); obj.put("Entry2", "ReplacedValue2"); String jsonStr = obj.write(true); System.out.println(jsonStr); Iterator order = obj.getOrder(); ArrayList orderList = new ArrayList(); StringBuffer buf = new StringBuffer(""); while (order.hasNext()) { String next = (String)order.next(); buf.append(next); orderList.add(next); if (order.hasNext()) { buf.append(" "); } } assertTrue(orderList.get(0).equals("Entry1")); assertTrue(orderList.get(1).equals("Entry2")); assertTrue(orderList.get(2).equals("Entry3")); } catch (Exception ex) { ex.printStackTrace(); assertTrue(false); } } /** * Test of clone */ public void test_OrderedClone() { try { OrderedJSONObject obj = new OrderedJSONObject(); obj.put("Entry1", "Value1"); obj.put("Entry2", "Value2"); obj.put("Entry3", "Value3"); obj.put("Entry2", "ReplacedValue2"); OrderedJSONObject clone = (OrderedJSONObject)obj.clone(); String jsonStr = clone.write(true); Iterator order = clone.getOrder(); ArrayList orderList = new ArrayList(); StringBuffer buf = new StringBuffer(""); while (order.hasNext()) { String next = (String)order.next(); buf.append(next); orderList.add(next); if (order.hasNext()) { buf.append(" "); } } assertTrue(orderList.get(0).equals("Entry1")); assertTrue(orderList.get(1).equals("Entry2")); assertTrue(orderList.get(2).equals("Entry3")); } catch (Exception ex) { ex.printStackTrace(); assertTrue(false); } } /** * Test of ensuring an object loaded via an Ordered parse remains in the proper order. */ public void test_OrderedJsonRead() { try { InputStream is = this.getClass().getClassLoader().getResourceAsStream("utf8_ordered.json"); ArrayList orderList = new ArrayList(); OrderedJSONObject obj = new OrderedJSONObject(is); is.close(); String jsonStr = obj.write(true); Iterator order = obj.getOrder(); while (order.hasNext()) { String next = (String) order.next(); orderList.add(next); } assertTrue(orderList.get(0).equals("First_Entry")); assertTrue(orderList.get(1).equals("Second_Entry")); assertTrue(orderList.get(2).equals("Third_Entry")); //Validate the nested JSONObject was also contructed in an ordered manner. OrderedJSONObject jObject = (OrderedJSONObject)obj.get("Second_Entry"); order = jObject.getOrder(); orderList.clear(); StringBuffer buf = new StringBuffer(""); while (order.hasNext()) { String next = (String) order.next(); orderList.add(next); buf.append(next); if (order.hasNext()) { buf.append(" "); } } assertTrue(orderList.get(0).equals("name")); assertTrue(orderList.get(1).equals("demos")); } catch (Exception ex) { ex.printStackTrace(); assertTrue(false); } } public void test_toString() { try { JSONObject obj = new JSONObject(); obj.put("attribute", "foo"); obj.put("number", new Double(100.959)); String jsonStr = obj.write(); String jsonStr2 = obj.toString(); assertTrue(jsonStr.equals(jsonStr2)); } catch (Exception ex) { ex.printStackTrace(); assertTrue(false); } } }