+ static abstract class LeafVerifier {
+
+ Object expectedValue;
+ JsonToken expectedToken;
+
+ LeafVerifier( Object expectedValue, JsonToken expectedToken ) {
+ this.expectedValue = expectedValue;
+ this.expectedToken = expectedToken;
+ }
+
+ abstract Object getActualValue( JsonReader reader ) throws IOException;
+
+ void verify( JsonReader reader, String keyName ) throws IOException {
+ assertEquals( "Json value for key " + keyName, expectedValue, getActualValue( reader ) );
+ }
+
+ JsonToken expectedTokenType() {
+ return expectedToken;
+ }
+ }
+
+ static class BooleanVerifier extends LeafVerifier {
+
+ public BooleanVerifier( boolean expected ) {
+ super( expected, JsonToken.BOOLEAN );
+ }
+
+ @Override
+ Object getActualValue( JsonReader reader ) throws IOException {
+ return reader.nextBoolean();
+ }
+ }
+
+ static class NumberVerifier extends LeafVerifier {
+
+ public NumberVerifier( Number expected ) {
+ super( expected, JsonToken.NUMBER );
+ }
+
+ @Override
+ Object getActualValue( JsonReader reader ) throws IOException {
+ if( expectedValue instanceof Double ) {
+ return reader.nextDouble();
+ }
+ else if( expectedValue instanceof Long ) {
+ return reader.nextLong();
+ }
+ else if( expectedValue instanceof Integer ) {
+ return reader.nextInt();
+ }
+
+ return null;
+ }
+ }
+
+ static class StringVerifier extends LeafVerifier {
+
+ StringVerifier( String expected ) {
+ super( expected, JsonToken.STRING );
+ }
+
+ @Override
+ Object getActualValue( JsonReader reader ) throws IOException {
+ return reader.nextString();
+ }
+ }
+
+ static class EmptyVerifier extends LeafVerifier {
+
+ EmptyVerifier() {
+ super( null, null );
+ }
+
+ @Override
+ Object getActualValue( JsonReader reader ) throws IOException {
+ reader.beginArray();
+ reader.nextNull();
+ reader.endArray();
+ return null;
+ }
+
+ }
+
+ static class ComplexAnyXmlVerifier extends LeafVerifier {
+
+ ComplexAnyXmlVerifier() {
+ super( null, JsonToken.BEGIN_OBJECT );
+ }
+
+ @Override
+ void verify( JsonReader reader, String keyName ) throws IOException {
+
+ reader.beginObject();
+ String innerKey = reader.nextName();
+ assertEquals( "Json reader child key for " + keyName, "data", innerKey );
+ assertEquals( "Json token type for key " + innerKey, JsonToken.BEGIN_OBJECT, reader.peek() );
+
+ reader.beginObject();
+ verifyLeaf( reader, innerKey, "leaf1", "leaf1-value" );
+ verifyLeaf( reader, innerKey, "leaf2", "leaf2-value" );
+
+ String nextName = reader.nextName();
+ assertEquals( "Json reader child key for " + innerKey, "leaf-list", nextName );
+ reader.beginArray();
+ assertEquals( "Json value for key " + nextName, "leaf-list-value1", reader.nextString() );
+ assertEquals( "Json value for key " + nextName, "leaf-list-value2", reader.nextString() );
+ reader.endArray();
+
+ nextName = reader.nextName();
+ assertEquals( "Json reader child key for " + innerKey, "list", nextName );
+ reader.beginArray();
+ verifyNestedLists( reader, 1 );
+ verifyNestedLists( reader, 3 );
+ reader.endArray();
+
+ reader.endObject();
+ reader.endObject();
+ }
+
+ void verifyNestedLists( JsonReader reader, int leafNum ) throws IOException {
+ reader.beginObject();
+
+ String nextName = reader.nextName();
+ assertEquals( "Json reader next name", "nested-list", nextName );
+
+ reader.beginArray();
+
+ reader.beginObject();
+ verifyLeaf( reader, "nested-list", "nested-leaf", "nested-value" + leafNum++ );
+ reader.endObject();
+
+ reader.beginObject();
+ verifyLeaf( reader, "nested-list", "nested-leaf", "nested-value" + leafNum );
+ reader.endObject();
+
+ reader.endArray();
+ reader.endObject();
+ }
+
+ void verifyLeaf( JsonReader reader, String parent, String name, String value ) throws IOException {
+ String nextName = reader.nextName();
+ assertEquals( "Json reader child key for " + parent, name, nextName );
+ assertEquals( "Json token type for key " + parent, JsonToken.STRING, reader.peek() );
+ assertEquals( "Json value for key " + nextName, value, reader.nextString() );
+ }
+
+ @Override
+ Object getActualValue( JsonReader reader ) throws IOException {
+ return null;
+ }
+ }
+