PageRenderTime 58ms CodeModel.GetById 26ms RepoModel.GetById 0ms app.codeStats 0ms

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

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