All files
[pithos-ms-client] / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json.Tests / Linq / JTokenTests.cs
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.Converters;
31 using NUnit.Framework;
32 using Newtonsoft.Json.Linq;
33 using System.IO;
34
35 namespace Newtonsoft.Json.Tests.Linq
36 {
37   public class JTokenTests : TestFixtureBase
38   {
39     [Test]
40     public void ReadFrom()
41     {
42       JObject o = (JObject)JToken.ReadFrom(new JsonTextReader(new StringReader("{'pie':true}")));
43       Assert.AreEqual(true, (bool)o["pie"]);
44
45       JArray a = (JArray)JToken.ReadFrom(new JsonTextReader(new StringReader("[1,2,3]")));
46       Assert.AreEqual(1, (int)a[0]);
47       Assert.AreEqual(2, (int)a[1]);
48       Assert.AreEqual(3, (int)a[2]);
49
50       JsonReader reader = new JsonTextReader(new StringReader("{'pie':true}"));
51       reader.Read();
52       reader.Read();
53
54       JProperty p = (JProperty)JToken.ReadFrom(reader);
55       Assert.AreEqual("pie", p.Name);
56       Assert.AreEqual(true, (bool)p.Value);
57
58       JConstructor c = (JConstructor)JToken.ReadFrom(new JsonTextReader(new StringReader("new Date(1)")));
59       Assert.AreEqual("Date", c.Name);
60       Assert.IsTrue(JToken.DeepEquals(new JValue(1), c.Values().ElementAt(0)));
61
62       JValue v;
63
64       v = (JValue)JToken.ReadFrom(new JsonTextReader(new StringReader(@"""stringvalue""")));
65       Assert.AreEqual("stringvalue", (string)v);
66
67       v = (JValue)JToken.ReadFrom(new JsonTextReader(new StringReader(@"1")));
68       Assert.AreEqual(1, (int)v);
69
70       v = (JValue)JToken.ReadFrom(new JsonTextReader(new StringReader(@"1.1")));
71       Assert.AreEqual(1.1, (double)v);
72     }
73
74     [Test]
75     public void Load()
76     {
77       JObject o = (JObject)JToken.Load(new JsonTextReader(new StringReader("{'pie':true}")));
78       Assert.AreEqual(true, (bool)o["pie"]);
79     }
80
81     [Test]
82     public void Parse()
83     {
84       JObject o = (JObject)JToken.Parse("{'pie':true}");
85       Assert.AreEqual(true, (bool)o["pie"]);
86     }
87
88     [Test]
89     public void Parent()
90     {
91       JArray v = new JArray(new JConstructor("TestConstructor"), new JValue(new DateTime(2000, 12, 20)));
92
93       Assert.AreEqual(null, v.Parent);
94
95       JObject o =
96         new JObject(
97           new JProperty("Test1", v),
98           new JProperty("Test2", "Test2Value"),
99           new JProperty("Test3", "Test3Value"),
100           new JProperty("Test4", null)
101         );
102
103       Assert.AreEqual(o.Property("Test1"), v.Parent);
104
105       JProperty p = new JProperty("NewProperty", v);
106
107       // existing value should still have same parent
108       Assert.AreEqual(o.Property("Test1"), v.Parent);
109
110       // new value should be cloned
111       Assert.AreNotSame(p.Value, v);
112
113       Assert.AreEqual((DateTime)((JValue)p.Value[1]).Value, (DateTime)((JValue)v[1]).Value);
114
115       Assert.AreEqual(v, o["Test1"]);
116
117       Assert.AreEqual(null, o.Parent);
118       JProperty o1 = new JProperty("O1", o);
119       Assert.AreEqual(o, o1.Value);
120
121       Assert.AreNotEqual(null, o.Parent);
122       JProperty o2 = new JProperty("O2", o);
123
124       Assert.AreNotSame(o1.Value, o2.Value);
125       Assert.AreEqual(o1.Value.Children().Count(), o2.Value.Children().Count());
126       Assert.AreEqual(false, JToken.DeepEquals(o1, o2));
127       Assert.AreEqual(true, JToken.DeepEquals(o1.Value, o2.Value));
128     }
129
130     [Test]
131     public void Next()
132     {
133       JArray a =
134         new JArray(
135           5,
136           6,
137           new JArray(7, 8),
138           new JArray(9, 10)
139         );
140
141       JToken next = a[0].Next;
142       Assert.AreEqual(6, (int)next);
143
144       next = next.Next;
145       Assert.IsTrue(JToken.DeepEquals(new JArray(7, 8), next));
146  
147       next = next.Next;
148       Assert.IsTrue(JToken.DeepEquals(new JArray(9, 10), next));
149
150       next = next.Next;
151       Assert.IsNull(next);
152     }
153
154     [Test]
155     public void Previous()
156     {
157       JArray a =
158         new JArray(
159           5,
160           6,
161           new JArray(7, 8),
162           new JArray(9, 10)
163         );
164
165       JToken previous = a[3].Previous;
166       Assert.IsTrue(JToken.DeepEquals(new JArray(7, 8), previous));
167
168       previous = previous.Previous;
169       Assert.AreEqual(6, (int)previous);
170
171       previous = previous.Previous;
172       Assert.AreEqual(5, (int)previous);
173
174       previous = previous.Previous;
175       Assert.IsNull(previous);
176     }
177
178     [Test]
179     public void Children()
180     {
181       JArray a =
182         new JArray(
183           5,
184           new JArray(1),
185           new JArray(1, 2),
186           new JArray(1, 2, 3)
187         );
188
189       Assert.AreEqual(4, a.Count());
190       Assert.AreEqual(3, a.Children<JArray>().Count());
191     }
192
193     [Test]
194     public void BeforeAfter()
195     {
196       JArray a =
197         new JArray(
198           5,
199           new JArray(1, 2, 3),
200           new JArray(1, 2, 3),
201           new JArray(1, 2, 3)
202         );
203
204       Assert.AreEqual(5, (int)a[1].Previous);
205       Assert.AreEqual(2, a[2].BeforeSelf().Count());
206       //Assert.AreEqual(2, a[2].AfterSelf().Count());
207     }
208
209     [Test]
210     public void Casting()
211     {
212       Assert.AreEqual(new DateTime(2000, 12, 20), (DateTime)new JValue(new DateTime(2000, 12, 20)));
213 #if !PocketPC && !NET20
214       Assert.AreEqual(new DateTimeOffset(2000, 12, 20, 23, 50, 10, TimeSpan.Zero), (DateTimeOffset)new JValue(new DateTimeOffset(2000, 12, 20, 23, 50, 10, TimeSpan.Zero)));
215       Assert.AreEqual(null, (DateTimeOffset?)new JValue((DateTimeOffset?)null));
216       Assert.AreEqual(null, (DateTimeOffset?)(JValue)null);
217 #endif
218       Assert.AreEqual(true, (bool)new JValue(true));
219       Assert.AreEqual(true, (bool?)new JValue(true));
220       Assert.AreEqual(null, (bool?)((JValue)null));
221       Assert.AreEqual(null, (bool?)new JValue((object)null));
222       Assert.AreEqual(10, (long)new JValue(10));
223       Assert.AreEqual(null, (long?)new JValue((long?)null));
224       Assert.AreEqual(null, (long?)(JValue)null);
225       Assert.AreEqual(null, (int?)new JValue((int?)null));
226       Assert.AreEqual(null, (int?)(JValue)null);
227       Assert.AreEqual(null, (DateTime?)new JValue((DateTime?)null));
228       Assert.AreEqual(null, (DateTime?)(JValue)null);
229       Assert.AreEqual(null, (short?)new JValue((short?)null));
230       Assert.AreEqual(null, (short?)(JValue)null);
231       Assert.AreEqual(null, (float?)new JValue((float?)null));
232       Assert.AreEqual(null, (float?)(JValue)null);
233       Assert.AreEqual(null, (double?)new JValue((double?)null));
234       Assert.AreEqual(null, (double?)(JValue)null);
235       Assert.AreEqual(null, (decimal?)new JValue((decimal?)null));
236       Assert.AreEqual(null, (decimal?)(JValue)null);
237       Assert.AreEqual(null, (uint?)new JValue((uint?)null));
238       Assert.AreEqual(null, (uint?)(JValue)null);
239       Assert.AreEqual(null, (sbyte?)new JValue((sbyte?)null));
240       Assert.AreEqual(null, (sbyte?)(JValue)null);
241       Assert.AreEqual(null, (ulong?)new JValue((ulong?)null));
242       Assert.AreEqual(null, (ulong?)(JValue)null);
243       Assert.AreEqual(null, (uint?)new JValue((uint?)null));
244       Assert.AreEqual(null, (uint?)(JValue)null);
245       Assert.AreEqual(11.1f, (float)new JValue(11.1));
246       Assert.AreEqual(float.MinValue, (float)new JValue(float.MinValue));
247       Assert.AreEqual(1.1, (double)new JValue(1.1));
248       Assert.AreEqual(uint.MaxValue, (uint)new JValue(uint.MaxValue));
249       Assert.AreEqual(ulong.MaxValue, (ulong)new JValue(ulong.MaxValue));
250       Assert.AreEqual(ulong.MaxValue, (ulong)new JProperty("Test", new JValue(ulong.MaxValue)));
251       Assert.AreEqual(null, (string)new JValue((string)null));
252       Assert.AreEqual(5m, (decimal)(new JValue(5L)));
253       Assert.AreEqual(5m, (decimal?)(new JValue(5L)));
254       Assert.AreEqual(5f, (float)(new JValue(5L)));
255       Assert.AreEqual(5f, (float)(new JValue(5m)));
256       Assert.AreEqual(5f, (float?)(new JValue(5m)));
257
258       byte[] data = new byte[0];
259       Assert.AreEqual(data, (byte[])(new JValue(data)));
260
261       Assert.AreEqual(5, (int)(new JValue(StringComparison.OrdinalIgnoreCase)));
262     }
263
264     [Test]
265     public void ImplicitCastingTo()
266     {
267       Assert.IsTrue(JToken.DeepEquals(new JValue(new DateTime(2000, 12, 20)), (JValue)new DateTime(2000, 12, 20)));
268 #if !PocketPC && !NET20
269       Assert.IsTrue(JToken.DeepEquals(new JValue(new DateTimeOffset(2000, 12, 20, 23, 50, 10, TimeSpan.Zero)), (JValue)new DateTimeOffset(2000, 12, 20, 23, 50, 10, TimeSpan.Zero)));
270       Assert.IsTrue(JToken.DeepEquals(new JValue((DateTimeOffset?)null), (JValue)(DateTimeOffset?)null));
271 #endif
272
273       Assert.IsTrue(JToken.DeepEquals(new JValue(true), (JValue)true));
274       Assert.IsTrue(JToken.DeepEquals(new JValue(true), (JValue)(bool?)true));
275       Assert.IsTrue(JToken.DeepEquals(new JValue((bool?)null), (JValue)(bool?)null));
276       Assert.IsTrue(JToken.DeepEquals(new JValue(10), (JValue)10));
277       Assert.IsTrue(JToken.DeepEquals(new JValue((long?)null), (JValue)(long?)null));
278       Assert.IsTrue(JToken.DeepEquals(new JValue((DateTime?)null), (JValue)(DateTime?)null));
279       Assert.IsTrue(JToken.DeepEquals(new JValue(long.MaxValue), (JValue)long.MaxValue));
280       Assert.IsTrue(JToken.DeepEquals(new JValue((int?)null), (JValue)(int?)null));
281       Assert.IsTrue(JToken.DeepEquals(new JValue((short?)null), (JValue)(short?)null));
282       Assert.IsTrue(JToken.DeepEquals(new JValue((double?)null), (JValue)(double?)null));
283       Assert.IsTrue(JToken.DeepEquals(new JValue((uint?)null), (JValue)(uint?)null));
284       Assert.IsTrue(JToken.DeepEquals(new JValue((decimal?)null), (JValue)(decimal?)null));
285       Assert.IsTrue(JToken.DeepEquals(new JValue((ulong?)null), (JValue)(ulong?)null));
286       Assert.IsTrue(JToken.DeepEquals(new JValue((sbyte?)null), (JValue)(sbyte?)null));
287       Assert.IsTrue(JToken.DeepEquals(new JValue((ushort?)null), (JValue)(ushort?)null));
288       Assert.IsTrue(JToken.DeepEquals(new JValue(ushort.MaxValue), (JValue)ushort.MaxValue));
289       Assert.IsTrue(JToken.DeepEquals(new JValue(11.1f), (JValue)11.1f));
290       Assert.IsTrue(JToken.DeepEquals(new JValue(float.MinValue), (JValue)float.MinValue));
291       Assert.IsTrue(JToken.DeepEquals(new JValue(double.MinValue), (JValue)double.MinValue));
292       Assert.IsTrue(JToken.DeepEquals(new JValue(uint.MaxValue), (JValue)uint.MaxValue));
293       Assert.IsTrue(JToken.DeepEquals(new JValue(ulong.MaxValue), (JValue)ulong.MaxValue));
294       Assert.IsTrue(JToken.DeepEquals(new JValue(ulong.MinValue), (JValue)ulong.MinValue));
295       Assert.IsTrue(JToken.DeepEquals(new JValue((string)null), (JValue)(string)null));
296       Assert.IsTrue(JToken.DeepEquals(new JValue((DateTime?)null), (JValue)(DateTime?)null));
297       Assert.IsTrue(JToken.DeepEquals(new JValue(decimal.MaxValue), (JValue)decimal.MaxValue));
298       Assert.IsTrue(JToken.DeepEquals(new JValue(decimal.MaxValue), (JValue)(decimal?)decimal.MaxValue));
299       Assert.IsTrue(JToken.DeepEquals(new JValue(decimal.MinValue), (JValue)decimal.MinValue));
300       Assert.IsTrue(JToken.DeepEquals(new JValue(float.MaxValue), (JValue)(float?)float.MaxValue));
301       Assert.IsTrue(JToken.DeepEquals(new JValue(double.MaxValue), (JValue)(double?)double.MaxValue));
302       Assert.IsTrue(JToken.DeepEquals(new JValue((object)null), (JValue)(double?)null));
303
304       Assert.IsFalse(JToken.DeepEquals(new JValue(true), (JValue)(bool?)null));
305       Assert.IsFalse(JToken.DeepEquals(new JValue((object)null), (JValue)(object)null));
306
307       byte[] emptyData = new byte[0];
308       Assert.IsTrue(JToken.DeepEquals(new JValue(emptyData), (JValue)emptyData));
309       Assert.IsFalse(JToken.DeepEquals(new JValue(emptyData), (JValue)new byte[1]));
310       Assert.IsTrue(JToken.DeepEquals(new JValue(Encoding.UTF8.GetBytes("Hi")), (JValue)Encoding.UTF8.GetBytes("Hi")));
311     }
312
313     [Test]
314     public void Root()
315     {
316       JArray a =
317         new JArray(
318           5,
319           6,
320           new JArray(7, 8),
321           new JArray(9, 10)
322         );
323
324       Assert.AreEqual(a, a.Root);
325       Assert.AreEqual(a, a[0].Root);
326       Assert.AreEqual(a, ((JArray)a[2])[0].Root);
327     }
328
329     [Test]
330     public void Remove()
331     {
332       JToken t;
333       JArray a =
334         new JArray(
335           5,
336           6,
337           new JArray(7, 8),
338           new JArray(9, 10)
339         );
340
341       a[0].Remove();
342
343       Assert.AreEqual(6, (int)a[0]);
344
345       a[1].Remove();
346
347       Assert.AreEqual(6, (int)a[0]);
348       Assert.IsTrue(JToken.DeepEquals(new JArray(9, 10), a[1]));
349       Assert.AreEqual(2, a.Count());
350
351       t = a[1];
352       t.Remove();
353       Assert.AreEqual(6, (int)a[0]);
354       Assert.IsNull(t.Next);
355       Assert.IsNull(t.Previous);
356       Assert.IsNull(t.Parent);
357
358       t = a[0];
359       t.Remove();
360       Assert.AreEqual(0, a.Count());
361
362       Assert.IsNull(t.Next);
363       Assert.IsNull(t.Previous);
364       Assert.IsNull(t.Parent);
365     }
366
367     [Test]
368     public void AfterSelf()
369     {
370       JArray a =
371         new JArray(
372           5,
373           new JArray(1),
374           new JArray(1, 2),
375           new JArray(1, 2, 3)
376         );
377
378       JToken t = a[1];
379       List<JToken> afterTokens = t.AfterSelf().ToList();
380
381       Assert.AreEqual(2, afterTokens.Count);
382       Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2), afterTokens[0]));
383       Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2, 3), afterTokens[1]));
384     }
385
386     [Test]
387     public void BeforeSelf()
388     {
389       JArray a =
390         new JArray(
391           5,
392           new JArray(1),
393           new JArray(1, 2),
394           new JArray(1, 2, 3)
395         );
396
397       JToken t = a[2];
398       List<JToken> beforeTokens = t.BeforeSelf().ToList();
399
400       Assert.AreEqual(2, beforeTokens.Count);
401       Assert.IsTrue(JToken.DeepEquals(new JValue(5), beforeTokens[0]));
402       Assert.IsTrue(JToken.DeepEquals(new JArray(1), beforeTokens[1]));
403     }
404
405     [Test]
406     public void HasValues()
407     {
408       JArray a =
409         new JArray(
410           5,
411           new JArray(1),
412           new JArray(1, 2),
413           new JArray(1, 2, 3)
414         );
415
416       Assert.IsTrue(a.HasValues);
417     }
418
419     [Test]
420     public void Ancestors()
421     {
422       JArray a =
423         new JArray(
424           5,
425           new JArray(1),
426           new JArray(1, 2),
427           new JArray(1, 2, 3)
428         );
429
430       JToken t = a[1][0];
431       List<JToken> ancestors = t.Ancestors().ToList();
432       Assert.AreEqual(2, ancestors.Count());
433       Assert.AreEqual(a[1], ancestors[0]);
434       Assert.AreEqual(a, ancestors[1]);
435     }
436
437     [Test]
438     public void Descendants()
439     {
440       JArray a =
441         new JArray(
442           5,
443           new JArray(1),
444           new JArray(1, 2),
445           new JArray(1, 2, 3)
446         );
447
448       List<JToken> descendants = a.Descendants().ToList();
449       Assert.AreEqual(10, descendants.Count());
450       Assert.AreEqual(5, (int)descendants[0]);
451       Assert.IsTrue(JToken.DeepEquals(new JArray(1, 2, 3), descendants[descendants.Count - 4]));
452       Assert.AreEqual(1, (int)descendants[descendants.Count - 3]);
453       Assert.AreEqual(2, (int)descendants[descendants.Count - 2]);
454       Assert.AreEqual(3, (int)descendants[descendants.Count - 1]);
455     }
456
457     [Test]
458     public void CreateWriter()
459     {
460       JArray a =
461         new JArray(
462           5,
463           new JArray(1),
464           new JArray(1, 2),
465           new JArray(1, 2, 3)
466         );
467
468       JsonWriter writer = a.CreateWriter();
469       Assert.IsNotNull(writer);
470       Assert.AreEqual(4, a.Count());
471
472       writer.WriteValue("String");
473       Assert.AreEqual(5, a.Count());
474       Assert.AreEqual("String", (string)a[4]);
475
476       writer.WriteStartObject();
477       writer.WritePropertyName("Property");
478       writer.WriteValue("PropertyValue");
479       writer.WriteEnd();
480
481       Assert.AreEqual(6, a.Count());
482       Assert.IsTrue(JToken.DeepEquals(new JObject(new JProperty("Property", "PropertyValue")), a[5]));
483     }
484
485     [Test]
486     public void AddFirst()
487     {
488       JArray a =
489         new JArray(
490           5,
491           new JArray(1),
492           new JArray(1, 2),
493           new JArray(1, 2, 3)
494         );
495
496       a.AddFirst("First");
497
498       Assert.AreEqual("First", (string)a[0]);
499       Assert.AreEqual(a, a[0].Parent);
500       Assert.AreEqual(a[1], a[0].Next);
501       Assert.AreEqual(5, a.Count());
502
503       a.AddFirst("NewFirst");
504       Assert.AreEqual("NewFirst", (string)a[0]);
505       Assert.AreEqual(a, a[0].Parent);
506       Assert.AreEqual(a[1], a[0].Next);
507       Assert.AreEqual(6, a.Count());
508
509       Assert.AreEqual(a[0], a[0].Next.Previous);
510     }
511
512     [Test]
513     public void RemoveAll()
514     {
515       JArray a =
516         new JArray(
517           5,
518           new JArray(1),
519           new JArray(1, 2),
520           new JArray(1, 2, 3)
521         );
522
523       JToken first = a.First;
524       Assert.AreEqual(5, (int)first);
525
526       a.RemoveAll();
527       Assert.AreEqual(0, a.Count());
528
529       Assert.IsNull(first.Parent);
530       Assert.IsNull(first.Next);
531     }
532
533     [Test]
534     [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Can not add Newtonsoft.Json.Linq.JProperty to Newtonsoft.Json.Linq.JArray.")]
535     public void AddPropertyToArray()
536     {
537       JArray a = new JArray();
538       a.Add(new JProperty("PropertyName"));
539     }
540
541     [Test]
542     [ExpectedException(typeof(ArgumentException), ExpectedMessage = "Can not add Newtonsoft.Json.Linq.JValue to Newtonsoft.Json.Linq.JObject.")]
543     public void AddValueToObject()
544     {
545       JObject o = new JObject();
546       o.Add(5);
547     }
548
549     [Test]
550     public void Replace()
551     {
552       JArray a =
553         new JArray(
554           5,
555           new JArray(1),
556           new JArray(1, 2),
557           new JArray(1, 2, 3)
558         );
559
560       a[0].Replace(new JValue(int.MaxValue));
561       Assert.AreEqual(int.MaxValue, (int)a[0]);
562       Assert.AreEqual(4, a.Count());
563
564       a[1][0].Replace(new JValue("Test"));
565       Assert.AreEqual("Test", (string)a[1][0]);
566
567       a[2].Replace(new JValue(int.MaxValue));
568       Assert.AreEqual(int.MaxValue, (int)a[2]);
569       Assert.AreEqual(4, a.Count());
570
571       Assert.IsTrue(JToken.DeepEquals(new JArray(int.MaxValue, new JArray("Test"), int.MaxValue, new JArray(1, 2, 3)), a));
572     }
573
574     [Test]
575     public void ToStringWithConverters()
576     {
577       JArray a =
578         new JArray(
579           new JValue(new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc))
580         );
581
582       string json = a.ToString(Formatting.Indented, new IsoDateTimeConverter());
583
584       Assert.AreEqual(@"[
585   ""2009-02-15T00:00:00Z""
586 ]", json);
587
588       json = JsonConvert.SerializeObject(a, new IsoDateTimeConverter());
589
590       Assert.AreEqual(@"[""2009-02-15T00:00:00Z""]", json);
591     }
592
593     [Test]
594     public void ToStringWithNoIndenting()
595     {
596       JArray a =
597         new JArray(
598           new JValue(new DateTime(2009, 2, 15, 0, 0, 0, DateTimeKind.Utc))
599         );
600
601       string json = a.ToString(Formatting.None, new IsoDateTimeConverter());
602
603       Assert.AreEqual(@"[""2009-02-15T00:00:00Z""]", json);
604     }
605
606     [Test]
607     public void AddAfterSelf()
608     {
609       JArray a =
610         new JArray(
611           5,
612           new JArray(1),
613           new JArray(1, 2),
614           new JArray(1, 2, 3)
615         );
616
617       a[1].AddAfterSelf("pie");
618
619       Assert.AreEqual(5, (int)a[0]);
620       Assert.AreEqual(1, a[1].Count());
621       Assert.AreEqual("pie", (string)a[2]);
622       Assert.AreEqual(5, a.Count());
623
624       a[4].AddAfterSelf("lastpie");
625
626       Assert.AreEqual("lastpie", (string)a[5]);
627       Assert.AreEqual("lastpie", (string)a.Last);
628     }
629
630     [Test]
631     public void AddBeforeSelf()
632     {
633       JArray a =
634         new JArray(
635           5,
636           new JArray(1),
637           new JArray(1, 2),
638           new JArray(1, 2, 3)
639         );
640
641       a[1].AddBeforeSelf("pie");
642
643       Assert.AreEqual(5, (int)a[0]);
644       Assert.AreEqual("pie", (string)a[1]);
645       Assert.AreEqual(a, a[1].Parent);
646       Assert.AreEqual(a[2], a[1].Next);
647       Assert.AreEqual(5, a.Count());
648
649       a[0].AddBeforeSelf("firstpie");
650
651       Assert.AreEqual("firstpie", (string)a[0]);
652       Assert.AreEqual(5, (int)a[1]);
653       Assert.AreEqual("pie", (string)a[2]);
654       Assert.AreEqual(a, a[0].Parent);
655       Assert.AreEqual(a[1], a[0].Next);
656       Assert.AreEqual(6, a.Count());
657
658       a.Last.AddBeforeSelf("secondlastpie");
659
660       Assert.AreEqual("secondlastpie", (string)a[5]);
661       Assert.AreEqual(7, a.Count());
662     }
663
664     [Test]
665     public void DeepClone()
666     {
667       JArray a =
668         new JArray(
669           5,
670           new JArray(1),
671           new JArray(1, 2),
672           new JArray(1, 2, 3),
673           new JObject(
674             new JProperty("First", new JValue(Encoding.UTF8.GetBytes("Hi"))),
675             new JProperty("Second", 1),
676             new JProperty("Third", null),
677             new JProperty("Fourth", new JConstructor("Date", 12345)),
678             new JProperty("Fifth", double.PositiveInfinity),
679             new JProperty("Sixth", double.NaN)
680             )
681         );
682
683       JArray a2 = (JArray)a.DeepClone();
684
685       Console.WriteLine(a2.ToString(Formatting.Indented));
686
687       Assert.IsTrue(a.DeepEquals(a2));
688     }
689
690 #if !SILVERLIGHT
691     [Test]
692     public void Clone()
693     {
694       JArray a =
695         new JArray(
696           5,
697           new JArray(1),
698           new JArray(1, 2),
699           new JArray(1, 2, 3),
700           new JObject(
701             new JProperty("First", new JValue(Encoding.UTF8.GetBytes("Hi"))),
702             new JProperty("Second", 1),
703             new JProperty("Third", null),
704             new JProperty("Fourth", new JConstructor("Date", 12345)),
705             new JProperty("Fifth", double.PositiveInfinity),
706             new JProperty("Sixth", double.NaN)
707             )
708         );
709
710       ICloneable c = a;
711
712       JArray a2 = (JArray) c.Clone();
713
714       Assert.IsTrue(a.DeepEquals(a2));
715     }
716 #endif
717
718     [Test]
719     public void DoubleDeepEquals()
720     {
721       JArray a =
722         new JArray(
723           double.NaN,
724           double.PositiveInfinity,
725           double.NegativeInfinity
726         );
727
728       JArray a2 = (JArray)a.DeepClone();
729
730       Assert.IsTrue(a.DeepEquals(a2));
731
732       double d = 1 + 0.1 + 0.1 + 0.1;
733
734       JValue v1 = new JValue(d);
735       JValue v2 = new JValue(1.3);
736
737       Assert.IsTrue(v1.DeepEquals(v2));
738     }
739   }
740 }