Add copy constructor to JsonSerializerSettings (#2676)

Co-authored-by: Matthew Steeples <matthew@ledgerscope.com>
This commit is contained in:
James Newton-King
2022-05-16 09:34:38 +08:00
committed by GitHub
co-authored by Matthew Steeples
parent 7f78562d44
commit 71be691f92
2 changed files with 168 additions and 0 deletions
@@ -48,6 +48,7 @@ using System.Text.RegularExpressions;
using Xunit;
using Test = Xunit.FactAttribute;
using Assert = Newtonsoft.Json.Tests.XUnitAssert;
using TestCase = Xunit.InlineDataAttribute;
#else
using NUnit.Framework;
#endif
@@ -8076,6 +8077,128 @@ This is just junk, though.";
Assert.AreEqual(150, depth);
}
#if DNXCORE50
[Theory]
#endif
[TestCase(true)]
[TestCase(false)]
public void ShallowCopy_CopyAllProperties(bool specifyDateFormatString)
{
var propertyNames = typeof(JsonSerializerSettings).GetProperties().Select(property => property.Name).ToList();
var settings = new JsonSerializerSettings();
if (specifyDateFormatString)
{
settings.DateFormatString = "yyyy";
}
var clone = new JsonSerializerSettings(settings);
Assert.AreEqual(settings.DateFormatString, clone.DateFormatString);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DateFormatString)));
Assert.AreEqual(settings.DateFormatHandling, clone.DateFormatHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DateFormatHandling)));
Assert.AreEqual(settings.ReferenceLoopHandling, clone.ReferenceLoopHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ReferenceLoopHandling)));
Assert.AreEqual(settings.MissingMemberHandling, clone.MissingMemberHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.MissingMemberHandling)));
Assert.AreEqual(settings.ObjectCreationHandling, clone.ObjectCreationHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ObjectCreationHandling)));
Assert.AreEqual(settings.NullValueHandling, clone.NullValueHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.NullValueHandling)));
Assert.AreEqual(settings.DefaultValueHandling, clone.DefaultValueHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DefaultValueHandling)));
Assert.AreEqual(settings.Converters, clone.Converters);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Converters)));
Assert.AreEqual(settings.PreserveReferencesHandling, clone.PreserveReferencesHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.PreserveReferencesHandling)));
Assert.AreEqual(settings.TypeNameHandling, clone.TypeNameHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.TypeNameHandling)));
Assert.AreEqual(settings.MetadataPropertyHandling, clone.MetadataPropertyHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.MetadataPropertyHandling)));
#pragma warning disable CS0618 // Type or member is obsolete
Assert.AreEqual(settings.TypeNameAssemblyFormat, clone.TypeNameAssemblyFormat);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.TypeNameAssemblyFormat)));
#pragma warning restore CS0618 // Type or member is obsolete
Assert.AreEqual(settings.TypeNameAssemblyFormatHandling, clone.TypeNameAssemblyFormatHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.TypeNameAssemblyFormatHandling)));
Assert.AreEqual(settings.ConstructorHandling, clone.ConstructorHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ConstructorHandling)));
Assert.AreEqual(settings.ContractResolver, clone.ContractResolver);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ContractResolver)));
Assert.AreEqual(settings.EqualityComparer, clone.EqualityComparer);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.EqualityComparer)));
#pragma warning disable CS0618 // Type or member is obsolete
Assert.AreEqual(settings.ReferenceResolver, clone.ReferenceResolver);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ReferenceResolver)));
#pragma warning restore CS0618 // Type or member is obsolete
Assert.AreEqual(settings.ReferenceResolverProvider, clone.ReferenceResolverProvider);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.ReferenceResolverProvider)));
Assert.AreEqual(settings.TraceWriter, clone.TraceWriter);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.TraceWriter)));
#pragma warning disable CS0618 // Type or member is obsolete
Assert.AreEqual(settings.Binder, clone.Binder);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Binder)));
#pragma warning restore CS0618 // Type or member is obsolete
Assert.AreEqual(settings.SerializationBinder, clone.SerializationBinder);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.SerializationBinder)));
Assert.AreEqual(settings.Error, clone.Error);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Error)));
Assert.AreEqual(settings.Context, clone.Context);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Context)));
Assert.AreEqual(settings.MaxDepth, clone.MaxDepth);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.MaxDepth)));
Assert.AreEqual(settings.Formatting, clone.Formatting);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Formatting)));
Assert.AreEqual(settings.DateTimeZoneHandling, clone.DateTimeZoneHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DateTimeZoneHandling)));
Assert.AreEqual(settings.DateParseHandling, clone.DateParseHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.DateParseHandling)));
Assert.AreEqual(settings.FloatFormatHandling, clone.FloatFormatHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.FloatFormatHandling)));
Assert.AreEqual(settings.FloatParseHandling, clone.FloatParseHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.FloatParseHandling)));
Assert.AreEqual(settings.StringEscapeHandling, clone.StringEscapeHandling);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.StringEscapeHandling)));
Assert.AreEqual(settings.Culture, clone.Culture);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.Culture)));
Assert.AreEqual(settings.CheckAdditionalContent, clone.CheckAdditionalContent);
Assert.IsTrue(propertyNames.Remove(nameof(JsonSerializerSettings.CheckAdditionalContent)));
Assert.AreEqual(0, propertyNames.Count);
}
private static int GetDepth(JToken o)
{
int depth = 1;
@@ -31,6 +31,12 @@ using System.Runtime.Serialization.Formatters;
using Newtonsoft.Json.Serialization;
using System.Runtime.Serialization;
using System.Diagnostics;
using System.Runtime;
#if !HAVE_LINQ
using Newtonsoft.Json.Utilities.LinqBridge;
#else
using System.Linq;
#endif
namespace Newtonsoft.Json
{
@@ -452,5 +458,44 @@ namespace Newtonsoft.Json
{
Converters = new List<JsonConverter>();
}
/// <summary>
/// Initializes a new instance of the <see cref="JsonSerializerSettings"/> class
/// using values copied from the passed in <see cref="JsonSerializerSettings"/>.
/// </summary>
public JsonSerializerSettings(JsonSerializerSettings original)
{
_floatParseHandling = original._floatParseHandling;
_floatFormatHandling = original._floatFormatHandling;
_dateParseHandling = original._dateParseHandling;
_dateTimeZoneHandling = original._dateTimeZoneHandling;
_dateFormatHandling = original._dateFormatHandling;
_formatting = original._formatting;
_maxDepth = original._maxDepth;
_maxDepthSet = original._maxDepthSet;
_dateFormatString = original._dateFormatString;
_dateFormatStringSet = original._dateFormatStringSet;
_context = original._context;
Error = original.Error;
SerializationBinder = original.SerializationBinder;
TraceWriter = original.TraceWriter;
_culture = original._culture;
ReferenceResolverProvider = original.ReferenceResolverProvider;
EqualityComparer = original.EqualityComparer;
ContractResolver = original.ContractResolver;
_constructorHandling = original._constructorHandling;
_typeNameAssemblyFormatHandling = original._typeNameAssemblyFormatHandling;
_metadataPropertyHandling = original._metadataPropertyHandling;
_typeNameHandling = original._typeNameHandling;
_preserveReferencesHandling = original._preserveReferencesHandling;
Converters = original.Converters.ToList();
_defaultValueHandling = original._defaultValueHandling;
_nullValueHandling = original._nullValueHandling;
_objectCreationHandling = original._objectCreationHandling;
_missingMemberHandling = original._missingMemberHandling;
_referenceLoopHandling = original._referenceLoopHandling;
_checkAdditionalContent = original._checkAdditionalContent;
_stringEscapeHandling = original._stringEscapeHandling;
}
}
}