JsonReaderTest.cs 28 KB

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