JsonReaderTest.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883
  1. //
  2. // JsonReaderTest.cs
  3. //
  4. // Author:
  5. // Atsushi Enomoto <[email protected]>
  6. //
  7. // Copyright (C) 2007 Novell, Inc (http://www.novell.com)
  8. // Copyright 2014 Xamarin Inc. (http://www.xamarin.com)
  9. //
  10. // Permission is hereby granted, free of charge, to any person obtaining
  11. // a copy of this software and associated documentation files (the
  12. // "Software"), to deal in the Software without restriction, including
  13. // without limitation the rights to use, copy, modify, merge, publish,
  14. // distribute, sublicense, and/or sell copies of the Software, and to
  15. // permit persons to whom the Software is furnished to do so, subject to
  16. // the following conditions:
  17. //
  18. // The above copyright notice and this permission notice shall be
  19. // included in all copies or substantial portions of the Software.
  20. //
  21. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  22. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  23. // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  24. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  25. // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  26. // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  27. // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  28. //
  29. using System;
  30. using System.Collections.Generic;
  31. using System.Globalization;
  32. using System.IO;
  33. using System.Runtime.Serialization.Json;
  34. using System.Text;
  35. using System.Threading;
  36. using System.Xml;
  37. using NUnit.Framework;
  38. namespace MonoTests.System.Runtime.Serialization.Json
  39. {
  40. [TestFixture]
  41. public class JsonReaderTest
  42. {
  43. XmlDictionaryReader reader;
  44. Stream GetInput (string s)
  45. {
  46. return new MemoryStream (Encoding.ASCII.GetBytes (s));
  47. }
  48. XmlDictionaryReader CreateReader (string s)
  49. {
  50. return JsonReaderWriterFactory.CreateJsonReader (GetInput (s), new XmlDictionaryReaderQuotas ());
  51. }
  52. void AssertNode (int depth, string localName, XmlNodeType nodeType, string value, string type, XmlDictionaryReader reader, string label)
  53. {
  54. Assert.AreEqual (localName, reader.LocalName, label + ".LocalName");
  55. Assert.AreEqual (nodeType, reader.NodeType, label + ".NodeType");
  56. Assert.AreEqual (value, reader.Value, label + ".Value");
  57. Assert.AreEqual (type, reader.GetAttribute ("type"), label + ".GetAttribute('type')");
  58. }
  59. // Constructors
  60. [Test]
  61. [ExpectedException (typeof (ArgumentNullException))]
  62. public void ConstructorNullBytes ()
  63. {
  64. JsonReaderWriterFactory.CreateJsonReader ((byte []) null, new XmlDictionaryReaderQuotas ());
  65. }
  66. [Test]
  67. [ExpectedException (typeof (ArgumentNullException))]
  68. public void ConstructorNullStream ()
  69. {
  70. JsonReaderWriterFactory.CreateJsonReader ((Stream) null, new XmlDictionaryReaderQuotas ());
  71. }
  72. [Test]
  73. [ExpectedException (typeof (ArgumentNullException))]
  74. public void ConstructorNullReaderQuotas ()
  75. {
  76. JsonReaderWriterFactory.CreateJsonReader (GetInput ("{}"), null);
  77. }
  78. [Test]
  79. public void ConstructorNullEncodingAndReaderClose ()
  80. {
  81. JsonReaderWriterFactory.CreateJsonReader (GetInput ("{}"), null, new XmlDictionaryReaderQuotas (), null);
  82. }
  83. // Close()
  84. [Test]
  85. public void CloseTwice ()
  86. {
  87. reader = CreateReader ("{}");
  88. reader.Close ();
  89. reader.Close ();
  90. }
  91. [Test]
  92. // hmm... [ExpectedException (typeof (InvalidOperationException))]
  93. public void CloseAndRead ()
  94. {
  95. reader = CreateReader ("{}");
  96. reader.Close ();
  97. reader.Read ();
  98. }
  99. [Test]
  100. // hmm... [ExpectedException (typeof (InvalidOperationException))]
  101. public void CloseAndMoveToFirstAttribute ()
  102. {
  103. reader = CreateReader ("{}");
  104. reader.Close ();
  105. reader.MoveToFirstAttribute ();
  106. }
  107. // Read() several top-level types
  108. [Test]
  109. public void ReadStateEmpty ()
  110. {
  111. reader = CreateReader ("");
  112. Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
  113. reader.Read ();
  114. Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#2");
  115. reader.Close ();
  116. Assert.AreEqual (ReadState.Closed, reader.ReadState, "#3");
  117. }
  118. [Test]
  119. public void ReadStateEmpty2 ()
  120. {
  121. reader = CreateReader (" ");
  122. Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
  123. reader.Read ();
  124. Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#2");
  125. reader.Close ();
  126. Assert.AreEqual (ReadState.Closed, reader.ReadState, "#3");
  127. }
  128. [Test]
  129. public void ReadStateObject ()
  130. {
  131. reader = CreateReader ("{}");
  132. Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
  133. reader.Read (); // element
  134. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
  135. reader.Read (); // endelement
  136. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
  137. reader.Read (); // endoffile
  138. Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#4");
  139. reader.Close ();
  140. Assert.AreEqual (ReadState.Closed, reader.ReadState, "#5");
  141. }
  142. [Test]
  143. public void ReadStateArray ()
  144. {
  145. reader = CreateReader ("[]");
  146. Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
  147. reader.Read (); // element
  148. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
  149. reader.Read (); // endelement
  150. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
  151. reader.Read (); // endoffile
  152. Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#4");
  153. reader.Close ();
  154. Assert.AreEqual (ReadState.Closed, reader.ReadState, "#5");
  155. }
  156. [Test]
  157. public void ReadNumber ()
  158. {
  159. reader = CreateReader ("1234");
  160. Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
  161. reader.Read (); // dummy root element
  162. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
  163. Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "#2-1");
  164. Assert.AreEqual ("root", reader.LocalName, "#2-2");
  165. reader.Read (); // content (number)
  166. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
  167. Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "#3-1");
  168. Assert.AreEqual ("1234", reader.Value, "#3-2");
  169. reader.Read (); // endelement
  170. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#4");
  171. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#4-1");
  172. reader.Read (); // endoffile
  173. Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#5");
  174. reader.Close ();
  175. Assert.AreEqual (ReadState.Closed, reader.ReadState, "#6");
  176. }
  177. [Test]
  178. public void ReadBool ()
  179. {
  180. reader = CreateReader ("true");
  181. Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
  182. reader.Read (); // dummy root element
  183. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
  184. Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "#2-1");
  185. Assert.AreEqual ("root", reader.LocalName, "#2-2");
  186. Assert.AreEqual ("boolean", reader.GetAttribute ("type"), "#2-3");
  187. reader.Read (); // content (boolean)
  188. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
  189. Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "#3-1");
  190. Assert.AreEqual ("true", reader.Value, "#3-2");
  191. reader.Read (); // endelement
  192. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#4");
  193. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#4-1");
  194. reader.Read (); // endoffile
  195. Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#5");
  196. reader.Close ();
  197. Assert.AreEqual (ReadState.Closed, reader.ReadState, "#6");
  198. }
  199. [Test]
  200. public void ReadNull ()
  201. {
  202. reader = CreateReader ("null");
  203. Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
  204. reader.Read (); // dummy root element
  205. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
  206. Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "#2-1");
  207. Assert.AreEqual ("root", reader.LocalName, "#2-2");
  208. // When it is null, the value is never given and the reader is skipped to the end element.
  209. reader.Read (); // endlement
  210. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
  211. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#3-1");
  212. reader.Read (); // endoffile
  213. Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#4");
  214. reader.Close ();
  215. Assert.AreEqual (ReadState.Closed, reader.ReadState, "#4");
  216. }
  217. [Test]
  218. public void ReadString ()
  219. {
  220. reader = CreateReader ("\"true\"");
  221. Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
  222. reader.Read (); // dummy root element
  223. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
  224. Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "#2-1");
  225. Assert.AreEqual ("root", reader.LocalName, "#2-2");
  226. Assert.AreEqual ("string", reader.GetAttribute ("type"), "#2-3");
  227. reader.Read (); // content (number)
  228. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
  229. Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "#3-1");
  230. Assert.AreEqual ("true", reader.Value, "#3-2");
  231. reader.Read (); // endelement
  232. Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#4");
  233. Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#4-1");
  234. reader.Read (); // endoffile
  235. Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#5");
  236. reader.Close ();
  237. Assert.AreEqual (ReadState.Closed, reader.ReadState, "#6");
  238. }
  239. // MoveToAttribute() / MoveToElement()
  240. [Test]
  241. public void MoveToAttributeObject ()
  242. {
  243. reader = CreateReader ("{}");
  244. Assert.IsFalse (reader.MoveToFirstAttribute (), "#1");
  245. reader.Read (); // element
  246. Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
  247. Assert.AreEqual ("type", reader.LocalName, "#3");
  248. Assert.AreEqual ("object", reader.Value, "#4");
  249. Assert.IsTrue (reader.ReadAttributeValue (), "#5");
  250. Assert.AreEqual ("object", reader.Value, "#6");
  251. Assert.IsFalse (reader.MoveToNextAttribute (), "#7");
  252. Assert.IsTrue (reader.MoveToFirstAttribute (), "#8");
  253. Assert.IsFalse (reader.MoveToNextAttribute (), "#9");
  254. }
  255. [Test]
  256. public void MoveToElementObject ()
  257. {
  258. reader = CreateReader ("{}");
  259. reader.Read (); // element
  260. Assert.IsTrue (reader.MoveToFirstAttribute (), "#1");
  261. Assert.IsTrue (reader.MoveToElement (), "#1-1");
  262. Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
  263. Assert.IsTrue (reader.ReadAttributeValue (), "#2-1");
  264. Assert.IsTrue (reader.MoveToElement (), "#2-2");
  265. Assert.IsTrue (reader.MoveToFirstAttribute (), "#3");
  266. Assert.IsFalse (reader.MoveToNextAttribute (), "#3-1");
  267. Assert.IsTrue (reader.MoveToElement (), "#3-2");
  268. }
  269. [Test]
  270. public void MoveToAttributeArray ()
  271. {
  272. reader = CreateReader ("[]");
  273. Assert.IsFalse (reader.MoveToFirstAttribute (), "#1");
  274. reader.Read (); // element
  275. Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
  276. Assert.AreEqual ("type", reader.LocalName, "#3");
  277. Assert.AreEqual ("array", reader.Value, "#4");
  278. Assert.IsTrue (reader.ReadAttributeValue (), "#5");
  279. Assert.AreEqual ("array", reader.Value, "#6");
  280. Assert.IsFalse (reader.MoveToNextAttribute (), "#7");
  281. Assert.IsTrue (reader.MoveToFirstAttribute (), "#8");
  282. Assert.IsFalse (reader.MoveToNextAttribute (), "#9");
  283. }
  284. [Test]
  285. public void MoveToElementArray ()
  286. {
  287. reader = CreateReader ("[]");
  288. reader.Read (); // element
  289. Assert.IsTrue (reader.MoveToFirstAttribute (), "#1");
  290. Assert.IsTrue (reader.MoveToElement (), "#1-1");
  291. Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
  292. Assert.IsTrue (reader.ReadAttributeValue (), "#2-1");
  293. Assert.IsTrue (reader.MoveToElement (), "#2-2");
  294. Assert.IsTrue (reader.MoveToFirstAttribute (), "#3");
  295. Assert.IsFalse (reader.MoveToNextAttribute (), "#3-1");
  296. Assert.IsTrue (reader.MoveToElement (), "#3-2");
  297. }
  298. [Test]
  299. public void MoveToAttributeSimpleDummyRoot ()
  300. {
  301. reader = CreateReader ("1234");
  302. Assert.IsFalse (reader.MoveToFirstAttribute (), "#1");
  303. reader.Read (); // element
  304. Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
  305. Assert.AreEqual ("type", reader.LocalName, "#3");
  306. Assert.AreEqual ("number", reader.Value, "#4");
  307. Assert.IsTrue (reader.ReadAttributeValue (), "#5");
  308. Assert.AreEqual ("number", reader.Value, "#6");
  309. Assert.IsFalse (reader.MoveToNextAttribute (), "#7");
  310. Assert.IsTrue (reader.MoveToFirstAttribute (), "#8");
  311. Assert.IsFalse (reader.MoveToNextAttribute (), "#9");
  312. }
  313. [Test]
  314. public void MoveToElementSimpleDummyRoot ()
  315. {
  316. reader = CreateReader ("1234");
  317. reader.Read (); // element
  318. Assert.IsTrue (reader.MoveToFirstAttribute (), "#1");
  319. Assert.IsTrue (reader.MoveToElement (), "#1-1");
  320. Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
  321. Assert.IsTrue (reader.ReadAttributeValue (), "#2-1");
  322. Assert.IsTrue (reader.MoveToElement (), "#2-2");
  323. Assert.IsTrue (reader.MoveToFirstAttribute (), "#3");
  324. Assert.IsFalse (reader.MoveToNextAttribute (), "#3-1");
  325. Assert.IsTrue (reader.MoveToElement (), "#3-2");
  326. }
  327. // Read() arrays and objects
  328. [Test]
  329. public void ReadArrayContent ()
  330. {
  331. reader = CreateReader ("[123, \"123\", true, \"true\"]");
  332. // number value
  333. reader.Read (); // element
  334. AssertNode (0, "root", XmlNodeType.Element, String.Empty, "array", reader, "#1");
  335. reader.Read (); // 123 - element
  336. Assert.AreEqual ("number", reader.GetAttribute ("type"), "#2-0");
  337. AssertNode (1, "item", XmlNodeType.Element, String.Empty, "number", reader, "#2");
  338. reader.Read (); // 123 - text
  339. AssertNode (2, String.Empty, XmlNodeType.Text, "123", null, reader, "#3");
  340. reader.Read (); // 123 - endelement
  341. AssertNode (1, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#4");
  342. // string value #1
  343. reader.Read (); // "123" - element
  344. Assert.AreEqual ("string", reader.GetAttribute ("type"), "#5-0");
  345. AssertNode (1, "item", XmlNodeType.Element, String.Empty, "string", reader, "#5");
  346. reader.Read (); // "123" - text
  347. AssertNode (2, String.Empty, XmlNodeType.Text, "123", null, reader, "#6");
  348. reader.Read (); // "123" - endelement
  349. AssertNode (1, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#7");
  350. reader.Read (); // true - element
  351. Assert.AreEqual ("boolean", reader.GetAttribute ("type"), "#8-0");
  352. AssertNode (1, "item", XmlNodeType.Element, String.Empty, "boolean", reader, "#8");
  353. reader.Read (); // true - text
  354. AssertNode (2, String.Empty, XmlNodeType.Text, "true", null, reader, "#9");
  355. reader.Read (); // true - endelement
  356. AssertNode (1, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#10");
  357. // string value #2
  358. reader.Read (); // "true" - element
  359. Assert.AreEqual ("string", reader.GetAttribute ("type"), "#11-0");
  360. AssertNode (1, "item", XmlNodeType.Element, String.Empty, "string", reader, "#11");
  361. reader.Read (); // "true" - text
  362. AssertNode (2, String.Empty, XmlNodeType.Text, "true", null, reader, "#12");
  363. reader.Read (); // "true" - endelement
  364. AssertNode (1, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#13");
  365. Assert.IsTrue (reader.Read (), "#14"); // ]
  366. AssertNode (0, "root", XmlNodeType.EndElement, String.Empty, null, reader, "#15");
  367. Assert.IsFalse (reader.Read (), "#16"); // EOF
  368. }
  369. [Test]
  370. public void ReadObjectContent ()
  371. {
  372. reader = CreateReader ("{\"A\":123, \"B\": \"123\", \"C\" :true, \"D\" : \"true\"}");
  373. // number value
  374. reader.Read (); // element
  375. AssertNode (0, "root", XmlNodeType.Element, String.Empty, "object", reader, "#1");
  376. reader.Read (); // 123 - element
  377. AssertNode (1, "A", XmlNodeType.Element, String.Empty, "number", reader, "#2");
  378. reader.Read (); // 123 - text
  379. AssertNode (2, String.Empty, XmlNodeType.Text, "123", null, reader, "#3");
  380. reader.Read (); // 123 - endelement
  381. AssertNode (1, "A", XmlNodeType.EndElement, String.Empty, null, reader, "#4");
  382. // string value #1
  383. reader.Read (); // "123" - element
  384. AssertNode (1, "B", XmlNodeType.Element, String.Empty, "string", reader, "#5");
  385. reader.Read (); // "123" - text
  386. AssertNode (2, String.Empty, XmlNodeType.Text, "123", null, reader, "#6");
  387. reader.Read (); // "123" - endelement
  388. AssertNode (1, "B", XmlNodeType.EndElement, String.Empty, null, reader, "#7");
  389. reader.Read (); // true - element
  390. AssertNode (1, "C", XmlNodeType.Element, String.Empty, "boolean", reader, "#8");
  391. reader.Read (); // true - text
  392. AssertNode (2, String.Empty, XmlNodeType.Text, "true", null, reader, "#9");
  393. reader.Read (); // true - endelement
  394. AssertNode (1, "C", XmlNodeType.EndElement, String.Empty, null, reader, "#10");
  395. // string value #2
  396. reader.Read (); // "true" - element
  397. AssertNode (1, "D", XmlNodeType.Element, String.Empty, "string", reader, "#11");
  398. reader.Read (); // "true" - text
  399. AssertNode (2, String.Empty, XmlNodeType.Text, "true", null, reader, "#12");
  400. reader.Read (); // "true" - endelement
  401. AssertNode (1, "D", XmlNodeType.EndElement, String.Empty, null, reader, "#13");
  402. Assert.IsTrue (reader.Read (), "#14"); // }
  403. AssertNode (0, "root", XmlNodeType.EndElement, String.Empty, null, reader, "#15");
  404. Assert.IsFalse (reader.Read (), "#16"); // EOF
  405. }
  406. [Test]
  407. public void ReadNestedObjects ()
  408. {
  409. reader = CreateReader ("{\"A\": [123, {\"B\": \"456\", \"C\" :true}], \"D\" : {\"E\" : \"false\"}}");
  410. Assert.IsTrue (reader.Read (), "#1"); // {
  411. AssertNode (0, "root", XmlNodeType.Element, String.Empty, "object", reader, "#2");
  412. Assert.IsTrue (reader.Read (), "#3"); // A
  413. AssertNode (1, "A", XmlNodeType.Element, String.Empty, "array", reader, "#4");
  414. Assert.IsTrue (reader.Read (), "#5"); // (<123>)
  415. AssertNode (2, "item", XmlNodeType.Element, String.Empty, "number", reader, "#6");
  416. Assert.IsTrue (reader.Read (), "#7"); // (123)
  417. AssertNode (3, String.Empty, XmlNodeType.Text, "123", null, reader, "#8");
  418. Assert.IsTrue (reader.Read (), "#9"); // (</123>)
  419. AssertNode (2, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#10");
  420. Assert.IsTrue (reader.Read (), "#11"); // {
  421. AssertNode (2, "item", XmlNodeType.Element, String.Empty, "object", reader, "#12");
  422. Assert.IsTrue (reader.Read (), "#13"); // B
  423. AssertNode (3, "B", XmlNodeType.Element, String.Empty, "string", reader, "#14");
  424. Assert.IsTrue (reader.Read (), "#15"); // "456"
  425. AssertNode (4, String.Empty, XmlNodeType.Text, "456", null, reader, "#16");
  426. Assert.IsTrue (reader.Read (), "#17"); // /B
  427. AssertNode (3, "B", XmlNodeType.EndElement, String.Empty, null, reader, "#18");
  428. Assert.IsTrue (reader.Read (), "#19"); // C
  429. AssertNode (3, "C", XmlNodeType.Element, String.Empty, "boolean", reader, "#20");
  430. Assert.IsTrue (reader.Read (), "#21"); // true
  431. AssertNode (4, String.Empty, XmlNodeType.Text, "true", null, reader, "#22");
  432. Assert.IsTrue (reader.Read (), "#23"); // /C
  433. AssertNode (3, "C", XmlNodeType.EndElement, String.Empty, null, reader, "#24");
  434. Assert.IsTrue (reader.Read (), "#25"); // }
  435. AssertNode (2, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#26");
  436. Assert.IsTrue (reader.Read (), "#27"); // ]
  437. AssertNode (1, "A", XmlNodeType.EndElement, String.Empty, null, reader, "#28");
  438. Assert.IsTrue (reader.Read (), "#29"); // {
  439. AssertNode (1, "D", XmlNodeType.Element, String.Empty, "object", reader, "#30");
  440. Assert.IsTrue (reader.Read (), "#31"); // D
  441. AssertNode (2, "E", XmlNodeType.Element, String.Empty, "string", reader, "#32");
  442. Assert.IsTrue (reader.Read (), "#33"); // "false"
  443. AssertNode (3, String.Empty, XmlNodeType.Text, "false", null, reader, "#34");
  444. Assert.IsTrue (reader.Read (), "#35"); // /D
  445. AssertNode (2, "E", XmlNodeType.EndElement, String.Empty, null, reader, "#36");
  446. Assert.IsTrue (reader.Read (), "#37"); // }
  447. AssertNode (1, "D", XmlNodeType.EndElement, String.Empty, null, reader, "#38");
  448. Assert.IsTrue (reader.Read (), "#39"); // }
  449. AssertNode (0, "root", XmlNodeType.EndElement, String.Empty, null, reader, "#40");
  450. Assert.IsFalse (reader.Read (), "#41"); // EOF
  451. }
  452. void ReadToEnd (XmlDictionaryReader reader)
  453. {
  454. while (!reader.EOF)
  455. reader.Read ();
  456. }
  457. // Read() valid and invalid contents
  458. [Test]
  459. [Ignore ("It should throw XmlException for parser error, but .NET fails to report that")]
  460. public void ReadTwoTopLevelContents ()
  461. {
  462. ReadToEnd (CreateReader ("{}{}"));
  463. }
  464. [Test]
  465. [ExpectedException (typeof (XmlException))]
  466. public void ReadMissingCloseCurly ()
  467. {
  468. ReadToEnd (CreateReader ("{"));
  469. }
  470. [Test]
  471. [ExpectedException (typeof (XmlException))]
  472. public void ReadMissingCloseCurly2 ()
  473. {
  474. ReadToEnd (CreateReader ("{{}"));
  475. }
  476. [Test]
  477. [ExpectedException (typeof (XmlException))]
  478. public void ReadExtraCloseCurly ()
  479. {
  480. ReadToEnd (CreateReader ("}"));
  481. }
  482. [Test]
  483. [Ignore ("It should throw XmlException for parser error, but .NET fails to report that")]
  484. public void ReadExtraCloseCurly2 ()
  485. {
  486. ReadToEnd (CreateReader ("{}}"));
  487. }
  488. [Test]
  489. [ExpectedException (typeof (XmlException))]
  490. public void ReadMissingCloseBrace ()
  491. {
  492. ReadToEnd (CreateReader ("["));
  493. }
  494. [Test]
  495. [ExpectedException (typeof (XmlException))]
  496. public void ReadMissingCloseBrace2 ()
  497. {
  498. ReadToEnd (CreateReader ("[[]"));
  499. }
  500. [Test]
  501. [ExpectedException (typeof (XmlException))]
  502. public void ReadExtraCloseBrace ()
  503. {
  504. ReadToEnd (CreateReader ("]"));
  505. }
  506. [Test]
  507. [ExpectedException (typeof (XmlException))]
  508. [Ignore ("NotDotNet")] // hmm, why does it pass?
  509. public void ReadExtraCloseBrace2 ()
  510. {
  511. ReadToEnd (CreateReader ("[]]"));
  512. }
  513. [Test]
  514. [ExpectedException (typeof (XmlException))]
  515. public void ReadOpenCurlyCloseBrace ()
  516. {
  517. ReadToEnd (CreateReader ("{]"));
  518. }
  519. [Test]
  520. [ExpectedException (typeof (XmlException))]
  521. public void ReadOpenBraceCloseCurly ()
  522. {
  523. ReadToEnd (CreateReader ("[}"));
  524. }
  525. [Test]
  526. [ExpectedException (typeof (XmlException))]
  527. public void ReadParens ()
  528. {
  529. ReadToEnd (CreateReader ("()"));
  530. }
  531. [Test]
  532. public void ReadValidNumber ()
  533. {
  534. ReadToEnd (CreateReader ("0"));
  535. }
  536. [Test]
  537. public void ReadValidNumber2 ()
  538. {
  539. ReadToEnd (CreateReader ("-0"));
  540. }
  541. [Test]
  542. public void ReadValidNumber3 ()
  543. {
  544. ReadToEnd (CreateReader ("0e5"));
  545. }
  546. [Test]
  547. public void ReadValidNumber4 ()
  548. {
  549. ReadToEnd (CreateReader ("0.5"));
  550. }
  551. [Test]
  552. [ExpectedException (typeof (XmlException))]
  553. public void ReadInvalidNumber ()
  554. {
  555. CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
  556. try {
  557. Thread.CurrentThread.CurrentCulture = new CultureInfo ("de-DE");
  558. // if we read a number just by current culture, it will be regarded as correct JSON.
  559. ReadToEnd (CreateReader ("123,45"));
  560. } finally {
  561. Thread.CurrentThread.CurrentCulture = originalCulture;
  562. }
  563. }
  564. [Test]
  565. public void ReadValidNumberGerman ()
  566. {
  567. CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
  568. try {
  569. Thread.CurrentThread.CurrentCulture = new CultureInfo ("de-DE");
  570. var s = GetInput ("123.45"); // German is ',' for decimals
  571. var r = new DataContractJsonSerializer (typeof (double));
  572. var d = (double) r.ReadObject (s);
  573. Assert.AreEqual (123.45, d, "InvariantCulture");
  574. } finally {
  575. Thread.CurrentThread.CurrentCulture = originalCulture;
  576. }
  577. }
  578. [Test]
  579. [ExpectedException (typeof (XmlException))]
  580. public void ReadInvalidNumber2 ()
  581. {
  582. ReadToEnd (CreateReader ("+5"));
  583. }
  584. [Test]
  585. [ExpectedException (typeof (XmlException))]
  586. [Ignore ("NotDotNet")] // likely .NET bug
  587. public void ReadInvalidNumber3 ()
  588. {
  589. ReadToEnd (CreateReader ("01"));
  590. }
  591. [Test]
  592. [ExpectedException (typeof (XmlException))]
  593. public void ReadInvalidNumber4 ()
  594. {
  595. ReadToEnd (CreateReader (".1"));
  596. }
  597. [Test]
  598. [ExpectedException (typeof (XmlException))]
  599. [Ignore ("NotDotNet")] // likely .NET bug
  600. public void ReadInvalidNumber5 ()
  601. {
  602. ReadToEnd (CreateReader ("10."));
  603. }
  604. [Test]
  605. [ExpectedException (typeof (XmlException))]
  606. public void ReadInvalidNumber7 ()
  607. {
  608. ReadToEnd (CreateReader ("e5"));
  609. }
  610. [Test]
  611. [ExpectedException (typeof (XmlException))]
  612. [Ignore ("NotDotNet")] // likely .NET bug
  613. public void ReadInvalidNumber8 ()
  614. {
  615. ReadToEnd (CreateReader ("-e5"));
  616. }
  617. [Test]
  618. [ExpectedException (typeof (XmlException))]
  619. [Ignore ("NotDotNet")] // likely .NET bug
  620. public void ReadInvalidNumber9 ()
  621. {
  622. ReadToEnd (CreateReader ("-e5.5"));
  623. }
  624. [Test]
  625. public void ReadInvalidNumber10 () // bug #531904
  626. {
  627. ReadToEnd (CreateReader ("4.29153442382814E-05"));
  628. }
  629. [Test]
  630. [ExpectedException (typeof (XmlException))]
  631. public void ReadInvalidObjectContent ()
  632. {
  633. ReadToEnd (CreateReader ("{\"foo\"}"));
  634. }
  635. [Test]
  636. [ExpectedException (typeof (XmlException))]
  637. [Ignore ("NotDotNet")] // likely .NET bug
  638. public void ReadInvalidObjectContent2 ()
  639. {
  640. ReadToEnd (CreateReader ("{\"A\": 123 456}"));
  641. }
  642. [Test]
  643. [ExpectedException (typeof (XmlException))]
  644. public void ReadInvalidObjectContent3 ()
  645. {
  646. ReadToEnd (CreateReader ("{, \"A\":123, \"B\":456}"));
  647. }
  648. [Test]
  649. [ExpectedException (typeof (XmlException))]
  650. [Ignore ("NotDotNet")] // likely .NET bug
  651. public void ReadInvalidObjectContent4 ()
  652. {
  653. ReadToEnd (CreateReader ("{\"A\":123, \"B\":456,}"));
  654. }
  655. [Test]
  656. [ExpectedException (typeof (XmlException))]
  657. public void ReadInvalidArrayContent ()
  658. {
  659. ReadToEnd (CreateReader ("[\"foo\":\"bar\"]"));
  660. }
  661. [Test]
  662. [ExpectedException (typeof (XmlException))]
  663. [Ignore ("NotDotNet")] // likely .NET bug
  664. public void ReadInvalidArrayContent2 ()
  665. {
  666. ReadToEnd (CreateReader ("[123 456]"));
  667. }
  668. [Test]
  669. [ExpectedException (typeof (XmlException))]
  670. public void ReadInvalidArrayContent3 ()
  671. {
  672. ReadToEnd (CreateReader ("[,123,456]"));
  673. }
  674. [Test]
  675. [ExpectedException (typeof (XmlException))]
  676. [Ignore ("NotDotNet")] // likely .NET bug
  677. public void ReadInvalidArrayContent4 ()
  678. {
  679. ReadToEnd (CreateReader ("[123,456,]"));
  680. }
  681. [Test]
  682. public void ReadObjectRuntimeTypeAsAttribute ()
  683. {
  684. XmlDictionaryReader r = CreateReader ("{\"__type\":\"System.Int32\"}");
  685. r.Read ();
  686. AssertNode (0, "root", XmlNodeType.Element, String.Empty, "object", r, "#1");
  687. Assert.IsTrue (r.MoveToAttribute ("type"), "#2");
  688. AssertNode (0, "type", XmlNodeType.Attribute, "object", "object", r, "#3");
  689. Assert.IsTrue (r.MoveToAttribute ("__type"), "#4");
  690. AssertNode (0, "__type", XmlNodeType.Attribute, "System.Int32", "object", r, "#5");
  691. r.Read ();
  692. Assert.AreEqual (XmlNodeType.EndElement, r.NodeType, "#6");
  693. }
  694. [Test]
  695. public void ReadObjectRuntimeType ()
  696. {
  697. XmlDictionaryReader r = CreateReader ("{\"__type\":\"System.Int32\", \"foo\":true}");
  698. r.Read ();
  699. AssertNode (0, "root", XmlNodeType.Element, String.Empty, "object", r, "#1");
  700. Assert.IsTrue (r.MoveToAttribute ("type"), "#2");
  701. AssertNode (0, "type", XmlNodeType.Attribute, "object", "object", r, "#3");
  702. Assert.IsTrue (r.MoveToAttribute ("__type"), "#4");
  703. AssertNode (0, "__type", XmlNodeType.Attribute, "System.Int32", "object", r, "#5");
  704. r.Read ();
  705. Assert.AreEqual (XmlNodeType.Element, r.NodeType, "#6");
  706. Assert.AreEqual ("foo", r.LocalName, "#7");
  707. }
  708. [Test]
  709. [ExpectedException (typeof (XmlException))]
  710. public void ReadInvalidObjectRuntimeTypeValue ()
  711. {
  712. ReadToEnd (CreateReader ("{\"__type\":true}"));
  713. }
  714. [Test]
  715. public void ReadObjectRuntimeTypeIncorrectPosition ()
  716. {
  717. XmlReader r = CreateReader ("{\"foo\" : false, \"__type\" : \"System.Int32\"}");
  718. r.Read ();
  719. // When __type is not at the first content, it is not regarded as an attribute. Note that it is not treated as an error.
  720. Assert.IsFalse (r.MoveToAttribute ("__type"));
  721. r.Skip ();
  722. }
  723. [Test]
  724. public void ReadObjectRuntimeTypeInArray ()
  725. {
  726. XmlReader r = CreateReader (@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0}]");
  727. r.Read ();
  728. Assert.AreEqual ("root", r.LocalName, "#1-1");
  729. Assert.AreEqual ("array", r.GetAttribute ("type"), "#1-2");
  730. r.Read ();
  731. Assert.AreEqual ("item", r.LocalName, "#2-1");
  732. Assert.AreEqual ("object", r.GetAttribute ("type"), "#2-2");
  733. Assert.IsNotNull (r.GetAttribute ("__type"), "#2-3");
  734. r.Read ();
  735. }
  736. [Test]
  737. public void Skip ()
  738. {
  739. XmlReader r = CreateReader ("{\"type\" : \"\", \"valid\" : \"0\", \"other\" : \"\"}");
  740. r.ReadStartElement ();
  741. r.MoveToContent ();
  742. Assert.AreEqual ("type", r.Name, "Skip-1");
  743. r.ReadElementContentAsString ();
  744. r.MoveToContent ();
  745. Assert.AreEqual ("valid", r.Name, "Skip-2");
  746. r.Skip ();
  747. Assert.AreEqual ("other", r.Name, "Skip-3");
  748. }
  749. [Test]
  750. public void Depth ()
  751. {
  752. XmlReader r = CreateReader ("{\"type\" : \"\", \"valid\" : \"0\"}");
  753. r.ReadStartElement ();
  754. r.Read ();
  755. Assert.AreEqual (2, r.Depth, "Depth-1");
  756. }
  757. [Test]
  758. public void UnicodeEncodingAutoDetect ()
  759. {
  760. var ms = new MemoryStream (Encoding.Unicode.GetBytes ("{\"type\" : \"\", \"valid\" : \"0\"}"));
  761. XmlReader r = JsonReaderWriterFactory.CreateJsonReader (ms, new XmlDictionaryReaderQuotas ());
  762. r.ReadStartElement ();
  763. r.Read ();
  764. }
  765. [Test]
  766. public void ReadNumberAsObject ()
  767. {
  768. const double testValue = 42.42D;
  769. var serializer = new DataContractJsonSerializer (typeof (object));
  770. var serializedStream = GetInput (testValue.ToString (CultureInfo.InvariantCulture));
  771. var deserializedValue = serializer.ReadObject (serializedStream);
  772. Assert.AreEqual (typeof (decimal), deserializedValue.GetType ());
  773. Assert.AreEqual (testValue, (decimal) deserializedValue);
  774. }
  775. [Test]
  776. public void IEnumerableTest ()
  777. {
  778. string json = "[\"A\", \"B\"]";
  779. using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) {
  780. DataContractJsonSerializer jsonSerializer = new
  781. DataContractJsonSerializer(typeof(IEnumerable<string>));
  782. var result = jsonSerializer.ReadObject(stream);
  783. Assert.AreEqual (typeof (string []), result.GetType ());
  784. }
  785. }
  786. }
  787. }