/*
* 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.jackrabbit.commons.json;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
/**
* <code>JSONParserTest</code>...
*/
public class JsonParserTest extends TestCase {
private final JsonHandler handler = new DummyJsonHandler();
protected void setUp() throws Exception {
super.setUp();
}
public void testParser() throws Exception {
// TODO validate output. use specific handler ext.
JsonParser parser = new JsonParser(handler);
parser.parse(getObj().toString());
}
public void testParseBooleanValue() throws Exception {
JSONObject obj = new JSONObject();
obj.put("boolean", true);
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("boolean", key);
}
public void value(String value) {
fail();
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
assertEquals(true, value);
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testParseLongValue() throws Exception {
JSONObject obj = new JSONObject();
obj.put("long", 123456);
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("long", key);
}
public void value(String value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
public void value(long value) {
assertEquals(123456, value);
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testDoubleValue() throws Exception {
JSONObject obj = new JSONObject();
obj.put("double", 1235674.342424);
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("double", key);
}
public void value(String value) {
fail();
}
public void value(long value) {
fail();
}
public void value(boolean value) {
fail();
}
public void value(double value) {
assertEquals(new Double(1235674.342424), new Double(value));
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testStringValue() throws Exception {
JSONObject obj = new JSONObject();
obj.put("string", "abc");
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("string", key);
}
public void value(String value) {
assertEquals("abc", value);
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testStringWithQuoteValue() throws Exception {
JSONObject obj = new JSONObject();
obj.put("string", "abc\"abc");
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("string", key);
}
public void value(String value) {
assertEquals("abc\"abc", value);
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testStringWithBackSlashValue() throws Exception {
JSONObject obj = new JSONObject();
obj.put("string", "abc\\abc");
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("string", key);
}
public void value(String value) {
assertEquals("abc\\abc", value);
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testStringWithBackSlashValue2() throws Exception {
JSONObject obj = new JSONObject();
obj.put("string", "\'abc\\\\x\\'abc");
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("string", key);
}
public void value(String value) {
assertEquals("\'abc\\\\x\\'abc", value);
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testStringWithUnicode() throws Exception {
JSONObject obj = new JSONObject();
obj.put("string", "abc\u2345ab\u00EB\u0633c");
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("string", key);
}
public void value(String value) {
assertEquals("abc\u2345ab\u00EB\u0633c", value);
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testStringWithUnicode2() throws Exception {
JSONObject obj = new JSONObject();
obj.put("string", "\u00EB");
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("string", key);
}
public void value(String value) {
assertEquals("\u00EB", value);
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testStringWithReturn() throws Exception {
ArrayList l = new ArrayList();
l.add("abc\ndef");
l.add("abc\rdef");
l.add("abc\n\rdef");
l.add("abc\tdef");
l.add("abc\bdef");
l.add("abc\n\\\tdef");
l.add("abc\f\u3456\b\\def");
for (Iterator it = l.iterator(); it.hasNext();) {
final String expValue = it.next().toString();
JSONObject obj = new JSONObject();
obj.put("string", expValue);
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("string", key);
}
public void value(String value) {
assertEquals(expValue, value);
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
}
public void testNullValue() throws Exception {
JSONObject obj = new JSONObject();
obj.put("null", null);
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals("null", key);
}
public void value(String value) {
assertNull(value);
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testArray() throws Exception {
JSONObject obj = new JSONObject();
obj.put("array", Arrays.asList(new String[] {"a", "b", "c"}));
JsonHandler handler = new DummyJsonHandler() {
boolean arrayStarted = false;
int index = 0;
public void key(String key) {
assertEquals("array", key);
}
public void array() {
assertFalse(arrayStarted);
arrayStarted = true;
}
public void endArray() {
assertTrue(arrayStarted);
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
public void value(String value) {
assertTrue(arrayStarted);
switch (index) {
case 0: assertEquals("a", value); break;
case 1: assertEquals("b", value); break;
case 2: assertEquals("c", value); break;
default: fail();
}
index++;
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testLongArray() throws Exception {
JSONObject obj = new JSONObject();
obj.put("longarray", Arrays.asList(new Long[] {new Long(123), new Long(3456), new Long(45367)}));
JsonHandler handler = new DummyJsonHandler() {
boolean arrayStarted = false;
int index = 0;
public void key(String key) {
assertEquals("longarray", key);
}
public void array() {
assertFalse(arrayStarted);
arrayStarted = true;
}
public void endArray() {
assertTrue(arrayStarted);
}
public void value(long value) {
assertTrue(arrayStarted);
switch (index) {
case 0: assertEquals(123, value); break;
case 1: assertEquals(3456, value); break;
case 2: assertEquals(45367, value); break;
default: fail();
}
index++;
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
public void value(String value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testParser2() throws Exception {
JSONObject obj = new JSONObject();
obj.put("obj1", getSimpleObj("bla"));
obj.put("obj2", getSimpleObj("blu"));
obj.put("obj3", getSimpleObj("bli"));
// TODO validate output. use specific handler ext.
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testParser4() throws Exception {
JSONObject obj = new JSONObject();
obj.put("arr1", getSimpleArray(new String[] {"s", "t", "r"}));
obj.put("arr2", getSimpleArray(new String[] {"s", "t", "r"}));
obj.put("arr3", getSimpleArray(new String[] {"s", "t", "r"}));
obj.put("arr4", getSimpleArray(new String[] {"s", "t", "r"}));
// TODO validate output. use specific handler ext.
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testParser5() throws Exception {
JSONObject obj = new JSONObject();
obj.put("arr1", getSimpleArray(new JSONObject[] { getSimpleObj(new Integer(1)), getSimpleObj("abc"), getSimpleObj(Boolean.TRUE) }));
obj.put("objvalue", getSimpleObj( getSimpleArray(new Object[] {"a", new Double(2.3), Boolean.FALSE})));
obj.put("arrarr", getSimpleArray( new Object[] {getSimpleArray(new Object[] {"a", new Double(2.3), Boolean.FALSE})}));
obj.put("simplv", Boolean.TRUE);
// TODO validate output. use specific handler ext.
JsonParser parser = new JsonParser(handler);
parser.parse(obj.toString());
}
public void testParser6() throws Exception {
final String expKey = "prop1";
final String expValue = "Any string containing comma, period. question mark?";
JsonHandler handler = new DummyJsonHandler() {
public void key(String key) {
assertEquals(expKey, key);
}
public void value(String value) {
assertEquals(expValue, value);
}
};
String str = "{\"" +expKey+ "\":\""+expValue+"\"}";
JsonParser parser = new JsonParser(handler);
parser.parse(str);
}
public void testParseEmptyObject() throws Exception {
JsonHandler handler = new DummyJsonHandler() {
private int objectCnt = 0;
public void object() {
objectCnt++;
}
public void endObject() {
assertEquals(1, objectCnt);
}
public void array() {
fail();
}
public void endArray() {
fail();
}
public void key(String key) {
fail();
}
public void value(String value) {
fail();
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse("{}");
}
public void testParseEmptyObjectValue() throws Exception {
List l = new ArrayList();
l.add("{\"a\":{},\"b\":{},\"c\":{}}");
l.add("{\"a\":{\"b\":{\"c\":{}}}}");
l.add("{\"a\":{},\"b\":{\"c\":{}}}");
l.add("{\"a\":{\"b\":{},\"c\":{}}}");
for (Iterator it = l.iterator(); it.hasNext();) {
JsonHandler handler = new DummyJsonHandler() {
private int objectCnt = 0;
public void object() {
objectCnt++;
}
public void endObject() {
assertFalse(objectCnt > 4);
}
public void array() {
fail();
}
public void endArray() {
fail();
}
public void value(String value) {
fail();
}
public void value(long value) {
fail();
}
public void value(double value) {
fail();
}
public void value(boolean value) {
fail();
}
};
JsonParser parser = new JsonParser(handler);
parser.parse(it.next().toString());
}
}
private static JSONObject getObj() {
JSONObject obj = new JSONObject();
obj.put("boolean", true);
obj.put("long", 1);
obj.put("double", 1235674.342424);
obj.put("array", Arrays.asList(new String[] {"a", "b", "c"}));
obj.put("longarray", Arrays.asList(new Long[] {new Long(123), new Long(3456), new Long(45367)}));
obj.put("string", "abc");
obj.put("string1", "123.456");
return obj;
}
private static JSONObject getSimpleObj(Object value) {
JSONObject obj = new JSONObject();
obj.put("v", value);
return obj;
}
private static JSONArray getSimpleArray(Object[] values) {
JSONArray arr = new JSONArray();
for (int i = 0; i < values.length; i++) {
arr.add(values[i]);
}
return arr;
}
//--------------------------------------------------------------------------
/**
* Dummy handler impl that does nothing.
*/
private class DummyJsonHandler implements JsonHandler {
public void object() {
}
public void endObject() {
}
public void array() {
}
public void endArray() {
}
public void key(String key) {
}
public void value(String value) {
}
public void value(long value) {
}
public void value(double value) {
}
public void value(boolean value) {
}
}
}