PageRenderTime 36ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/desktop_clients/Visual Studio/Crear beneficiarios/Json100r3/Source/Src/Newtonsoft.Json.Tests/Serialization/TraceWriterTests.cs

https://bitbucket.org/wfpcoslv/maps-examples
C# | 1294 lines | 1109 code | 163 blank | 22 comment | 35 complexity | f4bd844d63975e0052586c249e6ab6ba MD5 | raw file
Possible License(s): GPL-2.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Globalization;
  5. using System.IO;
  6. using Newtonsoft.Json.Linq;
  7. #if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3
  8. using System.Numerics;
  9. #endif
  10. using System.Runtime.Serialization;
  11. using System.Runtime.Serialization.Formatters;
  12. using System.Text;
  13. #if DNXCORE50
  14. using Xunit;
  15. using Test = Xunit.FactAttribute;
  16. using Assert = Newtonsoft.Json.Tests.XUnitAssert;
  17. #else
  18. using NUnit.Framework;
  19. #endif
  20. using Newtonsoft.Json.Converters;
  21. using Newtonsoft.Json.Serialization;
  22. using Newtonsoft.Json.Tests.TestObjects;
  23. using Newtonsoft.Json.Tests.TestObjects.Organization;
  24. using Newtonsoft.Json.Utilities;
  25. #if NET20
  26. using Newtonsoft.Json.Utilities.LinqBridge;
  27. #else
  28. using System.Linq;
  29. #endif
  30. #if !(NET20 || NET35 || NET40 || PORTABLE40 || PORTABLE) || DNXCORE50
  31. using System.Threading.Tasks;
  32. #endif
  33. namespace Newtonsoft.Json.Tests.Serialization
  34. {
  35. public class Staff
  36. {
  37. public string Name { get; set; }
  38. public DateTime StartDate { get; set; }
  39. public IList<string> Roles { get; set; }
  40. }
  41. [TestFixture]
  42. public class TraceWriterTests : TestFixtureBase
  43. {
  44. #if !(PORTABLE || DNXCORE50 || PORTABLE40)
  45. [Test]
  46. public void DiagnosticsTraceWriterTest()
  47. {
  48. StringWriter sw = new StringWriter();
  49. TextWriterTraceListener listener = new TextWriterTraceListener(sw);
  50. try
  51. {
  52. Trace.AutoFlush = true;
  53. Trace.Listeners.Add(listener);
  54. DiagnosticsTraceWriter traceWriter = new DiagnosticsTraceWriter();
  55. traceWriter.Trace(TraceLevel.Verbose, "Verbose!", null);
  56. traceWriter.Trace(TraceLevel.Info, "Info!", null);
  57. traceWriter.Trace(TraceLevel.Warning, "Warning!", null);
  58. traceWriter.Trace(TraceLevel.Error, "Error!", null);
  59. traceWriter.Trace(TraceLevel.Off, "Off!", null);
  60. StringAssert.AreEqual(@"Newtonsoft.Json Verbose: 0 : Verbose!
  61. Newtonsoft.Json Information: 0 : Info!
  62. Newtonsoft.Json Warning: 0 : Warning!
  63. Newtonsoft.Json Error: 0 : Error!
  64. ", sw.ToString());
  65. }
  66. finally
  67. {
  68. Trace.Listeners.Remove(listener);
  69. Trace.AutoFlush = false;
  70. }
  71. }
  72. #endif
  73. [Test]
  74. public void WriteNullableByte()
  75. {
  76. StringWriter sw = new StringWriter();
  77. TraceJsonWriter traceJsonWriter = new TraceJsonWriter(new JsonTextWriter(sw));
  78. traceJsonWriter.WriteStartArray();
  79. traceJsonWriter.WriteValue((byte?)null);
  80. traceJsonWriter.WriteEndArray();
  81. StringAssert.AreEqual(@"Serialized JSON:
  82. [
  83. null
  84. ]", traceJsonWriter.GetSerializedJsonMessage());
  85. }
  86. [Test]
  87. public void WriteNullObject()
  88. {
  89. StringWriter sw = new StringWriter();
  90. TraceJsonWriter traceJsonWriter = new TraceJsonWriter(new JsonTextWriter(sw));
  91. traceJsonWriter.WriteStartArray();
  92. traceJsonWriter.WriteValue((object)null);
  93. traceJsonWriter.WriteEndArray();
  94. StringAssert.AreEqual(@"Serialized JSON:
  95. [
  96. null
  97. ]", traceJsonWriter.GetSerializedJsonMessage());
  98. }
  99. [Test]
  100. public void WriteNullString()
  101. {
  102. StringWriter sw = new StringWriter();
  103. TraceJsonWriter traceJsonWriter = new TraceJsonWriter(new JsonTextWriter(sw));
  104. traceJsonWriter.WriteStartArray();
  105. traceJsonWriter.WriteValue((string)null);
  106. traceJsonWriter.WriteEndArray();
  107. StringAssert.AreEqual(@"Serialized JSON:
  108. [
  109. null
  110. ]", traceJsonWriter.GetSerializedJsonMessage());
  111. }
  112. [Test]
  113. public void WriteNullUri()
  114. {
  115. StringWriter sw = new StringWriter();
  116. TraceJsonWriter traceJsonWriter = new TraceJsonWriter(new JsonTextWriter(sw));
  117. traceJsonWriter.WriteStartArray();
  118. traceJsonWriter.WriteValue((Uri)null);
  119. traceJsonWriter.WriteEndArray();
  120. StringAssert.AreEqual(@"Serialized JSON:
  121. [
  122. null
  123. ]", traceJsonWriter.GetSerializedJsonMessage());
  124. }
  125. [Test]
  126. public void WriteNullByteArray()
  127. {
  128. StringWriter sw = new StringWriter();
  129. TraceJsonWriter traceJsonWriter = new TraceJsonWriter(new JsonTextWriter(sw));
  130. traceJsonWriter.WriteStartArray();
  131. traceJsonWriter.WriteValue((byte[])null);
  132. traceJsonWriter.WriteEndArray();
  133. StringAssert.AreEqual(@"Serialized JSON:
  134. [
  135. null
  136. ]", traceJsonWriter.GetSerializedJsonMessage());
  137. }
  138. [Test]
  139. public void WriteJRaw()
  140. {
  141. ITraceWriter traceWriter = new MemoryTraceWriter();
  142. JRaw settings = new JRaw("$('#element')");
  143. string json = JsonConvert.SerializeObject(settings, new JsonSerializerSettings
  144. {
  145. TraceWriter = traceWriter
  146. });
  147. Assert.AreEqual("$('#element')", json);
  148. Assert.IsTrue(traceWriter.ToString().EndsWith("Verbose Serialized JSON: " + Environment.NewLine + "$('#element')", StringComparison.Ordinal));
  149. }
  150. [Test]
  151. public void WriteJRawInArray()
  152. {
  153. ITraceWriter traceWriter = new MemoryTraceWriter();
  154. List<JRaw> raws = new List<JRaw>
  155. {
  156. new JRaw("$('#element')"),
  157. new JRaw("$('#element')"),
  158. new JRaw("$('#element')")
  159. };
  160. string json = JsonConvert.SerializeObject(raws, new JsonSerializerSettings
  161. {
  162. TraceWriter = traceWriter,
  163. Formatting = Formatting.Indented
  164. });
  165. StringAssert.AreEqual(@"[
  166. $('#element'),
  167. $('#element'),
  168. $('#element')
  169. ]", json);
  170. Assert.IsTrue(traceWriter.ToString().EndsWith(@"Verbose Serialized JSON:
  171. [
  172. $('#element'),
  173. $('#element'),
  174. $('#element')
  175. ]", StringComparison.Ordinal));
  176. }
  177. [Test]
  178. public void MemoryTraceWriterSerializeTest()
  179. {
  180. Staff staff = new Staff();
  181. staff.Name = "Arnie Admin";
  182. staff.Roles = new List<string> { "Administrator" };
  183. staff.StartDate = new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc);
  184. ITraceWriter traceWriter = new MemoryTraceWriter();
  185. JsonConvert.SerializeObject(
  186. staff,
  187. new JsonSerializerSettings { TraceWriter = traceWriter, Converters = { new JavaScriptDateTimeConverter() } });
  188. // 2012-11-11T12:08:42.761 Info Started serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''.
  189. // 2012-11-11T12:08:42.785 Info Started serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path 'StartDate'.
  190. // 2012-11-11T12:08:42.791 Info Finished serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path 'StartDate'.
  191. // 2012-11-11T12:08:42.797 Info Started serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'.
  192. // 2012-11-11T12:08:42.798 Info Finished serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'.
  193. // 2012-11-11T12:08:42.799 Info Finished serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''.
  194. MemoryTraceWriter memoryTraceWriter = (MemoryTraceWriter)traceWriter;
  195. string output = memoryTraceWriter.ToString();
  196. Assert.AreEqual(916, output.Length);
  197. Assert.AreEqual(7, memoryTraceWriter.GetTraceMessages().Count());
  198. string json = @"Serialized JSON:
  199. {
  200. ""Name"": ""Arnie Admin"",
  201. ""StartDate"": new Date(
  202. 976623132000
  203. ),
  204. ""Roles"": [
  205. ""Administrator""
  206. ]
  207. }";
  208. json = StringAssert.Normalize(json);
  209. output = StringAssert.Normalize(output);
  210. Assert.IsTrue(output.Contains(json));
  211. }
  212. [Test]
  213. public void MemoryTraceWriterDeserializeTest()
  214. {
  215. string json = @"{
  216. ""Name"": ""Arnie Admin"",
  217. ""StartDate"": new Date(
  218. 976623132000
  219. ),
  220. ""Roles"": [
  221. ""Administrator""
  222. ]
  223. }";
  224. Staff staff = new Staff();
  225. staff.Name = "Arnie Admin";
  226. staff.Roles = new List<string> { "Administrator" };
  227. staff.StartDate = new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc);
  228. ITraceWriter traceWriter = new MemoryTraceWriter();
  229. JsonConvert.DeserializeObject<Staff>(
  230. json,
  231. new JsonSerializerSettings
  232. {
  233. TraceWriter = traceWriter,
  234. Converters = { new JavaScriptDateTimeConverter() },
  235. MetadataPropertyHandling = MetadataPropertyHandling.Default
  236. });
  237. // 2012-11-11T12:08:42.761 Info Started serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''.
  238. // 2012-11-11T12:08:42.785 Info Started serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path 'StartDate'.
  239. // 2012-11-11T12:08:42.791 Info Finished serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path 'StartDate'.
  240. // 2012-11-11T12:08:42.797 Info Started serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'.
  241. // 2012-11-11T12:08:42.798 Info Finished serializing System.Collections.Generic.List`1[System.String]. Path 'Roles'.
  242. // 2012-11-11T12:08:42.799 Info Finished serializing Newtonsoft.Json.Tests.Serialization.Staff. Path ''.
  243. // 2013-05-19T00:07:24.360 Verbose Deserialized JSON:
  244. // {
  245. // "Name": "Arnie Admin",
  246. // "StartDate": new Date(
  247. // 976623132000
  248. // ),
  249. // "Roles": [
  250. // "Administrator"
  251. // ]
  252. // }
  253. MemoryTraceWriter memoryTraceWriter = (MemoryTraceWriter)traceWriter;
  254. string output = memoryTraceWriter.ToString();
  255. Assert.AreEqual(1058, output.Length);
  256. Assert.AreEqual(7, memoryTraceWriter.GetTraceMessages().Count());
  257. json = StringAssert.Normalize(json);
  258. output = StringAssert.Normalize(output);
  259. Assert.IsTrue(output.Contains(json));
  260. }
  261. [Test]
  262. public void MemoryTraceWriterLimitTest()
  263. {
  264. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  265. for (int i = 0; i < 1005; i++)
  266. {
  267. traceWriter.Trace(TraceLevel.Verbose, (i + 1).ToString(CultureInfo.InvariantCulture), null);
  268. }
  269. IList<string> traceMessages = traceWriter.GetTraceMessages().ToList();
  270. Assert.AreEqual(1000, traceMessages.Count);
  271. Assert.IsTrue(traceMessages.First().EndsWith(" 6"));
  272. Assert.IsTrue(traceMessages.Last().EndsWith(" 1005"));
  273. }
  274. #if !(NET20 || NET35 || NET40 || PORTABLE40 || PORTABLE) || DNXCORE50
  275. [Test]
  276. public async Task MemoryTraceWriterThreadSafety_Trace()
  277. {
  278. List<Task> tasks = new List<Task>();
  279. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  280. for (int i = 0; i < 20; i++)
  281. {
  282. tasks.Add(Task.Run(() =>
  283. {
  284. for (int j = 0; j < 1005; j++)
  285. {
  286. traceWriter.Trace(TraceLevel.Verbose, (j + 1).ToString(CultureInfo.InvariantCulture), null);
  287. }
  288. }));
  289. }
  290. await Task.WhenAll(tasks);
  291. IList<string> traceMessages = traceWriter.GetTraceMessages().ToList();
  292. Assert.AreEqual(1000, traceMessages.Count);
  293. }
  294. [Test]
  295. public async Task MemoryTraceWriterThreadSafety_ToString()
  296. {
  297. List<Task> tasks = new List<Task>();
  298. MemoryTraceWriter traceWriter = new MemoryTraceWriter();
  299. tasks.Add(Task.Run(() =>
  300. {
  301. for (int j = 0; j < 10005; j++)
  302. {
  303. traceWriter.Trace(TraceLevel.Verbose, (j + 1).ToString(CultureInfo.InvariantCulture), null);
  304. }
  305. }));
  306. string s = null;
  307. tasks.Add(Task.Run(() =>
  308. {
  309. for (int j = 0; j < 10005; j++)
  310. {
  311. s = traceWriter.ToString();
  312. }
  313. }));
  314. await Task.WhenAll(tasks);
  315. Assert.IsNotNull(s);
  316. }
  317. #endif
  318. [Test]
  319. public void Serialize()
  320. {
  321. var traceWriter = new InMemoryTraceWriter
  322. {
  323. LevelFilter = TraceLevel.Info
  324. };
  325. string json =
  326. JsonConvert.SerializeObject(
  327. new TraceTestObject
  328. {
  329. StringArray = new[] { "1", "2" },
  330. IntList = new List<int> { 1, 2 },
  331. Version = new Version(1, 2, 3, 4),
  332. StringDictionary =
  333. new Dictionary<string, string>
  334. {
  335. { "1", "!" },
  336. { "Two", "!!" },
  337. { "III", "!!!" }
  338. },
  339. Double = 1.1d
  340. },
  341. new JsonSerializerSettings
  342. {
  343. TraceWriter = traceWriter,
  344. Formatting = Formatting.Indented
  345. });
  346. Assert.AreEqual("Started serializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''.", traceWriter.TraceRecords[0].Message);
  347. Assert.AreEqual("Started serializing System.Collections.Generic.List`1[System.Int32]. Path 'IntList'.", traceWriter.TraceRecords[1].Message);
  348. Assert.AreEqual("Finished serializing System.Collections.Generic.List`1[System.Int32]. Path 'IntList'.", traceWriter.TraceRecords[2].Message);
  349. Assert.AreEqual("Started serializing System.String[]. Path 'StringArray'.", traceWriter.TraceRecords[3].Message);
  350. Assert.AreEqual("Finished serializing System.String[]. Path 'StringArray'.", traceWriter.TraceRecords[4].Message);
  351. Assert.AreEqual("Started serializing System.Version. Path 'Version'.", traceWriter.TraceRecords[5].Message);
  352. Assert.AreEqual("Finished serializing System.Version. Path 'Version'.", traceWriter.TraceRecords[6].Message);
  353. Assert.AreEqual("Started serializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path 'StringDictionary'.", traceWriter.TraceRecords[7].Message);
  354. Assert.AreEqual("Finished serializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path 'StringDictionary'.", traceWriter.TraceRecords[8].Message);
  355. Assert.AreEqual("Finished serializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''.", traceWriter.TraceRecords[9].Message);
  356. Assert.IsFalse(traceWriter.TraceRecords.Any(r => r.Level == TraceLevel.Verbose));
  357. }
  358. [Test]
  359. public void Deserialize()
  360. {
  361. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  362. {
  363. LevelFilter = TraceLevel.Info
  364. };
  365. TraceTestObject o2 = JsonConvert.DeserializeObject<TraceTestObject>(
  366. @"{
  367. ""IntList"": [
  368. 1,
  369. 2
  370. ],
  371. ""StringArray"": [
  372. ""1"",
  373. ""2""
  374. ],
  375. ""Version"": {
  376. ""Major"": 1,
  377. ""Minor"": 2,
  378. ""Build"": 3,
  379. ""Revision"": 4,
  380. ""MajorRevision"": 0,
  381. ""MinorRevision"": 4
  382. },
  383. ""StringDictionary"": {
  384. ""1"": ""!"",
  385. ""Two"": ""!!"",
  386. ""III"": ""!!!""
  387. },
  388. ""Double"": 1.1
  389. }",
  390. new JsonSerializerSettings
  391. {
  392. TraceWriter = traceWriter
  393. });
  394. Assert.AreEqual(2, o2.IntList.Count);
  395. Assert.AreEqual(2, o2.StringArray.Length);
  396. Assert.AreEqual(1, o2.Version.Major);
  397. Assert.AreEqual(2, o2.Version.Minor);
  398. Assert.AreEqual(3, o2.StringDictionary.Count);
  399. Assert.AreEqual(1.1d, o2.Double);
  400. Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path 'IntList', line 2, position 12.", traceWriter.TraceRecords[0].Message);
  401. Assert.AreEqual("Started deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList', line 2, position 14.", traceWriter.TraceRecords[1].Message);
  402. Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Finished deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList'"));
  403. Assert.AreEqual("Started deserializing System.String[]. Path 'StringArray', line 6, position 18.", traceWriter.TraceRecords[3].Message);
  404. Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing System.String[]. Path 'StringArray'"));
  405. Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 12.", traceWriter.TraceRecords[5].Message);
  406. Assert.IsTrue(traceWriter.TraceRecords[6].Message.StartsWith("Started deserializing System.Version. Path 'Version'"));
  407. Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Finished deserializing System.Version. Path 'Version'"));
  408. Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 8.", traceWriter.TraceRecords[8].Message);
  409. Assert.IsTrue(traceWriter.TraceRecords[9].Message.StartsWith("Finished deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary'"));
  410. Assert.IsTrue(traceWriter.TraceRecords[10].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''"));
  411. Assert.IsFalse(traceWriter.TraceRecords.Any(r => r.Level == TraceLevel.Verbose));
  412. }
  413. [Test]
  414. public void Populate()
  415. {
  416. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  417. {
  418. LevelFilter = TraceLevel.Info
  419. };
  420. TraceTestObject o2 = new TraceTestObject();
  421. JsonConvert.PopulateObject(@"{
  422. ""IntList"": [
  423. 1,
  424. 2
  425. ],
  426. ""StringArray"": [
  427. ""1"",
  428. ""2""
  429. ],
  430. ""Version"": {
  431. ""Major"": 1,
  432. ""Minor"": 2,
  433. ""Build"": 3,
  434. ""Revision"": 4,
  435. ""MajorRevision"": 0,
  436. ""MinorRevision"": 4
  437. },
  438. ""StringDictionary"": {
  439. ""1"": ""!"",
  440. ""Two"": ""!!"",
  441. ""III"": ""!!!""
  442. },
  443. ""Double"": 1.1
  444. }",
  445. o2,
  446. new JsonSerializerSettings
  447. {
  448. TraceWriter = traceWriter,
  449. MetadataPropertyHandling = MetadataPropertyHandling.Default
  450. });
  451. Assert.AreEqual(2, o2.IntList.Count);
  452. Assert.AreEqual(2, o2.StringArray.Length);
  453. Assert.AreEqual(1, o2.Version.Major);
  454. Assert.AreEqual(2, o2.Version.Minor);
  455. Assert.AreEqual(3, o2.StringDictionary.Count);
  456. Assert.AreEqual(1.1d, o2.Double);
  457. Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path 'IntList', line 2, position 12.", traceWriter.TraceRecords[0].Message);
  458. Assert.AreEqual("Started deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList', line 2, position 14.", traceWriter.TraceRecords[1].Message);
  459. Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Finished deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList'"));
  460. Assert.AreEqual("Started deserializing System.String[]. Path 'StringArray', line 6, position 18.", traceWriter.TraceRecords[3].Message);
  461. Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing System.String[]. Path 'StringArray'"));
  462. Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Version.Major', line 11, position 12.", traceWriter.TraceRecords[5].Message);
  463. Assert.IsTrue(traceWriter.TraceRecords[6].Message.StartsWith("Started deserializing System.Version. Path 'Version'"));
  464. Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Finished deserializing System.Version. Path 'Version'"));
  465. Assert.AreEqual("Started deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary.1', line 19, position 8.", traceWriter.TraceRecords[8].Message);
  466. Assert.IsTrue(traceWriter.TraceRecords[9].Message.StartsWith("Finished deserializing System.Collections.Generic.IDictionary`2[System.String,System.String]. Path 'StringDictionary'"));
  467. Assert.IsTrue(traceWriter.TraceRecords[10].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path ''"));
  468. Assert.IsFalse(traceWriter.TraceRecords.Any(r => r.Level == TraceLevel.Verbose));
  469. }
  470. [Test]
  471. public void ErrorDeserializing()
  472. {
  473. string json = @"{""Integer"":""hi""}";
  474. var traceWriter = new InMemoryTraceWriter
  475. {
  476. LevelFilter = TraceLevel.Info
  477. };
  478. ExceptionAssert.Throws<Exception>(() =>
  479. {
  480. JsonConvert.DeserializeObject<IntegerTestClass>(
  481. json,
  482. new JsonSerializerSettings
  483. {
  484. TraceWriter = traceWriter
  485. });
  486. }, "Could not convert string to integer: hi. Path 'Integer', line 1, position 15.");
  487. Assert.AreEqual(2, traceWriter.TraceRecords.Count);
  488. Assert.AreEqual(TraceLevel.Info, traceWriter.TraceRecords[0].Level);
  489. Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.IntegerTestClass. Path 'Integer', line 1, position 11.", traceWriter.TraceRecords[0].Message);
  490. Assert.AreEqual(TraceLevel.Error, traceWriter.TraceRecords[1].Level);
  491. Assert.AreEqual("Error deserializing Newtonsoft.Json.Tests.Serialization.IntegerTestClass. Could not convert string to integer: hi. Path 'Integer', line 1, position 15.", traceWriter.TraceRecords[1].Message);
  492. }
  493. [Test]
  494. public void ErrorDeserializingNested()
  495. {
  496. string json = @"{""IntList"":[1, ""two""]}";
  497. var traceWriter = new InMemoryTraceWriter
  498. {
  499. LevelFilter = TraceLevel.Info
  500. };
  501. ExceptionAssert.Throws<Exception>(() =>
  502. {
  503. JsonConvert.DeserializeObject<TraceTestObject>(
  504. json,
  505. new JsonSerializerSettings
  506. {
  507. TraceWriter = traceWriter
  508. });
  509. }, "Could not convert string to integer: two. Path 'IntList[1]', line 1, position 20.");
  510. Assert.AreEqual(3, traceWriter.TraceRecords.Count);
  511. Assert.AreEqual(TraceLevel.Info, traceWriter.TraceRecords[0].Level);
  512. Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.TraceTestObject. Path 'IntList', line 1, position 11.", traceWriter.TraceRecords[0].Message);
  513. Assert.AreEqual(TraceLevel.Info, traceWriter.TraceRecords[1].Level);
  514. Assert.AreEqual("Started deserializing System.Collections.Generic.IList`1[System.Int32]. Path 'IntList', line 1, position 12.", traceWriter.TraceRecords[1].Message);
  515. Assert.AreEqual(TraceLevel.Error, traceWriter.TraceRecords[2].Level);
  516. Assert.AreEqual("Error deserializing System.Collections.Generic.IList`1[System.Int32]. Could not convert string to integer: two. Path 'IntList[1]', line 1, position 20.", traceWriter.TraceRecords[2].Message);
  517. }
  518. [Test]
  519. public void SerializeDictionarysWithPreserveObjectReferences()
  520. {
  521. PreserveReferencesHandlingTests.CircularDictionary circularDictionary = new PreserveReferencesHandlingTests.CircularDictionary();
  522. circularDictionary.Add("other", new PreserveReferencesHandlingTests.CircularDictionary { { "blah", null } });
  523. circularDictionary.Add("self", circularDictionary);
  524. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  525. {
  526. LevelFilter = TraceLevel.Verbose
  527. };
  528. JsonConvert.SerializeObject(
  529. circularDictionary,
  530. Formatting.Indented,
  531. new JsonSerializerSettings
  532. {
  533. PreserveReferencesHandling = PreserveReferencesHandling.All,
  534. TraceWriter = traceWriter
  535. });
  536. Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Writing object reference Id '1' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path ''."));
  537. Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Writing object reference Id '2' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'other'."));
  538. Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Writing object reference to Id '1' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'self'."));
  539. }
  540. [Test]
  541. public void DeserializeDictionarysWithPreserveObjectReferences()
  542. {
  543. string json = @"{
  544. ""$id"": ""1"",
  545. ""other"": {
  546. ""$id"": ""2"",
  547. ""blah"": null
  548. },
  549. ""self"": {
  550. ""$ref"": ""1""
  551. }
  552. }";
  553. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  554. {
  555. LevelFilter = TraceLevel.Verbose
  556. };
  557. JsonConvert.DeserializeObject<PreserveReferencesHandlingTests.CircularDictionary>(json,
  558. new JsonSerializerSettings
  559. {
  560. PreserveReferencesHandling = PreserveReferencesHandling.All,
  561. MetadataPropertyHandling = MetadataPropertyHandling.Default,
  562. TraceWriter = traceWriter
  563. });
  564. Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Read object reference Id '1' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'other', line 3, position 10."));
  565. Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message == "Read object reference Id '2' for Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'other.blah', line 5, position 11."));
  566. Assert.IsTrue(traceWriter.TraceRecords.Any(r => r.Message.StartsWith("Resolved object reference '1' to Newtonsoft.Json.Tests.Serialization.PreserveReferencesHandlingTests+CircularDictionary. Path 'self'")));
  567. }
  568. [Test]
  569. public void WriteTypeNameForObjects()
  570. {
  571. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  572. {
  573. LevelFilter = TraceLevel.Verbose
  574. };
  575. IList<object> l = new List<object>
  576. {
  577. new Dictionary<string, string> { { "key!", "value!" } },
  578. new Version(1, 2, 3, 4)
  579. };
  580. JsonConvert.SerializeObject(l, Formatting.Indented, new JsonSerializerSettings
  581. {
  582. TypeNameHandling = TypeNameHandling.All,
  583. TraceWriter = traceWriter
  584. });
  585. Assert.AreEqual("Started serializing System.Collections.Generic.List`1[System.Object]. Path ''.", traceWriter.TraceRecords[0].Message);
  586. Assert.AreEqual("Writing type name '" + ReflectionUtils.GetTypeName(typeof(List<object>), 0, DefaultSerializationBinder.Instance) + "' for System.Collections.Generic.List`1[System.Object]. Path ''.", traceWriter.TraceRecords[1].Message);
  587. Assert.AreEqual("Started serializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values'.", traceWriter.TraceRecords[2].Message);
  588. Assert.AreEqual("Writing type name '" + ReflectionUtils.GetTypeName(typeof(Dictionary<string, string>), 0, DefaultSerializationBinder.Instance) + "' for System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0]'.", traceWriter.TraceRecords[3].Message);
  589. Assert.AreEqual("Finished serializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0]'.", traceWriter.TraceRecords[4].Message);
  590. Assert.AreEqual("Started serializing System.Version. Path '$values[0]'.", traceWriter.TraceRecords[5].Message);
  591. Assert.AreEqual("Writing type name '" + ReflectionUtils.GetTypeName(typeof(Version), 0, DefaultSerializationBinder.Instance) + "' for System.Version. Path '$values[1]'.", traceWriter.TraceRecords[6].Message);
  592. Assert.AreEqual("Finished serializing System.Version. Path '$values[1]'.", traceWriter.TraceRecords[7].Message);
  593. Assert.AreEqual("Finished serializing System.Collections.Generic.List`1[System.Object]. Path ''.", traceWriter.TraceRecords[8].Message);
  594. }
  595. [Test]
  596. public void SerializeConverter()
  597. {
  598. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  599. {
  600. LevelFilter = TraceLevel.Verbose
  601. };
  602. IList<DateTime> d = new List<DateTime>
  603. {
  604. new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc)
  605. };
  606. string json = JsonConvert.SerializeObject(d, Formatting.Indented, new JsonSerializerSettings
  607. {
  608. Converters = { new JavaScriptDateTimeConverter() },
  609. TraceWriter = traceWriter
  610. });
  611. Assert.AreEqual("Started serializing System.Collections.Generic.List`1[System.DateTime]. Path ''.", traceWriter.TraceRecords[0].Message);
  612. Assert.AreEqual("Started serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path ''.", traceWriter.TraceRecords[1].Message);
  613. Assert.AreEqual("Finished serializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path '[0]'.", traceWriter.TraceRecords[2].Message);
  614. Assert.AreEqual("Finished serializing System.Collections.Generic.List`1[System.DateTime]. Path ''.", traceWriter.TraceRecords[3].Message);
  615. }
  616. [Test]
  617. public void DeserializeConverter()
  618. {
  619. string json = @"[new Date(976623132000)]";
  620. InMemoryTraceWriter traceWriter =
  621. new InMemoryTraceWriter
  622. {
  623. LevelFilter = TraceLevel.Verbose
  624. };
  625. JsonConvert.DeserializeObject<List<DateTime>>(
  626. json,
  627. new JsonSerializerSettings
  628. {
  629. Converters = { new JavaScriptDateTimeConverter() },
  630. TraceWriter = traceWriter
  631. });
  632. Assert.AreEqual("Started deserializing System.Collections.Generic.List`1[System.DateTime]. Path '', line 1, position 1.", traceWriter.TraceRecords[0].Message);
  633. Assert.AreEqual("Started deserializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path '[0]', line 1, position 10.", traceWriter.TraceRecords[1].Message);
  634. Assert.AreEqual("Finished deserializing System.DateTime with converter Newtonsoft.Json.Converters.JavaScriptDateTimeConverter. Path '[0]', line 1, position 23.", traceWriter.TraceRecords[2].Message);
  635. Assert.AreEqual("Finished deserializing System.Collections.Generic.List`1[System.DateTime]. Path '', line 1, position 24.", traceWriter.TraceRecords[3].Message);
  636. }
  637. [Test]
  638. public void DeserializeTypeName()
  639. {
  640. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  641. {
  642. LevelFilter = TraceLevel.Verbose
  643. };
  644. string json = @"{
  645. ""$type"": ""System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib"",
  646. ""$values"": [
  647. {
  648. ""$type"": ""System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib"",
  649. ""key!"": ""value!""
  650. },
  651. {
  652. ""$type"": ""System.Version, mscorlib"",
  653. ""Major"": 1,
  654. ""Minor"": 2,
  655. ""Build"": 3,
  656. ""Revision"": 4,
  657. ""MajorRevision"": 0,
  658. ""MinorRevision"": 4
  659. }
  660. ]
  661. }";
  662. JsonConvert.DeserializeObject(json, null, new JsonSerializerSettings
  663. {
  664. TypeNameHandling = TypeNameHandling.All,
  665. MetadataPropertyHandling = MetadataPropertyHandling.Default,
  666. TraceWriter = traceWriter
  667. });
  668. Assert.AreEqual("Resolved type 'System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib' to System.Collections.Generic.List`1[System.Object]. Path '$type', line 2, position 83.", traceWriter.TraceRecords[0].Message);
  669. Assert.AreEqual("Started deserializing System.Collections.Generic.List`1[System.Object]. Path '$values', line 3, position 14.", traceWriter.TraceRecords[1].Message);
  670. Assert.AreEqual("Resolved type 'System.Collections.Generic.Dictionary`2[[System.String, mscorlib],[System.String, mscorlib]], mscorlib' to System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0].$type', line 5, position 119.", traceWriter.TraceRecords[2].Message);
  671. Assert.AreEqual("Started deserializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0].key!', line 6, position 13.", traceWriter.TraceRecords[3].Message);
  672. Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing System.Collections.Generic.Dictionary`2[System.String,System.String]. Path '$values[0]'"));
  673. Assert.AreEqual("Resolved type 'System.Version, mscorlib' to System.Version. Path '$values[1].$type', line 9, position 41.", traceWriter.TraceRecords[5].Message);
  674. Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path '$values[1].Major', line 10, position 14.", traceWriter.TraceRecords[6].Message);
  675. Assert.IsTrue(traceWriter.TraceRecords[7].Message.StartsWith("Started deserializing System.Version. Path '$values[1]'"));
  676. Assert.IsTrue(traceWriter.TraceRecords[8].Message.StartsWith("Finished deserializing System.Version. Path '$values[1]'"));
  677. Assert.IsTrue(traceWriter.TraceRecords[9].Message.StartsWith("Finished deserializing System.Collections.Generic.List`1[System.Object]. Path '$values'"));
  678. }
  679. #if !(PORTABLE || DNXCORE50 || PORTABLE40)
  680. [Test]
  681. public void DeserializeISerializable()
  682. {
  683. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  684. {
  685. LevelFilter = TraceLevel.Verbose
  686. };
  687. ExceptionAssert.Throws<SerializationException>(() =>
  688. {
  689. JsonConvert.DeserializeObject<Exception>(
  690. "{}",
  691. new JsonSerializerSettings
  692. {
  693. TraceWriter = traceWriter
  694. });
  695. }, "Member 'ClassName' was not found.");
  696. Assert.IsTrue(traceWriter.TraceRecords[0].Message.StartsWith("Deserializing System.Exception using ISerializable constructor. Path ''"));
  697. Assert.AreEqual(TraceLevel.Info, traceWriter.TraceRecords[0].Level);
  698. Assert.AreEqual("Error deserializing System.Exception. Member 'ClassName' was not found. Path '', line 1, position 2.", traceWriter.TraceRecords[1].Message);
  699. Assert.AreEqual(TraceLevel.Error, traceWriter.TraceRecords[1].Level);
  700. }
  701. #endif
  702. [Test]
  703. public void DeserializeMissingMember()
  704. {
  705. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  706. {
  707. LevelFilter = TraceLevel.Verbose
  708. };
  709. JsonConvert.DeserializeObject<Person>(
  710. "{'MissingMemberProperty':'!!'}",
  711. new JsonSerializerSettings
  712. {
  713. TraceWriter = traceWriter
  714. });
  715. Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.TestObjects.Organization.Person. Path 'MissingMemberProperty', line 1, position 25.", traceWriter.TraceRecords[0].Message);
  716. Assert.AreEqual("Could not find member 'MissingMemberProperty' on Newtonsoft.Json.Tests.TestObjects.Organization.Person. Path 'MissingMemberProperty', line 1, position 25.", traceWriter.TraceRecords[1].Message);
  717. Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.TestObjects.Organization.Person. Path ''"));
  718. }
  719. [Test]
  720. public void DeserializeMissingMemberConstructor()
  721. {
  722. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  723. {
  724. LevelFilter = TraceLevel.Verbose
  725. };
  726. string json = @"{
  727. ""Major"": 1,
  728. ""Minor"": 2,
  729. ""Build"": 3,
  730. ""Revision"": 4,
  731. ""MajorRevision"": 0,
  732. ""MinorRevision"": 4,
  733. ""MissingMemberProperty"": null
  734. }";
  735. JsonConvert.DeserializeObject<Version>(json, new JsonSerializerSettings
  736. {
  737. TraceWriter = traceWriter
  738. });
  739. Assert.AreEqual("Deserializing System.Version using creator with parameters: Major, Minor, Build, Revision. Path 'Major', line 2, position 10.", traceWriter.TraceRecords[0].Message);
  740. Assert.AreEqual("Could not find member 'MissingMemberProperty' on System.Version. Path 'MissingMemberProperty', line 8, position 31.", traceWriter.TraceRecords[1].Message);
  741. Assert.IsTrue(traceWriter.TraceRecords[2].Message.StartsWith("Started deserializing System.Version. Path ''"));
  742. Assert.IsTrue(traceWriter.TraceRecords[3].Message.StartsWith("Finished deserializing System.Version. Path ''"));
  743. }
  744. [Test]
  745. public void PublicParameterizedConstructorWithPropertyNameConflictWithAttribute()
  746. {
  747. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  748. {
  749. LevelFilter = TraceLevel.Verbose
  750. };
  751. string json = @"{name:""1""}";
  752. PublicParameterizedConstructorWithPropertyNameConflictWithAttribute c = JsonConvert.DeserializeObject<PublicParameterizedConstructorWithPropertyNameConflictWithAttribute>(json, new JsonSerializerSettings
  753. {
  754. TraceWriter = traceWriter
  755. });
  756. Assert.IsNotNull(c);
  757. Assert.AreEqual(1, c.Name);
  758. Assert.AreEqual("Deserializing Newtonsoft.Json.Tests.TestObjects.PublicParameterizedConstructorWithPropertyNameConflictWithAttribute using creator with parameters: name. Path 'name', line 1, position 6.", traceWriter.TraceRecords[0].Message);
  759. }
  760. [Test]
  761. public void ShouldSerializeTestClass()
  762. {
  763. ShouldSerializeTestClass c = new ShouldSerializeTestClass();
  764. c.Age = 29;
  765. c.Name = "Jim";
  766. c._shouldSerializeName = true;
  767. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  768. {
  769. LevelFilter = TraceLevel.Verbose
  770. };
  771. JsonConvert.SerializeObject(c, new JsonSerializerSettings { TraceWriter = traceWriter });
  772. Assert.AreEqual("ShouldSerialize result for property 'Name' on Newtonsoft.Json.Tests.Serialization.ShouldSerializeTestClass: True. Path ''.", traceWriter.TraceRecords[1].Message);
  773. Assert.AreEqual(TraceLevel.Verbose, traceWriter.TraceRecords[1].Level);
  774. traceWriter = new InMemoryTraceWriter
  775. {
  776. LevelFilter = TraceLevel.Verbose
  777. };
  778. c._shouldSerializeName = false;
  779. JsonConvert.SerializeObject(c, new JsonSerializerSettings { TraceWriter = traceWriter });
  780. Assert.AreEqual("ShouldSerialize result for property 'Name' on Newtonsoft.Json.Tests.Serialization.ShouldSerializeTestClass: False. Path ''.", traceWriter.TraceRecords[1].Message);
  781. Assert.AreEqual(TraceLevel.Verbose, traceWriter.TraceRecords[1].Level);
  782. }
  783. [Test]
  784. public void SpecifiedTest()
  785. {
  786. SpecifiedTestClass c = new SpecifiedTestClass();
  787. c.Name = "James";
  788. c.Age = 27;
  789. c.NameSpecified = false;
  790. InMemoryTraceWriter traceWriter = new InMemoryTraceWriter
  791. {
  792. LevelFilter = TraceLevel.Verbose
  793. };
  794. string json = JsonConvert.SerializeObject(c, Formatting.Indented, new JsonSerializerSettings { TraceWriter = traceWriter });
  795. Assert.AreEqual("Started serializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path ''.", traceWriter.TraceRecords[0].Message);
  796. Assert.AreEqual("IsSpecified result for property 'Name' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass: False. Path ''.", traceWriter.TraceRecords[1].Message);
  797. Assert.AreEqual("IsSpecified result for property 'Weight' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass: False. Path 'Age'.", traceWriter.TraceRecords[2].Message);
  798. Assert.AreEqual("IsSpecified result for property 'Height' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass: False. Path 'Age'.", traceWriter.TraceRecords[3].Message);
  799. Assert.AreEqual("IsSpecified result for property 'FavoriteNumber' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass: False. Path 'Age'.", traceWriter.TraceRecords[4].Message);
  800. Assert.AreEqual("Finished serializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path ''.", traceWriter.TraceRecords[5].Message);
  801. StringAssert.AreEqual(@"{
  802. ""Age"": 27
  803. }", json);
  804. traceWriter = new InMemoryTraceWriter
  805. {
  806. LevelFilter = TraceLevel.Verbose
  807. };
  808. SpecifiedTestClass deserialized = JsonConvert.DeserializeObject<SpecifiedTestClass>(json, new JsonSerializerSettings { TraceWriter = traceWriter });
  809. Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path 'Age', line 2, position 8.", traceWriter.TraceRecords[0].Message);
  810. Assert.IsTrue(traceWriter.TraceRecords[1].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path ''"));
  811. Assert.IsNull(deserialized.Name);
  812. Assert.IsFalse(deserialized.NameSpecified);
  813. Assert.IsFalse(deserialized.WeightSpecified);
  814. Assert.IsFalse(deserialized.HeightSpecified);
  815. Assert.IsFalse(deserialized.FavoriteNumberSpecified);
  816. Assert.AreEqual(27, deserialized.Age);
  817. c.NameSpecified = true;
  818. c.WeightSpecified = true;
  819. c.HeightSpecified = true;
  820. c.FavoriteNumber = 23;
  821. json = JsonConvert.SerializeObject(c, Formatting.Indented);
  822. StringAssert.AreEqual(@"{
  823. ""Name"": ""James"",
  824. ""Age"": 27,
  825. ""Weight"": 0,
  826. ""Height"": 0,
  827. ""FavoriteNumber"": 23
  828. }", json);
  829. traceWriter = new InMemoryTraceWriter
  830. {
  831. LevelFilter = TraceLevel.Verbose
  832. };
  833. deserialized = JsonConvert.DeserializeObject<SpecifiedTestClass>(json, new JsonSerializerSettings { TraceWriter = traceWriter });
  834. Assert.AreEqual("Started deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path 'Name', line 2, position 9.", traceWriter.TraceRecords[0].Message);
  835. Assert.AreEqual("IsSpecified for property 'Name' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Name', line 2, position 17.", traceWriter.TraceRecords[1].Message);
  836. Assert.AreEqual("IsSpecified for property 'Weight' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Weight', line 4, position 13.", traceWriter.TraceRecords[2].Message);
  837. Assert.AreEqual("IsSpecified for property 'Height' on Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass set to true. Path 'Height', line 5, position 13.", traceWriter.TraceRecords[3].Message);
  838. Assert.IsTrue(traceWriter.TraceRecords[4].Message.StartsWith("Finished deserializing Newtonsoft.Json.Tests.Serialization.SpecifiedTestClass. Path ''"));
  839. Assert.AreEqual("James", deserialized.Name);
  840. Assert.IsTrue(deserialized.NameSpecified);
  841. Assert.IsTrue(deserialized.WeightSpecified);
  842. Assert.IsTrue(deserialized.HeightSpecified);
  843. Assert.IsTrue(deserialized.FavoriteNumberSpecified);
  844. Assert.AreEqual(27, deserialized.Age);
  845. Assert.AreEqual(23, deserialized.FavoriteNumber);
  846. }
  847. #if !(NET20 || NET35 || PORTABLE || PORTABLE40) || NETSTANDARD1_3
  848. [Test]
  849. public void TraceJsonWriterTest()
  850. {
  851. StringWriter sw = new StringWriter(CultureInfo.InvariantCulture);
  852. JsonTextWriter w = new JsonTextWriter(sw);
  853. TraceJsonWriter traceWriter = new TraceJsonWriter(w);
  854. traceWriter.WriteStartObject();
  855. traceWriter.WritePropertyName("Array");
  856. traceWriter.WriteStartArray();
  857. traceWriter.WriteValue("String!");
  858. traceWriter.WriteValue(new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc));
  859. traceWriter.WriteValue(new DateTimeOffset(2000, 12, 12, 12, 12, 12, TimeSpan.FromHours(2)));
  860. traceWriter.WriteValue(1.1f);
  861. traceWriter.WriteValue(1.1d);
  862. traceWriter.WriteValue(1.1m);
  863. traceWriter.WriteValue(1);
  864. traceWriter.WriteValue((char)'!');
  865. traceWriter.WriteValue((short)1);
  866. traceWriter.WriteValue((ushort)1);
  867. traceWriter.WriteValue((int)1);
  868. traceWriter.WriteValue((uint)1);
  869. traceWriter.WriteValue((sbyte)1);
  870. traceWriter.WriteValue((byte)1);
  871. traceWriter.WriteValue((long)1);
  872. traceWriter.WriteValue((ulong)1);
  873. traceWriter.WriteValue((bool)true);
  874. traceWriter.WriteValue((DateTime?)new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc));
  875. traceWriter.WriteValue((DateTimeOffset?)new DateTimeOffset(2000, 12, 12, 12, 12, 12, TimeSpan.FromHours(2)));
  876. traceWriter.WriteValue((float?)1.1f);
  877. traceWriter.WriteValue((double?)1.1d);
  878. traceWriter.WriteValue((decimal?)1.1m);
  879. traceWriter.WriteValue((int?)1);
  880. traceWriter.WriteValue((char?)'!');
  881. traceWriter.WriteValue((short?)1);
  882. traceWriter.WriteValue((ushort?)1);
  883. traceWriter.WriteValue((int?)1);
  884. traceWriter.WriteValue((uint?)1);
  885. traceWriter.WriteValue((sbyte?)1);
  886. traceWriter.WriteValue((byte?)1);
  887. traceWriter.WriteValue((long?)1);
  888. traceWriter.WriteValue((ulong?)1);
  889. traceWriter.WriteValue((bool?)true);
  890. traceWriter.WriteValue(BigInteger.Parse("9999999990000000000000000000000000000000000"));
  891. traceWriter.WriteValue((object)true);
  892. traceWriter.WriteValue(TimeSpan.FromMinutes(1));
  893. traceWriter.WriteValue(Guid.Empty);
  894. traceWriter.WriteValue(new Uri("http://www.google.com/"));
  895. traceWriter.WriteValue(Encoding.UTF8.GetBytes("String!"));
  896. traceWriter.WriteRawValue("[1],");
  897. traceWriter.WriteRaw("[2]");
  898. traceWriter.WriteNull();
  899. traceWriter.WriteUndefined();
  900. traceWriter.WriteStartConstructor("ctor");
  901. traceWriter.WriteValue(1);
  902. traceWriter.WriteEndConstructor();
  903. traceWriter.WriteComment("A comment");
  904. traceWriter.WriteWhitespace(" ");
  905. traceWriter.WriteEnd();
  906. traceWriter.WriteEndObject();
  907. traceWriter.Flush();
  908. traceWriter.Close();
  909. string json = @"{
  910. ""Array"": [
  911. ""String!"",
  912. ""2000-12-12T12:12:12Z"",
  913. ""2000-12-12T12:12:12+02:00"",
  914. 1.1,
  915. 1.1,
  916. 1.1,
  917. 1,
  918. ""!"",
  919. 1,
  920. 1,
  921. 1,
  922. 1,
  923. 1,
  924. 1,
  925. 1,
  926. 1,
  927. true,
  928. ""2000-12-12T12:12:12Z"",
  929. ""2000-12-12T12:12:12+02:00"",
  930. 1.1,
  931. 1.1,
  932. 1.1,
  933. 1,
  934. ""!"",
  935. 1,
  936. 1,
  937. 1,
  938. 1,
  939. 1,
  940. 1,
  941. 1,
  942. 1,
  943. true,
  944. 9999999990000000000000000000000000000000000,
  945. true,
  946. true,
  947. ""00:01:00"",
  948. ""00000000-0000-0000-0000-000000000000"",
  949. ""http://www.google.com/"",
  950. ""U3RyaW5nIQ=="",
  951. [1],[2],
  952. null,
  953. undefined,
  954. new ctor(
  955. 1
  956. )
  957. /*A comment*/
  958. ]
  959. }";
  960. StringAssert.AreEqual("Serialized JSON: " + Environment.NewLine + json, traceWriter.GetSerializedJsonMessage());
  961. }
  962. [Test]
  963. public void TraceJsonReaderTest()
  964. {
  965. string json = @"{
  966. ""Array"": [
  967. ""String!"",
  968. ""2000-12-12T12:12:12Z"",
  969. ""2000-12-12T12:12:12Z"",
  970. ""2000-12-12T12:12:12+00:00"",
  971. ""U3RyaW5nIQ=="",
  972. 1,
  973. 1.1,
  974. 1.2,
  975. 9999999990000000000000000000000000000000000,
  976. null,
  977. undefined,
  978. new ctor(
  979. 1
  980. )
  981. /*A comment*/
  982. ]
  983. }";
  984. StringReader sw = new StringReader(json);
  985. JsonTextReader w = new JsonTextReader(sw);
  986. TraceJsonReader traceReader = new TraceJsonReader(w);
  987. traceReader.Read();
  988. Assert.AreEqual(JsonToken.StartObject, traceReader.TokenType);
  989. traceReader.Read();
  990. Assert.AreEqual(JsonToken.PropertyName, traceReader.TokenType);
  991. Assert.AreEqual("Array", traceReader.Value);
  992. traceReader.Read();
  993. Assert.AreEqual(JsonToken.StartArray, traceReader.TokenType);
  994. Assert.AreEqual(null, traceReader.Value);
  995. traceReader.ReadAsString();
  996. Assert.AreEqual(JsonToken.String, traceReader.TokenType);
  997. Assert.AreEqual('"', traceReader.QuoteChar);
  998. Assert.AreEqual("String!", traceReader.Value);
  999. // for great code coverage justice!
  1000. traceReader.QuoteChar = '\'';
  1001. Assert.AreEqual('\'', traceReader.QuoteChar);
  1002. traceReader.ReadAsString();
  1003. Assert.AreEqual(JsonToken.String, traceReader.TokenType);
  1004. Assert.AreEqual("2000-12-12T12:12:12Z", traceReader.Value);
  1005. traceReader.ReadAsDateTime();
  1006. Assert.AreEqual(JsonToken.Date, traceReader.TokenType);
  1007. Assert.AreEqual(new DateTime(2000, 12, 12, 12, 12, 12, DateTimeKind.Utc), traceReader.Value);
  1008. traceReader.ReadAsDateTimeOffset();
  1009. Assert.AreEqual(JsonToken.Date, traceReader.TokenType);
  1010. Assert.AreEqual(new DateTimeOffset(2000, 12, 12, 12, 12, 12, TimeSpan.Zero), traceReader.Value);
  1011. traceReader.ReadAsBytes();
  1012. Assert.AreEqual(JsonToken.Bytes, traceReader.TokenType);
  1013. CollectionAssert.AreEqual(Encoding.UTF8.GetBytes("String!"), (byte[])traceReader.Value);
  1014. traceReader.ReadAsInt32();
  1015. Assert.AreEqual(JsonToken.Integer, traceReader.TokenType);
  1016. Assert.AreEqual(1, traceReader.Value);
  1017. traceReader.ReadAsDecimal();
  1018. Assert.AreEqual(JsonToken.Float, traceReader.TokenType);
  1019. Assert.AreEqual(1.1m, traceReader.Value);
  1020. traceReader.ReadAsDouble();
  1021. Assert.AreEqual(JsonToken.Float, traceReader.TokenType);
  1022. Assert.AreEqual(1.2d, traceReader.Value);
  1023. traceReader.Read();
  1024. Assert.AreEqual(JsonToken.Integer, traceReader.TokenType);
  1025. Assert.AreEqual(typeof(BigInteger), traceReader.ValueType);
  1026. Assert.AreEqual(BigInteger.Parse("9999999990000000000000000000000000000000000"), traceReader.Value);
  1027. traceReader.Read();
  1028. Assert.AreEqual(JsonToken.Null, traceReader.TokenType);
  1029. traceReader.Read();
  1030. Assert.AreEqual(JsonToken.Undefined, traceReader.TokenType);
  1031. traceReader.Read();
  1032. Assert.AreEqual(JsonToken.StartConstructor, traceReader.TokenType);
  1033. traceReader.Read();
  1034. Assert.AreEqual(JsonToken.Integer, traceReader.TokenType);
  1035. Assert.AreEqual(1L, traceReader.Value);
  1036. traceReader.Read();
  1037. Assert.AreEqual(JsonToken.EndConstructor, traceReader.TokenType);
  1038. traceReader.Read();
  1039. Assert.AreEqual(JsonToken.Comment, traceReader.TokenType);
  1040. Assert.AreEqual("A comment", traceReader.Value);
  1041. traceReader.Read();
  1042. Assert.AreEqual(JsonToken.EndArray, traceReader.TokenType);
  1043. traceReader.Read();
  1044. Assert.AreEqual(JsonToken.EndObject, traceReader.TokenType);
  1045. Assert.IsFalse(traceReader.Read());
  1046. traceReader.Close();
  1047. StringAssert.AreEqual("Deserialized JSON: " + Environment.NewLine + json, traceReader.GetDeserializedJsonMessage());
  1048. }
  1049. #endif
  1050. }
  1051. public class TraceRecord
  1052. {
  1053. public string Message { get; set; }
  1054. public TraceLevel Level { get; set; }
  1055. public Exception Exception { get; set; }
  1056. public override string ToString()
  1057. {
  1058. return Level + " - " + Message;
  1059. }
  1060. }
  1061. public class InMemoryTraceWriter : ITraceWriter
  1062. {
  1063. public TraceLevel LevelFilter { get; set; }
  1064. public IList<TraceRecord> TraceRecords { get; set; }
  1065. public InMemoryTraceWriter()
  1066. {
  1067. LevelFilter = TraceLevel.Verbose;
  1068. TraceRecords = new List<TraceRecord>();
  1069. }
  1070. public void Trace(TraceLevel level, string message, Exception ex)
  1071. {
  1072. TraceRecords.Add(
  1073. new TraceRecord
  1074. {
  1075. Level = level,
  1076. Message = message,
  1077. Exception = ex
  1078. });
  1079. }
  1080. public override string ToString()
  1081. {
  1082. StringBuilder sb = new StringBuilder();
  1083. foreach (var traceRecord in TraceRecords)
  1084. {
  1085. sb.AppendLine(traceRecord.Message);
  1086. }
  1087. return sb.ToString();
  1088. }
  1089. }
  1090. public class TraceTestObject
  1091. {
  1092. public IList<int> IntList { get; set; }
  1093. public string[] StringArray { get; set; }
  1094. public Version Version { get; set; }
  1095. public IDictionary<string, string> StringDictionary { get; set; }
  1096. public double Double { get; set; }
  1097. }
  1098. public class IntegerTestClass
  1099. {
  1100. public int Integer { get; set; }
  1101. }
  1102. }