comparison UnitTests/Linq/TestBase.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;
3 using System.Collections.Generic;
4 using System.Diagnostics;
5 using System.IO;
6 using System.Linq;
7 using System.Reflection;
8 using System.ServiceModel;
9 using System.ServiceModel.Description;
10
11 using BLToolkit.Data.DataProvider;
12 using BLToolkit.Common;
13 using BLToolkit.Data;
14 using BLToolkit.Data.Linq;
15 using BLToolkit.Data.Sql.SqlProvider;
16 using BLToolkit.Mapping;
17 using BLToolkit.ServiceModel;
18
19 using NUnit.Framework;
20
21 namespace Data.Linq
22 {
23 using Model;
24
25 // fix for failing tests due to use of "," vs "." in numbers parsing for some cultures
26 [SetCulture("")]
27 public class TestBase
28 {
29 static TestBase()
30 {
31 var providerListFile =
32 File.Exists(@"..\..\UserDataProviders.txt") ?
33 @"..\..\UserDataProviders.txt" :
34 @"..\..\DefaultDataProviders.txt";
35
36 UserProviders.AddRange(
37 File.ReadAllLines(providerListFile)
38 .Select(s => s.Trim())
39 .Where (s => s.Length > 0 && !s.StartsWith("--")));
40
41 AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
42 {
43 string assembly;
44
45 if (args.Name.IndexOf("Sybase.AdoNet2.AseClient") >= 0) assembly = @"Sybase\Sybase.AdoNet2.AseClient.dll";
46 else if (args.Name.IndexOf("Oracle.DataAccess") >= 0) assembly = @"Oracle\Oracle.DataAccess.dll";
47 else if (args.Name.IndexOf("IBM.Data.DB2") >= 0) assembly = @"IBM\IBM.Data.DB2.dll";
48 else if (args.Name.IndexOf("Npgsql.resources") >= 0) return null;
49 else if (args.Name.IndexOf("Npgsql") >= 0) assembly = @"PostgreSql\Npgsql.dll";
50 else if (args.Name.IndexOf("Mono.Security") >= 0) assembly = @"PostgreSql\Mono.Security.dll";
51 else if (args.Name.IndexOf("System.Data.SqlServerCe,") >= 0) assembly = @"SqlCe\System.Data.SqlServerCe.dll";
52 else
53 return null;
54
55 assembly = @"..\..\..\..\Redist\" + assembly;
56
57 if (!File.Exists(assembly))
58 assembly = @"..\..\" + assembly;
59
60 return Assembly.LoadFrom(assembly);
61 };
62
63 DbManager.TurnTraceSwitchOn();
64
65 PostgreSQLSqlProvider.QuoteIdentifiers = true;
66
67 var path = Path.GetDirectoryName(typeof(DbManager).Assembly.CodeBase.Replace("file:///", ""));
68
69 foreach (var info in Providers)
70 {
71 try
72 {
73 Type type;
74
75 if (info.Assembly == null)
76 {
77 type = typeof(DbManager).Assembly.GetType(info.Type, true);
78 }
79 else
80 {
81 #if FW4
82 var fileName = info.Assembly + ".4.dll";
83 #else
84 var fileName = info.Assembly + ".3.dll";
85 #endif
86
87 var assembly = Assembly.LoadFile(Path.Combine(path, fileName));
88
89 type = assembly.GetType(info.Type, true);
90 }
91
92 DbManager.AddDataProvider(type);
93
94 info.Loaded = true;
95 }
96 catch (Exception)
97 {
98 info.Loaded = false;
99 }
100 }
101
102 LinqService.TypeResolver = str =>
103 {
104 switch (str)
105 {
106 //case "Data.Linq.Model.Gender" : return typeof(Gender);
107 case "Data.Linq.Model.Person": return typeof(Person);
108 default : return null;
109 }
110 };
111 }
112
113 const int StartIP = 12345;
114 static int _lastIP = StartIP;
115
116 static int GetIP(string config)
117 {
118 int ip;
119
120 if (_ips.TryGetValue(config, out ip))
121 return ip;
122
123 _lastIP++;
124
125 var host = new ServiceHost(new LinqService(config) { AllowUpdates = true }, new Uri("net.tcp://localhost:" + _lastIP));
126
127 host.Description.Behaviors.Add(new ServiceMetadataBehavior());
128 host.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true;
129 host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
130 host.AddServiceEndpoint(
131 typeof(ILinqService),
132 new NetTcpBinding(SecurityMode.None)
133 {
134 MaxReceivedMessageSize = 10000000,
135 MaxBufferPoolSize = 10000000,
136 MaxBufferSize = 10000000,
137 CloseTimeout = new TimeSpan(00, 01, 00),
138 OpenTimeout = new TimeSpan(00, 01, 00),
139 ReceiveTimeout = new TimeSpan(00, 10, 00),
140 SendTimeout = new TimeSpan(00, 10, 00),
141 },
142 "LinqOverWCF");
143
144 host.Open();
145
146 _ips.Add(config, _lastIP);
147
148 return _lastIP;
149 }
150
151 public class ProviderInfo
152 {
153 public ProviderInfo(string name, string assembly, string type)
154 {
155 Name = name;
156 Assembly = assembly;
157 Type = type;
158 }
159
160 public readonly string Name;
161 public readonly string Assembly;
162 public readonly string Type;
163 public bool Loaded;
164 public int IP;
165 public bool Skip;
166 }
167
168 public static readonly List<string> UserProviders = new List<string>();
169 public static readonly List<ProviderInfo> Providers = new List<ProviderInfo>
170 {
171 new ProviderInfo("Sql2008", null, "BLToolkit.Data.DataProvider.Sql2008DataProvider"),
172 new ProviderInfo("Sql2012", null, "BLToolkit.Data.DataProvider.Sql2012DataProvider"),
173 new ProviderInfo(ProviderName.SqlCe, "BLToolkit.Data.DataProvider.SqlCe", "BLToolkit.Data.DataProvider.SqlCeDataProvider"),
174 new ProviderInfo(ProviderName.SQLite, "BLToolkit.Data.DataProvider.SQLite", "BLToolkit.Data.DataProvider.SQLiteDataProvider"),
175 new ProviderInfo(ProviderName.Access, null, "BLToolkit.Data.DataProvider.AccessDataProvider"),
176 new ProviderInfo("Sql2000", null, "BLToolkit.Data.DataProvider.Sql2000DataProvider"),
177 new ProviderInfo("Sql2005", null, "BLToolkit.Data.DataProvider.SqlDataProvider"),
178 new ProviderInfo(ProviderName.DB2, "BLToolkit.Data.DataProvider.DB2", "BLToolkit.Data.DataProvider.DB2DataProvider"),
179 new ProviderInfo(ProviderName.Informix, "BLToolkit.Data.DataProvider.Informix", "BLToolkit.Data.DataProvider.InformixDataProvider"),
180 new ProviderInfo(ProviderName.Firebird, "BLToolkit.Data.DataProvider.Firebird", "BLToolkit.Data.DataProvider.FdpDataProvider"),
181 new ProviderInfo("Oracle", "BLToolkit.Data.DataProvider.Oracle", "BLToolkit.Data.DataProvider.OdpDataProvider"),
182 new ProviderInfo("DevartOracle", "BLToolkit.Data.DataProvider.DevartOracle", "BLToolkit.Data.DataProvider.DevartOracleDataProvider"),
183 //new ProviderInfo("Oracle", "BLToolkit.Data.DataProvider.OracleManaged", "BLToolkit.Data.DataProvider.OdpManagedDataProvider"),
184 new ProviderInfo(ProviderName.PostgreSQL, "BLToolkit.Data.DataProvider.PostgreSQL", "BLToolkit.Data.DataProvider.PostgreSQLDataProvider"),
185 new ProviderInfo(ProviderName.MySql, "BLToolkit.Data.DataProvider.MySql", "BLToolkit.Data.DataProvider.MySqlDataProvider"),
186 new ProviderInfo(ProviderName.Sybase, "BLToolkit.Data.DataProvider.Sybase", "BLToolkit.Data.DataProvider.SybaseDataProvider"),
187 };
188
189 static IEnumerable<ITestDataContext> GetProviders(IEnumerable<string> exceptList)
190 {
191 var list = UserProviders.Concat(UserProviders.Select(p => p + ".LinqService"));
192
193 foreach (var info in Providers.Where(p => list.Contains(p.Name)))
194 {
195 if (exceptList.Contains(info.Name))
196 continue;
197
198 Debug.WriteLine(info.Name, "Provider ");
199
200 if (!info.Loaded)
201 continue;
202
203 yield return new TestDbManager(info.Name);
204
205 var ip = GetIP(info.Name);
206 var dx = new TestServiceModelDataContext(ip);
207
208 Debug.WriteLine(((IDataContext)dx).ContextID, "Provider ");
209
210 yield return dx;
211 }
212 }
213
214 [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
215 public class DataContextsAttribute : ValuesAttribute
216 {
217 public DataContextsAttribute(params string[] except)
218 {
219 Except = except;
220 }
221
222 const bool IncludeLinqService = true;
223
224 public string[] Except { get; set; }
225 public string[] Include { get; set; }
226 public bool ExcludeLinqService { get; set; }
227
228 public override IEnumerable GetData(ParameterInfo parameter)
229 {
230 if (Include != null)
231 {
232 var list = Include.Intersect(
233 IncludeLinqService ?
234 UserProviders.Concat(UserProviders.Select(p => p + ".LinqService")) :
235 UserProviders).
236 ToArray();
237
238 return list;
239 }
240
241 var providers = new List<string>();
242
243 foreach (var info in Providers)
244 {
245 if (info.Skip && Include == null)
246 continue;
247
248 if (Except != null && Except.Contains(info.Name))
249 continue;
250
251 if (!UserProviders.Contains(info.Name))
252 continue;
253
254 providers.Add(info.Name);
255
256 if (IncludeLinqService && !ExcludeLinqService)
257 {
258 providers.Add(info.Name + ".LinqService");
259 }
260 }
261
262 return providers.ToArray();
263 }
264 }
265
266 public class IncludeDataContextsAttribute : DataContextsAttribute
267 {
268 public IncludeDataContextsAttribute(params string[] include)
269 {
270 Include = include;
271 }
272 }
273
274 static readonly Dictionary<string,int> _ips = new Dictionary<string,int>();
275
276 protected ITestDataContext GetDataContext(string configuration)
277 {
278 if (configuration.EndsWith(".LinqService"))
279 {
280 var str = configuration.Substring(0, configuration.Length - ".LinqService".Length);
281 var ip = GetIP(str);
282 var dx = new TestServiceModelDataContext(ip);
283
284 Debug.WriteLine(((IDataContext)dx).ContextID, "Provider ");
285
286 return dx;
287 }
288
289 Debug.WriteLine(configuration, "Provider ");
290
291 return new TestDbManager(configuration);
292 }
293
294 protected void ForEachProvider(Type expectedException, string[] exceptList, Action<ITestDataContext> func)
295 {
296 Exception ex = null;
297
298 foreach (var db in GetProviders(exceptList))
299 {
300 try
301 {
302 if (db is DbManager)
303 ((DbManager)db).BeginTransaction();
304
305 func(db);
306 }
307 catch (Exception e)
308 {
309 if (expectedException == null || e.GetType() != expectedException)
310 throw;
311
312 ex = e;
313 }
314 finally
315 {
316 db.Dispose();
317 }
318 }
319
320 if (ex != null)
321 throw ex;
322 }
323
324 protected void ForEachProvider(string[] exceptList, Action<ITestDataContext> func)
325 {
326 ForEachProvider(null, exceptList, func);
327 }
328
329 protected void ForEachProvider(Action<ITestDataContext> func)
330 {
331 ForEachProvider(Array<string>.Empty, func);
332 }
333
334 protected void ForEachProvider(Type expectedException, Action<ITestDataContext> func)
335 {
336 ForEachProvider(expectedException, Array<string>.Empty, func);
337 }
338
339 protected void Not0ForEachProvider(Func<ITestDataContext, int> func)
340 {
341 ForEachProvider(db => Assert.Less(0, func(db)));
342 }
343
344 protected void TestPerson(int id, string firstName, Func<ITestDataContext,IQueryable<Person>> func)
345 {
346 ForEachProvider(db =>
347 {
348 var person = func(db).ToList().Where(p => p.ID == id).First();
349
350 Assert.AreEqual(id, person.ID);
351 Assert.AreEqual(firstName, person.FirstName);
352 });
353 }
354
355 protected void TestJohn(Func<ITestDataContext,IQueryable<Person>> func)
356 {
357 TestPerson(1, "John", func);
358 }
359
360 protected void TestOnePerson(string[] exceptList, int id, string firstName, Func<ITestDataContext,IQueryable<Person>> func)
361 {
362 ForEachProvider(exceptList, db =>
363 {
364 var list = func(db).ToList();
365
366 Assert.AreEqual(1, list.Count);
367
368 var person = list[0];
369
370 Assert.AreEqual(id, person.ID);
371 Assert.AreEqual(firstName, person.FirstName);
372 });
373 }
374
375 protected void TestOnePerson(int id, string firstName, Func<ITestDataContext,IQueryable<Person>> func)
376 {
377 TestOnePerson(Array<string>.Empty, id, firstName, func);
378 }
379
380 protected void TestOneJohn(string[] exceptList, Func<ITestDataContext,IQueryable<Person>> func)
381 {
382 TestOnePerson(exceptList, 1, "John", func);
383 }
384
385 protected void TestOneJohn(Func<ITestDataContext,IQueryable<Person>> func)
386 {
387 TestOnePerson(Array<string>.Empty, 1, "John", func);
388 }
389
390 private List<LinqDataTypes> _types;
391 protected IEnumerable<LinqDataTypes> Types
392 {
393 get
394 {
395 if (_types == null)
396 using (var db = new TestDbManager())
397 _types = db.Types.ToList();
398
399 foreach (var type in _types)
400 yield return type;
401 }
402 }
403
404 private List<LinqDataTypes2> _types2;
405 protected List<LinqDataTypes2> Types2
406 {
407 get
408 {
409 if (_types2 == null)
410 using (var db = new TestDbManager())
411 _types2 = db.Types2.ToList();
412 return _types2;
413 }
414 }
415
416 private List<Person> _person;
417 protected IEnumerable<Person> Person
418 {
419 get
420 {
421 if (_person == null)
422 {
423 using (var db = new TestDbManager())
424 _person = db.Person.ToList();
425
426 foreach (var p in _person)
427 p.Patient = Patient.SingleOrDefault(ps => p.ID == ps.PersonID);
428 }
429
430 foreach (var item in _person)
431 yield return item;
432 }
433 }
434
435 private List<Patient> _patient;
436 protected List<Patient> Patient
437 {
438 get
439 {
440 if (_patient == null)
441 {
442 using (var db = new TestDbManager())
443 _patient = db.Patient.ToList();
444
445 foreach (var p in _patient)
446 p.Person = Person.Single(ps => ps.ID == p.PersonID);
447 }
448
449 return _patient;
450 }
451 }
452
453 private List<Doctor> _doctor;
454 protected List<Doctor> Doctor
455 {
456 get
457 {
458 if (_doctor == null)
459 {
460 using (var db = new TestDbManager())
461 _doctor = db.Doctor.ToList();
462 }
463
464 return _doctor;
465 }
466 }
467
468 #region Parent/Child Model
469
470 private List<Parent> _parent;
471 protected IEnumerable<Parent> Parent
472 {
473 get
474 {
475 if (_parent == null)
476 using (var db = new TestDbManager())
477 {
478 db.Parent.Delete(c => c.ParentID >= 1000);
479 _parent = db.Parent.ToList();
480 db.Close();
481
482 foreach (var p in _parent)
483 {
484 p.Children = Child. Where(c => c.ParentID == p.ParentID).ToList();
485 p.GrandChildren = GrandChild.Where(c => c.ParentID == p.ParentID).ToList();
486 p.Types = Types.First(t => t.ID == p.ParentID);
487 }
488 }
489
490 foreach (var parent in _parent)
491 yield return parent;
492 }
493 }
494
495 private List<Parent1> _parent1;
496 protected IEnumerable<Parent1> Parent1
497 {
498 get
499 {
500 if (_parent1 == null)
501 _parent1 = Parent.Select(p => new Parent1 { ParentID = p.ParentID, Value1 = p.Value1 }).ToList();
502
503 foreach (var parent in _parent1)
504 yield return parent;
505 }
506 }
507
508 private List<Parent4> _parent4;
509 protected List<Parent4> Parent4
510 {
511 get
512 {
513 return _parent4 ?? (_parent4 = Parent.Select(p => new Parent4 { ParentID = p.ParentID, Value1 = Map.ToEnum<TypeValue>(p.Value1) }).ToList());
514 }
515 }
516
517 private List<Parent5> _parent5;
518 protected List<Parent5> Parent5
519 {
520 get
521 {
522 if (_parent5 == null)
523 {
524 _parent5 = Parent.Select(p => new Parent5 { ParentID = p.ParentID, Value1 = p.Value1}).ToList();
525
526 foreach (var p in _parent5)
527 p.Children = _parent5.Where(c => c.Value1 == p.ParentID).ToList();
528 }
529
530 return _parent5;
531 }
532 }
533
534 private List<ParentInheritanceBase> _parentInheritance;
535 protected IEnumerable<ParentInheritanceBase> ParentInheritance
536 {
537 get
538 {
539 if (_parentInheritance == null)
540 _parentInheritance = Parent.Select(p =>
541 p.Value1 == null ? new ParentInheritanceNull { ParentID = p.ParentID } :
542 p.Value1.Value == 1 ? new ParentInheritance1 { ParentID = p.ParentID, Value1 = p.Value1.Value } :
543 (ParentInheritanceBase) new ParentInheritanceValue { ParentID = p.ParentID, Value1 = p.Value1.Value }
544 ).ToList();
545
546 foreach (var item in _parentInheritance)
547 yield return item;
548 }
549 }
550
551 private List<ParentInheritanceValue> _parentInheritanceValue;
552 protected List<ParentInheritanceValue> ParentInheritanceValue
553 {
554 get
555 {
556 return _parentInheritanceValue ?? (_parentInheritanceValue =
557 ParentInheritance.Where(p => p is ParentInheritanceValue).Cast<ParentInheritanceValue>().ToList());
558 }
559 }
560
561 private List<ParentInheritance1> _parentInheritance1;
562 protected List<ParentInheritance1> ParentInheritance1
563 {
564 get
565 {
566 return _parentInheritance1 ?? (_parentInheritance1 =
567 ParentInheritance.Where(p => p is ParentInheritance1).Cast<ParentInheritance1>().ToList());
568 }
569 }
570
571 private List<ParentInheritanceBase4> _parentInheritance4;
572 protected List<ParentInheritanceBase4> ParentInheritance4
573 {
574 get
575 {
576 return _parentInheritance4 ?? (_parentInheritance4 = Parent
577 .Where(p => p.Value1.HasValue && (new[] { 1, 2 }.Contains(p.Value1.Value)))
578 .Select(p => p.Value1 == 1 ?
579 (ParentInheritanceBase4)new ParentInheritance14 { ParentID = p.ParentID } :
580 (ParentInheritanceBase4)new ParentInheritance24 { ParentID = p.ParentID }
581 ).ToList());
582 }
583 }
584
585 private List<Child> _child;
586 protected IEnumerable<Child> Child
587 {
588 get
589 {
590 if (_child == null)
591 using (var db = new TestDbManager())
592 {
593 db.Child.Delete(c => c.ParentID >= 1000);
594 _child = db.Child.ToList();
595 db.Clone();
596
597 foreach (var ch in _child)
598 {
599 ch.Parent = Parent. Single(p => p.ParentID == ch.ParentID);
600 ch.Parent1 = Parent1.Single(p => p.ParentID == ch.ParentID);
601 ch.ParentID2 = new Parent3 { ParentID2 = ch.Parent.ParentID, Value1 = ch.Parent.Value1 };
602 ch.GrandChildren = GrandChild.Where(c => c.ParentID == ch.ParentID && c.ChildID == ch.ChildID).ToList();
603 }
604 }
605
606 foreach (var child in _child)
607 yield return child;
608 }
609 }
610
611 private List<GrandChild> _grandChild;
612 protected IEnumerable<GrandChild> GrandChild
613 {
614 get
615 {
616 if (_grandChild == null)
617 using (var db = new TestDbManager())
618 {
619 _grandChild = db.GrandChild.ToList();
620 db.Close();
621
622 foreach (var ch in _grandChild)
623 ch.Child = Child.Single(c => c.ParentID == ch.ParentID && c.ChildID == ch.ChildID);
624 }
625
626 foreach (var grandChild in _grandChild)
627 yield return grandChild;
628 }
629 }
630
631 private List<GrandChild1> _grandChild1;
632 protected IEnumerable<GrandChild1> GrandChild1
633 {
634 get
635 {
636 if (_grandChild1 == null)
637 using (var db = new TestDbManager())
638 {
639 _grandChild1 = db.GrandChild1.ToList();
640
641 foreach (var ch in _grandChild1)
642 {
643 ch.Parent = Parent1.Single(p => p.ParentID == ch.ParentID);
644 ch.Child = Child. Single(c => c.ParentID == ch.ParentID && c.ChildID == ch.ChildID);
645 }
646 }
647
648 foreach (var grandChild in _grandChild1)
649 yield return grandChild;
650 }
651 }
652
653 #endregion
654
655 #region Northwind
656
657 private List<Northwind.Category> _category;
658 public List<Northwind.Category> Category
659 {
660 get
661 {
662 if (_category == null)
663 using (var db = new NorthwindDB())
664 _category = db.Category.ToList();
665 return _category;
666 }
667 }
668
669 private List<Northwind.Customer> _customer;
670 public List<Northwind.Customer> Customer
671 {
672 get
673 {
674 if (_customer == null)
675 {
676 using (var db = new NorthwindDB())
677 _customer = db.Customer.ToList();
678
679 foreach (var c in _customer)
680 c.Orders = (from o in Order where o.CustomerID == c.CustomerID select o).ToList();
681 }
682
683 return _customer;
684 }
685 }
686
687 private List<Northwind.Employee> _employee;
688 public List<Northwind.Employee> Employee
689 {
690 get
691 {
692 if (_employee == null)
693 {
694 using (var db = new NorthwindDB())
695 {
696 _employee = db.Employee.ToList();
697
698 foreach (var employee in _employee)
699 {
700 employee.Employees = (from e in _employee where e.ReportsTo == employee.EmployeeID select e).ToList();
701 employee.ReportsToEmployee = (from e in _employee where e.EmployeeID == employee.ReportsTo select e).SingleOrDefault();
702 }
703 }
704 }
705
706 return _employee;
707 }
708 }
709
710 private List<Northwind.EmployeeTerritory> _employeeTerritory;
711 public List<Northwind.EmployeeTerritory> EmployeeTerritory
712 {
713 get
714 {
715 if (_employeeTerritory == null)
716 using (var db = new NorthwindDB())
717 _employeeTerritory = db.EmployeeTerritory.ToList();
718 return _employeeTerritory;
719 }
720 }
721
722 private List<Northwind.OrderDetail> _orderDetail;
723 public List<Northwind.OrderDetail> OrderDetail
724 {
725 get
726 {
727 if (_orderDetail == null)
728 using (var db = new NorthwindDB())
729 _orderDetail = db.OrderDetail.ToList();
730 return _orderDetail;
731 }
732 }
733
734 private List<Northwind.Order> _order;
735 public List<Northwind.Order> Order
736 {
737 get
738 {
739 if (_order == null)
740 {
741 using (var db = new NorthwindDB())
742 _order = db.Order.ToList();
743
744 foreach (var o in _order)
745 {
746 o.Customer = Customer.Single(c => o.CustomerID == c.CustomerID);
747 o.Employee = Employee.Single(e => o.EmployeeID == e.EmployeeID);
748 }
749 }
750
751 return _order;
752 }
753 }
754
755 private IEnumerable<Northwind.Product> _product;
756 public IEnumerable<Northwind.Product> Product
757 {
758 get
759 {
760 if (_product == null)
761 using (var db = new NorthwindDB())
762 _product = db.Product.ToList();
763
764 foreach (var product in _product)
765 yield return product;
766 }
767 }
768
769 private List<Northwind.ActiveProduct> _activeProduct;
770 public List<Northwind.ActiveProduct> ActiveProduct
771 {
772 get { return _activeProduct ?? (_activeProduct = Product.OfType<Northwind.ActiveProduct>().ToList()); }
773 }
774
775 public IEnumerable<Northwind.DiscontinuedProduct> DiscontinuedProduct
776 {
777 get { return Product.OfType<Northwind.DiscontinuedProduct>(); }
778 }
779
780 private List<Northwind.Region> _region;
781 public List<Northwind.Region> Region
782 {
783 get
784 {
785 if (_region == null)
786 using (var db = new NorthwindDB())
787 _region = db.Region.ToList();
788 return _region;
789 }
790 }
791
792 private List<Northwind.Shipper> _shipper;
793 public List<Northwind.Shipper> Shipper
794 {
795 get
796 {
797 if (_shipper == null)
798 using (var db = new NorthwindDB())
799 _shipper = db.Shipper.ToList();
800 return _shipper;
801 }
802 }
803
804 private List<Northwind.Supplier> _supplier;
805 public List<Northwind.Supplier> Supplier
806 {
807 get
808 {
809 if (_supplier == null)
810 using (var db = new NorthwindDB())
811 _supplier = db.Supplier.ToList();
812 return _supplier;
813 }
814 }
815
816 private List<Northwind.Territory> _territory;
817 public List<Northwind.Territory> Territory
818 {
819 get
820 {
821 if (_territory == null)
822 using (var db = new NorthwindDB())
823 _territory = db.Territory.ToList();
824 return _territory;
825 }
826 }
827
828 #endregion
829
830 protected void AreEqual<T>(IEnumerable<T> expected, IEnumerable<T> result)
831 {
832 var resultList = result. ToList();
833 var expectedList = expected.ToList();
834
835 Assert.AreNotEqual(0, expectedList.Count);
836 Assert.AreEqual(expectedList.Count, resultList.Count, "Expected and result lists are different. Lenght: ");
837
838 var exceptExpectedList = resultList. Except(expectedList).ToList();
839 var exceptResultList = expectedList.Except(resultList). ToList();
840
841 var exceptExpected = exceptExpectedList.Count;
842 var exceptResult = exceptResultList. Count;
843
844 if (exceptResult != 0 || exceptExpected != 0)
845 for (var i = 0; i < resultList.Count; i++)
846 Debug.WriteLine("{0} {1} --- {2}", Equals(expectedList[i], resultList[i]) ? " " : "-", expectedList[i], resultList[i]);
847
848 Assert.AreEqual(0, exceptExpected);
849 Assert.AreEqual(0, exceptResult);
850 }
851
852 protected void AreEqual<T>(IEnumerable<IEnumerable<T>> expected, IEnumerable<IEnumerable<T>> result)
853 {
854 var resultList = result. ToList();
855 var expectedList = expected.ToList();
856
857 Assert.AreNotEqual(0, expectedList.Count);
858 Assert.AreEqual(expectedList.Count, resultList.Count, "Expected and result lists are different. Lenght: ");
859
860 for (var i = 0; i < resultList.Count; i++)
861 {
862 var elist = expectedList[i].ToList();
863 var rlist = resultList [i].ToList();
864
865 if (elist.Count > 0 || rlist.Count > 0)
866 AreEqual(elist, rlist);
867 }
868 }
869
870 protected void AreSame<T>(IEnumerable<T> expected, IEnumerable<T> result)
871 {
872 var resultList = result. ToList();
873 var expectedList = expected.ToList();
874
875 Assert.AreNotEqual(0, expectedList.Count);
876 Assert.AreEqual(expectedList.Count, resultList.Count);
877
878 var b = expectedList.SequenceEqual(resultList);
879
880 if (!b)
881 for (var i = 0; i < resultList.Count; i++)
882 Debug.WriteLine(string.Format("{0} {1} --- {2}", Equals(expectedList[i], resultList[i]) ? " " : "-", expectedList[i], resultList[i]));
883
884 Assert.IsTrue(b);
885 }
886
887 protected void CompareSql(string result, string expected)
888 {
889 var ss = expected.Trim('\r', '\n').Split('\n');
890
891 while (ss.All(_ => _.Length > 0 && _[0] == '\t'))
892 for (var i = 0; i < ss.Length; i++)
893 ss[i] = ss[i].Substring(1);
894
895 Assert.AreEqual(string.Join("\n", ss), result.Trim('\r', '\n'));
896 }
897 }
898 }