PageRenderTime 55ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/test/System.Json.Test.Integration/JsonValueEventsTests.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 518 lines | 450 code | 53 blank | 15 comment | 16 complexity | 9aea45e6dd55538641524099d14780e1 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Xunit;
  4. namespace System.Json
  5. {
  6. /// <summary>
  7. /// Tests for events on <see cref="JsonValue"/> instances.
  8. /// </summary>
  9. public class JsonValueEventsTests
  10. {
  11. /// <summary>
  12. /// Events tests for JsonArray, test all method the causes change and all change type and validate changing/changed child and sub/unsub
  13. /// </summary>
  14. [Fact]
  15. public void JsonArrayEventsTest()
  16. {
  17. int seed = 1;
  18. const int maxArrayLength = 1024;
  19. Random rand = new Random(seed);
  20. JsonArray ja = SpecialJsonValueHelper.CreatePrePopulatedJsonArray(seed, rand.Next(maxArrayLength));
  21. int addPosition = ja.Count;
  22. JsonValue insertValue = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
  23. TestEvents(
  24. ja,
  25. arr => arr.Add(insertValue),
  26. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  27. {
  28. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Add, addPosition)),
  29. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Add, addPosition)),
  30. });
  31. addPosition = ja.Count;
  32. JsonValue jv1 = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
  33. JsonValue jv2 = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
  34. TestEvents(
  35. ja,
  36. arr => arr.AddRange(jv1, jv2),
  37. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  38. {
  39. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja,
  40. new JsonValueChangeEventArgs(
  41. jv1,
  42. JsonValueChange.Add, addPosition)),
  43. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja,
  44. new JsonValueChangeEventArgs(
  45. jv2,
  46. JsonValueChange.Add, addPosition + 1)),
  47. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja,
  48. new JsonValueChangeEventArgs(
  49. jv1,
  50. JsonValueChange.Add, addPosition)),
  51. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja,
  52. new JsonValueChangeEventArgs(
  53. jv2,
  54. JsonValueChange.Add, addPosition + 1)),
  55. });
  56. int replacePosition = rand.Next(ja.Count - 1);
  57. JsonValue oldValue = ja[replacePosition];
  58. JsonValue newValue = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
  59. TestEvents(
  60. ja,
  61. arr => arr[replacePosition] = newValue,
  62. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  63. {
  64. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(newValue, JsonValueChange.Replace, replacePosition)),
  65. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(oldValue, JsonValueChange.Replace, replacePosition)),
  66. });
  67. int insertPosition = rand.Next(ja.Count - 1);
  68. insertValue = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
  69. TestEvents(
  70. ja,
  71. arr => arr.Insert(insertPosition, insertValue),
  72. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  73. {
  74. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Add, insertPosition)),
  75. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Add, insertPosition)),
  76. });
  77. TestEvents(
  78. ja,
  79. arr => arr.RemoveAt(insertPosition),
  80. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  81. {
  82. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Remove, insertPosition)),
  83. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Remove, insertPosition)),
  84. });
  85. ja.Insert(0, insertValue);
  86. TestEvents(
  87. ja,
  88. arr => arr.Remove(insertValue),
  89. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  90. {
  91. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Remove, 0)),
  92. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(insertValue, JsonValueChange.Remove, 0)),
  93. });
  94. TestEvents(
  95. ja,
  96. arr => arr.Clear(),
  97. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  98. {
  99. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0)),
  100. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0)),
  101. });
  102. ja = new JsonArray(1, 2, 3);
  103. TestEvents(
  104. ja,
  105. arr => arr.Remove(new JsonPrimitive("Not there")),
  106. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>());
  107. JsonValue elementInArray = ja[1];
  108. TestEvents(
  109. ja,
  110. arr => arr.Remove(elementInArray),
  111. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  112. {
  113. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(elementInArray, JsonValueChange.Remove, 1)),
  114. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(elementInArray, JsonValueChange.Remove, 1)),
  115. });
  116. }
  117. /// <summary>
  118. /// Tests for events for <see cref="JsonValue"/> instances when using the dynamic programming.
  119. /// </summary>
  120. [Fact]
  121. public void DynamicEventsTest()
  122. {
  123. int seed = 1;
  124. int maxObj = 10;
  125. JsonArray ja = new JsonArray();
  126. dynamic d = ja.AsDynamic();
  127. TestEventsDynamic(
  128. d,
  129. (Action<dynamic>)(arr => arr.Add(1)),
  130. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  131. {
  132. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, ja, new JsonValueChangeEventArgs(1, JsonValueChange.Add, 0)),
  133. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, ja, new JsonValueChangeEventArgs(1, JsonValueChange.Add, 0)),
  134. });
  135. const string key1 = "first";
  136. const string key2 = "second";
  137. JsonObject jo = new JsonObject
  138. {
  139. { key1, SpecialJsonValueHelper.GetRandomJsonPrimitives(seed) },
  140. };
  141. JsonObject objectToAdd = SpecialJsonValueHelper.CreateRandomPopulatedJsonObject(seed, maxObj);
  142. dynamic d2 = jo.AsDynamic();
  143. TestEventsDynamic(
  144. d2,
  145. (Action<dynamic>)(obj => obj[key2] = objectToAdd),
  146. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  147. {
  148. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(objectToAdd, JsonValueChange.Add, key2)),
  149. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(objectToAdd, JsonValueChange.Add, key2)),
  150. });
  151. TestEventsDynamic(
  152. d2,
  153. (Action<dynamic>)(obj => obj[key2] = objectToAdd),
  154. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  155. {
  156. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(objectToAdd, JsonValueChange.Replace, key2)),
  157. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(objectToAdd, JsonValueChange.Replace, key2)),
  158. });
  159. }
  160. /// <summary>
  161. /// Tests for events in <see cref="JsonObject"/> instances.
  162. /// </summary>
  163. [Fact]
  164. public void JsonObjectEventsTest()
  165. {
  166. int seed = 1;
  167. const int maxObj = 10;
  168. const string key1 = "first";
  169. const string key2 = "second";
  170. const string key3 = "third";
  171. const string key4 = "fourth";
  172. const string key5 = "fifth";
  173. JsonObject jo = new JsonObject
  174. {
  175. { key1, SpecialJsonValueHelper.GetRandomJsonPrimitives(seed) },
  176. { key2, SpecialJsonValueHelper.GetRandomJsonPrimitives(seed) },
  177. { key3, null },
  178. };
  179. JsonObject objToAdd = SpecialJsonValueHelper.CreateRandomPopulatedJsonObject(seed, maxObj);
  180. TestEvents(
  181. jo,
  182. obj => obj.Add(key4, objToAdd),
  183. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  184. {
  185. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(objToAdd, JsonValueChange.Add, key4)),
  186. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(objToAdd, JsonValueChange.Add, key4)),
  187. },
  188. obj => obj.Add("key44", objToAdd));
  189. JsonArray jaToAdd = SpecialJsonValueHelper.CreatePrePopulatedJsonArray(seed, maxObj);
  190. JsonValue replaced = jo[key2];
  191. TestEvents(
  192. jo,
  193. obj => obj[key2] = jaToAdd,
  194. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  195. {
  196. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jaToAdd, JsonValueChange.Replace, key2)),
  197. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(replaced, JsonValueChange.Replace, key2)),
  198. });
  199. JsonValue jpToAdd = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
  200. TestEvents(
  201. jo,
  202. obj => obj[key5] = jpToAdd,
  203. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  204. {
  205. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jpToAdd, JsonValueChange.Add, key5)),
  206. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(jpToAdd, JsonValueChange.Add, key5)),
  207. });
  208. jo.Remove(key4);
  209. jo.Remove(key5);
  210. JsonValue jp1 = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
  211. JsonValue jp2 = SpecialJsonValueHelper.GetRandomJsonPrimitives(seed);
  212. TestEvents(
  213. jo,
  214. obj => obj.AddRange(new JsonObject { { key4, jp1 }, { key5, jp1 } }),
  215. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  216. {
  217. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jp1, JsonValueChange.Add, key4)),
  218. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jp2, JsonValueChange.Add, key5)),
  219. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(jp1, JsonValueChange.Add, key4)),
  220. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(jp2, JsonValueChange.Add, key5)),
  221. },
  222. obj => obj.AddRange(new JsonObject { { "new key", jp1 }, { "newnewKey", jp2 } }));
  223. TestEvents(
  224. jo,
  225. obj => obj.Remove(key5),
  226. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  227. {
  228. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(jp2, JsonValueChange.Remove, key5)),
  229. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(jp2, JsonValueChange.Remove, key5)),
  230. });
  231. TestEvents(
  232. jo,
  233. obj => obj.Remove("not there"),
  234. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>());
  235. jo = new JsonObject { { key1, 1 }, { key2, 2 }, { key3, 3 } };
  236. TestEvents(
  237. jo,
  238. obj => obj.Clear(),
  239. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  240. {
  241. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null)),
  242. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null)),
  243. });
  244. jo = new JsonObject { { key1, 1 }, { key2, 2 }, { key3, 3 } };
  245. TestEvents(
  246. jo,
  247. obj => ((IDictionary<string, JsonValue>)obj).Remove(new KeyValuePair<string, JsonValue>(key2, jo[key2])),
  248. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  249. {
  250. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(2, JsonValueChange.Remove, key2)),
  251. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(2, JsonValueChange.Remove, key2)),
  252. },
  253. obj => ((IDictionary<string, JsonValue>)obj).Remove(new KeyValuePair<string, JsonValue>(key1, jo[key1])));
  254. }
  255. /// <summary>
  256. /// Tests for events in <see cref="JsonValue"/> instances when multiple listeners are registered.
  257. /// </summary>
  258. [Fact]
  259. public void MultipleListenersTest()
  260. {
  261. const string key1 = "first";
  262. const string key2 = "second";
  263. const string key3 = "third";
  264. for (int changingListeners = 0; changingListeners <= 3; changingListeners++)
  265. {
  266. for (int changedListeners = 0; changedListeners <= 3; changedListeners++)
  267. {
  268. MultipleListenersTestInternal<JsonObject>(
  269. () => new JsonObject { { key1, 1 }, { key2, 2 } },
  270. delegate(JsonObject obj)
  271. {
  272. obj[key2] = "hello";
  273. obj.Remove(key1);
  274. obj.Add(key3, "world");
  275. obj.Clear();
  276. },
  277. new List<JsonValueChangeEventArgs>
  278. {
  279. new JsonValueChangeEventArgs("hello", JsonValueChange.Replace, key2),
  280. new JsonValueChangeEventArgs(1, JsonValueChange.Remove, key1),
  281. new JsonValueChangeEventArgs("world", JsonValueChange.Add, key3),
  282. new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null),
  283. },
  284. new List<JsonValueChangeEventArgs>
  285. {
  286. new JsonValueChangeEventArgs(2, JsonValueChange.Replace, key2),
  287. new JsonValueChangeEventArgs(1, JsonValueChange.Remove, key1),
  288. new JsonValueChangeEventArgs("world", JsonValueChange.Add, key3),
  289. new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null),
  290. },
  291. changingListeners,
  292. changedListeners);
  293. MultipleListenersTestInternal<JsonArray>(
  294. () => new JsonArray(1, 2),
  295. delegate(JsonArray arr)
  296. {
  297. arr[1] = "hello";
  298. arr.RemoveAt(0);
  299. arr.Add("world");
  300. arr.Clear();
  301. },
  302. new List<JsonValueChangeEventArgs>
  303. {
  304. new JsonValueChangeEventArgs("hello", JsonValueChange.Replace, 1),
  305. new JsonValueChangeEventArgs(1, JsonValueChange.Remove, 0),
  306. new JsonValueChangeEventArgs("world", JsonValueChange.Add, 1),
  307. new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0),
  308. },
  309. new List<JsonValueChangeEventArgs>
  310. {
  311. new JsonValueChangeEventArgs(2, JsonValueChange.Replace, 1),
  312. new JsonValueChangeEventArgs(1, JsonValueChange.Remove, 0),
  313. new JsonValueChangeEventArgs("world", JsonValueChange.Add, 1),
  314. new JsonValueChangeEventArgs(null, JsonValueChange.Clear, 0),
  315. },
  316. changingListeners,
  317. changedListeners);
  318. }
  319. }
  320. }
  321. internal static void TestEvents<JsonValueType>(JsonValueType target, Action<JsonValueType> actionToTriggerEvent, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents, Action<JsonValueType> actionToTriggerEvent2 = null) where JsonValueType : JsonValue
  322. {
  323. var actualEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  324. EventHandler<JsonValueChangeEventArgs> changingHandler = (sender, e) => actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
  325. EventHandler<JsonValueChangeEventArgs> changedHandler = (sender, e) => actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
  326. target.Changing += changingHandler;
  327. target.Changed += changedHandler;
  328. actionToTriggerEvent(target);
  329. target.Changing -= changingHandler;
  330. target.Changed -= changedHandler;
  331. ValidateExpectedEvents(expectedEvents, actualEvents);
  332. if (actionToTriggerEvent2 == null)
  333. {
  334. actionToTriggerEvent(target);
  335. }
  336. else
  337. {
  338. actionToTriggerEvent2(target);
  339. }
  340. ValidateExpectedEvents(expectedEvents, actualEvents);
  341. }
  342. internal static void TestEventsDynamic(dynamic target, Action<dynamic> actionToTriggerEvent, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents)
  343. {
  344. var actualEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  345. EventHandler<JsonValueChangeEventArgs> changingHandler = (sender, e) => actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
  346. EventHandler<JsonValueChangeEventArgs> changedHandler = (sender, e) => actualEvents.Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
  347. target.Changing += changingHandler;
  348. target.Changed += changedHandler;
  349. actionToTriggerEvent(target);
  350. target.Changing -= changingHandler;
  351. target.Changed -= changedHandler;
  352. ValidateExpectedEvents(expectedEvents, actualEvents);
  353. actionToTriggerEvent(target);
  354. ValidateExpectedEvents(expectedEvents, actualEvents);
  355. }
  356. private static void ValidateExpectedEvents(List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> actualEvents)
  357. {
  358. Assert.Equal(expectedEvents.Count, actualEvents.Count);
  359. for (int i = 0; i < expectedEvents.Count; i++)
  360. {
  361. bool expectedIsChanging = expectedEvents[i].Item1;
  362. bool actualIsChanging = expectedEvents[i].Item1;
  363. Assert.Equal(expectedIsChanging, actualIsChanging);
  364. JsonValue expectedSender = expectedEvents[i].Item2;
  365. JsonValue actualSender = actualEvents[i].Item2;
  366. Assert.Equal(expectedSender, actualSender);
  367. JsonValueChangeEventArgs expectedEventArgs = expectedEvents[i].Item3;
  368. JsonValueChangeEventArgs actualEventArgs = actualEvents[i].Item3;
  369. Assert.Equal(expectedEventArgs.Change, actualEventArgs.Change);
  370. Assert.Equal(expectedEventArgs.Index, actualEventArgs.Index);
  371. Assert.Equal(expectedEventArgs.Key, actualEventArgs.Key);
  372. string expectedChild = expectedEventArgs.Child == null ? "null" : expectedEventArgs.Child.ToString();
  373. string actualChild = actualEventArgs.Child == null ? "null" : actualEventArgs.Child.ToString();
  374. Assert.Equal(expectedChild, actualChild);
  375. }
  376. }
  377. internal static void MultipleListenersTestInternal<JsonValueType>(
  378. Func<JsonValueType> createTarget,
  379. Action<JsonValueType> actionToTriggerEvents,
  380. List<JsonValueChangeEventArgs> expectedChangingEventArgs,
  381. List<JsonValueChangeEventArgs> expectedChangedEventArgs,
  382. int changingListeners,
  383. int changedListeners) where JsonValueType : JsonValue
  384. {
  385. Log.Info("Testing events on a {0} for {1} changING listeners and {2} changED listeners", typeof(JsonValueType).Name, changingListeners, changedListeners);
  386. JsonValueType target = createTarget();
  387. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[] actualChangingEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[changingListeners];
  388. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[] actualChangedEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>[changedListeners];
  389. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedChangingEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>(
  390. expectedChangingEventArgs.Select((args) => new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, target, args)));
  391. List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedChangedEvents = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>(
  392. expectedChangedEventArgs.Select((args) => new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, target, args)));
  393. for (int i = 0; i < changingListeners; i++)
  394. {
  395. actualChangingEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  396. var index = i;
  397. target.Changing += delegate(object sender, JsonValueChangeEventArgs e)
  398. {
  399. actualChangingEvents[index].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
  400. };
  401. }
  402. for (int i = 0; i < changedListeners; i++)
  403. {
  404. actualChangedEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  405. var index = i;
  406. target.Changed += delegate(object sender, JsonValueChangeEventArgs e)
  407. {
  408. actualChangedEvents[index].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
  409. };
  410. }
  411. actionToTriggerEvents(target);
  412. for (int i = 0; i < changingListeners; i++)
  413. {
  414. Log.Info("Validating Changing events for listener {0}", i);
  415. ValidateExpectedEvents(expectedChangingEvents, actualChangingEvents[i]);
  416. }
  417. for (int i = 0; i < changedListeners; i++)
  418. {
  419. Log.Info("Validating Changed events for listener {0}", i);
  420. ValidateExpectedEvents(expectedChangedEvents, actualChangedEvents[i]);
  421. }
  422. for (int i = 0; i < changingListeners; i++)
  423. {
  424. actualChangingEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  425. var index = i;
  426. target.Changing -= delegate(object sender, JsonValueChangeEventArgs e)
  427. {
  428. actualChangingEvents[i].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, sender as JsonValue, e));
  429. };
  430. }
  431. for (int i = 0; i < changedListeners; i++)
  432. {
  433. actualChangedEvents[i] = new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>();
  434. var index = i;
  435. target.Changed -= delegate(object sender, JsonValueChangeEventArgs e)
  436. {
  437. actualChangedEvents[i].Add(new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, sender as JsonValue, e));
  438. };
  439. }
  440. target = createTarget();
  441. expectedChangingEvents.Clear();
  442. expectedChangedEvents.Clear();
  443. actionToTriggerEvents(target);
  444. for (int i = 0; i < changingListeners; i++)
  445. {
  446. Log.Info("Validating Changing events for listener {0}", i);
  447. ValidateExpectedEvents(expectedChangingEvents, actualChangingEvents[i]);
  448. }
  449. for (int i = 0; i < changedListeners; i++)
  450. {
  451. Log.Info("Validating Changed events for listener {0}", i);
  452. ValidateExpectedEvents(expectedChangedEvents, actualChangedEvents[i]);
  453. }
  454. }
  455. private static void ValidateJsonArrayItems(JsonArray jsonArray, IEnumerable<JsonValue> expectedItems)
  456. {
  457. List<JsonValue> expected = new List<JsonValue>(expectedItems);
  458. Assert.Equal(expected.Count, jsonArray.Count);
  459. for (int i = 0; i < expected.Count; i++)
  460. {
  461. Assert.Equal(expected[i], jsonArray[i]);
  462. }
  463. }
  464. }
  465. }