Json.NET
Code Coverage Statistics for Source File

Newtonsoft.Json.Tests\JsonTextReaderTest.cs

Symbol Coverage: 97.51% (353 of 362)

Branch Coverage: 76.92% (30 of 39)

Cyclomatic Complexity Avg: 1.37 Max:4

Code Lines: 401


L V Source
1
#region License
2
// Copyright (c) 2007 James Newton-King
3
//
4
// Permission is hereby granted, free of charge, to any person
5
// obtaining a copy of this software and associated documentation
6
// files (the "Software"), to deal in the Software without
7
// restriction, including without limitation the rights to use,
8
// copy, modify, merge, publish, distribute, sublicense, and/or sell
9
// copies of the Software, and to permit persons to whom the
10
// Software is furnished to do so, subject to the following
11
// conditions:
12
//
13
// The above copyright notice and this permission notice shall be
14
// included in all copies or substantial portions of the Software.
15
//
16
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
// OTHER DEALINGS IN THE SOFTWARE.
24
#endregion
25

  
26
using System;
27
using System.Collections.Generic;
28
using System.Text;
29
using NUnit.Framework;
30
using Newtonsoft.Json;
31
using System.IO;
32
using System.Xml;
33

  
34
namespace Newtonsoft.Json.Tests
35
{
36
  public class JsonTextReaderTest : TestFixtureBase
37
  {
38
    [Test]
39
    public void YahooFinance()
40
    {
41
 1
      string input = @"{
42
 1
""matches"" : [
43
 1
{""t"":""C"", ""n"":""Citigroup Inc."", ""e"":""NYSE"", ""id"":""662713""}
44
 1
,{""t"":""CHL"", ""n"":""China Mobile Ltd. (ADR)"", ""e"":""NYSE"", ""id"":""660998""}
45
 1
,{""t"":""PTR"", ""n"":""PetroChina Company Limited (ADR)"", ""e"":""NYSE"", ""id"":""664536""}
46
 1
,{""t"":""RIO"", ""n"":""Companhia Vale do Rio Doce (ADR)"", ""e"":""NYSE"", ""id"":""671472""}
47
 1
,{""t"":""RIOPR"", ""n"":""Companhia Vale do Rio Doce (ADR)"", ""e"":""NYSE"", ""id"":""3512643""}
48
 1
,{""t"":""CSCO"", ""n"":""Cisco Systems, Inc."", ""e"":""NASDAQ"", ""id"":""99624""}
49
 1
,{""t"":""CVX"", ""n"":""Chevron Corporation"", ""e"":""NYSE"", ""id"":""667226""}
50
 1
,{""t"":""TM"", ""n"":""Toyota Motor Corporation (ADR)"", ""e"":""NYSE"", ""id"":""655880""}
51
 1
,{""t"":""JPM"", ""n"":""JPMorgan Chase \\x26 Co."", ""e"":""NYSE"", ""id"":""665639""}
52
 1
,{""t"":""COP"", ""n"":""ConocoPhillips"", ""e"":""NYSE"", ""id"":""1691168""}
53
 1
,{""t"":""LFC"", ""n"":""China Life Insurance Company Ltd. (ADR)"", ""e"":""NYSE"", ""id"":""688679""}
54
 1
,{""t"":""NOK"", ""n"":""Nokia Corporation (ADR)"", ""e"":""NYSE"", ""id"":""657729""}
55
 1
,{""t"":""KO"", ""n"":""The Coca-Cola Company"", ""e"":""NYSE"", ""id"":""6550""}
56
 1
,{""t"":""VZ"", ""n"":""Verizon Communications Inc."", ""e"":""NYSE"", ""id"":""664887""}
57
 1
,{""t"":""AMX"", ""n"":""America Movil S.A.B de C.V. (ADR)"", ""e"":""NYSE"", ""id"":""665834""}],
58
 1
""all"" : false
59
 1
}
60
 1
";
61

  
62
 1
      using (JsonReader jsonReader = new JsonTextReader(new StringReader(input)))
63
      {
64
 158
        while (jsonReader.Read())
65
        {
66
 157
          Console.WriteLine(jsonReader.Value);
67
        }
68
      }
69
 1
    }
70

  
71
    [Test]
72
    public void ReadingIndented()
73
    {
74
 1
      string input = @"{
75
 1
  CPU: 'Intel',
76
 1
  Drives: [
77
 1
    'DVD read/writer',
78
 1
    ""500 gigabyte hard drive""
79
 1
  ]
80
 1
}";
81

  
82
 1
      StringReader sr = new StringReader(input);
83

  
84
 1
      using (JsonTextReader jsonReader = new JsonTextReader(sr))
85
      {
86
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.None);
87
 1
        Assert.AreEqual(0, jsonReader.LineNumber);
88
 1
        Assert.AreEqual(0, jsonReader.LinePosition);
89

  
90
 1
        jsonReader.Read();
91
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
92
 1
        Assert.AreEqual(1, jsonReader.LineNumber);
93
 1
        Assert.AreEqual(1, jsonReader.LinePosition);
94

  
95
 1
        jsonReader.Read();
96
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
97
 1
        Assert.AreEqual(jsonReader.Value, "CPU");
98
 1
        Assert.AreEqual(2, jsonReader.LineNumber);
99
 1
        Assert.AreEqual(6, jsonReader.LinePosition);
100

  
101
 1
        jsonReader.Read();
102
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
103
 1
        Assert.AreEqual(jsonReader.Value, "Intel");
104
 1
        Assert.AreEqual(2, jsonReader.LineNumber);
105
 1
        Assert.AreEqual(14, jsonReader.LinePosition);
106

  
107
 1
        jsonReader.Read();
108
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
109
 1
        Assert.AreEqual(jsonReader.Value, "Drives");
110
 1
        Assert.AreEqual(3, jsonReader.LineNumber);
111
 1
        Assert.AreEqual(9, jsonReader.LinePosition);
112

  
113
 1
        jsonReader.Read();
114
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
115
 1
        Assert.AreEqual(3, jsonReader.LineNumber);
116
 1
        Assert.AreEqual(11, jsonReader.LinePosition);
117

  
118
 1
        jsonReader.Read();
119
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
120
 1
        Assert.AreEqual(jsonReader.Value, "DVD read/writer");
121
 1
        Assert.AreEqual(jsonReader.QuoteChar, '\'');
122
 1
        Assert.AreEqual(4, jsonReader.LineNumber);
123
 1
        Assert.AreEqual(21, jsonReader.LinePosition);
124

  
125
 1
        jsonReader.Read();
126
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
127
 1
        Assert.AreEqual(jsonReader.Value, "500 gigabyte hard drive");
128
 1
        Assert.AreEqual(jsonReader.QuoteChar, '"');
129
 1
        Assert.AreEqual(5, jsonReader.LineNumber);
130
 1
        Assert.AreEqual(29, jsonReader.LinePosition);
131

  
132
 1
        jsonReader.Read();
133
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
134
 1
        Assert.AreEqual(6, jsonReader.LineNumber);
135
 1
        Assert.AreEqual(3, jsonReader.LinePosition);
136

  
137
 1
        jsonReader.Read();
138
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
139
 1
        Assert.AreEqual(7, jsonReader.LineNumber);
140
 1
        Assert.AreEqual(1, jsonReader.LinePosition);
141

  
142
 1
        Assert.IsFalse(jsonReader.Read());
143
      }
144
 1
    }
145

  
146
    [Test]
147
    public void Depth()
148
    {
149
 1
      string input = "{value:'Purple\\r \\n monkey\\'s:\\tdishwasher',array:[1,2]}";
150

  
151
 1
      StringReader sr = new StringReader(input);
152

  
153
 1
      using (JsonReader jsonReader = new JsonTextReader(sr))
154
      {
155
 1
        Assert.AreEqual(0, jsonReader.Depth);
156

  
157
 1
        jsonReader.Read();
158
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
159
 1
        Assert.AreEqual(0, jsonReader.Depth);
160

  
161
 1
        jsonReader.Read();
162
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
163
 1
        Assert.AreEqual(1, jsonReader.Depth);
164

  
165
 1
        jsonReader.Read();
166
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
167
 1
        Assert.AreEqual(jsonReader.Value, "Purple\r \n monkey's:\tdishwasher");
168
 1
        Assert.AreEqual(jsonReader.QuoteChar, '\'');
169
 1
        Assert.AreEqual(1, jsonReader.Depth);
170

  
171
 1
        jsonReader.Read();
172
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
173
 1
        Assert.AreEqual(1, jsonReader.Depth);
174

  
175
 1
        jsonReader.Read();
176
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
177
 1
        Assert.AreEqual(2, jsonReader.Depth);
178

  
179
 1
        jsonReader.Read();
180
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.Integer);
181
 1
        Assert.AreEqual(1, jsonReader.Value);
182
 1
        Assert.AreEqual(3, jsonReader.Depth);
183

  
184
 1
        jsonReader.Read();
185
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.Integer);
186
 1
        Assert.AreEqual(2, jsonReader.Value);
187
 1
        Assert.AreEqual(3, jsonReader.Depth);
188

  
189
 1
        jsonReader.Read();
190
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
191
 1
        Assert.AreEqual(1, jsonReader.Depth);
192

  
193
 1
        jsonReader.Read();
194
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
195
 1
        Assert.AreEqual(0, jsonReader.Depth);
196
      }
197
 1
    }
198

  
199
    [Test]
200
    [ExpectedException(typeof(ArgumentNullException), ExpectedMessage = @"Value cannot be null.
201
Parameter name: reader")]
202
    public void NullTextReader()
203
    {
204
 1
      new JsonTextReader(null);
205
 0
    }
206
    
207
    [Test]
208
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unterminated string. Expected delimiter: '. Line 1, position 3.")]
209
    public void UnexpectedEndOfString()
210
    {
211
 1
      JsonReader reader = new JsonTextReader(new StringReader("'hi"));
212
 1
      reader.Read();
213
 0
    }
214

  
215
    [Test]
216
    public void ReadNullTerminatorStrings()
217
    {
218
 1
      JsonReader reader = new JsonTextReader(new StringReader("'h\0i'"));
219
 1
      Assert.IsTrue(reader.Read());
220

  
221
 1
      Assert.AreEqual("h\0i", reader.Value);
222
 1
    }
223
    
224
    [Test]
225
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unexpected end while parsing unicode character. Line 1, position 7.")]
226
    public void UnexpectedEndOfHex()
227
    {
228
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"'h\u006"));
229
 1
      reader.Read();
230
 0
    }
231
    
232
    [Test]
233
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unterminated string. Expected delimiter: '. Line 1, position 3.")]
234
    public void UnexpectedEndOfControlCharacter()
235
    {
236
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"'h\"));
237
 1
      reader.Read();
238
 0
    }
239

  
240
    [Test]
241
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unexpected character encountered while parsing value: t. Line 1, position 1.")]
242
    public void ReadBytesWithBadCharacter()
243
    {
244
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"true"));
245
 1
      reader.ReadAsBytes();
246
 0
    }
247

  
248
    [Test]
249
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unterminated string. Expected delimiter: '. Line 1, position 17.")]
250
    public void ReadBytesWithUnexpectedEnd()
251
    {
252
 1
      string helloWorld = "Hello world!";
253
 1
      byte[] helloWorldData = Encoding.UTF8.GetBytes(helloWorld);
254

  
255
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"'" + Convert.ToBase64String(helloWorldData)));
256
 1
      reader.ReadAsBytes();
257
 0
    }
258

  
259
    [Test]
260
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unexpected end when reading bytes: Line 1, position 3.")]
261
    public void ReadBytesNoStartWithUnexpectedEnd()
262
    {
263
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"[  "));
264
 1
      Assert.IsTrue(reader.Read());
265
 1
      reader.ReadAsBytes();
266
 0
    }
267

  
268
    [Test]
269
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Unexpected end when parsing unquoted property name. Line 1, position 4.")]
270
    public void UnexpectedEndWhenParsingUnquotedProperty()
271
    {
272
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"{aww"));
273
 1
      Assert.IsTrue(reader.Read());
274
 1
      reader.Read();
275
 0
    }
276

  
277
    [Test]
278
    public void ParsingQuotedPropertyWithControlCharacters()
279
    {
280
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"{'hi\r\nbye':1}"));
281
 1
      Assert.IsTrue(reader.Read());
282
 1
      Assert.IsTrue(reader.Read());
283
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
284
 1
      Assert.AreEqual(@"hi
285
 1
bye", reader.Value);
286
 1
      Assert.IsTrue(reader.Read());
287
 1
      Assert.IsTrue(reader.Read());
288
 1
      Assert.IsFalse(reader.Read());
289
 1
    }
290

  
291
    [Test]
292
    public void ReadBytesFollowingNumberInArray()
293
    {
294
 1
      string helloWorld = "Hello world!";
295
 1
      byte[] helloWorldData = Encoding.UTF8.GetBytes(helloWorld);
296

  
297
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"[1,'" + Convert.ToBase64String(helloWorldData) + @"']"));
298
 1
      Assert.IsTrue(reader.Read());
299
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
300
 1
      Assert.IsTrue(reader.Read());
301
 1
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
302
 1
      byte[] data = reader.ReadAsBytes();
303
 1
      Assert.AreEqual(helloWorldData, data);
304
 1
      Assert.AreEqual(JsonToken.Bytes, reader.TokenType);
305
 1
      Assert.IsTrue(reader.Read());
306
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
307

  
308
 1
      Assert.IsFalse(reader.Read());
309
 1
    }
310

  
311
    [Test]
312
    public void ReadBytesFollowingNumberInObject()
313
    {
314
 1
      string helloWorld = "Hello world!";
315
 1
      byte[] helloWorldData = Encoding.UTF8.GetBytes(helloWorld);
316

  
317
 1
      JsonReader reader = new JsonTextReader(new StringReader(@"{num:1,data:'" + Convert.ToBase64String(helloWorldData) + @"'}"));
318
 1
      Assert.IsTrue(reader.Read());
319
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
320
 1
      Assert.IsTrue(reader.Read());
321
 1
      Assert.IsTrue(reader.Read());
322
 1
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
323
 1
      Assert.IsTrue(reader.Read());
324
 1
      byte[] data = reader.ReadAsBytes();
325
 1
      Assert.AreEqual(helloWorldData, data);
326
 1
      Assert.AreEqual(JsonToken.Bytes, reader.TokenType);
327
 1
      Assert.IsTrue(reader.Read());
328
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
329

  
330
 1
      Assert.IsFalse(reader.Read());
331
 1
    }
332

  
333
    [Test]
334
    public void ReadingEscapedStrings()
335
    {
336
 1
      string input = "{value:'Purple\\r \\n monkey\\'s:\\tdishwasher'}";
337

  
338
 1
      StringReader sr = new StringReader(input);
339

  
340
 1
      using (JsonReader jsonReader = new JsonTextReader(sr))
341
      {
342
 1
        Assert.AreEqual(0, jsonReader.Depth);
343

  
344
 1
        jsonReader.Read();
345
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
346
 1
        Assert.AreEqual(0, jsonReader.Depth);
347

  
348
 1
        jsonReader.Read();
349
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
350
 1
        Assert.AreEqual(1, jsonReader.Depth);
351

  
352
 1
        jsonReader.Read();
353
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
354
 1
        Assert.AreEqual(jsonReader.Value, "Purple\r \n monkey's:\tdishwasher");
355
 1
        Assert.AreEqual(jsonReader.QuoteChar, '\'');
356
 1
        Assert.AreEqual(1, jsonReader.Depth);
357

  
358
 1
        jsonReader.Read();
359
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
360
 1
        Assert.AreEqual(0, jsonReader.Depth);
361
      }
362
 1
    }
363

  
364
    [Test]
365
    public void ReadNewlineLastCharacter()
366
    {
367
 1
      string input = @"{
368
 1
  CPU: 'Intel',
369
 1
  Drives: [ /* Com*ment */
370
 1
    'DVD read/writer',
371
 1
    ""500 gigabyte hard drive""
372
 1
  ]
373
 1
}" + '\n';
374

  
375
 1
      object o = JsonConvert.DeserializeObject(input);
376
 1
    }
377

  
378
    [Test]
379
    public void WriteReadWrite()
380
    {
381
 1
      StringBuilder sb = new StringBuilder();
382
 1
      StringWriter sw = new StringWriter(sb);
383

  
384
 1
      using (JsonWriter jsonWriter = new JsonTextWriter(sw))
385
      {
386
 1
        jsonWriter.WriteStartArray();
387
 1
        jsonWriter.WriteValue(true);
388

  
389
 1
        jsonWriter.WriteStartObject();
390
 1
        jsonWriter.WritePropertyName("integer");
391
 1
        jsonWriter.WriteValue(99);
392
 1
        jsonWriter.WritePropertyName("string");
393
 1
        jsonWriter.WriteValue("how now brown cow?");
394
 1
        jsonWriter.WritePropertyName("array");
395

  
396
 1
        jsonWriter.WriteStartArray();
397
 1
        for (int i = 0; i < 5; i++)
398
        {
399
 5
          jsonWriter.WriteValue(i);
400
        }
401

  
402
 1
        jsonWriter.WriteStartObject();
403
 1
        jsonWriter.WritePropertyName("decimal");
404
 1
        jsonWriter.WriteValue(990.00990099m);
405
 1
        jsonWriter.WriteEndObject();
406

  
407
 1
        jsonWriter.WriteValue(5);
408
 1
        jsonWriter.WriteEndArray();
409

  
410
 1
        jsonWriter.WriteEndObject();
411

  
412
 1
        jsonWriter.WriteValue("This is a string.");
413
 1
        jsonWriter.WriteNull();
414
 1
        jsonWriter.WriteNull();
415
 1
        jsonWriter.WriteEndArray();
416
      }
417

  
418
 1
      string json = sb.ToString();
419

  
420
 1
      JsonSerializer serializer = new JsonSerializer();
421

  
422
 1
      object jsonObject = serializer.Deserialize(new JsonTextReader(new StringReader(json)));
423

  
424
 1
      sb = new StringBuilder();
425
 1
      sw = new StringWriter(sb);
426

  
427
 1
      using (JsonWriter jsonWriter = new JsonTextWriter(sw))
428
      {
429
 1
        serializer.Serialize(sw, jsonObject);
430
      }
431

  
432
 1
      Assert.AreEqual(json, sb.ToString());
433
 1
    }
434

  
435
    [Test]
436
    public void FloatingPointNonFiniteNumbers()
437
    {
438
 1
      string input = @"[
439
 1
  NaN,
440
 1
  Infinity,
441
 1
  -Infinity
442
 1
]";
443

  
444
 1
      StringReader sr = new StringReader(input);
445

  
446
 1
      using (JsonReader jsonReader = new JsonTextReader(sr))
447
      {
448
 1
        jsonReader.Read();
449
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
450

  
451
 1
        jsonReader.Read();
452
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
453
 1
        Assert.AreEqual(jsonReader.Value, double.NaN);
454

  
455
 1
        jsonReader.Read();
456
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
457
 1
        Assert.AreEqual(jsonReader.Value, double.PositiveInfinity);
458

  
459
 1
        jsonReader.Read();
460
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.Float);
461
 1
        Assert.AreEqual(jsonReader.Value, double.NegativeInfinity);
462

  
463
 1
        jsonReader.Read();
464
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
465
      }
466
 1
    }
467

  
468
    [Test]
469
    public void LongStringTest()
470
    {
471
 1
      int length = 20000;
472
 1
      string json = @"[""" + new string(' ', length) + @"""]";
473

  
474
 1
      JsonTextReader reader = new JsonTextReader(new StringReader(json));
475

  
476
 1
      reader.Read();
477
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
478

  
479
 1
      reader.Read();
480
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
481
 1
      Assert.AreEqual(typeof(string), reader.ValueType);
482
 1
      Assert.AreEqual(20000, reader.Value.ToString().Length);
483

  
484
 1
      reader.Read();
485
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
486

  
487
 1
      reader.Read();
488
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
489
 1
    }
490

  
491
    [Test]
492
    public void EscapedUnicodeText()
493
    {
494
 1
      string json = @"[""\u003c"",""\u5f20""]";
495

  
496
 1
      JsonTextReader reader = new JsonTextReader(new StringReader(json));
497
  
498
 1
      reader.Read();
499
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
500
      
501
 1
      reader.Read();
502
 1
      Assert.AreEqual("<", reader.Value);
503

  
504
 1
      reader.Read();
505
 1
      Assert.AreEqual(24352, Convert.ToInt32(Convert.ToChar((string)reader.Value)));
506

  
507
 1
      reader.Read();
508
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
509
 1
    }
510

  
511
    [Test]
512
    public void ReadFloatingPointNumber()
513
    {
514
 1
      string json =
515
 1
        @"[0.0,0.0,0.1,1.0,1.000001,1E-06,4.94065645841247E-324,Infinity,-Infinity,NaN,1.7976931348623157E+308,-1.7976931348623157E+308,Infinity,-Infinity,NaN]";
516

  
517
 1
      using (JsonReader jsonReader = new JsonTextReader(new StringReader(json)))
518
      {
519
 1
        jsonReader.Read();
520
 1
        Assert.AreEqual(JsonToken.StartArray, jsonReader.TokenType);
521

  
522
 1
        jsonReader.Read();
523
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
524
 1
        Assert.AreEqual(0.0, jsonReader.Value);
525

  
526
 1
        jsonReader.Read();
527
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
528
 1
        Assert.AreEqual(0.0, jsonReader.Value);
529

  
530
 1
        jsonReader.Read();
531
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
532
 1
        Assert.AreEqual(0.1, jsonReader.Value);
533

  
534
 1
        jsonReader.Read();
535
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
536
 1
        Assert.AreEqual(1.0, jsonReader.Value);
537

  
538
 1
        jsonReader.Read();
539
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
540
 1
        Assert.AreEqual(1.000001, jsonReader.Value);
541

  
542
 1
        jsonReader.Read();
543
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
544
 1
        Assert.AreEqual(1E-06, jsonReader.Value);
545

  
546
 1
        jsonReader.Read();
547
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
548
 1
        Assert.AreEqual(4.94065645841247E-324, jsonReader.Value);
549

  
550
 1
        jsonReader.Read();
551
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
552
 1
        Assert.AreEqual(double.PositiveInfinity, jsonReader.Value);
553

  
554
 1
        jsonReader.Read();
555
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
556
 1
        Assert.AreEqual(double.NegativeInfinity, jsonReader.Value);
557

  
558
 1
        jsonReader.Read();
559
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
560
 1
        Assert.AreEqual(double.NaN, jsonReader.Value);
561

  
562
 1
        jsonReader.Read();
563
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
564
 1
        Assert.AreEqual(double.MaxValue, jsonReader.Value);
565

  
566
 1
        jsonReader.Read();
567
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
568
 1
        Assert.AreEqual(double.MinValue, jsonReader.Value);
569

  
570
 1
        jsonReader.Read();
571
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
572
 1
        Assert.AreEqual(double.PositiveInfinity, jsonReader.Value);
573

  
574
 1
        jsonReader.Read();
575
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
576
 1
        Assert.AreEqual(double.NegativeInfinity, jsonReader.Value);
577

  
578
 1
        jsonReader.Read();
579
 1
        Assert.AreEqual(JsonToken.Float, jsonReader.TokenType);
580
 1
        Assert.AreEqual(double.NaN, jsonReader.Value);
581

  
582
 1
        jsonReader.Read();
583
 1
        Assert.AreEqual(JsonToken.EndArray, jsonReader.TokenType);
584
      }
585
 1
    }
586

  
587
    [Test]
588
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = @"Invalid character after parsing property name. Expected ':' but got: "". Line 3, position 9.")]
589
    public void MissingColon()
590
    {
591
 1
      string json = @"{
592
 1
    ""A"" : true,
593
 1
    ""B"" ""hello"", // Notice the colon is missing
594
 1
    ""C"" : ""bye""
595
 1
}";
596

  
597
 1
      JsonTextReader reader = new JsonTextReader(new StringReader(json));
598

  
599
 1
      reader.Read();
600
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
601

  
602
 1
      reader.Read();
603
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
604

  
605
 1
      reader.Read();
606
 1
      Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
607

  
608
 1
      reader.Read();
609
 0
    }
610

  
611
    [Test]
612
    public void ReadSingleBytes()
613
    {
614
 1
      StringReader s = new StringReader(@"""SGVsbG8gd29ybGQu""");
615
 1
      JsonTextReader reader = new JsonTextReader(s);
616

  
617
 1
      byte[] data = reader.ReadAsBytes();
618
 1
      Assert.IsNotNull(data);
619

  
620
 1
      string text = Encoding.UTF8.GetString(data, 0, data.Length);
621
 1
      Assert.AreEqual("Hello world.", text);
622
 1
    }
623

  
624
    [Test]
625
    public void ReadOctalNumber()
626
    {
627
 1
      StringReader s = new StringReader(@"[0372, 0xFA, 0XFA]");
628
 1
      JsonTextReader jsonReader = new JsonTextReader(s);
629

  
630
 1
      Assert.IsTrue(jsonReader.Read());
631
 1
      Assert.AreEqual(JsonToken.StartArray, jsonReader.TokenType);
632

  
633
 1
      Assert.IsTrue(jsonReader.Read());
634
 1
      Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
635
 1
      Assert.AreEqual(250, jsonReader.Value);
636

  
637
 1
      Assert.IsTrue(jsonReader.Read());
638
 1
      Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
639
 1
      Assert.AreEqual(250, jsonReader.Value);
640

  
641
 1
      Assert.IsTrue(jsonReader.Read());
642
 1
      Assert.AreEqual(JsonToken.Integer, jsonReader.TokenType);
643
 1
      Assert.AreEqual(250, jsonReader.Value);
644

  
645
 1
      Assert.IsTrue(jsonReader.Read());
646
 1
      Assert.AreEqual(JsonToken.EndArray, jsonReader.TokenType);
647

  
648
 1
      Assert.IsFalse(jsonReader.Read());
649
 1
    }
650

  
651
    [Test]
652
    public void ReadUnicode()
653
    {
654
 1
      string json = @"{""Message"":""Hi,I\u0092ve send you smth""}";
655

  
656
 1
      JsonTextReader reader = new JsonTextReader(new StringReader(json));
657

  
658
 1
      Assert.IsTrue(reader.Read());
659
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
660

  
661
 1
      Assert.IsTrue(reader.Read());
662
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
663
 1
      Assert.AreEqual("Message", reader.Value);
664

  
665
 1
      Assert.IsTrue(reader.Read());
666
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
667
 1
      Assert.AreEqual(@"Hi,I" + '\u0092' + "ve send you smth", reader.Value);
668

  
669
 1
      Assert.IsTrue(reader.Read());
670
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
671

  
672
 1
      Assert.IsFalse(reader.Read());
673
 1
    }
674
  }
675
}