* src/**/*: Flush; syncs to DbLinq r1053. Adds
[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 && MONO_STRICT\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             Assert.Greater(customer.Orders.Count, 0);\r
57         }\r
58 \r
59         [Test]\r
60         public void EntitySetEnumerationProjection()\r
61         {\r
62             var db = CreateDB();\r
63             var results = (from c in db.Customers select c.Orders).ToList();\r
64 \r
65             Assert.Greater(results.Count, 0);\r
66         }\r
67 \r
68         [Test]\r
69         public void HasLoadedOrAsignedValues01()\r
70         {\r
71             var db = CreateDB();\r
72             var customer = db.Customers.First();\r
73             Assert.IsFalse(customer.Orders.HasLoadedOrAssignedValues);\r
74 \r
75             customer.Orders.Add(new Order());\r
76             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues);\r
77         }\r
78 \r
79         [Test]\r
80         public void HasLoadedOrAsignedValues02()\r
81         {\r
82             var db = CreateDB();\r
83             var customer = db.Customers.First();\r
84             Assert.IsFalse(customer.Orders.HasLoadedOrAssignedValues);\r
85 \r
86             customer.Orders.Assign(System.Linq.Enumerable.Empty<Order>());\r
87             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues);\r
88         }\r
89 \r
90 \r
91         [Test]\r
92         [ExpectedException(typeof(InvalidOperationException))]\r
93         public void InvalidSourceChange()\r
94         {\r
95             var db = CreateDB();\r
96             var customer = db.Customers.First();\r
97 \r
98             Assert.Greater(customer.Orders.Count, 0, "#1");\r
99             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues, "#2");\r
100             customer.Orders.SetSource(System.Linq.Enumerable.Empty<Order>());\r
101         }\r
102 \r
103         [Test]\r
104         [ExpectedException(typeof(InvalidOperationException))]\r
105         public void InvalidSourceChange2()\r
106         {\r
107             var db = CreateDB();\r
108             var customer = db.Customers.First();\r
109             Assert.IsFalse(customer.Orders.HasLoadedOrAssignedValues, "#1");\r
110             customer.Orders.Assign(new List<Order>());\r
111             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues, "#2");\r
112             customer.Orders.SetSource(System.Linq.Enumerable.Empty<Order>());\r
113         }\r
114 \r
115         [Test]\r
116         [ExpectedException(typeof(InvalidOperationException))]\r
117         public void InvalidSourceChange3()\r
118         {\r
119             var db = CreateDB();\r
120             var customer = db.Customers.First();\r
121             customer.Orders.SetSource(new List<Order>());\r
122             Assert.IsFalse(customer.Orders.HasLoadedOrAssignedValues, "#1");\r
123             customer.Orders.Load();\r
124             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues, "#2");\r
125             customer.Orders.SetSource(System.Linq.Enumerable.Empty<Order>());\r
126         }\r
127 \r
128         [Test]\r
129         public void SourceChange()\r
130         {\r
131             var db = CreateDB();\r
132 \r
133             int ordersCount = (from cust in db.Customers\r
134                                select cust.Orders.Count).First();\r
135 \r
136             Assert.Greater(ordersCount, 0);\r
137 \r
138             var customer2 = db.Customers.First();\r
139             customer2.Orders.SetSource(System.Linq.Enumerable.Empty<Order>());\r
140             Assert.AreEqual(customer2.Orders.Count, 0);\r
141         }\r
142 \r
143 \r
144         [Test]\r
145         public void Refresh01()\r
146         {\r
147             var db = CreateDB();\r
148             var c = db.Customers.First();\r
149 \r
150             int beforeCount = c.Orders.Count;\r
151             Assert.Greater(beforeCount, 0);\r
152             c.Orders.Clear();\r
153             Assert.AreEqual(c.Orders.Count, 0);\r
154             c.Orders.AddRange(db.Orders);\r
155             Assert.Greater(c.Orders.Count, beforeCount);\r
156             db.Refresh(RefreshMode.OverwriteCurrentValues, c.Orders);\r
157 \r
158             Assert.AreEqual(c.Orders.Count, beforeCount);\r
159         }\r
160 \r
161         [Test]\r
162         public void Refresh02()\r
163         {\r
164             var db = CreateDB();\r
165             var c = db.Customers.First();\r
166 \r
167             int beforeCount = c.Orders.Count;\r
168             Assert.Greater(beforeCount, 0);\r
169             c.Orders.Clear();\r
170             Assert.AreEqual(c.Orders.Count, 0);\r
171             c.Orders.AddRange(db.Orders);\r
172 \r
173             int middleCount = c.Orders.Count;\r
174             Assert.Greater(c.Orders.Count, beforeCount);\r
175 \r
176             db.Refresh(RefreshMode.KeepCurrentValues, c.Orders);\r
177             Assert.AreEqual(c.Orders.Count, middleCount);\r
178 \r
179             db.Refresh(RefreshMode.KeepChanges, c.Orders);\r
180             Assert.AreEqual(c.Orders.Count, middleCount);\r
181         }\r
182 \r
183 \r
184         [Test]\r
185         public void Refresh03()\r
186         {\r
187             var db = CreateDB();\r
188             var c = db.Customers.First();\r
189 \r
190             var order = c.Orders.First();\r
191             string newcustomerId = "NEWCUSTOMERID";\r
192             order.CustomerID = newcustomerId;\r
193 \r
194             db.Refresh(RefreshMode.OverwriteCurrentValues, c.Orders);\r
195             Assert.AreNotEqual(order.CustomerID, newcustomerId);\r
196         }\r
197 \r
198         [Test]\r
199         public void Refresh04()\r
200         {\r
201             var db = CreateDB();\r
202             var c = db.Customers.First();\r
203 \r
204             var order = c.Orders.First();\r
205             string newcustomerId = "NEWCUSTOMERID";\r
206             order.CustomerID = newcustomerId;\r
207 \r
208             db.Refresh(RefreshMode.KeepCurrentValues, c.Orders);\r
209             Assert.AreEqual(order.CustomerID, newcustomerId);\r
210 \r
211             db.Refresh(RefreshMode.KeepChanges, c.Orders);\r
212             Assert.AreEqual(order.CustomerID, newcustomerId);\r
213         }\r
214 \r
215 \r
216         [Test]\r
217         public void ListChangedEvent()\r
218         {\r
219             var db = CreateDB();\r
220             var customer = db.Customers.Where(c => c.Orders.Count > 0).First();\r
221             Assert.Greater(customer.Orders.Count, 0);\r
222             bool ok;\r
223             System.ComponentModel.ListChangedEventArgs args = null;\r
224             customer.Orders.ListChanged += delegate(object sender, System.ComponentModel.ListChangedEventArgs a) \r
225                 { \r
226                     ok = true; \r
227                     args = a; \r
228                 };\r
229 \r
230             ok = false;\r
231             args = null;\r
232             customer.Orders.Remove(customer.Orders.First());\r
233             Assert.IsTrue(ok);\r
234 \r
235             ok = false;\r
236             args = null;\r
237             customer.Orders.Assign(Enumerable.Empty<Order>());\r
238             Assert.IsTrue(ok);\r
239 \r
240             ok = false;\r
241             args = null;\r
242             customer.Orders.Add(db.Orders.First());\r
243             Assert.IsTrue(ok);\r
244 \r
245             ok = false;\r
246             args = null;\r
247             customer.Orders.Clear();\r
248             Assert.IsTrue(ok);\r
249 \r
250             ok = false;\r
251             args = null;\r
252             customer.Orders.Insert(0, new Order());\r
253             Assert.IsTrue(ok);\r
254 \r
255             ok = false;\r
256             args = null;\r
257             customer.Orders.RemoveAt(0);\r
258             Assert.IsTrue(ok);\r
259         }\r
260 \r
261         [Test]\r
262         public void Load()\r
263         {\r
264             var db = CreateDB();\r
265             var customer = db.Customers.First();\r
266             var orders = customer.Orders;\r
267 \r
268             Assert.IsFalse(orders.HasLoadedOrAssignedValues);\r
269             orders.Load();\r
270             Assert.IsTrue(orders.HasLoadedOrAssignedValues);\r
271         }\r
272 \r
273         [Test]\r
274         public void DeferedExecution()\r
275         {\r
276             var db = CreateDB();\r
277             var customer = db.Customers.First();\r
278             Assert.IsTrue(customer.Orders.IsDeferred);\r
279 \r
280             customer.Orders.Load();\r
281             Assert.IsFalse(customer.Orders.IsDeferred);\r
282         }\r
283 \r
284         [Test]\r
285         public void DeferedExecutionAndLoadWith()\r
286         {\r
287             var db = CreateDB();\r
288             DataLoadOptions loadoptions = new DataLoadOptions();\r
289             loadoptions.LoadWith<Customer>(c => c.Orders);\r
290             db.LoadOptions = loadoptions;\r
291 \r
292             var customer = db.Customers.First();\r
293             Assert.IsFalse(customer.Orders.IsDeferred, "#1");\r
294             Assert.IsTrue(customer.Orders.HasLoadedOrAssignedValues, "#2");\r
295         }\r
296 \r
297         [Test]\r
298         public void Add()\r
299         {\r
300             var db = CreateDB();\r
301             var customer = db.Customers.First();\r
302             Assert.AreEqual("jacques", customer.ContactName, "#1");\r
303             int beforeCount = customer.Orders.Count;\r
304             Assert.AreEqual(1, beforeCount, "#2");\r
305             var order = new Order();\r
306             customer.Orders.Add(order);\r
307             Assert.AreEqual(beforeCount + 1, customer.Orders.Count, "#3");\r
308             customer.Orders.Add(order); // do not actually add\r
309             Assert.AreEqual(beforeCount + 1, customer.Orders.Count, "#4");\r
310         }\r
311 \r
312         [Test]\r
313         [ExpectedException (typeof (ArgumentOutOfRangeException))]\r
314         public void IList_Add()\r
315         {\r
316             var db = CreateDB();\r
317             var customer = db.Customers.First();\r
318             Assert.AreEqual("jacques", customer.ContactName, "#1");\r
319             int beforeCount = customer.Orders.Count;\r
320             Assert.AreEqual(1, beforeCount, "#2");\r
321             var order = new Order();\r
322             ((IList)customer.Orders).Add(order);\r
323             ((IList)customer.Orders).Add(order); // raises ArgumentOutOfRangeException for duplicate\r
324         }\r
325 \r
326         [Test]\r
327         public void Clear()\r
328         {\r
329             var db = CreateDB();\r
330             var customer = db.Customers.First();\r
331 \r
332             if (customer.Orders.Count == 0)\r
333                 Assert.Ignore();\r
334 \r
335             customer.Orders.Clear();\r
336             Assert.AreEqual(customer.Orders.Count, 0);\r
337         }\r
338 \r
339         [Test]\r
340         public void AddRange()\r
341         {\r
342             var db = CreateDB();\r
343             var customer = db.Customers.First();\r
344             int beforeCount = customer.Orders.Count;\r
345             var order = new Order();\r
346             customer.Orders.AddRange(new Order[] { order, new Order() });\r
347             Assert.AreEqual(beforeCount + 2, customer.Orders.Count);\r
348             customer.Orders.AddRange(new Order[] { new Order(), order }); // one is existing -> not added\r
349             Assert.AreEqual(beforeCount + 3, customer.Orders.Count);\r
350         }\r
351 \r
352         [Test]\r
353         public void Remove()\r
354         {\r
355             var db = CreateDB();\r
356             var customer = db.Customers.First();\r
357             int beforeCount = customer.Orders.Count;\r
358 \r
359             if (beforeCount == 0)\r
360                 Assert.Ignore();\r
361 \r
362             customer.Orders.Remove(customer.Orders.First());\r
363             Assert.AreEqual(customer.Orders.Count, beforeCount - 1);\r
364         }\r
365 \r
366         [Test]\r
367         public void RemoveAt()\r
368         {\r
369             var db = CreateDB();\r
370             var customer = db.Customers.First();\r
371             int beforeCount = customer.Orders.Count;\r
372 \r
373             if (beforeCount == 0)\r
374                 Assert.Ignore();\r
375 \r
376             customer.Orders.RemoveAt(0);\r
377             Assert.AreEqual(customer.Orders.Count, beforeCount - 1);\r
378         }\r
379 \r
380         [Test]\r
381         public void RemoveAll()\r
382         {\r
383             Clear();\r
384         }\r
385     }\r
386 }\r