PageRenderTime 67ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 3ms

/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs

https://github.com/99strong99/Newtonsoft.Json
C# | 10919 lines | 9618 code | 1115 blank | 186 comment | 90 complexity | 81370c05b63ccbc8000265efea61c55d MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. #region License
  2. // Copyright (c) 2007 James Newton-King
  3. //
  4. // Permission is hereby granted, free of charge, to any person
  5. // obtaining a copy of this software and associated documentation
  6. // files (the "Software"), to deal in the Software without
  7. // restriction, including without limitation the rights to use,
  8. // copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the
  10. // Software is furnished to do so, subject to the following
  11. // conditions:
  12. //
  13. // The above copyright notice and this permission notice shall be
  14. // included in all copies or substantial portions of the Software.
  15. //
  16. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  17. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  18. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  19. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  20. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  21. // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  22. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  23. // OTHER DEALINGS IN THE SOFTWARE.
  24. #endregion
  25. using System;
  26. using System.ComponentModel;
  27. #if !(NET35 || NET20)
  28. using System.Collections.Concurrent;
  29. #endif
  30. using System.Collections.Generic;
  31. #if !(NET20 || NET35 || PORTABLE)
  32. using System.Numerics;
  33. #endif
  34. #if !NET20 && !NETFX_CORE
  35. using System.ComponentModel.DataAnnotations;
  36. using System.Configuration;
  37. using System.Runtime.CompilerServices;
  38. using System.Runtime.Serialization.Formatters;
  39. using System.Threading;
  40. using System.Web.Script.Serialization;
  41. #endif
  42. using System.Text;
  43. using System.Text.RegularExpressions;
  44. #if !NETFX_CORE
  45. using NUnit.Framework;
  46. #else
  47. using Microsoft.VisualStudio.TestPlatform.UnitTestFramework;
  48. using TestFixture = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestClassAttribute;
  49. using Test = Microsoft.VisualStudio.TestPlatform.UnitTestFramework.TestMethodAttribute;
  50. #endif
  51. using Newtonsoft.Json;
  52. using System.IO;
  53. using System.Collections;
  54. using System.Xml;
  55. using System.Xml.Serialization;
  56. using System.Collections.ObjectModel;
  57. using Newtonsoft.Json.Bson;
  58. using Newtonsoft.Json.Linq;
  59. using Newtonsoft.Json.Converters;
  60. #if !NET20
  61. using System.Runtime.Serialization.Json;
  62. #endif
  63. using Newtonsoft.Json.Serialization;
  64. using Newtonsoft.Json.Tests.Linq;
  65. using Newtonsoft.Json.Tests.TestObjects;
  66. using System.Runtime.Serialization;
  67. using System.Globalization;
  68. using Newtonsoft.Json.Utilities;
  69. using System.Reflection;
  70. #if !NET20
  71. using System.Xml.Linq;
  72. using System.Collections.Specialized;
  73. using System.Linq.Expressions;
  74. #endif
  75. #if !(NET35 || NET20)
  76. using System.Dynamic;
  77. #endif
  78. #if NET20
  79. using Newtonsoft.Json.Utilities.LinqBridge;
  80. #else
  81. using System.Linq;
  82. #endif
  83. #if !(NETFX_CORE)
  84. using System.Drawing;
  85. using System.Diagnostics;
  86. #endif
  87. namespace Newtonsoft.Json.Tests.Serialization
  88. {
  89. [TestFixture]
  90. public class JsonSerializerTest : TestFixtureBase
  91. {
  92. [Test]
  93. public void ExtensionDataWithNull()
  94. {
  95. string json = @"{
  96. 'TaxRate': 0.125,
  97. 'a':null
  98. }";
  99. var invoice = JsonConvert.DeserializeObject<ExtendedObject>(json);
  100. Assert.AreEqual(JTokenType.Null, invoice._additionalData["a"].Type);
  101. Assert.AreEqual(typeof(double), ((JValue)invoice._additionalData["TaxRate"]).Value.GetType());
  102. string result = JsonConvert.SerializeObject(invoice);
  103. Assert.AreEqual(@"{""TaxRate"":0.125,""a"":null}", result);
  104. }
  105. [Test]
  106. public void ExtensionDataFloatParseHandling()
  107. {
  108. string json = @"{
  109. 'TaxRate': 0.125,
  110. 'a':null
  111. }";
  112. var invoice = JsonConvert.DeserializeObject<ExtendedObject>(json, new JsonSerializerSettings
  113. {
  114. FloatParseHandling = FloatParseHandling.Decimal
  115. });
  116. Assert.AreEqual(typeof(decimal), ((JValue)invoice._additionalData["TaxRate"]).Value.GetType());
  117. }
  118. #pragma warning disable 649
  119. class ExtendedObject
  120. {
  121. [JsonExtensionData]
  122. internal IDictionary<string, JToken> _additionalData;
  123. }
  124. #pragma warning restore 649
  125. public class GenericItem<T>
  126. {
  127. public T Value { get; set; }
  128. }
  129. public class NonGenericItem : GenericItem<string>
  130. {
  131. }
  132. public class GenericClass<T, TValue> : IEnumerable<T>
  133. where T : GenericItem<TValue>, new()
  134. {
  135. public IList<T> Items { get; set; }
  136. public GenericClass()
  137. {
  138. Items = new List<T>();
  139. }
  140. public IEnumerator<T> GetEnumerator()
  141. {
  142. if (Items != null)
  143. {
  144. foreach (T item in Items)
  145. {
  146. yield return item;
  147. }
  148. }
  149. else
  150. yield break;
  151. }
  152. IEnumerator IEnumerable.GetEnumerator()
  153. {
  154. return GetEnumerator();
  155. }
  156. }
  157. public class NonGenericClass : GenericClass<GenericItem<string>, string>
  158. {
  159. }
  160. #pragma warning disable 169
  161. public class CustomerInvoice
  162. {
  163. // we're only modifing the tax rate
  164. public decimal TaxRate { get; set; }
  165. // everything else gets stored here
  166. [JsonExtensionData]
  167. private IDictionary<string, JToken> _additionalData;
  168. }
  169. #pragma warning restore 169
  170. [Test]
  171. public void ExtensionDataExample()
  172. {
  173. string json = @"{
  174. 'HourlyRate': 150,
  175. 'Hours': 40,
  176. 'TaxRate': 0.125
  177. }";
  178. var invoice = JsonConvert.DeserializeObject<CustomerInvoice>(json);
  179. // increase tax to 15%
  180. invoice.TaxRate = 0.15m;
  181. string result = JsonConvert.SerializeObject(invoice);
  182. // {
  183. // 'TaxRate': 0.15,
  184. // 'HourlyRate': 150,
  185. // 'Hours': 40
  186. // }
  187. Assert.AreEqual(@"{""TaxRate"":0.15,""HourlyRate"":150,""Hours"":40}", result);
  188. }
  189. public class ExtensionDataTestClass
  190. {
  191. public string Name { get; set; }
  192. [JsonProperty("custom_name")]
  193. public string CustomName { get; set; }
  194. [JsonIgnore]
  195. public IList<int> Ignored { get; set; }
  196. public bool GetPrivate { get; internal set; }
  197. public bool GetOnly
  198. {
  199. get { return true; }
  200. }
  201. public readonly string Readonly = "Readonly";
  202. public IList<int> Ints { get; set; }
  203. [JsonExtensionData]
  204. internal IDictionary<string, JToken> ExtensionData { get; set; }
  205. public ExtensionDataTestClass()
  206. {
  207. Ints = new List<int> { 0 };
  208. }
  209. }
  210. public class JObjectExtensionDataTestClass
  211. {
  212. public string Name { get; set; }
  213. [JsonExtensionData]
  214. public JObject ExtensionData { get; set; }
  215. }
  216. [Test]
  217. public void RoundTripJObjectExtensionData()
  218. {
  219. JObjectExtensionDataTestClass c = new JObjectExtensionDataTestClass();
  220. c.Name = "Name!";
  221. c.ExtensionData = new JObject
  222. {
  223. { "one", 1 },
  224. { "two", "II" },
  225. { "three", new JArray(1, 1, 1) }
  226. };
  227. string json = JsonConvert.SerializeObject(c, Formatting.Indented);
  228. JObjectExtensionDataTestClass c2 = JsonConvert.DeserializeObject<JObjectExtensionDataTestClass>(json);
  229. Assert.AreEqual("Name!", c2.Name);
  230. Assert.IsTrue(JToken.DeepEquals(c.ExtensionData, c2.ExtensionData));
  231. }
  232. public class BaseClass
  233. {
  234. internal bool IsTransient { get; set; }
  235. }
  236. public class ChildClass : BaseClass
  237. {
  238. public new bool IsTransient { get; set; }
  239. }
  240. [Test]
  241. public void NewProperty()
  242. {
  243. Assert.AreEqual(@"{""IsTransient"":true}", JsonConvert.SerializeObject(new ChildClass { IsTransient = true }));
  244. var childClass = JsonConvert.DeserializeObject<ChildClass>(@"{""IsTransient"":true}");
  245. Assert.AreEqual(true, childClass.IsTransient);
  246. }
  247. public class BaseClassVirtual
  248. {
  249. internal virtual bool IsTransient { get; set; }
  250. }
  251. public class ChildClassVirtual : BaseClassVirtual
  252. {
  253. public virtual new bool IsTransient { get; set; }
  254. }
  255. [Test]
  256. public void NewPropertyVirtual()
  257. {
  258. Assert.AreEqual(@"{""IsTransient"":true}", JsonConvert.SerializeObject(new ChildClassVirtual { IsTransient = true }));
  259. var childClass = JsonConvert.DeserializeObject<ChildClassVirtual>(@"{""IsTransient"":true}");
  260. Assert.AreEqual(true, childClass.IsTransient);
  261. }
  262. public class ResponseWithNewGenericProperty<T> : SimpleResponse
  263. {
  264. public new T Data { get; set; }
  265. }
  266. public class ResponseWithNewGenericPropertyVirtual<T> : SimpleResponse
  267. {
  268. public virtual new T Data { get; set; }
  269. }
  270. public class ResponseWithNewGenericPropertyOverride<T> : ResponseWithNewGenericPropertyVirtual<T>
  271. {
  272. public override T Data { get; set; }
  273. }
  274. public abstract class SimpleResponse
  275. {
  276. public string Result { get; set; }
  277. public string Message { get; set; }
  278. public object Data { get; set; }
  279. protected SimpleResponse()
  280. {
  281. }
  282. protected SimpleResponse(string message)
  283. {
  284. Message = message;
  285. }
  286. }
  287. [Test]
  288. public void CanSerializeWithBuiltInTypeAsGenericArgument()
  289. {
  290. var input = new ResponseWithNewGenericProperty<int>()
  291. {
  292. Message = "Trying out integer as type parameter",
  293. Data = 25,
  294. Result = "This should be fine"
  295. };
  296. var json = JsonConvert.SerializeObject(input);
  297. var deserialized = JsonConvert.DeserializeObject<ResponseWithNewGenericProperty<int>>(json);
  298. Assert.AreEqual(input.Data, deserialized.Data);
  299. Assert.AreEqual(input.Message, deserialized.Message);
  300. Assert.AreEqual(input.Result, deserialized.Result);
  301. }
  302. [Test]
  303. public void CanSerializeWithBuiltInTypeAsGenericArgumentVirtual()
  304. {
  305. var input = new ResponseWithNewGenericPropertyVirtual<int>()
  306. {
  307. Message = "Trying out integer as type parameter",
  308. Data = 25,
  309. Result = "This should be fine"
  310. };
  311. var json = JsonConvert.SerializeObject(input);
  312. var deserialized = JsonConvert.DeserializeObject<ResponseWithNewGenericPropertyVirtual<int>>(json);
  313. Assert.AreEqual(input.Data, deserialized.Data);
  314. Assert.AreEqual(input.Message, deserialized.Message);
  315. Assert.AreEqual(input.Result, deserialized.Result);
  316. }
  317. [Test]
  318. public void CanSerializeWithBuiltInTypeAsGenericArgumentOverride()
  319. {
  320. var input = new ResponseWithNewGenericPropertyOverride<int>()
  321. {
  322. Message = "Trying out integer as type parameter",
  323. Data = 25,
  324. Result = "This should be fine"
  325. };
  326. var json = JsonConvert.SerializeObject(input);
  327. var deserialized = JsonConvert.DeserializeObject<ResponseWithNewGenericPropertyOverride<int>>(json);
  328. Assert.AreEqual(input.Data, deserialized.Data);
  329. Assert.AreEqual(input.Message, deserialized.Message);
  330. Assert.AreEqual(input.Result, deserialized.Result);
  331. }
  332. [Test]
  333. public void CanSerializedWithGenericClosedTypeAsArgument()
  334. {
  335. var input = new ResponseWithNewGenericProperty<List<int>>()
  336. {
  337. Message = "More complex case - generic list of int",
  338. Data = Enumerable.Range(50, 70).ToList(),
  339. Result = "This should be fine too"
  340. };
  341. var json = JsonConvert.SerializeObject(input);
  342. var deserialized = JsonConvert.DeserializeObject<ResponseWithNewGenericProperty<List<int>>>(json);
  343. Assert.AreEqual(input.Data, deserialized.Data);
  344. Assert.AreEqual(input.Message, deserialized.Message);
  345. Assert.AreEqual(input.Result, deserialized.Result);
  346. }
  347. [Test]
  348. public void JsonSerializerProperties()
  349. {
  350. JsonSerializer serializer = new JsonSerializer();
  351. DefaultSerializationBinder customBinder = new DefaultSerializationBinder();
  352. serializer.Binder = customBinder;
  353. Assert.AreEqual(customBinder, serializer.Binder);
  354. serializer.CheckAdditionalContent = true;
  355. Assert.AreEqual(true, serializer.CheckAdditionalContent);
  356. serializer.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
  357. Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, serializer.ConstructorHandling);
  358. #if !NETFX_CORE
  359. serializer.Context = new StreamingContext(StreamingContextStates.Other);
  360. Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), serializer.Context);
  361. #endif
  362. CamelCasePropertyNamesContractResolver resolver = new CamelCasePropertyNamesContractResolver();
  363. serializer.ContractResolver = resolver;
  364. Assert.AreEqual(resolver, serializer.ContractResolver);
  365. serializer.Converters.Add(new StringEnumConverter());
  366. Assert.AreEqual(1, serializer.Converters.Count);
  367. serializer.Culture = new CultureInfo("en-nz");
  368. Assert.AreEqual("en-NZ", serializer.Culture.ToString());
  369. serializer.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
  370. Assert.AreEqual(DateFormatHandling.MicrosoftDateFormat, serializer.DateFormatHandling);
  371. serializer.DateFormatString = "yyyy";
  372. Assert.AreEqual("yyyy", serializer.DateFormatString);
  373. serializer.DateParseHandling = DateParseHandling.None;
  374. Assert.AreEqual(DateParseHandling.None, serializer.DateParseHandling);
  375. serializer.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
  376. Assert.AreEqual(DateTimeZoneHandling.Utc, serializer.DateTimeZoneHandling);
  377. serializer.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
  378. Assert.AreEqual(DefaultValueHandling.IgnoreAndPopulate, serializer.DefaultValueHandling);
  379. serializer.FloatFormatHandling = FloatFormatHandling.Symbol;
  380. Assert.AreEqual(FloatFormatHandling.Symbol, serializer.FloatFormatHandling);
  381. serializer.FloatParseHandling = FloatParseHandling.Decimal;
  382. Assert.AreEqual(FloatParseHandling.Decimal, serializer.FloatParseHandling);
  383. serializer.Formatting = Formatting.Indented;
  384. Assert.AreEqual(Formatting.Indented, serializer.Formatting);
  385. serializer.MaxDepth = 9001;
  386. Assert.AreEqual(9001, serializer.MaxDepth);
  387. serializer.MissingMemberHandling = MissingMemberHandling.Error;
  388. Assert.AreEqual(MissingMemberHandling.Error, serializer.MissingMemberHandling);
  389. serializer.NullValueHandling = NullValueHandling.Ignore;
  390. Assert.AreEqual(NullValueHandling.Ignore, serializer.NullValueHandling);
  391. serializer.ObjectCreationHandling = ObjectCreationHandling.Replace;
  392. Assert.AreEqual(ObjectCreationHandling.Replace, serializer.ObjectCreationHandling);
  393. serializer.PreserveReferencesHandling = PreserveReferencesHandling.All;
  394. Assert.AreEqual(PreserveReferencesHandling.All, serializer.PreserveReferencesHandling);
  395. serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  396. Assert.AreEqual(ReferenceLoopHandling.Ignore, serializer.ReferenceLoopHandling);
  397. IdReferenceResolver referenceResolver = new IdReferenceResolver();
  398. serializer.ReferenceResolver = referenceResolver;
  399. Assert.AreEqual(referenceResolver, serializer.ReferenceResolver);
  400. serializer.StringEscapeHandling = StringEscapeHandling.EscapeNonAscii;
  401. Assert.AreEqual(StringEscapeHandling.EscapeNonAscii, serializer.StringEscapeHandling);
  402. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  403. serializer.TraceWriter = traceWriter;
  404. Assert.AreEqual(traceWriter, serializer.TraceWriter);
  405. #if !(PORTABLE || PORTABLE40 || NETFX_CORE || NET20)
  406. serializer.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
  407. Assert.AreEqual(FormatterAssemblyStyle.Full, serializer.TypeNameAssemblyFormat);
  408. #endif
  409. serializer.TypeNameHandling = TypeNameHandling.All;
  410. Assert.AreEqual(TypeNameHandling.All, serializer.TypeNameHandling);
  411. }
  412. [Test]
  413. public void JsonSerializerSettingsProperties()
  414. {
  415. JsonSerializerSettings settings = new JsonSerializerSettings();
  416. DefaultSerializationBinder customBinder = new DefaultSerializationBinder();
  417. settings.Binder = customBinder;
  418. Assert.AreEqual(customBinder, settings.Binder);
  419. settings.CheckAdditionalContent = true;
  420. Assert.AreEqual(true, settings.CheckAdditionalContent);
  421. settings.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
  422. Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, settings.ConstructorHandling);
  423. #if !NETFX_CORE
  424. settings.Context = new StreamingContext(StreamingContextStates.Other);
  425. Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), settings.Context);
  426. #endif
  427. CamelCasePropertyNamesContractResolver resolver = new CamelCasePropertyNamesContractResolver();
  428. settings.ContractResolver = resolver;
  429. Assert.AreEqual(resolver, settings.ContractResolver);
  430. settings.Converters.Add(new StringEnumConverter());
  431. Assert.AreEqual(1, settings.Converters.Count);
  432. settings.Culture = new CultureInfo("en-nz");
  433. Assert.AreEqual("en-NZ", settings.Culture.ToString());
  434. settings.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
  435. Assert.AreEqual(DateFormatHandling.MicrosoftDateFormat, settings.DateFormatHandling);
  436. settings.DateFormatString = "yyyy";
  437. Assert.AreEqual("yyyy", settings.DateFormatString);
  438. settings.DateParseHandling = DateParseHandling.None;
  439. Assert.AreEqual(DateParseHandling.None, settings.DateParseHandling);
  440. settings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
  441. Assert.AreEqual(DateTimeZoneHandling.Utc, settings.DateTimeZoneHandling);
  442. settings.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
  443. Assert.AreEqual(DefaultValueHandling.IgnoreAndPopulate, settings.DefaultValueHandling);
  444. settings.FloatFormatHandling = FloatFormatHandling.Symbol;
  445. Assert.AreEqual(FloatFormatHandling.Symbol, settings.FloatFormatHandling);
  446. settings.FloatParseHandling = FloatParseHandling.Decimal;
  447. Assert.AreEqual(FloatParseHandling.Decimal, settings.FloatParseHandling);
  448. settings.Formatting = Formatting.Indented;
  449. Assert.AreEqual(Formatting.Indented, settings.Formatting);
  450. settings.MaxDepth = 9001;
  451. Assert.AreEqual(9001, settings.MaxDepth);
  452. settings.MissingMemberHandling = MissingMemberHandling.Error;
  453. Assert.AreEqual(MissingMemberHandling.Error, settings.MissingMemberHandling);
  454. settings.NullValueHandling = NullValueHandling.Ignore;
  455. Assert.AreEqual(NullValueHandling.Ignore, settings.NullValueHandling);
  456. settings.ObjectCreationHandling = ObjectCreationHandling.Replace;
  457. Assert.AreEqual(ObjectCreationHandling.Replace, settings.ObjectCreationHandling);
  458. settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
  459. Assert.AreEqual(PreserveReferencesHandling.All, settings.PreserveReferencesHandling);
  460. settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  461. Assert.AreEqual(ReferenceLoopHandling.Ignore, settings.ReferenceLoopHandling);
  462. IdReferenceResolver referenceResolver = new IdReferenceResolver();
  463. settings.ReferenceResolver = referenceResolver;
  464. Assert.AreEqual(referenceResolver, settings.ReferenceResolver);
  465. settings.StringEscapeHandling = StringEscapeHandling.EscapeNonAscii;
  466. Assert.AreEqual(StringEscapeHandling.EscapeNonAscii, settings.StringEscapeHandling);
  467. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  468. settings.TraceWriter = traceWriter;
  469. Assert.AreEqual(traceWriter, settings.TraceWriter);
  470. #if !(PORTABLE || PORTABLE40 || NETFX_CORE || NET20)
  471. settings.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
  472. Assert.AreEqual(FormatterAssemblyStyle.Full, settings.TypeNameAssemblyFormat);
  473. #endif
  474. settings.TypeNameHandling = TypeNameHandling.All;
  475. Assert.AreEqual(TypeNameHandling.All, settings.TypeNameHandling);
  476. }
  477. [Test]
  478. public void JsonSerializerProxyProperties()
  479. {
  480. JsonSerializerProxy serializerProxy = new JsonSerializerProxy(new JsonSerializerInternalReader(new JsonSerializer()));
  481. DefaultSerializationBinder customBinder = new DefaultSerializationBinder();
  482. serializerProxy.Binder = customBinder;
  483. Assert.AreEqual(customBinder, serializerProxy.Binder);
  484. serializerProxy.CheckAdditionalContent = true;
  485. Assert.AreEqual(true, serializerProxy.CheckAdditionalContent);
  486. serializerProxy.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;
  487. Assert.AreEqual(ConstructorHandling.AllowNonPublicDefaultConstructor, serializerProxy.ConstructorHandling);
  488. #if !NETFX_CORE
  489. serializerProxy.Context = new StreamingContext(StreamingContextStates.Other);
  490. Assert.AreEqual(new StreamingContext(StreamingContextStates.Other), serializerProxy.Context);
  491. #endif
  492. CamelCasePropertyNamesContractResolver resolver = new CamelCasePropertyNamesContractResolver();
  493. serializerProxy.ContractResolver = resolver;
  494. Assert.AreEqual(resolver, serializerProxy.ContractResolver);
  495. serializerProxy.Converters.Add(new StringEnumConverter());
  496. Assert.AreEqual(1, serializerProxy.Converters.Count);
  497. serializerProxy.Culture = new CultureInfo("en-nz");
  498. Assert.AreEqual("en-NZ", serializerProxy.Culture.ToString());
  499. serializerProxy.DateFormatHandling = DateFormatHandling.MicrosoftDateFormat;
  500. Assert.AreEqual(DateFormatHandling.MicrosoftDateFormat, serializerProxy.DateFormatHandling);
  501. serializerProxy.DateFormatString = "yyyy";
  502. Assert.AreEqual("yyyy", serializerProxy.DateFormatString);
  503. serializerProxy.DateParseHandling = DateParseHandling.None;
  504. Assert.AreEqual(DateParseHandling.None, serializerProxy.DateParseHandling);
  505. serializerProxy.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
  506. Assert.AreEqual(DateTimeZoneHandling.Utc, serializerProxy.DateTimeZoneHandling);
  507. serializerProxy.DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate;
  508. Assert.AreEqual(DefaultValueHandling.IgnoreAndPopulate, serializerProxy.DefaultValueHandling);
  509. serializerProxy.FloatFormatHandling = FloatFormatHandling.Symbol;
  510. Assert.AreEqual(FloatFormatHandling.Symbol, serializerProxy.FloatFormatHandling);
  511. serializerProxy.FloatParseHandling = FloatParseHandling.Decimal;
  512. Assert.AreEqual(FloatParseHandling.Decimal, serializerProxy.FloatParseHandling);
  513. serializerProxy.Formatting = Formatting.Indented;
  514. Assert.AreEqual(Formatting.Indented, serializerProxy.Formatting);
  515. serializerProxy.MaxDepth = 9001;
  516. Assert.AreEqual(9001, serializerProxy.MaxDepth);
  517. serializerProxy.MissingMemberHandling = MissingMemberHandling.Error;
  518. Assert.AreEqual(MissingMemberHandling.Error, serializerProxy.MissingMemberHandling);
  519. serializerProxy.NullValueHandling = NullValueHandling.Ignore;
  520. Assert.AreEqual(NullValueHandling.Ignore, serializerProxy.NullValueHandling);
  521. serializerProxy.ObjectCreationHandling = ObjectCreationHandling.Replace;
  522. Assert.AreEqual(ObjectCreationHandling.Replace, serializerProxy.ObjectCreationHandling);
  523. serializerProxy.PreserveReferencesHandling = PreserveReferencesHandling.All;
  524. Assert.AreEqual(PreserveReferencesHandling.All, serializerProxy.PreserveReferencesHandling);
  525. serializerProxy.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
  526. Assert.AreEqual(ReferenceLoopHandling.Ignore, serializerProxy.ReferenceLoopHandling);
  527. IdReferenceResolver referenceResolver = new IdReferenceResolver();
  528. serializerProxy.ReferenceResolver = referenceResolver;
  529. Assert.AreEqual(referenceResolver, serializerProxy.ReferenceResolver);
  530. serializerProxy.StringEscapeHandling = StringEscapeHandling.EscapeNonAscii;
  531. Assert.AreEqual(StringEscapeHandling.EscapeNonAscii, serializerProxy.StringEscapeHandling);
  532. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  533. serializerProxy.TraceWriter = traceWriter;
  534. Assert.AreEqual(traceWriter, serializerProxy.TraceWriter);
  535. #if !(PORTABLE || PORTABLE40 || NETFX_CORE || NET20)
  536. serializerProxy.TypeNameAssemblyFormat = FormatterAssemblyStyle.Full;
  537. Assert.AreEqual(FormatterAssemblyStyle.Full, serializerProxy.TypeNameAssemblyFormat);
  538. #endif
  539. serializerProxy.TypeNameHandling = TypeNameHandling.All;
  540. Assert.AreEqual(TypeNameHandling.All, serializerProxy.TypeNameHandling);
  541. }
  542. #if !(NETFX_CORE || PORTABLE || PORTABLE40)
  543. [Test]
  544. public void DeserializeISerializableIConvertible()
  545. {
  546. Ratio ratio = new Ratio(2, 1);
  547. string json = JsonConvert.SerializeObject(ratio);
  548. Assert.AreEqual(@"{""n"":2,""d"":1}", json);
  549. Ratio ratio2 = JsonConvert.DeserializeObject<Ratio>(json);
  550. Assert.AreEqual(ratio.Denominator, ratio2.Denominator);
  551. Assert.AreEqual(ratio.Numerator, ratio2.Numerator);
  552. }
  553. #endif
  554. [Test]
  555. public void DeserializeLargeFloat()
  556. {
  557. object o = JsonConvert.DeserializeObject("100000000000000000000000000000000000000.0");
  558. CustomAssert.IsInstanceOfType(typeof(double), o);
  559. Assert.IsTrue(MathUtils.ApproxEquals(1E+38, (double)o));
  560. }
  561. [Test]
  562. public void SerializeDeserializeRegex()
  563. {
  564. Regex regex = new Regex("(hi)", RegexOptions.CultureInvariant);
  565. string json = JsonConvert.SerializeObject(regex, Formatting.Indented);
  566. Regex r2 = JsonConvert.DeserializeObject<Regex>(json);
  567. Assert.AreEqual("(hi)", r2.ToString());
  568. Assert.AreEqual(RegexOptions.CultureInvariant, r2.Options);
  569. }
  570. [Test]
  571. public void ExtensionDataTest()
  572. {
  573. string json = @"{
  574. ""Ints"": [1,2,3],
  575. ""Ignored"": [1,2,3],
  576. ""Readonly"": ""Readonly"",
  577. ""Name"": ""Actually set!"",
  578. ""CustomName"": ""Wrong name!"",
  579. ""GetPrivate"": true,
  580. ""GetOnly"": true,
  581. ""NewValueSimple"": true,
  582. ""NewValueComplex"": [1,2,3]
  583. }";
  584. ExtensionDataTestClass c = JsonConvert.DeserializeObject<ExtensionDataTestClass>(json);
  585. Assert.AreEqual("Actually set!", c.Name);
  586. Assert.AreEqual(4, c.Ints.Count);
  587. Assert.AreEqual("Readonly", (string)c.ExtensionData["Readonly"]);
  588. Assert.AreEqual("Wrong name!", (string)c.ExtensionData["CustomName"]);
  589. Assert.AreEqual(true, (bool)c.ExtensionData["GetPrivate"]);
  590. Assert.AreEqual(true, (bool)c.ExtensionData["GetOnly"]);
  591. Assert.AreEqual(true, (bool)c.ExtensionData["NewValueSimple"]);
  592. Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2, 3), c.ExtensionData["NewValueComplex"]));
  593. Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2, 3), c.ExtensionData["Ignored"]));
  594. Assert.AreEqual(7, c.ExtensionData.Count);
  595. }
  596. public class MultipleExtensionDataAttributesTestClass
  597. {
  598. public string Name { get; set; }
  599. [JsonExtensionData]
  600. internal IDictionary<string, JToken> ExtensionData1 { get; set; }
  601. [JsonExtensionData]
  602. internal IDictionary<string, JToken> ExtensionData2 { get; set; }
  603. }
  604. public class ExtensionDataAttributesInheritanceTestClass : MultipleExtensionDataAttributesTestClass
  605. {
  606. [JsonExtensionData]
  607. internal IDictionary<string, JToken> ExtensionData0 { get; set; }
  608. }
  609. public class FieldExtensionDataAttributeTestClass
  610. {
  611. [JsonExtensionData]
  612. internal IDictionary<object, object> ExtensionData;
  613. }
  614. public class PublicExtensionDataAttributeTestClass
  615. {
  616. public string Name { get; set; }
  617. [JsonExtensionData]
  618. public IDictionary<object, object> ExtensionData;
  619. }
  620. public class PublicExtensionDataAttributeTestClassWithNonDefaultConstructor
  621. {
  622. public string Name { get; set; }
  623. public PublicExtensionDataAttributeTestClassWithNonDefaultConstructor(string name)
  624. {
  625. Name = name;
  626. }
  627. [JsonExtensionData]
  628. public IDictionary<object, object> ExtensionData;
  629. }
  630. public class PublicNoReadExtensionDataAttributeTestClass
  631. {
  632. public string Name { get; set; }
  633. [JsonExtensionData(ReadData = false)]
  634. public IDictionary<object, object> ExtensionData;
  635. }
  636. public class PublicNoWriteExtensionDataAttributeTestClass
  637. {
  638. public string Name { get; set; }
  639. [JsonExtensionData(WriteData = false)]
  640. public IDictionary<object, object> ExtensionData;
  641. }
  642. public class PublicJTokenExtensionDataAttributeTestClass
  643. {
  644. public string Name { get; set; }
  645. [JsonExtensionData]
  646. public IDictionary<string, JToken> ExtensionData;
  647. }
  648. [Test]
  649. public void DeserializeDirectoryAccount()
  650. {
  651. string json = @"{'DisplayName':'John Smith', 'SAMAccountName':'contoso\\johns'}";
  652. DirectoryAccount account = JsonConvert.DeserializeObject<DirectoryAccount>(json);
  653. Assert.AreEqual("John Smith", account.DisplayName);
  654. Assert.AreEqual("contoso", account.Domain);
  655. Assert.AreEqual("johns", account.UserName);
  656. }
  657. [Test]
  658. public void SerializePublicExtensionData()
  659. {
  660. string json = JsonConvert.SerializeObject(new PublicExtensionDataAttributeTestClass
  661. {
  662. Name = "Name!",
  663. ExtensionData = new Dictionary<object, object>
  664. {
  665. { "Test", 1 }
  666. }
  667. });
  668. Assert.AreEqual(@"{""Name"":""Name!"",""Test"":1}", json);
  669. }
  670. [Test]
  671. public void SerializePublicExtensionDataNull()
  672. {
  673. string json = JsonConvert.SerializeObject(new PublicExtensionDataAttributeTestClass
  674. {
  675. Name = "Name!"
  676. });
  677. Assert.AreEqual(@"{""Name"":""Name!""}", json);
  678. }
  679. [Test]
  680. public void SerializePublicNoWriteExtensionData()
  681. {
  682. string json = JsonConvert.SerializeObject(new PublicNoWriteExtensionDataAttributeTestClass
  683. {
  684. Name = "Name!",
  685. ExtensionData = new Dictionary<object, object>
  686. {
  687. { "Test", 1 }
  688. }
  689. });
  690. Assert.AreEqual(@"{""Name"":""Name!""}", json);
  691. }
  692. [Test]
  693. public void DeserializeNoReadPublicExtensionData()
  694. {
  695. PublicNoReadExtensionDataAttributeTestClass c = JsonConvert.DeserializeObject<PublicNoReadExtensionDataAttributeTestClass>(@"{""Name"":""Name!"",""Test"":1}");
  696. Assert.AreEqual(null, c.ExtensionData);
  697. }
  698. [Test]
  699. public void SerializePublicExtensionDataCircularReference()
  700. {
  701. var c = new PublicExtensionDataAttributeTestClass
  702. {
  703. Name = "Name!",
  704. ExtensionData = new Dictionary<object, object>
  705. {
  706. { "Test", 1 }
  707. }
  708. };
  709. c.ExtensionData["Self"] = c;
  710. string json = JsonConvert.SerializeObject(c, new JsonSerializerSettings
  711. {
  712. PreserveReferencesHandling = PreserveReferencesHandling.All,
  713. Formatting = Formatting.Indented
  714. });
  715. Assert.AreEqual(@"{
  716. ""$id"": ""1"",
  717. ""Name"": ""Name!"",
  718. ""Test"": 1,
  719. ""Self"": {
  720. ""$ref"": ""1""
  721. }
  722. }", json);
  723. var c2 = JsonConvert.DeserializeObject<PublicExtensionDataAttributeTestClass>(json, new JsonSerializerSettings
  724. {
  725. PreserveReferencesHandling = PreserveReferencesHandling.All
  726. });
  727. Assert.AreEqual("Name!", c2.Name);
  728. PublicExtensionDataAttributeTestClass bizzaroC2 = (PublicExtensionDataAttributeTestClass)c2.ExtensionData["Self"];
  729. Assert.AreEqual(c2, bizzaroC2);
  730. Assert.AreEqual(1, (long)bizzaroC2.ExtensionData["Test"]);
  731. }
  732. [Test]
  733. public void DeserializePublicJTokenExtensionDataCircularReference()
  734. {
  735. string json = @"{
  736. ""$id"": ""1"",
  737. ""Name"": ""Name!"",
  738. ""Test"": 1,
  739. ""Self"": {
  740. ""$ref"": ""1""
  741. }
  742. }";
  743. var c2 = JsonConvert.DeserializeObject<PublicJTokenExtensionDataAttributeTestClass>(json, new JsonSerializerSettings
  744. {
  745. PreserveReferencesHandling = PreserveReferencesHandling.All
  746. });
  747. Assert.AreEqual("Name!", c2.Name);
  748. JObject bizzaroC2 = (JObject)c2.ExtensionData["Self"];
  749. Assert.AreEqual("Name!", (string)bizzaroC2["Name"]);
  750. Assert.AreEqual(1, (int)bizzaroC2["Test"]);
  751. Assert.AreEqual(1, (int)c2.ExtensionData["Test"]);
  752. }
  753. [Test]
  754. public void DeserializePublicExtensionDataTypeNamdHandling()
  755. {
  756. string json = @"{
  757. ""$id"": ""1"",
  758. ""Name"": ""Name!"",
  759. ""Test"": 1,
  760. ""Self"": {
  761. ""$type"": ""Newtonsoft.Json.Tests.TestObjects.WagePerson, Newtonsoft.Json.Tests"",
  762. ""HourlyWage"": 2.0,
  763. ""Name"": null,
  764. ""BirthDate"": ""0001-01-01T00:00:00"",
  765. ""LastModified"": ""0001-01-01T00:00:00""
  766. }
  767. }";
  768. PublicExtensionDataAttributeTestClass c2 = JsonConvert.DeserializeObject<PublicExtensionDataAttributeTestClass>(json, new JsonSerializerSettings
  769. {
  770. TypeNameHandling = TypeNameHandling.Objects
  771. });
  772. Assert.AreEqual("Name!", c2.Name);
  773. WagePerson bizzaroC2 = (WagePerson)c2.ExtensionData["Self"];
  774. Assert.AreEqual(2m, bizzaroC2.HourlyWage);
  775. }
  776. [Test]
  777. public void DeserializePublicExtensionDataTypeNamdHandlingNonDefaultConstructor()
  778. {
  779. string json = @"{
  780. ""$id"": ""1"",
  781. ""Name"": ""Name!"",
  782. ""Test"": 1,
  783. ""Self"": {
  784. ""$type"": ""Newtonsoft.Json.Tests.TestObjects.WagePerson, Newtonsoft.Json.Tests"",
  785. ""HourlyWage"": 2.0,
  786. ""Name"": null,
  787. ""BirthDate"": ""0001-01-01T00:00:00"",
  788. ""LastModified"": ""0001-01-01T00:00:00""
  789. }
  790. }";
  791. PublicExtensionDataAttributeTestClassWithNonDefaultConstructor c2 = JsonConvert.DeserializeObject<PublicExtensionDataAttributeTestClassWithNonDefaultConstructor>(json, new JsonSerializerSettings
  792. {
  793. TypeNameHandling = TypeNameHandling.Objects
  794. });
  795. Assert.AreEqual("Name!", c2.Name);
  796. WagePerson bizzaroC2 = (WagePerson)c2.ExtensionData["Self"];
  797. Assert.AreEqual(2m, bizzaroC2.HourlyWage);
  798. }
  799. [Test]
  800. public void SerializePublicExtensionDataTypeNamdHandling()
  801. {
  802. PublicExtensionDataAttributeTestClass c = new PublicExtensionDataAttributeTestClass
  803. {
  804. Name = "Name!",
  805. ExtensionData = new Dictionary<object, object>
  806. {
  807. {
  808. "Test", new WagePerson
  809. {
  810. HourlyWage = 2.1m
  811. }
  812. }
  813. }
  814. };
  815. string json = JsonConvert.SerializeObject(c, new JsonSerializerSettings
  816. {
  817. TypeNameHandling = TypeNameHandling.Objects,
  818. Formatting = Formatting.Indented
  819. });
  820. Assert.AreEqual(@"{
  821. ""$type"": ""Newtonsoft.Json.Tests.Serialization.JsonSerializerTest+PublicExtensionDataAttributeTestClass, Newtonsoft.Json.Tests"",
  822. ""Name"": ""Name!"",
  823. ""Test"": {
  824. ""$type"": ""Newtonsoft.Json.Tests.TestObjects.WagePerson, Newtonsoft.Json.Tests"",
  825. ""HourlyWage"": 2.1,
  826. ""Name"": null,
  827. ""BirthDate"": ""0001-01-01T00:00:00"",
  828. ""LastModified"": ""0001-01-01T00:00:00""
  829. }
  830. }", json);
  831. }
  832. [Test]
  833. public void DeserializePublicExtensionData()
  834. {
  835. string json = @"{
  836. 'Name':'Name!',
  837. 'NoMatch':'NoMatch!',
  838. 'ExtensionData':{'HAI':true}
  839. }";
  840. var c = JsonConvert.DeserializeObject<PublicExtensionDataAttributeTestClass>(json);
  841. Assert.AreEqual("Name!", c.Name);
  842. Assert.AreEqual(2, c.ExtensionData.Count);
  843. Assert.AreEqual("NoMatch!", (string)c.ExtensionData["NoMatch"]);
  844. // the ExtensionData property is put into the extension data
  845. // inception
  846. var o = (JObject)c.ExtensionData["ExtensionData"];
  847. Assert.AreEqual(1, o.Count);
  848. Assert.IsTrue(JToken.DeepEquals(new JObject { { "HAI", true } }, o));
  849. }
  850. [Test]
  851. public void FieldExtensionDataAttributeTest_Serialize()
  852. {
  853. FieldExtensionDataAttributeTestClass c = new FieldExtensionDataAttributeTestClass
  854. {
  855. ExtensionData = new Dictionary<object, object>()
  856. };
  857. string json = JsonConvert.SerializeObject(c);
  858. Assert.AreEqual("{}", json);
  859. }
  860. [Test]
  861. public void FieldExtensionDataAttributeTest_Deserialize()
  862. {
  863. var c = JsonConvert.DeserializeObject<FieldExtensionDataAttributeTestClass>("{'first':1,'second':2}");
  864. Assert.AreEqual(2, c.ExtensionData.Count);
  865. Assert.AreEqual(1, (long)c.ExtensionData["first"]);
  866. Assert.AreEqual(2, (long)c.ExtensionData["second"]);
  867. }
  868. [Test]
  869. public void MultipleExtensionDataAttributesTest()
  870. {
  871. var c = JsonConvert.DeserializeObject<MultipleExtensionDataAttributesTestClass>("{'first':[1],'second':[2]}");
  872. Assert.AreEqual(null, c.ExtensionData1);
  873. Assert.AreEqual(2, c.ExtensionData2.Count);
  874. Assert.AreEqual(1, (int)((JArray)c.ExtensionData2["first"])[0]);
  875. Assert.AreEqual(2, (int)((JArray)c.ExtensionData2["second"])[0]);
  876. }
  877. [Test]
  878. public void ExtensionDataAttributesInheritanceTest()
  879. {
  880. var c = JsonConvert.DeserializeObject<ExtensionDataAttributesInheritanceTestClass>("{'first':1,'second':2}");
  881. Assert.AreEqual(null, c.ExtensionData1);
  882. Assert.AreEqual(null, c.ExtensionData2);
  883. Assert.AreEqual(2, c.ExtensionData0.Count);
  884. Assert.AreEqual(1, (int)c.ExtensionData0["first"]);
  885. Assert.AreEqual(2, (int)c.ExtensionData0["second"]);
  886. }
  887. [Test]
  888. public void GenericCollectionInheritance()
  889. {
  890. string json;
  891. GenericClass<GenericItem<string>, string> foo1 = new GenericClass<GenericItem<string>, string>();
  892. foo1.Items.Add(new GenericItem<string> { Value = "Hello" });
  893. json = JsonConvert.SerializeObject(new { selectList = foo1 });
  894. Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json);
  895. GenericClass<NonGenericItem, string> foo2 = new GenericClass<NonGenericItem, string>();
  896. foo2.Items.Add(new NonGenericItem { Value = "Hello" });
  897. json = JsonConvert.SerializeObject(new { selectList = foo2 });
  898. Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json);
  899. NonGenericClass foo3 = new NonGenericClass();
  900. foo3.Items.Add(new NonGenericItem { Value = "Hello" });
  901. json = JsonConvert.SerializeObject(new { selectList = foo3 });
  902. Assert.AreEqual(@"{""selectList"":[{""Value"":""Hello""}]}", json);
  903. }
  904. #if !NET20
  905. [DataContract]
  906. public class BaseDataContractWithHidden
  907. {
  908. [DataMember(Name = "virtualMember")]
  909. public virtual string VirtualMember { get; set; }
  910. [DataMember(Name = "nonVirtualMember")]
  911. public string NonVirtualMember { get; set; }
  912. public virtual object NewMember { get; set; }
  913. }
  914. public class ChildDataContractWithHidden : BaseDataContractWithHidden
  915. {
  916. [DataMember(Name = "NewMember")]
  917. public new virtual string NewMember { get; set; }
  918. public override string VirtualMember { get; set; }
  919. public string AddedMember { get; set; }
  920. }
  921. [Test]
  922. public void ChildDataContractTestWithHidden()
  923. {
  924. var cc = new ChildDataContractWithHidden
  925. {
  926. VirtualMember = "VirtualMember!",
  927. NonVirtualMember = "NonVirtualMember!",
  928. NewMember = "NewMember!"
  929. };
  930. string result = JsonConvert.SerializeObject(cc);
  931. Assert.AreEqual(@"{""NewMember"":""NewMember!"",""virtualMember"":""VirtualMember!"",""nonVirtualMember"":""NonVirtualMember!""}", result);
  932. }
  933. // ignore hiding members compiler warning
  934. #pragma warning disable 108,114
  935. [DataContract]
  936. public class BaseWithContract
  937. {
  938. [DataMember(Name = "VirtualWithDataMemberBase")]
  939. public virtual string VirtualWithDataMember { get; set; }
  940. [DataMember]
  941. public virtual string Virtual { get; set; }
  942. [DataMember(Name = "WithDataMemberBase")]
  943. public string WithDataMember { get; set; }
  944. [DataMember]
  945. public string JustAProperty { get; set; }
  946. }
  947. [DataContract]
  948. public class BaseWithoutContract
  949. {
  950. [DataMember(Name = "VirtualWithDataMemberBase")]
  951. public virtual string VirtualWithDataMember { get; set; }
  952. [DataMember]
  953. public virtual string Virtual { get; set; }
  954. [DataMember(Name = "WithDataMemberBase")]
  955. public string WithDataMember { get; set; }
  956. [DataMember]
  957. public string JustAProperty { get; set; }
  958. }
  959. [DataContract]
  960. public class SubWithoutContractNewProperties : BaseWithContract
  961. {
  962. [DataMember(Name = "VirtualWithDataMemberSub")]
  963. public string VirtualWithDataMember { get; set; }
  964. public string Virtual { get; set; }
  965. [DataMember(Name = "WithDataMemberSub")]
  966. public string WithDataMember { get; set; }
  967. public string JustAProperty { get; set; }
  968. }
  969. [DataContract]
  970. public class SubWithoutContractVirtualProperties : BaseWithContract
  971. {
  972. public override string VirtualWithDataMember { get; set; }
  973. [DataMember(Name = "VirtualSub")]
  974. public override string Virtual { get; set; }
  975. }
  976. [DataContract]
  977. public class SubWithContractNewProperties : BaseWithContract
  978. {
  979. [DataMember(Name = "VirtualWithDataMemberSub")]
  980. public string VirtualWithDataMember { get; set; }
  981. [DataMember(Name = "Virtual2")]
  982. public string Virtual { get; set; }
  983. [DataMember(Name = "WithDataMemberSub")]
  984. public string WithDataMember { get; set; }
  985. [DataMember(Name = "JustAProperty2")]
  986. public string JustAProperty { get; set; }
  987. }
  988. [DataContract]
  989. public class SubWithContractVirtualProperties : BaseWithContract
  990. {
  991. [DataMember(Name = "VirtualWithDataMemberSub")]
  992. public virtual string VirtualWithDataMember { get; set; }
  993. }
  994. #pragma warning restore 108,114
  995. [Test]
  996. public void SubWithoutContractNewPropertiesTest()
  997. {
  998. BaseWithContract baseWith = new SubWithoutContractNewProperties
  999. {
  1000. JustAProperty = "JustAProperty!",
  1001. Virtual = "Virtual!",
  1002. VirtualWithDataMember = "VirtualWithDataMember!",
  1003. WithDataMember = "WithDataMember!"
  1004. };
  1005. baseWith.JustAProperty = "JustAProperty2!";
  1006. baseWith.Virtual = "Virtual2!";
  1007. baseWith.VirtualWithDataMember = "VirtualWithDataMember2!";
  1008. baseWith.WithDataMember = "WithDataMember2!";
  1009. string json = AssertSerializeDeserializeEqual(baseWith);
  1010. Assert.AreEqual(@"{
  1011. ""JustAProperty"": ""JustAProperty2!"",
  1012. ""Virtual"": ""Virtual2!"",
  1013. ""VirtualWithDataMemberBase"": ""VirtualWithDataMember2!"",
  1014. ""VirtualWithDataMemberSub"": ""VirtualWithDataMember!"",
  1015. ""WithDataMemberBase"": ""WithDataMember2!"",
  1016. ""WithDataMemberSub"": ""WithDataMember!""
  1017. }", json);
  1018. }
  1019. [Test]
  1020. public void SubWithoutContractVirtualPropertiesTest()
  1021. {
  1022. BaseWithContract baseWith = new SubWithoutContractVirtualProperties
  1023. {
  1024. JustAProperty = "JustAProperty!",
  1025. Virtual = "Virtual!",
  1026. VirtualWithDataMember = "VirtualWithDataMember!",
  1027. WithDataMember = "WithDataMember!"
  1028. };
  1029. baseWith.JustAProperty = "JustAProperty2!";
  1030. baseWith.Virtual = "Virtual2!";
  1031. baseWith.VirtualWithDataMember = "VirtualWithDataMember2!";
  1032. baseWith.WithDataMember = "WithDataMember2!";
  1033. string json = JsonConvert.SerializeObject(baseWith, Formatting.Indented);
  1034. Console.WriteLine(json);
  1035. Assert.AreEqual(@"{
  1036. ""VirtualWithDataMemberBase"": ""VirtualWithDataMember2!"",
  1037. ""VirtualSub"": ""Virtual2!"",
  1038. ""WithDataMemberBase"": ""WithDataMember2!"",
  1039. ""JustAProperty"": ""JustAProperty2!""
  1040. }", json);
  1041. }
  1042. [Test]
  1043. public void SubWithContractNewPropertiesTest()
  1044. {
  1045. BaseWithContract baseWith = new SubWithContractNewProperties
  1046. {
  1047. JustAProperty = "JustAProperty!",
  1048. Virtual = "Virtual!",
  1049. VirtualWithDataMember = "VirtualWithDataMember!",
  1050. WithDataMember = "WithDataMember!"
  1051. };
  1052. baseWith.JustAProperty = "JustAProperty2!";
  1053. baseWith.Virtual = "Virtual2!";
  1054. baseWith.VirtualWithDataMember = "VirtualWithDataMember2!";
  1055. baseWith.WithDataMember = "WithDataMember2!";
  1056. string json = AssertSerializeDeserializeEqual(baseWith);
  1057. Assert.AreEqual(@"{
  1058. ""JustAProperty"": ""JustAProperty2!"",
  1059. ""JustAProperty2"": ""JustAProperty!"",
  1060. ""Virtual"": ""Virtual2!"",
  1061. ""Virtual2"": ""Virtual!"",
  1062. ""VirtualWithDataMemberBase"": ""VirtualWithDataMember2!"",
  1063. ""VirtualWithDataMemberSub"": ""VirtualWithDataMember!"",
  1064. ""WithDataMemberBase"": ""WithDataMember2!"",
  1065. ""WithDataMemberSub"": ""WithDataMember!""
  1066. }", json);
  1067. }
  1068. [Test]
  1069. public void SubWithContractVirtualPropertiesTest()
  1070. {
  1071. BaseWithContract baseWith = new SubWithContractVirtualProperties
  1072. {
  1073. JustAProperty = "JustAProperty!",
  1074. Virtual = "Virtual!",
  1075. VirtualWithDataMember = "VirtualWithDataMember!",
  1076. WithDataMember = "WithDataMember!"
  1077. };
  1078. baseWith.JustAProperty = "JustAProperty2!";
  1079. baseWith.Virtual = "Virtual2!";
  1080. baseWith.VirtualWithDataMember = "VirtualWithDataMember2!";
  1081. baseWith.WithDataMember = "WithDataMember2!";
  1082. string json = AssertSerializeDeserializeEqual(baseWith);
  1083. Assert.AreEqual(@"{
  1084. ""JustAProperty"": ""JustAProperty2!"",
  1085. ""Virtual"": ""Virtual2!"",
  1086. ""VirtualWithDataMemberBase"": ""VirtualWithDataMember2!"",
  1087. ""VirtualWithDataMemberSub"": ""VirtualWithDataMember!"",
  1088. ""WithDataMemberBase"": ""WithDataMember2!""
  1089. }", jso…

Large files files are truncated, but you can click here to view the full file