Tests for JsonElementReader
This commit is contained in:
parent
bd2a0ac466
commit
9ce9c62b44
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue