[bcl] Add NUnitHelper.cs with API not in nunit-lite
[mono.git] / mcs / class / System.Data.Linq / src / DbLinq / Test / Providers / ReadTests_EntitySet.cs
1 using System;\r
2 using System.Collections;\r
3 using System.Collections.Generic;\r
4 using System.Linq;\r
5 using System.Text;\r
6 using Test_NUnit;\r
7 using NUnit.Framework;\r
8 using Test_NUnit.Linq_101_Samples;\r
9 using System.Data.Linq;\r
10 \r
11 #if MONO_STRICT\r
12 using DataLoadOptions = System.Data.Linq.DataLoadOptions;\r
13 #else\r
14 using DataLoadOptions = DbLinq.Data.Linq.DataLoadOptions;\r
15 #endif\r
16 \r
17 using nwind;\r
18 \r
19 // test ns \r
20 #if MYSQL\r
21     namespace Test_NUnit_MySql\r
22 #elif ORACLE && ODP\r
23     namespace Test_NUnit_OracleODP\r
24 #elif ORACLE\r
25     namespace Test_NUnit_Oracle\r
26 #elif POSTGRES\r
27     namespace Test_NUnit_PostgreSql\r
28 #elif SQLITE\r
29     namespace Test_NUnit_Sqlite\r
30 #elif INGRES\r
31     namespace Test_NUnit_Ingres\r
32 #elif MSSQL && L2SQL\r
33     namespace Test_NUnit_MsSql_Strict\r
34 #elif MSSQL\r
35     namespace Test_NUnit_MsSql\r
36 #elif FIREBIRD\r
37     namespace Test_NUnit_Firebird\r
38 #endif\r
39 {\r
40     [TestFixture]\r
41     public class EntitySet : TestBase\r
42     {\r
43 \r
44         [Test]\r
45         public void SimpleMemberAccess01()\r
46         {\r
47             var customer = new Customer();\r
48             var orders = customer.Orders;\r
49         }\r
50 \r
51         [Test]\r
52         public void SimpleMemberAccess02()\r
53         {\r
54             var db = CreateDB();\r
55             var customer = db.Customers.First();\r
56             AssertHelper.Greater(customer.Orders.Count, 0);\r
57         }\r
58 \r
59 #if !DEBUG && (SQLITE || (MSSQL && !L2SQL))\r
60         [Explicit]\r
61 #endif\r
62         [Test]\r
63         public void EntitySetEnumerationProjection()\r
64         {\r
65             var db = CreateDB();\r
66             var results = (from c in db.Customers select c.Orders).ToList();\r
67 \r
68             AssertHelper.Greater(results.Count, 0);\r
69         }\r
70 \r
71         [Test]\r
72         public void HasLoadedOrAsignedValues01()\r
73         {\r
74             var db = CreateDB();\r
75             var customer = db.Customers.First();\r
76             Assert.IsFalse(customer.Orders.HasLoadedOrAssignedValues);\r
77 \r
78             customer.Orders.Add(new Order());\r
79             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues);\r
80         }\r
81 \r
82         [Test]\r
83         public void HasLoadedOrAsignedValues02()\r
84         {\r
85             var db = CreateDB();\r
86             var customer = db.Customers.First();\r
87             Assert.IsFalse(customer.Orders.HasLoadedOrAssignedValues);\r
88 \r
89             customer.Orders.Assign(System.Linq.Enumerable.Empty<Order>());\r
90             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues);\r
91         }\r
92 \r
93 \r
94         [Test]\r
95         [ExpectedException(typeof(InvalidOperationException))]\r
96         public void InvalidSourceChange()\r
97         {\r
98             var db = CreateDB();\r
99             var customer = db.Customers.First();\r
100 \r
101             AssertHelper.Greater(customer.Orders.Count, 0, "#1");\r
102             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues, "#2");\r
103             customer.Orders.SetSource(System.Linq.Enumerable.Empty<Order>());\r
104         }\r
105 \r
106         [Test]\r
107         [ExpectedException(typeof(InvalidOperationException))]\r
108         public void InvalidSourceChange2()\r
109         {\r
110             var db = CreateDB();\r
111             var customer = db.Customers.First();\r
112             Assert.IsFalse(customer.Orders.HasLoadedOrAssignedValues, "#1");\r
113             customer.Orders.Assign(new List<Order>());\r
114             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues, "#2");\r
115             customer.Orders.SetSource(System.Linq.Enumerable.Empty<Order>());\r
116         }\r
117 \r
118         [Test]\r
119         [ExpectedException(typeof(InvalidOperationException))]\r
120         public void InvalidSourceChange3()\r
121         {\r
122             var db = CreateDB();\r
123             var customer = db.Customers.First();\r
124             customer.Orders.SetSource(new List<Order>());\r
125             Assert.IsFalse(customer.Orders.HasLoadedOrAssignedValues, "#1");\r
126             customer.Orders.Load();\r
127             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues, "#2");\r
128             customer.Orders.SetSource(System.Linq.Enumerable.Empty<Order>());\r
129         }\r
130 \r
131         [Test]\r
132         public void SourceChange()\r
133         {\r
134             var db = CreateDB();\r
135 \r
136             int ordersCount = (from cust in db.Customers\r
137                                select cust.Orders.Count).First();\r
138 \r
139             AssertHelper.Greater(ordersCount, 0);\r
140 \r
141             var customer2 = db.Customers.First();\r
142             customer2.Orders.SetSource(System.Linq.Enumerable.Empty<Order>());\r
143             Assert.AreEqual(customer2.Orders.Count, 0);\r
144         }\r
145 \r
146 \r
147 #if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))\r
148         [Explicit]\r
149 #endif\r
150         [Test]\r
151         public void Refresh01()\r
152         {\r
153             var db = CreateDB();\r
154             var c = db.Customers.First();\r
155 \r
156             int beforeCount = c.Orders.Count;\r
157             AssertHelper.Greater(beforeCount, 0);\r
158             c.Orders.Clear();\r
159             Assert.AreEqual(c.Orders.Count, 0);\r
160             c.Orders.AddRange(db.Orders);\r
161             AssertHelper.Greater(c.Orders.Count, beforeCount);\r
162             db.Refresh(RefreshMode.OverwriteCurrentValues, c.Orders);\r
163 \r
164             Assert.AreEqual(c.Orders.Count, beforeCount);\r
165         }\r
166 \r
167 #if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))\r
168         [Explicit]\r
169 #endif\r
170         [Test]\r
171         public void Refresh02()\r
172         {\r
173             var db = CreateDB();\r
174             var c = db.Customers.First();\r
175 \r
176             int beforeCount = c.Orders.Count;\r
177             AssertHelper.Greater(beforeCount, 0);\r
178             c.Orders.Clear();\r
179             Assert.AreEqual(c.Orders.Count, 0);\r
180             c.Orders.AddRange(db.Orders);\r
181 \r
182             int middleCount = c.Orders.Count;\r
183             AssertHelper.Greater(c.Orders.Count, beforeCount);\r
184 \r
185             db.Refresh(RefreshMode.KeepCurrentValues, c.Orders);\r
186             Assert.AreEqual(c.Orders.Count, middleCount);\r
187 \r
188             db.Refresh(RefreshMode.KeepChanges, c.Orders);\r
189             Assert.AreEqual(c.Orders.Count, middleCount);\r
190         }\r
191 \r
192 \r
193 #if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))\r
194         [Explicit]\r
195 #endif\r
196         [Test]\r
197         public void Refresh03()\r
198         {\r
199             var db = CreateDB();\r
200             var c = db.Customers.First();\r
201 \r
202             var order = c.Orders.First();\r
203             string newcustomerId = "NEWCUSTOMERID";\r
204             order.CustomerID = newcustomerId;\r
205 \r
206             db.Refresh(RefreshMode.OverwriteCurrentValues, c.Orders);\r
207             Assert.AreNotEqual(order.CustomerID, newcustomerId);\r
208         }\r
209 \r
210 #if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))\r
211         [Explicit]\r
212 #endif\r
213         [Test]\r
214         public void Refresh04()\r
215         {\r
216             var db = CreateDB();\r
217             var c = db.Customers.First();\r
218 \r
219             var order = c.Orders.First();\r
220             string newcustomerId = "NEWCUSTOMERID";\r
221             order.CustomerID = newcustomerId;\r
222 \r
223             db.Refresh(RefreshMode.KeepCurrentValues, c.Orders);\r
224             Assert.AreEqual(order.CustomerID, newcustomerId);\r
225 \r
226             db.Refresh(RefreshMode.KeepChanges, c.Orders);\r
227             Assert.AreEqual(order.CustomerID, newcustomerId);\r
228         }\r
229 \r
230 \r
231         [Test]\r
232         public void ListChangedEvent()\r
233         {\r
234             var db = CreateDB();\r
235             var customer = db.Customers.Where(c => c.Orders.Count > 0).First();\r
236             AssertHelper.Greater(customer.Orders.Count, 0);\r
237             bool ok;\r
238             System.ComponentModel.ListChangedEventArgs args = null;\r
239             customer.Orders.ListChanged += delegate(object sender, System.ComponentModel.ListChangedEventArgs a) \r
240                 { \r
241                     ok = true; \r
242                     args = a; \r
243                 };\r
244 \r
245             ok = false;\r
246             args = null;\r
247             customer.Orders.Remove(customer.Orders.First());\r
248             Assert.IsTrue(ok);\r
249             Assert.AreEqual(System.ComponentModel.ListChangedType.ItemDeleted, args.ListChangedType);\r
250             Assert.AreEqual(0, args.NewIndex);\r
251             Assert.AreEqual(-1, args.OldIndex);\r
252 \r
253             ok = false;\r
254             args = null;\r
255             customer.Orders.Assign(Enumerable.Empty<Order>());\r
256             Assert.IsTrue(ok);\r
257             Assert.AreEqual(System.ComponentModel.ListChangedType.Reset, args.ListChangedType);\r
258             Assert.AreEqual(0, args.NewIndex);\r
259             Assert.AreEqual(-1, args.OldIndex);\r
260 \r
261             ok = false;\r
262             args = null;\r
263             customer.Orders.Add(db.Orders.First());\r
264             Assert.IsTrue(ok);\r
265             Assert.AreEqual(System.ComponentModel.ListChangedType.ItemAdded, args.ListChangedType);\r
266             Assert.AreEqual(0, args.NewIndex);\r
267             Assert.AreEqual(-1, args.OldIndex);\r
268 \r
269             ok = false;\r
270             args = null;\r
271             customer.Orders.Clear();\r
272             Assert.IsTrue(ok);\r
273             Assert.AreEqual(System.ComponentModel.ListChangedType.Reset, args.ListChangedType);\r
274             Assert.AreEqual(0, args.NewIndex);\r
275             Assert.AreEqual(-1, args.OldIndex);\r
276 \r
277             ok = false;\r
278             args = null;\r
279             customer.Orders.Insert(0, new Order());\r
280             Assert.IsTrue(ok);\r
281             Assert.AreEqual(System.ComponentModel.ListChangedType.ItemAdded, args.ListChangedType);\r
282             Assert.AreEqual(0, args.NewIndex);\r
283             Assert.AreEqual(-1, args.OldIndex);\r
284 \r
285             ok = false;\r
286             args = null;\r
287             customer.Orders.RemoveAt(0);\r
288             Assert.IsTrue(ok);\r
289             Assert.AreEqual(System.ComponentModel.ListChangedType.ItemDeleted, args.ListChangedType);\r
290             Assert.AreEqual(args.NewIndex, 0);\r
291             Assert.AreEqual(args.OldIndex, -1);\r
292         }\r
293 \r
294         [Test]\r
295         public void Load()\r
296         {\r
297             var db = CreateDB();\r
298             var customer = db.Customers.First();\r
299             var orders = customer.Orders;\r
300 \r
301             Assert.IsFalse(orders.HasLoadedOrAssignedValues);\r
302             orders.Load();\r
303             Assert.IsTrue(orders.HasLoadedOrAssignedValues);\r
304         }\r
305 \r
306         [Test]\r
307         public void DeferedExecution()\r
308         {\r
309             var db = CreateDB();\r
310             var customer = db.Customers.First();\r
311             Assert.IsTrue(customer.Orders.IsDeferred);\r
312 \r
313             customer.Orders.Load();\r
314             Assert.IsFalse(customer.Orders.IsDeferred);\r
315         }\r
316 \r
317 #if !DEBUG && (SQLITE || POSTGRES || (MSSQL && !L2SQL))\r
318         [Explicit]\r
319 #endif\r
320         [Test]\r
321         public void DeferedExecutionAndLoadWith()\r
322         {\r
323             var db = CreateDB();\r
324             DataLoadOptions loadoptions = new DataLoadOptions();\r
325             loadoptions.LoadWith<Customer>(c => c.Orders);\r
326             db.LoadOptions = loadoptions;\r
327 \r
328             var customer = db.Customers.First();\r
329             Assert.IsFalse(customer.Orders.IsDeferred, "#1");\r
330             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues, "#2");\r
331         }\r
332 \r
333         [Test]\r
334         public void Add()\r
335         {\r
336             var db = CreateDB();\r
337             var customer = db.Customers.First();\r
338             int beforeCount = customer.Orders.Count;\r
339             var order = new Order();\r
340             customer.Orders.Add(order);\r
341             Assert.AreEqual(beforeCount + 1, customer.Orders.Count, "#3");\r
342             customer.Orders.Add(order); // do not actually add\r
343             Assert.AreEqual(beforeCount + 1, customer.Orders.Count, "#4");\r
344         }\r
345 \r
346         [Test]\r
347         [ExpectedException (typeof (ArgumentOutOfRangeException))]\r
348         public void IList_Add()\r
349         {\r
350             var db = CreateDB();\r
351             var customer = db.Customers.First();\r
352             var order = new Order();\r
353             ((IList)customer.Orders).Add(order);\r
354             ((IList)customer.Orders).Add(order); // raises ArgumentOutOfRangeException for duplicate\r
355         }\r
356 \r
357         [Test]\r
358         public void Clear()\r
359         {\r
360             var db = CreateDB();\r
361             var customer = db.Customers.First();\r
362 \r
363             if (customer.Orders.Count == 0)\r
364                 Assert.Ignore();\r
365 \r
366             customer.Orders.Clear();\r
367             Assert.AreEqual(customer.Orders.Count, 0);\r
368         }\r
369 \r
370         [Test]\r
371         public void AddRange()\r
372         {\r
373             var db = CreateDB();\r
374             var customer = db.Customers.First();\r
375             int beforeCount = customer.Orders.Count;\r
376             var order = new Order();\r
377             customer.Orders.AddRange(new Order[] { order, new Order() });\r
378             Assert.AreEqual(beforeCount + 2, customer.Orders.Count);\r
379             customer.Orders.AddRange(new Order[] { new Order(), order }); // one is existing -> not added\r
380             Assert.AreEqual(beforeCount + 3, customer.Orders.Count);\r
381         }\r
382 \r
383         [Test]\r
384         public void Remove()\r
385         {\r
386             var db = CreateDB();\r
387             var customer = db.Customers.First();\r
388             Assert.IsTrue(customer.Orders.IsDeferred);\r
389             int beforeCount = customer.Orders.Count;\r
390             Assert.IsFalse(customer.Orders.IsDeferred);\r
391 \r
392             if (beforeCount == 0)\r
393                 Assert.Ignore();\r
394 \r
395             Assert.IsFalse(customer.Orders.Remove(null));\r
396             Assert.AreEqual(beforeCount, customer.Orders.Count);\r
397 \r
398             Assert.IsTrue(customer.Orders.Remove(customer.Orders.First()));\r
399             Assert.AreEqual(customer.Orders.Count, beforeCount - 1);\r
400         }\r
401 \r
402         [Test]\r
403         public void RemoveAt()\r
404         {\r
405             var db = CreateDB();\r
406             var customer = db.Customers.First();\r
407             int beforeCount = customer.Orders.Count;\r
408 \r
409             if (beforeCount == 0)\r
410                 Assert.Ignore();\r
411 \r
412             customer.Orders.RemoveAt(0);\r
413             Assert.AreEqual(customer.Orders.Count, beforeCount - 1);\r
414         }\r
415 \r
416         [Test]\r
417         public void RemoveAll()\r
418         {\r
419             Clear();\r
420         }\r
421     }\r
422 }\r