Code Coverage Statistics for Source File
Newtonsoft.Json.Tests\Schema\ExtensionsTests.cs
Symbol Coverage: 94.94% (75 of 79)
Branch Coverage: 83.33% (10 of 12)
Cyclomatic Complexity Avg: 1.07 Max:2
Code Lines: 93
Symbol Coverage Trend
View:
L | V | Source |
---|---|---|
1 |
#region License |
|
2 |
// Copyright (c) 2007 James Newton-King |
|
3 |
// |
|
4 |
// Permission is hereby granted, free of charge, to any person |
|
5 |
// obtaining a copy of this software and associated documentation |
|
6 |
// files (the "Software"), to deal in the Software without |
|
7 |
// restriction, including without limitation the rights to use, |
|
8 |
// copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
9 |
// copies of the Software, and to permit persons to whom the |
|
10 |
// Software is furnished to do so, subject to the following |
|
11 |
// conditions: |
|
12 |
// |
|
13 |
// The above copyright notice and this permission notice shall be |
|
14 |
// included in all copies or substantial portions of the Software. |
|
15 |
// |
|
16 |
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
|
17 |
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES |
|
18 |
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
|
19 |
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
|
20 |
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
|
21 |
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
|
22 |
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
|
23 |
// OTHER DEALINGS IN THE SOFTWARE. |
|
24 |
#endregion |
|
25 |
||
26 |
using System; |
|
27 |
using System.Collections.Generic; |
|
28 |
using System.Linq; |
|
29 |
using System.Text; |
|
30 |
using NUnit.Framework; |
|
31 |
using Newtonsoft.Json.Schema; |
|
32 |
using Newtonsoft.Json.Linq; |
|
33 |
using System.IO; |
|
34 |
using Newtonsoft.Json.Tests.TestObjects; |
|
35 |
#if !SILVERLIGHT |
|
36 |
using System.Data; |
|
37 |
#endif |
|
38 |
||
39 |
namespace Newtonsoft.Json.Tests.Schema |
|
40 |
{ |
|
41 |
public class ExtensionsTests : TestFixtureBase |
|
42 |
{ |
|
43 |
[Test] |
|
44 |
public void IsValid() |
|
45 |
{ |
|
46 |
1 |
JsonSchema schema = JsonSchema.Parse("{'type':'integer'}");
|
47 |
1 |
JToken stringToken = JToken.FromObject("pie");
|
48 |
1 |
JToken integerToken = JToken.FromObject(1);
|
49 |
||
50 |
1 |
Assert.AreEqual(false, stringToken.IsValid(schema));
|
51 |
1 |
Assert.AreEqual(true, integerToken.IsValid(schema));
|
52 |
1 |
}
|
53 |
||
54 |
[Test] |
|
55 |
public void ValidateWithEventHandler() |
|
56 |
{ |
|
57 |
1 |
JsonSchema schema = JsonSchema.Parse("{'pattern':'lol'}");
|
58 |
1 |
JToken stringToken = JToken.FromObject("pie lol");
|
59 |
||
60 |
1 |
List<string> errors = new List<string>();
|
61 |
0 |
stringToken.Validate(schema, (sender, args) => errors.Add(args.Message)); |
62 |
1 |
Assert.AreEqual(0, errors.Count);
|
63 |
||
64 |
1 |
stringToken = JToken.FromObject("pie");
|
65 |
||
66 |
1 |
stringToken.Validate(schema, (sender, args) => errors.Add(args.Message));
|
67 |
1 |
Assert.AreEqual(1, errors.Count);
|
68 |
||
69 |
1 |
Assert.AreEqual("String 'pie' does not match regex pattern 'lol'.", errors[0]);
|
70 |
1 |
}
|
71 |
||
72 |
[Test] |
|
73 |
[ExpectedException(typeof(JsonSchemaException), ExpectedMessage = @"String 'pie' does not match regex pattern 'lol'.")] |
|
74 |
public void ValidateWithOutEventHandlerFailure() |
|
75 |
{ |
|
76 |
1 |
JsonSchema schema = JsonSchema.Parse("{'pattern':'lol'}");
|
77 |
1 |
JToken stringToken = JToken.FromObject("pie");
|
78 |
1 |
stringToken.Validate(schema);
|
79 |
0 |
}
|
80 |
||
81 |
[Test] |
|
82 |
public void ValidateWithOutEventHandlerSuccess() |
|
83 |
{ |
|
84 |
1 |
JsonSchema schema = JsonSchema.Parse("{'pattern':'lol'}");
|
85 |
1 |
JToken stringToken = JToken.FromObject("pie lol");
|
86 |
1 |
stringToken.Validate(schema);
|
87 |
1 |
}
|
88 |
||
89 |
[Test] |
|
90 |
public void ValidateFailureWithOutLineInfoBecauseOfEndToken() |
|
91 |
{ |
|
92 |
1 |
JsonSchema schema = JsonSchema.Parse("{'properties':{'lol':{}}}");
|
93 |
1 |
JObject o = JObject.Parse("{}");
|
94 |
||
95 |
1 |
List<string> errors = new List<string>();
|
96 |
1 |
o.Validate(schema, (sender, args) => errors.Add(args.Message));
|
97 |
||
98 |
1 |
Assert.AreEqual("Non-optional properties are missing from object: lol.", errors[0]);
|
99 |
1 |
Assert.AreEqual(1, errors.Count);
|
100 |
1 |
}
|
101 |
||
102 |
[Test] |
|
103 |
public void ValidateFailureWithLineInfo() |
|
104 |
{ |
|
105 |
1 |
JsonSchema schema = JsonSchema.Parse("{'properties':{'lol':{'type':'string'}}}");
|
106 |
1 |
JObject o = JObject.Parse("{'lol':1}");
|
107 |
||
108 |
1 |
List<string> errors = new List<string>();
|
109 |
1 |
o.Validate(schema, (sender, args) => errors.Add(args.Message));
|
110 |
||
111 |
1 |
Assert.AreEqual("Invalid type. Expected String but got Integer. Line 1, position 9.", errors[0]);
|
112 |
1 |
Assert.AreEqual(1, errors.Count);
|
113 |
1 |
}
|
114 |
||
115 |
[Test] |
|
116 |
public void Blog() |
|
117 |
{ |
|
118 |
1 |
string schemaJson = @" |
119 |
1 |
{
|
120 |
1 |
""description"": ""A person schema"",
|
121 |
1 |
""type"": ""object"",
|
122 |
1 |
""properties"":
|
123 |
1 |
{
|
124 |
1 |
""name"": {""type"":""string""},
|
125 |
1 |
""hobbies"": {
|
126 |
1 |
""type"": ""array"",
|
127 |
1 |
""items"": {""type"":""string""}
|
128 |
1 |
}
|
129 |
1 |
}
|
130 |
1 |
}
|
131 |
1 |
";
|
132 |
||
133 |
//JsonSchema schema; |
|
134 |
||
135 |
//using (JsonTextReader reader = new JsonTextReader(new StringReader(schemaJson))) |
|
136 |
//{ |
|
137 |
// JsonSchemaBuilder builder = new JsonSchemaBuilder(new JsonSchemaResolver()); |
|
138 |
// schema = builder.Parse(reader); |
|
139 |
//} |
|
140 |
||
141 |
1 |
JsonSchema schema = JsonSchema.Parse(schemaJson);
|
142 |
||
143 |
1 |
JObject person = JObject.Parse(@"{
|
144 |
1 |
""name"": ""James"",
|
145 |
1 |
""hobbies"": ["".NET"", ""Blogging"", ""Reading"", ""Xbox"", ""LOLCATS""]
|
146 |
1 |
}");
|
147 |
||
148 |
1 |
bool valid = person.IsValid(schema);
|
149 |
// true |
|
150 |
1 |
}
|
151 |
||
152 |
private void GenerateSchemaAndSerializeFromType<T>(T value) |
|
153 |
{ |
|
154 |
19 |
JsonSchemaGenerator generator = new JsonSchemaGenerator();
|
155 |
19 |
generator.UndefinedSchemaIdHandling = UndefinedSchemaIdHandling.UseAssemblyQualifiedName;
|
156 |
19 |
JsonSchema typeSchema = generator.Generate(typeof (T));
|
157 |
19 |
string schema = typeSchema.ToString();
|
158 |
||
159 |
19 |
string json = JsonConvert.SerializeObject(value, Formatting.Indented);
|
160 |
19 |
JToken token = JToken.ReadFrom(new JsonTextReader(new StringReader(json)));
|
161 |
||
162 |
19 |
List<string> errors = new List<string>();
|
163 |
||
164 |
19 |
token.Validate(typeSchema, (sender, args) =>
|
165 |
19 |
{
|
166 |
0 |
errors.Add(args.Message);
|
167 |
19 |
});
|
168 |
||
169 |
19 |
if (errors.Count > 0)
|
170 |
0 |
Assert.Fail("Schema generated for type '{0}' is not valid." + Environment.NewLine + string.Join(Environment.NewLine, errors.ToArray()), typeof(T));
|
171 |
19 |
}
|
172 |
||
173 |
[Test] |
|
174 |
public void GenerateSchemaAndSerializeFromTypeTests() |
|
175 |
{ |
|
176 |
1 |
GenerateSchemaAndSerializeFromType(new List<string> { "1", "Two", "III" });
|
177 |
1 |
GenerateSchemaAndSerializeFromType(new List<int> { 1 });
|
178 |
1 |
GenerateSchemaAndSerializeFromType(new Version("1.2.3.4"));
|
179 |
1 |
GenerateSchemaAndSerializeFromType(new Store());
|
180 |
1 |
GenerateSchemaAndSerializeFromType(new Person());
|
181 |
1 |
GenerateSchemaAndSerializeFromType(new PersonRaw());
|
182 |
1 |
GenerateSchemaAndSerializeFromType(new CircularReferenceClass() { Name = "I'm required" });
|
183 |
1 |
GenerateSchemaAndSerializeFromType(new CircularReferenceWithIdClass());
|
184 |
1 |
GenerateSchemaAndSerializeFromType(new ClassWithArray());
|
185 |
1 |
GenerateSchemaAndSerializeFromType(new ClassWithGuid());
|
186 |
#if !NET20 && !PocketPC |
|
187 |
1 |
GenerateSchemaAndSerializeFromType(new NullableDateTimeTestClass());
|
188 |
#endif |
|
189 |
#if !SILVERLIGHT |
|
190 |
1 |
GenerateSchemaAndSerializeFromType(new DataSet());
|
191 |
#endif |
|
192 |
1 |
GenerateSchemaAndSerializeFromType(new object());
|
193 |
1 |
GenerateSchemaAndSerializeFromType(1);
|
194 |
1 |
GenerateSchemaAndSerializeFromType("Hi");
|
195 |
1 |
GenerateSchemaAndSerializeFromType(new DateTime(2000, 12, 29, 23, 59, 0, DateTimeKind.Utc));
|
196 |
1 |
GenerateSchemaAndSerializeFromType(TimeSpan.FromTicks(1000000));
|
197 |
1 |
GenerateSchemaAndSerializeFromType(DBNull.Value);
|
198 |
1 |
GenerateSchemaAndSerializeFromType(new JsonPropertyWithHandlingValues());
|
199 |
1 |
}
|
200 |
} |
|
201 |
} |