PageRenderTime 28ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/mcs/class/System.Data.Linq/Test/EntitySetTest.cs

http://github.com/mono/mono
C# | 443 lines | 376 code | 59 blank | 8 comment | 1 complexity | e86fc477770eed9998729953b0313cfc MD5 | raw file
Possible License(s): GPL-2.0, CC-BY-SA-3.0, LGPL-2.0, MPL-2.0-no-copyleft-exception, LGPL-2.1, Unlicense, Apache-2.0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Linq;
  6. #if MONO_STRICT
  7. using System.Data.Linq;
  8. #else
  9. using DbLinq.Data.Linq;
  10. #endif
  11. using NUnit.Framework;
  12. namespace DbLinqTest
  13. {
  14. [TestFixture]
  15. public class EntitySetTest
  16. {
  17. [Test]
  18. public void Ctor_OnAddAndOnRemoveCanBeNull()
  19. {
  20. new EntitySet<Person>(null, null);
  21. }
  22. [Test, ExpectedException(typeof(ArgumentNullException))]
  23. public void Add_EntityNull()
  24. {
  25. var people = new EntitySet<Person>();
  26. people.Add(null);
  27. }
  28. [Test]
  29. public void Add_IgnoreRepeats()
  30. {
  31. var people = new EntitySet<Person>();
  32. var p = new Person { FirstName = "A", LastName = "B" };
  33. people.Add(p);
  34. people.Add(p);
  35. Assert.AreEqual(1, people.Count);
  36. }
  37. [Test, ExpectedException(typeof(InvalidOperationException))]
  38. public void Add_ThenSetSourceIsInvalid()
  39. {
  40. var people = new EntitySet<Person>();
  41. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  42. people.Add(new Person { FirstName = "A", LastName = "B" });
  43. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  44. people.SetSource(new[]{
  45. new Person { FirstName = "1", LastName = "2" }
  46. });
  47. }
  48. [Test]
  49. public void Assign()
  50. {
  51. var people = new EntitySet<Person>();
  52. people.SetSource(new[]{
  53. new Person { FirstName = "A", LastName = "B" },
  54. });
  55. Assert.IsTrue(people.IsDeferred);
  56. people.Load();
  57. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  58. Assert.IsFalse(people.IsDeferred);
  59. people.Assign(new[]{
  60. new Person { FirstName = "1", LastName = "2" },
  61. });
  62. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  63. Assert.AreEqual(1, people.Count);
  64. Assert.IsFalse(people.IsDeferred);
  65. }
  66. [Test, ExpectedException(typeof(InvalidOperationException))]
  67. public void Clear_DoesNotResetSource()
  68. {
  69. var people = new EntitySet<Person>();
  70. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  71. people.Add(new Person { FirstName = "A", LastName = "B" });
  72. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  73. people.Clear();
  74. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  75. people.SetSource(new[]{
  76. new Person { FirstName = "1", LastName = "2" },
  77. });
  78. }
  79. [Test]
  80. public void Contains_KillsDeferred()
  81. {
  82. var people = new EntitySet<Person>();
  83. var p = new Person { FirstName = "A", LastName = "B" };
  84. people.SetSource(new[]{
  85. p
  86. });
  87. Assert.IsTrue(people.IsDeferred);
  88. Assert.IsTrue(people.Contains(p));
  89. Assert.IsFalse(people.IsDeferred);
  90. }
  91. [Test]
  92. public void HasLoadedOrAssignedValues()
  93. {
  94. var people = new EntitySet<Person>();
  95. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  96. people.SetSource(new[]{
  97. new Person { FirstName = "A", LastName = "B" },
  98. });
  99. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  100. Assert.IsTrue(people.IsDeferred);
  101. people.Load();
  102. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  103. Assert.IsFalse(people.IsDeferred);
  104. }
  105. [Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
  106. public void IList_Add_WrongType()
  107. {
  108. var people = new EntitySet<Person>();
  109. System.Collections.IList list = people;
  110. list.Add("WrongType");
  111. }
  112. [Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
  113. public void IList_Add_DuplicateItem()
  114. {
  115. var people = new EntitySet<Person>();
  116. var p = new Person { FirstName = "A", LastName = "B" };
  117. people.Add(p);
  118. System.Collections.IList list = people;
  119. list.Add(p);
  120. }
  121. [Test]
  122. public void IList_Remove_WrongTypeIsIgnored()
  123. {
  124. var people = new EntitySet<Person>();
  125. System.Collections.IList list = people;
  126. list.Remove("DoesNotExist");
  127. }
  128. [Test]
  129. public void IndexOf_KillsDeferred()
  130. {
  131. var people = new EntitySet<Person>();
  132. var p = new Person { FirstName = "A", LastName = "B" };
  133. people.SetSource(new[]{
  134. p
  135. });
  136. Assert.IsTrue(people.IsDeferred);
  137. Assert.AreEqual(0, people.IndexOf(p));
  138. Assert.IsFalse(people.IsDeferred);
  139. }
  140. [Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
  141. public void Insert_RepeatValue()
  142. {
  143. var people = new EntitySet<Person>();
  144. var p = new Person { FirstName = "A", LastName = "B" };
  145. people.Add(p);
  146. people.Insert(0, p);
  147. }
  148. [Test]
  149. public void Item_IsDeferredSourceLoaded()
  150. {
  151. var people = new EntitySet<Person>();
  152. people.SetSource(new[]{
  153. new Person { FirstName = "A", LastName = "B" },
  154. });
  155. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  156. Assert.IsTrue(people.IsDeferred);
  157. var p = people[0];
  158. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  159. Assert.IsFalse(people.IsDeferred);
  160. }
  161. [Test]
  162. public void ListChanged_NoSource()
  163. {
  164. // When is ListChanged emitted?
  165. // It's not always when you think it would be.
  166. // It depends on whether there's a Source present.
  167. var people = new EntitySet<Person>();
  168. var events = new List<ListChangedEventArgs> ();
  169. people.ListChanged += (o, e) => events.Add(e);
  170. people.Add(new Person { FirstName = "A", LastName = "B" });
  171. AssertEqual(events, new ListChangedEventArgs(ListChangedType.ItemAdded, 0, -1));
  172. events.Clear();
  173. people.Clear();
  174. AssertEqual(events,
  175. new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1),
  176. new ListChangedEventArgs(ListChangedType.Reset, 0, -1));
  177. events.Clear();
  178. people.AddRange(new[]{
  179. new Person { FirstName = "1", LastName = "2" },
  180. new Person { FirstName = "<", LastName = ">" },
  181. });
  182. AssertEqual(events,
  183. new ListChangedEventArgs(ListChangedType.ItemAdded, 0, -1),
  184. new ListChangedEventArgs(ListChangedType.ItemAdded, 1, -1));
  185. events.Clear();
  186. var p = new Person { FirstName = "{", LastName = "}" };
  187. people.Insert(1, p);
  188. AssertEqual(events, new ListChangedEventArgs(ListChangedType.ItemAdded, 1, -1));
  189. events.Clear();
  190. Assert.IsTrue(people.Remove(p));
  191. AssertEqual(events, new ListChangedEventArgs(ListChangedType.ItemDeleted, 1, -1));
  192. events.Clear();
  193. people.RemoveAt(0);
  194. AssertEqual(events, new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1));
  195. events.Clear();
  196. people[0] = p;
  197. AssertEqual(events,
  198. new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1),
  199. new ListChangedEventArgs(ListChangedType.ItemAdded, 0, -1));
  200. }
  201. static void AssertEqual(List<ListChangedEventArgs> actual, params ListChangedEventArgs[] expected)
  202. {
  203. Assert.AreEqual(expected.Length, actual.Count);
  204. for (int i = 0; i < expected.Length; ++i)
  205. {
  206. Assert.AreEqual(expected[i].ListChangedType, actual[i].ListChangedType, "ListChangedEventArgs.ListChangedType");
  207. Assert.AreEqual(expected[i].NewIndex, actual[i].NewIndex, "ListChangedEventArgs.NewIndex");
  208. Assert.AreEqual(expected[i].OldIndex, actual[i].OldIndex, "ListChangedEventArgs.OldIndex");
  209. }
  210. }
  211. [Test]
  212. public void ListChanged_WithSource()
  213. {
  214. // When is ListChanged emitted?
  215. // It's not always when you think it would be.
  216. var people = new EntitySet<Person>();
  217. var events = new List<ListChangedEventArgs>();
  218. people.ListChanged += (o, e) => events.Add(e);
  219. // This is also true if Enumerable.Empty<Person>() is used here.
  220. people.SetSource(new[]{
  221. new Person { FirstName = "(", LastName = ")" },
  222. });
  223. AssertEqual(events);
  224. Assert.IsTrue(people.IsDeferred);
  225. // *Initial* Add()/AddRange() is ignored.
  226. people.Add(new Person { FirstName = "A", LastName = "B" });
  227. people.AddRange(new[]{
  228. new Person { FirstName = "1", LastName = "2" },
  229. new Person { FirstName = "<", LastName = ">" },
  230. });
  231. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  232. Assert.IsTrue(people.IsDeferred);
  233. AssertEqual(events,
  234. new ListChangedEventArgs(ListChangedType.ItemAdded, 0, -1),
  235. new ListChangedEventArgs(ListChangedType.ItemAdded, 1, -1),
  236. new ListChangedEventArgs(ListChangedType.ItemAdded, 2, -1));
  237. events.Clear();
  238. people.Clear();
  239. AssertEqual(events,
  240. new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1),
  241. new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1),
  242. new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1),
  243. new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1),
  244. new ListChangedEventArgs(ListChangedType.Reset, 0, -1));
  245. Assert.IsFalse(people.IsDeferred);
  246. // Add()/AddRange() after a Clear has events.
  247. events.Clear();
  248. people.Add(new Person { FirstName = "A", LastName = "B" });
  249. people.AddRange(new[]{
  250. new Person { FirstName = "1", LastName = "2" },
  251. new Person { FirstName = "<", LastName = ">" },
  252. });
  253. AssertEqual(events,
  254. new ListChangedEventArgs(ListChangedType.ItemAdded, 0, -1),
  255. new ListChangedEventArgs(ListChangedType.ItemAdded, 1, -1),
  256. new ListChangedEventArgs(ListChangedType.ItemAdded, 2, -1));
  257. events.Clear();
  258. var p = new Person { FirstName = "{", LastName = "}" };
  259. people.Insert(1, p);
  260. AssertEqual(events, new ListChangedEventArgs(ListChangedType.ItemAdded, 1, -1));
  261. events.Clear();
  262. Assert.IsTrue(people.Remove(p));
  263. AssertEqual(events, new ListChangedEventArgs(ListChangedType.ItemDeleted, 1, -1));
  264. events.Clear();
  265. people.RemoveAt(0);
  266. AssertEqual(events, new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1));
  267. events.Clear();
  268. people[0] = p;
  269. AssertEqual(events,
  270. new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1),
  271. new ListChangedEventArgs(ListChangedType.ItemAdded, 0, -1));
  272. }
  273. [Test]
  274. public void Remove()
  275. {
  276. var people = new EntitySet<Person>();
  277. var events = new List<ListChangedEventArgs>();
  278. people.ListChanged += (o, e) => events.Add(e);
  279. people.SetSource(new[]{
  280. new Person { FirstName = "(", LastName = ")" },
  281. });
  282. Assert.IsTrue(people.IsDeferred);
  283. Assert.IsFalse(people.Remove(null));
  284. AssertEqual(events);
  285. events.Clear();
  286. Assert.IsTrue(people.IsDeferred);
  287. var p = people[0];
  288. Assert.IsTrue(people.Remove(p));
  289. Assert.IsFalse(people.IsDeferred);
  290. Assert.AreEqual(0, people.Count);
  291. AssertEqual(events,
  292. new ListChangedEventArgs(ListChangedType.ItemDeleted, 0, -1));
  293. }
  294. [Test]
  295. public void SanityChecking()
  296. {
  297. var people = new EntitySet<Person>();
  298. bool changed = false;
  299. people.ListChanged += (o, e) => {
  300. changed = true;
  301. };
  302. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  303. Assert.AreEqual(0, people.Count);
  304. Assert.IsFalse(people.IsDeferred);
  305. people.Add(new Person { FirstName = "A", LastName = "B" });
  306. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  307. Assert.AreEqual(1, people.Count);
  308. Assert.IsFalse(people.IsDeferred);
  309. Assert.IsTrue(changed);
  310. changed = false;
  311. people.Add(new Person { FirstName = "1", LastName = "2" });
  312. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  313. Assert.AreEqual(2, people.Count);
  314. Assert.IsTrue(changed);
  315. changed = false;
  316. people.RemoveAt(0);
  317. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  318. Assert.AreEqual(1, people.Count);
  319. Assert.IsFalse(people.IsDeferred);
  320. Assert.IsTrue(changed);
  321. }
  322. [Test]
  323. public void SetSource_EntitySourceCanBeNull()
  324. {
  325. var entities = new EntitySet<Person>();
  326. entities.SetSource(null);
  327. }
  328. [Test]
  329. public void SetSource_HasLoadedOrAssignedValues_Is_False_Until_Enumeration()
  330. {
  331. var people = new EntitySet<Person>();
  332. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  333. people.SetSource(new[]{
  334. new Person { FirstName = "1", LastName = "2" }
  335. });
  336. Assert.IsTrue(people.IsDeferred);
  337. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  338. Assert.AreEqual(1, people.Count());
  339. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  340. Assert.IsFalse(people.IsDeferred);
  341. }
  342. [Test]
  343. public void SetSource_HasLoadedOrAssignedValues_Is_False_Until_Count()
  344. {
  345. var people = new EntitySet<Person>();
  346. people.SetSource(new[]{
  347. new Person { FirstName = "1", LastName = "2" }
  348. });
  349. Assert.IsTrue(people.IsDeferred);
  350. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  351. Assert.AreEqual(1, people.Count);
  352. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  353. Assert.IsFalse(people.IsDeferred);
  354. }
  355. [Test]
  356. public void SetSource_ThenAddIsFine()
  357. {
  358. var people = new EntitySet<Person>();
  359. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  360. people.SetSource(new[]{
  361. new Person { FirstName = "1", LastName = "2" }
  362. });
  363. Assert.IsTrue(people.IsDeferred);
  364. Assert.IsFalse(people.HasLoadedOrAssignedValues);
  365. people.Add(new Person { FirstName = "A", LastName = "B" });
  366. Assert.IsTrue(people.HasLoadedOrAssignedValues);
  367. Assert.IsTrue(people.IsDeferred);
  368. Assert.AreEqual(2, people.Count);
  369. }
  370. [Test]
  371. public void SetSource_ThenSetSourceIsValid()
  372. {
  373. var people = new EntitySet<Person>();
  374. people.SetSource(new[]{
  375. new Person { FirstName = "1", LastName = "2" }
  376. });
  377. Assert.IsTrue(people.IsDeferred);
  378. people.SetSource(new[]{
  379. new Person { FirstName = "A", LastName = "B" }
  380. });
  381. Assert.IsTrue(people.IsDeferred);
  382. }
  383. }
  384. }