protected void encodeParseObject(ParseObject object, Parcel dest) { dest.writeString(TYPE_OBJECT); object.writeToParcel(dest, this); }
@Override public void writeToParcel(Parcel dest, int flags) { writeToParcel(dest, new ParseObjectParcelEncoder(this)); }
@Test public void testParcelWhileDeletingWithLDSEnabled() throws Exception { mockCurrentUserController(); TaskCompletionSource<Void> tcs = mockObjectControllerForDelete(); ParseObject object = new ParseObject("TestObject"); object.setObjectId("id"); OfflineStore lds = mock(OfflineStore.class); when(lds.getObject("TestObject", "id")).thenReturn(object); Parse.setLocalDatastore(lds); Task<Void> deleteTask = object.deleteInBackground(); assertTrue(object.isDeleting); Parcel parcel = Parcel.obtain(); object.writeToParcel(parcel, 0); parcel.setDataPosition(0); ParseObject other = ParseObject.CREATOR.createFromParcel(parcel); assertSame(object, other); assertTrue(other.isDeleting); // Still deleting tcs.setResult(null); deleteTask.waitForCompletion(); // complete deletion on original object. assertFalse(other.isDeleting); assertTrue(other.isDeleted); Parse.setLocalDatastore(null); }
@Test public void testParcelWhileSavingWithLDSEnabled() throws Exception { mockCurrentUserController(); TaskCompletionSource<ParseObject.State> tcs = mockObjectControllerForSave(); ParseObject object = new ParseObject("TestObject"); object.setObjectId("id"); OfflineStore lds = mock(OfflineStore.class); when(lds.getObject("TestObject", "id")).thenReturn(object); Parse.setLocalDatastore(lds); object.put("key", "value"); object.increment("number", 3); Task<Void> saveTask = object.saveInBackground(); assertTrue(object.hasOutstandingOperations()); // Saving assertFalse(object.isDirty()); // Not dirty because it's saving Parcel parcel = Parcel.obtain(); object.writeToParcel(parcel, 0); parcel.setDataPosition(0); ParseObject other = ParseObject.CREATOR.createFromParcel(parcel); assertSame(object, other); assertTrue(other.hasOutstandingOperations()); // Still saving assertFalse(other.isDirty()); // Still not dirty assertEquals(other.getNumber("number"), 3); tcs.setResult(null); saveTask.waitForCompletion(); Parse.setLocalDatastore(null); }
object.writeToParcel(parcel, 0); parcel.setDataPosition(0); ParseObject other = ParseObject.CREATOR.createFromParcel(parcel);
@Test public void testParcelWhileDeleting() throws Exception { mockCurrentUserController(); TaskCompletionSource<Void> tcs = mockObjectControllerForDelete(); ParseObject object = new ParseObject("TestObject"); object.setObjectId("id"); Task<Void> deleteTask = object.deleteInBackground(); // ensure Log.w is called.. assertTrue(object.isDeleting); Parcel parcel = Parcel.obtain(); object.writeToParcel(parcel, 0); parcel.setDataPosition(0); ParseObject other = ParseObject.CREATOR.createFromParcel(parcel); // By design, when LDS is off, we assume that old operations failed even if // they are still running on the old instance. assertFalse(other.isDeleting); assertTrue(object.isDeleting); tcs.setResult(null); deleteTask.waitForCompletion(); assertFalse(object.isDeleting); assertTrue(object.isDeleted); }
@Test public void testParcelWithCircularReference() { ParseObject parent = new ParseObject("Parent"); ParseObject child = new ParseObject("Child"); parent.setObjectId("parentId"); parent.put("self", parent); child.setObjectId("childId"); child.put("self", child); child.put("parent", parent); parent.put("child", child); Parcel parcel = Parcel.obtain(); parent.writeToParcel(parcel, 0); parcel.setDataPosition(0); parent = ParseObject.CREATOR.createFromParcel(parcel); assertEquals(parent.getObjectId(), "parentId"); assertEquals(parent.getParseObject("self").getObjectId(), "parentId"); child = parent.getParseObject("child"); assertEquals(child.getObjectId(), "childId"); assertEquals(child.getParseObject("self").getObjectId(), "childId"); assertEquals(child.getParseObject("parent").getObjectId(), "parentId"); }
object.writeToParcel(parcel, 0); parcel.setDataPosition(0);
@Test public void testParcelWithCircularReferenceFromServer() { ParseObject parent = new ParseObject("Parent"); ParseObject child = new ParseObject("Child"); parent.setState(new ParseObject.State.Builder("Parent") .objectId("parentId") .put("self", parent) .put("child", child).build()); parent.setObjectId("parentId"); child.setState(new ParseObject.State.Builder("Child") .objectId("childId") .put("self", child) .put("parent", parent).build()); Parcel parcel = Parcel.obtain(); parent.writeToParcel(parcel, 0); parcel.setDataPosition(0); parent = ParseObject.CREATOR.createFromParcel(parcel); assertEquals(parent.getObjectId(), "parentId"); assertEquals(parent.getParseObject("self").getObjectId(), "parentId"); child = parent.getParseObject("child"); assertEquals(child.getObjectId(), "childId"); assertEquals(child.getParseObject("self").getObjectId(), "childId"); assertEquals(child.getParseObject("parent").getObjectId(), "parentId"); }