// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Collections.ObjectModel; using Microsoft.AspNetCore.JsonPatch.Exceptions; using Newtonsoft.Json; using Xunit; namespace Microsoft.AspNetCore.JsonPatch { public class NestedObjectTests { [Fact] public void ReplacePropertyInNestedObject() { // Arrange var doc = new SimpleDTOWithNestedDTO() { IntegerValue = 1 }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.NestedDTO.StringProperty, "B"); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("B", doc.NestedDTO.StringProperty); } [Fact] public void ReplacePropertyInNestedObjectWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { IntegerValue = 1 }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.NestedDTO.StringProperty, "B"); // serialize & deserialize var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal("B", doc.NestedDTO.StringProperty); } [Fact] public void ReplaceNestedObject() { // Arrange var doc = new SimpleDTOWithNestedDTO() { IntegerValue = 1 }; var newNested = new NestedDTO() { StringProperty = "B" }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.NestedDTO, newNested); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("B", doc.NestedDTO.StringProperty); } [Fact] public void ReplaceNestedObjectWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { IntegerValue = 1 }; var newNested = new NestedDTO() { StringProperty = "B" }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.NestedDTO, newNested); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal("B", doc.NestedDTO.StringProperty); } [Fact] public void AddResultsInReplace() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.StringProperty, "B"); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("B", doc.SimpleDTO.StringProperty); } [Fact] public void AddResultsInReplaceWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.StringProperty, "B"); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal("B", doc.SimpleDTO.StringProperty); } [Fact] public void AddToList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4, 0); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 1, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void AddToListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4, 0); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 1, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void AddToIntegerIList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerIList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => (List)o.SimpleDTO.IntegerIList, 4, 0); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 1, 2, 3 }, doc.SimpleDTO.IntegerIList); } [Fact] public void AddToIntegerIListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerIList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => (List)o.SimpleDTO.IntegerIList, 4, 0); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 1, 2, 3 }, doc.SimpleDTO.IntegerIList); } [Fact] public void AddToNestedIntegerIList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTOIList = new List { new SimpleDTO { IntegerIList = new List() { 1, 2, 3 } } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => (List)o.SimpleDTOIList[0].IntegerIList, 4, 0); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 1, 2, 3 }, doc.SimpleDTOIList[0].IntegerIList); } [Fact] public void AddToNestedIntegerIListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTOIList = new List { new SimpleDTO { IntegerIList = new List() { 1, 2, 3 } } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => (List)o.SimpleDTOIList[0].IntegerIList, 4, 0); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 1, 2, 3 }, doc.SimpleDTOIList[0].IntegerIList); } [Fact] public void AddToComplextTypeListSpecifyIndex() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTOList = new List() { new SimpleDTO { StringProperty = "String1" }, new SimpleDTO { StringProperty = "String2" } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTOList[0].StringProperty, "ChangedString1"); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("ChangedString1", doc.SimpleDTOList[0].StringProperty); } [Fact] public void AddToComplextTypeListSpecifyIndexWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTOList = new List() { new SimpleDTO { StringProperty = "String1" }, new SimpleDTO { StringProperty = "String2" } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTOList[0].StringProperty, "ChangedString1"); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal("ChangedString1", doc.SimpleDTOList[0].StringProperty); } [Fact] public void AddToListInvalidPositionTooLarge() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4, 4); // Act & Assert var exception = Assert.Throws(() => { patchDoc.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "4"), exception.Message); } [Fact] public void AddToListInvalidPositionTooLargeWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4, 4); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act & Assert var exception = Assert.Throws(() => { deserialized.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "4"), exception.Message); } [Fact] public void AddToListInvalidPositionTooLarge_LogsError() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4, 4); var logger = new TestErrorLogger(); patchDoc.ApplyTo(doc, logger.LogErrorMessage); //Assert Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "4"), logger.ErrorMessage); } [Fact] public void AddToListInvalidPositionTooSmall() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4, -1); // Act & Assert var exception = Assert.Throws(() => { patchDoc.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), exception.Message); } [Fact] public void AddToListInvalidPositionTooSmallWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4, -1); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act & Assert var exception = Assert.Throws(() => { deserialized.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), exception.Message); } [Fact] public void AddToListInvalidPositionTooSmall_LogsError() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4, -1); var logger = new TestErrorLogger(); patchDoc.ApplyTo(doc, logger.LogErrorMessage); //Assert Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), logger.ErrorMessage); } [Fact] public void AddToListAppend() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2, 3, 4 }, doc.SimpleDTO.IntegerList); } [Fact] public void AddToListAppendWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Add(o => o.SimpleDTO.IntegerList, 4); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2, 3, 4 }, doc.SimpleDTO.IntegerList); } [Fact] public void Remove() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.StringProperty); // Act patchDoc.ApplyTo(doc); // Assert Assert.Null(doc.SimpleDTO.StringProperty); } [Fact] public void RemoveWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.StringProperty); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Null(doc.SimpleDTO.StringProperty); } [Fact] public void RemoveFromList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList, 2); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2 }, doc.SimpleDTO.IntegerList); } [Fact] public void RemoveFromListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList, 2); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2 }, doc.SimpleDTO.IntegerList); } [Fact] public void RemoveFromListInvalidPositionTooLarge() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList, 3); // Act & Assert var exception = Assert.Throws(() => { patchDoc.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "3"), exception.Message); } [Fact] public void RemoveFromListInvalidPositionTooLargeWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList, 3); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act & Assert var exception = Assert.Throws(() => { deserialized.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "3"), exception.Message); } [Fact] public void RemoveFromListInvalidPositionTooLarge_LogsError() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList, 3); var logger = new TestErrorLogger(); patchDoc.ApplyTo(doc, logger.LogErrorMessage); // Assert Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "3"), logger.ErrorMessage); } [Fact] public void RemoveFromListInvalidPositionTooSmall() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList, -1); // Act & Assert var exception = Assert.Throws(() => { patchDoc.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), exception.Message); } [Fact] public void RemoveFromListInvalidPositionTooSmallWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList, -1); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act & Assert var exception = Assert.Throws(() => { deserialized.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), exception.Message); } [Fact] public void RemoveFromListInvalidPositionTooSmall_LogsError() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList, -1); var logger = new TestErrorLogger(); patchDoc.ApplyTo(doc, logger.LogErrorMessage); // Assert Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), logger.ErrorMessage); } [Fact] public void RemoveFromEndOfList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2 }, doc.SimpleDTO.IntegerList); } [Fact] public void RemoveFromEndOfListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Remove(o => o.SimpleDTO.IntegerList); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2 }, doc.SimpleDTO.IntegerList); } [Fact] public void Replace() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A", DecimalValue = 10 } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.StringProperty, "B"); patchDoc.Replace(o => o.SimpleDTO.DecimalValue, 12); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("B", doc.SimpleDTO.StringProperty); Assert.Equal(12, doc.SimpleDTO.DecimalValue); } [Fact] public void Replace_DTOWithNullCheck() { // Arrange var doc = new SimpleDTOWithNestedDTOWithNullCheck() { SimpleDTOWithNullCheck = new SimpleDTOWithNullCheck() { StringProperty = "A" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTOWithNullCheck.StringProperty, "B"); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("B", doc.SimpleDTOWithNullCheck.StringProperty); } [Fact] public void ReplaceWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A", DecimalValue = 10 } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.StringProperty, "B"); patchDoc.Replace(o => o.SimpleDTO.DecimalValue, 12); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal("B", doc.SimpleDTO.StringProperty); Assert.Equal(12, doc.SimpleDTO.DecimalValue); } [Fact] public void SerializationTests() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A", DecimalValue = 10, DoubleValue = 10, FloatValue = 10, IntegerValue = 10 } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.StringProperty, "B"); patchDoc.Replace(o => o.SimpleDTO.DecimalValue, 12); patchDoc.Replace(o => o.SimpleDTO.DoubleValue, 12); patchDoc.Replace(o => o.SimpleDTO.FloatValue, 12); patchDoc.Replace(o => o.SimpleDTO.IntegerValue, 12); // serialize & deserialize var serialized = JsonConvert.SerializeObject(patchDoc); var deserizalized = JsonConvert.DeserializeObject>(serialized); // Act deserizalized.ApplyTo(doc); // Assert Assert.Equal("B", doc.SimpleDTO.StringProperty); Assert.Equal(12, doc.SimpleDTO.DecimalValue); Assert.Equal(12, doc.SimpleDTO.DoubleValue); Assert.Equal(12, doc.SimpleDTO.FloatValue); Assert.Equal(12, doc.SimpleDTO.IntegerValue); } [Fact] public void ReplaceInList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5, 0); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 5, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceInListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5, 0); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 5, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceFullList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace>(o => o.SimpleDTO.IntegerList, new List() { 4, 5, 6 }); // Act patchDoc.ApplyTo(doc); // Arrange Assert.Equal(new List() { 4, 5, 6 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceFullListWithSerialiation() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace>(o => o.SimpleDTO.IntegerList, new List() { 4, 5, 6 }); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 5, 6 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceFullListFromEnumerable() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace>(o => o.SimpleDTO.IntegerList, new List() { 4, 5, 6 }); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 5, 6 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceFullListFromEnumerableWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace>(o => o.SimpleDTO.IntegerList, new List() { 4, 5, 6 }); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 5, 6 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceFullListWithCollection() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace>(o => o.SimpleDTO.IntegerList, new Collection() { 4, 5, 6 }); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 5, 6 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceFullListWithCollectionWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace>(o => o.SimpleDTO.IntegerList, new Collection() { 4, 5, 6 }); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 4, 5, 6 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceAtEndOfList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2, 5 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceAtEndOfListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2, 5 }, doc.SimpleDTO.IntegerList); } [Fact] public void ReplaceInListInvalidInvalidPositionTooLarge() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5, 3); // Act & Assert var exception = Assert.Throws(() => { patchDoc.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "3"), exception.Message); } [Fact] public void ReplaceInListInvalidInvalidPositionTooLargeWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5, 3); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act & Assert var exception = Assert.Throws(() => { deserialized.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "3"), exception.Message); } [Fact] public void ReplaceInListInvalid_PositionTooLarge_LogsError() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5, 3); var logger = new TestErrorLogger(); patchDoc.ApplyTo(doc, logger.LogErrorMessage); // Assert Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "3"), logger.ErrorMessage); } [Fact] public void ReplaceInListInvalidPositionTooSmall() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5, -1); // Act & Assert var exception = Assert.Throws(() => { patchDoc.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), exception.Message); } [Fact] public void ReplaceInListInvalidPositionTooSmallWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5, -1); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act & Assert var exception = Assert.Throws(() => { deserialized.ApplyTo(doc); }); Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), exception.Message); } [Fact] public void ReplaceInListInvalidPositionTooSmall_LogsError() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Replace(o => o.SimpleDTO.IntegerList, 5, -1); var logger = new TestErrorLogger(); patchDoc.ApplyTo(doc, logger.LogErrorMessage); // Assert Assert.Equal( string.Format("The index value provided by path segment '{0}' is out of bounds of the array size.", "-1"), logger.ErrorMessage); } [Fact] public void Copy() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A", AnotherStringProperty = "B" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.StringProperty, o => o.SimpleDTO.AnotherStringProperty); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("A", doc.SimpleDTO.AnotherStringProperty); } [Fact] public void CopyWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A", AnotherStringProperty = "B" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.StringProperty, o => o.SimpleDTO.AnotherStringProperty); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal("A", doc.SimpleDTO.AnotherStringProperty); } [Fact] public void CopyInList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerList, 1); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 1, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void CopyInListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerList, 1); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 1, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void CopyFromListToEndOfList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerList); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2, 3, 1 }, doc.SimpleDTO.IntegerList); } [Fact] public void CopyFromListToEndOfListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerList); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2, 3, 1 }, doc.SimpleDTO.IntegerList); } [Fact] public void CopyFromListToNonList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerValue); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(1, doc.SimpleDTO.IntegerValue); } [Fact] public void CopyFromListToNonListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerValue); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(1, doc.SimpleDTO.IntegerValue); } [Fact] public void CopyFromNonListToList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerValue = 5, IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerValue, o => o.SimpleDTO.IntegerList, 0); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 5, 1, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void CopyFromNonListToListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerValue = 5, IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerValue, o => o.SimpleDTO.IntegerList, 0); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 5, 1, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void CopyToEndOfList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerValue = 5, IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerValue, o => o.SimpleDTO.IntegerList); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2, 3, 5 }, doc.SimpleDTO.IntegerList); } [Fact] public void CopyToEndOfListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerValue = 5, IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.SimpleDTO.IntegerValue, o => o.SimpleDTO.IntegerList); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 1, 2, 3, 5 }, doc.SimpleDTO.IntegerList); } [Fact] public void Copy_DeepClonesObject() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A", AnotherStringProperty = "B" }, InheritedDTO = new InheritedDTO() { StringProperty = "C", AnotherStringProperty = "D" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.InheritedDTO, o => o.SimpleDTO); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("C", doc.SimpleDTO.StringProperty); Assert.Equal("D", doc.SimpleDTO.AnotherStringProperty); Assert.Equal("C", doc.InheritedDTO.StringProperty); Assert.Equal("D", doc.InheritedDTO.AnotherStringProperty); Assert.NotSame(doc.SimpleDTO.StringProperty, doc.InheritedDTO.StringProperty); } [Fact] public void Copy_KeepsObjectType() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO(), InheritedDTO = new InheritedDTO() }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.InheritedDTO, o => o.SimpleDTO); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(typeof(InheritedDTO), doc.SimpleDTO.GetType()); } [Fact] public void Copy_BreaksObjectReference() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO(), InheritedDTO = new InheritedDTO() }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Copy(o => o.InheritedDTO, o => o.SimpleDTO); // Act patchDoc.ApplyTo(doc); // Assert Assert.NotSame(doc.SimpleDTO, doc.InheritedDTO); } [Fact] public void Move() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A", AnotherStringProperty = "B" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.StringProperty, o => o.SimpleDTO.AnotherStringProperty); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("A", doc.SimpleDTO.AnotherStringProperty); Assert.Null(doc.SimpleDTO.StringProperty); } [Fact] public void MoveWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { StringProperty = "A", AnotherStringProperty = "B" } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.StringProperty, o => o.SimpleDTO.AnotherStringProperty); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal("A", doc.SimpleDTO.AnotherStringProperty); Assert.Null(doc.SimpleDTO.StringProperty); } [Fact] public void Move_KeepsObjectReference() { // Arrange var sDto = new SimpleDTO() { StringProperty = "A", AnotherStringProperty = "B" }; var iDto = new InheritedDTO() { StringProperty = "C", AnotherStringProperty = "D" }; var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = sDto, InheritedDTO = iDto }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.InheritedDTO, o => o.SimpleDTO); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal("C", doc.SimpleDTO.StringProperty); Assert.Equal("D", doc.SimpleDTO.AnotherStringProperty); Assert.Same(iDto, doc.SimpleDTO); Assert.Null(doc.InheritedDTO); } [Fact] public void Move_KeepsObjectReferenceWithSerialization() { // Arrange var sDto = new SimpleDTO() { StringProperty = "A", AnotherStringProperty = "B" }; var iDto = new InheritedDTO() { StringProperty = "C", AnotherStringProperty = "D" }; var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = sDto, InheritedDTO = iDto }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.InheritedDTO, o => o.SimpleDTO); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal("C", doc.SimpleDTO.StringProperty); Assert.Equal("D", doc.SimpleDTO.AnotherStringProperty); Assert.Same(iDto, doc.SimpleDTO); Assert.Null(doc.InheritedDTO); } [Fact] public void MoveInList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerList, 1); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 2, 1, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void MoveInListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerList, 1); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 2, 1, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void Move_KeepsObjectReferenceInList() { // Arrange var sDto1 = new SimpleDTO() { IntegerValue = 1 }; var sDto2 = new SimpleDTO() { IntegerValue = 2 }; var sDto3 = new SimpleDTO() { IntegerValue = 3 }; var doc = new SimpleDTOWithNestedDTO() { SimpleDTOList = new List() { sDto1, sDto2, sDto3 } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTOList, 0, o => o.SimpleDTOList, 1); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { sDto2, sDto1, sDto3 }, doc.SimpleDTOList); Assert.Equal(2, doc.SimpleDTOList[0].IntegerValue); Assert.Equal(1, doc.SimpleDTOList[1].IntegerValue); Assert.Same(sDto2, doc.SimpleDTOList[0]); Assert.Same(sDto1, doc.SimpleDTOList[1]); } [Fact] public void Move_KeepsObjectReferenceInListWithSerialization() { // Arrange var sDto1 = new SimpleDTO() { IntegerValue = 1 }; var sDto2 = new SimpleDTO() { IntegerValue = 2 }; var sDto3 = new SimpleDTO() { IntegerValue = 3 }; var doc = new SimpleDTOWithNestedDTO() { SimpleDTOList = new List() { sDto1, sDto2, sDto3 } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTOList, 0, o => o.SimpleDTOList, 1); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { sDto2, sDto1, sDto3 }, doc.SimpleDTOList); Assert.Equal(2, doc.SimpleDTOList[0].IntegerValue); Assert.Equal(1, doc.SimpleDTOList[1].IntegerValue); Assert.Same(sDto2, doc.SimpleDTOList[0]); Assert.Same(sDto1, doc.SimpleDTOList[1]); } [Fact] public void MoveFromListToEndOfList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerList); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 2, 3, 1 }, doc.SimpleDTO.IntegerList); } [Fact] public void MoveFromListToEndOfListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerList); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 2, 3, 1 }, doc.SimpleDTO.IntegerList); } [Fact] public void MoveFomListToNonList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerValue); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 2, 3 }, doc.SimpleDTO.IntegerList); Assert.Equal(1, doc.SimpleDTO.IntegerValue); } [Fact] public void MoveFomListToNonListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerList, 0, o => o.SimpleDTO.IntegerValue); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 2, 3 }, doc.SimpleDTO.IntegerList); Assert.Equal(1, doc.SimpleDTO.IntegerValue); } [Fact] public void MoveFomListToNonListBetweenHierarchy() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerList, 0, o => o.IntegerValue); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(new List() { 2, 3 }, doc.SimpleDTO.IntegerList); Assert.Equal(1, doc.IntegerValue); } [Fact] public void MoveFomListToNonListBetweenHierarchyWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerList, 0, o => o.IntegerValue); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(new List() { 2, 3 }, doc.SimpleDTO.IntegerList); Assert.Equal(1, doc.IntegerValue); } [Fact] public void MoveFromNonListToList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerValue = 5, IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerValue, o => o.SimpleDTO.IntegerList, 0); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(0, doc.IntegerValue); Assert.Equal(new List() { 5, 1, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void MoveFromNonListToListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerValue = 5, IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerValue, o => o.SimpleDTO.IntegerList, 0); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(0, doc.IntegerValue); Assert.Equal(new List() { 5, 1, 2, 3 }, doc.SimpleDTO.IntegerList); } [Fact] public void MoveToEndOfList() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerValue = 5, IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerValue, o => o.SimpleDTO.IntegerList); // Act patchDoc.ApplyTo(doc); // Assert Assert.Equal(0, doc.IntegerValue); Assert.Equal(new List() { 1, 2, 3, 5 }, doc.SimpleDTO.IntegerList); } [Fact] public void MoveToEndOfListWithSerialization() { // Arrange var doc = new SimpleDTOWithNestedDTO() { SimpleDTO = new SimpleDTO() { IntegerValue = 5, IntegerList = new List() { 1, 2, 3 } } }; // create patch var patchDoc = new JsonPatchDocument(); patchDoc.Move(o => o.SimpleDTO.IntegerValue, o => o.SimpleDTO.IntegerList); var serialized = JsonConvert.SerializeObject(patchDoc); var deserialized = JsonConvert.DeserializeObject>(serialized); // Act deserialized.ApplyTo(doc); // Assert Assert.Equal(0, doc.IntegerValue); Assert.Equal(new List() { 1, 2, 3, 5 }, doc.SimpleDTO.IntegerList); } } }