Json.NET
Code Coverage Statistics for Source File

Newtonsoft.Json.Tests\JsonConvertTest.cs

Symbol Coverage: 98.53% (134 of 136)

Branch Coverage: 83.33% (10 of 12)

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 Newtonsoft.Json.Utilities;
28
using NUnit.Framework;
29

  
30
namespace Newtonsoft.Json.Tests
31
{
32
  public class JsonConvertTest : TestFixtureBase
33
  {
34
#if Entities
35
    [Test]
36
    public void EntitiesTest()
37
    {
38
      Purchase purchase = new Purchase() { Id = 1 };
39
      purchase.PurchaseLine.Add(new PurchaseLine() { Id = 1, Purchase = purchase });
40
      purchase.PurchaseLine.Add(new PurchaseLine() { Id = 2, Purchase = purchase });
41

  
42
      StringWriter sw = new StringWriter();
43
      JsonSerializer serializer = new JsonSerializer();
44
      serializer.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
45

  
46
      using (JsonWriter jw = new JsonTextWriter(sw))
47
      {
48
        jw.Formatting = Formatting.Indented;
49

  
50
        serializer.Serialize(jw, purchase);
51
      }
52

  
53
      string json = sw.ToString();
54

  
55
      Assert.AreEqual(@"{
56
  ""Id"": 1,
57
  ""PurchaseLine"": [
58
    {
59
      ""Id"": 1,
60
      ""PurchaseReference"": {
61
        ""EntityKey"": null,
62
        ""RelationshipName"": ""EntityDataModel.PurchasePurchaseLine"",
63
        ""SourceRoleName"": ""PurchaseLine"",
64
        ""TargetRoleName"": ""Purchase"",
65
        ""RelationshipSet"": null,
66
        ""IsLoaded"": false
67
      },
68
      ""EntityState"": 1,
69
      ""EntityKey"": null
70
    },
71
    {
72
      ""Id"": 2,
73
      ""PurchaseReference"": {
74
        ""EntityKey"": null,
75
        ""RelationshipName"": ""EntityDataModel.PurchasePurchaseLine"",
76
        ""SourceRoleName"": ""PurchaseLine"",
77
        ""TargetRoleName"": ""Purchase"",
78
        ""RelationshipSet"": null,
79
        ""IsLoaded"": false
80
      },
81
      ""EntityState"": 1,
82
      ""EntityKey"": null
83
    }
84
  ],
85
  ""EntityState"": 1,
86
  ""EntityKey"": null
87
}", json);
88

  
89
      Purchase newPurchase = JsonConvert.DeserializeObject<Purchase>(json);
90
      Assert.AreEqual(1, newPurchase.Id);
91

  
92
      Assert.AreEqual(2, newPurchase.PurchaseLine.Count);
93
      Assert.AreEqual(1, newPurchase.PurchaseLine.ElementAt(0).Id);
94
      Assert.AreEqual(2, newPurchase.PurchaseLine.ElementAt(1).Id);
95
    }
96
#endif
97

  
98
    [Test]
99
    public void EscapeJavaScriptString()
100
    {
101
      string result;
102

  
103
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("How now brown cow?", '"', true);
104
 1
      Assert.AreEqual(@"""How now brown cow?""", result);
105

  
106
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("How now 'brown' cow?", '"', true);
107
 1
      Assert.AreEqual(@"""How now 'brown' cow?""", result);
108

  
109
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("How now <brown> cow?", '"', true);
110
 1
      Assert.AreEqual(@"""How now <brown> cow?""", result);
111

  
112
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString(@"How 
113
 1
now brown cow?", '"', true);
114
 1
      Assert.AreEqual(@"""How \r\nnow brown cow?""", result);
115

  
116
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007", '"', true);
117
 1
      Assert.AreEqual(@"""\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007""", result);
118

  
119
 1
      result =
120
 1
        JavaScriptUtils.ToEscapedJavaScriptString("\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013", '"', true);
121
 1
      Assert.AreEqual(@"""\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013""", result);
122

  
123
 1
      result =
124
 1
        JavaScriptUtils.ToEscapedJavaScriptString(
125
 1
          "\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f ", '"', true);
126
 1
      Assert.AreEqual(@"""\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f """, result);
127

  
128
 1
      result =
129
 1
        JavaScriptUtils.ToEscapedJavaScriptString(
130
 1
          "!\"#$%&\u0027()*+,-./0123456789:;\u003c=\u003e?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]", '"', true);
131
 1
      Assert.AreEqual(@"""!\""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]""", result);
132

  
133
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("^_`abcdefghijklmnopqrstuvwxyz{|}~", '"', true);
134
 1
      Assert.AreEqual(@"""^_`abcdefghijklmnopqrstuvwxyz{|}~""", result);
135

  
136
 1
      string data =
137
 1
        "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\"#$%&\u0027()*+,-./0123456789:;\u003c=\u003e?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
138
 1
      string expected =
139
 1
        @"""\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f !\""#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~""";
140

  
141
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString(data, '"', true);
142
 1
      Assert.AreEqual(expected, result);
143

  
144
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("Fred's cat.", '\'', true);
145
 1
      Assert.AreEqual(result, @"'Fred\'s cat.'");
146

  
147
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString(@"""How are you gentlemen?"" said Cats.", '"', true);
148
 1
      Assert.AreEqual(result, @"""\""How are you gentlemen?\"" said Cats.""");
149

  
150
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString(@"""How are' you gentlemen?"" said Cats.", '"', true);
151
 1
      Assert.AreEqual(result, @"""\""How are' you gentlemen?\"" said Cats.""");
152

  
153
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString(@"Fred's ""cat"".", '\'', true);
154
 1
      Assert.AreEqual(result, @"'Fred\'s ""cat"".'");
155

  
156
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("\u001farray\u003caddress");
157
 1
      Assert.AreEqual(result, @"""\u001farray<address""");
158
 1
    }
159

  
160
    [Test]
161
    public void EscapeJavaScriptString_UnicodeLinefeeds()
162
    {
163
      string result;
164

  
165
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("before" + '\u0085' + "after", '"', true);
166
 1
      Assert.AreEqual(@"""before\u0085after""", result);
167

  
168
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("before" + '\u2028' + "after", '"', true);
169
 1
      Assert.AreEqual(@"""before\u2028after""", result);
170

  
171
 1
      result = JavaScriptUtils.ToEscapedJavaScriptString("before" + '\u2029' + "after", '"', true);
172
 1
      Assert.AreEqual(@"""before\u2029after""", result);
173
 1
    }
174

  
175
    [Test]
176
    [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Unsupported type: System.Version. Use the JsonSerializer class to get the object's JSON representation.")]
177
    public void ToStringInvalid()
178
    {
179
 1
      JsonConvert.ToString(new Version(1, 0));
180
 0
    }
181

  
182
    [Test]
183
    public void GuidToString()
184
    {
185
 1
      Guid guid = new Guid("BED7F4EA-1A96-11d2-8F08-00A0C9A6186D");
186
 1
      string json = JsonConvert.ToString(guid);
187
 1
      Assert.AreEqual(@"""bed7f4ea-1a96-11d2-8f08-00a0c9a6186d""", json);
188
 1
    }
189

  
190
    [Test]
191
    public void EnumToString()
192
    {
193
 1
      string json = JsonConvert.ToString(StringComparison.CurrentCultureIgnoreCase);
194
 1
      Assert.AreEqual("1", json);
195
 1
    }
196

  
197
    [Test]
198
    public void ObjectToString()
199
    {
200
      object value;
201

  
202
 1
      value = 1;
203
 1
      Assert.AreEqual("1", JsonConvert.ToString(value));
204

  
205
 1
      value = 1.1;
206
 1
      Assert.AreEqual("1.1", JsonConvert.ToString(value));
207

  
208
 1
      value = 1.1m;
209
 1
      Assert.AreEqual("1.1", JsonConvert.ToString(value));
210

  
211
 1
      value = (float)1.1;
212
 1
      Assert.AreEqual("1.1", JsonConvert.ToString(value));
213

  
214
 1
      value = (short)1;
215
 1
      Assert.AreEqual("1", JsonConvert.ToString(value));
216

  
217
 1
      value = (long)1;
218
 1
      Assert.AreEqual("1", JsonConvert.ToString(value));
219

  
220
 1
      value = (byte)1;
221
 1
      Assert.AreEqual("1", JsonConvert.ToString(value));
222

  
223
 1
      value = (uint)1;
224
 1
      Assert.AreEqual("1", JsonConvert.ToString(value));
225

  
226
 1
      value = (ushort)1;
227
 1
      Assert.AreEqual("1", JsonConvert.ToString(value));
228

  
229
 1
      value = (sbyte)1;
230
 1
      Assert.AreEqual("1", JsonConvert.ToString(value));
231

  
232
 1
      value = (ulong)1;
233
 1
      Assert.AreEqual("1", JsonConvert.ToString(value));
234

  
235
 1
      value = new DateTime(JsonConvert.InitialJavaScriptDateTicks, DateTimeKind.Utc);
236
 1
      Assert.AreEqual(@"""\/Date(0)\/""", JsonConvert.ToString(value));
237

  
238
#if !PocketPC && !NET20
239
 1
      value = new DateTimeOffset(JsonConvert.InitialJavaScriptDateTicks, TimeSpan.Zero);
240
 1
      Assert.AreEqual(@"""\/Date(0+0000)\/""", JsonConvert.ToString(value));
241
#endif
242

  
243
 1
      value = null;
244
 1
      Assert.AreEqual("null", JsonConvert.ToString(value));
245

  
246
 1
      value = DBNull.Value;
247
 1
      Assert.AreEqual("null", JsonConvert.ToString(value));
248

  
249
 1
      value = "I am a string";
250
 1
      Assert.AreEqual(@"""I am a string""", JsonConvert.ToString(value));
251

  
252
 1
      value = true;
253
 1
      Assert.AreEqual("true", JsonConvert.ToString(value));
254

  
255
 1
      value = 'c';
256
 1
      Assert.AreEqual(@"""c""", JsonConvert.ToString(value));
257
 1
    }
258

  
259
    [Test]
260
    [ExpectedException(typeof(JsonReaderException), ExpectedMessage = "After parsing a value an unexpected character was encountered: t. Line 1, position 20.")]
261
    public void TestInvalidStrings()
262
    {
263
 1
      string orig = @"this is a string ""that has quotes"" ";
264

  
265
 1
      string serialized = JsonConvert.SerializeObject(orig);
266

  
267
      // *** Make string invalid by stripping \" \"
268
 1
      serialized = serialized.Replace(@"\""", "\"");
269

  
270
 1
      JsonConvert.DeserializeObject<string>(serialized);
271
 0
    }
272

  
273
    [Test]
274
    public void DeserializeValueObjects()
275
    {
276
 1
      int i = JsonConvert.DeserializeObject<int>("1");
277
 1
      Assert.AreEqual(1, i);
278

  
279
#if !PocketPC && !NET20
280
 1
      DateTimeOffset d = JsonConvert.DeserializeObject<DateTimeOffset>(@"""\/Date(-59011455539000+0000)\/""");
281
 1
      Assert.AreEqual(new DateTimeOffset(new DateTime(100, 1, 1, 1, 1, 1, DateTimeKind.Utc)), d);
282
#endif
283

  
284
 1
      bool b = JsonConvert.DeserializeObject<bool>("true");
285
 1
      Assert.AreEqual(true, b);
286

  
287
 1
      object n = JsonConvert.DeserializeObject<object>("null");
288
 1
      Assert.AreEqual(null, n);
289

  
290
 1
      object u = JsonConvert.DeserializeObject<object>("undefined");
291
 1
      Assert.AreEqual(null, u);
292
 1
    }
293

  
294
    [Test]
295
    public void FloatToString()
296
    {
297
 1
      Assert.AreEqual("1.1", JsonConvert.ToString(1.1));
298
 1
      Assert.AreEqual("1.11", JsonConvert.ToString(1.11));
299
 1
      Assert.AreEqual("1.111", JsonConvert.ToString(1.111));
300
 1
      Assert.AreEqual("1.1111", JsonConvert.ToString(1.1111));
301
 1
      Assert.AreEqual("1.11111", JsonConvert.ToString(1.11111));
302
 1
      Assert.AreEqual("1.111111", JsonConvert.ToString(1.111111));
303
 1
      Assert.AreEqual("1.0", JsonConvert.ToString(1.0));
304
 1
      Assert.AreEqual("1.0", JsonConvert.ToString(1d));
305
 1
      Assert.AreEqual("-1.0", JsonConvert.ToString(-1d)); 
306
 1
      Assert.AreEqual("1.01", JsonConvert.ToString(1.01));
307
 1
      Assert.AreEqual("1.001", JsonConvert.ToString(1.001));
308
 1
      Assert.AreEqual(JsonConvert.PositiveInfinity, JsonConvert.ToString(double.PositiveInfinity));
309
 1
      Assert.AreEqual(JsonConvert.NegativeInfinity, JsonConvert.ToString(double.NegativeInfinity));
310
 1
      Assert.AreEqual(JsonConvert.NaN, JsonConvert.ToString(double.NaN));
311
 1
    }
312

  
313
    [Test]
314
    public void DecimalToString()
315
    {
316
 1
      Assert.AreEqual("1.1", JsonConvert.ToString(1.1m));
317
 1
      Assert.AreEqual("1.11", JsonConvert.ToString(1.11m));
318
 1
      Assert.AreEqual("1.111", JsonConvert.ToString(1.111m));
319
 1
      Assert.AreEqual("1.1111", JsonConvert.ToString(1.1111m));
320
 1
      Assert.AreEqual("1.11111", JsonConvert.ToString(1.11111m));
321
 1
      Assert.AreEqual("1.111111", JsonConvert.ToString(1.111111m));
322
 1
      Assert.AreEqual("1.0", JsonConvert.ToString(1.0m));
323
 1
      Assert.AreEqual("-1.0", JsonConvert.ToString(-1.0m));
324
 1
      Assert.AreEqual("-1.0", JsonConvert.ToString(-1m));
325
 1
      Assert.AreEqual("1.0", JsonConvert.ToString(1m));
326
 1
      Assert.AreEqual("1.01", JsonConvert.ToString(1.01m));
327
 1
      Assert.AreEqual("1.001", JsonConvert.ToString(1.001m));
328
 1
      Assert.AreEqual("79228162514264337593543950335.0", JsonConvert.ToString(decimal.MaxValue));
329
 1
      Assert.AreEqual("-79228162514264337593543950335.0", JsonConvert.ToString(decimal.MinValue));
330
 1
    }
331

  
332
    [Test]
333
    public void StringEscaping()
334
    {
335
 1
      string v = @"It's a good day
336
 1
""sunshine""";
337

  
338
 1
      string json = JsonConvert.ToString(v);
339
 1
      Assert.AreEqual(@"""It's a good day\r\n\""sunshine\""""", json);
340
 1
    }
341
  }
342
}