/*
* Copyright 2008-2009 LinkedIn, Inc
*
* 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 voldemort.serialization.json;
import static voldemort.TestUtils.quote;
import java.io.StringReader;
import junit.framework.TestCase;
import voldemort.serialization.SerializationException;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
/**
*
*/
public class JsonReaderTest extends TestCase {
public void testObjects() {
assertParsed(ImmutableMap.of("1", 1, "2", 2), "{\"1\":1, \"2\":2}");
assertParsed(ImmutableMap.of("1", 1, "2", 2), "{\"1\" : 1, \"2\": 2}");
assertParsed(ImmutableMap.of(), "{}");
assertParsed(ImmutableMap.of("h", ImmutableMap.of()), "{\"h\":{}}");
}
public void testArrays() {
assertParsed(ImmutableList.of(), "[]");
assertParsed(ImmutableList.of(1), "[1]");
assertParsed(ImmutableList.of(1, ImmutableList.of(1)), "[1, [1]]");
}
public void testStrings() {
assertParsed("hello", quote("hello"));
assertParsed(" hello ", quote(" hello "));
assertParsed(" hello \n\r", quote(" hello \n\r"));
assertParsed("", quote(""));
assertParsed("\"", "'\"'");
// test strings with single quotes
assertParsed(" hello \n\r", "' hello \n\r'");
assertParsed("\u1234", "'\\u1234'");
// control sequences
assertParsed("\"", quote("\\\""));
assertParsed("\\", quote("\\\\"));
assertParsed("/", quote("\\/"));
assertParsed("\b", quote("\\b"));
assertParsed("\f", quote("\\f"));
assertParsed("\n", quote("\\n"));
assertParsed("\r", quote("\\r"));
assertParsed("\t", quote("\\t"));
// unicode literals
assertParsed("\u1234", quote("\\u1234"));
assertParsed("\u12aF", quote("\\u12aF"));
assertParsed("\u12Af", quote("\\u12Af"));
}
public void testNumbers() {
assertParsed(-1, "-1");
assertParsed(1, "1");
assertParsedDouble(1.1d, "1.1");
assertParsedDouble(0.12304d, "0.12304");
assertParsedDouble(1e10d, "1e10");
assertParsedDouble(1e10d, "1e+10");
assertParsedDouble(-1e-10d, "-1E-10");
}
public void testNull() {
assertParsed(null, "null");
}
public void testBoolean() {
assertParsed(true, "true");
assertParsed(false, "false");
}
public void testInvalid() {
assertFails("1a");
assertFails("[2");
assertFails("{");
assertFails("}");
assertFails("-[]");
assertFails("pkldjf");
assertFails("1ef");
assertFails("1E");
assertFails(quote("\\u123v"));
}
public void testParseMultiple() throws Exception {
JsonReader reader = new JsonReader(new StringReader("1{} {} [2]\"3\" "));
assertTrue(reader.hasMore());
assertEquals(1, reader.read());
assertTrue(reader.hasMore());
assertEquals(ImmutableMap.of(), reader.read());
assertTrue(reader.hasMore());
assertEquals(ImmutableMap.of(), reader.read());
assertTrue(reader.hasMore());
assertEquals(ImmutableList.of(2), reader.read());
assertTrue(reader.hasMore());
assertEquals("3", reader.read());
assertTrue(!reader.hasMore());
}
public void testComplex() throws Exception {
assertParsed(ImmutableList.of(ImmutableMap.of("",
false,
"LxO45",
true,
"l1jBAJTSO",
ImmutableList.of(3245847,
4,
ImmutableList.of(),
3988)),
ImmutableMap.of(),
ImmutableMap.of("", "sk7QzU"),
"0lMsJq"), "[{\"\":false, \"LxO45\":true,"
+ " \"l1jBAJTSO\":[3245847, 4, [], 3988]}, "
+ " {}, {\"\":\"sk7QzU\"}, \"0lMsJq\"]");
}
private void assertFails(String value) {
try {
new JsonReader(new StringReader(value)).read();
fail("Invalid value \"" + value + "\" parsed without error.");
} catch(SerializationException e) {
// good
}
}
private void assertParsedDouble(Double d1, String value) {
Object o = new JsonReader(new StringReader(value)).read();
assertEquals(Double.class, o.getClass());
Double d2 = (Double) o;
assertEquals(d1.doubleValue(), d2.doubleValue(), 0.00001);
}
private void assertParsed(Object expected, String value) {
assertEquals(expected, new JsonReader(new StringReader(value)).read());
// add some random whitespace
assertEquals(expected, new JsonReader(new StringReader(" " + value + " ")).read());
}
}