PageRenderTime 72ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/test/System.Json.Test.Unit/JsonArrayTest.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 604 lines | 513 code | 90 blank | 1 comment | 11 complexity | 5239e9c15eba7a7d6ae710d443faffae MD5 | raw file
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Linq;
  5. using System.Runtime.Serialization.Json;
  6. using Xunit;
  7. namespace System.Json
  8. {
  9. public class JsonArrayTest
  10. {
  11. [Fact]
  12. public void JsonArrayConstructorParamsTest()
  13. {
  14. JsonArray target;
  15. target = new JsonArray();
  16. Assert.Equal(0, target.Count);
  17. target = new JsonArray(null);
  18. Assert.Equal(0, target.Count);
  19. List<JsonValue> items = new List<JsonValue> { AnyInstance.AnyJsonValue1, AnyInstance.AnyJsonValue2 };
  20. target = new JsonArray(items.ToArray());
  21. ValidateJsonArrayItems(target, items);
  22. target = new JsonArray(items[0], items[1]);
  23. ValidateJsonArrayItems(target, items);
  24. // Invalide tests
  25. items.Add(AnyInstance.DefaultJsonValue);
  26. ExceptionHelper.Throws<ArgumentException>(() => new JsonArray(items.ToArray()));
  27. ExceptionHelper.Throws<ArgumentException>(() => new JsonArray(items[0], items[1], items[2]));
  28. }
  29. [Fact]
  30. public void JsonArrayConstructorEnumTest()
  31. {
  32. List<JsonValue> items = new List<JsonValue> { AnyInstance.AnyJsonValue1, AnyInstance.AnyJsonValue2, AnyInstance.AnyJsonValue3 };
  33. JsonArray target;
  34. target = new JsonArray(items);
  35. ValidateJsonArrayItems(target, items);
  36. ExceptionHelper.Throws<ArgumentNullException>(() => new JsonArray((IEnumerable<JsonValue>)null));
  37. items.Add(AnyInstance.DefaultJsonValue);
  38. ExceptionHelper.Throws<ArgumentException>(() => new JsonArray(items));
  39. }
  40. [Fact]
  41. public void AddTest()
  42. {
  43. JsonArray target = new JsonArray();
  44. JsonValue item = AnyInstance.AnyJsonValue1;
  45. Assert.False(target.Contains(item));
  46. target.Add(item);
  47. Assert.Equal(1, target.Count);
  48. Assert.Equal(item, target[0]);
  49. Assert.True(target.Contains(item));
  50. ExceptionHelper.Throws<ArgumentException>(() => target.Add(AnyInstance.DefaultJsonValue));
  51. }
  52. [Fact]
  53. public void AddRangeEnumTest()
  54. {
  55. List<JsonValue> items = new List<JsonValue> { AnyInstance.AnyJsonValue1, AnyInstance.AnyJsonValue2 };
  56. JsonArray target = new JsonArray();
  57. target.AddRange(items);
  58. ValidateJsonArrayItems(target, items);
  59. ExceptionHelper.Throws<ArgumentNullException>(() => new JsonArray().AddRange((IEnumerable<JsonValue>)null));
  60. items.Add(AnyInstance.DefaultJsonValue);
  61. ExceptionHelper.Throws<ArgumentException>(() => new JsonArray().AddRange(items));
  62. }
  63. [Fact]
  64. public void AddRangeParamsTest()
  65. {
  66. List<JsonValue> items = new List<JsonValue> { AnyInstance.AnyJsonValue1, AnyInstance.AnyJsonValue2, AnyInstance.AnyJsonValue3 };
  67. JsonArray target;
  68. target = new JsonArray();
  69. target.AddRange(items[0], items[1], items[2]);
  70. ValidateJsonArrayItems(target, items);
  71. target = new JsonArray();
  72. target.AddRange(items.ToArray());
  73. ValidateJsonArrayItems(target, items);
  74. target.AddRange();
  75. ValidateJsonArrayItems(target, items);
  76. items.Add(AnyInstance.DefaultJsonValue);
  77. ExceptionHelper.Throws<ArgumentException>(() => new JsonArray().AddRange(items[items.Count - 1]));
  78. ExceptionHelper.Throws<ArgumentException>(() => new JsonArray().AddRange(items));
  79. }
  80. [Fact]
  81. public void ClearTest()
  82. {
  83. JsonArray target = new JsonArray(AnyInstance.AnyJsonValue1, AnyInstance.AnyJsonValue2);
  84. Assert.Equal(2, target.Count);
  85. target.Clear();
  86. Assert.Equal(0, target.Count);
  87. }
  88. [Fact]
  89. public void ContainsTest()
  90. {
  91. JsonValue item1 = AnyInstance.AnyJsonValue1;
  92. JsonValue item2 = AnyInstance.AnyJsonValue2;
  93. JsonArray target = new JsonArray(item1);
  94. Assert.True(target.Contains(item1));
  95. Assert.False(target.Contains(item2));
  96. target.Add(item2);
  97. Assert.True(target.Contains(item1));
  98. Assert.True(target.Contains(item2));
  99. target.Remove(item1);
  100. Assert.False(target.Contains(item1));
  101. Assert.True(target.Contains(item2));
  102. }
  103. [Fact]
  104. public void ReadAsComplexTypeTest()
  105. {
  106. JsonArray target = new JsonArray(AnyInstance.AnyInt, AnyInstance.AnyInt + 1, AnyInstance.AnyInt + 2);
  107. int[] intArray1 = (int[])target.ReadAsType(typeof(int[]));
  108. int[] intArray2 = target.ReadAsType<int[]>();
  109. Assert.Equal(((JsonArray)target).Count, intArray1.Length);
  110. Assert.Equal(((JsonArray)target).Count, intArray2.Length);
  111. for (int i = 0; i < intArray1.Length; i++)
  112. {
  113. Assert.Equal(AnyInstance.AnyInt + i, intArray1[i]);
  114. Assert.Equal(AnyInstance.AnyInt + i, intArray2[i]);
  115. }
  116. }
  117. [Fact]
  118. public void CopyToTest()
  119. {
  120. JsonValue item1 = AnyInstance.AnyJsonValue1;
  121. JsonValue item2 = AnyInstance.AnyJsonValue2;
  122. JsonArray target = new JsonArray(item1, item2);
  123. JsonValue[] array = new JsonValue[target.Count + 1];
  124. target.CopyTo(array, 0);
  125. Assert.Equal(item1, array[0]);
  126. Assert.Equal(item2, array[1]);
  127. target.CopyTo(array, 1);
  128. Assert.Equal(item1, array[1]);
  129. Assert.Equal(item2, array[2]);
  130. ExceptionHelper.Throws<ArgumentNullException>(() => target.CopyTo(null, 0));
  131. ExceptionHelper.Throws<ArgumentOutOfRangeException>(() => target.CopyTo(array, -1));
  132. ExceptionHelper.Throws<ArgumentException>(() => target.CopyTo(array, array.Length - target.Count + 1));
  133. }
  134. [Fact]
  135. public void IndexOfTest()
  136. {
  137. JsonValue item1 = AnyInstance.AnyJsonValue1;
  138. JsonValue item2 = AnyInstance.AnyJsonValue2;
  139. JsonValue item3 = AnyInstance.AnyJsonValue3;
  140. JsonArray target = new JsonArray(item1, item2);
  141. Assert.Equal(0, target.IndexOf(item1));
  142. Assert.Equal(1, target.IndexOf(item2));
  143. Assert.Equal(-1, target.IndexOf(item3));
  144. }
  145. [Fact]
  146. public void InsertTest()
  147. {
  148. JsonValue item1 = AnyInstance.AnyJsonValue1;
  149. JsonValue item2 = AnyInstance.AnyJsonValue2;
  150. JsonValue item3 = AnyInstance.AnyJsonValue3;
  151. JsonArray target = new JsonArray(item1);
  152. Assert.Equal(1, target.Count);
  153. target.Insert(0, item2);
  154. Assert.Equal(2, target.Count);
  155. Assert.Equal(item2, target[0]);
  156. Assert.Equal(item1, target[1]);
  157. target.Insert(1, item3);
  158. Assert.Equal(3, target.Count);
  159. Assert.Equal(item2, target[0]);
  160. Assert.Equal(item3, target[1]);
  161. Assert.Equal(item1, target[2]);
  162. target.Insert(target.Count, item2);
  163. Assert.Equal(4, target.Count);
  164. Assert.Equal(item2, target[0]);
  165. Assert.Equal(item3, target[1]);
  166. Assert.Equal(item1, target[2]);
  167. Assert.Equal(item2, target[3]);
  168. ExceptionHelper.Throws<ArgumentOutOfRangeException>(() => target.Insert(-1, item3));
  169. ExceptionHelper.Throws<ArgumentOutOfRangeException>(() => target.Insert(target.Count + 1, item1));
  170. ExceptionHelper.Throws<ArgumentException>(() => target.Insert(0, AnyInstance.DefaultJsonValue));
  171. }
  172. [Fact]
  173. public void RemoveTest()
  174. {
  175. JsonValue item1 = AnyInstance.AnyJsonValue1;
  176. JsonValue item2 = AnyInstance.AnyJsonValue2;
  177. JsonValue item3 = AnyInstance.AnyJsonValue3;
  178. JsonArray target = new JsonArray(item1, item2, item3);
  179. Assert.True(target.Remove(item2));
  180. Assert.Equal(2, target.Count);
  181. Assert.Equal(item1, target[0]);
  182. Assert.Equal(item3, target[1]);
  183. Assert.False(target.Remove(item2));
  184. Assert.Equal(2, target.Count);
  185. }
  186. [Fact]
  187. public void RemoveAtTest()
  188. {
  189. JsonValue item1 = AnyInstance.AnyJsonValue1;
  190. JsonValue item2 = AnyInstance.AnyJsonValue2;
  191. JsonValue item3 = AnyInstance.AnyJsonValue3;
  192. JsonArray target = new JsonArray(item1, item2, item3);
  193. target.RemoveAt(1);
  194. Assert.Equal(2, target.Count);
  195. Assert.Equal(item1, target[0]);
  196. Assert.Equal(item3, target[1]);
  197. ExceptionHelper.Throws<ArgumentOutOfRangeException>(() => target.RemoveAt(-1));
  198. ExceptionHelper.Throws<ArgumentOutOfRangeException>(() => target.RemoveAt(target.Count));
  199. }
  200. [Fact]
  201. public void ToStringTest()
  202. {
  203. JsonArray target;
  204. JsonValue item1 = AnyInstance.AnyJsonValue1;
  205. JsonValue item2 = null;
  206. JsonValue item3 = AnyInstance.AnyJsonValue2;
  207. target = new JsonArray(item1, item2, item3);
  208. string expected = String.Format(CultureInfo.InvariantCulture, "[{0},null,{1}]", item1.ToString(), item3.ToString());
  209. Assert.Equal(expected, target.ToString());
  210. string json = "[\r\n \"hello\",\r\n null,\r\n [\r\n 1,\r\n 2,\r\n 3\r\n ]\r\n]";
  211. target = JsonValue.Parse(json) as JsonArray;
  212. Assert.Equal<string>(json.Replace("\r\n", "").Replace(" ", ""), target.ToString());
  213. }
  214. [Fact]
  215. public void GetEnumeratorTest()
  216. {
  217. JsonValue item1 = AnyInstance.AnyJsonValue1;
  218. JsonValue item2 = AnyInstance.AnyJsonValue2;
  219. IEnumerable<JsonValue> target = new JsonArray(item1, item2);
  220. IEnumerator<JsonValue> enumerator = target.GetEnumerator();
  221. Assert.True(enumerator.MoveNext());
  222. Assert.Equal(item1, enumerator.Current);
  223. Assert.True(enumerator.MoveNext());
  224. Assert.Equal(item2, enumerator.Current);
  225. Assert.False(enumerator.MoveNext());
  226. }
  227. [Fact]
  228. public void GetEnumeratorTest1()
  229. {
  230. JsonValue item1 = AnyInstance.AnyJsonValue1;
  231. JsonValue item2 = AnyInstance.AnyJsonValue2;
  232. IEnumerable target = new JsonArray(item1, item2);
  233. IEnumerator enumerator = target.GetEnumerator();
  234. Assert.True(enumerator.MoveNext());
  235. Assert.Equal(item1, enumerator.Current);
  236. Assert.True(enumerator.MoveNext());
  237. Assert.Equal(item2, enumerator.Current);
  238. Assert.False(enumerator.MoveNext());
  239. }
  240. [Fact]
  241. public void CountTest()
  242. {
  243. JsonValue item1 = AnyInstance.AnyJsonValue1;
  244. JsonValue item2 = AnyInstance.AnyJsonValue2;
  245. JsonArray target = new JsonArray();
  246. Assert.Equal(0, target.Count);
  247. target.Add(item1);
  248. Assert.Equal(1, target.Count);
  249. target.Add(item2);
  250. Assert.Equal(2, target.Count);
  251. target.Remove(item1);
  252. Assert.Equal(1, target.Count);
  253. }
  254. [Fact]
  255. public void IsReadOnlyTest()
  256. {
  257. JsonArray target = AnyInstance.AnyJsonArray;
  258. Assert.False(target.IsReadOnly);
  259. }
  260. [Fact]
  261. public void ItemTest()
  262. {
  263. JsonValue item1 = AnyInstance.AnyJsonValue1;
  264. JsonValue item2 = AnyInstance.AnyJsonValue2;
  265. JsonArray target = new JsonArray(item1);
  266. Assert.Equal(item1, target[0]);
  267. target[0] = item2;
  268. Assert.Equal(item2, target[0]);
  269. Assert.Equal(item2, target[(short)0]);
  270. Assert.Equal(item2, target[(ushort)0]);
  271. Assert.Equal(item2, target[(byte)0]);
  272. Assert.Equal(item2, target[(sbyte)0]);
  273. Assert.Equal(item2, target[(char)0]);
  274. ExceptionHelper.Throws<ArgumentOutOfRangeException>(delegate { var i = target[-1]; });
  275. ExceptionHelper.Throws<ArgumentOutOfRangeException>(delegate { var i = target[target.Count]; });
  276. ExceptionHelper.Throws<ArgumentOutOfRangeException>(delegate { target[-1] = AnyInstance.AnyJsonValue1; });
  277. ExceptionHelper.Throws<ArgumentOutOfRangeException>(delegate { target[target.Count] = AnyInstance.AnyJsonValue2; });
  278. ExceptionHelper.Throws<ArgumentException>(delegate { target[0] = AnyInstance.DefaultJsonValue; });
  279. }
  280. [Fact]
  281. public void ChangingEventsTest()
  282. {
  283. JsonArray ja = new JsonArray(AnyInstance.AnyInt, AnyInstance.AnyBool, null);
  284. TestEvents(
  285. ja,
  286. arr => arr.Add(1),
  287. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  288. {
  289. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(1, JsonValueChange.Add, 3)),
  290. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(1, JsonValueChange.Add, 3)),
  291. });
  292. TestEvents(
  293. ja,
  294. arr => arr.AddRange(AnyInstance.AnyString, AnyInstance.AnyDouble),
  295. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  296. {
  297. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(AnyInstance.AnyString, JsonValueChange.Add, 4)),
  298. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(AnyInstance.AnyDouble, JsonValueChange.Add, 5)),
  299. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(AnyInstance.AnyString, JsonValueChange.Add, 4)),
  300. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(AnyInstance.AnyDouble, JsonValueChange.Add, 5)),
  301. });
  302. TestEvents(
  303. ja,
  304. arr => arr[1] = 2,
  305. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  306. {
  307. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(2, JsonValueChange.Replace, 1)),
  308. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(AnyInstance.AnyBool, JsonValueChange.Replace, 1)),
  309. });
  310. ja = new JsonArray { 1, 2, 3 };
  311. TestEvents(
  312. ja,
  313. arr => arr.Insert(1, "new value"),
  314. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  315. {
  316. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs("new value", JsonValueChange.Add, 1)),
  317. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs("new value", JsonValueChange.Add, 1)),
  318. });
  319. TestEvents(
  320. ja,
  321. arr => arr.RemoveAt(1),
  322. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  323. {
  324. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs("new value", JsonValueChange.Remove, 1)),
  325. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs("new value", JsonValueChange.Remove, 1)),
  326. });
  327. TestEvents(
  328. ja,
  329. arr => arr.Clear(),
  330. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  331. {
  332. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0)),
  333. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0)),
  334. });
  335. ja = new JsonArray(1, 2, 3);
  336. TestEvents(
  337. ja,
  338. arr => arr.Remove(new JsonPrimitive("Not there")),
  339. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>());
  340. JsonValue elementInArray = ja[1];
  341. TestEvents(
  342. ja,
  343. arr => arr.Remove(elementInArray),
  344. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  345. {
  346. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(elementInArray, JsonValueChange.Remove, 1)),
  347. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(elementInArray, JsonValueChange.Remove, 1)),
  348. });
  349. }
  350. [Fact]
  351. public void NestedChangingEventTest()
  352. {
  353. JsonArray target = new JsonArray { new JsonArray { 1, 2 }, new JsonArray { 3, 4 } };
  354. JsonArray child = target[1] as JsonArray;
  355. TestEvents(
  356. target,
  357. arr => ((JsonArray)arr[1]).Add(5),
  358. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>());
  359. target = new JsonArray();
  360. child = new JsonArray(1, 2);
  361. TestEvents(
  362. target,
  363. arr =>
  364. {
  365. arr.Add(child);
  366. ((JsonArray)arr[0]).Add(5);
  367. },
  368. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  369. {
  370. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, target, new JsonValueChangeEventArgs(child, JsonValueChange.Add, 0)),
  371. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, target, new JsonValueChangeEventArgs(child, JsonValueChange.Add, 0)),
  372. });
  373. }
  374. [Fact]
  375. public void MultipleListenersTest()
  376. {
  377. for (int changingListeners = 0; changingListeners <= 2; changingListeners++)
  378. {
  379. for (int changedListeners = 0; changedListeners <= 2; changedListeners++)
  380. {
  381. MultipleListenersTestHelper<JsonArray>(
  382. () => new JsonArray(1, 2),
  383. delegate(JsonArray arr)
  384. {
  385. arr[1] = "hello";
  386. arr.RemoveAt(0);
  387. arr.Add("world");
  388. arr.Clear();
  389. },
  390. new List<JsonValueChangeEventArgs>
  391. {
  392. new JsonValueChangeEventArgs("hello", JsonValueChange.Replace, 1),
  393. new JsonValueChangeEventArgs(1, JsonValueChange.Remove, 0),
  394. new JsonValueChangeEventArgs("world", JsonValueChange.Add, 1),
  395. new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0),
  396. },
  397. new List<JsonValueChangeEventArgs>
  398. {
  399. new JsonValueChangeEventArgs(2, JsonValueChange.Replace, 1),
  400. new JsonValueChangeEventArgs(1, JsonValueChange.Remove, 0),
  401. new JsonValueChangeEventArgs("world", JsonValueChange.Add, 1),
  402. new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0),
  403. },
  404. changingListeners,
  405. changedListeners);
  406. }
  407. }
  408. }
  409. [Fact]
  410. public void JsonTypeTest()
  411. {
  412. JsonArray target = AnyInstance.AnyJsonArray;
  413. Assert.Equal(JsonType.Array, target.JsonType);
  414. }
  415. internal static void TestEvents<JsonValueType>(JsonValueType target, Action<JsonValueType> actionToTriggerEvent, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents) where JsonValueType : JsonValue
  416. {
  417. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> actualEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  418. EventHandler<JsonValueChangeEventArgs> changingHandler = delegate(object sender, JsonValueChangeEventArgs e)
  419. {
  420. actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
  421. };
  422. EventHandler<JsonValueChangeEventArgs> changedHandler = delegate(object sender, JsonValueChangeEventArgs e)
  423. {
  424. actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
  425. };
  426. target.Changing += new EventHandler<JsonValueChangeEventArgs>(changingHandler);
  427. target.Changed += new EventHandler<JsonValueChangeEventArgs>(changedHandler);
  428. actionToTriggerEvent(target);
  429. target.Changing -= new EventHandler<JsonValueChangeEventArgs>(changingHandler);
  430. target.Changed -= new EventHandler<JsonValueChangeEventArgs>(changedHandler);
  431. ValidateExpectedEvents(expectedEvents, actualEvents);
  432. }
  433. private static void TestEvents(JsonArray array, Action<JsonArray> actionToTriggerEvent, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents)
  434. {
  435. TestEvents<JsonArray>(array, actionToTriggerEvent, expectedEvents);
  436. }
  437. private static void ValidateExpectedEvents(List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> actualEvents)
  438. {
  439. Assert.Equal(expectedEvents.Count, actualEvents.Count);
  440. for (int i = 0; i < expectedEvents.Count; i++)
  441. {
  442. bool expectedIsChanging = expectedEvents[i].Item1;
  443. bool actualIsChanging = expectedEvents[i].Item1;
  444. Assert.Equal(expectedIsChanging, actualIsChanging);
  445. JsonValue expectedSender = expectedEvents[i].Item2;
  446. JsonValue actualSender = actualEvents[i].Item2;
  447. Assert.Same(expectedSender, actualSender);
  448. JsonValueChangeEventArgs expectedEventArgs = expectedEvents[i].Item3;
  449. JsonValueChangeEventArgs actualEventArgs = actualEvents[i].Item3;
  450. Assert.Equal(expectedEventArgs.Change, actualEventArgs.Change);
  451. Assert.Equal(expectedEventArgs.Index, actualEventArgs.Index);
  452. Assert.Equal(expectedEventArgs.Key, actualEventArgs.Key);
  453. string expectedChild = expectedEventArgs.Child == null ? "null" : expectedEventArgs.Child.ToString();
  454. string actualChild = actualEventArgs.Child == null ? "null" : actualEventArgs.Child.ToString();
  455. Assert.Equal(expectedChild, actualChild);
  456. }
  457. }
  458. internal static void MultipleListenersTestHelper<JsonValueType>(
  459. Func<JsonValueType> createTarget,
  460. Action<JsonValueType> actionToTriggerEvents,
  461. List<JsonValueChangeEventArgs> expectedChangingEventArgs,
  462. List<JsonValueChangeEventArgs> expectedChangedEventArgs,
  463. int changingListeners,
  464. int changedListeners) where JsonValueType : JsonValue
  465. {
  466. Console.WriteLine("Testing events on a {0} for {1} changING listeners and {2} changED listeners", typeof(JsonValueType).Name, changingListeners, changedListeners);
  467. JsonValueType target = createTarget();
  468. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[] actualChangingEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[changingListeners];
  469. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[] actualChangedEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[changedListeners];
  470. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedChangingEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>(
  471. expectedChangingEventArgs.Select((args) => new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, target, args)));
  472. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedChangedEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>(
  473. expectedChangedEventArgs.Select((args) => new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, target, args)));
  474. for (int i = 0; i < changingListeners; i++)
  475. {
  476. actualChangingEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  477. int index = i;
  478. target.Changing += delegate(object sender, JsonValueChangeEventArgs e)
  479. {
  480. actualChangingEvents[index].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
  481. };
  482. }
  483. for (int i = 0; i < changedListeners; i++)
  484. {
  485. actualChangedEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  486. int index = i;
  487. target.Changed += delegate(object sender, JsonValueChangeEventArgs e)
  488. {
  489. actualChangedEvents[index].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
  490. };
  491. }
  492. actionToTriggerEvents(target);
  493. for (int i = 0; i < changingListeners; i++)
  494. {
  495. Console.WriteLine("Validating Changing events for listener {0}", i);
  496. ValidateExpectedEvents(expectedChangingEvents, actualChangingEvents[i]);
  497. }
  498. for (int i = 0; i < changedListeners; i++)
  499. {
  500. Console.WriteLine("Validating Changed events for listener {0}", i);
  501. ValidateExpectedEvents(expectedChangedEvents, actualChangedEvents[i]);
  502. }
  503. }
  504. private static void ValidateJsonArrayItems(JsonArray jsonArray, IEnumerable<JsonValue> expectedItems)
  505. {
  506. List<JsonValue> expected = new List<JsonValue>(expectedItems);
  507. Assert.Equal(expected.Count, jsonArray.Count);
  508. for (int i = 0; i < expected.Count; i++)
  509. {
  510. Assert.Equal(expected[i], jsonArray[i]);
  511. }
  512. }
  513. }
  514. }