Tests for JsonElementReader

This commit is contained in:
Jesse Wilson 2011-09-30 03:25:41 +00:00
parent bd2a0ac466
commit 9ce9c62b44
2 changed files with 214 additions and 12 deletions

View File

@ -31,7 +31,8 @@ import java.util.List;
import java.util.Map;
/**
*
* This reader walks the elements of a JsonElement as if it was coming from a
* character stream.
*/
public final class JsonElementReader extends JsonReader {
private static final Reader UNREADABLE_READER = new Reader() {
@ -45,9 +46,6 @@ public final class JsonElementReader extends JsonReader {
private final List<Object> stack = new ArrayList<Object>();
/**
* Creates a new instance that reads a JSON-encoded stream from {@code in}.
*/
public JsonElementReader(JsonElement element) {
super(UNREADABLE_READER);
stack.add(element);
@ -146,7 +144,10 @@ public final class JsonElementReader extends JsonReader {
}
@Override public String nextString() throws IOException {
expect(JsonToken.STRING);
JsonToken token = peek();
if (token != JsonToken.STRING && token != JsonToken.NUMBER) {
throw new IllegalStateException("Expected " + JsonToken.STRING + " but was " + token);
}
return ((JsonPrimitive) popStack()).getAsString();
}
@ -161,18 +162,33 @@ public final class JsonElementReader extends JsonReader {
}
@Override public double nextDouble() throws IOException {
expect(JsonToken.NUMBER);
return ((JsonPrimitive) popStack()).getAsDouble();
JsonToken token = peek();
if (token != JsonToken.NUMBER && token != JsonToken.STRING) {
throw new IllegalStateException("Expected " + JsonToken.NUMBER + " but was " + token);
}
double result = ((JsonPrimitive) peekStack()).getAsDouble();
popStack();
return result;
}
@Override public long nextLong() throws IOException {
expect(JsonToken.NUMBER);
return ((JsonPrimitive) popStack()).getAsLong();
JsonToken token = peek();
if (token != JsonToken.NUMBER && token != JsonToken.STRING) {
throw new IllegalStateException("Expected " + JsonToken.NUMBER + " but was " + token);
}
long result = ((JsonPrimitive) peekStack()).getAsLong();
popStack();
return result;
}
@Override public int nextInt() throws IOException {
expect(JsonToken.NUMBER);
return ((JsonPrimitive) popStack()).getAsInt();
JsonToken token = peek();
if (token != JsonToken.NUMBER && token != JsonToken.STRING) {
throw new IllegalStateException("Expected " + JsonToken.NUMBER + " but was " + token);
}
int result = ((JsonPrimitive) peekStack()).getAsInt();
popStack();
return result;
}
@Override public void close() throws IOException {

View File

@ -24,6 +24,61 @@ import junit.framework.TestCase;
public final class JsonElementReaderTest extends TestCase {
public void testNumbers() throws IOException {
JsonElement array = new JsonParser().parse("[1, 2, 3]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
assertEquals(1, reader.nextInt());
assertEquals(2L, reader.nextLong());
assertEquals(3.0, reader.nextDouble());
reader.endArray();
}
public void testNumbersFromStrings() throws IOException {
JsonElement array = new JsonParser().parse("[\"1\", \"2\", \"3\"]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
assertEquals(1, reader.nextInt());
assertEquals(2L, reader.nextLong());
assertEquals(3.0, reader.nextDouble());
reader.endArray();
}
public void testStringsFromNumbers() throws IOException {
JsonElement array = new JsonParser().parse("[1]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
assertEquals("1", reader.nextString());
reader.endArray();
}
public void testBooleans() throws IOException {
JsonElement array = new JsonParser().parse("[true, false]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
assertEquals(true, reader.nextBoolean());
assertEquals(false, reader.nextBoolean());
reader.endArray();
}
public void testNulls() throws IOException {
JsonElement array = new JsonParser().parse("[null,null]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
reader.nextNull();
reader.nextNull();
reader.endArray();
}
public void testStrings() throws IOException {
JsonElement array = new JsonParser().parse("[\"A\",\"B\"]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
assertEquals("A", reader.nextString());
assertEquals("B", reader.nextString());
reader.endArray();
}
public void testArray() throws IOException {
JsonElement array = new JsonParser().parse("[1, 2, 3]");
JsonElementReader reader = new JsonElementReader(array);
@ -65,6 +120,35 @@ public final class JsonElementReaderTest extends TestCase {
reader.endArray();
}
public void testNestedArrays() throws IOException {
JsonElement array = new JsonParser().parse("[[],[[]]]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
reader.beginArray();
reader.endArray();
reader.beginArray();
reader.beginArray();
reader.endArray();
reader.endArray();
reader.endArray();
}
public void testNestedObjects() throws IOException {
JsonElement array = new JsonParser().parse("{\"A\":{},\"B\":{\"C\":{}}}");
JsonElementReader reader = new JsonElementReader(array);
reader.beginObject();
assertEquals("A", reader.nextName());
reader.beginObject();
reader.endObject();
assertEquals("B", reader.nextName());
reader.beginObject();
assertEquals("C", reader.nextName());
reader.beginObject();
reader.endObject();
reader.endObject();
reader.endObject();
}
public void testEmptyObject() throws IOException {
JsonElement array = new JsonParser().parse("{}");
JsonElementReader reader = new JsonElementReader(array);
@ -72,5 +156,107 @@ public final class JsonElementReaderTest extends TestCase {
reader.endObject();
}
// TODO: more test coverage
public void testSkipValue() throws IOException {
JsonElement array = new JsonParser().parse("[\"A\",{\"B\":[[]]},\"C\",[[]],\"D\",null]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
assertEquals("A", reader.nextString());
reader.skipValue();
assertEquals("C", reader.nextString());
reader.skipValue();
assertEquals("D", reader.nextString());
reader.skipValue();
reader.endArray();
}
public void testWrongType() throws IOException {
JsonElement array = new JsonParser().parse("[[],\"A\"]");
JsonElementReader reader = new JsonElementReader(array);
reader.beginArray();
try {
reader.nextBoolean();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.nextNull();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.nextString();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.nextInt();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.nextLong();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.nextDouble();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.nextName();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.beginObject();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.endArray();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.endObject();
fail();
} catch (IllegalStateException expected) {
}
reader.beginArray();
reader.endArray();
try {
reader.nextBoolean();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.nextNull();
fail();
} catch (IllegalStateException expected) {
}
try {
reader.nextInt();
fail();
} catch (NumberFormatException expected) {
}
try {
reader.nextLong();
fail();
} catch (NumberFormatException expected) {
}
try {
reader.nextDouble();
fail();
} catch (NumberFormatException expected) {
}
try {
reader.nextName();
fail();
} catch (IllegalStateException expected) {
}
assertEquals("A", reader.nextString());
reader.endArray();
}
}