Json.NET
Code Coverage Statistics for Source File

Newtonsoft.Json.Tests\Converters\IsoDateTimeConverterTests.cs

Symbol Coverage: 99.20% (124 of 125)

Branch Coverage: 93.75% (15 of 16)

Cyclomatic Complexity Avg: 1.00 Max:1

Code Lines: 145


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 Newtonsoft.Json.Tests.TestObjects;
31
using NUnit.Framework;
32
using Newtonsoft.Json.Converters;
33
using Newtonsoft.Json.Utilities;
34
using System.Globalization;
35
using System.Xml;
36

  
37
namespace Newtonsoft.Json.Tests.Converters
38
{
39
  public class IsoDateTimeConverterTests : TestFixtureBase
40
  {
41
    [Test]
42
    public void PropertiesShouldBeSet()
43
    {
44
 1
      IsoDateTimeConverter converter = new IsoDateTimeConverter();
45
 1
      Assert.AreEqual(CultureInfo.CurrentCulture, converter.Culture);
46
 1
      Assert.AreEqual(string.Empty, converter.DateTimeFormat);
47
 1
      Assert.AreEqual(DateTimeStyles.RoundtripKind, converter.DateTimeStyles);
48

  
49
 1
      converter = new IsoDateTimeConverter()
50
 1
      {
51
 1
        DateTimeFormat = "F",
52
 1
        Culture = CultureInfo.InvariantCulture,
53
 1
        DateTimeStyles = DateTimeStyles.None
54
 1
      };
55

  
56
 1
      Assert.AreEqual(CultureInfo.InvariantCulture, converter.Culture);
57
 1
      Assert.AreEqual("F", converter.DateTimeFormat);
58
 1
      Assert.AreEqual(DateTimeStyles.None, converter.DateTimeStyles);
59
 1
    }
60

  
61
    [Test]
62
    public void SerializeDateTime()
63
    {
64
 1
      IsoDateTimeConverter converter = new IsoDateTimeConverter();
65

  
66
 1
      DateTime d = new DateTime(2000, 12, 15, 22, 11, 3, 55, DateTimeKind.Utc);
67
      string result;
68

  
69
 1
      result = JsonConvert.SerializeObject(d, converter);
70
 1
      Assert.AreEqual(@"""2000-12-15T22:11:03.055Z""", result);
71

  
72
 1
      Assert.AreEqual(d, JsonConvert.DeserializeObject<DateTime>(result, converter));
73

  
74
 1
      d = new DateTime(2000, 12, 15, 22, 11, 3, 55, DateTimeKind.Local);
75
 1
      result = JsonConvert.SerializeObject(d, converter);
76
 1
      Assert.AreEqual(@"""2000-12-15T22:11:03.055" + d.GetLocalOffset() + @"""", result);
77
 1
    }
78

  
79
    [Test]
80
    public void SerializeFormattedDateTimeInvariantCulture()
81
    {
82
 1
      IsoDateTimeConverter converter = new IsoDateTimeConverter() { DateTimeFormat = "F", Culture = CultureInfo.InvariantCulture };
83

  
84
 1
      DateTime d = new DateTime(2000, 12, 15, 22, 11, 3, 0, DateTimeKind.Utc);
85
      string result;
86

  
87
 1
      result = JsonConvert.SerializeObject(d, converter);
88
 1
      Assert.AreEqual(@"""Friday, 15 December 2000 22:11:03""", result);
89

  
90
 1
      Assert.AreEqual(d, JsonConvert.DeserializeObject<DateTime>(result, converter));
91

  
92
 1
      d = new DateTime(2000, 12, 15, 22, 11, 3, 0, DateTimeKind.Local);
93
 1
      result = JsonConvert.SerializeObject(d, converter);
94
 1
      Assert.AreEqual(@"""Friday, 15 December 2000 22:11:03""", result);
95
 1
    }
96

  
97
    [Test]
98
    public void SerializeCustomFormattedDateTime()
99
    {
100
 1
      IsoDateTimeConverter converter = new IsoDateTimeConverter
101
 1
                                         {
102
 1
                                           DateTimeFormat = "dd/MM/yyyy",
103
 1
                                           Culture = CultureInfo.InvariantCulture
104
 1
                                         };
105

  
106
 1
      string json = @"""09/12/2006""";
107

  
108
 1
      DateTime d = JsonConvert.DeserializeObject<DateTime>(json, converter);
109

  
110
 1
      Assert.AreEqual(9, d.Day);
111
 1
      Assert.AreEqual(12, d.Month);
112
 1
      Assert.AreEqual(2006, d.Year);
113
 1
    }
114

  
115
#if !SILVERLIGHT
116
    [Test]
117
    public void SerializeFormattedDateTimeNewZealandCulture()
118
    {
119
 1
      IsoDateTimeConverter converter = new IsoDateTimeConverter() { DateTimeFormat = "F", Culture = CultureInfo.GetCultureInfo("en-NZ") };
120

  
121
 1
      DateTime d = new DateTime(2000, 12, 15, 22, 11, 3, 0, DateTimeKind.Utc);
122
      string result;
123

  
124
 1
      result = JsonConvert.SerializeObject(d, converter);
125
 1
      Assert.AreEqual(@"""Friday, 15 December 2000 10:11:03 p.m.""", result);
126

  
127
 1
      Assert.AreEqual(d, JsonConvert.DeserializeObject<DateTime>(result, converter));
128

  
129
 1
      d = new DateTime(2000, 12, 15, 22, 11, 3, 0, DateTimeKind.Local);
130
 1
      result = JsonConvert.SerializeObject(d, converter);
131
 1
      Assert.AreEqual(@"""Friday, 15 December 2000 10:11:03 p.m.""", result);
132
 1
    }
133

  
134
    [Test]
135
    public void SerializeDateTimeCulture()
136
    {
137
 1
      IsoDateTimeConverter converter = new IsoDateTimeConverter() { Culture = CultureInfo.GetCultureInfo("en-NZ") };
138

  
139
 1
      string json = @"""09/12/2006""";
140

  
141
 1
      DateTime d = JsonConvert.DeserializeObject<DateTime>(json, converter);
142

  
143
 1
      Assert.AreEqual(9, d.Day);
144
 1
      Assert.AreEqual(12, d.Month);
145
 1
      Assert.AreEqual(2006, d.Year);
146
 1
    }
147
#endif
148

  
149
#if !PocketPC && !NET20
150
    [Test]
151
    public void SerializeDateTimeOffset()
152
    {
153
 1
      IsoDateTimeConverter converter = new IsoDateTimeConverter();
154

  
155
 1
      DateTimeOffset d = new DateTimeOffset(2000, 12, 15, 22, 11, 3, 55, TimeSpan.Zero);
156
      string result;
157

  
158
 1
      result = JsonConvert.SerializeObject(d, converter);
159
 1
      Assert.AreEqual(@"""2000-12-15T22:11:03.055+00:00""", result);
160

  
161
 1
      Assert.AreEqual(d, JsonConvert.DeserializeObject<DateTimeOffset>(result, converter));
162
 1
    }
163

  
164
    [Test]
165
    public void SerializeUTC()
166
    {
167
 1
      DateTimeTestClass c = new DateTimeTestClass();
168
 1
      c.DateTimeField = new DateTime(2008, 12, 12, 12, 12, 12, 0, DateTimeKind.Utc).ToLocalTime();
169
 1
      c.DateTimeOffsetField = new DateTime(2008, 12, 12, 12, 12, 12, 0, DateTimeKind.Utc).ToLocalTime();
170
 1
      c.PreField = "Pre";
171
 1
      c.PostField = "Post";
172
 1
      string json = JsonConvert.SerializeObject(c, new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
173
 1
      Assert.AreEqual(@"{""PreField"":""Pre"",""DateTimeField"":""2008-12-12T12:12:12Z"",""DateTimeOffsetField"":""2008-12-12T12:12:12+00:00"",""PostField"":""Post""}", json);
174

  
175
      //test the other edge case too
176
 1
      c.DateTimeField = new DateTime(2008, 1, 1, 1, 1, 1, 0, DateTimeKind.Utc).ToLocalTime();
177
 1
      c.DateTimeOffsetField = new DateTime(2008, 1, 1, 1, 1, 1, 0, DateTimeKind.Utc).ToLocalTime();
178
 1
      c.PreField = "Pre";
179
 1
      c.PostField = "Post";
180
 1
      json = JsonConvert.SerializeObject(c, new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
181
 1
      Assert.AreEqual(@"{""PreField"":""Pre"",""DateTimeField"":""2008-01-01T01:01:01Z"",""DateTimeOffsetField"":""2008-01-01T01:01:01+00:00"",""PostField"":""Post""}", json);
182
 1
    }
183

  
184
    [Test]
185
    public void NullableSerializeUTC()
186
    {
187
 1
      NullableDateTimeTestClass c = new NullableDateTimeTestClass();
188
 1
      c.DateTimeField = new DateTime(2008, 12, 12, 12, 12, 12, 0, DateTimeKind.Utc).ToLocalTime();
189
 1
      c.DateTimeOffsetField = new DateTime(2008, 12, 12, 12, 12, 12, 0, DateTimeKind.Utc).ToLocalTime();
190
 1
      c.PreField = "Pre";
191
 1
      c.PostField = "Post";
192
 1
      string json = JsonConvert.SerializeObject(c, new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
193
 1
      Assert.AreEqual(@"{""PreField"":""Pre"",""DateTimeField"":""2008-12-12T12:12:12Z"",""DateTimeOffsetField"":""2008-12-12T12:12:12+00:00"",""PostField"":""Post""}", json);
194

  
195
      //test the other edge case too
196
 1
      c.DateTimeField = null;
197
 1
      c.DateTimeOffsetField = null;
198
 1
      c.PreField = "Pre";
199
 1
      c.PostField = "Post";
200
 1
      json = JsonConvert.SerializeObject(c, new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
201
 1
      Assert.AreEqual(@"{""PreField"":""Pre"",""DateTimeField"":null,""DateTimeOffsetField"":null,""PostField"":""Post""}", json);
202
 1
    }
203

  
204
    [Test]
205
    public void DeserializeUTC()
206
    {
207
 1
      DateTimeTestClass c =
208
 1
        JsonConvert.DeserializeObject<DateTimeTestClass>(@"{""PreField"":""Pre"",""DateTimeField"":""2008-12-12T12:12:12Z"",""DateTimeOffsetField"":""2008-12-12T12:12:12Z"",""PostField"":""Post""}", new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
209

  
210
 1
      Assert.AreEqual(new DateTime(2008, 12, 12, 12, 12, 12, 0, DateTimeKind.Utc).ToLocalTime(), c.DateTimeField);
211
 1
      Assert.AreEqual(new DateTimeOffset(2008, 12, 12, 12, 12, 12, 0, TimeSpan.Zero), c.DateTimeOffsetField);
212
 1
      Assert.AreEqual("Pre", c.PreField);
213
 1
      Assert.AreEqual("Post", c.PostField);
214

  
215
 1
      DateTimeTestClass c2 =
216
 1
       JsonConvert.DeserializeObject<DateTimeTestClass>(@"{""PreField"":""Pre"",""DateTimeField"":""2008-01-01T01:01:01Z"",""DateTimeOffsetField"":""2008-01-01T01:01:01Z"",""PostField"":""Post""}", new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
217

  
218
 1
      Assert.AreEqual(new DateTime(2008, 1, 1, 1, 1, 1, 0, DateTimeKind.Utc).ToLocalTime(), c2.DateTimeField);
219
 1
      Assert.AreEqual(new DateTimeOffset(2008, 1, 1, 1, 1, 1, 0, TimeSpan.Zero), c2.DateTimeOffsetField);
220
 1
      Assert.AreEqual("Pre", c2.PreField);
221
 1
      Assert.AreEqual("Post", c2.PostField);
222
 1
    }
223

  
224
    [Test]
225
    public void NullableDeserializeUTC()
226
    {
227
 1
      NullableDateTimeTestClass c =
228
 1
        JsonConvert.DeserializeObject<NullableDateTimeTestClass>(@"{""PreField"":""Pre"",""DateTimeField"":""2008-12-12T12:12:12Z"",""DateTimeOffsetField"":""2008-12-12T12:12:12Z"",""PostField"":""Post""}", new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
229

  
230
 1
      Assert.AreEqual(new DateTime(2008, 12, 12, 12, 12, 12, 0, DateTimeKind.Utc).ToLocalTime(), c.DateTimeField);
231
 1
      Assert.AreEqual(new DateTimeOffset(2008, 12, 12, 12, 12, 12, 0, TimeSpan.Zero), c.DateTimeOffsetField);
232
 1
      Assert.AreEqual("Pre", c.PreField);
233
 1
      Assert.AreEqual("Post", c.PostField);
234

  
235
 1
      NullableDateTimeTestClass c2 =
236
 1
       JsonConvert.DeserializeObject<NullableDateTimeTestClass>(@"{""PreField"":""Pre"",""DateTimeField"":null,""DateTimeOffsetField"":null,""PostField"":""Post""}", new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
237

  
238
 1
      Assert.AreEqual(null, c2.DateTimeField);
239
 1
      Assert.AreEqual(null, c2.DateTimeOffsetField);
240
 1
      Assert.AreEqual("Pre", c2.PreField);
241
 1
      Assert.AreEqual("Post", c2.PostField);
242
 1
    }
243

  
244
    [Test]
245
    public void NullableDeserializeEmptyString()
246
    {
247
 1
      string json = @"{""DateTimeField"":""""}";
248

  
249
 1
      NullableDateTimeTestClass c = JsonConvert.DeserializeObject<NullableDateTimeTestClass>(json,
250
 1
        new JsonSerializerSettings { Converters = new [] {new IsoDateTimeConverter()}});
251
 1
      Assert.AreEqual(null, c.DateTimeField);
252
 1
    }
253

  
254
    [Test]
255
    [ExpectedException(typeof(Exception), ExpectedMessage = "Cannot convert null value to System.DateTime.")]
256
    public void DeserializeNullToNonNullable()
257
    {
258
 1
      DateTimeTestClass c2 =
259
 1
       JsonConvert.DeserializeObject<DateTimeTestClass>(@"{""PreField"":""Pre"",""DateTimeField"":null,""DateTimeOffsetField"":null,""PostField"":""Post""}", new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
260
 0
    }
261

  
262
    [Test]
263
    public void SerializeShouldChangeNonUTCDates()
264
    {
265
 1
      DateTimeTestClass c = new DateTimeTestClass();
266
 1
      c.DateTimeField = new DateTime(2008, 1, 1, 1, 1, 1, 0, DateTimeKind.Local);
267
 1
      c.PreField = "Pre";
268
 1
      c.PostField = "Post";
269
 1
      string json = JsonConvert.SerializeObject(c, new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal }); //note that this fails without the Utc converter...
270
 1
      c.DateTimeField = new DateTime(2008, 1, 1, 1, 1, 1, 0, DateTimeKind.Utc);
271
 1
      string json2 = JsonConvert.SerializeObject(c, new IsoDateTimeConverter() { DateTimeStyles = DateTimeStyles.AssumeUniversal });
272
 1
      Assert.AreNotEqual(json, json2);
273
 1
    }
274
#endif
275

  
276
    [Test]
277
    public void BlogCodeSample()
278
    {
279
 1
      Person p = new Person
280
 1
                   {
281
 1
                     Name = "Keith",
282
 1
                     BirthDate = new DateTime(1980, 3, 8),
283
 1
                     LastModified = new DateTime(2009, 4, 12, 20, 44, 55),
284
 1
                   };
285

  
286
 1
      string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());
287
      // {
288
      //   "Name": "Keith",
289
      //   "BirthDate": "1980-03-08T00:00:00",
290
      //   "LastModified": "2009-04-12T20:44:55"
291
      // }
292

  
293
 1
      Console.WriteLine(jsonText);
294

  
295
 1
    }
296
  }
297
}