5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2007 Novell, Inc (http://www.novell.com)
8 // Copyright 2014 Xamarin Inc. (http://www.xamarin.com)
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:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
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.
30 using System.Collections.Generic;
31 using System.Globalization;
33 using System.Runtime.Serialization.Json;
35 using System.Threading;
37 using NUnit.Framework;
39 namespace MonoTests.System.Runtime.Serialization.Json
42 public class JsonReaderTest
44 XmlDictionaryReader reader;
46 Stream GetInput (string s)
48 return new MemoryStream (Encoding.ASCII.GetBytes (s));
51 XmlDictionaryReader CreateReader (string s)
53 return JsonReaderWriterFactory.CreateJsonReader (GetInput (s), new XmlDictionaryReaderQuotas ());
56 void AssertNode (int depth, string localName, XmlNodeType nodeType, string value, string type, XmlDictionaryReader reader, string label)
58 Assert.AreEqual (localName, reader.LocalName, label + ".LocalName");
59 Assert.AreEqual (nodeType, reader.NodeType, label + ".NodeType");
60 Assert.AreEqual (value, reader.Value, label + ".Value");
61 Assert.AreEqual (type, reader.GetAttribute ("type"), label + ".GetAttribute('type')");
67 [ExpectedException (typeof (ArgumentNullException))]
68 public void ConstructorNullBytes ()
70 JsonReaderWriterFactory.CreateJsonReader ((byte []) null, new XmlDictionaryReaderQuotas ());
74 [ExpectedException (typeof (ArgumentNullException))]
75 public void ConstructorNullStream ()
77 JsonReaderWriterFactory.CreateJsonReader ((Stream) null, new XmlDictionaryReaderQuotas ());
81 [ExpectedException (typeof (ArgumentNullException))]
82 public void ConstructorNullReaderQuotas ()
84 JsonReaderWriterFactory.CreateJsonReader (GetInput ("{}"), null);
88 public void ConstructorNullEncodingAndReaderClose ()
90 JsonReaderWriterFactory.CreateJsonReader (GetInput ("{}"), null, new XmlDictionaryReaderQuotas (), null);
96 public void CloseTwice ()
98 reader = CreateReader ("{}");
104 // hmm... [ExpectedException (typeof (InvalidOperationException))]
105 public void CloseAndRead ()
107 reader = CreateReader ("{}");
113 // hmm... [ExpectedException (typeof (InvalidOperationException))]
114 public void CloseAndMoveToFirstAttribute ()
116 reader = CreateReader ("{}");
118 reader.MoveToFirstAttribute ();
121 // Read() several top-level types
124 public void ReadStateEmpty ()
126 reader = CreateReader ("");
127 Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
129 Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#2");
131 Assert.AreEqual (ReadState.Closed, reader.ReadState, "#3");
135 public void ReadStateEmpty2 ()
137 reader = CreateReader (" ");
138 Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
140 Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#2");
142 Assert.AreEqual (ReadState.Closed, reader.ReadState, "#3");
146 public void ReadStateObject ()
148 reader = CreateReader ("{}");
149 Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
150 reader.Read (); // element
151 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
152 reader.Read (); // endelement
153 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
154 reader.Read (); // endoffile
155 Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#4");
157 Assert.AreEqual (ReadState.Closed, reader.ReadState, "#5");
161 public void ReadStateArray ()
163 reader = CreateReader ("[]");
164 Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
165 reader.Read (); // element
166 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
167 reader.Read (); // endelement
168 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
169 reader.Read (); // endoffile
170 Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#4");
172 Assert.AreEqual (ReadState.Closed, reader.ReadState, "#5");
176 public void ReadNumber ()
178 reader = CreateReader ("1234");
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 reader.Read (); // content (number)
185 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
186 Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "#3-1");
187 Assert.AreEqual ("1234", reader.Value, "#3-2");
188 reader.Read (); // endelement
189 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#4");
190 Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#4-1");
191 reader.Read (); // endoffile
192 Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#5");
194 Assert.AreEqual (ReadState.Closed, reader.ReadState, "#6");
198 public void ReadBool ()
200 reader = CreateReader ("true");
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 Assert.AreEqual ("boolean", reader.GetAttribute ("type"), "#2-3");
207 reader.Read (); // content (boolean)
208 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
209 Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "#3-1");
210 Assert.AreEqual ("true", reader.Value, "#3-2");
211 reader.Read (); // endelement
212 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#4");
213 Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#4-1");
214 reader.Read (); // endoffile
215 Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#5");
217 Assert.AreEqual (ReadState.Closed, reader.ReadState, "#6");
221 public void ReadNull ()
223 reader = CreateReader ("null");
224 Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
225 reader.Read (); // dummy root element
226 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
227 Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "#2-1");
228 Assert.AreEqual ("root", reader.LocalName, "#2-2");
229 // When it is null, the value is never given and the reader is skipped to the end element.
230 reader.Read (); // endlement
231 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
232 Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#3-1");
233 reader.Read (); // endoffile
234 Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#4");
236 Assert.AreEqual (ReadState.Closed, reader.ReadState, "#4");
240 public void ReadString ()
242 reader = CreateReader ("\"true\"");
243 Assert.AreEqual (ReadState.Initial, reader.ReadState, "#1");
244 reader.Read (); // dummy root element
245 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#2");
246 Assert.AreEqual (XmlNodeType.Element, reader.NodeType, "#2-1");
247 Assert.AreEqual ("root", reader.LocalName, "#2-2");
248 Assert.AreEqual ("string", reader.GetAttribute ("type"), "#2-3");
249 reader.Read (); // content (number)
250 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#3");
251 Assert.AreEqual (XmlNodeType.Text, reader.NodeType, "#3-1");
252 Assert.AreEqual ("true", reader.Value, "#3-2");
253 reader.Read (); // endelement
254 Assert.AreEqual (ReadState.Interactive, reader.ReadState, "#4");
255 Assert.AreEqual (XmlNodeType.EndElement, reader.NodeType, "#4-1");
256 reader.Read (); // endoffile
257 Assert.AreEqual (ReadState.EndOfFile, reader.ReadState, "#5");
259 Assert.AreEqual (ReadState.Closed, reader.ReadState, "#6");
262 // MoveToAttribute() / MoveToElement()
265 public void MoveToAttributeObject ()
267 reader = CreateReader ("{}");
268 Assert.IsFalse (reader.MoveToFirstAttribute (), "#1");
269 reader.Read (); // element
270 Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
271 Assert.AreEqual ("type", reader.LocalName, "#3");
272 Assert.AreEqual ("object", reader.Value, "#4");
273 Assert.IsTrue (reader.ReadAttributeValue (), "#5");
274 Assert.AreEqual ("object", reader.Value, "#6");
275 Assert.IsFalse (reader.MoveToNextAttribute (), "#7");
276 Assert.IsTrue (reader.MoveToFirstAttribute (), "#8");
277 Assert.IsFalse (reader.MoveToNextAttribute (), "#9");
281 public void MoveToElementObject ()
283 reader = CreateReader ("{}");
284 reader.Read (); // element
285 Assert.IsTrue (reader.MoveToFirstAttribute (), "#1");
286 Assert.IsTrue (reader.MoveToElement (), "#1-1");
288 Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
289 Assert.IsTrue (reader.ReadAttributeValue (), "#2-1");
290 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");
298 public void MoveToAttributeArray ()
300 reader = CreateReader ("[]");
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 ("array", reader.Value, "#4");
306 Assert.IsTrue (reader.ReadAttributeValue (), "#5");
307 Assert.AreEqual ("array", reader.Value, "#6");
308 Assert.IsFalse (reader.MoveToNextAttribute (), "#7");
309 Assert.IsTrue (reader.MoveToFirstAttribute (), "#8");
310 Assert.IsFalse (reader.MoveToNextAttribute (), "#9");
314 public void MoveToElementArray ()
316 reader = CreateReader ("[]");
317 reader.Read (); // element
318 Assert.IsTrue (reader.MoveToFirstAttribute (), "#1");
319 Assert.IsTrue (reader.MoveToElement (), "#1-1");
321 Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
322 Assert.IsTrue (reader.ReadAttributeValue (), "#2-1");
323 Assert.IsTrue (reader.MoveToElement (), "#2-2");
325 Assert.IsTrue (reader.MoveToFirstAttribute (), "#3");
326 Assert.IsFalse (reader.MoveToNextAttribute (), "#3-1");
327 Assert.IsTrue (reader.MoveToElement (), "#3-2");
331 public void MoveToAttributeSimpleDummyRoot ()
333 reader = CreateReader ("1234");
334 Assert.IsFalse (reader.MoveToFirstAttribute (), "#1");
335 reader.Read (); // element
336 Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
337 Assert.AreEqual ("type", reader.LocalName, "#3");
338 Assert.AreEqual ("number", reader.Value, "#4");
339 Assert.IsTrue (reader.ReadAttributeValue (), "#5");
340 Assert.AreEqual ("number", reader.Value, "#6");
341 Assert.IsFalse (reader.MoveToNextAttribute (), "#7");
342 Assert.IsTrue (reader.MoveToFirstAttribute (), "#8");
343 Assert.IsFalse (reader.MoveToNextAttribute (), "#9");
347 public void MoveToElementSimpleDummyRoot ()
349 reader = CreateReader ("1234");
350 reader.Read (); // element
351 Assert.IsTrue (reader.MoveToFirstAttribute (), "#1");
352 Assert.IsTrue (reader.MoveToElement (), "#1-1");
354 Assert.IsTrue (reader.MoveToFirstAttribute (), "#2");
355 Assert.IsTrue (reader.ReadAttributeValue (), "#2-1");
356 Assert.IsTrue (reader.MoveToElement (), "#2-2");
358 Assert.IsTrue (reader.MoveToFirstAttribute (), "#3");
359 Assert.IsFalse (reader.MoveToNextAttribute (), "#3-1");
360 Assert.IsTrue (reader.MoveToElement (), "#3-2");
363 // Read() arrays and objects
366 public void ReadArrayContent ()
368 reader = CreateReader ("[123, \"123\", true, \"true\"]");
371 reader.Read (); // element
372 AssertNode (0, "root", XmlNodeType.Element, String.Empty, "array", reader, "#1");
374 reader.Read (); // 123 - element
375 Assert.AreEqual ("number", reader.GetAttribute ("type"), "#2-0");
376 AssertNode (1, "item", 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, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#4");
383 reader.Read (); // "123" - element
384 Assert.AreEqual ("string", reader.GetAttribute ("type"), "#5-0");
385 AssertNode (1, "item", XmlNodeType.Element, String.Empty, "string", reader, "#5");
386 reader.Read (); // "123" - text
387 AssertNode (2, String.Empty, XmlNodeType.Text, "123", null, reader, "#6");
388 reader.Read (); // "123" - endelement
389 AssertNode (1, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#7");
391 reader.Read (); // true - element
392 Assert.AreEqual ("boolean", reader.GetAttribute ("type"), "#8-0");
393 AssertNode (1, "item", XmlNodeType.Element, String.Empty, "boolean", reader, "#8");
394 reader.Read (); // true - text
395 AssertNode (2, String.Empty, XmlNodeType.Text, "true", null, reader, "#9");
396 reader.Read (); // true - endelement
397 AssertNode (1, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#10");
400 reader.Read (); // "true" - element
401 Assert.AreEqual ("string", reader.GetAttribute ("type"), "#11-0");
402 AssertNode (1, "item", XmlNodeType.Element, String.Empty, "string", reader, "#11");
403 reader.Read (); // "true" - text
404 AssertNode (2, String.Empty, XmlNodeType.Text, "true", null, reader, "#12");
405 reader.Read (); // "true" - endelement
406 AssertNode (1, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#13");
407 Assert.IsTrue (reader.Read (), "#14"); // ]
408 AssertNode (0, "root", XmlNodeType.EndElement, String.Empty, null, reader, "#15");
409 Assert.IsFalse (reader.Read (), "#16"); // EOF
413 public void ReadObjectContent ()
415 reader = CreateReader ("{\"A\":123, \"B\": \"123\", \"C\" :true, \"D\" : \"true\"}");
418 reader.Read (); // element
419 AssertNode (0, "root", XmlNodeType.Element, String.Empty, "object", reader, "#1");
421 reader.Read (); // 123 - element
422 AssertNode (1, "A", XmlNodeType.Element, String.Empty, "number", reader, "#2");
423 reader.Read (); // 123 - text
424 AssertNode (2, String.Empty, XmlNodeType.Text, "123", null, reader, "#3");
425 reader.Read (); // 123 - endelement
426 AssertNode (1, "A", XmlNodeType.EndElement, String.Empty, null, reader, "#4");
429 reader.Read (); // "123" - element
430 AssertNode (1, "B", XmlNodeType.Element, String.Empty, "string", reader, "#5");
431 reader.Read (); // "123" - text
432 AssertNode (2, String.Empty, XmlNodeType.Text, "123", null, reader, "#6");
433 reader.Read (); // "123" - endelement
434 AssertNode (1, "B", XmlNodeType.EndElement, String.Empty, null, reader, "#7");
436 reader.Read (); // true - element
437 AssertNode (1, "C", XmlNodeType.Element, String.Empty, "boolean", reader, "#8");
438 reader.Read (); // true - text
439 AssertNode (2, String.Empty, XmlNodeType.Text, "true", null, reader, "#9");
440 reader.Read (); // true - endelement
441 AssertNode (1, "C", XmlNodeType.EndElement, String.Empty, null, reader, "#10");
444 reader.Read (); // "true" - element
445 AssertNode (1, "D", XmlNodeType.Element, String.Empty, "string", reader, "#11");
446 reader.Read (); // "true" - text
447 AssertNode (2, String.Empty, XmlNodeType.Text, "true", null, reader, "#12");
448 reader.Read (); // "true" - endelement
449 AssertNode (1, "D", XmlNodeType.EndElement, String.Empty, null, reader, "#13");
450 Assert.IsTrue (reader.Read (), "#14"); // }
451 AssertNode (0, "root", XmlNodeType.EndElement, String.Empty, null, reader, "#15");
452 Assert.IsFalse (reader.Read (), "#16"); // EOF
456 public void ReadNestedObjects ()
458 reader = CreateReader ("{\"A\": [123, {\"B\": \"456\", \"C\" :true}], \"D\" : {\"E\" : \"false\"}}");
459 Assert.IsTrue (reader.Read (), "#1"); // {
460 AssertNode (0, "root", XmlNodeType.Element, String.Empty, "object", reader, "#2");
461 Assert.IsTrue (reader.Read (), "#3"); // A
462 AssertNode (1, "A", XmlNodeType.Element, String.Empty, "array", reader, "#4");
463 Assert.IsTrue (reader.Read (), "#5"); // (<123>)
464 AssertNode (2, "item", XmlNodeType.Element, String.Empty, "number", reader, "#6");
465 Assert.IsTrue (reader.Read (), "#7"); // (123)
466 AssertNode (3, String.Empty, XmlNodeType.Text, "123", null, reader, "#8");
467 Assert.IsTrue (reader.Read (), "#9"); // (</123>)
468 AssertNode (2, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#10");
469 Assert.IsTrue (reader.Read (), "#11"); // {
470 AssertNode (2, "item", XmlNodeType.Element, String.Empty, "object", reader, "#12");
471 Assert.IsTrue (reader.Read (), "#13"); // B
472 AssertNode (3, "B", XmlNodeType.Element, String.Empty, "string", reader, "#14");
473 Assert.IsTrue (reader.Read (), "#15"); // "456"
474 AssertNode (4, String.Empty, XmlNodeType.Text, "456", null, reader, "#16");
475 Assert.IsTrue (reader.Read (), "#17"); // /B
476 AssertNode (3, "B", XmlNodeType.EndElement, String.Empty, null, reader, "#18");
478 Assert.IsTrue (reader.Read (), "#19"); // C
479 AssertNode (3, "C", XmlNodeType.Element, String.Empty, "boolean", reader, "#20");
480 Assert.IsTrue (reader.Read (), "#21"); // true
481 AssertNode (4, String.Empty, XmlNodeType.Text, "true", null, reader, "#22");
482 Assert.IsTrue (reader.Read (), "#23"); // /C
483 AssertNode (3, "C", XmlNodeType.EndElement, String.Empty, null, reader, "#24");
484 Assert.IsTrue (reader.Read (), "#25"); // }
485 AssertNode (2, "item", XmlNodeType.EndElement, String.Empty, null, reader, "#26");
486 Assert.IsTrue (reader.Read (), "#27"); // ]
487 AssertNode (1, "A", XmlNodeType.EndElement, String.Empty, null, reader, "#28");
488 Assert.IsTrue (reader.Read (), "#29"); // {
489 AssertNode (1, "D", XmlNodeType.Element, String.Empty, "object", reader, "#30");
490 Assert.IsTrue (reader.Read (), "#31"); // D
491 AssertNode (2, "E", XmlNodeType.Element, String.Empty, "string", reader, "#32");
492 Assert.IsTrue (reader.Read (), "#33"); // "false"
493 AssertNode (3, String.Empty, XmlNodeType.Text, "false", null, reader, "#34");
494 Assert.IsTrue (reader.Read (), "#35"); // /D
495 AssertNode (2, "E", XmlNodeType.EndElement, String.Empty, null, reader, "#36");
496 Assert.IsTrue (reader.Read (), "#37"); // }
497 AssertNode (1, "D", XmlNodeType.EndElement, String.Empty, null, reader, "#38");
498 Assert.IsTrue (reader.Read (), "#39"); // }
499 AssertNode (0, "root", XmlNodeType.EndElement, String.Empty, null, reader, "#40");
500 Assert.IsFalse (reader.Read (), "#41"); // EOF
503 void ReadToEnd (XmlDictionaryReader reader)
509 // Read() valid and invalid contents
512 [ExpectedException (typeof (XmlException))]
513 public void ReadTwoTopLevelContents ()
515 ReadToEnd (CreateReader ("{}{}"));
519 [ExpectedException (typeof (XmlException))]
520 public void ReadMissingCloseCurly ()
522 ReadToEnd (CreateReader ("{"));
526 [ExpectedException (typeof (XmlException))]
527 public void ReadMissingCloseCurly2 ()
529 ReadToEnd (CreateReader ("{{}"));
533 [ExpectedException (typeof (XmlException))]
534 public void ReadExtraCloseCurly ()
536 ReadToEnd (CreateReader ("}"));
540 [ExpectedException (typeof (XmlException))]
541 public void ReadExtraCloseCurly2 ()
543 ReadToEnd (CreateReader ("{}}"));
547 [ExpectedException (typeof (XmlException))]
548 public void ReadMissingCloseBrace ()
550 ReadToEnd (CreateReader ("["));
554 [ExpectedException (typeof (XmlException))]
555 public void ReadMissingCloseBrace2 ()
557 ReadToEnd (CreateReader ("[[]"));
561 [ExpectedException (typeof (XmlException))]
562 public void ReadExtraCloseBrace ()
564 ReadToEnd (CreateReader ("]"));
568 [ExpectedException (typeof (XmlException))]
569 [Category ("NotDotNet")] // hmm, why does it pass?
570 public void ReadExtraCloseBrace2 ()
572 ReadToEnd (CreateReader ("[]]"));
576 [ExpectedException (typeof (XmlException))]
577 public void ReadOpenCurlyCloseBrace ()
579 ReadToEnd (CreateReader ("{]"));
583 [ExpectedException (typeof (XmlException))]
584 public void ReadOpenBraceCloseCurly ()
586 ReadToEnd (CreateReader ("[}"));
590 [ExpectedException (typeof (XmlException))]
591 public void ReadParens ()
593 ReadToEnd (CreateReader ("()"));
597 public void ReadValidNumber ()
599 ReadToEnd (CreateReader ("0"));
603 public void ReadValidNumber2 ()
605 ReadToEnd (CreateReader ("-0"));
609 public void ReadValidNumber3 ()
611 ReadToEnd (CreateReader ("0e5"));
615 public void ReadValidNumber4 ()
617 ReadToEnd (CreateReader ("0.5"));
621 [ExpectedException (typeof (XmlException))]
622 public void ReadInvalidNumber ()
624 CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
626 Thread.CurrentThread.CurrentCulture = new CultureInfo ("de-DE");
627 // if we read a number just by current culture, it will be regarded as correct JSON.
628 ReadToEnd (CreateReader ("123,45"));
630 Thread.CurrentThread.CurrentCulture = originalCulture;
635 public void ReadValidNumberGerman ()
637 CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
639 Thread.CurrentThread.CurrentCulture = new CultureInfo ("de-DE");
640 var s = GetInput ("123.45"); // German is ',' for decimals
641 var r = new DataContractJsonSerializer (typeof (double));
642 var d = (double) r.ReadObject (s);
643 Assert.AreEqual (123.45, d, "InvariantCulture");
645 Thread.CurrentThread.CurrentCulture = originalCulture;
650 [ExpectedException (typeof (XmlException))]
651 public void ReadInvalidNumber2 ()
653 ReadToEnd (CreateReader ("+5"));
657 [ExpectedException (typeof (XmlException))]
658 [Category ("NotDotNet")] // likely .NET bug
659 public void ReadInvalidNumber3 ()
661 ReadToEnd (CreateReader ("01"));
665 [ExpectedException (typeof (XmlException))]
666 public void ReadInvalidNumber4 ()
668 ReadToEnd (CreateReader (".1"));
672 [ExpectedException (typeof (XmlException))]
673 [Category ("NotDotNet")] // likely .NET bug
674 public void ReadInvalidNumber5 ()
676 ReadToEnd (CreateReader ("10."));
680 [ExpectedException (typeof (XmlException))]
681 public void ReadInvalidNumber7 ()
683 ReadToEnd (CreateReader ("e5"));
687 [ExpectedException (typeof (XmlException))]
688 [Category ("NotDotNet")] // likely .NET bug
689 public void ReadInvalidNumber8 ()
691 ReadToEnd (CreateReader ("-e5"));
695 [ExpectedException (typeof (XmlException))]
696 [Category ("NotDotNet")] // likely .NET bug
697 public void ReadInvalidNumber9 ()
699 ReadToEnd (CreateReader ("-e5.5"));
703 public void ReadInvalidNumber10 () // bug #531904
705 ReadToEnd (CreateReader ("4.29153442382814E-05"));
709 [ExpectedException (typeof (XmlException))]
710 public void ReadInvalidObjectContent ()
712 ReadToEnd (CreateReader ("{\"foo\"}"));
716 [ExpectedException (typeof (XmlException))]
717 [Category ("NotDotNet")] // likely .NET bug
718 public void ReadInvalidObjectContent2 ()
720 ReadToEnd (CreateReader ("{\"A\": 123 456}"));
724 [ExpectedException (typeof (XmlException))]
725 public void ReadInvalidObjectContent3 ()
727 ReadToEnd (CreateReader ("{, \"A\":123, \"B\":456}"));
731 [ExpectedException (typeof (XmlException))]
732 [Category ("NotDotNet")] // likely .NET bug
733 public void ReadInvalidObjectContent4 ()
735 ReadToEnd (CreateReader ("{\"A\":123, \"B\":456,}"));
739 [ExpectedException (typeof (XmlException))]
740 public void ReadInvalidArrayContent ()
742 ReadToEnd (CreateReader ("[\"foo\":\"bar\"]"));
746 [ExpectedException (typeof (XmlException))]
747 [Category ("NotDotNet")] // likely .NET bug
748 public void ReadInvalidArrayContent2 ()
750 ReadToEnd (CreateReader ("[123 456]"));
754 [ExpectedException (typeof (XmlException))]
755 public void ReadInvalidArrayContent3 ()
757 ReadToEnd (CreateReader ("[,123,456]"));
761 [ExpectedException (typeof (XmlException))]
762 [Category ("NotDotNet")] // likely .NET bug
763 public void ReadInvalidArrayContent4 ()
765 ReadToEnd (CreateReader ("[123,456,]"));
769 public void ReadObjectRuntimeTypeAsAttribute ()
771 XmlDictionaryReader r = CreateReader ("{\"__type\":\"System.Int32\"}");
773 AssertNode (0, "root", XmlNodeType.Element, String.Empty, "object", r, "#1");
774 Assert.IsTrue (r.MoveToAttribute ("type"), "#2");
775 AssertNode (0, "type", XmlNodeType.Attribute, "object", "object", r, "#3");
776 Assert.IsTrue (r.MoveToAttribute ("__type"), "#4");
777 AssertNode (0, "__type", XmlNodeType.Attribute, "System.Int32", "object", r, "#5");
779 Assert.AreEqual (XmlNodeType.EndElement, r.NodeType, "#6");
783 public void ReadObjectRuntimeType ()
785 XmlDictionaryReader r = CreateReader ("{\"__type\":\"System.Int32\", \"foo\":true}");
787 AssertNode (0, "root", XmlNodeType.Element, String.Empty, "object", r, "#1");
788 Assert.IsTrue (r.MoveToAttribute ("type"), "#2");
789 AssertNode (0, "type", XmlNodeType.Attribute, "object", "object", r, "#3");
790 Assert.IsTrue (r.MoveToAttribute ("__type"), "#4");
791 AssertNode (0, "__type", XmlNodeType.Attribute, "System.Int32", "object", r, "#5");
793 Assert.AreEqual (XmlNodeType.Element, r.NodeType, "#6");
794 Assert.AreEqual ("foo", r.LocalName, "#7");
798 [ExpectedException (typeof (XmlException))]
799 public void ReadInvalidObjectRuntimeTypeValue ()
801 ReadToEnd (CreateReader ("{\"__type\":true}"));
805 public void ReadObjectRuntimeTypeIncorrectPosition ()
807 XmlReader r = CreateReader ("{\"foo\" : false, \"__type\" : \"System.Int32\"}");
809 // When __type is not at the first content, it is not regarded as an attribute. Note that it is not treated as an error.
810 Assert.IsFalse (r.MoveToAttribute ("__type"));
815 public void ReadObjectRuntimeTypeInArray ()
817 XmlReader r = CreateReader (@"[{""__type"":""DCWithEnum:#MonoTests.System.Runtime.Serialization.Json"",""_colors"":0}]");
819 Assert.AreEqual ("root", r.LocalName, "#1-1");
820 Assert.AreEqual ("array", r.GetAttribute ("type"), "#1-2");
822 Assert.AreEqual ("item", r.LocalName, "#2-1");
823 Assert.AreEqual ("object", r.GetAttribute ("type"), "#2-2");
824 Assert.IsNotNull (r.GetAttribute ("__type"), "#2-3");
831 XmlReader r = CreateReader ("{\"type\" : \"\", \"valid\" : \"0\", \"other\" : \"\"}");
832 r.ReadStartElement ();
834 Assert.AreEqual ("type", r.Name, "Skip-1");
835 r.ReadElementContentAsString ();
837 Assert.AreEqual ("valid", r.Name, "Skip-2");
839 Assert.AreEqual ("other", r.Name, "Skip-3");
845 XmlReader r = CreateReader ("{\"type\" : \"\", \"valid\" : \"0\"}");
846 r.ReadStartElement ();
848 Assert.AreEqual (2, r.Depth, "Depth-1");
852 public void UnicodeEncodingAutoDetect ()
854 var ms = new MemoryStream (Encoding.Unicode.GetBytes ("{\"type\" : \"\", \"valid\" : \"0\"}"));
855 XmlReader r = JsonReaderWriterFactory.CreateJsonReader (ms, new XmlDictionaryReaderQuotas ());
856 r.ReadStartElement ();
861 public void ReadNumberAsObject ()
863 const double testValue = 42.42D;
864 var serializer = new DataContractJsonSerializer (typeof (object));
865 var serializedStream = GetInput (testValue.ToString (CultureInfo.InvariantCulture));
866 var deserializedValue = serializer.ReadObject (serializedStream);
867 Assert.AreEqual (typeof (decimal), deserializedValue.GetType ());
868 Assert.AreEqual (testValue, (decimal) deserializedValue);
872 public void IEnumerableTest ()
874 string json = "[\"A\", \"B\"]";
875 using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json))) {
876 DataContractJsonSerializer jsonSerializer = new
877 DataContractJsonSerializer(typeof(IEnumerable<string>));
878 var result = jsonSerializer.ReadObject(stream);
879 Assert.AreEqual (typeof (List<string>), result.GetType ());