Json.NET
Code Coverage Statistics for Source File

Newtonsoft.Json.Tests\JsonValidatingReaderTests.cs

Symbol Coverage: 99.34% (604 of 608)

Branch Coverage: 96.77% (30 of 31)

Cyclomatic Complexity Avg: 1.00 Max:1

Code Lines: 781


L V Source
1
using System;
2
using System.Collections.Generic;
3
using System.IO;
4
using System.Linq;
5
using System.Text;
6
using NUnit.Framework;
7
using System.Xml;
8
using System.Xml.Schema;
9
using Newtonsoft.Json.Schema;
10

  
11
namespace Newtonsoft.Json.Tests
12
{
13
  public class JsonValidatingReaderTests : TestFixtureBase
14
  {
15
    [Test]
16
    public void CheckInnerReader()
17
    {
18
 1
      string json = "{'name':'James','hobbies':['pie','cake']}";
19
 1
      JsonReader reader = new JsonTextReader(new StringReader(json));
20

  
21
 1
      JsonValidatingReader validatingReader = new JsonValidatingReader(reader);
22
 1
      Assert.AreEqual(reader, validatingReader.Reader);
23
 1
    }
24

  
25
    [Test]
26
    public void ValidateTypes()
27
    {
28
 1
      string schemaJson = @"{
29
 1
  ""description"":""A person"",
30
 1
  ""type"":""object"",
31
 1
  ""properties"":
32
 1
  {
33
 1
    ""name"":{""type"":""string""},
34
 1
    ""hobbies"":
35
 1
    {
36
 1
      ""type"":""array"",
37
 1
      ""items"": {""type"":""string""}
38
 1
    }
39
 1
  }
40
 1
}";
41

  
42
 1
      string json = @"{'name':""James"",'hobbies':[""pie"",'cake']}";
43

  
44
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
45

  
46
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
47
 0
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
48
 1
      JsonSchema schema = JsonSchema.Parse(schemaJson);
49
 1
      reader.Schema = schema;
50
 1
      Assert.AreEqual(schema, reader.Schema);
51

  
52
 1
      Assert.AreEqual(0, reader.Depth);
53

  
54
 1
      Assert.IsTrue(reader.Read());
55
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
56

  
57
 1
      Assert.IsTrue(reader.Read());
58
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
59
 1
      Assert.AreEqual("name", reader.Value.ToString());
60

  
61
 1
      Assert.AreEqual(1, reader.Depth);
62

  
63
 1
      Assert.IsTrue(reader.Read());
64
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
65
 1
      Assert.AreEqual("James", reader.Value.ToString());
66
 1
      Assert.AreEqual(typeof(string), reader.ValueType);
67
 1
      Assert.AreEqual('"', reader.QuoteChar);
68

  
69
 1
      Assert.IsTrue(reader.Read());
70
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
71
 1
      Assert.AreEqual("hobbies", reader.Value.ToString());
72
 1
      Assert.AreEqual('\'', reader.QuoteChar);
73

  
74
 1
      Assert.IsTrue(reader.Read());
75
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
76

  
77
 1
      Assert.IsTrue(reader.Read());
78
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
79
 1
      Assert.AreEqual("pie", reader.Value.ToString());
80
 1
      Assert.AreEqual('"', reader.QuoteChar);
81

  
82
 1
      Assert.IsTrue(reader.Read());
83
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
84
 1
      Assert.AreEqual("cake", reader.Value.ToString());
85

  
86
 1
      Assert.IsTrue(reader.Read());
87
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
88

  
89
 1
      Assert.IsTrue(reader.Read());
90
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
91

  
92
 1
      Assert.IsNull(validationEventArgs);
93
 1
    }
94

  
95
    [Test]
96
    public void ValidateUnrestrictedArray()
97
    {
98
 1
      string schemaJson = @"{
99
 1
  ""type"":""array""
100
 1
}";
101

  
102
 1
      string json = "['pie','cake',['nested1','nested2'],{'nestedproperty1':1.1,'nestedproperty2':[null]}]";
103

  
104
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
105

  
106
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
107
 0
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
108
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
109

  
110
 1
      Assert.IsTrue(reader.Read());
111
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
112

  
113
 1
      Assert.IsTrue(reader.Read());
114
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
115
 1
      Assert.AreEqual("pie", reader.Value.ToString());
116

  
117
 1
      Assert.IsTrue(reader.Read());
118
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
119
 1
      Assert.AreEqual("cake", reader.Value.ToString());
120

  
121
 1
      Assert.IsTrue(reader.Read());
122
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
123

  
124
 1
      Assert.IsTrue(reader.Read());
125
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
126
 1
      Assert.AreEqual("nested1", reader.Value.ToString());
127

  
128
 1
      Assert.IsTrue(reader.Read());
129
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
130
 1
      Assert.AreEqual("nested2", reader.Value.ToString());
131

  
132
 1
      Assert.IsTrue(reader.Read());
133
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
134

  
135
 1
      Assert.IsTrue(reader.Read());
136
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
137

  
138
 1
      Assert.IsTrue(reader.Read());
139
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
140
 1
      Assert.AreEqual("nestedproperty1", reader.Value.ToString());
141

  
142
 1
      Assert.IsTrue(reader.Read());
143
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
144
 1
      Assert.AreEqual(1.1, reader.Value);
145

  
146
 1
      Assert.IsTrue(reader.Read());
147
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
148
 1
      Assert.AreEqual("nestedproperty2", reader.Value.ToString());
149

  
150
 1
      Assert.IsTrue(reader.Read());
151
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
152

  
153
 1
      Assert.IsTrue(reader.Read());
154
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
155

  
156
 1
      Assert.IsTrue(reader.Read());
157
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
158

  
159
 1
      Assert.IsTrue(reader.Read());
160
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
161

  
162
 1
      Assert.IsTrue(reader.Read());
163
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
164

  
165
 1
      Assert.IsNull(validationEventArgs);
166
 1
    }
167

  
168
    [Test]
169
    public void StringLessThanMinimumLength()
170
    {
171
 1
      string schemaJson = @"{
172
 1
  ""type"":""string"",
173
 1
  ""minLength"":5,
174
 1
  ""maxLength"":50,
175
 1
}";
176

  
177
 1
      string json = "'pie'";
178

  
179
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
180

  
181
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
182
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
183
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
184

  
185
 1
      Assert.IsTrue(reader.Read());
186
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
187
 1
      Assert.AreEqual("String 'pie' is less than minimum length of 5. Line 1, position 5.", validationEventArgs.Message);
188

  
189
 1
      Assert.IsNotNull(validationEventArgs);
190
 1
    }
191

  
192
    [Test]
193
    public void StringGreaterThanMaximumLength()
194
    {
195
 1
      string schemaJson = @"{
196
 1
  ""type"":""string"",
197
 1
  ""minLength"":5,
198
 1
  ""maxLength"":10
199
 1
}";
200

  
201
 1
      string json = "'The quick brown fox jumps over the lazy dog.'";
202

  
203
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
204

  
205
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
206
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
207
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
208

  
209
 1
      Assert.IsTrue(reader.Read());
210
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
211
 1
      Assert.AreEqual("String 'The quick brown fox jumps over the lazy dog.' exceeds maximum length of 10. Line 1, position 46.", validationEventArgs.Message);
212

  
213
 1
      Assert.IsNotNull(validationEventArgs);
214
 1
    }
215

  
216
    [Test]
217
    public void StringIsNotInEnum()
218
    {
219
 1
      string schemaJson = @"{
220
 1
  ""type"":""array"",
221
 1
  ""items"":{
222
 1
    ""type"":""string"",
223
 1
    ""enum"":[""one"",""two""]
224
 1
  },
225
 1
  ""maxItems"":3
226
 1
}";
227

  
228
 1
      string json = "['one','two','THREE']";
229

  
230
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
231

  
232
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
233
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
234
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
235

  
236
 1
      Assert.IsTrue(reader.Read());
237
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
238

  
239
 1
      Assert.IsTrue(reader.Read());
240
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
241

  
242
 1
      Assert.IsTrue(reader.Read());
243
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
244
 1
      Assert.AreEqual(null, validationEventArgs);
245

  
246
 1
      Assert.IsTrue(reader.Read());
247
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
248
 1
      Assert.AreEqual(@"Value ""THREE"" is not defined in enum. Line 1, position 20.", validationEventArgs.Message);
249

  
250
 1
      Assert.IsTrue(reader.Read());
251
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
252

  
253
 1
      Assert.IsNotNull(validationEventArgs);
254
 1
    }
255

  
256
    [Test]
257
    public void StringDoesNotMatchPattern()
258
    {
259
 1
      string schemaJson = @"{
260
 1
  ""type"":""string"",
261
 1
  ""pattern"":""foo""
262
 1
}";
263

  
264
 1
      string json = "'The quick brown fox jumps over the lazy dog.'";
265

  
266
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
267

  
268
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
269
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
270
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
271

  
272
 1
      Assert.IsTrue(reader.Read());
273
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
274
 1
      Assert.AreEqual("String 'The quick brown fox jumps over the lazy dog.' does not match regex pattern 'foo'. Line 1, position 46.", validationEventArgs.Message);
275

  
276
 1
      Assert.IsNotNull(validationEventArgs);
277
 1
    }
278

  
279
    [Test]
280
    public void IntegerGreaterThanMaximumValue()
281
    {
282
 1
      string schemaJson = @"{
283
 1
  ""type"":""integer"",
284
 1
  ""maximum"":5
285
 1
}";
286

  
287
 1
      string json = "10";
288

  
289
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
290

  
291
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
292
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
293
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
294

  
295
 1
      Assert.IsTrue(reader.Read());
296
 1
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
297
 1
      Assert.AreEqual("Integer 10 exceeds maximum value of 5. Line 1, position 2.", validationEventArgs.Message);
298

  
299
 1
      Assert.IsNotNull(validationEventArgs);
300
 1
    }
301

  
302
    [Test]
303
    [ExpectedException(typeof(JsonSchemaException), ExpectedMessage = "Integer 10 exceeds maximum value of 5. Line 1, position 2.")]
304
    public void ThrowExceptionWhenNoValidationEventHandler()
305
    {
306
 1
      string schemaJson = @"{
307
 1
  ""type"":""integer"",
308
 1
  ""maximum"":5
309
 1
}";
310

  
311
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader("10")));
312
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
313

  
314
 1
      Assert.IsTrue(reader.Read());
315
 0
    }
316

  
317
    [Test]
318
    public void IntegerLessThanMinimumValue()
319
    {
320
 1
      string schemaJson = @"{
321
 1
  ""type"":""integer"",
322
 1
  ""minimum"":5
323
 1
}";
324

  
325
 1
      string json = "1";
326

  
327
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
328

  
329
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
330
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
331
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
332

  
333
 1
      Assert.IsTrue(reader.Read());
334
 1
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
335
 1
      Assert.AreEqual("Integer 1 is less than minimum value of 5. Line 1, position 1.", validationEventArgs.Message);
336

  
337
 1
      Assert.IsNotNull(validationEventArgs);
338
 1
    }
339

  
340
    [Test]
341
    public void IntegerIsNotInEnum()
342
    {
343
 1
      string schemaJson = @"{
344
 1
  ""type"":""array"",
345
 1
  ""items"":{
346
 1
    ""type"":""integer"",
347
 1
    ""enum"":[1,2]
348
 1
  },
349
 1
  ""maxItems"":3
350
 1
}";
351

  
352
 1
      string json = "[1,2,3]";
353

  
354
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
355

  
356
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
357
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
358
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
359

  
360
 1
      Assert.IsTrue(reader.Read());
361
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
362

  
363
 1
      Assert.IsTrue(reader.Read());
364
 1
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
365

  
366
 1
      Assert.IsTrue(reader.Read());
367
 1
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
368
 1
      Assert.AreEqual(null, validationEventArgs);
369

  
370
 1
      Assert.IsTrue(reader.Read());
371
 1
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
372
 1
      Assert.AreEqual(@"Value 3 is not defined in enum. Line 1, position 7.", validationEventArgs.Message);
373

  
374
 1
      Assert.IsTrue(reader.Read());
375
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
376

  
377
 1
      Assert.IsNotNull(validationEventArgs);
378
 1
    }
379

  
380
    [Test]
381
    public void FloatGreaterThanMaximumValue()
382
    {
383
 1
      string schemaJson = @"{
384
 1
  ""type"":""number"",
385
 1
  ""maximum"":5
386
 1
}";
387

  
388
 1
      string json = "10.0";
389

  
390
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
391

  
392
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
393
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
394
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
395

  
396
 1
      Assert.IsTrue(reader.Read());
397
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
398
 1
      Assert.AreEqual("Float 10.0 exceeds maximum value of 5. Line 1, position 4.", validationEventArgs.Message);
399

  
400
 1
      Assert.IsNotNull(validationEventArgs);
401
 1
    }
402

  
403
    [Test]
404
    public void FloatLessThanMinimumValue()
405
    {
406
 1
      string schemaJson = @"{
407
 1
  ""type"":""number"",
408
 1
  ""minimum"":5
409
 1
}";
410

  
411
 1
      string json = "1.1";
412

  
413
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
414

  
415
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
416
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
417
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
418

  
419
 1
      Assert.IsTrue(reader.Read());
420
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
421
 1
      Assert.AreEqual("Float 1.1 is less than minimum value of 5. Line 1, position 3.", validationEventArgs.Message);
422

  
423
 1
      Assert.IsNotNull(validationEventArgs);
424
 1
    }
425

  
426
    [Test]
427
    public void FloatIsNotInEnum()
428
    {
429
 1
      string schemaJson = @"{
430
 1
  ""type"":""array"",
431
 1
  ""items"":{
432
 1
    ""type"":""number"",
433
 1
    ""enum"":[1.1,2.2]
434
 1
  },
435
 1
  ""maxItems"":3
436
 1
}";
437

  
438
 1
      string json = "[1.1,2.2,3.0]";
439

  
440
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
441

  
442
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
443
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
444
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
445

  
446
 1
      Assert.IsTrue(reader.Read());
447
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
448

  
449
 1
      Assert.IsTrue(reader.Read());
450
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
451

  
452
 1
      Assert.IsTrue(reader.Read());
453
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
454
 1
      Assert.AreEqual(null, validationEventArgs);
455

  
456
 1
      Assert.IsTrue(reader.Read());
457
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
458
 1
      Assert.AreEqual(@"Value 3.0 is not defined in enum. Line 1, position 13.", validationEventArgs.Message);
459

  
460
 1
      Assert.IsTrue(reader.Read());
461
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
462

  
463
 1
      Assert.IsNotNull(validationEventArgs);
464
 1
    }
465

  
466
    [Test]
467
    public void FloatExceedsMaxDecimalPlaces()
468
    {
469
 1
      string schemaJson = @"{
470
 1
  ""type"":""array"",
471
 1
  ""items"":{
472
 1
    ""type"":""number"",
473
 1
    ""maxDecimal"":2
474
 1
  }
475
 1
}";
476

  
477
 1
      string json = "[1.1,2.2,4.001]";
478

  
479
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
480

  
481
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
482
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
483
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
484

  
485
 1
      Assert.IsTrue(reader.Read());
486
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
487

  
488
 1
      Assert.IsTrue(reader.Read());
489
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
490

  
491
 1
      Assert.IsTrue(reader.Read());
492
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
493
 1
      Assert.AreEqual(null, validationEventArgs);
494

  
495
 1
      Assert.IsTrue(reader.Read());
496
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
497
 1
      Assert.AreEqual(@"Float 4.001 exceeds the maximum allowed number decimal places of 2. Line 1, position 15.", validationEventArgs.Message);
498

  
499
 1
      Assert.IsTrue(reader.Read());
500
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
501

  
502
 1
      Assert.IsNotNull(validationEventArgs);
503
 1
    }
504

  
505
    [Test]
506
    public void NullNotInEnum()
507
    {
508
 1
      string schemaJson = @"{
509
 1
  ""type"":""array"",
510
 1
  ""items"":{
511
 1
    ""type"":""null"",
512
 1
    ""enum"":[]
513
 1
  },
514
 1
  ""maxItems"":3
515
 1
}";
516

  
517
 1
      string json = "[null]";
518

  
519
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
520

  
521
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
522
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
523
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
524

  
525
 1
      Assert.IsTrue(reader.Read());
526
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
527

  
528
 1
      Assert.IsTrue(reader.Read());
529
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
530
 1
      Assert.AreEqual(@"Value null is not defined in enum. Line 1, position 5.", validationEventArgs.Message);
531

  
532
 1
      Assert.IsTrue(reader.Read());
533
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
534

  
535
 1
      Assert.IsNotNull(validationEventArgs);
536
 1
    }
537

  
538
    [Test]
539
    public void BooleanNotInEnum()
540
    {
541
 1
      string schemaJson = @"{
542
 1
  ""type"":""array"",
543
 1
  ""items"":{
544
 1
    ""type"":""boolean"",
545
 1
    ""enum"":[true]
546
 1
  },
547
 1
  ""maxItems"":3
548
 1
}";
549

  
550
 1
      string json = "[true,false]";
551

  
552
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
553

  
554
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
555
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
556
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
557

  
558
 1
      Assert.IsTrue(reader.Read());
559
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
560

  
561
 1
      Assert.IsTrue(reader.Read());
562
 1
      Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
563
 1
      Assert.AreEqual(null, validationEventArgs);
564

  
565
 1
      Assert.IsTrue(reader.Read());
566
 1
      Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
567
 1
      Assert.AreEqual(@"Value false is not defined in enum. Line 1, position 11.", validationEventArgs.Message);
568
      
569
 1
      Assert.IsTrue(reader.Read());
570
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
571

  
572
 1
      Assert.IsNotNull(validationEventArgs);
573
 1
    }
574
    
575
    [Test]
576
    public void ArrayCountGreaterThanMaximumItems()
577
    {
578
 1
      string schemaJson = @"{
579
 1
  ""type"":""array"",
580
 1
  ""minItems"":2,
581
 1
  ""maxItems"":3
582
 1
}";
583

  
584
 1
      string json = "[null,null,null,null]";
585

  
586
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
587

  
588
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
589
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
590
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
591

  
592
 1
      Assert.IsTrue(reader.Read());
593
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
594

  
595
 1
      Assert.IsTrue(reader.Read());
596
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
597
 1
      Assert.IsTrue(reader.Read());
598
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
599
 1
      Assert.IsTrue(reader.Read());
600
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
601
 1
      Assert.IsTrue(reader.Read());
602
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
603

  
604
 1
      Assert.IsTrue(reader.Read());
605
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
606
 1
      Assert.AreEqual("Array item count 4 exceeds maximum count of 3. Line 1, position 21.", validationEventArgs.Message);
607

  
608
 1
      Assert.IsNotNull(validationEventArgs);
609
 1
    }
610

  
611
    [Test]
612
    public void ArrayCountLessThanMinimumItems()
613
    {
614
 1
      string schemaJson = @"{
615
 1
  ""type"":""array"",
616
 1
  ""minItems"":2,
617
 1
  ""maxItems"":3
618
 1
}";
619

  
620
 1
      string json = "[null]";
621

  
622
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
623

  
624
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
625
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
626
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
627

  
628
 1
      Assert.IsTrue(reader.Read());
629
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
630

  
631
 1
      Assert.IsTrue(reader.Read());
632
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
633

  
634
 1
      Assert.IsTrue(reader.Read());
635
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
636
 1
      Assert.AreEqual("Array item count 1 is less than minimum count of 2. Line 1, position 6.", validationEventArgs.Message);
637

  
638
 1
      Assert.IsNotNull(validationEventArgs);
639
 1
    }
640

  
641
    [Test]
642
    public void InvalidDataType()
643
    {
644
 1
      string schemaJson = @"{
645
 1
  ""type"":""string"",
646
 1
  ""minItems"":2,
647
 1
  ""maxItems"":3,
648
 1
  ""items"":{}
649
 1
}";
650

  
651
 1
      string json = "[null,null,null,null]";
652

  
653
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
654

  
655
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
656
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
657
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
658

  
659
 1
      Assert.IsTrue(reader.Read());
660
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
661
 1
      Assert.AreEqual(@"Invalid type. Expected String but got Array. Line 1, position 1.", validationEventArgs.Message);
662

  
663
 1
      Assert.IsNotNull(validationEventArgs);
664
 1
    }
665

  
666
    [Test]
667
    public void StringDisallowed()
668
    {
669
 1
      string schemaJson = @"{
670
 1
  ""type"":""array"",
671
 1
  ""items"":{
672
 1
    ""disallow"":[""number""]
673
 1
  },
674
 1
  ""maxItems"":3
675
 1
}";
676

  
677
 1
      string json = "['pie',1.1]";
678

  
679
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
680

  
681
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
682
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
683
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
684

  
685
 1
      Assert.IsTrue(reader.Read());
686
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
687

  
688
 1
      Assert.IsTrue(reader.Read());
689
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
690
 1
      Assert.AreEqual(null, validationEventArgs);
691

  
692
 1
      Assert.IsTrue(reader.Read());
693
 1
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
694
 1
      Assert.AreEqual(@"Type Float is disallowed. Line 1, position 11.", validationEventArgs.Message);
695

  
696
 1
      Assert.IsTrue(reader.Read());
697
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
698

  
699
 1
      Assert.IsNotNull(validationEventArgs);
700
 1
    }
701

  
702
    [Test]
703
    public void MissingNonoptionalProperties()
704
    {
705
 1
      string schemaJson = @"{
706
 1
  ""description"":""A person"",
707
 1
  ""type"":""object"",
708
 1
  ""properties"":
709
 1
  {
710
 1
    ""name"":{""type"":""string""},
711
 1
    ""hobbies"":{""type"":""string""},
712
 1
    ""age"":{""type"":""integer""}
713
 1
  }
714
 1
}";
715

  
716
 1
      string json = "{'name':'James'}";
717

  
718
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
719

  
720
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
721
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
722
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
723

  
724
 1
      Assert.IsTrue(reader.Read());
725
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
726

  
727
 1
      Assert.IsTrue(reader.Read());
728
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
729
 1
      Assert.AreEqual("name", reader.Value.ToString());
730

  
731
 1
      Assert.IsTrue(reader.Read());
732
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
733
 1
      Assert.AreEqual("James", reader.Value.ToString());
734
 1
      Assert.AreEqual(null, validationEventArgs);
735

  
736
 1
      Assert.IsTrue(reader.Read());
737
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
738
 1
      Assert.AreEqual("Non-optional properties are missing from object: hobbies, age. Line 1, position 16.", validationEventArgs.Message);
739

  
740
 1
      Assert.IsNotNull(validationEventArgs);
741
 1
    }
742

  
743
    [Test]
744
    public void MissingOptionalProperties()
745
    {
746
 1
      string schemaJson = @"{
747
 1
  ""description"":""A person"",
748
 1
  ""type"":""object"",
749
 1
  ""properties"":
750
 1
  {
751
 1
    ""name"":{""type"":""string""},
752
 1
    ""hobbies"":{""type"":""string"",optional:true},
753
 1
    ""age"":{""type"":""integer"",optional:true}
754
 1
  }
755
 1
}";
756

  
757
 1
      string json = "{'name':'James'}";
758

  
759
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
760

  
761
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
762
 0
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
763
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
764

  
765
 1
      Assert.IsTrue(reader.Read());
766
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
767

  
768
 1
      Assert.IsTrue(reader.Read());
769
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
770
 1
      Assert.AreEqual("name", reader.Value.ToString());
771

  
772
 1
      Assert.IsTrue(reader.Read());
773
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
774
 1
      Assert.AreEqual("James", reader.Value.ToString());
775
 1
      Assert.IsNull(validationEventArgs);
776

  
777
 1
      Assert.IsTrue(reader.Read());
778
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
779

  
780
 1
      Assert.IsNull(validationEventArgs);
781
 1
    }
782

  
783
    [Test]
784
    public void DisableAdditionalProperties()
785
    {
786
 1
      string schemaJson = @"{
787
 1
  ""description"":""A person"",
788
 1
  ""type"":""object"",
789
 1
  ""properties"":
790
 1
  {
791
 1
    ""name"":{""type"":""string""}
792
 1
  },
793
 1
  ""additionalProperties"":false
794
 1
}";
795

  
796
 1
      string json = "{'name':'James','additionalProperty1':null,'additionalProperty2':null}";
797

  
798
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
799

  
800
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
801
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
802
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
803

  
804
 1
      Assert.IsTrue(reader.Read());
805
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
806

  
807
 1
      Assert.IsTrue(reader.Read());
808
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
809
 1
      Assert.AreEqual("name", reader.Value.ToString());
810

  
811
 1
      Assert.IsTrue(reader.Read());
812
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
813
 1
      Assert.AreEqual("James", reader.Value.ToString());
814
 1
      Assert.AreEqual(null, validationEventArgs);
815

  
816
 1
      Assert.IsTrue(reader.Read());
817
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
818
 1
      Assert.AreEqual("additionalProperty1", reader.Value.ToString());
819

  
820
 1
      Assert.IsTrue(reader.Read());
821
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
822
 1
      Assert.AreEqual(null, reader.Value);
823
 1
      Assert.AreEqual("Property 'additionalProperty1' has not been defined and the schema does not allow additional properties. Line 1, position 38.", validationEventArgs.Message);
824

  
825
 1
      Assert.IsTrue(reader.Read());
826
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
827
 1
      Assert.AreEqual("additionalProperty2", reader.Value.ToString());
828

  
829
 1
      Assert.IsTrue(reader.Read());
830
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
831
 1
      Assert.AreEqual(null, reader.Value);
832
 1
      Assert.AreEqual("Property 'additionalProperty2' has not been defined and the schema does not allow additional properties. Line 1, position 65.", validationEventArgs.Message);
833

  
834
 1
      Assert.IsTrue(reader.Read());
835
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
836

  
837
 1
      Assert.IsNotNull(validationEventArgs);
838
 1
    }
839

  
840
    [Test]
841
    public void ExtendsStringGreaterThanMaximumLength()
842
    {
843
 1
      string schemaJson = @"{
844
 1
  ""extends"":{
845
 1
    ""type"":""string"",
846
 1
    ""minLength"":5,
847
 1
    ""maxLength"":10
848
 1
  },
849
 1
  ""maxLength"":9
850
 1
}";
851

  
852
 1
      List<string> errors = new List<string>();
853
 1
      string json = "'The quick brown fox jumps over the lazy dog.'";
854

  
855
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
856

  
857
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
858
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; errors.Add(validationEventArgs.Message); };
859
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
860

  
861
 1
      Assert.IsTrue(reader.Read());
862
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
863
 1
      Assert.AreEqual(1, errors.Count);
864
 1
      Assert.AreEqual("String 'The quick brown fox jumps over the lazy dog.' exceeds maximum length of 9. Line 1, position 46.", errors[0]);
865

  
866
 1
      Assert.IsNotNull(validationEventArgs);
867
 1
    }
868

  
869
    private JsonSchema GetExtendedSchema()
870
    {
871
 2
      string first = @"{
872
 2
  ""id"":""first"",
873
 2
  ""type"":""object"",
874
 2
  ""properties"":
875
 2
  {
876
 2
    ""firstproperty"":{""type"":""string""}
877
 2
  },
878
 2
  ""additionalProperties"":{}
879
 2
}";
880

  
881
 2
      string second = @"{
882
 2
  ""id"":""second"",
883
 2
  ""type"":""object"",
884
 2
  ""extends"":{""$ref"":""first""},
885
 2
  ""properties"":
886
 2
  {
887
 2
    ""secondproperty"":{""type"":""string""}
888
 2
  },
889
 2
  ""additionalProperties"":false
890
 2
}";
891

  
892
 2
      JsonSchemaResolver resolver = new JsonSchemaResolver();
893
 2
      JsonSchema firstSchema = JsonSchema.Parse(first, resolver);
894
 2
      JsonSchema secondSchema = JsonSchema.Parse(second, resolver);
895

  
896
 2
      return secondSchema;
897
 2
    }
898

  
899
    [Test]
900
    public void ExtendsDisallowAdditionProperties()
901
    {
902
 1
      string json = "{'firstproperty':'blah','secondproperty':'blah2','additional':'blah3','additional2':'blah4'}";
903

  
904
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
905

  
906
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
907
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
908
 1
      reader.Schema = GetExtendedSchema();
909

  
910
 1
      Assert.IsTrue(reader.Read());
911
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
912

  
913
 1
      Assert.IsTrue(reader.Read());
914
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
915
 1
      Assert.AreEqual("firstproperty", reader.Value.ToString());
916
 1
      Assert.AreEqual(null, validationEventArgs);
917

  
918
 1
      Assert.IsTrue(reader.Read());
919
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
920
 1
      Assert.AreEqual("blah", reader.Value.ToString());
921
 1
      Assert.AreEqual(null, validationEventArgs);
922

  
923
 1
      Assert.IsTrue(reader.Read());
924
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
925
 1
      Assert.AreEqual("secondproperty", reader.Value.ToString());
926
 1
      Assert.AreEqual(null, validationEventArgs);
927

  
928
 1
      Assert.IsTrue(reader.Read());
929
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
930
 1
      Assert.AreEqual("blah2", reader.Value.ToString());
931
 1
      Assert.AreEqual(null, validationEventArgs);
932

  
933
 1
      Assert.IsTrue(reader.Read());
934
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
935
 1
      Assert.AreEqual("additional", reader.Value.ToString());
936
 1
      Assert.AreEqual("Property 'additional' has not been defined and the schema does not allow additional properties. Line 1, position 62.", validationEventArgs.Message);
937

  
938
 1
      Assert.IsTrue(reader.Read());
939
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
940
 1
      Assert.AreEqual("blah3", reader.Value.ToString());
941

  
942
 1
      Assert.IsTrue(reader.Read());
943
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
944
 1
      Assert.AreEqual("additional2", reader.Value.ToString());
945
 1
      Assert.AreEqual("Property 'additional2' has not been defined and the schema does not allow additional properties. Line 1, position 84.", validationEventArgs.Message);
946

  
947
 1
      Assert.IsTrue(reader.Read());
948
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
949
 1
      Assert.AreEqual("blah4", reader.Value.ToString());
950

  
951
 1
      Assert.IsTrue(reader.Read());
952
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
953

  
954
 1
      Assert.IsFalse(reader.Read());
955
 1
    }
956

  
957
    [Test]
958
    public void ExtendsMissingNonoptionalProperties()
959
    {
960
 1
      string json = "{}";
961

  
962
 1
      List<string> errors = new List<string>();
963

  
964
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
965
 1
      reader.ValidationEventHandler += (sender, args) => { errors.Add(args.Message); };
966
 1
      reader.Schema = GetExtendedSchema();
967

  
968
 1
      Assert.IsTrue(reader.Read());
969
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
970

  
971
 1
      Assert.IsTrue(reader.Read());
972
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
973

  
974
 1
      Assert.AreEqual(1, errors.Count);
975
 1
      Assert.AreEqual("Non-optional properties are missing from object: secondproperty, firstproperty. Line 1, position 2.", errors[0]);
976
 1
    }
977

  
978
    [Test]
979
    public void sdfsdf()
980
    {
981
 1
      string schemaJson = @"{
982
 1
  ""type"":""array"",
983
 1
  ""items"": [{""type"":""string""},{""type"":""integer""}],
984
 1
  ""additionalProperties"": false
985
 1
}";
986

  
987
 1
      string json = @"[1, 'a', null]";
988

  
989
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
990

  
991
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
992
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
993
 1
      reader.Schema = JsonSchema.Parse(schemaJson);
994

  
995
 1
      Assert.IsTrue(reader.Read());
996
 1
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
997

  
998
 1
      Assert.IsTrue(reader.Read());
999
 1
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
1000
 1
      Assert.AreEqual("Invalid type. Expected String but got Integer. Line 1, position 3.", validationEventArgs.Message);
1001

  
1002
 1
      Assert.IsTrue(reader.Read());
1003
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1004
 1
      Assert.AreEqual("Invalid type. Expected Integer but got String. Line 1, position 7.", validationEventArgs.Message);
1005

  
1006
 1
      Assert.IsTrue(reader.Read());
1007
 1
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
1008
 1
      Assert.AreEqual("Index 3 has not been defined and the schema does not allow additional items. Line 1, position 13.", validationEventArgs.Message);
1009

  
1010
 1
      Assert.IsTrue(reader.Read());
1011
 1
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
1012

  
1013
 1
      Assert.IsFalse(reader.Read());
1014
 1
    }
1015

  
1016
    [Test]
1017
    public void ExtendedComplex()
1018
    {
1019
 1
      string first = @"{
1020
 1
  ""id"":""first"",
1021
 1
  ""type"":""object"",
1022
 1
  ""properties"":
1023
 1
  {
1024
 1
    ""firstproperty"":{""type"":""string""},
1025
 1
    ""secondproperty"":{""type"":""string"",""maxLength"":10},
1026
 1
    ""thirdproperty"":{
1027
 1
      ""type"":""object"",
1028
 1
      ""properties"":
1029
 1
      {
1030
 1
        ""thirdproperty_firstproperty"":{""type"":""string"",""maxLength"":10,""minLength"":7}
1031
 1
      }
1032
 1
    }
1033
 1
  },
1034
 1
  ""additionalProperties"":{}
1035
 1
}";
1036

  
1037
 1
      string second = @"{
1038
 1
  ""id"":""second"",
1039
 1
  ""type"":""object"",
1040
 1
  ""extends"":{""$ref"":""first""},
1041
 1
  ""properties"":
1042
 1
  {
1043
 1
    ""secondproperty"":{""type"":""any""},
1044
 1
    ""thirdproperty"":{
1045
 1
      ""extends"":{
1046
 1
        ""properties"":
1047
 1
        {
1048
 1
          ""thirdproperty_firstproperty"":{""maxLength"":9,""minLength"":6,""pattern"":""hi2u""}
1049
 1
        },
1050
 1
        ""additionalProperties"":{""maxLength"":9,""minLength"":6,""enum"":[""one"",""two""]}
1051
 1
      },
1052
 1
      ""type"":""object"",
1053
 1
      ""properties"":
1054
 1
      {
1055
 1
        ""thirdproperty_firstproperty"":{""pattern"":""hi""}
1056
 1
      },
1057
 1
      ""additionalProperties"":{""type"":""string"",""enum"":[""two"",""three""]}
1058
 1
    },
1059
 1
    ""fourthproperty"":{""type"":""string""}
1060
 1
  },
1061
 1
  ""additionalProperties"":false
1062
 1
}";
1063

  
1064
 1
      JsonSchemaResolver resolver = new JsonSchemaResolver();
1065
 1
      JsonSchema firstSchema = JsonSchema.Parse(first, resolver);
1066
 1
      JsonSchema secondSchema = JsonSchema.Parse(second, resolver);
1067

  
1068
 1
      JsonSchemaModelBuilder modelBuilder = new JsonSchemaModelBuilder();
1069

  
1070
 1
      string json = @"{
1071
 1
  'firstproperty':'blahblahblahblahblahblah',
1072
 1
  'secondproperty':'secasecasecasecaseca',
1073
 1
  'thirdproperty':{
1074
 1
    'thirdproperty_firstproperty':'aaa',
1075
 1
    'additional':'three'
1076
 1
  }
1077
 1
}";
1078

  
1079
 1
      Json.Schema.ValidationEventArgs validationEventArgs = null;
1080
 1
      List<string> errors = new List<string>();
1081

  
1082
 1
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
1083
 1
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; errors.Add(validationEventArgs.Message); };
1084
 1
      reader.Schema = secondSchema;
1085

  
1086
 1
      Assert.IsTrue(reader.Read());
1087
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1088

  
1089
 1
      Assert.IsTrue(reader.Read());
1090
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1091
 1
      Assert.AreEqual("firstproperty", reader.Value.ToString());
1092
 1
      Assert.AreEqual(null, validationEventArgs);
1093

  
1094
 1
      Assert.IsTrue(reader.Read());
1095
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1096
 1
      Assert.AreEqual("blahblahblahblahblahblah", reader.Value.ToString());
1097

  
1098
 1
      Assert.IsTrue(reader.Read());
1099
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1100
 1
      Assert.AreEqual("secondproperty", reader.Value.ToString());
1101

  
1102
 1
      Assert.IsTrue(reader.Read());
1103
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1104
 1
      Assert.AreEqual("secasecasecasecaseca", reader.Value.ToString());
1105
 1
      Assert.AreEqual(1, errors.Count);
1106
 1
      Assert.AreEqual("String 'secasecasecasecaseca' exceeds maximum length of 10. Line 3, position 41.", errors[0]);
1107

  
1108
 1
      Assert.IsTrue(reader.Read());
1109
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1110
 1
      Assert.AreEqual("thirdproperty", reader.Value.ToString());
1111
 1
      Assert.AreEqual(1, errors.Count);
1112

  
1113
 1
      Assert.IsTrue(reader.Read());
1114
 1
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1115
 1
      Assert.AreEqual(1, errors.Count);
1116

  
1117
 1
      Assert.IsTrue(reader.Read());
1118
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1119
 1
      Assert.AreEqual("thirdproperty_firstproperty", reader.Value.ToString());
1120
 1
      Assert.AreEqual(1, errors.Count);
1121

  
1122
 1
      Assert.IsTrue(reader.Read());
1123
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1124
 1
      Assert.AreEqual("aaa", reader.Value.ToString());
1125
 1
      Assert.AreEqual(4, errors.Count);
1126
 1
      Assert.AreEqual("String 'aaa' is less than minimum length of 7. Line 5, position 39.", errors[1]);
1127
 1
      Assert.AreEqual("String 'aaa' does not match regex pattern 'hi'. Line 5, position 39.", errors[2]);
1128
 1
      Assert.AreEqual("String 'aaa' does not match regex pattern 'hi2u'. Line 5, position 39.", errors[3]);
1129

  
1130
 1
      Assert.IsTrue(reader.Read());
1131
 1
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1132
 1
      Assert.AreEqual("additional", reader.Value.ToString());
1133
 1
      Assert.AreEqual(4, errors.Count);
1134

  
1135
 1
      Assert.IsTrue(reader.Read());
1136
 1
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1137
 1
      Assert.AreEqual("three", reader.Value.ToString());
1138
 1
      Assert.AreEqual(5, errors.Count);
1139
 1
      Assert.AreEqual("String 'three' is less than minimum length of 6. Line 6, position 24.", errors[4]);
1140
      
1141
 1
      Assert.IsTrue(reader.Read());
1142
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1143

  
1144
 1
      Assert.IsTrue(reader.Read());
1145
 1
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1146

  
1147
 1
      Assert.IsFalse(reader.Read());
1148
 1
    }
1149
  }
1150
}