From 963e5939e97bd492ca8be35344ab24d29400d705 Mon Sep 17 00:00:00 2001 From: Jake Wharton Date: Mon, 22 Dec 2014 12:34:27 -0800 Subject: [PATCH] Fix bugs in getPath() with arrays of objects and arrays of arrays. Original commit: Gson r1303 by Jesse Wilson. --- .../java/com/squareup/moshi/JsonReader.java | 2 + .../squareup/moshi/JsonReaderPathTest.java | 48 +++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/moshi/src/main/java/com/squareup/moshi/JsonReader.java b/moshi/src/main/java/com/squareup/moshi/JsonReader.java index b42f36f..39d7e1e 100644 --- a/moshi/src/main/java/com/squareup/moshi/JsonReader.java +++ b/moshi/src/main/java/com/squareup/moshi/JsonReader.java @@ -350,6 +350,7 @@ public class JsonReader implements Closeable { } if (p == PEEKED_END_ARRAY) { stackSize--; + pathIndices[stackSize - 1]++; peeked = PEEKED_NONE; } else { throw new IllegalStateException("Expected END_ARRAY but was " + peek() @@ -387,6 +388,7 @@ public class JsonReader implements Closeable { if (p == PEEKED_END_OBJECT) { stackSize--; pathNames[stackSize] = null; // Free the last path name so that it can be garbage collected! + pathIndices[stackSize - 1]++; peeked = PEEKED_NONE; } else { throw new IllegalStateException("Expected END_OBJECT but was " + peek() diff --git a/moshi/src/test/java/com/squareup/moshi/JsonReaderPathTest.java b/moshi/src/test/java/com/squareup/moshi/JsonReaderPathTest.java index fc6b2bf..899df75 100644 --- a/moshi/src/test/java/com/squareup/moshi/JsonReaderPathTest.java +++ b/moshi/src/test/java/com/squareup/moshi/JsonReaderPathTest.java @@ -47,19 +47,59 @@ public class JsonReaderPathTest { reader.nextString(); assertEquals("$.a[5].c", reader.getPath()); reader.endObject(); - assertEquals("$.a[5]", reader.getPath()); + assertEquals("$.a[6]", reader.getPath()); reader.beginArray(); - assertEquals("$.a[5][0]", reader.getPath()); + assertEquals("$.a[6][0]", reader.getPath()); reader.nextInt(); - assertEquals("$.a[5][1]", reader.getPath()); + assertEquals("$.a[6][1]", reader.getPath()); reader.endArray(); - assertEquals("$.a[5]", reader.getPath()); + assertEquals("$.a[7]", reader.getPath()); reader.endArray(); assertEquals("$.a", reader.getPath()); reader.endObject(); assertEquals("$", reader.getPath()); } + @Test public void arrayOfObjects() throws IOException { + JsonReader reader = new JsonReader("[{},{},{}]"); + reader.beginArray(); + assertEquals("$[0]", reader.getPath()); + reader.beginObject(); + assertEquals("$[0].", reader.getPath()); + reader.endObject(); + assertEquals("$[1]", reader.getPath()); + reader.beginObject(); + assertEquals("$[1].", reader.getPath()); + reader.endObject(); + assertEquals("$[2]", reader.getPath()); + reader.beginObject(); + assertEquals("$[2].", reader.getPath()); + reader.endObject(); + assertEquals("$[3]", reader.getPath()); + reader.endArray(); + assertEquals("$", reader.getPath()); + } + + @Test public void arrayOfArrays() throws IOException { + JsonReader reader = new JsonReader("[[],[],[]]"); + reader.beginArray(); + assertEquals("$[0]", reader.getPath()); + reader.beginArray(); + assertEquals("$[0][0]", reader.getPath()); + reader.endArray(); + assertEquals("$[1]", reader.getPath()); + reader.beginArray(); + assertEquals("$[1][0]", reader.getPath()); + reader.endArray(); + assertEquals("$[2]", reader.getPath()); + reader.beginArray(); + assertEquals("$[2][0]", reader.getPath()); + reader.endArray(); + assertEquals("$[3]", reader.getPath()); + reader.endArray(); + assertEquals("$", reader.getPath()); + } + @Test public void objectPath() throws IOException { JsonReader reader = new JsonReader("{\"a\":1,\"b\":2}"); assertEquals("$", reader.getPath());