blob: 878ecb1c33d6af286e1e75bb15f7f2ceebed9eb7 [file] [log] [blame]
/*
* 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.noggit;
import java.io.IOException;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.apache.solr.SolrTestCaseJ4;
import org.junit.Test;
import org.noggit.JSONParser.ParseException;
@SolrTestCaseJ4.SuppressSSL
public class TestObjectBuilder extends SolrTestCaseJ4 {
public void _test(String val, Object expected) throws IOException {
val = val.replace('\'','"');
Object v = random().nextBoolean() ? ObjectBuilder.fromJSON(val) :
ObjectBuilder.fromJSONStrict(val) ;
String s1 = JSONUtil.toJSON(v,-1);
String s2 = JSONUtil.toJSON(expected,-1);
assertEquals(s1, s2);
// not make sure that it round-trips correctly
JSONParser p2 = TestJSONParser.getParser(s1);
Object v2 = ObjectBuilder.getVal(p2);
String s3 = JSONUtil.toJSON(v2,-1);
assertEquals(s1, s3);
}
public static List<Object> L(Object... lst) {
return Arrays.asList(lst);
}
public static Object[] A(Object... lst) {
return lst;
}
public static Map<String, Object> O(Object... lst) {
LinkedHashMap<String,Object> map = new LinkedHashMap<String,Object>();
for (int i=0; i<lst.length; i+=2) {
map.put(lst[i].toString(), lst[i+1]);
}
return map;
}
@Test
public void testWithoutStartingBraces() throws IOException {
JSONParser parser = new JSONParser("a: {key:val1}b:{key:val2}");
parser.setFlags(JSONParser.FLAGS_DEFAULT | JSONParser.OPTIONAL_OUTER_BRACES| JSONParser.ALLOW_MISSING_COLON_COMMA_BEFORE_OBJECT);
ObjectBuilder objectBuilder = new ObjectBuilder(parser);
String s1 = JSONUtil.toJSON(objectBuilder.getObject(),-1);
String expected = JSONUtil.toJSON(O("a", O("key", "val1"), "b", O("key", "val2")),-1);
assertEquals(s1, expected);
}
public void _testVariations(String str, Object expected) throws IOException {
_test("["+str+"]", L(expected));
_test("["+str+","+str+"]", L(expected, expected));
_test("["+str+","+str+"]", A(expected, expected));
_test("{'foo':"+str+"}", O("foo",expected));
_test("{'foo':"+str+",'bar':{'a':"+str+"},'baz':["+str+"],'zzz':["+str+"]}",
O("foo",expected,"bar",O("a",expected),"baz", L(expected), "zzz", A(expected)));
}
@Test
public void testBuilder() throws IOException {
_testVariations("[]", L());
_testVariations("[]", L());
_testVariations("{}", O());
_testVariations("[[]]", L(L()));
_testVariations("{'foo':{}}", O("foo",O()));
_testVariations("[false,true,1,1.4,null,'hi']", L(false, true, 1, 1.4, null, "hi"));
_testVariations("'hello'", "hello".toCharArray());
// test array types
_testVariations("[[10,20],['a','b']]", L(A(10,20),A("a","b")));
_testVariations("[1,2,3]", new int[]{1,2,3});
_testVariations("[1,2,3]", new long[]{1,2,3});
_testVariations("[1.0,2.0,3.0]", new float[]{1,2,3});
_testVariations("[1.0,2.0,3.0]", new double[]{1,2,3});
_testVariations("[1,2,3]", new short[]{1,2,3});
_testVariations("[1,2,3]", new byte[]{1,2,3});
_testVariations("[false,true,false]", new boolean[]{false,true,false});
}
@Test
public void testStrictPositive() throws IOException {
assertEquals(O("foo","bar", "ban", "buzz"),
ObjectBuilder.fromJSONStrict("{\"foo\":\"bar\", \"ban\":\"buzz\"}"));
assertEquals(O("foo","bar" ),
ObjectBuilder.fromJSONStrict("{\"foo\":\"bar\"/*, \"ban\":\"buzz\"*/}"));
assertEquals(O("foo","bar" ),
ObjectBuilder.fromJSONStrict("{\"foo\":\"bar\"} /*\"ban\":\"buzz\"*/"));
assertEquals("foo",
ObjectBuilder.fromJSONStrict("\"foo\""));
assertEquals("fromJSON() ignores tail.",O("foo","bar" ),
ObjectBuilder.fromJSON("{\"foo\":\"bar\"} \"ban\":\"buzz\"}"));
assertEquals("old method ignores tails", "foo",
ObjectBuilder.fromJSON("\"foo\" \"baar\" "));
expectThrows(ParseException.class,
() -> ObjectBuilder.fromJSONStrict("\"foo\" \"bar\""));
expectThrows(ParseException.class,
() -> ObjectBuilder.fromJSONStrict("{\"foo\":\"bar\"} \"ban\":\"buzz\"}"));
expectThrows(ParseException.class,
() -> ObjectBuilder.getValStrict(new JSONParser("{\"foo\":\"bar\"} \"ban\":\"buzz\"}")));
expectThrows(ParseException.class,
() -> new ObjectBuilder(new JSONParser("{\"foo\":\"bar\"} \"ban\":\"buzz\"}")).getValStrict());
}
}