Json.NET
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


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
}