// 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.Dynamic; using Newtonsoft.Json.Serialization; using Xunit; namespace Microsoft.AspNetCore.JsonPatch { public class CustomNamingStrategyTests { [Fact] public void AddProperty_ToDynamicTestObject_WithCustomNamingStrategy() { // Arrange var contractResolver = new DefaultContractResolver { NamingStrategy = new TestNamingStrategy() }; dynamic targetObject = new DynamicTestObject(); targetObject.Test = 1; var patchDocument = new JsonPatchDocument(); patchDocument.Add("NewInt", 1); patchDocument.ContractResolver = contractResolver; // Act patchDocument.ApplyTo(targetObject); // Assert Assert.Equal(1, targetObject.customNewInt); Assert.Equal(1, targetObject.Test); } [Fact] public void CopyPropertyValue_ToDynamicTestObject_WithCustomNamingStrategy() { // Arrange var contractResolver = new DefaultContractResolver { NamingStrategy = new TestNamingStrategy() }; dynamic targetObject = new DynamicTestObject(); targetObject.customStringProperty = "A"; targetObject.customAnotherStringProperty = "B"; var patchDocument = new JsonPatchDocument(); patchDocument.Copy("StringProperty", "AnotherStringProperty"); patchDocument.ContractResolver = contractResolver; // Act patchDocument.ApplyTo(targetObject); // Assert Assert.Equal("A", targetObject.customAnotherStringProperty); } [Fact] public void MovePropertyValue_ForExpandoObject_WithCustomNamingStrategy() { // Arrange var contractResolver = new DefaultContractResolver { NamingStrategy = new TestNamingStrategy() }; dynamic targetObject = new ExpandoObject(); targetObject.customStringProperty = "A"; targetObject.customAnotherStringProperty = "B"; var patchDocument = new JsonPatchDocument(); patchDocument.Move("StringProperty", "AnotherStringProperty"); patchDocument.ContractResolver = contractResolver; // Act patchDocument.ApplyTo(targetObject); var cont = targetObject as IDictionary; cont.TryGetValue("customStringProperty", out var valueFromDictionary); // Assert Assert.Equal("A", targetObject.customAnotherStringProperty); Assert.Null(valueFromDictionary); } [Fact] public void RemoveProperty_FromDictionaryObject_WithCustomNamingStrategy() { // Arrange var contractResolver = new DefaultContractResolver { NamingStrategy = new TestNamingStrategy() }; var targetObject = new Dictionary() { { "customTest", 1}, }; var patchDocument = new JsonPatchDocument(); patchDocument.Remove("Test"); patchDocument.ContractResolver = contractResolver; // Act patchDocument.ApplyTo(targetObject); var cont = targetObject as IDictionary; cont.TryGetValue("customTest", out var valueFromDictionary); // Assert Assert.Equal(0, valueFromDictionary); } [Fact] public void ReplacePropertyValue_ForExpandoObject_WithCustomNamingStrategy() { // Arrange var contractResolver = new DefaultContractResolver { NamingStrategy = new TestNamingStrategy() }; dynamic targetObject = new ExpandoObject(); targetObject.customTest = 1; var patchDocument = new JsonPatchDocument(); patchDocument.Replace("Test", 2); patchDocument.ContractResolver = contractResolver; // Act patchDocument.ApplyTo(targetObject); // Assert Assert.Equal(2, targetObject.customTest); } private class TestNamingStrategy : NamingStrategy { public new bool ProcessDictionaryKeys => true; public override string GetDictionaryKey(string key) { return "custom" + key; } protected override string ResolvePropertyName(string name) { return name; } } } }