Statistics
| Branch: | Revision:

root / trunk / Libraries / Json40r2 / Source / Src / Newtonsoft.Json.Tests / Linq / JTokenTests.cs @ d78cbf09

History | View | Annotate | Download (22.3 kB)

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
}