Json.NET
Code Coverage Statistics for Source File

Newtonsoft.Json.Tests\Linq\JTokenReaderTest.cs

Symbol Coverage: 99.32% (146 of 147)

Branch Coverage: 91.67% (11 of 12)

Cyclomatic Complexity Avg: 1.71 Max:3

Code Lines: 167


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 Newtonsoft.Json.Linq;
33

  
34
namespace Newtonsoft.Json.Tests.Linq
35
{
36
  public class JTokenReaderTest : TestFixtureBase
37
  {
38
#if !PocketPC && !NET20
39
    [Test]
40
    public void YahooFinance()
41
    {
42
 1
      JObject o =
43
 1
        new JObject(
44
 1
          new JProperty("Test1", new DateTime(2000, 10, 15, 5, 5, 5, DateTimeKind.Utc)),
45
 1
          new JProperty("Test2", new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0))),
46
 1
          new JProperty("Test3", "Test3Value"),
47
 1
          new JProperty("Test4", null)
48
 1
        );
49

  
50
 1
      using (JTokenReader jsonReader = new JTokenReader(o))
51
      {
52
 1
        IJsonLineInfo lineInfo = jsonReader;
53

  
54
 1
        jsonReader.Read();
55
 1
        Assert.AreEqual(JsonToken.StartObject, jsonReader.TokenType);
56
 1
        Assert.AreEqual(false, lineInfo.HasLineInfo());
57

  
58
 1
        jsonReader.Read();
59
 1
        Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
60
 1
        Assert.AreEqual("Test1", jsonReader.Value);
61
 1
        Assert.AreEqual(false, lineInfo.HasLineInfo());
62

  
63
 1
        jsonReader.Read();
64
 1
        Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
65
 1
        Assert.AreEqual(new DateTime(2000, 10, 15, 5, 5, 5, DateTimeKind.Utc), jsonReader.Value);
66
 1
        Assert.AreEqual(false, lineInfo.HasLineInfo());
67
 1
        Assert.AreEqual(0, lineInfo.LinePosition);
68
 1
        Assert.AreEqual(0, lineInfo.LineNumber);
69

  
70
 1
        jsonReader.Read();
71
 1
        Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
72
 1
        Assert.AreEqual("Test2", jsonReader.Value);
73

  
74
 1
        jsonReader.Read();
75
 1
        Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
76
 1
        Assert.AreEqual(new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0)), jsonReader.Value);
77

  
78
 1
        jsonReader.Read();
79
 1
        Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
80
 1
        Assert.AreEqual("Test3", jsonReader.Value);
81

  
82
 1
        jsonReader.Read();
83
 1
        Assert.AreEqual(JsonToken.String, jsonReader.TokenType);
84
 1
        Assert.AreEqual("Test3Value", jsonReader.Value);
85

  
86
 1
        jsonReader.Read();
87
 1
        Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
88
 1
        Assert.AreEqual("Test4", jsonReader.Value);
89

  
90
 1
        jsonReader.Read();
91
 1
        Assert.AreEqual(JsonToken.Null, jsonReader.TokenType);
92
 1
        Assert.AreEqual(null, jsonReader.Value);
93

  
94
 1
        Assert.IsTrue(jsonReader.Read());
95
 1
        Assert.AreEqual(JsonToken.EndObject, jsonReader.TokenType);
96

  
97
 1
        Assert.IsFalse(jsonReader.Read());
98
      }
99

  
100
 1
      using (JsonReader jsonReader = new JTokenReader(o.Property("Test2")))
101
      {
102
 1
        Assert.IsTrue(jsonReader.Read());
103
 1
        Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
104
 1
        Assert.AreEqual("Test2", jsonReader.Value);
105

  
106
 1
        Assert.IsTrue(jsonReader.Read());
107
 1
        Assert.AreEqual(JsonToken.Date, jsonReader.TokenType);
108
 1
        Assert.AreEqual(new DateTimeOffset(2000, 10, 15, 5, 5, 5, new TimeSpan(11, 11, 0)), jsonReader.Value);
109

  
110
 1
        Assert.IsFalse(jsonReader.Read());
111
      }
112
 1
    }
113
#endif
114

  
115
    [Test]
116
    public void ReadLineInfo()
117
    {
118
 1
      string input = @"{
119
 1
  CPU: 'Intel',
120
 1
  Drives: [
121
 1
    'DVD read/writer',
122
 1
    ""500 gigabyte hard drive""
123
 1
  ]
124
 1
}";
125

  
126
 1
      StringReader sr = new StringReader(input);
127

  
128
 1
      JObject o = JObject.Parse(input);
129

  
130
 1
      using (JTokenReader jsonReader = new JTokenReader(o))
131
      {
132
 1
        IJsonLineInfo lineInfo = jsonReader;
133

  
134
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.None);
135
 1
        Assert.AreEqual(0, lineInfo.LineNumber);
136
 1
        Assert.AreEqual(0, lineInfo.LinePosition);
137
 1
        Assert.AreEqual(false, lineInfo.HasLineInfo());
138

  
139
 1
        jsonReader.Read();
140
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.StartObject);
141
 1
        Assert.AreEqual(1, lineInfo.LineNumber);
142
 1
        Assert.AreEqual(1, lineInfo.LinePosition);
143
 1
        Assert.AreEqual(true, lineInfo.HasLineInfo());
144

  
145
 1
        jsonReader.Read();
146
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
147
 1
        Assert.AreEqual(jsonReader.Value, "CPU");
148
 1
        Assert.AreEqual(2, lineInfo.LineNumber);
149
 1
        Assert.AreEqual(6, lineInfo.LinePosition);
150
 1
        Assert.AreEqual(true, lineInfo.HasLineInfo());
151

  
152
 1
        jsonReader.Read();
153
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
154
 1
        Assert.AreEqual(jsonReader.Value, "Intel");
155
 1
        Assert.AreEqual(2, lineInfo.LineNumber);
156
 1
        Assert.AreEqual(14, lineInfo.LinePosition);
157
 1
        Assert.AreEqual(true, lineInfo.HasLineInfo());
158

  
159
 1
        jsonReader.Read();
160
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.PropertyName);
161
 1
        Assert.AreEqual(jsonReader.Value, "Drives");
162
 1
        Assert.AreEqual(3, lineInfo.LineNumber);
163
 1
        Assert.AreEqual(9, lineInfo.LinePosition);
164
 1
        Assert.AreEqual(true, lineInfo.HasLineInfo());
165

  
166
 1
        jsonReader.Read();
167
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.StartArray);
168
 1
        Assert.AreEqual(3, lineInfo.LineNumber);
169
 1
        Assert.AreEqual(11, lineInfo.LinePosition);
170
 1
        Assert.AreEqual(true, lineInfo.HasLineInfo());
171

  
172
 1
        jsonReader.Read();
173
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
174
 1
        Assert.AreEqual(jsonReader.Value, "DVD read/writer");
175
 1
        Assert.AreEqual(4, lineInfo.LineNumber);
176
 1
        Assert.AreEqual(21, lineInfo.LinePosition);
177
 1
        Assert.AreEqual(true, lineInfo.HasLineInfo());
178

  
179
 1
        jsonReader.Read();
180
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.String);
181
 1
        Assert.AreEqual(jsonReader.Value, "500 gigabyte hard drive");
182
 1
        Assert.AreEqual(5, lineInfo.LineNumber);
183
 1
        Assert.AreEqual(29, lineInfo.LinePosition);
184
 1
        Assert.AreEqual(true, lineInfo.HasLineInfo());
185

  
186
 1
        jsonReader.Read();
187
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.EndArray);
188
 1
        Assert.AreEqual(0, lineInfo.LineNumber);
189
 1
        Assert.AreEqual(0, lineInfo.LinePosition);
190
 1
        Assert.AreEqual(false, lineInfo.HasLineInfo());
191

  
192
 1
        jsonReader.Read();
193
 1
        Assert.AreEqual(jsonReader.TokenType, JsonToken.EndObject);
194
 1
        Assert.AreEqual(0, lineInfo.LineNumber);
195
 1
        Assert.AreEqual(0, lineInfo.LinePosition);
196
 1
        Assert.AreEqual(false, lineInfo.HasLineInfo());
197
      }
198
 1
    }
199

  
200
    [Test]
201
    public void ReadBytes()
202
    {
203
 1
      byte[] data = Encoding.UTF8.GetBytes("Hello world!");
204

  
205
 1
      JObject o =
206
 1
        new JObject(
207
 1
          new JProperty("Test1", data)
208
 1
        );
209

  
210
 1
      using (JTokenReader jsonReader = new JTokenReader(o))
211
      {
212
 1
        jsonReader.Read();
213
 1
        Assert.AreEqual(JsonToken.StartObject, jsonReader.TokenType);
214

  
215
 1
        jsonReader.Read();
216
 1
        Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
217
 1
        Assert.AreEqual("Test1", jsonReader.Value);
218

  
219
 1
        byte[] readBytes = jsonReader.ReadAsBytes();
220
 1
        Assert.AreEqual(data, readBytes);
221

  
222
 1
        Assert.IsTrue(jsonReader.Read());
223
 1
        Assert.AreEqual(JsonToken.EndObject, jsonReader.TokenType);
224

  
225
 1
        Assert.IsFalse(jsonReader.Read());
226
      }
227
 1
    }
228

  
229
    [Test]
230
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "Error reading bytes. Expected bytes but got Integer.")]
231
    public void ReadBytesFailure()
232
    {
233
 1
      JObject o =
234
 1
        new JObject(
235
 1
          new JProperty("Test1", 1)
236
 1
        );
237

  
238
 1
      using (JTokenReader jsonReader = new JTokenReader(o))
239
      {
240
 1
        jsonReader.Read();
241
 1
        Assert.AreEqual(JsonToken.StartObject, jsonReader.TokenType);
242

  
243
 1
        jsonReader.Read();
244
 1
        Assert.AreEqual(JsonToken.PropertyName, jsonReader.TokenType);
245
 1
        Assert.AreEqual("Test1", jsonReader.Value);
246

  
247
 1
        jsonReader.ReadAsBytes();
248
      }
249
 0
    }
250

  
251
    public class HasBytes
252
    {
253
      public byte[] Bytes { get; set; }
254
    }
255

  
256
    [Test]
257
    public void ReadBytesFromString()
258
    {
259
 1
      var bytes = new HasBytes { Bytes = new byte[] { 1, 2, 3, 4 } };
260
 1
      var json = JsonConvert.SerializeObject(bytes);
261

  
262
 1
      TextReader textReader = new StringReader(json);
263
 1
      JsonReader jsonReader = new JsonTextReader(textReader);
264

  
265
 1
      var jToken = JToken.ReadFrom(jsonReader);
266

  
267
 1
      jsonReader = new JTokenReader(jToken);
268

  
269
 1
      var result2 = (HasBytes)JsonSerializer.Create(null)
270
 1
                 .Deserialize(jsonReader, typeof(HasBytes));
271

  
272
 1
      Assert.AreEqual(new byte[] { 1, 2, 3, 4 }, result2.Bytes);
273
 1
    }
274

  
275
    [Test]
276
    public void ReadBytesFromEmptyString()
277
    {
278
 1
      var bytes = new HasBytes { Bytes = new byte[0] };
279
 1
      var json = JsonConvert.SerializeObject(bytes);
280

  
281
 1
      TextReader textReader = new StringReader(json);
282
 1
      JsonReader jsonReader = new JsonTextReader(textReader);
283

  
284
 1
      var jToken = JToken.ReadFrom(jsonReader);
285

  
286
 1
      jsonReader = new JTokenReader(jToken);
287

  
288
 1
      var result2 = (HasBytes)JsonSerializer.Create(null)
289
 1
                 .Deserialize(jsonReader, typeof(HasBytes));
290

  
291
 1
      Assert.AreEqual(new byte[0], result2.Bytes);
292
 1
    }
293
  }
294
}