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
Symbol Coverage Trend
View:
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 |
} |