Statistics
| Branch: | Revision:

root / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json.Tests / JsonValidatingReaderTests.cs @ 0eea575a

History | View | Annotate | Download (40.4 kB)

1 d78cbf09 Panagiotis Kanavos
using System;
2 d78cbf09 Panagiotis Kanavos
using System.Collections.Generic;
3 d78cbf09 Panagiotis Kanavos
using System.IO;
4 d78cbf09 Panagiotis Kanavos
using System.Linq;
5 d78cbf09 Panagiotis Kanavos
using System.Text;
6 d78cbf09 Panagiotis Kanavos
using NUnit.Framework;
7 d78cbf09 Panagiotis Kanavos
using System.Xml;
8 d78cbf09 Panagiotis Kanavos
using System.Xml.Schema;
9 d78cbf09 Panagiotis Kanavos
using Newtonsoft.Json.Schema;
10 d78cbf09 Panagiotis Kanavos
11 d78cbf09 Panagiotis Kanavos
namespace Newtonsoft.Json.Tests
12 d78cbf09 Panagiotis Kanavos
{
13 d78cbf09 Panagiotis Kanavos
  public class JsonValidatingReaderTests : TestFixtureBase
14 d78cbf09 Panagiotis Kanavos
  {
15 d78cbf09 Panagiotis Kanavos
    [Test]
16 d78cbf09 Panagiotis Kanavos
    public void CheckInnerReader()
17 d78cbf09 Panagiotis Kanavos
    {
18 d78cbf09 Panagiotis Kanavos
      string json = "{'name':'James','hobbies':['pie','cake']}";
19 d78cbf09 Panagiotis Kanavos
      JsonReader reader = new JsonTextReader(new StringReader(json));
20 d78cbf09 Panagiotis Kanavos
21 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader validatingReader = new JsonValidatingReader(reader);
22 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(reader, validatingReader.Reader);
23 d78cbf09 Panagiotis Kanavos
    }
24 d78cbf09 Panagiotis Kanavos
25 d78cbf09 Panagiotis Kanavos
    [Test]
26 d78cbf09 Panagiotis Kanavos
    public void ValidateTypes()
27 d78cbf09 Panagiotis Kanavos
    {
28 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
29 d78cbf09 Panagiotis Kanavos
  ""description"":""A person"",
30 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
31 d78cbf09 Panagiotis Kanavos
  ""properties"":
32 d78cbf09 Panagiotis Kanavos
  {
33 d78cbf09 Panagiotis Kanavos
    ""name"":{""type"":""string""},
34 d78cbf09 Panagiotis Kanavos
    ""hobbies"":
35 d78cbf09 Panagiotis Kanavos
    {
36 d78cbf09 Panagiotis Kanavos
      ""type"":""array"",
37 d78cbf09 Panagiotis Kanavos
      ""items"": {""type"":""string""}
38 d78cbf09 Panagiotis Kanavos
    }
39 d78cbf09 Panagiotis Kanavos
  }
40 d78cbf09 Panagiotis Kanavos
}";
41 d78cbf09 Panagiotis Kanavos
42 d78cbf09 Panagiotis Kanavos
      string json = @"{'name':""James"",'hobbies':[""pie"",'cake']}";
43 d78cbf09 Panagiotis Kanavos
44 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
45 d78cbf09 Panagiotis Kanavos
46 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
47 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
48 d78cbf09 Panagiotis Kanavos
      JsonSchema schema = JsonSchema.Parse(schemaJson);
49 d78cbf09 Panagiotis Kanavos
      reader.Schema = schema;
50 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(schema, reader.Schema);
51 d78cbf09 Panagiotis Kanavos
52 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(0, reader.Depth);
53 d78cbf09 Panagiotis Kanavos
54 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
55 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
56 d78cbf09 Panagiotis Kanavos
57 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
58 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
59 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("name", reader.Value.ToString());
60 d78cbf09 Panagiotis Kanavos
61 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(1, reader.Depth);
62 d78cbf09 Panagiotis Kanavos
63 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
64 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
65 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("James", reader.Value.ToString());
66 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(typeof(string), reader.ValueType);
67 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual('"', reader.QuoteChar);
68 d78cbf09 Panagiotis Kanavos
69 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
70 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
71 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("hobbies", reader.Value.ToString());
72 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual('\'', reader.QuoteChar);
73 d78cbf09 Panagiotis Kanavos
74 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
75 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
76 d78cbf09 Panagiotis Kanavos
77 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
78 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
79 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("pie", reader.Value.ToString());
80 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual('"', reader.QuoteChar);
81 d78cbf09 Panagiotis Kanavos
82 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
83 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
84 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("cake", reader.Value.ToString());
85 d78cbf09 Panagiotis Kanavos
86 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
87 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
88 d78cbf09 Panagiotis Kanavos
89 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
90 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
91 d78cbf09 Panagiotis Kanavos
92 d78cbf09 Panagiotis Kanavos
      Assert.IsNull(validationEventArgs);
93 d78cbf09 Panagiotis Kanavos
    }
94 d78cbf09 Panagiotis Kanavos
95 d78cbf09 Panagiotis Kanavos
    [Test]
96 d78cbf09 Panagiotis Kanavos
    public void ValidateUnrestrictedArray()
97 d78cbf09 Panagiotis Kanavos
    {
98 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
99 d78cbf09 Panagiotis Kanavos
  ""type"":""array""
100 d78cbf09 Panagiotis Kanavos
}";
101 d78cbf09 Panagiotis Kanavos
102 d78cbf09 Panagiotis Kanavos
      string json = "['pie','cake',['nested1','nested2'],{'nestedproperty1':1.1,'nestedproperty2':[null]}]";
103 d78cbf09 Panagiotis Kanavos
104 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
105 d78cbf09 Panagiotis Kanavos
106 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
107 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
108 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
109 d78cbf09 Panagiotis Kanavos
110 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
111 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
112 d78cbf09 Panagiotis Kanavos
113 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
114 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
115 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("pie", reader.Value.ToString());
116 d78cbf09 Panagiotis Kanavos
117 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
118 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
119 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("cake", reader.Value.ToString());
120 d78cbf09 Panagiotis Kanavos
121 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
122 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
123 d78cbf09 Panagiotis Kanavos
124 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
125 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
126 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("nested1", reader.Value.ToString());
127 d78cbf09 Panagiotis Kanavos
128 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
129 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
130 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("nested2", reader.Value.ToString());
131 d78cbf09 Panagiotis Kanavos
132 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
133 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
134 d78cbf09 Panagiotis Kanavos
135 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
136 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
137 d78cbf09 Panagiotis Kanavos
138 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
139 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
140 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("nestedproperty1", reader.Value.ToString());
141 d78cbf09 Panagiotis Kanavos
142 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
143 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
144 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(1.1, reader.Value);
145 d78cbf09 Panagiotis Kanavos
146 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
147 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
148 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("nestedproperty2", reader.Value.ToString());
149 d78cbf09 Panagiotis Kanavos
150 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
151 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
152 d78cbf09 Panagiotis Kanavos
153 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
154 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
155 d78cbf09 Panagiotis Kanavos
156 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
157 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
158 d78cbf09 Panagiotis Kanavos
159 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
160 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
161 d78cbf09 Panagiotis Kanavos
162 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
163 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
164 d78cbf09 Panagiotis Kanavos
165 d78cbf09 Panagiotis Kanavos
      Assert.IsNull(validationEventArgs);
166 d78cbf09 Panagiotis Kanavos
    }
167 d78cbf09 Panagiotis Kanavos
168 d78cbf09 Panagiotis Kanavos
    [Test]
169 d78cbf09 Panagiotis Kanavos
    public void StringLessThanMinimumLength()
170 d78cbf09 Panagiotis Kanavos
    {
171 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
172 d78cbf09 Panagiotis Kanavos
  ""type"":""string"",
173 d78cbf09 Panagiotis Kanavos
  ""minLength"":5,
174 d78cbf09 Panagiotis Kanavos
  ""maxLength"":50,
175 d78cbf09 Panagiotis Kanavos
}";
176 d78cbf09 Panagiotis Kanavos
177 d78cbf09 Panagiotis Kanavos
      string json = "'pie'";
178 d78cbf09 Panagiotis Kanavos
179 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
180 d78cbf09 Panagiotis Kanavos
181 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
182 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
183 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
184 d78cbf09 Panagiotis Kanavos
185 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
186 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
187 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("String 'pie' is less than minimum length of 5. Line 1, position 5.", validationEventArgs.Message);
188 d78cbf09 Panagiotis Kanavos
189 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
190 d78cbf09 Panagiotis Kanavos
    }
191 d78cbf09 Panagiotis Kanavos
192 d78cbf09 Panagiotis Kanavos
    [Test]
193 d78cbf09 Panagiotis Kanavos
    public void StringGreaterThanMaximumLength()
194 d78cbf09 Panagiotis Kanavos
    {
195 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
196 d78cbf09 Panagiotis Kanavos
  ""type"":""string"",
197 d78cbf09 Panagiotis Kanavos
  ""minLength"":5,
198 d78cbf09 Panagiotis Kanavos
  ""maxLength"":10
199 d78cbf09 Panagiotis Kanavos
}";
200 d78cbf09 Panagiotis Kanavos
201 d78cbf09 Panagiotis Kanavos
      string json = "'The quick brown fox jumps over the lazy dog.'";
202 d78cbf09 Panagiotis Kanavos
203 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
204 d78cbf09 Panagiotis Kanavos
205 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
206 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
207 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
208 d78cbf09 Panagiotis Kanavos
209 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
210 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
211 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("String 'The quick brown fox jumps over the lazy dog.' exceeds maximum length of 10. Line 1, position 46.", validationEventArgs.Message);
212 d78cbf09 Panagiotis Kanavos
213 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
214 d78cbf09 Panagiotis Kanavos
    }
215 d78cbf09 Panagiotis Kanavos
216 d78cbf09 Panagiotis Kanavos
    [Test]
217 d78cbf09 Panagiotis Kanavos
    public void StringIsNotInEnum()
218 d78cbf09 Panagiotis Kanavos
    {
219 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
220 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
221 d78cbf09 Panagiotis Kanavos
  ""items"":{
222 d78cbf09 Panagiotis Kanavos
    ""type"":""string"",
223 d78cbf09 Panagiotis Kanavos
    ""enum"":[""one"",""two""]
224 d78cbf09 Panagiotis Kanavos
  },
225 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3
226 d78cbf09 Panagiotis Kanavos
}";
227 d78cbf09 Panagiotis Kanavos
228 d78cbf09 Panagiotis Kanavos
      string json = "['one','two','THREE']";
229 d78cbf09 Panagiotis Kanavos
230 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
231 d78cbf09 Panagiotis Kanavos
232 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
233 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
234 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
235 d78cbf09 Panagiotis Kanavos
236 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
237 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
238 d78cbf09 Panagiotis Kanavos
239 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
240 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
241 d78cbf09 Panagiotis Kanavos
242 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
243 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
244 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
245 d78cbf09 Panagiotis Kanavos
246 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
247 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
248 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(@"Value ""THREE"" is not defined in enum. Line 1, position 20.", validationEventArgs.Message);
249 d78cbf09 Panagiotis Kanavos
250 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
251 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
252 d78cbf09 Panagiotis Kanavos
253 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
254 d78cbf09 Panagiotis Kanavos
    }
255 d78cbf09 Panagiotis Kanavos
256 d78cbf09 Panagiotis Kanavos
    [Test]
257 d78cbf09 Panagiotis Kanavos
    public void StringDoesNotMatchPattern()
258 d78cbf09 Panagiotis Kanavos
    {
259 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
260 d78cbf09 Panagiotis Kanavos
  ""type"":""string"",
261 d78cbf09 Panagiotis Kanavos
  ""pattern"":""foo""
262 d78cbf09 Panagiotis Kanavos
}";
263 d78cbf09 Panagiotis Kanavos
264 d78cbf09 Panagiotis Kanavos
      string json = "'The quick brown fox jumps over the lazy dog.'";
265 d78cbf09 Panagiotis Kanavos
266 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
267 d78cbf09 Panagiotis Kanavos
268 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
269 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
270 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
271 d78cbf09 Panagiotis Kanavos
272 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
273 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
274 d78cbf09 Panagiotis Kanavos
      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 d78cbf09 Panagiotis Kanavos
276 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
277 d78cbf09 Panagiotis Kanavos
    }
278 d78cbf09 Panagiotis Kanavos
279 d78cbf09 Panagiotis Kanavos
    [Test]
280 d78cbf09 Panagiotis Kanavos
    public void IntegerGreaterThanMaximumValue()
281 d78cbf09 Panagiotis Kanavos
    {
282 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
283 d78cbf09 Panagiotis Kanavos
  ""type"":""integer"",
284 d78cbf09 Panagiotis Kanavos
  ""maximum"":5
285 d78cbf09 Panagiotis Kanavos
}";
286 d78cbf09 Panagiotis Kanavos
287 d78cbf09 Panagiotis Kanavos
      string json = "10";
288 d78cbf09 Panagiotis Kanavos
289 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
290 d78cbf09 Panagiotis Kanavos
291 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
292 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
293 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
294 d78cbf09 Panagiotis Kanavos
295 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
296 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
297 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Integer 10 exceeds maximum value of 5. Line 1, position 2.", validationEventArgs.Message);
298 d78cbf09 Panagiotis Kanavos
299 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
300 d78cbf09 Panagiotis Kanavos
    }
301 d78cbf09 Panagiotis Kanavos
302 d78cbf09 Panagiotis Kanavos
    [Test]
303 d78cbf09 Panagiotis Kanavos
    [ExpectedException(typeof(JsonSchemaException), ExpectedMessage = "Integer 10 exceeds maximum value of 5. Line 1, position 2.")]
304 d78cbf09 Panagiotis Kanavos
    public void ThrowExceptionWhenNoValidationEventHandler()
305 d78cbf09 Panagiotis Kanavos
    {
306 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
307 d78cbf09 Panagiotis Kanavos
  ""type"":""integer"",
308 d78cbf09 Panagiotis Kanavos
  ""maximum"":5
309 d78cbf09 Panagiotis Kanavos
}";
310 d78cbf09 Panagiotis Kanavos
311 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader("10")));
312 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
313 d78cbf09 Panagiotis Kanavos
314 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
315 d78cbf09 Panagiotis Kanavos
    }
316 d78cbf09 Panagiotis Kanavos
317 d78cbf09 Panagiotis Kanavos
    [Test]
318 d78cbf09 Panagiotis Kanavos
    public void IntegerLessThanMinimumValue()
319 d78cbf09 Panagiotis Kanavos
    {
320 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
321 d78cbf09 Panagiotis Kanavos
  ""type"":""integer"",
322 d78cbf09 Panagiotis Kanavos
  ""minimum"":5
323 d78cbf09 Panagiotis Kanavos
}";
324 d78cbf09 Panagiotis Kanavos
325 d78cbf09 Panagiotis Kanavos
      string json = "1";
326 d78cbf09 Panagiotis Kanavos
327 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
328 d78cbf09 Panagiotis Kanavos
329 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
330 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
331 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
332 d78cbf09 Panagiotis Kanavos
333 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
334 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
335 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Integer 1 is less than minimum value of 5. Line 1, position 1.", validationEventArgs.Message);
336 d78cbf09 Panagiotis Kanavos
337 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
338 d78cbf09 Panagiotis Kanavos
    }
339 d78cbf09 Panagiotis Kanavos
340 d78cbf09 Panagiotis Kanavos
    [Test]
341 d78cbf09 Panagiotis Kanavos
    public void IntegerIsNotInEnum()
342 d78cbf09 Panagiotis Kanavos
    {
343 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
344 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
345 d78cbf09 Panagiotis Kanavos
  ""items"":{
346 d78cbf09 Panagiotis Kanavos
    ""type"":""integer"",
347 d78cbf09 Panagiotis Kanavos
    ""enum"":[1,2]
348 d78cbf09 Panagiotis Kanavos
  },
349 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3
350 d78cbf09 Panagiotis Kanavos
}";
351 d78cbf09 Panagiotis Kanavos
352 d78cbf09 Panagiotis Kanavos
      string json = "[1,2,3]";
353 d78cbf09 Panagiotis Kanavos
354 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
355 d78cbf09 Panagiotis Kanavos
356 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
357 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
358 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
359 d78cbf09 Panagiotis Kanavos
360 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
361 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
362 d78cbf09 Panagiotis Kanavos
363 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
364 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
365 d78cbf09 Panagiotis Kanavos
366 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
367 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
368 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
369 d78cbf09 Panagiotis Kanavos
370 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
371 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
372 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(@"Value 3 is not defined in enum. Line 1, position 7.", validationEventArgs.Message);
373 d78cbf09 Panagiotis Kanavos
374 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
375 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
376 d78cbf09 Panagiotis Kanavos
377 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
378 d78cbf09 Panagiotis Kanavos
    }
379 d78cbf09 Panagiotis Kanavos
380 d78cbf09 Panagiotis Kanavos
    [Test]
381 d78cbf09 Panagiotis Kanavos
    public void FloatGreaterThanMaximumValue()
382 d78cbf09 Panagiotis Kanavos
    {
383 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
384 d78cbf09 Panagiotis Kanavos
  ""type"":""number"",
385 d78cbf09 Panagiotis Kanavos
  ""maximum"":5
386 d78cbf09 Panagiotis Kanavos
}";
387 d78cbf09 Panagiotis Kanavos
388 d78cbf09 Panagiotis Kanavos
      string json = "10.0";
389 d78cbf09 Panagiotis Kanavos
390 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
391 d78cbf09 Panagiotis Kanavos
392 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
393 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
394 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
395 d78cbf09 Panagiotis Kanavos
396 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
397 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
398 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Float 10.0 exceeds maximum value of 5. Line 1, position 4.", validationEventArgs.Message);
399 d78cbf09 Panagiotis Kanavos
400 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
401 d78cbf09 Panagiotis Kanavos
    }
402 d78cbf09 Panagiotis Kanavos
403 d78cbf09 Panagiotis Kanavos
    [Test]
404 d78cbf09 Panagiotis Kanavos
    public void FloatLessThanMinimumValue()
405 d78cbf09 Panagiotis Kanavos
    {
406 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
407 d78cbf09 Panagiotis Kanavos
  ""type"":""number"",
408 d78cbf09 Panagiotis Kanavos
  ""minimum"":5
409 d78cbf09 Panagiotis Kanavos
}";
410 d78cbf09 Panagiotis Kanavos
411 d78cbf09 Panagiotis Kanavos
      string json = "1.1";
412 d78cbf09 Panagiotis Kanavos
413 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
414 d78cbf09 Panagiotis Kanavos
415 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
416 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
417 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
418 d78cbf09 Panagiotis Kanavos
419 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
420 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
421 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Float 1.1 is less than minimum value of 5. Line 1, position 3.", validationEventArgs.Message);
422 d78cbf09 Panagiotis Kanavos
423 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
424 d78cbf09 Panagiotis Kanavos
    }
425 d78cbf09 Panagiotis Kanavos
426 d78cbf09 Panagiotis Kanavos
    [Test]
427 d78cbf09 Panagiotis Kanavos
    public void FloatIsNotInEnum()
428 d78cbf09 Panagiotis Kanavos
    {
429 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
430 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
431 d78cbf09 Panagiotis Kanavos
  ""items"":{
432 d78cbf09 Panagiotis Kanavos
    ""type"":""number"",
433 d78cbf09 Panagiotis Kanavos
    ""enum"":[1.1,2.2]
434 d78cbf09 Panagiotis Kanavos
  },
435 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3
436 d78cbf09 Panagiotis Kanavos
}";
437 d78cbf09 Panagiotis Kanavos
438 d78cbf09 Panagiotis Kanavos
      string json = "[1.1,2.2,3.0]";
439 d78cbf09 Panagiotis Kanavos
440 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
441 d78cbf09 Panagiotis Kanavos
442 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
443 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
444 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
445 d78cbf09 Panagiotis Kanavos
446 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
447 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
448 d78cbf09 Panagiotis Kanavos
449 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
450 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
451 d78cbf09 Panagiotis Kanavos
452 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
453 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
454 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
455 d78cbf09 Panagiotis Kanavos
456 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
457 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
458 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(@"Value 3.0 is not defined in enum. Line 1, position 13.", validationEventArgs.Message);
459 d78cbf09 Panagiotis Kanavos
460 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
461 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
462 d78cbf09 Panagiotis Kanavos
463 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
464 d78cbf09 Panagiotis Kanavos
    }
465 d78cbf09 Panagiotis Kanavos
466 d78cbf09 Panagiotis Kanavos
    [Test]
467 d78cbf09 Panagiotis Kanavos
    public void FloatExceedsMaxDecimalPlaces()
468 d78cbf09 Panagiotis Kanavos
    {
469 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
470 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
471 d78cbf09 Panagiotis Kanavos
  ""items"":{
472 d78cbf09 Panagiotis Kanavos
    ""type"":""number"",
473 d78cbf09 Panagiotis Kanavos
    ""divisibleBy"":0.1
474 d78cbf09 Panagiotis Kanavos
  }
475 d78cbf09 Panagiotis Kanavos
}";
476 d78cbf09 Panagiotis Kanavos
477 d78cbf09 Panagiotis Kanavos
      string json = "[1.1,2.2,4.001]";
478 d78cbf09 Panagiotis Kanavos
479 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
480 d78cbf09 Panagiotis Kanavos
481 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
482 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
483 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
484 d78cbf09 Panagiotis Kanavos
485 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
486 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
487 d78cbf09 Panagiotis Kanavos
488 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
489 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
490 d78cbf09 Panagiotis Kanavos
491 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
492 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
493 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
494 d78cbf09 Panagiotis Kanavos
495 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
496 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
497 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(@"Float 4.001 is not evenly divisible by 0.1. Line 1, position 15.", validationEventArgs.Message);
498 d78cbf09 Panagiotis Kanavos
499 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
500 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
501 d78cbf09 Panagiotis Kanavos
502 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
503 d78cbf09 Panagiotis Kanavos
    }
504 d78cbf09 Panagiotis Kanavos
505 d78cbf09 Panagiotis Kanavos
    [Test]
506 d78cbf09 Panagiotis Kanavos
    public void NullNotInEnum()
507 d78cbf09 Panagiotis Kanavos
    {
508 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
509 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
510 d78cbf09 Panagiotis Kanavos
  ""items"":{
511 d78cbf09 Panagiotis Kanavos
    ""type"":""null"",
512 d78cbf09 Panagiotis Kanavos
    ""enum"":[]
513 d78cbf09 Panagiotis Kanavos
  },
514 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3
515 d78cbf09 Panagiotis Kanavos
}";
516 d78cbf09 Panagiotis Kanavos
517 d78cbf09 Panagiotis Kanavos
      string json = "[null]";
518 d78cbf09 Panagiotis Kanavos
519 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
520 d78cbf09 Panagiotis Kanavos
521 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
522 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
523 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
524 d78cbf09 Panagiotis Kanavos
525 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
526 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
527 d78cbf09 Panagiotis Kanavos
528 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
529 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
530 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(@"Value null is not defined in enum. Line 1, position 5.", validationEventArgs.Message);
531 d78cbf09 Panagiotis Kanavos
532 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
533 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
534 d78cbf09 Panagiotis Kanavos
535 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
536 d78cbf09 Panagiotis Kanavos
    }
537 d78cbf09 Panagiotis Kanavos
538 d78cbf09 Panagiotis Kanavos
    [Test]
539 d78cbf09 Panagiotis Kanavos
    public void BooleanNotInEnum()
540 d78cbf09 Panagiotis Kanavos
    {
541 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
542 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
543 d78cbf09 Panagiotis Kanavos
  ""items"":{
544 d78cbf09 Panagiotis Kanavos
    ""type"":""boolean"",
545 d78cbf09 Panagiotis Kanavos
    ""enum"":[true]
546 d78cbf09 Panagiotis Kanavos
  },
547 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3
548 d78cbf09 Panagiotis Kanavos
}";
549 d78cbf09 Panagiotis Kanavos
550 d78cbf09 Panagiotis Kanavos
      string json = "[true,false]";
551 d78cbf09 Panagiotis Kanavos
552 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
553 d78cbf09 Panagiotis Kanavos
554 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
555 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
556 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
557 d78cbf09 Panagiotis Kanavos
558 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
559 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
560 d78cbf09 Panagiotis Kanavos
561 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
562 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
563 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
564 d78cbf09 Panagiotis Kanavos
565 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
566 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Boolean, reader.TokenType);
567 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(@"Value false is not defined in enum. Line 1, position 11.", validationEventArgs.Message);
568 d78cbf09 Panagiotis Kanavos
      
569 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
570 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
571 d78cbf09 Panagiotis Kanavos
572 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
573 d78cbf09 Panagiotis Kanavos
    }
574 d78cbf09 Panagiotis Kanavos
    
575 d78cbf09 Panagiotis Kanavos
    [Test]
576 d78cbf09 Panagiotis Kanavos
    public void ArrayCountGreaterThanMaximumItems()
577 d78cbf09 Panagiotis Kanavos
    {
578 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
579 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
580 d78cbf09 Panagiotis Kanavos
  ""minItems"":2,
581 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3
582 d78cbf09 Panagiotis Kanavos
}";
583 d78cbf09 Panagiotis Kanavos
584 d78cbf09 Panagiotis Kanavos
      string json = "[null,null,null,null]";
585 d78cbf09 Panagiotis Kanavos
586 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
587 d78cbf09 Panagiotis Kanavos
588 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
589 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
590 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
591 d78cbf09 Panagiotis Kanavos
592 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
593 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
594 d78cbf09 Panagiotis Kanavos
595 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
596 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
597 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
598 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
599 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
600 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
601 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
602 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
603 d78cbf09 Panagiotis Kanavos
604 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
605 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
606 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Array item count 4 exceeds maximum count of 3. Line 1, position 21.", validationEventArgs.Message);
607 d78cbf09 Panagiotis Kanavos
608 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
609 d78cbf09 Panagiotis Kanavos
    }
610 d78cbf09 Panagiotis Kanavos
611 d78cbf09 Panagiotis Kanavos
    [Test]
612 d78cbf09 Panagiotis Kanavos
    public void ArrayCountLessThanMinimumItems()
613 d78cbf09 Panagiotis Kanavos
    {
614 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
615 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
616 d78cbf09 Panagiotis Kanavos
  ""minItems"":2,
617 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3
618 d78cbf09 Panagiotis Kanavos
}";
619 d78cbf09 Panagiotis Kanavos
620 d78cbf09 Panagiotis Kanavos
      string json = "[null]";
621 d78cbf09 Panagiotis Kanavos
622 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
623 d78cbf09 Panagiotis Kanavos
624 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
625 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
626 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
627 d78cbf09 Panagiotis Kanavos
628 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
629 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
630 d78cbf09 Panagiotis Kanavos
631 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
632 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
633 d78cbf09 Panagiotis Kanavos
634 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
635 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
636 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Array item count 1 is less than minimum count of 2. Line 1, position 6.", validationEventArgs.Message);
637 d78cbf09 Panagiotis Kanavos
638 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
639 d78cbf09 Panagiotis Kanavos
    }
640 d78cbf09 Panagiotis Kanavos
641 d78cbf09 Panagiotis Kanavos
    [Test]
642 d78cbf09 Panagiotis Kanavos
    public void InvalidDataType()
643 d78cbf09 Panagiotis Kanavos
    {
644 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
645 d78cbf09 Panagiotis Kanavos
  ""type"":""string"",
646 d78cbf09 Panagiotis Kanavos
  ""minItems"":2,
647 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3,
648 d78cbf09 Panagiotis Kanavos
  ""items"":{}
649 d78cbf09 Panagiotis Kanavos
}";
650 d78cbf09 Panagiotis Kanavos
651 d78cbf09 Panagiotis Kanavos
      string json = "[null,null,null,null]";
652 d78cbf09 Panagiotis Kanavos
653 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
654 d78cbf09 Panagiotis Kanavos
655 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
656 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
657 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
658 d78cbf09 Panagiotis Kanavos
659 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
660 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
661 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(@"Invalid type. Expected String but got Array. Line 1, position 1.", validationEventArgs.Message);
662 d78cbf09 Panagiotis Kanavos
663 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
664 d78cbf09 Panagiotis Kanavos
    }
665 d78cbf09 Panagiotis Kanavos
666 d78cbf09 Panagiotis Kanavos
    [Test]
667 d78cbf09 Panagiotis Kanavos
    public void StringDisallowed()
668 d78cbf09 Panagiotis Kanavos
    {
669 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
670 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
671 d78cbf09 Panagiotis Kanavos
  ""items"":{
672 d78cbf09 Panagiotis Kanavos
    ""disallow"":[""number""]
673 d78cbf09 Panagiotis Kanavos
  },
674 d78cbf09 Panagiotis Kanavos
  ""maxItems"":3
675 d78cbf09 Panagiotis Kanavos
}";
676 d78cbf09 Panagiotis Kanavos
677 d78cbf09 Panagiotis Kanavos
      string json = "['pie',1.1]";
678 d78cbf09 Panagiotis Kanavos
679 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
680 d78cbf09 Panagiotis Kanavos
681 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
682 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
683 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
684 d78cbf09 Panagiotis Kanavos
685 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
686 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
687 d78cbf09 Panagiotis Kanavos
688 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
689 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
690 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
691 d78cbf09 Panagiotis Kanavos
692 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
693 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Float, reader.TokenType);
694 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(@"Type Float is disallowed. Line 1, position 11.", validationEventArgs.Message);
695 d78cbf09 Panagiotis Kanavos
696 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
697 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
698 d78cbf09 Panagiotis Kanavos
699 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
700 d78cbf09 Panagiotis Kanavos
    }
701 d78cbf09 Panagiotis Kanavos
702 d78cbf09 Panagiotis Kanavos
    [Test]
703 d78cbf09 Panagiotis Kanavos
    public void MissingRequiredProperties()
704 d78cbf09 Panagiotis Kanavos
    {
705 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
706 d78cbf09 Panagiotis Kanavos
  ""description"":""A person"",
707 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
708 d78cbf09 Panagiotis Kanavos
  ""properties"":
709 d78cbf09 Panagiotis Kanavos
  {
710 d78cbf09 Panagiotis Kanavos
    ""name"":{""type"":""string""},
711 d78cbf09 Panagiotis Kanavos
    ""hobbies"":{""type"":""string"",""required"":true},
712 d78cbf09 Panagiotis Kanavos
    ""age"":{""type"":""integer"",""required"":true}
713 d78cbf09 Panagiotis Kanavos
  }
714 d78cbf09 Panagiotis Kanavos
}";
715 d78cbf09 Panagiotis Kanavos
716 d78cbf09 Panagiotis Kanavos
      string json = "{'name':'James'}";
717 d78cbf09 Panagiotis Kanavos
718 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
719 d78cbf09 Panagiotis Kanavos
720 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
721 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
722 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
723 d78cbf09 Panagiotis Kanavos
724 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
725 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
726 d78cbf09 Panagiotis Kanavos
727 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
728 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
729 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("name", reader.Value.ToString());
730 d78cbf09 Panagiotis Kanavos
731 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
732 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
733 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("James", reader.Value.ToString());
734 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
735 d78cbf09 Panagiotis Kanavos
736 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
737 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
738 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Required properties are missing from object: hobbies, age. Line 1, position 16.", validationEventArgs.Message);
739 d78cbf09 Panagiotis Kanavos
740 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
741 d78cbf09 Panagiotis Kanavos
    }
742 d78cbf09 Panagiotis Kanavos
743 d78cbf09 Panagiotis Kanavos
    [Test]
744 d78cbf09 Panagiotis Kanavos
    public void MissingNonRequiredProperties()
745 d78cbf09 Panagiotis Kanavos
    {
746 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
747 d78cbf09 Panagiotis Kanavos
  ""description"":""A person"",
748 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
749 d78cbf09 Panagiotis Kanavos
  ""properties"":
750 d78cbf09 Panagiotis Kanavos
  {
751 d78cbf09 Panagiotis Kanavos
    ""name"":{""type"":""string"",""required"":true},
752 d78cbf09 Panagiotis Kanavos
    ""hobbies"":{""type"":""string"",""required"":false},
753 d78cbf09 Panagiotis Kanavos
    ""age"":{""type"":""integer""}
754 d78cbf09 Panagiotis Kanavos
  }
755 d78cbf09 Panagiotis Kanavos
}";
756 d78cbf09 Panagiotis Kanavos
757 d78cbf09 Panagiotis Kanavos
      string json = "{'name':'James'}";
758 d78cbf09 Panagiotis Kanavos
759 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
760 d78cbf09 Panagiotis Kanavos
761 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
762 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
763 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
764 d78cbf09 Panagiotis Kanavos
765 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
766 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
767 d78cbf09 Panagiotis Kanavos
768 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
769 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
770 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("name", reader.Value.ToString());
771 d78cbf09 Panagiotis Kanavos
772 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
773 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
774 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("James", reader.Value.ToString());
775 d78cbf09 Panagiotis Kanavos
      Assert.IsNull(validationEventArgs);
776 d78cbf09 Panagiotis Kanavos
777 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
778 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
779 d78cbf09 Panagiotis Kanavos
780 d78cbf09 Panagiotis Kanavos
      Assert.IsNull(validationEventArgs);
781 d78cbf09 Panagiotis Kanavos
    }
782 d78cbf09 Panagiotis Kanavos
783 d78cbf09 Panagiotis Kanavos
    [Test]
784 d78cbf09 Panagiotis Kanavos
    public void DisableAdditionalProperties()
785 d78cbf09 Panagiotis Kanavos
    {
786 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
787 d78cbf09 Panagiotis Kanavos
  ""description"":""A person"",
788 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
789 d78cbf09 Panagiotis Kanavos
  ""properties"":
790 d78cbf09 Panagiotis Kanavos
  {
791 d78cbf09 Panagiotis Kanavos
    ""name"":{""type"":""string""}
792 d78cbf09 Panagiotis Kanavos
  },
793 d78cbf09 Panagiotis Kanavos
  ""additionalProperties"":false
794 d78cbf09 Panagiotis Kanavos
}";
795 d78cbf09 Panagiotis Kanavos
796 d78cbf09 Panagiotis Kanavos
      string json = "{'name':'James','additionalProperty1':null,'additionalProperty2':null}";
797 d78cbf09 Panagiotis Kanavos
798 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
799 d78cbf09 Panagiotis Kanavos
800 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
801 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
802 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
803 d78cbf09 Panagiotis Kanavos
804 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
805 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
806 d78cbf09 Panagiotis Kanavos
807 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
808 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
809 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("name", reader.Value.ToString());
810 d78cbf09 Panagiotis Kanavos
811 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
812 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
813 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("James", reader.Value.ToString());
814 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
815 d78cbf09 Panagiotis Kanavos
816 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
817 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
818 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("additionalProperty1", reader.Value.ToString());
819 d78cbf09 Panagiotis Kanavos
820 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
821 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
822 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, reader.Value);
823 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Property 'additionalProperty1' has not been defined and the schema does not allow additional properties. Line 1, position 38.", validationEventArgs.Message);
824 d78cbf09 Panagiotis Kanavos
825 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
826 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
827 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("additionalProperty2", reader.Value.ToString());
828 d78cbf09 Panagiotis Kanavos
829 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
830 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
831 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, reader.Value);
832 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Property 'additionalProperty2' has not been defined and the schema does not allow additional properties. Line 1, position 65.", validationEventArgs.Message);
833 d78cbf09 Panagiotis Kanavos
834 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
835 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
836 d78cbf09 Panagiotis Kanavos
837 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
838 d78cbf09 Panagiotis Kanavos
    }
839 d78cbf09 Panagiotis Kanavos
840 d78cbf09 Panagiotis Kanavos
    [Test]
841 d78cbf09 Panagiotis Kanavos
    public void ExtendsStringGreaterThanMaximumLength()
842 d78cbf09 Panagiotis Kanavos
    {
843 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
844 d78cbf09 Panagiotis Kanavos
  ""extends"":{
845 d78cbf09 Panagiotis Kanavos
    ""type"":""string"",
846 d78cbf09 Panagiotis Kanavos
    ""minLength"":5,
847 d78cbf09 Panagiotis Kanavos
    ""maxLength"":10
848 d78cbf09 Panagiotis Kanavos
  },
849 d78cbf09 Panagiotis Kanavos
  ""maxLength"":9
850 d78cbf09 Panagiotis Kanavos
}";
851 d78cbf09 Panagiotis Kanavos
852 d78cbf09 Panagiotis Kanavos
      List<string> errors = new List<string>();
853 d78cbf09 Panagiotis Kanavos
      string json = "'The quick brown fox jumps over the lazy dog.'";
854 d78cbf09 Panagiotis Kanavos
855 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
856 d78cbf09 Panagiotis Kanavos
857 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
858 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; errors.Add(validationEventArgs.Message); };
859 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
860 d78cbf09 Panagiotis Kanavos
861 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
862 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
863 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(1, errors.Count);
864 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("String 'The quick brown fox jumps over the lazy dog.' exceeds maximum length of 9. Line 1, position 46.", errors[0]);
865 d78cbf09 Panagiotis Kanavos
866 d78cbf09 Panagiotis Kanavos
      Assert.IsNotNull(validationEventArgs);
867 d78cbf09 Panagiotis Kanavos
    }
868 d78cbf09 Panagiotis Kanavos
869 d78cbf09 Panagiotis Kanavos
    private JsonSchema GetExtendedSchema()
870 d78cbf09 Panagiotis Kanavos
    {
871 d78cbf09 Panagiotis Kanavos
      string first = @"{
872 d78cbf09 Panagiotis Kanavos
  ""id"":""first"",
873 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
874 d78cbf09 Panagiotis Kanavos
  ""properties"":
875 d78cbf09 Panagiotis Kanavos
  {
876 d78cbf09 Panagiotis Kanavos
    ""firstproperty"":{""type"":""string"",""required"":true}
877 d78cbf09 Panagiotis Kanavos
  },
878 d78cbf09 Panagiotis Kanavos
  ""additionalProperties"":{}
879 d78cbf09 Panagiotis Kanavos
}";
880 d78cbf09 Panagiotis Kanavos
881 d78cbf09 Panagiotis Kanavos
      string second = @"{
882 d78cbf09 Panagiotis Kanavos
  ""id"":""second"",
883 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
884 d78cbf09 Panagiotis Kanavos
  ""extends"":{""$ref"":""first""},
885 d78cbf09 Panagiotis Kanavos
  ""properties"":
886 d78cbf09 Panagiotis Kanavos
  {
887 d78cbf09 Panagiotis Kanavos
    ""secondproperty"":{""type"":""string"",""required"":true}
888 d78cbf09 Panagiotis Kanavos
  },
889 d78cbf09 Panagiotis Kanavos
  ""additionalProperties"":false
890 d78cbf09 Panagiotis Kanavos
}";
891 d78cbf09 Panagiotis Kanavos
892 d78cbf09 Panagiotis Kanavos
      JsonSchemaResolver resolver = new JsonSchemaResolver();
893 d78cbf09 Panagiotis Kanavos
      JsonSchema firstSchema = JsonSchema.Parse(first, resolver);
894 d78cbf09 Panagiotis Kanavos
      JsonSchema secondSchema = JsonSchema.Parse(second, resolver);
895 d78cbf09 Panagiotis Kanavos
896 d78cbf09 Panagiotis Kanavos
      return secondSchema;
897 d78cbf09 Panagiotis Kanavos
    }
898 d78cbf09 Panagiotis Kanavos
899 d78cbf09 Panagiotis Kanavos
    [Test]
900 d78cbf09 Panagiotis Kanavos
    public void ExtendsDisallowAdditionProperties()
901 d78cbf09 Panagiotis Kanavos
    {
902 d78cbf09 Panagiotis Kanavos
      string json = "{'firstproperty':'blah','secondproperty':'blah2','additional':'blah3','additional2':'blah4'}";
903 d78cbf09 Panagiotis Kanavos
904 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
905 d78cbf09 Panagiotis Kanavos
906 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
907 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
908 d78cbf09 Panagiotis Kanavos
      reader.Schema = GetExtendedSchema();
909 d78cbf09 Panagiotis Kanavos
910 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
911 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
912 d78cbf09 Panagiotis Kanavos
913 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
914 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
915 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("firstproperty", reader.Value.ToString());
916 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
917 d78cbf09 Panagiotis Kanavos
918 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
919 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
920 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("blah", reader.Value.ToString());
921 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
922 d78cbf09 Panagiotis Kanavos
923 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
924 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
925 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("secondproperty", reader.Value.ToString());
926 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
927 d78cbf09 Panagiotis Kanavos
928 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
929 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
930 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("blah2", reader.Value.ToString());
931 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
932 d78cbf09 Panagiotis Kanavos
933 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
934 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
935 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("additional", reader.Value.ToString());
936 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Property 'additional' has not been defined and the schema does not allow additional properties. Line 1, position 62.", validationEventArgs.Message);
937 d78cbf09 Panagiotis Kanavos
938 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
939 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
940 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("blah3", reader.Value.ToString());
941 d78cbf09 Panagiotis Kanavos
942 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
943 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
944 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("additional2", reader.Value.ToString());
945 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Property 'additional2' has not been defined and the schema does not allow additional properties. Line 1, position 84.", validationEventArgs.Message);
946 d78cbf09 Panagiotis Kanavos
947 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
948 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
949 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("blah4", reader.Value.ToString());
950 d78cbf09 Panagiotis Kanavos
951 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
952 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
953 d78cbf09 Panagiotis Kanavos
954 d78cbf09 Panagiotis Kanavos
      Assert.IsFalse(reader.Read());
955 d78cbf09 Panagiotis Kanavos
    }
956 d78cbf09 Panagiotis Kanavos
957 d78cbf09 Panagiotis Kanavos
    [Test]
958 d78cbf09 Panagiotis Kanavos
    public void ExtendsMissingRequiredProperties()
959 d78cbf09 Panagiotis Kanavos
    {
960 d78cbf09 Panagiotis Kanavos
      string json = "{}";
961 d78cbf09 Panagiotis Kanavos
962 d78cbf09 Panagiotis Kanavos
      List<string> errors = new List<string>();
963 d78cbf09 Panagiotis Kanavos
964 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
965 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { errors.Add(args.Message); };
966 d78cbf09 Panagiotis Kanavos
      reader.Schema = GetExtendedSchema();
967 d78cbf09 Panagiotis Kanavos
968 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
969 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
970 d78cbf09 Panagiotis Kanavos
971 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
972 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
973 d78cbf09 Panagiotis Kanavos
974 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(1, errors.Count);
975 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Required properties are missing from object: secondproperty, firstproperty. Line 1, position 2.", errors[0]);
976 d78cbf09 Panagiotis Kanavos
    }
977 d78cbf09 Panagiotis Kanavos
978 d78cbf09 Panagiotis Kanavos
    [Test]
979 d78cbf09 Panagiotis Kanavos
    public void NoAdditionalProperties()
980 d78cbf09 Panagiotis Kanavos
    {
981 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
982 d78cbf09 Panagiotis Kanavos
  ""type"":""array"",
983 d78cbf09 Panagiotis Kanavos
  ""items"": [{""type"":""string""},{""type"":""integer""}],
984 d78cbf09 Panagiotis Kanavos
  ""additionalProperties"": false
985 d78cbf09 Panagiotis Kanavos
}";
986 d78cbf09 Panagiotis Kanavos
987 d78cbf09 Panagiotis Kanavos
      string json = @"[1, 'a', null]";
988 d78cbf09 Panagiotis Kanavos
989 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
990 d78cbf09 Panagiotis Kanavos
991 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
992 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
993 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
994 d78cbf09 Panagiotis Kanavos
995 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
996 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartArray, reader.TokenType);
997 d78cbf09 Panagiotis Kanavos
998 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
999 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
1000 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Invalid type. Expected String but got Integer. Line 1, position 3.", validationEventArgs.Message);
1001 d78cbf09 Panagiotis Kanavos
1002 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1003 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1004 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Invalid type. Expected Integer but got String. Line 1, position 7.", validationEventArgs.Message);
1005 d78cbf09 Panagiotis Kanavos
1006 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1007 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Null, reader.TokenType);
1008 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Index 3 has not been defined and the schema does not allow additional items. Line 1, position 13.", validationEventArgs.Message);
1009 d78cbf09 Panagiotis Kanavos
1010 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1011 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndArray, reader.TokenType);
1012 d78cbf09 Panagiotis Kanavos
1013 d78cbf09 Panagiotis Kanavos
      Assert.IsFalse(reader.Read());
1014 d78cbf09 Panagiotis Kanavos
    }
1015 d78cbf09 Panagiotis Kanavos
1016 d78cbf09 Panagiotis Kanavos
    [Test]
1017 d78cbf09 Panagiotis Kanavos
    public void PatternPropertiesNoAdditionalProperties()
1018 d78cbf09 Panagiotis Kanavos
    {
1019 d78cbf09 Panagiotis Kanavos
      string schemaJson = @"{
1020 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
1021 d78cbf09 Panagiotis Kanavos
  ""patternProperties"": {
1022 d78cbf09 Panagiotis Kanavos
     ""hi"": {""type"":""string""},
1023 d78cbf09 Panagiotis Kanavos
     ""ho"": {""type"":""string""}
1024 d78cbf09 Panagiotis Kanavos
  },
1025 d78cbf09 Panagiotis Kanavos
  ""additionalProperties"": false
1026 d78cbf09 Panagiotis Kanavos
}";
1027 d78cbf09 Panagiotis Kanavos
1028 d78cbf09 Panagiotis Kanavos
      string json = @"{
1029 d78cbf09 Panagiotis Kanavos
  ""hi"": ""A string!"",
1030 d78cbf09 Panagiotis Kanavos
  ""hide"": ""A string!"",
1031 d78cbf09 Panagiotis Kanavos
  ""ho"": 1,
1032 d78cbf09 Panagiotis Kanavos
  ""hey"": ""A string!""
1033 d78cbf09 Panagiotis Kanavos
}";
1034 d78cbf09 Panagiotis Kanavos
1035 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
1036 d78cbf09 Panagiotis Kanavos
1037 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
1038 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; };
1039 d78cbf09 Panagiotis Kanavos
      reader.Schema = JsonSchema.Parse(schemaJson);
1040 d78cbf09 Panagiotis Kanavos
1041 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1042 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1043 d78cbf09 Panagiotis Kanavos
1044 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1045 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1046 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
1047 d78cbf09 Panagiotis Kanavos
1048 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1049 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1050 d78cbf09 Panagiotis Kanavos
1051 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1052 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1053 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
1054 d78cbf09 Panagiotis Kanavos
1055 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1056 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1057 d78cbf09 Panagiotis Kanavos
1058 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1059 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1060 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
1061 d78cbf09 Panagiotis Kanavos
1062 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1063 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.Integer, reader.TokenType);
1064 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Invalid type. Expected String but got Integer. Line 4, position 10.", validationEventArgs.Message);
1065 d78cbf09 Panagiotis Kanavos
1066 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1067 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1068 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("Property 'hey' has not been defined and the schema does not allow additional properties. Line 5, position 8.", validationEventArgs.Message);
1069 d78cbf09 Panagiotis Kanavos
1070 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1071 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1072 d78cbf09 Panagiotis Kanavos
1073 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1074 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1075 d78cbf09 Panagiotis Kanavos
1076 d78cbf09 Panagiotis Kanavos
      Assert.IsFalse(reader.Read());
1077 d78cbf09 Panagiotis Kanavos
    }
1078 d78cbf09 Panagiotis Kanavos
1079 d78cbf09 Panagiotis Kanavos
    [Test]
1080 d78cbf09 Panagiotis Kanavos
    public void ExtendedComplex()
1081 d78cbf09 Panagiotis Kanavos
    {
1082 d78cbf09 Panagiotis Kanavos
      string first = @"{
1083 d78cbf09 Panagiotis Kanavos
  ""id"":""first"",
1084 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
1085 d78cbf09 Panagiotis Kanavos
  ""properties"":
1086 d78cbf09 Panagiotis Kanavos
  {
1087 d78cbf09 Panagiotis Kanavos
    ""firstproperty"":{""type"":""string""},
1088 d78cbf09 Panagiotis Kanavos
    ""secondproperty"":{""type"":""string"",""maxLength"":10},
1089 d78cbf09 Panagiotis Kanavos
    ""thirdproperty"":{
1090 d78cbf09 Panagiotis Kanavos
      ""type"":""object"",
1091 d78cbf09 Panagiotis Kanavos
      ""properties"":
1092 d78cbf09 Panagiotis Kanavos
      {
1093 d78cbf09 Panagiotis Kanavos
        ""thirdproperty_firstproperty"":{""type"":""string"",""maxLength"":10,""minLength"":7}
1094 d78cbf09 Panagiotis Kanavos
      }
1095 d78cbf09 Panagiotis Kanavos
    }
1096 d78cbf09 Panagiotis Kanavos
  },
1097 d78cbf09 Panagiotis Kanavos
  ""additionalProperties"":{}
1098 d78cbf09 Panagiotis Kanavos
}";
1099 d78cbf09 Panagiotis Kanavos
1100 d78cbf09 Panagiotis Kanavos
      string second = @"{
1101 d78cbf09 Panagiotis Kanavos
  ""id"":""second"",
1102 d78cbf09 Panagiotis Kanavos
  ""type"":""object"",
1103 d78cbf09 Panagiotis Kanavos
  ""extends"":{""$ref"":""first""},
1104 d78cbf09 Panagiotis Kanavos
  ""properties"":
1105 d78cbf09 Panagiotis Kanavos
  {
1106 d78cbf09 Panagiotis Kanavos
    ""secondproperty"":{""type"":""any""},
1107 d78cbf09 Panagiotis Kanavos
    ""thirdproperty"":{
1108 d78cbf09 Panagiotis Kanavos
      ""extends"":{
1109 d78cbf09 Panagiotis Kanavos
        ""properties"":
1110 d78cbf09 Panagiotis Kanavos
        {
1111 d78cbf09 Panagiotis Kanavos
          ""thirdproperty_firstproperty"":{""maxLength"":9,""minLength"":6,""pattern"":""hi2u""}
1112 d78cbf09 Panagiotis Kanavos
        },
1113 d78cbf09 Panagiotis Kanavos
        ""additionalProperties"":{""maxLength"":9,""minLength"":6,""enum"":[""one"",""two""]}
1114 d78cbf09 Panagiotis Kanavos
      },
1115 d78cbf09 Panagiotis Kanavos
      ""type"":""object"",
1116 d78cbf09 Panagiotis Kanavos
      ""properties"":
1117 d78cbf09 Panagiotis Kanavos
      {
1118 d78cbf09 Panagiotis Kanavos
        ""thirdproperty_firstproperty"":{""pattern"":""hi""}
1119 d78cbf09 Panagiotis Kanavos
      },
1120 d78cbf09 Panagiotis Kanavos
      ""additionalProperties"":{""type"":""string"",""enum"":[""two"",""three""]}
1121 d78cbf09 Panagiotis Kanavos
    },
1122 d78cbf09 Panagiotis Kanavos
    ""fourthproperty"":{""type"":""string""}
1123 d78cbf09 Panagiotis Kanavos
  },
1124 d78cbf09 Panagiotis Kanavos
  ""additionalProperties"":false
1125 d78cbf09 Panagiotis Kanavos
}";
1126 d78cbf09 Panagiotis Kanavos
1127 d78cbf09 Panagiotis Kanavos
      JsonSchemaResolver resolver = new JsonSchemaResolver();
1128 d78cbf09 Panagiotis Kanavos
      JsonSchema firstSchema = JsonSchema.Parse(first, resolver);
1129 d78cbf09 Panagiotis Kanavos
      JsonSchema secondSchema = JsonSchema.Parse(second, resolver);
1130 d78cbf09 Panagiotis Kanavos
1131 d78cbf09 Panagiotis Kanavos
      JsonSchemaModelBuilder modelBuilder = new JsonSchemaModelBuilder();
1132 d78cbf09 Panagiotis Kanavos
1133 d78cbf09 Panagiotis Kanavos
      string json = @"{
1134 d78cbf09 Panagiotis Kanavos
  'firstproperty':'blahblahblahblahblahblah',
1135 d78cbf09 Panagiotis Kanavos
  'secondproperty':'secasecasecasecaseca',
1136 d78cbf09 Panagiotis Kanavos
  'thirdproperty':{
1137 d78cbf09 Panagiotis Kanavos
    'thirdproperty_firstproperty':'aaa',
1138 d78cbf09 Panagiotis Kanavos
    'additional':'three'
1139 d78cbf09 Panagiotis Kanavos
  }
1140 d78cbf09 Panagiotis Kanavos
}";
1141 d78cbf09 Panagiotis Kanavos
1142 d78cbf09 Panagiotis Kanavos
      Json.Schema.ValidationEventArgs validationEventArgs = null;
1143 d78cbf09 Panagiotis Kanavos
      List<string> errors = new List<string>();
1144 d78cbf09 Panagiotis Kanavos
1145 d78cbf09 Panagiotis Kanavos
      JsonValidatingReader reader = new JsonValidatingReader(new JsonTextReader(new StringReader(json)));
1146 d78cbf09 Panagiotis Kanavos
      reader.ValidationEventHandler += (sender, args) => { validationEventArgs = args; errors.Add(validationEventArgs.Message); };
1147 d78cbf09 Panagiotis Kanavos
      reader.Schema = secondSchema;
1148 d78cbf09 Panagiotis Kanavos
1149 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1150 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1151 d78cbf09 Panagiotis Kanavos
1152 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1153 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1154 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("firstproperty", reader.Value.ToString());
1155 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(null, validationEventArgs);
1156 d78cbf09 Panagiotis Kanavos
1157 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1158 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1159 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("blahblahblahblahblahblah", reader.Value.ToString());
1160 d78cbf09 Panagiotis Kanavos
1161 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1162 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1163 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("secondproperty", reader.Value.ToString());
1164 d78cbf09 Panagiotis Kanavos
1165 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1166 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1167 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("secasecasecasecaseca", reader.Value.ToString());
1168 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(1, errors.Count);
1169 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("String 'secasecasecasecaseca' exceeds maximum length of 10. Line 3, position 41.", errors[0]);
1170 d78cbf09 Panagiotis Kanavos
1171 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1172 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1173 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("thirdproperty", reader.Value.ToString());
1174 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(1, errors.Count);
1175 d78cbf09 Panagiotis Kanavos
1176 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1177 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.StartObject, reader.TokenType);
1178 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(1, errors.Count);
1179 d78cbf09 Panagiotis Kanavos
1180 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1181 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1182 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("thirdproperty_firstproperty", reader.Value.ToString());
1183 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(1, errors.Count);
1184 d78cbf09 Panagiotis Kanavos
1185 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1186 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1187 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("aaa", reader.Value.ToString());
1188 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(4, errors.Count);
1189 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("String 'aaa' is less than minimum length of 7. Line 5, position 39.", errors[1]);
1190 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("String 'aaa' does not match regex pattern 'hi'. Line 5, position 39.", errors[2]);
1191 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("String 'aaa' does not match regex pattern 'hi2u'. Line 5, position 39.", errors[3]);
1192 d78cbf09 Panagiotis Kanavos
1193 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1194 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.PropertyName, reader.TokenType);
1195 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("additional", reader.Value.ToString());
1196 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(4, errors.Count);
1197 d78cbf09 Panagiotis Kanavos
1198 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1199 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.String, reader.TokenType);
1200 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("three", reader.Value.ToString());
1201 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(5, errors.Count);
1202 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual("String 'three' is less than minimum length of 6. Line 6, position 24.", errors[4]);
1203 d78cbf09 Panagiotis Kanavos
      
1204 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1205 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1206 d78cbf09 Panagiotis Kanavos
1207 d78cbf09 Panagiotis Kanavos
      Assert.IsTrue(reader.Read());
1208 d78cbf09 Panagiotis Kanavos
      Assert.AreEqual(JsonToken.EndObject, reader.TokenType);
1209 d78cbf09 Panagiotis Kanavos
1210 d78cbf09 Panagiotis Kanavos
      Assert.IsFalse(reader.Read());
1211 d78cbf09 Panagiotis Kanavos
    }
1212 d78cbf09 Panagiotis Kanavos
  }
1213 d78cbf09 Panagiotis Kanavos
}