net.sf.json.TestJSONArray.java Source code

Java tutorial

Introduction

Here is the source code for net.sf.json.TestJSONArray.java

Source

/*
 * Copyright 2002-2009 the original author or authors.
 *
 * Licensed 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 net.sf.json;

import java.io.StringWriter;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import junit.framework.TestCase;
import net.sf.ezmorph.MorphUtils;
import net.sf.ezmorph.bean.MorphDynaBean;
import net.sf.ezmorph.bean.MorphDynaClass;
import net.sf.json.sample.ArrayJSONStringBean;
import net.sf.json.sample.BeanA;
import net.sf.json.util.JSONTokener;

import org.apache.commons.beanutils.DynaBean;

/**
 * @author Andres Almiray <aalmiray@users.sourceforge.net>
 */
public class TestJSONArray extends TestCase {
    public static void main(String[] args) {
        junit.textui.TestRunner.run(TestJSONArray.class);
    }

    public TestJSONArray(String testName) {
        super(testName);
    }

    public void testDiscard() {
        JSONArray jsonArray = new JSONArray().element("1").element("true").element("string")
                .element("function(){ return this; }").element("[1,2,3]");
        assertEquals(5, jsonArray.size());
        jsonArray.discard("string").discard(0);
        assertEquals(3, jsonArray.size());
        assertFalse(jsonArray.contains("string"));
        assertFalse(jsonArray.contains("1"));
    }

    public void testConstructor_Collection() {
        List l = new ArrayList();
        l.add(Boolean.TRUE);
        l.add(new Integer(1));
        l.add("string");
        l.add(Object.class);
        testJSONArray(l, "[true,1,\"string\",\"java.lang.Object\"]");
    }

    public void testConstructor_Collection_JSONArray() {
        List l = new ArrayList();
        l.add(JSONArray.fromObject(new int[] { 1, 2 }));
        testJSONArray(l, "[[1,2]]");
    }

    public void testConstructor_Collection_JSONFunction() {
        List l = new ArrayList();
        l.add(new JSONFunction(new String[] { "a" }, "return a;"));
        testJSONArray(l, "[function(a){ return a; }]");
    }

    public void testConstructor_Collection_JSONString() {
        ArrayJSONStringBean bean = new ArrayJSONStringBean();
        bean.setValue("'json','json'");
        List l = new ArrayList();
        l.add(bean);
        testJSONArray(l, "[[\"json\",\"json\"]]");
    }

    public void testConstructor_Collection_nulls() {
        List l = new ArrayList();
        l.add(null);
        l.add(null);
        testJSONArray(l, "[null,null]");
    }

    public void testConstructor_func() {
        JSONArray expected = JSONArray.fromObject(
                new String[] { "'" + new JSONFunction(new String[] { "a" }, "return a;").toString() + "'" });
        JSONArray actual = JSONArray.fromObject(new String[] { "'function(a){ return a; }'" });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_func2() {
        JSONArray expected = JSONArray.fromObject(
                new String[] { "\"" + new JSONFunction(new String[] { "a" }, "return a;").toString() + "\"" });
        JSONArray actual = JSONArray.fromObject(new String[] { "\"function(a){ return a; }\"" });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_JSONArray() {
        JSONArray expected = JSONArray.fromObject("[1,2]");
        JSONArray actual = JSONArray.fromObject(JSONArray.fromObject("[1,2]"));
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_JSONTokener_functions() {
        testJSONArray(new JSONTokener("[function(a){ return a; }]"), "[function(a){ return a; }]");
    }

    public void testConstructor_JSONTokener_nulls() {
        testJSONArray(new JSONTokener("[,,]"), "[null,null]");
    }

    public void testConstructor_JSONTokener_syntax_errors() {
        try {
            JSONArray.fromObject("");
            fail("Expected a JSONException");
        } catch (JSONException expected) {
            // ok
        }
    }

    public void testConstructor_Object_Array() {
        JSONArray expected = JSONArray.fromObject("[\"json\",1]");
        JSONArray actual = JSONArray.fromObject(new Object[] { "json", new Integer(1) });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_Object_Array_Array() {
        JSONArray expected = JSONArray.fromObject("[[1,2]]");
        JSONArray actual = JSONArray.fromObject(new Object[] { new int[] { 1, 2 } });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_Object_Array_BigDecimal() {
        // bug 1596168

        // an array of BigDecimals
        Number[] numberArray = new Number[] { BigDecimal.valueOf(10000000000L, 10), new BigDecimal("-1.0"),
                new BigDecimal("99.99E-1") };

        assertEquals("1.0000000000", numberArray[0].toString());
        assertEquals("-1.0", numberArray[1].toString());
        assertEquals("9.999", numberArray[2].toString());

        JSONArray jsonNumArray = JSONArray.fromObject(numberArray);

        assertEquals("1.0000000000", jsonNumArray.get(0).toString());
        assertEquals("-1.0", jsonNumArray.get(1).toString());
        assertEquals("9.999", jsonNumArray.get(2).toString());
    }

    public void testConstructor_Object_Array_BigInteger() {
        // bug 1596168

        Number[] numberArray = new Number[] { new BigInteger("18437736874454810627"),
                new BigInteger("9007199254740990") };

        assertEquals("18437736874454810627", numberArray[0].toString());
        assertEquals("9007199254740990", numberArray[1].toString());

        JSONArray jsonNumArray = JSONArray.fromObject(numberArray);

        assertEquals("18437736874454810627", jsonNumArray.get(0).toString());
        assertEquals("9007199254740990", jsonNumArray.get(1).toString());
    }

    public void testConstructor_Object_Array_Class() {
        JSONArray expected = JSONArray.fromObject("[\"java.lang.Object\"]");
        JSONArray actual = JSONArray.fromObject(new Object[] { Object.class });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_Object_Array_functions() {
        JSONArray expected = JSONArray.fromObject("[function(a){ return a; }]");
        JSONArray actual = JSONArray
                .fromObject(new JSONFunction[] { new JSONFunction(new String[] { "a" }, "return a;") });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_Object_Array_functions_2() {
        JSONArray expected = JSONArray
                .fromObject(new JSONFunction[] { new JSONFunction(new String[] { "a" }, "return a;") });
        JSONArray actual = JSONArray.fromObject("[function(a){ return a; }]");
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_Object_Array_functions_3() {
        JSONArray expected = JSONArray
                .fromObject(new JSONFunction[] { new JSONFunction(new String[] { "a" }, "return a;") });
        JSONArray actual = JSONArray.fromObject(new String[] { "function(a){ return a; }" });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_Object_Array_JSONArray() {
        JSONArray expected = JSONArray.fromObject("[[1,2]]");
        JSONArray actual = JSONArray.fromObject(new Object[] { JSONArray.fromObject("[1,2]") });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_Object_Array_JSONString() {
        ArrayJSONStringBean bean = new ArrayJSONStringBean();
        bean.setValue("'json','json'");
        JSONArray expected = JSONArray.fromObject("[[\"json\",\"json\"]]");
        JSONArray actual = JSONArray.fromObject(new Object[] { bean });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_Object_Array_nulls() {
        JSONArray expected = JSONArray.fromObject("[null,null]");
        JSONArray actual = JSONArray.fromObject(new Object[] { null, null });
        Assertions.assertEquals(expected, actual);
    }

    public void testConstructor_primitive_array_boolean() {
        testJSONArray(new boolean[] { true, false }, "[true,false]");
    }

    public void testConstructor_primitive_array_byte() {
        testJSONArray(new byte[] { 1, 2, 3 }, "[1,2,3]");
    }

    public void testConstructor_primitive_array_char() {
        testJSONArray(new char[] { 'a', 'b', 'c' }, "[\"a\",\"b\",\"c\"]");
    }

    public void testConstructor_primitive_array_double() {
        testJSONArray(new double[] { 1.1, 2.2, 3.3 }, "[1.1,2.2,3.3]");
    }

    public void testConstructor_primitive_array_double_Infinity() {
        try {
            JSONArray.fromObject(new double[] { Double.NEGATIVE_INFINITY });
            fail("Should have thrown a JSONException");
        } catch (JSONException expected) {
            // OK
        }

        try {
            JSONArray.fromObject(new double[] { Double.POSITIVE_INFINITY });
            fail("Should have thrown a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testConstructor_primitive_array_double_NaNs() {
        try {
            JSONArray.fromObject(new double[] { Double.NaN });
            fail("Should have thrown a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testConstructor_primitive_array_float() {
        testJSONArray(new float[] { 1.1f, 2.2f, 3.3f }, "[1.1,2.2,3.3]");
    }

    public void testConstructor_primitive_array_float_Infinity() {
        try {
            JSONArray.fromObject(new float[] { Float.NEGATIVE_INFINITY });
            fail("Should have thrown a JSONException");
        } catch (JSONException expected) {
            // OK
        }

        try {
            JSONArray.fromObject(new float[] { Float.POSITIVE_INFINITY });
            fail("Should have thrown a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testConstructor_primitive_array_float_NaNs() {
        try {
            JSONArray.fromObject(new float[] { Float.NaN });
            fail("Should have thrown a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testConstructor_primitive_array_int() {
        testJSONArray(new int[] { 1, 2, 3 }, "[1,2,3]");
    }

    public void testConstructor_primitive_array_long() {
        testJSONArray(new long[] { 1, 2, 3 }, "[1,2,3]");
    }

    public void testConstructor_primitive_array_short() {
        testJSONArray(new short[] { 1, 2, 3 }, "[1,2,3]");
    }

    public void testConstructor_String_functions() {
        testJSONArray("[function(a){ return a; }]", "[function(a){ return a; }]");
    }

    public void testConstructor_String_functions_multi() {
        testJSONArray("[function(a){ return a; },[function(b){ return b; }]]",
                "[function(a){ return a; },[function(b){ return b; }]]");
    }

    public void testCycleDetection_arrays() {
        Object[] array1 = new Object[2];
        Object[] array2 = new Object[2];
        array1[0] = new Integer(1);
        array1[1] = array2;
        array2[0] = new Integer(2);
        array2[1] = array1;
        try {
            JSONArray.fromObject(array1);
            fail("A JSONException was expected");
        } catch (JSONException expected) {
            assertTrue(expected.getMessage().endsWith("There is a cycle in the hierarchy!"));
        }
    }

    public void testElement_Array() {
        JSONArray array = new JSONArray();
        int[] ints = { 1, 2 };
        array.element(ints);
        Assertions.assertEquals(JSONArray.fromObject(ints), array.getJSONArray(0));
    }

    public void testElement_boolean() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(true);
        assertEquals(1, jsonArray.size());
        assertTrue(jsonArray.getBoolean(0));
    }

    public void testElement_Boolean() {
        JSONArray array = new JSONArray();
        array.element(Boolean.TRUE);
        Assertions.assertTrue(array.getBoolean(0));
    }

    public void testElement_Collection() {
        List l = new ArrayList();
        l.add(Boolean.TRUE);
        l.add(new Integer(1));
        l.add("string");
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(l);
        assertEquals(1, jsonArray.size());
        Assertions.assertEquals(JSONArray.fromObject("[true,1,\"string\"]"), jsonArray.getJSONArray(0));
    }

    public void testElement_double() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(2.0d);
        assertEquals(1, jsonArray.size());
        assertEquals(2.0d, jsonArray.getDouble(0), 0d);
    }

    public void testElement_index_0_Array() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        ;
        int[] ints = { 0, 2 };
        array.element(0, ints);
        Assertions.assertEquals(JSONArray.fromObject(ints), array.getJSONArray(0));
    }

    public void testElement_index_0_Boolean() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        ;
        array.element(0, Boolean.TRUE);
        Assertions.assertTrue(array.getBoolean(0));
    }

    public void testElement_index_0_Class() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        array.element(0, Object.class);
        Assertions.assertEquals("java.lang.Object", array.getString(0));
    }

    public void testElement_index_0_JSON() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        array.element(0, JSONNull.getInstance());
        Assertions.assertEquals(JSONNull.getInstance(), array.get(0));
    }

    public void testElement_index_0_JSONFunction() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        JSONFunction f = new JSONFunction("return this;");
        array.element(0, f);
        Assertions.assertEquals(f, (JSONFunction) array.get(0));
    }

    public void testElement_index_0_JSONString() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        ArrayJSONStringBean bean = new ArrayJSONStringBean();
        bean.setValue("'json','json'");
        array.element(0, bean);
        Assertions.assertEquals(JSONArray.fromObject(bean), array.getJSONArray(0));
    }

    public void testElement_index_0_JSONTokener() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        JSONTokener tok = new JSONTokener("[0,2]");
        array.element(0, tok);
        tok.reset();
        Assertions.assertEquals(JSONArray.fromObject(tok), array.getJSONArray(0));
    }

    public void testElement_index_0_Number() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        array.element(0, new Double(2));
        Assertions.assertEquals(new Double(2).doubleValue(), array.getDouble(0), 0d);
    }

    public void testElement_index_0_Object() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        array.element(0, new BeanA());
        Assertions.assertEquals(JSONObject.fromObject(new BeanA()), array.getJSONObject(0));
    }

    public void testElement_index_0_String() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        array.element(0, "json");
        Assertions.assertEquals("json", array.getString(0));
    }

    public void testElement_index_0_String_JSON() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        array.element(0, "[]");
        Assertions.assertEquals(new JSONArray().toString(), array.getString(0));
    }

    public void testElement_index_0_String_null() {
        JSONArray array = JSONArray.fromObject("[null,null]");
        array.element(0, (String) null);
        Assertions.assertEquals("", array.getString(0));
    }

    public void testElement_index_1_Array() {
        JSONArray array = new JSONArray();
        int[] ints = { 1, 2 };
        array.element(1, ints);
        Assertions.assertEquals(JSONArray.fromObject(ints), array.getJSONArray(1));
    }

    public void testElement_index_1_boolean() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(1, true);
        assertEquals(2, jsonArray.size());
        assertEquals(JSONNull.getInstance(), jsonArray.get(0));
        assertTrue(jsonArray.getBoolean(1));
    }

    public void testElement_index_1_Boolean() {
        JSONArray array = new JSONArray();
        array.element(1, Boolean.TRUE);
        Assertions.assertTrue(array.getBoolean(1));
    }

    public void testElement_index_1_Class() {
        JSONArray array = new JSONArray();
        array.element(1, Object.class);
        Assertions.assertEquals("java.lang.Object", array.getString(1));
    }

    public void testElement_index_1_Collection() {
        List l = new ArrayList();
        l.add(Boolean.TRUE);
        l.add(new Integer(1));
        l.add("string");
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(1, l);
        assertEquals(2, jsonArray.size());
        assertEquals(JSONNull.getInstance(), jsonArray.get(0));
        Assertions.assertEquals(JSONArray.fromObject("[true,1,\"string\"]"), jsonArray.getJSONArray(1));
    }

    public void testElement_index_1_double() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(1, 2.0d);
        assertEquals(2, jsonArray.size());
        assertEquals(JSONNull.getInstance(), jsonArray.get(0));
        assertEquals(2.0d, jsonArray.getDouble(1), 0d);
    }

    public void testElement_index_1_int() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(1, 1);
        assertEquals(2, jsonArray.size());
        assertEquals(JSONNull.getInstance(), jsonArray.get(0));
        assertEquals(1, jsonArray.getInt(1));
    }

    public void testElement_index_1_JSON() {
        JSONArray array = new JSONArray();
        array.element(1, JSONNull.getInstance());
        Assertions.assertEquals(JSONNull.getInstance(), array.get(1));
    }

    public void testElement_index_1_JSONFunction() {
        JSONArray array = new JSONArray();
        JSONFunction f = new JSONFunction("return this;");
        array.element(1, f);
        Assertions.assertEquals(f, (JSONFunction) array.get(1));
    }

    public void testElement_index_1_JSONString() {
        JSONArray array = new JSONArray();
        ArrayJSONStringBean bean = new ArrayJSONStringBean();
        bean.setValue("'json','json'");
        array.element(1, bean);
        Assertions.assertEquals(JSONArray.fromObject(bean), array.getJSONArray(1));
    }

    public void testElement_index_1_JSONTokener() {
        JSONArray array = new JSONArray();
        JSONTokener tok = new JSONTokener("[1,2]");
        array.element(1, tok);
        tok.reset();
        Assertions.assertEquals(JSONArray.fromObject(tok), array.getJSONArray(1));
    }

    public void testElement_index_1_long() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(1, 1L);
        assertEquals(2, jsonArray.size());
        assertEquals(JSONNull.getInstance(), jsonArray.get(0));
        assertEquals(1L, jsonArray.getLong(1));
    }

    public void testElement_index_1_Map() {
        Map map = new HashMap();
        map.put("name", "json");
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(1, map);
        assertEquals(2, jsonArray.size());
        assertEquals(JSONNull.getInstance(), jsonArray.get(0));
        Assertions.assertEquals(JSONObject.fromObject(map), jsonArray.getJSONObject(1));
    }

    public void testElement_index_1_Number() {
        JSONArray array = new JSONArray();
        array.element(1, new Double(2));
        Assertions.assertEquals(new Double(2).doubleValue(), array.getDouble(1), 1d);
    }

    public void testElement_index_1_Object() {
        JSONArray array = new JSONArray();
        array.element(1, new BeanA());
        Assertions.assertEquals(JSONObject.fromObject(new BeanA()), array.getJSONObject(1));
    }

    public void testElement_index_1_String() {
        JSONArray array = new JSONArray();
        array.element(1, "json");
        Assertions.assertEquals("json", array.getString(1));
    }

    public void testElement_index_1_String_JSON() {
        JSONArray array = new JSONArray();
        array.element(1, "[]");
        Assertions.assertEquals(new JSONArray().toString(), array.getString(1));
    }

    public void testElement_index_1_String_null() {
        JSONArray array = new JSONArray();
        array.element(1, (String) null);
        Assertions.assertEquals("", array.getString(1));
    }

    public void testElement_int() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(1);
        assertEquals(1, jsonArray.size());
        assertEquals(1, jsonArray.getInt(0));
    }

    public void testElement_JSON() {
        JSONArray array = new JSONArray();
        array.element(JSONNull.getInstance());
        Assertions.assertEquals(JSONNull.getInstance(), array.get(0));
    }

    public void testElement_JSONFunction() {
        JSONArray array = new JSONArray();
        JSONFunction f = new JSONFunction("return this;");
        array.element(f);
        Assertions.assertEquals(f, (JSONFunction) array.get(0));
    }

    public void testElement_JSONString() {
        JSONArray array = new JSONArray();
        ArrayJSONStringBean bean = new ArrayJSONStringBean();
        bean.setValue("'json','json'");
        array.element(bean);
        Assertions.assertEquals(JSONArray.fromObject(bean), array.getJSONArray(0));
    }

    public void testElement_JSONTokener() {
        JSONArray array = new JSONArray();
        JSONTokener tok = new JSONTokener("[1,2]");
        array.element(tok);
        tok.reset();
        Assertions.assertEquals(JSONArray.fromObject(tok), array.getJSONArray(0));
    }

    public void testElement_long() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(1L);
        assertEquals(1, jsonArray.size());
        assertEquals(1L, jsonArray.getLong(0));
    }

    public void testElement_Map() {
        Map map = new HashMap();
        map.put("name", "json");
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(map);
        assertEquals(1, jsonArray.size());
        Assertions.assertEquals(JSONObject.fromObject(map), jsonArray.getJSONObject(0));
    }

    public void testElement_negativeIndex() {
        try {
            JSONArray jsonArray = new JSONArray();
            jsonArray.element(-1, JSONNull.getInstance());
            fail("Expected a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testElement_Number() {
        JSONArray array = new JSONArray();
        array.element(new Double(2));
        Assertions.assertEquals(new Double(2).doubleValue(), array.getDouble(0), 0d);
    }

    public void testElement_Object() {
        JSONArray array = new JSONArray();
        array.element(new BeanA());
        Assertions.assertEquals(JSONObject.fromObject(new BeanA()), array.getJSONObject(0));
    }

    public void testElement_replace() {
        JSONArray jsonArray = new JSONArray();
        jsonArray.element(true);
        assertEquals(1, jsonArray.size());
        assertTrue(jsonArray.getBoolean(0));
        jsonArray.element(0, false);
        assertEquals(1, jsonArray.size());
        assertFalse(jsonArray.getBoolean(0));
    }

    public void testElement_String() {
        JSONArray array = new JSONArray();
        array.element("json");
        Assertions.assertEquals("json", array.getString(0));
    }

    public void testElement_String_JSON() {
        JSONArray array = new JSONArray();
        array.element("[]");
        Assertions.assertEquals(new JSONArray().toString(), array.getString(0));
    }

    public void testElement_String_null() {
        JSONArray array = new JSONArray();
        array.element((String) null);
        Assertions.assertEquals("", array.getString(0));
    }

    public void testFromObject_BigDecimal() {
        JSONArray actual = JSONArray.fromObject(new BigDecimal("12345678901234567890.1234567890"));
        assertTrue(actual.get(0) instanceof BigDecimal);
    }

    public void testFromObject_BigInteger() {
        JSONArray actual = JSONArray.fromObject(new BigInteger("123456789012345678901234567890"));
        assertTrue(actual.get(0) instanceof BigInteger);
    }

    public void testFromObject_Boolean() {
        JSONArray expected = JSONArray.fromObject("[true]");
        JSONArray actual = JSONArray.fromObject(Boolean.TRUE);
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_Byte() {
        JSONArray expected = JSONArray.fromObject("[1]");
        JSONArray actual = JSONArray.fromObject(new Byte((byte) 1));
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_Double() {
        JSONArray expected = JSONArray.fromObject("[1.0]");
        JSONArray actual = JSONArray.fromObject(new Double(1d));
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_Float() {
        JSONArray expected = JSONArray.fromObject("[1.0]");
        JSONArray actual = JSONArray.fromObject(new Float(1f));
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_Integer() {
        JSONArray expected = JSONArray.fromObject("[1]");
        JSONArray actual = JSONArray.fromObject(new Integer(1));
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_JSONArray() {
        JSONArray expected = JSONArray.fromObject("[1,2]");
        JSONArray actual = JSONArray.fromObject(JSONArray.fromObject("[1,2]"));
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_JSONFunction() {
        JSONArray expected = JSONArray.fromObject("[function(a){ return a; }]");
        JSONArray actual = JSONArray.fromObject(new JSONFunction(new String[] { "a" }, "return a;"));
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_JSONString() {
        ArrayJSONStringBean bean = new ArrayJSONStringBean();
        bean.setValue("'json','json'");
        JSONArray actual = JSONArray.fromObject(bean);
        JSONArray expected = JSONArray.fromObject("['json','json']");
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_Long() {
        JSONArray expected = JSONArray.fromObject("[1]");
        JSONArray actual = JSONArray.fromObject(new Long(1L));
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_Map() {
        JSONArray expected = JSONArray.fromObject("[{}]");
        JSONArray actual = JSONArray.fromObject(new HashMap());
        Assertions.assertEquals(expected, actual);
    }

    public void testFromObject_Short() {
        JSONArray expected = JSONArray.fromObject("[1]");
        JSONArray actual = JSONArray.fromObject(new Short((short) 1));
        Assertions.assertEquals(expected, actual);
    }

    public void testGet_exception() {
        try {
            JSONArray jsonArray = JSONArray.fromObject("[]");
            jsonArray.get(0);
            fail("Expected a IndexOutOfBoundsException");
        } catch (IndexOutOfBoundsException expected) {
            // OK
        }
    }

    public void testGetBoolean_exception() {
        try {
            JSONArray jsonArray = JSONArray.fromObject("[[]]");
            jsonArray.getBoolean(0);
            fail("Expected a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testGetBoolean_false() {
        JSONArray jsonArray = JSONArray.fromObject("[false]");
        assertFalse(jsonArray.getBoolean(0));
    }

    public void testGetBoolean_true() {
        JSONArray jsonArray = JSONArray.fromObject("[true]");
        assertTrue(jsonArray.getBoolean(0));
    }

    public void testGetDimensions_empty_array() {
        int[] dims = JSONArray.getDimensions(new JSONArray());
        assertEquals(1, dims.length);
        assertEquals(0, dims[0]);
    }

    public void testGetDimensions_null_array() {
        int[] dims = JSONArray.getDimensions(null);
        assertEquals(1, dims.length);
        assertEquals(0, dims[0]);
    }

    public void testGetDimensions_one_dimension() {
        int[] dims = JSONArray.getDimensions(JSONArray.fromObject("[1,2,3]"));
        assertEquals(1, dims.length);
        assertEquals(3, dims[0]);
    }

    public void testGetDimensions_pyramid() {
        int[] dims = JSONArray.getDimensions(JSONArray.fromObject("[1,[2,[3,[4]]]]"));
        assertEquals(4, dims.length);
        assertEquals(2, dims[0]);
        assertEquals(2, dims[1]);
        assertEquals(2, dims[2]);
        assertEquals(1, dims[3]);

        dims = JSONArray.getDimensions(JSONArray.fromObject("[[[[1],2],3],4]"));
        assertEquals(4, dims.length);
        assertEquals(2, dims[0]);
        assertEquals(2, dims[1]);
        assertEquals(2, dims[2]);
        assertEquals(1, dims[3]);
    }

    public void testGetDimensions_two_dimension() {
        int[] dims = JSONArray.getDimensions(JSONArray.fromObject("[[1,2,3],[4,5,6]]"));
        assertEquals(2, dims.length);
        assertEquals(2, dims[0]);
        assertEquals(3, dims[1]);

        dims = JSONArray.getDimensions(JSONArray.fromObject("[[1,2],[4,5,6]]"));
        assertEquals(2, dims.length);
        assertEquals(2, dims[0]);
        assertEquals(3, dims[1]);

        dims = JSONArray.getDimensions(JSONArray.fromObject("[[1,2,3],[4,5]]"));
        assertEquals(2, dims.length);
        assertEquals(2, dims[0]);
        assertEquals(3, dims[1]);
    }

    public void testGetDouble_exception() {
        try {
            JSONArray jsonArray = JSONArray.fromObject("[[]]");
            jsonArray.getDouble(0);
            fail("Expected a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testGetDouble_Number() {
        JSONArray jsonArray = JSONArray.fromObject("[2.0]");
        assertEquals(2.0d, jsonArray.getDouble(0), 0d);
    }

    public void testGetDouble_String() {
        JSONArray jsonArray = JSONArray.fromObject("[\"2.0\"]");
        assertEquals(2.0d, jsonArray.getDouble(0), 0d);
    }

    public void testGetInt_exception() {
        try {
            JSONArray jsonArray = JSONArray.fromObject("[[]]");
            jsonArray.getInt(0);
            fail("Expected a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testGetInt_Number() {
        JSONArray jsonArray = JSONArray.fromObject("[2.0]");
        assertEquals(2, jsonArray.getInt(0));
    }

    public void testGetInt_String() {
        JSONArray jsonArray = JSONArray.fromObject("[\"2.0\"]");
        assertEquals(2, jsonArray.getInt(0));
    }

    public void testGetJSONArray() {
        JSONArray jsonArray = JSONArray.fromObject("[[1,2]]");
        Assertions.assertEquals(JSONArray.fromObject("[1,2]").toString(), jsonArray.getJSONArray(0).toString());
    }

    public void testGetJSONArray_exception() {
        try {
            JSONArray jsonArray = JSONArray.fromObject("[1]");
            jsonArray.getJSONArray(0);
            fail("Expected a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testGetJSONObject() {
        JSONArray jsonArray = JSONArray.fromObject("[{\"name\":\"json\"}]");
        Assertions.assertEquals(JSONObject.fromObject("{\"name\":\"json\"}"), jsonArray.getJSONObject(0));
    }

    public void testGetJSONObject_exception() {
        try {
            JSONArray jsonArray = JSONArray.fromObject("[1]");
            jsonArray.getJSONObject(0);
            fail("Expected a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testGetLong_exception() {
        try {
            JSONArray jsonArray = JSONArray.fromObject("[[]]");
            jsonArray.getLong(0);
            fail("Expected a JSONException");
        } catch (JSONException expected) {
            // OK
        }
    }

    public void testGetLong_Number() {
        JSONArray jsonArray = JSONArray.fromObject("[2.0]");
        assertEquals(2, jsonArray.getLong(0));
    }

    public void testGetLong_String() {
        JSONArray jsonArray = JSONArray.fromObject("[\"2.0\"]");
        assertEquals(2, jsonArray.getLong(0));
    }

    public void testGetString() {
        JSONArray jsonArray = JSONArray.fromObject("[\"2.0\"]");
        assertEquals("2.0", jsonArray.getString(0));
    }

    public void testGetString_exception() {
        try {
            JSONArray jsonArray = JSONArray.fromObject("[]");
            jsonArray.getString(0);
            fail("Expected a IndexOutOfBoundsException");
        } catch (IndexOutOfBoundsException expected) {
            // OK
        }
    }

    public void testOptionalGet() {
        Object[] params = new Object[] { new JSONArray(), JSONObject.fromObject("{\"int\":1}") };
        JSONArray jsonArray = JSONArray.fromObject(params);
        assertFalse(jsonArray.optBoolean(0));
        assertTrue(jsonArray.optBoolean(0, true));
        assertTrue(Double.isNaN(jsonArray.optDouble(0)));
        assertEquals(0d, jsonArray.optDouble(0, 0d), 0d);
        assertEquals(0, jsonArray.optInt(0));
        assertEquals(1, jsonArray.optInt(0, 1));
        assertEquals(null, jsonArray.optJSONArray(1));
        Assertions.assertEquals((JSONArray) params[0], jsonArray.optJSONArray(0));
        assertEquals(null, jsonArray.optJSONObject(0));
        Assertions.assertEquals((JSONObject) params[1], jsonArray.optJSONObject(1));
        assertEquals(0, jsonArray.optLong(0));
        assertEquals(1, jsonArray.optLong(0, 1));
        assertEquals("", jsonArray.optString(3));
        assertEquals("json", jsonArray.optString(3, "json"));
    }

    public void testToArray_bean_element() {
        BeanA[] expected = new BeanA[] { new BeanA() };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray, BeanA.class);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_BigDecimal() {
        BigDecimal[] expected = new BigDecimal[] { MorphUtils.BIGDECIMAL_ZERO, MorphUtils.BIGDECIMAL_ONE };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_BigInteger() {
        BigInteger[] expected = new BigInteger[] { BigInteger.ZERO, BigInteger.ONE };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_boolean() {
        boolean[] expected = new boolean[] { true, false };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Boolean() {
        Boolean[] expected = new Boolean[] { Boolean.TRUE, Boolean.FALSE };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_boolean_multi() {
        boolean[][] expected = new boolean[][] { { true, false }, { false, true } };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_byte() {
        byte[] input = new byte[] { 1, 2, 3, 4, 5, 6 };
        int[] expected = new int[] { 1, 2, 3, 4, 5, 6 };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Byte() {
        Integer[] expected = new Integer[] { new Integer(1), new Integer(2) };
        Byte[] bytes = new Byte[] { new Byte((byte) 1), new Byte((byte) 2) };
        JSONArray jsonArray = JSONArray.fromObject(bytes);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_byte_multi() {
        byte[][] input = new byte[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        int[][] expected = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_char() {
        String[] expected = new String[] { "A", "B" };
        char[] input = new char[] { 'A', 'B' };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_char_multi() {
        String[][] expected = new String[][] { { "a", "b" }, { "c", "d" } };
        char[][] input = new char[][] { { 'a', 'b' }, { 'c', 'd' } };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Character() {
        String[] expected = { "A", "B" };
        Character[] chars = new Character[] { new Character('A'), new Character('B') };
        JSONArray jsonArray = JSONArray.fromObject(chars);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_double() {
        double[] expected = new double[] { 1, 2, 3, 4, 5, 6 };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Double() {
        Double[] expected = new Double[] { new Double(1d), new Double(2d) };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_double_multi() {
        double[][] expected = new double[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_dynabean_element() throws Exception {
        DynaBean[] expected = new DynaBean[] { createDynaBean() };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_float() {
        double[] expected = new double[] { 1, 2, 3, 4, 5, 6 };
        float[] input = new float[] { 1, 2, 3, 4, 5, 6 };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Float() {
        Double[] expected = new Double[] { new Double(1d), new Double(2d) };
        Float[] floats = new Float[] { new Float(1f), new Float(2f) };
        JSONArray jsonArray = JSONArray.fromObject(floats);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_float_multi() {
        double[][] expected = new double[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        float[][] input = new float[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_int() {
        int[] expected = new int[] { 1, 2, 3, 4, 5, 6 };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_int_multi() {
        int[][] expected = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Integer() {
        Integer[] expected = new Integer[] { new Integer(1), new Integer(2) };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_long() {
        long[] input = new long[] { 1, 2, 3, 4, 5, 6 };
        int[] expected = new int[] { 1, 2, 3, 4, 5, 6 };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Long() {
        Integer[] expected = new Integer[] { new Integer(1), new Integer(2) };
        Long[] longs = new Long[] { new Long(1L), new Long(2L) };
        JSONArray jsonArray = JSONArray.fromObject(longs);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_long_multi() {
        long[][] input = new long[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        int[][] expected = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Long2() {
        Long[] expected = new Long[] { new Long(Integer.MAX_VALUE + 1L), new Long(Integer.MAX_VALUE + 2L) };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_null_elements() {
        String[] expected = new String[] { null, null, null };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_short() {
        short[] input = new short[] { 1, 2, 3, 4, 5, 6 };
        int[] expected = new int[] { 1, 2, 3, 4, 5, 6 };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_Short() {
        Integer[] expected = new Integer[] { new Integer(1), new Integer(2) };
        Short[] shorts = new Short[] { new Short((short) 1), new Short((short) 2) };
        JSONArray jsonArray = JSONArray.fromObject(shorts);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_short_multi() {
        short[][] input = new short[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        int[][] expected = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };
        JSONArray jsonArray = JSONArray.fromObject(input);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_String() {
        String[] expected = new String[] { "1", "2", "3", "4", "5", "6" };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_String_multi() {
        String[][] expected = new String[][] { { "1", "2", "3" }, { "4", "5", "6" } };
        JSONArray jsonArray = JSONArray.fromObject(expected);
        Object actual = JSONArray.toArray(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_StringToInt() {
        int[] expected = new int[] { 1, 2, 3, 4, 5, 6 };
        String[] input = new String[] { "1", "2", "3", "4", "5", "6" };
        JSONArray jsonArray = JSONArray.fromObject(input);
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setRootClass(Integer.TYPE);
        Object actual = JSONArray.toArray(jsonArray, jsonConfig);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_StringToInteger() {
        int[] expected = new int[] { 1, 2, 3, 4, 5, 6 };
        String[] input = new String[] { "1", "2", "3", "4", "5", "6" };
        JSONArray jsonArray = JSONArray.fromObject(input);
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setRootClass(Integer.class);
        Object actual = JSONArray.toArray(jsonArray, jsonConfig);
        Assertions.assertEquals(expected, actual);
    }

    public void testToArray_StringToInteger_empty() {
        int[] expected = new int[] {};
        String[] input = new String[] {};
        JSONArray jsonArray = JSONArray.fromObject(input);
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setRootClass(Integer.class);
        Object actual = JSONArray.toArray(jsonArray, jsonConfig);
        Assertions.assertEquals(expected, actual);
    }

    public void testToJSONObject() {
        JSONArray jsonArray = JSONArray.fromObject("[\"json\",1,true]");
        JSONObject expected = JSONObject.fromObject("{\"string\":\"json\",\"int\":1,\"bool\":true}");
        JSONArray names = JSONArray.fromObject("['string','int','bool']");

        Assertions.assertEquals(expected, jsonArray.toJSONObject(names));
    }

    public void testToJSONObject_null_object() {
        JSONArray jsonArray = new JSONArray();
        assertNull(jsonArray.toJSONObject(null));
        assertNull(jsonArray.toJSONObject(new JSONArray()));
        assertNull(jsonArray.toJSONObject(JSONArray.fromObject("['json']")));
    }

    public void testToList_bean_elements() {
        List expected = new ArrayList();
        expected.add(new BeanA());
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray, BeanA.class);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_BigDecimal() {
        List expected = new ArrayList();
        expected.add(MorphUtils.BIGDECIMAL_ZERO);
        expected.add(MorphUtils.BIGDECIMAL_ONE);
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_BigInteger() {
        List expected = new ArrayList();
        expected.add(BigInteger.ZERO);
        expected.add(BigInteger.ONE);
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Boolean() {
        List expected = new ArrayList();
        expected.add(Boolean.TRUE);
        expected.add(Boolean.FALSE);
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Byte() {
        List expected = new ArrayList();
        expected.add(new Integer(1));
        expected.add(new Integer(2));
        List bytes = new ArrayList();
        bytes.add(new Byte((byte) 1));
        bytes.add(new Byte((byte) 2));
        JSONArray jsonArray = JSONArray.fromObject(bytes);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Character() {
        List expected = new ArrayList();
        expected.add("A");
        expected.add("B");
        List chars = new ArrayList();
        chars.add(new Character('A'));
        chars.add(new Character('B'));
        JSONArray jsonArray = JSONArray.fromObject(chars);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Double() {
        List expected = new ArrayList();
        expected.add(new Double(1d));
        expected.add(new Double(2d));
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_dynaBean_elements() throws Exception {
        List expected = new ArrayList();
        expected.add(createDynaBean());
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Float() {
        List expected = new ArrayList();
        expected.add(new Double(1d));
        expected.add(new Double(2d));
        List floats = new ArrayList();
        floats.add(new Float(1f));
        floats.add(new Float(2f));
        JSONArray jsonArray = JSONArray.fromObject(floats);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Integer() {
        List expected = new ArrayList();
        expected.add(new Integer(1));
        expected.add(new Integer(2));
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_JSONFunction_elements() {
        List expected = new ArrayList();
        expected.add(new JSONFunction(new String[] { "a" }, "return a;"));
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_JSONFunction_elements_2() {
        List expected = new ArrayList();
        expected.add("function(a){ return a; }");
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Long() {
        List expected = new ArrayList();
        expected.add(new Integer(1));
        expected.add(new Integer(2));
        List longs = new ArrayList();
        longs.add(new Long(1L));
        longs.add(new Long(2L));
        JSONArray jsonArray = JSONArray.fromObject(longs);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Long2() {
        List expected = new ArrayList();
        expected.add(new Long(Integer.MAX_VALUE + 1L));
        expected.add(new Long(Integer.MAX_VALUE + 2L));
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_null_elements() {
        List expected = new ArrayList();
        expected.add(null);
        expected.add(null);
        expected.add(null);
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_Short() {
        List expected = new ArrayList();
        expected.add(new Integer(1));
        expected.add(new Integer(2));
        List shorts = new ArrayList();
        shorts.add(new Short((short) 1));
        shorts.add(new Short((short) 2));
        JSONArray jsonArray = JSONArray.fromObject(shorts);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_String() {
        List expected = new ArrayList();
        expected.add("A");
        expected.add("B");
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testToList_String_multi() {
        List a = new ArrayList();
        a.add("a");
        a.add("b");
        List b = new ArrayList();
        b.add("1");
        b.add("2");
        List expected = new ArrayList();
        expected.add(a);
        expected.add(b);
        JSONArray jsonArray = JSONArray.fromObject(expected);
        List actual = JSONArray.toList(jsonArray);
        Assertions.assertEquals(expected, actual);
    }

    public void testWrite() throws IOException {
        JSONArray jsonArray = JSONArray.fromObject("[[],{},1,true,\"json\"]");
        StringWriter sw = new StringWriter();
        jsonArray.write(sw);
        assertEquals("[[],{},1,true,\"json\"]", sw.toString());
    }

    private MorphDynaBean createDynaBean() throws Exception {
        Map properties = new HashMap();
        properties.put("name", String.class);
        MorphDynaClass dynaClass = new MorphDynaClass(properties);
        MorphDynaBean dynaBean = (MorphDynaBean) dynaClass.newInstance();
        dynaBean.setDynaBeanClass(dynaClass);
        dynaBean.set("name", "json");
        // JSON Strings can not be null, only empty
        return dynaBean;
    }

    private void testJSONArray(Object array, String expected) {
        try {
            JSONArray jsonArray = JSONArray.fromObject(array);
            assertEquals(expected, jsonArray.toString());
        } catch (JSONException jsone) {
            fail(jsone.getMessage());
        }
    }
}