diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 6ca78fb3..b0d3a18a 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -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; diff --git a/Src/Newtonsoft.Json/JsonSerializerSettings.cs b/Src/Newtonsoft.Json/JsonSerializerSettings.cs index fc5205dd..500e1c66 100644 --- a/Src/Newtonsoft.Json/JsonSerializerSettings.cs +++ b/Src/Newtonsoft.Json/JsonSerializerSettings.cs @@ -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(); } + + /// + /// Initializes a new instance of the class + /// using values copied from the passed in . + /// + 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; + } } } \ No newline at end of file