/Newtonsoft.Json.Tests/Linq/JArrayTests.cs
C# | 440 lines | 360 code | 80 blank | 0 comment | 2 complexity | 434c90e9de7b095976fc74411b056aac MD5 | raw file
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Linq;
5using System.Text;
6using NUnit.Framework;
7using Newtonsoft.Json.Linq;
8
9namespace Newtonsoft.Json.Tests.Linq
10{
11 public class JArrayTests : TestFixtureBase
12 {
13 [Test]
14 public void Clear()
15 {
16 JArray a = new JArray { 1 };
17 Assert.AreEqual(1, a.Count);
18
19 a.Clear();
20 Assert.AreEqual(0, a.Count);
21 }
22
23 [Test]
24 public void Contains()
25 {
26 JValue v = new JValue(1);
27
28 JArray a = new JArray { v };
29
30 Assert.AreEqual(false, a.Contains(new JValue(2)));
31 Assert.AreEqual(false, a.Contains(new JValue(1)));
32 Assert.AreEqual(false, a.Contains(null));
33 Assert.AreEqual(true, a.Contains(v));
34 }
35
36 [Test]
37 public void GenericCollectionCopyTo()
38 {
39 JArray j = new JArray();
40 j.Add(new JValue(1));
41 j.Add(new JValue(2));
42 j.Add(new JValue(3));
43 Assert.AreEqual(3, j.Count);
44
45 JToken[] a = new JToken[5];
46
47 ((ICollection<JToken>)j).CopyTo(a, 1);
48
49 Assert.AreEqual(null, a[0]);
50
51 Assert.AreEqual(1, (int)a[1]);
52
53 Assert.AreEqual(2, (int)a[2]);
54
55 Assert.AreEqual(3, (int)a[3]);
56
57 Assert.AreEqual(null, a[4]);
58
59 }
60
61 [Test]
62 [ExpectedException(typeof(ArgumentNullException), ExpectedMessage = @"Value cannot be null.
63Parameter name: array")]
64 public void GenericCollectionCopyToNullArrayShouldThrow()
65 {
66 JArray j = new JArray();
67 ((ICollection<JToken>)j).CopyTo(null, 0);
68 }
69
70 [Test]
71 [ExpectedException(typeof(ArgumentOutOfRangeException), ExpectedMessage = @"arrayIndex is less than 0.
72Parameter name: arrayIndex")]
73 public void GenericCollectionCopyToNegativeArrayIndexShouldThrow()
74 {
75 JArray j = new JArray();
76 ((ICollection<JToken>)j).CopyTo(new JToken[1], -1);
77 }
78
79 [Test]
80 [ExpectedException(typeof(ArgumentException), ExpectedMessage = @"arrayIndex is equal to or greater than the length of array.")]
81 public void GenericCollectionCopyToArrayIndexEqualGreaterToArrayLengthShouldThrow()
82 {
83 JArray j = new JArray();
84 ((ICollection<JToken>)j).CopyTo(new JToken[1], 1);
85 }
86
87 [Test]
88 [ExpectedException(typeof(ArgumentException), ExpectedMessage = @"The number of elements in the source JObject is greater than the available space from arrayIndex to the end of the destination array.")]
89 public void GenericCollectionCopyToInsufficientArrayCapacity()
90 {
91 JArray j = new JArray();
92 j.Add(new JValue(1));
93 j.Add(new JValue(2));
94 j.Add(new JValue(3));
95
96 ((ICollection<JToken>)j).CopyTo(new JToken[3], 1);
97 }
98
99 [Test]
100 public void Remove()
101 {
102 JValue v = new JValue(1);
103 JArray j = new JArray();
104 j.Add(v);
105
106 Assert.AreEqual(1, j.Count);
107
108 Assert.AreEqual(false, j.Remove(new JValue(1)));
109 Assert.AreEqual(false, j.Remove(null));
110 Assert.AreEqual(true, j.Remove(v));
111 Assert.AreEqual(false, j.Remove(v));
112
113 Assert.AreEqual(0, j.Count);
114 }
115
116 [Test]
117 public void IndexOf()
118 {
119 JValue v1 = new JValue(1);
120 JValue v2 = new JValue(1);
121 JValue v3 = new JValue(1);
122
123 JArray j = new JArray();
124
125 j.Add(v1);
126 Assert.AreEqual(0, j.IndexOf(v1));
127
128 j.Add(v2);
129 Assert.AreEqual(0, j.IndexOf(v1));
130 Assert.AreEqual(1, j.IndexOf(v2));
131
132 j.AddFirst(v3);
133 Assert.AreEqual(1, j.IndexOf(v1));
134 Assert.AreEqual(2, j.IndexOf(v2));
135 Assert.AreEqual(0, j.IndexOf(v3));
136
137 v3.Remove();
138 Assert.AreEqual(0, j.IndexOf(v1));
139 Assert.AreEqual(1, j.IndexOf(v2));
140 Assert.AreEqual(-1, j.IndexOf(v3));
141 }
142
143 [Test]
144 public void RemoveAt()
145 {
146 JValue v1 = new JValue(1);
147 JValue v2 = new JValue(1);
148 JValue v3 = new JValue(1);
149
150 JArray j = new JArray();
151
152 j.Add(v1);
153 j.Add(v2);
154 j.Add(v3);
155
156 Assert.AreEqual(true, j.Contains(v1));
157 j.RemoveAt(0);
158 Assert.AreEqual(false, j.Contains(v1));
159
160 Assert.AreEqual(true, j.Contains(v3));
161 j.RemoveAt(1);
162 Assert.AreEqual(false, j.Contains(v3));
163
164 Assert.AreEqual(1, j.Count);
165 }
166
167 [Test]
168 [ExpectedException(typeof(ArgumentOutOfRangeException), ExpectedMessage = @"Index is equal to or greater than Count.
169Parameter name: index")]
170 public void RemoveAtOutOfRangeIndexShouldError()
171 {
172 JArray j = new JArray();
173 j.RemoveAt(0);
174 }
175
176 [Test]
177 [ExpectedException(typeof(ArgumentOutOfRangeException), ExpectedMessage = @"Index is less than 0.
178Parameter name: index")]
179 public void RemoveAtNegativeIndexShouldError()
180 {
181 JArray j = new JArray();
182 j.RemoveAt(-1);
183 }
184
185 [Test]
186 public void Insert()
187 {
188 JValue v1 = new JValue(1);
189 JValue v2 = new JValue(2);
190 JValue v3 = new JValue(3);
191 JValue v4 = new JValue(4);
192
193 JArray j = new JArray();
194
195 j.Add(v1);
196 j.Add(v2);
197 j.Add(v3);
198 j.Insert(1, v4);
199
200 Assert.AreEqual(0, j.IndexOf(v1));
201 Assert.AreEqual(1, j.IndexOf(v4));
202 Assert.AreEqual(2, j.IndexOf(v2));
203 Assert.AreEqual(3, j.IndexOf(v3));
204 }
205
206 [Test]
207 public void AddFirstAddedTokenShouldBeFirst()
208 {
209 JValue v1 = new JValue(1);
210 JValue v2 = new JValue(2);
211 JValue v3 = new JValue(3);
212
213 JArray j = new JArray();
214 Assert.AreEqual(null, j.First);
215 Assert.AreEqual(null, j.Last);
216
217 j.AddFirst(v1);
218 Assert.AreEqual(v1, j.First);
219 Assert.AreEqual(v1, j.Last);
220
221 j.AddFirst(v2);
222 Assert.AreEqual(v2, j.First);
223 Assert.AreEqual(v1, j.Last);
224
225 j.AddFirst(v3);
226 Assert.AreEqual(v3, j.First);
227 Assert.AreEqual(v1, j.Last);
228 }
229
230 [Test]
231 public void InsertShouldInsertAtZeroIndex()
232 {
233 JValue v1 = new JValue(1);
234 JValue v2 = new JValue(2);
235
236 JArray j = new JArray();
237
238 j.Insert(0, v1);
239 Assert.AreEqual(0, j.IndexOf(v1));
240
241 j.Insert(0, v2);
242 Assert.AreEqual(1, j.IndexOf(v1));
243 Assert.AreEqual(0, j.IndexOf(v2));
244 }
245
246 [Test]
247 public void InsertNull()
248 {
249 JArray j = new JArray();
250 j.Insert(0, null);
251
252 Assert.AreEqual(null, ((JValue)j[0]).Value);
253 }
254
255 [Test]
256 [ExpectedException(typeof(ArgumentOutOfRangeException), ExpectedMessage = @"Index was out of range. Must be non-negative and less than the size of the collection.
257Parameter name: index")]
258 public void InsertNegativeIndexShouldThrow()
259 {
260 JArray j = new JArray();
261 j.Insert(-1, new JValue(1));
262 }
263
264 [Test]
265 [ExpectedException(typeof(ArgumentOutOfRangeException), ExpectedMessage = @"Index must be within the bounds of the List.
266Parameter name: index")]
267 public void InsertOutOfRangeIndexShouldThrow()
268 {
269 JArray j = new JArray();
270 j.Insert(2, new JValue(1));
271 }
272
273 [Test]
274 public void Item()
275 {
276 JValue v1 = new JValue(1);
277 JValue v2 = new JValue(2);
278 JValue v3 = new JValue(3);
279 JValue v4 = new JValue(4);
280
281 JArray j = new JArray();
282
283 j.Add(v1);
284 j.Add(v2);
285 j.Add(v3);
286
287 j[1] = v4;
288
289 Assert.AreEqual(null, v2.Parent);
290 Assert.AreEqual(-1, j.IndexOf(v2));
291 Assert.AreEqual(j, v4.Parent);
292 Assert.AreEqual(1, j.IndexOf(v4));
293 }
294
295 [Test]
296 [ExpectedException(typeof(Exception), ExpectedMessage = "Error reading JArray from JsonReader. Current JsonReader item is not an array: StartObject")]
297 public void Parse_ShouldThrowOnUnexpectedToken()
298 {
299 string json = @"{""prop"":""value""}";
300 JArray.Parse(json);
301 }
302
303 public class ListItemFields
304 {
305 public string ListItemText { get; set; }
306 public object ListItemValue { get; set; }
307 }
308
309 [Test]
310 public void ArrayOrder()
311 {
312 string itemZeroText = "Zero text";
313
314 IEnumerable<ListItemFields> t = new List<ListItemFields>
315 {
316 new ListItemFields { ListItemText = "First", ListItemValue = 1 },
317 new ListItemFields { ListItemText = "Second", ListItemValue = 2 },
318 new ListItemFields { ListItemText = "Third", ListItemValue = 3 }
319 };
320
321 JObject optionValues =
322 new JObject(
323 new JProperty("options",
324 new JArray(
325 new JObject(
326 new JProperty("text", itemZeroText),
327 new JProperty("value", "0")),
328 from r in t
329 orderby r.ListItemValue
330 select new JObject(
331 new JProperty("text", r.ListItemText),
332 new JProperty("value", r.ListItemValue.ToString())))));
333
334 string result = "myOptions = " + optionValues.ToString();
335
336 Assert.AreEqual(@"myOptions = {
337 ""options"": [
338 {
339 ""text"": ""Zero text"",
340 ""value"": ""0""
341 },
342 {
343 ""text"": ""First"",
344 ""value"": ""1""
345 },
346 {
347 ""text"": ""Second"",
348 ""value"": ""2""
349 },
350 {
351 ""text"": ""Third"",
352 ""value"": ""3""
353 }
354 ]
355}", result);
356 }
357
358 [Test]
359 public void Iterate()
360 {
361 JArray a = new JArray(1, 2, 3, 4, 5);
362
363 int i = 1;
364 foreach (JToken token in a)
365 {
366 Assert.AreEqual(i, (int)token);
367 i++;
368 }
369 }
370
371
372#if !(SILVERLIGHT || MONOTOUCH || MONODROID)
373 [Test]
374 public void ITypedListGetItemProperties()
375 {
376 JProperty p1 = new JProperty("Test1", 1);
377 JProperty p2 = new JProperty("Test2", "Two");
378 ITypedList a = new JArray(new JObject(p1, p2));
379
380 PropertyDescriptorCollection propertyDescriptors = a.GetItemProperties(null);
381 Assert.IsNotNull(propertyDescriptors);
382 Assert.AreEqual(2, propertyDescriptors.Count);
383 Assert.AreEqual("Test1", propertyDescriptors[0].Name);
384 Assert.AreEqual("Test2", propertyDescriptors[1].Name);
385 }
386#endif
387
388 [Test]
389 public void AddArrayToSelf()
390 {
391 JArray a = new JArray(1, 2);
392 a.Add(a);
393
394 Assert.AreEqual(3, a.Count);
395 Assert.AreEqual(1, (int)a[0]);
396 Assert.AreEqual(2, (int)a[1]);
397 Assert.AreNotSame(a, a[2]);
398 }
399
400 [Test]
401 [ExpectedException(typeof(ArgumentException), ExpectedMessage = @"Set JArray values with invalid key value: ""badvalue"". Array position index expected.")]
402 public void SetValueWithInvalidIndex()
403 {
404 JArray a = new JArray();
405 a["badvalue"] = new JValue(3);
406 }
407
408 [Test]
409 public void SetValue()
410 {
411 object key = 0;
412
413 JArray a = new JArray((object)null);
414 a[key] = new JValue(3);
415
416 Assert.AreEqual(3, (int)a[key]);
417 }
418
419 [Test]
420 public void ReplaceAll()
421 {
422 JArray a = new JArray(new [] { 1, 2, 3 });
423 Assert.AreEqual(3, a.Count);
424 Assert.AreEqual(1, (int)a[0]);
425 Assert.AreEqual(2, (int)a[1]);
426 Assert.AreEqual(3, (int)a[2]);
427
428 a.ReplaceAll(1);
429 Assert.AreEqual(1, a.Count);
430 Assert.AreEqual(1, (int)a[0]);
431 }
432
433 [Test]
434 [ExpectedException(typeof(Exception), ExpectedMessage = "Unexpected end of content while loading JArray.")]
435 public void ParseIncomplete()
436 {
437 JArray.Parse("[1");
438 }
439 }
440}