JsonReaderTest.cs 27 KB

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