blob: d0207d271faebfb7b0088bb2ca748a26a55b9e18 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* 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 android.util.cts;
import java.io.IOException;
import java.io.StringWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import junit.framework.TestCase;
import android.util.JsonWriter;
public final class JsonWriterTest extends TestCase {
public void testWrongTopLevelType() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
try {
jsonWriter.value("a");
fail();
} catch (IllegalStateException expected) {
}
}
public void testTwoNames() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
jsonWriter.name("a");
try {
jsonWriter.name("a");
fail();
} catch (IllegalStateException expected) {
}
}
public void testNameWithoutValue() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
jsonWriter.name("a");
try {
jsonWriter.endObject();
fail();
} catch (IllegalStateException expected) {
}
}
public void testValueWithoutName() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
try {
jsonWriter.value(true);
fail();
} catch (IllegalStateException expected) {
}
}
public void testMultipleTopLevelValues() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray().endArray();
try {
jsonWriter.beginArray();
fail();
} catch (IllegalStateException expected) {
}
}
public void testBadNestingObject() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.beginObject();
try {
jsonWriter.endArray();
fail();
} catch (IllegalStateException expected) {
}
}
public void testBadNestingArray() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.beginArray();
try {
jsonWriter.endObject();
fail();
} catch (IllegalStateException expected) {
}
}
public void testNullName() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
try {
jsonWriter.name(null);
fail();
} catch (NullPointerException expected) {
}
}
public void testNullStringValue() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
jsonWriter.name("a");
jsonWriter.value((String) null);
jsonWriter.endObject();
assertEquals("{\"a\":null}", stringWriter.toString());
}
public void testNonFiniteDoubles() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
try {
jsonWriter.value(Double.NaN);
fail();
} catch (IllegalArgumentException expected) {
}
try {
jsonWriter.value(Double.NEGATIVE_INFINITY);
fail();
} catch (IllegalArgumentException expected) {
}
try {
jsonWriter.value(Double.POSITIVE_INFINITY);
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testNonFiniteBoxedDoubles() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
try {
jsonWriter.value(new Double(Double.NaN));
fail();
} catch (IllegalArgumentException expected) {
}
try {
jsonWriter.value(new Double(Double.NEGATIVE_INFINITY));
fail();
} catch (IllegalArgumentException expected) {
}
try {
jsonWriter.value(new Double(Double.POSITIVE_INFINITY));
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testDoubles() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.value(-0.0);
jsonWriter.value(1.0);
jsonWriter.value(Double.MAX_VALUE);
jsonWriter.value(Double.MIN_VALUE);
jsonWriter.value(0.0);
jsonWriter.value(-0.5);
jsonWriter.value(Double.MIN_NORMAL);
jsonWriter.value(Math.PI);
jsonWriter.value(Math.E);
jsonWriter.endArray();
jsonWriter.close();
assertEquals("[-0.0,"
+ "1.0,"
+ "1.7976931348623157E308,"
+ "4.9E-324,"
+ "0.0,"
+ "-0.5,"
+ "2.2250738585072014E-308,"
+ "3.141592653589793,"
+ "2.718281828459045]", stringWriter.toString());
}
public void testLongs() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.value(0);
jsonWriter.value(1);
jsonWriter.value(-1);
jsonWriter.value(Long.MIN_VALUE);
jsonWriter.value(Long.MAX_VALUE);
jsonWriter.endArray();
jsonWriter.close();
assertEquals("[0,"
+ "1,"
+ "-1,"
+ "-9223372036854775808,"
+ "9223372036854775807]", stringWriter.toString());
}
public void testNumbers() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.value(new BigInteger("0"));
jsonWriter.value(new BigInteger("9223372036854775808"));
jsonWriter.value(new BigInteger("-9223372036854775809"));
jsonWriter.value(new BigDecimal("3.141592653589793238462643383"));
jsonWriter.endArray();
jsonWriter.close();
assertEquals("[0,"
+ "9223372036854775808,"
+ "-9223372036854775809,"
+ "3.141592653589793238462643383]", stringWriter.toString());
}
public void testBooleans() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.value(true);
jsonWriter.value(false);
jsonWriter.endArray();
assertEquals("[true,false]", stringWriter.toString());
}
public void testNulls() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.nullValue();
jsonWriter.endArray();
assertEquals("[null]", stringWriter.toString());
}
public void testStrings() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.value("a");
jsonWriter.value("a\"");
jsonWriter.value("\"");
jsonWriter.value(":");
jsonWriter.value(",");
jsonWriter.value("\b");
jsonWriter.value("\f");
jsonWriter.value("\n");
jsonWriter.value("\r");
jsonWriter.value("\t");
jsonWriter.value(" ");
jsonWriter.value("\\");
jsonWriter.value("{");
jsonWriter.value("}");
jsonWriter.value("[");
jsonWriter.value("]");
jsonWriter.value("\0");
jsonWriter.value("\u0019");
jsonWriter.endArray();
assertEquals("[\"a\","
+ "\"a\\\"\","
+ "\"\\\"\","
+ "\":\","
+ "\",\","
+ "\"\\b\","
+ "\"\\f\","
+ "\"\\n\","
+ "\"\\r\","
+ "\"\\t\","
+ "\" \","
+ "\"\\\\\","
+ "\"{\","
+ "\"}\","
+ "\"[\","
+ "\"]\","
+ "\"\\u0000\","
+ "\"\\u0019\"]", stringWriter.toString());
}
public void testUnicodeLineBreaksEscaped() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.value("\u2028 \u2029");
jsonWriter.endArray();
assertEquals("[\"\\u2028 \\u2029\"]", stringWriter.toString());
}
public void testEmptyArray() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.endArray();
assertEquals("[]", stringWriter.toString());
}
public void testEmptyObject() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
jsonWriter.endObject();
assertEquals("{}", stringWriter.toString());
}
public void testObjectsInArrays() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginArray();
jsonWriter.beginObject();
jsonWriter.name("a").value(5);
jsonWriter.name("b").value(false);
jsonWriter.endObject();
jsonWriter.beginObject();
jsonWriter.name("c").value(6);
jsonWriter.name("d").value(true);
jsonWriter.endObject();
jsonWriter.endArray();
assertEquals("[{\"a\":5,\"b\":false},"
+ "{\"c\":6,\"d\":true}]", stringWriter.toString());
}
public void testArraysInObjects() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
jsonWriter.name("a");
jsonWriter.beginArray();
jsonWriter.value(5);
jsonWriter.value(false);
jsonWriter.endArray();
jsonWriter.name("b");
jsonWriter.beginArray();
jsonWriter.value(6);
jsonWriter.value(true);
jsonWriter.endArray();
jsonWriter.endObject();
assertEquals("{\"a\":[5,false],"
+ "\"b\":[6,true]}", stringWriter.toString());
}
public void testDeepNestingArrays() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
for (int i = 0; i < 20; i++) {
jsonWriter.beginArray();
}
for (int i = 0; i < 20; i++) {
jsonWriter.endArray();
}
assertEquals("[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]", stringWriter.toString());
}
public void testDeepNestingObjects() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
for (int i = 0; i < 20; i++) {
jsonWriter.name("a");
jsonWriter.beginObject();
}
for (int i = 0; i < 20; i++) {
jsonWriter.endObject();
}
jsonWriter.endObject();
assertEquals("{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":"
+ "{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{\"a\":{"
+ "}}}}}}}}}}}}}}}}}}}}}", stringWriter.toString());
}
public void testRepeatedName() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.beginObject();
jsonWriter.name("a").value(true);
jsonWriter.name("a").value(false);
jsonWriter.endObject();
// JsonWriter doesn't attempt to detect duplicate names
assertEquals("{\"a\":true,\"a\":false}", stringWriter.toString());
}
public void testPrettyPrintObject() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.setIndent(" ");
jsonWriter.beginObject();
jsonWriter.name("a").value(true);
jsonWriter.name("b").value(false);
jsonWriter.name("c").value(5.0);
jsonWriter.name("e").nullValue();
jsonWriter.name("f").beginArray();
jsonWriter.value(6.0);
jsonWriter.value(7.0);
jsonWriter.endArray();
jsonWriter.name("g").beginObject();
jsonWriter.name("h").value(8.0);
jsonWriter.name("i").value(9.0);
jsonWriter.endObject();
jsonWriter.endObject();
String expected = "{\n"
+ " \"a\": true,\n"
+ " \"b\": false,\n"
+ " \"c\": 5.0,\n"
+ " \"e\": null,\n"
+ " \"f\": [\n"
+ " 6.0,\n"
+ " 7.0\n"
+ " ],\n"
+ " \"g\": {\n"
+ " \"h\": 8.0,\n"
+ " \"i\": 9.0\n"
+ " }\n"
+ "}";
assertEquals(expected, stringWriter.toString());
}
public void testPrettyPrintArray() throws IOException {
StringWriter stringWriter = new StringWriter();
JsonWriter jsonWriter = new JsonWriter(stringWriter);
jsonWriter.setIndent(" ");
jsonWriter.beginArray();
jsonWriter.value(true);
jsonWriter.value(false);
jsonWriter.value(5.0);
jsonWriter.nullValue();
jsonWriter.beginObject();
jsonWriter.name("a").value(6.0);
jsonWriter.name("b").value(7.0);
jsonWriter.endObject();
jsonWriter.beginArray();
jsonWriter.value(8.0);
jsonWriter.value(9.0);
jsonWriter.endArray();
jsonWriter.endArray();
String expected = "[\n"
+ " true,\n"
+ " false,\n"
+ " 5.0,\n"
+ " null,\n"
+ " {\n"
+ " \"a\": 6.0,\n"
+ " \"b\": 7.0\n"
+ " },\n"
+ " [\n"
+ " 8.0,\n"
+ " 9.0\n"
+ " ]\n"
+ "]";
assertEquals(expected, stringWriter.toString());
}
}