Json.NET
Code Coverage Statistics for Source File

Newtonsoft.Json.Tests\Converters\CustomCreationConverterTests.cs

Symbol Coverage: 74.36% (29 of 39)

Branch Coverage: 77.78% (7 of 9)

Cyclomatic Complexity Avg: 1.00 Max:1

Code Lines: 83


L V Source
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using Newtonsoft.Json.Converters;
6
using NUnit.Framework;
7

  
8
namespace Newtonsoft.Json.Tests.Converters
9
{
10
  public class CustomCreationConverterTests : TestFixtureBase
11
  {
12
    public interface IPerson
13
    {
14
      string FirstName { get; set; }
15
      string LastName { get; set; }
16
      DateTime BirthDate { get; set; }
17
    }
18

  
19
    public class Employee : IPerson
20
    {
21
      public string FirstName { get; set; }
22
      public string LastName { get; set; }
23
      public DateTime BirthDate { get; set; }
24

  
25
      public string Department { get; set; }
26
      public string JobTitle { get; set; }
27
    }
28

  
29
    public class PersonConverter : CustomCreationConverter<IPerson>
30
    {
31
      public override IPerson Create(Type objectType)
32
      {
33
 0
        return new Employee();
34
 0
      }
35
    }
36

  
37
    public void DeserializeObject()
38
    {
39
 0
      string json = JsonConvert.SerializeObject(new List<Employee>
40
 0
        {
41
 0
          new Employee
42
 0
            {
43
 0
              BirthDate = new DateTime(1977, 12, 30, 1, 1, 1, DateTimeKind.Utc),
44
 0
              FirstName = "Maurice",
45
 0
              LastName = "Moss",
46
 0
              Department = "IT",
47
 0
              JobTitle = "Support"
48
 0
            },
49
 0
          new Employee
50
 0
            {
51
 0
              BirthDate = new DateTime(1978, 3, 15, 1, 1, 1, DateTimeKind.Utc),
52
 0
              FirstName = "Jen",
53
 0
              LastName = "Barber",
54
 0
              Department = "IT",
55
 0
              JobTitle = "Manager"
56
 0
            }
57
 0
        }, Formatting.Indented);
58

  
59
      //[
60
      //  {
61
      //    "FirstName": "Maurice",
62
      //    "LastName": "Moss",
63
      //    "BirthDate": "\/Date(252291661000)\/",
64
      //    "Department": "IT",
65
      //    "JobTitle": "Support"
66
      //  },
67
      //  {
68
      //    "FirstName": "Jen",
69
      //    "LastName": "Barber",
70
      //    "BirthDate": "\/Date(258771661000)\/",
71
      //    "Department": "IT",
72
      //    "JobTitle": "Manager"
73
      //  }
74
      //]
75

  
76
 0
      List<IPerson> people = JsonConvert.DeserializeObject<List<IPerson>>(json, new PersonConverter());
77

  
78
 0
      IPerson person = people[0];
79

  
80
 0
      Console.WriteLine(person.GetType());
81
      // Newtonsoft.Json.Tests.Employee
82

  
83
 0
      Console.WriteLine(person.FirstName);
84
      // Maurice
85

  
86
 0
      Employee employee = (Employee)person;
87

  
88
 0
      Console.WriteLine(employee.JobTitle);
89
      // Support
90
 0
    }
91

  
92
    public class MyClass
93
    {
94
      public string Value { get; set; }
95

  
96
      [JsonConverter(typeof(MyThingConverter))]
97
      public IThing Thing { get; set; }
98
    }
99

  
100
    public interface IThing
101
    {
102
      int Number { get; }
103
    }
104

  
105
    public class MyThing : IThing
106
    {
107
      public int Number { get; set; }
108
    }
109

  
110
    public class MyThingConverter : CustomCreationConverter<IThing>
111
    {
112
      public override IThing Create(Type objectType)
113
      {
114
 1
        return new MyThing();
115
 1
      }
116
    }
117

  
118
    [Test]
119
    public void AssertDoesDeserialize()
120
    {
121
      const string json = @"{
122
""Value"": ""A value"",
123
""Thing"": {
124
""Number"": 123
125
}
126
}
127
";
128
 1
      MyClass myClass = JsonConvert.DeserializeObject<MyClass>(json);
129
 1
      Assert.IsNotNull(myClass);
130
 1
      Assert.AreEqual("A value", myClass.Value);
131
 1
      Assert.IsNotNull(myClass.Thing);
132
 1
      Assert.AreEqual(123, myClass.Thing.Number);
133
 1
    }
134

  
135
    [Test]
136
    public void AssertShouldSerializeTest()
137
    {
138
 1
      MyClass myClass = new MyClass
139
 1
      {
140
 1
        Value = "Foo",
141
 1
        Thing = new MyThing { Number = 456, }
142
 1
      };
143
 1
      string json = JsonConvert.SerializeObject(myClass); // <-- Exception here
144

  
145
      const string expected = @"{""Value"":""Foo"",""Thing"":{""Number"":456}}";
146
 1
      Assert.AreEqual(expected, json);
147
 1
    }
148

  
149
    internal interface IRange<T>
150
    {
151
      T First { get; }
152
      T Last { get; }
153
    }
154

  
155
    internal class Range<T> : IRange<T>
156
    {
157
      public T First { get; set; }
158
      public T Last { get; set; }
159
    }
160

  
161
    internal class NullInterfaceTestClass
162
    {
163
      public virtual Guid Id { get; set; }
164
      public virtual int? Year { get; set; }
165
      public virtual string Company { get; set; }
166
      public virtual IRange<decimal> DecimalRange { get; set; }
167
      public virtual IRange<int> IntRange { get; set; }
168
      public virtual IRange<decimal> NullDecimalRange { get; set; }
169
    }
170

  
171
    internal class DecimalRangeConverter : CustomCreationConverter<IRange<decimal>>
172
    {
173
      public override IRange<decimal> Create(Type objectType)
174
      {
175
 1
        return new Range<decimal>();
176
 1
      }
177
    }
178

  
179
    internal class IntRangeConverter : CustomCreationConverter<IRange<int>>
180
    {
181
      public override IRange<int> Create(Type objectType)
182
      {
183
 1
        return new Range<int>();
184
 1
      }
185
    }
186

  
187
    [Test]
188
    public void DeserializeAndConvertNullValue()
189
    {
190
 1
      NullInterfaceTestClass initial = new NullInterfaceTestClass
191
 1
      {
192
 1
        Company = "Company!",
193
 1
        DecimalRange = new Range<decimal> { First = 0, Last = 1 },
194
 1
        Id = new Guid(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11),
195
 1
        IntRange = new Range<int> { First = int.MinValue, Last = int.MaxValue },
196
 1
        Year = 2010,
197
 1
        NullDecimalRange = null
198
 1
      };
199

  
200
 1
      string json = JsonConvert.SerializeObject(initial, Formatting.Indented);
201

  
202
 1
      Assert.AreEqual(@"{
203
 1
  ""Id"": ""00000001-0002-0003-0405-060708090a0b"",
204
 1
  ""Year"": 2010,
205
 1
  ""Company"": ""Company!"",
206
 1
  ""DecimalRange"": {
207
 1
    ""First"": 0.0,
208
 1
    ""Last"": 1.0
209
 1
  },
210
 1
  ""IntRange"": {
211
 1
    ""First"": -2147483648,
212
 1
    ""Last"": 2147483647
213
 1
  },
214
 1
  ""NullDecimalRange"": null
215
 1
}", json);
216

  
217
 1
      NullInterfaceTestClass deserialized = JsonConvert.DeserializeObject<NullInterfaceTestClass>(
218
 1
        json, new IntRangeConverter(), new DecimalRangeConverter());
219

  
220
 1
      Assert.AreEqual("Company!", deserialized.Company);
221
 1
      Assert.AreEqual(new Guid(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11), deserialized.Id);
222
 1
      Assert.AreEqual(0, deserialized.DecimalRange.First);
223
 1
      Assert.AreEqual(1, deserialized.DecimalRange.Last);
224
 1
      Assert.AreEqual(int.MinValue, deserialized.IntRange.First);
225
 1
      Assert.AreEqual(int.MaxValue, deserialized.IntRange.Last);
226
 1
      Assert.AreEqual(null, deserialized.NullDecimalRange);
227
 1
      Assert.AreEqual(2010, deserialized.Year);
228
 1
    }
229
  }
230
}