PageRenderTime 336ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

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

https://bitbucket.org/mdavid/aspnetwebstack
C# | 787 lines | 660 code | 125 blank | 2 comment | 16 complexity | b3609e698cb33a8f694f6a8e24113d75 MD5 | raw file
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using System.Globalization;
  4. using System.Runtime.Serialization.Json;
  5. using Xunit;
  6. namespace System.Json
  7. {
  8. public class JsonObjectTest
  9. {
  10. [Fact]
  11. public void JsonObjectConstructorEnumTest()
  12. {
  13. string key1 = AnyInstance.AnyString;
  14. string key2 = AnyInstance.AnyString2;
  15. JsonValue value1 = AnyInstance.AnyJsonValue1;
  16. JsonValue value2 = AnyInstance.AnyJsonValue2;
  17. List<KeyValuePair<string, JsonValue>> items = new List<KeyValuePair<string, JsonValue>>()
  18. {
  19. new KeyValuePair<string, JsonValue>(key1, value1),
  20. new KeyValuePair<string, JsonValue>(key2, value2),
  21. };
  22. JsonObject target = new JsonObject(null);
  23. Assert.Equal(0, target.Count);
  24. target = new JsonObject(items);
  25. Assert.Equal(2, target.Count);
  26. ValidateJsonObjectItems(target, key1, value1, key2, value2);
  27. // Invalid tests
  28. items.Add(new KeyValuePair<string, JsonValue>(key1, AnyInstance.DefaultJsonValue));
  29. ExceptionHelper.Throws<ArgumentException>(delegate { new JsonObject(items); });
  30. }
  31. [Fact]
  32. public void JsonObjectConstructorParmsTest()
  33. {
  34. JsonObject target = new JsonObject();
  35. Assert.Equal(0, target.Count);
  36. string key1 = AnyInstance.AnyString;
  37. string key2 = AnyInstance.AnyString2;
  38. JsonValue value1 = AnyInstance.AnyJsonValue1;
  39. JsonValue value2 = AnyInstance.AnyJsonValue2;
  40. List<KeyValuePair<string, JsonValue>> items = new List<KeyValuePair<string, JsonValue>>()
  41. {
  42. new KeyValuePair<string, JsonValue>(key1, value1),
  43. new KeyValuePair<string, JsonValue>(key2, value2),
  44. };
  45. target = new JsonObject(items[0], items[1]);
  46. Assert.Equal(2, target.Count);
  47. ValidateJsonObjectItems(target, key1, value1, key2, value2);
  48. target = new JsonObject(items.ToArray());
  49. Assert.Equal(2, target.Count);
  50. ValidateJsonObjectItems(target, key1, value1, key2, value2);
  51. // Invalid tests
  52. items.Add(new KeyValuePair<string, JsonValue>(key1, AnyInstance.DefaultJsonValue));
  53. ExceptionHelper.Throws<ArgumentException>(delegate { new JsonObject(items[0], items[1], items[2]); });
  54. ExceptionHelper.Throws<ArgumentException>(delegate { new JsonObject(items.ToArray()); });
  55. }
  56. [Fact]
  57. public void AddTest()
  58. {
  59. string key1 = AnyInstance.AnyString;
  60. string key2 = AnyInstance.AnyString2;
  61. JsonValue value1 = AnyInstance.AnyJsonValue1;
  62. JsonValue value2 = AnyInstance.AnyJsonValue2;
  63. JsonObject target;
  64. target = new JsonObject();
  65. target.Add(new KeyValuePair<string, JsonValue>(key1, value1));
  66. Assert.Equal(1, target.Count);
  67. Assert.True(target.ContainsKey(key1));
  68. Assert.Equal(value1, target[key1]);
  69. target.Add(key2, value2);
  70. Assert.Equal(2, target.Count);
  71. Assert.True(target.ContainsKey(key2));
  72. Assert.Equal(value2, target[key2]);
  73. ExceptionHelper.Throws<ArgumentNullException>(delegate { new JsonObject().Add(null, value1); });
  74. ExceptionHelper.Throws<ArgumentNullException>(delegate { new JsonObject().Add(new KeyValuePair<string, JsonValue>(null, value1)); });
  75. ExceptionHelper.Throws<ArgumentException>(delegate { new JsonObject().Add(key1, AnyInstance.DefaultJsonValue); });
  76. ExceptionHelper.Throws<ArgumentException>(delegate { new JsonArray().Add(AnyInstance.DefaultJsonValue); });
  77. }
  78. [Fact]
  79. public void AddRangeParamsTest()
  80. {
  81. string key1 = AnyInstance.AnyString;
  82. string key2 = AnyInstance.AnyString2;
  83. JsonValue value1 = AnyInstance.AnyJsonValue1;
  84. JsonValue value2 = AnyInstance.AnyJsonValue2;
  85. List<KeyValuePair<string, JsonValue>> items = new List<KeyValuePair<string, JsonValue>>()
  86. {
  87. new KeyValuePair<string, JsonValue>(key1, value1),
  88. new KeyValuePair<string, JsonValue>(key2, value2),
  89. };
  90. JsonObject target;
  91. target = new JsonObject();
  92. target.AddRange(items[0], items[1]);
  93. Assert.Equal(2, target.Count);
  94. ValidateJsonObjectItems(target, key1, value1, key2, value2);
  95. target = new JsonObject();
  96. target.AddRange(items.ToArray());
  97. Assert.Equal(2, target.Count);
  98. ValidateJsonObjectItems(target, key1, value1, key2, value2);
  99. ExceptionHelper.Throws<ArgumentNullException>(delegate { new JsonObject().AddRange((KeyValuePair<string, JsonValue>[])null); });
  100. ExceptionHelper.Throws<ArgumentNullException>(delegate { new JsonObject().AddRange((IEnumerable<KeyValuePair<string, JsonValue>>)null); });
  101. items[1] = new KeyValuePair<string, JsonValue>(key2, AnyInstance.DefaultJsonValue);
  102. ExceptionHelper.Throws<ArgumentException>(delegate { new JsonObject().AddRange(items.ToArray()); });
  103. ExceptionHelper.Throws<ArgumentException>(delegate { new JsonObject().AddRange(items[0], items[1]); });
  104. }
  105. [Fact]
  106. public void AddRangeEnumTest()
  107. {
  108. string key1 = AnyInstance.AnyString;
  109. string key2 = AnyInstance.AnyString2;
  110. JsonValue value1 = AnyInstance.AnyJsonValue1;
  111. JsonValue value2 = AnyInstance.AnyJsonValue2;
  112. List<KeyValuePair<string, JsonValue>> items = new List<KeyValuePair<string, JsonValue>>()
  113. {
  114. new KeyValuePair<string, JsonValue>(key1, value1),
  115. new KeyValuePair<string, JsonValue>(key2, value2),
  116. };
  117. JsonObject target;
  118. target = new JsonObject();
  119. target.AddRange(items);
  120. Assert.Equal(2, target.Count);
  121. ValidateJsonObjectItems(target, key1, value1, key2, value2);
  122. ExceptionHelper.Throws<ArgumentNullException>(delegate { new JsonObject().AddRange(null); });
  123. items[1] = new KeyValuePair<string, JsonValue>(key2, AnyInstance.DefaultJsonValue);
  124. ExceptionHelper.Throws<ArgumentException>(delegate { new JsonObject().AddRange(items); });
  125. }
  126. [Fact]
  127. public void ClearTest()
  128. {
  129. string key1 = AnyInstance.AnyString;
  130. string key2 = AnyInstance.AnyString2;
  131. JsonValue value1 = AnyInstance.AnyJsonValue1;
  132. JsonValue value2 = AnyInstance.AnyJsonValue2;
  133. JsonObject target = new JsonObject();
  134. target.Add(key1, value1);
  135. target.Clear();
  136. Assert.Equal(0, target.Count);
  137. Assert.False(target.ContainsKey(key1));
  138. target.Add(key2, value2);
  139. Assert.Equal(1, target.Count);
  140. Assert.False(target.ContainsKey(key1));
  141. Assert.True(target.ContainsKey(key2));
  142. }
  143. [Fact]
  144. public void ContainsKeyTest()
  145. {
  146. string key1 = AnyInstance.AnyString;
  147. JsonValue value1 = AnyInstance.AnyJsonValue1;
  148. JsonObject target = new JsonObject();
  149. Assert.False(target.ContainsKey(key1));
  150. target.Add(key1, value1);
  151. Assert.True(target.ContainsKey(key1));
  152. target.Clear();
  153. Assert.False(target.ContainsKey(key1));
  154. ExceptionHelper.Throws<ArgumentNullException>(delegate { new JsonObject().ContainsKey(null); });
  155. }
  156. [Fact]
  157. public void CopyToTest()
  158. {
  159. string key1 = AnyInstance.AnyString;
  160. string key2 = AnyInstance.AnyString2;
  161. JsonValue value1 = AnyInstance.AnyJsonValue1;
  162. JsonValue value2 = AnyInstance.AnyJsonValue2;
  163. JsonObject target = new JsonObject { { key1, value1 }, { key2, value2 } };
  164. KeyValuePair<string, JsonValue>[] array = new KeyValuePair<string, JsonValue>[target.Count + 1];
  165. target.CopyTo(array, 1);
  166. int index1 = key1 == array[1].Key ? 1 : 2;
  167. int index2 = index1 == 1 ? 2 : 1;
  168. Assert.Equal(key1, array[index1].Key);
  169. Assert.Equal(value1, array[index1].Value);
  170. Assert.Equal(key2, array[index2].Key);
  171. Assert.Equal(value2, array[index2].Value);
  172. ExceptionHelper.Throws<ArgumentNullException>(() => target.CopyTo(null, 0));
  173. ExceptionHelper.Throws<ArgumentOutOfRangeException>(() => target.CopyTo(array, -1));
  174. ExceptionHelper.Throws<ArgumentException>(() => target.CopyTo(array, array.Length - target.Count + 1));
  175. }
  176. [Fact]
  177. public void CreateFromComplexTypeTest()
  178. {
  179. Assert.Null(JsonValueExtensions.CreateFrom(null));
  180. Person anyObject = AnyInstance.AnyPerson;
  181. JsonObject jv = JsonValueExtensions.CreateFrom(anyObject) as JsonObject;
  182. Assert.NotNull(jv);
  183. Assert.Equal(4, jv.Count);
  184. foreach (string key in "Name Age Address".Split())
  185. {
  186. Assert.True(jv.ContainsKey(key));
  187. }
  188. Assert.Equal(AnyInstance.AnyString, (string)jv["Name"]);
  189. Assert.Equal(AnyInstance.AnyInt, (int)jv["Age"]);
  190. JsonObject nestedObject = jv["Address"] as JsonObject;
  191. Assert.NotNull(nestedObject);
  192. Assert.Equal(3, nestedObject.Count);
  193. foreach (string key in "Street City State".Split())
  194. {
  195. Assert.True(nestedObject.ContainsKey(key));
  196. }
  197. Assert.Equal(Address.AnyStreet, (string)nestedObject["Street"]);
  198. Assert.Equal(Address.AnyCity, (string)nestedObject["City"]);
  199. Assert.Equal(Address.AnyState, (string)nestedObject["State"]);
  200. }
  201. [Fact]
  202. public void ReadAsComplexTypeTest()
  203. {
  204. JsonObject target = new JsonObject
  205. {
  206. { "Name", AnyInstance.AnyString },
  207. { "Age", AnyInstance.AnyInt },
  208. { "Address", new JsonObject { { "Street", Address.AnyStreet }, { "City", Address.AnyCity }, { "State", Address.AnyState } } },
  209. };
  210. Person person = target.ReadAsType<Person>();
  211. Assert.Equal(AnyInstance.AnyString, person.Name);
  212. Assert.Equal(AnyInstance.AnyInt, person.Age);
  213. Assert.NotNull(person.Address);
  214. Assert.Equal(Address.AnyStreet, person.Address.Street);
  215. Assert.Equal(Address.AnyCity, person.Address.City);
  216. Assert.Equal(Address.AnyState, person.Address.State);
  217. }
  218. [Fact]
  219. public void GetEnumeratorTest()
  220. {
  221. string key1 = AnyInstance.AnyString;
  222. string key2 = AnyInstance.AnyString2;
  223. JsonValue value1 = AnyInstance.AnyJsonValue1;
  224. JsonValue value2 = AnyInstance.AnyJsonValue2;
  225. JsonObject target = new JsonObject { { key1, value1 }, { key2, value2 } };
  226. IEnumerator<KeyValuePair<string, JsonValue>> enumerator = target.GetEnumerator();
  227. Assert.True(enumerator.MoveNext());
  228. bool key1IsFirst = key1 == enumerator.Current.Key;
  229. if (key1IsFirst)
  230. {
  231. Assert.Equal(key1, enumerator.Current.Key);
  232. Assert.Equal(value1, enumerator.Current.Value);
  233. }
  234. else
  235. {
  236. Assert.Equal(key2, enumerator.Current.Key);
  237. Assert.Equal(value2, enumerator.Current.Value);
  238. }
  239. Assert.True(enumerator.MoveNext());
  240. if (key1IsFirst)
  241. {
  242. Assert.Equal(key2, enumerator.Current.Key);
  243. Assert.Equal(value2, enumerator.Current.Value);
  244. }
  245. else
  246. {
  247. Assert.Equal(key1, enumerator.Current.Key);
  248. Assert.Equal(value1, enumerator.Current.Value);
  249. }
  250. Assert.False(enumerator.MoveNext());
  251. }
  252. [Fact]
  253. public void RemoveTest()
  254. {
  255. string key1 = AnyInstance.AnyString;
  256. string key2 = AnyInstance.AnyString2;
  257. JsonValue value1 = AnyInstance.AnyJsonValue1;
  258. JsonValue value2 = AnyInstance.AnyJsonValue2;
  259. JsonObject target = new JsonObject { { key1, value1 }, { key2, value2 } };
  260. Assert.True(target.ContainsKey(key1));
  261. Assert.True(target.ContainsKey(key2));
  262. Assert.Equal(2, target.Count);
  263. Assert.True(target.Remove(key2));
  264. Assert.True(target.ContainsKey(key1));
  265. Assert.False(target.ContainsKey(key2));
  266. Assert.Equal(1, target.Count);
  267. Assert.False(target.Remove(key2));
  268. Assert.True(target.ContainsKey(key1));
  269. Assert.False(target.ContainsKey(key2));
  270. Assert.Equal(1, target.Count);
  271. }
  272. [Fact]
  273. public void ToStringTest()
  274. {
  275. JsonObject target = new JsonObject();
  276. JsonValue item1 = AnyInstance.AnyJsonValue1 ?? "not null";
  277. JsonValue item2 = null;
  278. JsonValue item3 = AnyInstance.AnyJsonValue2 ?? "not null";
  279. JsonValue item4 = AnyInstance.AnyJsonValue3 ?? "not null";
  280. target.Add("item1", item1);
  281. target.Add("item2", item2);
  282. target.Add("item3", item3);
  283. target.Add("", item4);
  284. string expected = String.Format(CultureInfo.InvariantCulture, "{{\"item1\":{0},\"item2\":null,\"item3\":{1},\"\":{2}}}", item1.ToString(), item3.ToString(), item4.ToString());
  285. Assert.Equal<string>(expected, target.ToString());
  286. string json = "{\r\n \"item1\": \"hello\",\r\n \"item2\": null,\r\n \"item3\": [\r\n 1,\r\n 2,\r\n 3\r\n ],\r\n \"\": \"notnull\"\r\n}";
  287. target = JsonValue.Parse(json) as JsonObject;
  288. Assert.Equal<string>(json.Replace("\r\n", "").Replace(" ", ""), target.ToString());
  289. }
  290. [Fact]
  291. public void ContainsKVPTest()
  292. {
  293. JsonObject target = new JsonObject();
  294. KeyValuePair<string, JsonValue> item = new KeyValuePair<string, JsonValue>(AnyInstance.AnyString, AnyInstance.AnyJsonValue1);
  295. KeyValuePair<string, JsonValue> item2 = new KeyValuePair<string, JsonValue>(AnyInstance.AnyString2, AnyInstance.AnyJsonValue2);
  296. target.Add(item);
  297. Assert.True(((ICollection<KeyValuePair<string, JsonValue>>)target).Contains(item));
  298. Assert.False(((ICollection<KeyValuePair<string, JsonValue>>)target).Contains(item2));
  299. }
  300. [Fact]
  301. public void RemoveKVPTest()
  302. {
  303. JsonObject target = new JsonObject();
  304. KeyValuePair<string, JsonValue> item1 = new KeyValuePair<string, JsonValue>(AnyInstance.AnyString, AnyInstance.AnyJsonValue1);
  305. KeyValuePair<string, JsonValue> item2 = new KeyValuePair<string, JsonValue>(AnyInstance.AnyString2, AnyInstance.AnyJsonValue2);
  306. target.AddRange(item1, item2);
  307. Assert.Equal(2, target.Count);
  308. Assert.True(((ICollection<KeyValuePair<string, JsonValue>>)target).Contains(item1));
  309. Assert.True(((ICollection<KeyValuePair<string, JsonValue>>)target).Contains(item2));
  310. Assert.True(((ICollection<KeyValuePair<string, JsonValue>>)target).Remove(item1));
  311. Assert.Equal(1, target.Count);
  312. Assert.False(((ICollection<KeyValuePair<string, JsonValue>>)target).Contains(item1));
  313. Assert.True(((ICollection<KeyValuePair<string, JsonValue>>)target).Contains(item2));
  314. Assert.False(((ICollection<KeyValuePair<string, JsonValue>>)target).Remove(item1));
  315. Assert.Equal(1, target.Count);
  316. Assert.False(((ICollection<KeyValuePair<string, JsonValue>>)target).Contains(item1));
  317. Assert.True(((ICollection<KeyValuePair<string, JsonValue>>)target).Contains(item2));
  318. }
  319. [Fact]
  320. public void GetEnumeratorTest1()
  321. {
  322. string key1 = AnyInstance.AnyString;
  323. string key2 = AnyInstance.AnyString2;
  324. JsonValue value1 = AnyInstance.AnyJsonValue1;
  325. JsonValue value2 = AnyInstance.AnyJsonValue2;
  326. JsonObject target = new JsonObject { { key1, value1 }, { key2, value2 } };
  327. IEnumerator enumerator = ((IEnumerable)target).GetEnumerator();
  328. Assert.True(enumerator.MoveNext());
  329. Assert.IsType<KeyValuePair<string, JsonValue>>(enumerator.Current);
  330. KeyValuePair<string, JsonValue> current = (KeyValuePair<string, JsonValue>)enumerator.Current;
  331. bool key1IsFirst = key1 == current.Key;
  332. if (key1IsFirst)
  333. {
  334. Assert.Equal(key1, current.Key);
  335. Assert.Equal(value1, current.Value);
  336. }
  337. else
  338. {
  339. Assert.Equal(key2, current.Key);
  340. Assert.Equal(value2, current.Value);
  341. }
  342. Assert.True(enumerator.MoveNext());
  343. Assert.IsType<KeyValuePair<string, JsonValue>>(enumerator.Current);
  344. current = (KeyValuePair<string, JsonValue>)enumerator.Current;
  345. if (key1IsFirst)
  346. {
  347. Assert.Equal(key2, current.Key);
  348. Assert.Equal(value2, current.Value);
  349. }
  350. else
  351. {
  352. Assert.Equal(key1, current.Key);
  353. Assert.Equal(value1, current.Value);
  354. }
  355. Assert.False(enumerator.MoveNext());
  356. }
  357. [Fact]
  358. public void TryGetValueTest()
  359. {
  360. string key1 = AnyInstance.AnyString;
  361. string key2 = AnyInstance.AnyString2;
  362. JsonValue value1 = AnyInstance.AnyJsonValue1;
  363. JsonValue value2 = AnyInstance.AnyJsonValue2;
  364. JsonObject target = new JsonObject { { key1, value1 }, { key2, value2 } };
  365. JsonValue value;
  366. Assert.True(target.TryGetValue(key2, out value));
  367. Assert.Equal(value2, value);
  368. Assert.False(target.TryGetValue("not a key", out value));
  369. Assert.Null(value);
  370. }
  371. [Fact]
  372. public void GetValueOrDefaultTest()
  373. {
  374. bool boolValue;
  375. JsonValue target;
  376. JsonValue jsonValue;
  377. Person person = AnyInstance.AnyPerson;
  378. JsonObject jo = JsonValueExtensions.CreateFrom(person) as JsonObject;
  379. Assert.Equal<int>(person.Age, jo.ValueOrDefault("Age").ReadAs<int>()); // JsonPrimitive
  380. Assert.Equal<string>(person.Address.ToString(), jo.ValueOrDefault("Address").ReadAsType<Address>().ToString()); // JsonObject
  381. Assert.Equal<int>(person.Friends.Count, jo.ValueOrDefault("Friends").Count); // JsonArray
  382. target = jo.ValueOrDefault("Address").ValueOrDefault("City"); // JsonPrimitive
  383. Assert.NotNull(target);
  384. Assert.Equal<string>(person.Address.City, target.ReadAs<string>());
  385. target = jo.ValueOrDefault("Address", "City"); // JsonPrimitive
  386. Assert.NotNull(target);
  387. Assert.Equal<string>(person.Address.City, target.ReadAs<string>());
  388. target = jo.ValueOrDefault("Address").ValueOrDefault("NonExistentProp").ValueOrDefault("NonExistentProp2"); // JsonObject
  389. Assert.Equal(JsonType.Default, target.JsonType);
  390. Assert.NotNull(target);
  391. Assert.False(target.TryReadAs<bool>(out boolValue));
  392. Assert.True(target.TryReadAs<JsonValue>(out jsonValue));
  393. target = jo.ValueOrDefault("Address", "NonExistentProp", "NonExistentProp2"); // JsonObject
  394. Assert.Equal(JsonType.Default, target.JsonType);
  395. Assert.NotNull(target);
  396. Assert.False(target.TryReadAs<bool>(out boolValue));
  397. Assert.True(target.TryReadAs<JsonValue>(out jsonValue));
  398. Assert.Same(target, jsonValue);
  399. }
  400. [Fact]
  401. public void CountTest()
  402. {
  403. string key1 = AnyInstance.AnyString;
  404. string key2 = AnyInstance.AnyString2;
  405. JsonValue value1 = AnyInstance.AnyJsonValue1;
  406. JsonValue value2 = AnyInstance.AnyJsonValue2;
  407. JsonObject target = new JsonObject();
  408. Assert.Equal(0, target.Count);
  409. target.Add(key1, value1);
  410. Assert.Equal(1, target.Count);
  411. target.Add(key2, value2);
  412. Assert.Equal(2, target.Count);
  413. target.Remove(key2);
  414. Assert.Equal(1, target.Count);
  415. }
  416. [Fact]
  417. public void ItemTest()
  418. {
  419. string key1 = AnyInstance.AnyString;
  420. string key2 = AnyInstance.AnyString2;
  421. JsonValue value1 = AnyInstance.AnyJsonValue1;
  422. JsonValue value2 = AnyInstance.AnyJsonValue2;
  423. JsonValue value3 = AnyInstance.AnyJsonValue3;
  424. JsonObject target;
  425. target = new JsonObject { { key1, value1 }, { key2, value2 } };
  426. Assert.Equal(value1, target[key1]);
  427. Assert.Equal(value2, target[key2]);
  428. target[key1] = value3;
  429. Assert.Equal(value3, target[key1]);
  430. Assert.Equal(value2, target[key2]);
  431. ExceptionHelper.Throws<KeyNotFoundException>(delegate { var o = target["not a key"]; });
  432. ExceptionHelper.Throws<ArgumentNullException>(delegate { var o = target[null]; });
  433. ExceptionHelper.Throws<ArgumentNullException>(delegate { target[null] = 123; });
  434. ExceptionHelper.Throws<ArgumentException>(delegate { target[key1] = AnyInstance.DefaultJsonValue; });
  435. }
  436. [Fact]
  437. public void ChangingEventsTest()
  438. {
  439. const string key1 = "first";
  440. const string key2 = "second";
  441. const string key3 = "third";
  442. const string key4 = "fourth";
  443. const string key5 = "fifth";
  444. JsonObject jo = new JsonObject
  445. {
  446. { key1, AnyInstance.AnyString },
  447. { key2, AnyInstance.AnyBool },
  448. { key3, null },
  449. };
  450. TestEvents(
  451. jo,
  452. obj => obj.Add(key4, 1),
  453. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  454. {
  455. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(1, JsonValueChange.Add, key4)),
  456. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(1, JsonValueChange.Add, key4)),
  457. });
  458. TestEvents(
  459. jo,
  460. obj => obj[key2] = 2,
  461. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  462. {
  463. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(2, JsonValueChange.Replace, key2)),
  464. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(AnyInstance.AnyBool, JsonValueChange.Replace, key2)),
  465. });
  466. TestEvents(
  467. jo,
  468. obj => obj[key5] = 3,
  469. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  470. {
  471. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(3, JsonValueChange.Add, key5)),
  472. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(3, JsonValueChange.Add, key5)),
  473. });
  474. jo.Remove(key4);
  475. jo.Remove(key5);
  476. TestEvents(
  477. jo,
  478. obj => obj.AddRange(new JsonObject { { key4, AnyInstance.AnyString }, { key5, AnyInstance.AnyDouble } }),
  479. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  480. {
  481. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(AnyInstance.AnyString, JsonValueChange.Add, key4)),
  482. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(AnyInstance.AnyDouble, JsonValueChange.Add, key5)),
  483. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(AnyInstance.AnyString, JsonValueChange.Add, key4)),
  484. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(AnyInstance.AnyDouble, JsonValueChange.Add, key5)),
  485. });
  486. TestEvents(
  487. jo,
  488. obj => obj.Remove(key5),
  489. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  490. {
  491. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(AnyInstance.AnyDouble, JsonValueChange.Remove, key5)),
  492. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(AnyInstance.AnyDouble, JsonValueChange.Remove, key5)),
  493. });
  494. TestEvents(
  495. jo,
  496. obj => obj.Remove("not there"),
  497. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>());
  498. jo = new JsonObject { { key1, 1 }, { key2, 2 }, { key3, 3 } };
  499. TestEvents(
  500. jo,
  501. obj => obj.Clear(),
  502. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  503. {
  504. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null)),
  505. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null)),
  506. });
  507. jo = new JsonObject { { key1, 1 }, { key2, 2 }, { key3, 3 } };
  508. TestEvents(
  509. jo,
  510. obj => ((IDictionary<string, JsonValue>)obj).Remove(new KeyValuePair<string, JsonValue>(key2, jo[key2])),
  511. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  512. {
  513. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, jo, new JsonValueChangeEventArgs(2, JsonValueChange.Remove, key2)),
  514. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, jo, new JsonValueChangeEventArgs(2, JsonValueChange.Remove, key2)),
  515. });
  516. TestEvents(
  517. jo,
  518. obj => ((IDictionary<string, JsonValue>)obj).Remove(new KeyValuePair<string, JsonValue>("key not in object", jo[key1])),
  519. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  520. {
  521. });
  522. TestEvents(
  523. jo,
  524. obj => ((IDictionary<string, JsonValue>)obj).Remove(new KeyValuePair<string, JsonValue>(key1, "different object")),
  525. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  526. {
  527. });
  528. ExceptionHelper.Throws<ArgumentNullException>(() => new JsonValueChangeEventArgs(1, JsonValueChange.Add, null));
  529. }
  530. [Fact]
  531. public void NestedChangingEventTest()
  532. {
  533. const string key1 = "first";
  534. JsonObject target = new JsonObject { { key1, new JsonArray { 1, 2 } } };
  535. JsonArray child = target[key1] as JsonArray;
  536. TestEvents(
  537. target,
  538. obj => ((JsonArray)obj[key1]).Add(5),
  539. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>());
  540. target = new JsonObject();
  541. child = new JsonArray(1, 2);
  542. TestEvents(
  543. target,
  544. obj =>
  545. {
  546. obj.Add(key1, child);
  547. ((JsonArray)obj[key1]).Add(5);
  548. },
  549. new List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>>
  550. {
  551. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(true, target, new JsonValueChangeEventArgs(child, JsonValueChange.Add, key1)),
  552. new Tuple<bool, JsonValue, JsonValueChangeEventArgs>(false, target, new JsonValueChangeEventArgs(child, JsonValueChange.Add, key1)),
  553. });
  554. }
  555. [Fact]
  556. public void MultipleListenersTest()
  557. {
  558. const string key1 = "first";
  559. const string key2 = "second";
  560. const string key3 = "third";
  561. for (int changingListeners = 0; changingListeners <= 2; changingListeners++)
  562. {
  563. for (int changedListeners = 0; changedListeners <= 2; changedListeners++)
  564. {
  565. JsonArrayTest.MultipleListenersTestHelper<JsonObject>(
  566. () => new JsonObject { { key1, 1 }, { key2, 2 } },
  567. delegate(JsonObject obj)
  568. {
  569. obj[key2] = "hello";
  570. obj.Remove(key1);
  571. obj.Add(key3, "world");
  572. obj.Clear();
  573. },
  574. new List<JsonValueChangeEventArgs>
  575. {
  576. new JsonValueChangeEventArgs("hello", JsonValueChange.Replace, key2),
  577. new JsonValueChangeEventArgs(1, JsonValueChange.Remove, key1),
  578. new JsonValueChangeEventArgs("world", JsonValueChange.Add, key3),
  579. new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null),
  580. },
  581. new List<JsonValueChangeEventArgs>
  582. {
  583. new JsonValueChangeEventArgs(2, JsonValueChange.Replace, key2),
  584. new JsonValueChangeEventArgs(1, JsonValueChange.Remove, key1),
  585. new JsonValueChangeEventArgs("world", JsonValueChange.Add, key3),
  586. new JsonValueChangeEventArgs(null, JsonValueChange.Clear, null),
  587. },
  588. changingListeners,
  589. changedListeners);
  590. }
  591. }
  592. }
  593. [Fact]
  594. public void JsonTypeTest()
  595. {
  596. JsonObject target = AnyInstance.AnyJsonObject;
  597. Assert.Equal(JsonType.Object, target.JsonType);
  598. }
  599. [Fact]
  600. public void KeysTest()
  601. {
  602. string key1 = AnyInstance.AnyString;
  603. string key2 = AnyInstance.AnyString2;
  604. JsonValue value1 = AnyInstance.AnyJsonValue1;
  605. JsonValue value2 = AnyInstance.AnyJsonValue2;
  606. JsonObject target = new JsonObject { { key1, value1 }, { key2, value2 } };
  607. List<string> expected = new List<string> { key1, key2 };
  608. List<string> actual = new List<string>(target.Keys);
  609. Assert.Equal(expected.Count, actual.Count);
  610. expected.Sort();
  611. actual.Sort();
  612. for (int i = 0; i < expected.Count; i++)
  613. {
  614. Assert.Equal(expected[i], actual[i]);
  615. }
  616. }
  617. [Fact]
  618. public void IsReadOnlyTest()
  619. {
  620. JsonObject target = AnyInstance.AnyJsonObject;
  621. Assert.False(((ICollection<KeyValuePair<string, JsonValue>>)target).IsReadOnly);
  622. }
  623. [Fact]
  624. public void ValuesTest()
  625. {
  626. string key1 = AnyInstance.AnyString;
  627. string key2 = AnyInstance.AnyString2;
  628. JsonValue value1 = AnyInstance.AnyJsonValue1;
  629. JsonValue value2 = AnyInstance.AnyJsonValue2;
  630. JsonObject target = new JsonObject { { key1, value1 }, { key2, value2 } };
  631. List<JsonValue> values = new List<JsonValue>(target.Values);
  632. Assert.Equal(2, values.Count);
  633. bool value1IsFirst = value1 == values[0];
  634. Assert.True(value1IsFirst || value1 == values[1]);
  635. Assert.Equal(value2, values[value1IsFirst ? 1 : 0]);
  636. }
  637. private static void ValidateJsonObjectItems(JsonObject jsonObject, params object[] keyValuePairs)
  638. {
  639. Dictionary<string, JsonValue> expected = new Dictionary<string, JsonValue>();
  640. Assert.True((keyValuePairs.Length % 2) == 0, "Test error");
  641. for (int i = 0; i < keyValuePairs.Length; i += 2)
  642. {
  643. Assert.IsType<String>(keyValuePairs[i]);
  644. Assert.IsAssignableFrom<JsonValue>(keyValuePairs[i + 1]);
  645. expected.Add((string)keyValuePairs[i], (JsonValue)keyValuePairs[i + 1]);
  646. }
  647. }
  648. private static void ValidateJsonObjectItems(JsonObject jsonObject, Dictionary<string, JsonValue> expected)
  649. {
  650. Assert.Equal(expected.Count, jsonObject.Count);
  651. foreach (string key in expected.Keys)
  652. {
  653. Assert.True(jsonObject.ContainsKey(key));
  654. Assert.Equal(expected[key], jsonObject[key]);
  655. }
  656. }
  657. private static void TestEvents(JsonObject obj, Action<JsonObject> actionToTriggerEvent, List<Tuple<bool, JsonValue, JsonValueChangeEventArgs>> expectedEvents)
  658. {
  659. JsonArrayTest.TestEvents<JsonObject>(obj, actionToTriggerEvent, expectedEvents);
  660. }
  661. }
  662. }