Mercurial > pub > bltoolkit
comparison UnitTests/Linq/Inheritance.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Collections.Generic; | |
3 using System.Linq; | |
4 using BLToolkit.Data.DataProvider; | |
5 using BLToolkit.Data.Linq; | |
6 using BLToolkit.Data.Sql.SqlProvider; | |
7 using BLToolkit.DataAccess; | |
8 using BLToolkit.Mapping; | |
9 | |
10 using NUnit.Framework; | |
11 | |
12 namespace Data.Linq | |
13 { | |
14 using Model; | |
15 | |
16 [TestFixture] | |
17 public class Inheritance : TestBase | |
18 { | |
19 [Test] | |
20 public void Test1() | |
21 { | |
22 ForEachProvider(db => AreEqual(ParentInheritance, db.ParentInheritance)); | |
23 } | |
24 | |
25 [Test] | |
26 public void Test2() | |
27 { | |
28 ForEachProvider(db => AreEqual(ParentInheritance, db.ParentInheritance.Select(p => p))); | |
29 } | |
30 | |
31 [Test] | |
32 public void Test3() | |
33 { | |
34 ForEachProvider(db => AreEqual( | |
35 from p in ParentInheritance where p is ParentInheritance1 select p, | |
36 from p in db.ParentInheritance where p is ParentInheritance1 select p)); | |
37 } | |
38 | |
39 [Test] | |
40 public void Test4() | |
41 { | |
42 ForEachProvider(db => AreEqual( | |
43 from p in ParentInheritance where !(p is ParentInheritanceNull) select p, | |
44 from p in db.ParentInheritance where !(p is ParentInheritanceNull) select p)); | |
45 } | |
46 | |
47 [Test] | |
48 public void Test5() | |
49 { | |
50 ForEachProvider(db => AreEqual( | |
51 from p in ParentInheritance where p is ParentInheritanceValue select p, | |
52 from p in db.ParentInheritance where p is ParentInheritanceValue select p)); | |
53 } | |
54 | |
55 [Test] | |
56 public void Test6() | |
57 { | |
58 ForEachProvider(db => | |
59 { | |
60 var q = from p in db.ParentInheritance2 where p is ParentInheritance12 select p; | |
61 q.ToList(); | |
62 }); | |
63 } | |
64 | |
65 [Test] | |
66 public void Test7() | |
67 { | |
68 #pragma warning disable 183 | |
69 var expected = from p in ParentInheritance where p is ParentInheritanceBase select p; | |
70 ForEachProvider(db => AreEqual(expected, from p in db.ParentInheritance where p is ParentInheritanceBase select p)); | |
71 #pragma warning restore 183 | |
72 } | |
73 | |
74 [Test] | |
75 public void Test8() | |
76 { | |
77 ForEachProvider(db => AreEqual( | |
78 ParentInheritance.OfType<ParentInheritance1>(), | |
79 db.ParentInheritance.OfType<ParentInheritance1>())); | |
80 } | |
81 | |
82 [Test] | |
83 public void Test9() | |
84 { | |
85 ForEachProvider(db => | |
86 AreEqual( | |
87 ParentInheritance | |
88 .Where(p => p.ParentID == 1 || p.ParentID == 2 || p.ParentID == 4) | |
89 .OfType<ParentInheritanceNull>(), | |
90 db.ParentInheritance | |
91 .Where(p => p.ParentID == 1 || p.ParentID == 2 || p.ParentID == 4) | |
92 .OfType<ParentInheritanceNull>())); | |
93 } | |
94 | |
95 [Test] | |
96 public void Test10() | |
97 { | |
98 var expected = ParentInheritance.OfType<ParentInheritanceValue>(); | |
99 ForEachProvider(db => AreEqual(expected, db.ParentInheritance.OfType<ParentInheritanceValue>())); | |
100 } | |
101 | |
102 [Test] | |
103 public void Test11() | |
104 { | |
105 ForEachProvider(db => | |
106 { | |
107 var q = from p in db.ParentInheritance3 where p is ParentInheritance13 select p; | |
108 q.ToList(); | |
109 }); | |
110 } | |
111 | |
112 [Test] | |
113 public void Test12() | |
114 { | |
115 ForEachProvider(db => AreEqual( | |
116 from p in ParentInheritance1 where p.ParentID == 1 select p, | |
117 from p in db.ParentInheritance1 where p.ParentID == 1 select p)); | |
118 } | |
119 | |
120 //[Test] | |
121 public void Test13() | |
122 { | |
123 ForEachProvider(db => AreEqual( | |
124 from p in ParentInheritance4 | |
125 join c in Child on p.ParentID equals c.ParentID | |
126 select p, | |
127 from p in db.ParentInheritance4 | |
128 join c in db.Child on p.ParentID equals c.ParentID | |
129 select p)); | |
130 } | |
131 | |
132 [Test] | |
133 public void TypeCastAsTest1([IncludeDataContexts("Northwind")] string context) | |
134 { | |
135 using (var db = new NorthwindDB()) | |
136 AreEqual( | |
137 DiscontinuedProduct.ToList() | |
138 .Select(p => p as Northwind.Product) | |
139 .Select(p => p == null ? "NULL" : p.ProductName), | |
140 db.DiscontinuedProduct | |
141 .Select(p => p as Northwind.Product) | |
142 .Select(p => p == null ? "NULL" : p.ProductName)); | |
143 } | |
144 | |
145 [Test] | |
146 public void TypeCastAsTest11([IncludeDataContexts("Northwind")] string context) | |
147 { | |
148 using (var db = new NorthwindDB()) | |
149 AreEqual( | |
150 DiscontinuedProduct.ToList() | |
151 .Select(p => new { p = p as Northwind.Product }) | |
152 .Select(p => p.p == null ? "NULL" : p.p.ProductName), | |
153 db.DiscontinuedProduct | |
154 .Select(p => new { p = p as Northwind.Product }) | |
155 .Select(p => p.p == null ? "NULL" : p.p.ProductName)); | |
156 } | |
157 | |
158 [Test] | |
159 public void TypeCastAsTest2([IncludeDataContexts("Northwind")] string context) | |
160 { | |
161 using (var db = new NorthwindDB()) | |
162 AreEqual( | |
163 Product.ToList() | |
164 .Select(p => p as Northwind.DiscontinuedProduct) | |
165 .Select(p => p == null ? "NULL" : p.ProductName), | |
166 db.Product | |
167 .Select(p => p as Northwind.DiscontinuedProduct) | |
168 .Select(p => p == null ? "NULL" : p.ProductName)); | |
169 } | |
170 | |
171 [Test] | |
172 public void FirstOrDefault([IncludeDataContexts("Northwind")] string context) | |
173 { | |
174 using (var db = new NorthwindDB()) | |
175 Assert.AreEqual( | |
176 DiscontinuedProduct.FirstOrDefault().ProductID, | |
177 db.DiscontinuedProduct.FirstOrDefault().ProductID); | |
178 } | |
179 | |
180 [Test] | |
181 public void Cast1() | |
182 { | |
183 ForEachProvider(db => AreEqual( | |
184 ParentInheritance.OfType<ParentInheritance1>().Cast<ParentInheritanceBase>(), | |
185 db.ParentInheritance.OfType<ParentInheritance1>().Cast<ParentInheritanceBase>())); | |
186 } | |
187 | |
188 class ParentEx : Parent | |
189 { | |
190 [MapIgnore] | |
191 protected bool Field1; | |
192 | |
193 public static void Test(Inheritance inheritance) | |
194 { | |
195 inheritance.ForEachProvider(db => inheritance.AreEqual( | |
196 inheritance.Parent.Select(p => new ParentEx { Field1 = true, ParentID = p.ParentID, Value1 = p.Value1 }).Cast<Parent>(), | |
197 db.Parent.Select(p => new ParentEx { Field1 = true, ParentID = p.ParentID, Value1 = p.Value1 }).Cast<Parent>())); | |
198 } | |
199 } | |
200 | |
201 [Test] | |
202 public void Cast2() | |
203 { | |
204 ParentEx.Test(this); | |
205 } | |
206 | |
207 [TableName("Person")] | |
208 class PersonEx : Person | |
209 { | |
210 } | |
211 | |
212 [Test] | |
213 public void SimplTest() | |
214 { | |
215 using (var db = new TestDbManager()) | |
216 Assert.AreEqual(1, db.GetTable<PersonEx>().Where(_ => _.FirstName == "John").Select(_ => _.ID).Single()); | |
217 } | |
218 | |
219 [InheritanceMapping(Code = 1, Type = typeof(Parent222))] | |
220 [TableName("Parent")] | |
221 public class Parent111 | |
222 { | |
223 [MapField(IsInheritanceDiscriminator = true)] | |
224 public int ParentID; | |
225 } | |
226 | |
227 [MapField("Value1", "Value.ID")] | |
228 public class Parent222 : Parent111 | |
229 { | |
230 [MapIgnore] | |
231 public Value111 Value; | |
232 } | |
233 | |
234 public class Value111 | |
235 { | |
236 public int ID; | |
237 } | |
238 | |
239 [Test] | |
240 public void InheritanceMappingIssueTest() | |
241 { | |
242 using (var db = new TestDbManager()) | |
243 { | |
244 var q1 = db.GetTable<Parent222>(); | |
245 var q = q1.Where(_ => _.Value.ID == 1); | |
246 | |
247 var sql = ((ExpressionQuery<Parent222>)q).SqlText; | |
248 Assert.IsNotEmpty(sql); | |
249 } | |
250 } | |
251 | |
252 [Test] | |
253 public void ReferenceNavigation([IncludeDataContexts("Northwind")] string context) | |
254 { | |
255 using (var db = new NorthwindDB()) | |
256 { | |
257 var result = | |
258 from od in db.OrderDetail | |
259 where od.Product.Category.CategoryName == "Seafood" | |
260 select new { od.Order, od.Product }; | |
261 | |
262 var list = result.ToList(); | |
263 | |
264 Assert.AreEqual(330, list.Count); | |
265 | |
266 foreach (var item in list) | |
267 { | |
268 Assert.IsNotNull(item); | |
269 Assert.IsNotNull(item.Order); | |
270 Assert.IsNotNull(item.Product); | |
271 Assert.IsTrue( | |
272 item.Product.Discontinued && item.Product is Northwind.DiscontinuedProduct || | |
273 !item.Product.Discontinued && item.Product is Northwind.ActiveProduct); | |
274 } | |
275 } | |
276 } | |
277 | |
278 [Test] | |
279 public void TypeCastIsChildConditional1([IncludeDataContexts("Northwind")] string context) | |
280 { | |
281 using (var db = new NorthwindDB()) | |
282 { | |
283 var result = db.Product. Select(x => x is Northwind.DiscontinuedProduct ? x : null); | |
284 var expected = db.Product.ToList().Select(x => x is Northwind.DiscontinuedProduct ? x : null); | |
285 | |
286 var list = result.ToList(); | |
287 | |
288 Assert.Greater(list.Count, 0); | |
289 Assert.AreEqual(expected.Count(), list.Count); | |
290 Assert.IsTrue(list.Except(expected).Count() == 0); | |
291 Assert.IsTrue(list.Contains(null)); | |
292 } | |
293 } | |
294 | |
295 [Test] | |
296 public void TypeCastIsChildConditional2([IncludeDataContexts("Northwind")] string context) | |
297 { | |
298 using (var db = new NorthwindDB()) | |
299 { | |
300 var result = db.Product. Select(x => x is Northwind.DiscontinuedProduct); | |
301 var expected = db.Product.ToList().Select(x => x is Northwind.DiscontinuedProduct); | |
302 | |
303 var list = result.ToList(); | |
304 | |
305 Assert.Greater(list.Count, 0); | |
306 Assert.AreEqual(expected.Count(), list.Count); | |
307 Assert.IsTrue(list.Except(expected).Count() == 0); | |
308 } | |
309 } | |
310 | |
311 [Test] | |
312 public void TypeCastIsChild([IncludeDataContexts("Northwind")] string context) | |
313 { | |
314 using (var db = new NorthwindDB()) | |
315 { | |
316 var result = db.Product.Where(x => x is Northwind.DiscontinuedProduct).ToList(); | |
317 var expected = Product.Where(x => x is Northwind.DiscontinuedProduct).ToList(); | |
318 | |
319 Assert.Greater(result.Count, 0); | |
320 Assert.AreEqual(result.Count, expected.Count); | |
321 } | |
322 } | |
323 | |
324 #region Models for Test14 | |
325 | |
326 interface IChildTest14 | |
327 { | |
328 int ChildID { get; set; } | |
329 } | |
330 | |
331 [TableName("Child")] | |
332 class ChildTest14 : IChildTest14 | |
333 { | |
334 [PrimaryKey] | |
335 public int ChildID { get; set; } | |
336 | |
337 } | |
338 | |
339 T FindById<T>(IQueryable<T> queryable, int id) | |
340 where T : IChildTest14 | |
341 { | |
342 return queryable.Where(x => x.ChildID == id).FirstOrDefault(); | |
343 } | |
344 | |
345 #endregion | |
346 | |
347 [Test] | |
348 public void Test14() | |
349 { | |
350 ForEachProvider(db => | |
351 { | |
352 var q = db.GetTable<ChildTest14>().Select(c => new ChildTest14() { ChildID = c.ChildID }); | |
353 FindById(q, 10); | |
354 }); | |
355 } | |
356 | |
357 [Test] | |
358 public void Test15([IncludeDataContexts("Northwind")] string context) | |
359 { | |
360 using (var db = new NorthwindDB()) | |
361 { | |
362 var result = db.DiscontinuedProduct.Select(p => p).ToList(); | |
363 var expected = DiscontinuedProduct.Select(p => p).ToList(); | |
364 | |
365 Assert.That(result.Count, Is.Not.EqualTo(0).And.EqualTo(expected.Count)); | |
366 } | |
367 } | |
368 | |
369 [Test] | |
370 public void Test16([IncludeDataContexts("Northwind")] string context) | |
371 { | |
372 using (var db = new NorthwindDB()) | |
373 { | |
374 var result = db.DiscontinuedProduct.ToList(); | |
375 var expected = DiscontinuedProduct.ToList(); | |
376 | |
377 Assert.That(result.Count, Is.Not.EqualTo(0).And.EqualTo(expected.Count)); | |
378 } | |
379 } | |
380 | |
381 public enum TypeCodeEnum | |
382 { | |
383 Base, | |
384 A, | |
385 A1, | |
386 A2, | |
387 } | |
388 | |
389 [TableName("LinqDataTypes")] | |
390 public abstract class InheritanceBase | |
391 { | |
392 public Guid GuidValue { get; set; } | |
393 | |
394 [MapField("ID")] | |
395 public virtual TypeCodeEnum TypeCode | |
396 { | |
397 get { return TypeCodeEnum.Base; } | |
398 } | |
399 } | |
400 | |
401 [InheritanceMapping(Code = TypeCodeEnum.A1, Type = typeof(InheritanceA1), IsDefault = false)] | |
402 [InheritanceMapping(Code = TypeCodeEnum.A2, Type = typeof(InheritanceA2), IsDefault = true)] | |
403 public abstract class InheritanceA : InheritanceBase | |
404 { | |
405 [Association(CanBeNull = true, ThisKey = "GuidValue", OtherKey = "GuidValue")] | |
406 public List<InheritanceB> Bs { get; set; } | |
407 | |
408 [MapField("ID", IsInheritanceDiscriminator = true)] | |
409 public override TypeCodeEnum TypeCode | |
410 { | |
411 get { return TypeCodeEnum.A; } | |
412 } | |
413 } | |
414 | |
415 class InheritanceA1 : InheritanceA | |
416 { | |
417 [MapField("ID", IsInheritanceDiscriminator = true)] | |
418 public override TypeCodeEnum TypeCode | |
419 { | |
420 get { return TypeCodeEnum.A1; } | |
421 } | |
422 } | |
423 | |
424 class InheritanceA2 : InheritanceA | |
425 { | |
426 [MapField("ID", IsInheritanceDiscriminator = true)] | |
427 public override TypeCodeEnum TypeCode | |
428 { | |
429 get { return TypeCodeEnum.A2; } | |
430 } | |
431 } | |
432 | |
433 public class InheritanceB : InheritanceBase | |
434 { | |
435 } | |
436 | |
437 [Test] | |
438 public void GuidTest() | |
439 { | |
440 using (var db = new TestDbManager()) | |
441 { | |
442 var list = db.GetTable<InheritanceA>().Where(a => a.Bs.Any()).ToList(); | |
443 } | |
444 } | |
445 | |
446 [Test] | |
447 public void QuerySyntaxSimpleTest() | |
448 { | |
449 ForEachProvider(db => | |
450 { | |
451 // db.GetTable<Parent111>().OfType<Parent222>().ToList(); - it's work!!! | |
452 (from p in db.GetTable<Parent111>().OfType<Parent222>() select p).ToList(); | |
453 }); | |
454 } | |
455 | |
456 [TableName("Person")] | |
457 [InheritanceMapping(Code = 1, Type = typeof(Test17John))] | |
458 [InheritanceMapping(Code = 2, Type = typeof(Test17Tester))] | |
459 public class Test17Person | |
460 { | |
461 [MapField(IsInheritanceDiscriminator = true)] | |
462 public int PersonID { get; set; } | |
463 } | |
464 | |
465 public class Test17John : Test17Person | |
466 { | |
467 public string FirstName { get; set; } | |
468 } | |
469 | |
470 public class Test17Tester : Test17Person | |
471 { | |
472 public string LastName { get; set; } | |
473 } | |
474 | |
475 [Test] | |
476 public void Test17() | |
477 { | |
478 ForEachProvider(context => | |
479 { | |
480 if (context is TestDbManager) | |
481 { | |
482 var db = (TestDbManager)context; | |
483 db.GetTable<Test17Person>().OfType<Test17John>().ToList(); | |
484 Assert.False(db.LastQuery.ToLowerInvariant().Contains("lastname"), "Why select LastName field??"); | |
485 } | |
486 }); | |
487 } | |
488 | |
489 [TableName("Person")] | |
490 [InheritanceMapping(Code = Gender.Male, Type = typeof(Test18Male))] | |
491 [InheritanceMapping(Code = Gender.Female, Type = typeof(Test18Female))] | |
492 public class Test18Person | |
493 { | |
494 [PrimaryKey, NonUpdatable(IsIdentity = true, OnInsert = true, OnUpdate = true), SequenceName("PERSONID")] | |
495 public int PersonID { get; set; } | |
496 [MapField(IsInheritanceDiscriminator = true)] | |
497 public Gender Gender { get; set; } | |
498 } | |
499 | |
500 public class Test18Male : Test18Person | |
501 { | |
502 public string FirstName { get; set; } | |
503 } | |
504 | |
505 public class Test18Female : Test18Person | |
506 { | |
507 public string FirstName { get; set; } | |
508 public string LastName { get; set; } | |
509 } | |
510 | |
511 [Test] | |
512 public void Test18() | |
513 { | |
514 ForEachProvider(db => | |
515 { | |
516 var ids = Enumerable.Range(0, 10).ToList(); | |
517 var q = | |
518 from p1 in db.GetTable<Test18Person>() | |
519 where ids.Contains(p1.PersonID) | |
520 join p2 in db.GetTable<Test18Person>() on p1.PersonID equals p2.PersonID | |
521 select p1; | |
522 | |
523 var list = q.Distinct().OfType<Test18Female>().ToList(); | |
524 }); | |
525 } | |
526 | |
527 [Test] | |
528 public void Test19() | |
529 { | |
530 ForEachProvider(db => | |
531 { | |
532 var ids = Enumerable.Range(0, 10).ToList(); | |
533 var q = | |
534 from p1 in db.GetTable<Test18Person>() | |
535 where ids.Contains(p1.PersonID) | |
536 join p2 in db.GetTable<Test18Person>() on p1.PersonID equals p2.PersonID | |
537 select p1; | |
538 | |
539 IQueryable iq = q.Distinct(); | |
540 var list = iq.OfType<Test18Female>().ToList(); | |
541 }); | |
542 } | |
543 } | |
544 } |