Skip to content

Commit e706c07

Browse files
natario1rogerhu
authored andcommitted
Fix encoding nested objects (#645)
* Fix encoding nested objects * Adds stronger test for circular references
1 parent e82808e commit e706c07

File tree

2 files changed

+46
-9
lines changed

2 files changed

+46
-9
lines changed

Parse/src/main/java/com/parse/ParseObjectParcelEncoder.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ protected void encodeParseObject(ParseObject object, Parcel dest) {
2727
if (ids.contains(id)) {
2828
encodePointer(object.getClassName(), id, dest);
2929
} else {
30+
ids.add(id);
3031
super.encodeParseObject(object, dest);
3132
}
3233
}

Parse/src/test/java/com/parse/ParseObjectTest.java

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.Map;
3333
import java.util.Set;
3434

35+
import bolts.Capture;
3536
import bolts.Task;
3637
import bolts.TaskCompletionSource;
3738

@@ -564,17 +565,52 @@ public void testParcelable() throws Exception {
564565
}
565566

566567
@Test
567-
public void testRecursiveParcel() throws Exception {
568-
ParseObject object = new ParseObject("Test");
569-
object.setObjectId("id");
570-
object.put("self", object);
568+
public void testParcelWithCircularReference() throws Exception {
569+
ParseObject parent = new ParseObject("Parent");
570+
ParseObject child = new ParseObject("Child");
571+
parent.setObjectId("parentId");
572+
parent.put("self", parent);
573+
child.setObjectId("childId");
574+
child.put("self", child);
575+
child.put("parent", parent);
576+
parent.put("child", child);
577+
578+
Parcel parcel = Parcel.obtain();
579+
parent.writeToParcel(parcel, 0);
580+
parcel.setDataPosition(0);
581+
parent = ParseObject.CREATOR.createFromParcel(parcel);
582+
assertEquals(parent.getObjectId(), "parentId");
583+
assertEquals(parent.getParseObject("self").getObjectId(), "parentId");
584+
child = parent.getParseObject("child");
585+
assertEquals(child.getObjectId(), "childId");
586+
assertEquals(child.getParseObject("self").getObjectId(), "childId");
587+
assertEquals(child.getParseObject("parent").getObjectId(), "parentId");
588+
}
589+
590+
@Test
591+
public void testParcelWithCircularReferenceFromServer() throws Exception {
592+
ParseObject parent = new ParseObject("Parent");
593+
ParseObject child = new ParseObject("Child");
594+
parent.setState(new ParseObject.State.Builder("Parent")
595+
.objectId("parentId")
596+
.put("self", parent)
597+
.put("child", child).build());
598+
parent.setObjectId("parentId");
599+
child.setState(new ParseObject.State.Builder("Child")
600+
.objectId("childId")
601+
.put("self", child)
602+
.put("parent", parent).build());
603+
571604
Parcel parcel = Parcel.obtain();
572-
object.writeToParcel(parcel, new ParseObjectParcelEncoder(object));
605+
parent.writeToParcel(parcel, 0);
573606
parcel.setDataPosition(0);
574-
ParseObject newObject = ParseObject.createFromParcel(parcel, new ParseObjectParcelDecoder());
575-
assertEquals(newObject.getObjectId(), "id");
576-
assertEquals(newObject.getParseObject("self").getObjectId(), "id");
577-
assertEquals(newObject.getParseObject("self").getParseObject("self").getObjectId(), "id");
607+
parent = ParseObject.CREATOR.createFromParcel(parcel);
608+
assertEquals(parent.getObjectId(), "parentId");
609+
assertEquals(parent.getParseObject("self").getObjectId(), "parentId");
610+
child = parent.getParseObject("child");
611+
assertEquals(child.getObjectId(), "childId");
612+
assertEquals(child.getParseObject("self").getObjectId(), "childId");
613+
assertEquals(child.getParseObject("parent").getObjectId(), "parentId");
578614
}
579615

580616
@Test

0 commit comments

Comments
 (0)