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