Statistics
| Branch: | Revision:

root / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json.Tests / Converters / CustomCreationConverterTests.cs @ d78cbf09

History | View | Annotate | Download (6 kB)

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
        return new Employee();
34
      }
35
    }
36

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

    
78
      IPerson person = people[0];
79

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

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

    
86
      Employee employee = (Employee)person;
87

    
88
      Console.WriteLine(employee.JobTitle);
89
      // Support
90
    }
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
        return new MyThing();
115
      }
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
      MyClass myClass = JsonConvert.DeserializeObject<MyClass>(json);
129
      Assert.IsNotNull(myClass);
130
      Assert.AreEqual("A value", myClass.Value);
131
      Assert.IsNotNull(myClass.Thing);
132
      Assert.AreEqual(123, myClass.Thing.Number);
133
    }
134

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

    
145
      const string expected = @"{""Value"":""Foo"",""Thing"":{""Number"":456}}";
146
      Assert.AreEqual(expected, json);
147
    }
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
        return new Range<decimal>();
176
      }
177
    }
178

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

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

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

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

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

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