Mercurial > pub > bltoolkit
diff UnitTests/Linq/SelectTest.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/UnitTests/Linq/SelectTest.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,573 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +using NUnit.Framework; + +using BLToolkit.Data; +using BLToolkit.Data.DataProvider; +using BLToolkit.Data.Linq; +using BLToolkit.DataAccess; +using BLToolkit.Reflection; +using BLToolkit.Mapping; + +namespace Data.Linq +{ + using Model; + + [TestFixture] + public class SelectTest : TestBase + { + [Test] + public void SimpleDirect() + { + TestJohn(db => db.Person); + } + + [Test] + public void Simple() + { + TestJohn(db => from p in db.Person select p); + } + + [Test] + public void SimpleDouble() + { + TestJohn(db => db.Person.Select(p => p).Select(p => p)); + } + + [Test] + public void New() + { + var expected = from p in Person select new { p.ID, p.FirstName }; + + ForEachProvider(db => + { + var result = from p in db.Person select new { p.ID, p.FirstName }; + Assert.IsTrue(result.ToList().SequenceEqual(expected)); + }); + } + + void NewParam(IQueryable<Person> table, int i) + { + var expected = from p in Person select new { i, p.ID, p.FirstName }; + var result = from p in table select new { i, p.ID, p.FirstName }; + + Assert.IsTrue(result.ToList().SequenceEqual(expected)); + } + + [Test] + public void NewParam() + { + ForEachProvider(db => { for (var i = 0; i < 5; i++) NewParam(db.Person, i); }); + } + + [Test] + public void InitObject() + { + TestJohn(db => from p in db.Person select new Person { ID = p.ID, FirstName = p.FirstName }); + } + + [Test] + public void NewObject() + { + TestJohn(db => from p in db.Person select new Person(p.ID, p.FirstName)); + } + + [Test] + public void NewInitObject() + { + TestJohn(db => from p in db.Person select new Person(p.ID) { FirstName = p.FirstName }); + } + + [Test] + public void NewWithExpr() + { + TestPerson(1, "John1", db => from p in db.Person select new Person(p.ID) { FirstName = (p.FirstName + "1\r\r\r").TrimEnd('\r') }); + } + + [Test] + public void MultipleSelect1() + { + TestJohn(db => db.Person + .Select(p => new { PersonID = p.ID, Name = p.FirstName }) + .Select(p => new Person(p.PersonID) { FirstName = p.Name })); + } + + [Test] + public void MultipleSelect2() + { + TestJohn(db => + from p in db.Person + select new { PersonID = p.ID, Name = p.FirstName } into pp + select new Person(pp.PersonID) { FirstName = pp.Name }); + } + + [Test] + public void MultipleSelect3() + { + TestJohn(db => db.Person + .Select(p => new { PersonID = p.ID, Name = p.FirstName }) + .Select(p => new Person { ID = p.PersonID, FirstName = p.Name }) + .Select(p => new { PersonID = p.ID, Name = p.FirstName }) + .Select(p => new Person { ID = p.PersonID, FirstName = p.Name })); + } + + [Test] + public void MultipleSelect4() + { + TestJohn(db => db.Person + .Select(p1 => new { p1 }) + .Select(p2 => new { p2 }) + .Select(p3 => new Person { ID = p3.p2.p1.ID, FirstName = p3.p2.p1.FirstName })); + } + + [Test] + public void MultipleSelect5() + { + TestJohn(db => db.Person + .Select(p1 => new { p1 }) + .Select(p2 => new Person { ID = p2.p1.ID, FirstName = p2.p1.FirstName }) + .Select(p3 => new { p3 }) + .Select(p4 => new Person { ID = p4.p3.ID, FirstName = p4.p3.FirstName })); + } + + [Test] + public void MultipleSelect6() + { + TestJohn(db => db.Person + .Select(p1 => new { p1 }) + .Select(p2 => new Person { ID = p2.p1.ID, FirstName = p2.p1.FirstName }) + .Select(p3 => p3) + .Select(p4 => new Person { ID = p4.ID, FirstName = p4.FirstName })); + } + + [Test] + public void MultipleSelect7() + { + TestJohn(db => db.Person + .Select(p1 => new { ID = p1.ID + 1, p1.FirstName }) + .Select(p2 => new Person { ID = p2.ID - 1, FirstName = p2.FirstName })); + } + + [Test] + public void MultipleSelect8() + { + ForEachProvider(db => + { + var person = ( + + db.Person + .Select(p1 => new Person { ID = p1.ID * 2, FirstName = p1.FirstName }) + .Select(p2 => new { ID = p2.ID / "22".Length, p2.FirstName }) + + ).ToList().Where(p => p.ID == 1).First(); + Assert.AreEqual(1, person.ID); + Assert.AreEqual("John", person.FirstName); + }); + } + + [Test] + public void MultipleSelect9() + { + TestJohn(db => db.Person + .Select(p1 => new { ID = p1.ID - 1, p1.FirstName }) + .Select(p2 => new Person { ID = p2.ID + 1, FirstName = p2.FirstName }) + .Select(p3 => p3) + .Select(p4 => new { ID = p4.ID * "22".Length, p4.FirstName }) + .Select(p5 => new Person { ID = p5.ID / 2, FirstName = p5.FirstName })); + } + + [Test] + public void MultipleSelect10() + { + TestJohn(db => db.Person + .Select(p1 => new { p1.ID, p1 }) + .Select(p2 => new { p2.ID, p2.p1, p2 }) + .Select(p3 => new { p3.ID, p3.p1.FirstName, p11 = p3.p2.p1, p3 }) + .Select(p4 => new Person { ID = p4.p11.ID, FirstName = p4.p3.p1.FirstName })); + } + + [Test] + public void MultipleSelect11([IncludeDataContexts("Sql2008", "Sql2012")] string context) + { + var dt = DateTime.Now; + + using (var db = new TestDbManager(context)) + { + var q = + from p in db.Parent + from g1 in p.GrandChildren.DefaultIfEmpty() + let c1 = g1.Child.ChildID + where c1 == 1 + from g2 in p.GrandChildren.DefaultIfEmpty() + let c2 = g2.Child.ChildID + where c2 == 2 + from g3 in p.GrandChildren.DefaultIfEmpty() + let c3 = g3.Child.ChildID + where c3 == 3 + from g4 in p.GrandChildren.DefaultIfEmpty() + let c4 = g4.Child.ChildID + where c4 == 4 + from g5 in p.GrandChildren.DefaultIfEmpty() + let c5 = g5.Child.ChildID + where c5 == 5 + from g6 in p.GrandChildren.DefaultIfEmpty() + let c6 = g6.Child.ChildID + where c6 == 6 + from g7 in p.GrandChildren.DefaultIfEmpty() + let c7 = g7.Child.ChildID + where c7 == 7 + from g8 in p.GrandChildren.DefaultIfEmpty() + let c8 = g8.Child.ChildID + where c8 == 8 + from g9 in p.GrandChildren.DefaultIfEmpty() + let c9 = g9.Child.ChildID + where c9 == 9 + from g10 in p.GrandChildren.DefaultIfEmpty() + let c10 = g10.Child.ChildID + where c10 == 10 + from g11 in p.GrandChildren.DefaultIfEmpty() + let c11 = g11.Child.ChildID + where c11 == 11 + from g12 in p.GrandChildren.DefaultIfEmpty() + let c12 = g12.Child.ChildID + where c12 == 12 + from g13 in p.GrandChildren.DefaultIfEmpty() + let c13 = g13.Child.ChildID + where c13 == 13 + from g14 in p.GrandChildren.DefaultIfEmpty() + let c14 = g14.Child.ChildID + where c14 == 14 + from g15 in p.GrandChildren.DefaultIfEmpty() + let c15 = g15.Child.ChildID + where c15 == 15 + from g16 in p.GrandChildren.DefaultIfEmpty() + let c16 = g16.Child.ChildID + where c16 == 16 + from g17 in p.GrandChildren.DefaultIfEmpty() + let c17 = g17.Child.ChildID + where c17 == 17 + from g18 in p.GrandChildren.DefaultIfEmpty() + let c18 = g18.Child.ChildID + where c18 == 18 + from g19 in p.GrandChildren.DefaultIfEmpty() + let c19 = g19.Child.ChildID + where c19 == 19 + from g20 in p.GrandChildren.DefaultIfEmpty() + let c20 = g20.Child.ChildID + where c20 == 20 + orderby c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20 + select new + { + p, + cs = new [] { c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20 } + }; + + q.ToList(); + } + + Assert.IsTrue((DateTime.Now - dt).TotalSeconds < 30); + } + + [Test] + public void MutiplySelect12([DataContexts(ExcludeLinqService = true)] string context) + { + using (var db = (TestDbManager)GetDataContext(context)) + { + var q = + from grandChild in db.GrandChild + from child in db.Child + where grandChild.ChildID.HasValue + select grandChild; + q.ToList(); + + var selectCount = db.LastQuery.Split(' ', '\t', '\n', '\r').Count(s => s.Equals("select", StringComparison.InvariantCultureIgnoreCase)); + Assert.AreEqual(1, selectCount, "Why do we need \"select from select\"??"); + } + } + + [Test] + public void Coalesce() + { + ForEachProvider(db => + { + var q = ( + + from p in db.Person + where p.ID == 1 + select new + { + p.ID, + FirstName = p.FirstName ?? "None", + MiddleName = p.MiddleName ?? "None" + } + + ).ToList().First(); + + Assert.AreEqual(1, q.ID); + Assert.AreEqual("John", q.FirstName); + Assert.AreEqual("None", q.MiddleName); + }); + } + + [Test] + public void Coalesce2() + { + ForEachProvider(db => + { + var q = ( + + from p in db.Person + where p.ID == 1 + select new + { + p.ID, + FirstName = p.MiddleName ?? p.FirstName ?? "None", + LastName = p.LastName ?? p.FirstName ?? "None", + MiddleName = p.MiddleName ?? p.MiddleName ?? "None" + } + + ).ToList().First(); + + Assert.AreEqual(1, q.ID); + Assert.AreEqual("John", q.FirstName); + Assert.AreEqual("Pupkin", q.LastName); + Assert.AreEqual("None", q.MiddleName); + }); + } + + class MyMapSchema : MappingSchema + { + public override void InitNullValues() + { + base.InitNullValues(); + DefaultStringNullValue = null; + } + } + + static readonly MyMapSchema _myMapSchema = new MyMapSchema(); + + [Test] + public void Coalesce3() + { + ForEachProvider(db => + { + if (db is DbManager) + { + ((DbManager)db).MappingSchema = _myMapSchema; + + var q = ( + + from p in db.Person + where p.ID == 1 + select new + { + p.ID, + FirstName = p.MiddleName ?? p.FirstName ?? "None", + LastName = p.LastName ?? p.FirstName ?? "None", + MiddleName = p.MiddleName ?? p.MiddleName ?? "None" + } + + ).ToList().First(); + + Assert.AreEqual(1, q.ID); + Assert.AreEqual("John", q.FirstName); + Assert.AreEqual("Pupkin", q.LastName); + Assert.AreEqual("None", q.MiddleName); + } + }); + } + + [Test] + public void Coalesce4() + { + ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual( + from c in Child + select Sql.AsSql((from ch in Child where ch.ChildID == c.ChildID select ch.Parent.Value1).FirstOrDefault() ?? c.ChildID), + from c in db.Child + select Sql.AsSql((from ch in db.Child where ch.ChildID == c.ChildID select ch.Parent.Value1).FirstOrDefault() ?? c.ChildID))); + } + + [Test] + public void Coalesce5() + { + ForEachProvider(new[] { ProviderName.SqlCe }, db => AreEqual( + from p in Parent select Sql.AsSql(p.Children.Max(c => (int?)c.ChildID) ?? p.Value1), + from p in db.Parent select Sql.AsSql(p.Children.Max(c => (int?)c.ChildID) ?? p.Value1))); + } + + [Test] + public void Concatenation() + { + ForEachProvider(db => + { + var q = from p in db.Person where p.ID == 1 select new { p.ID, FirstName = "123" + p.FirstName + "456" }; + var f = q.Where(p => p.FirstName == "123John456").ToList().First(); + Assert.AreEqual(1, f.ID); + }); + } + + IEnumerable<int> GetList(int i) + { + yield return i; + } + + [Test] + public void SelectEnumerable() + { + ForEachProvider(db => AreEqual( + from p in Parent select new { Max = GetList(p.ParentID).Max() }, + from p in db.Parent select new { Max = GetList(p.ParentID).Max() })); + } + + [Test] + public void ConstractClass() + { + ForEachProvider(db => + db.Parent.Select(f => + new ListViewItem(new[] { "", f.ParentID.ToString(), f.Value1.ToString() }) + { + Checked = true, + ImageIndex = 0, + Tag = f.ParentID + }).ToList()); + } + + static string ConvertString(string s, int? i, bool b, int n) + { + return s + "." + i + "." + b + "." + n; + } + + [Test] + public void Index() + { + ForEachProvider(db => + { + var q = + db.Child + .OrderByDescending(m => m.ChildID) + .Where(m => m.Parent != null && m.ParentID > 0); + + var lines = + q.Select( + (m, i) => + ConvertString(m.Parent.ParentID.ToString(), m.ChildID, i % 2 == 0, i)).ToArray(); + + Assert.AreEqual("7.77.True.0", lines[0]); + + q = + db.Child + .OrderByDescending(m => m.ChildID) + .Where(m => m.Parent != null && m.ParentID > 0); + + lines = + q.Select( + (m, i) => + ConvertString(m.Parent.ParentID.ToString(), m.ChildID, i % 2 == 0, i)).ToArray(); + + Assert.AreEqual("7.77.True.0", lines[0]); + }); + } + + [Test] + public void InterfaceTest() + { + ForEachProvider(db => + { + var q = from p in db.Parent2 select new { p.ParentID, p.Value1 }; + q.ToList(); + }); + } + + [Test] + public void ProjectionTest1() + { + ForEachProvider(db => AreEqual( + from c in Child select new { c.ChildID, ID = 0, ID1 = c.ParentID2.ParentID2, c.ParentID2.Value1, ID2 = c.ParentID }, + from c in db.Child select new { c.ChildID, ID = 0, ID1 = c.ParentID2.ParentID2, c.ParentID2.Value1, ID2 = c.ParentID })); + } + + [TableName("Person")] + [ObjectFactory(typeof(Factory))] + public class TestPersonObject + { + public class Factory : IObjectFactory + { + #region IObjectFactory Members + + public object CreateInstance(TypeAccessor typeAccessor, InitContext context) + { + if (context == null) + throw new Exception("InitContext is null while mapping from DataReader!"); + + return typeAccessor.CreateInstance(); + } + + #endregion + } + + public int PersonID; + public string FirstName; + } + + [Test] + public void ObjectFactoryTest() + { + ForEachProvider(db => db.GetTable<TestPersonObject>().ToList()); + } + + [Test] + public void ProjectionTest2() + { + ForEachProvider(db => AreEqual( + from p in Person select p.Patient, + from p in db.Person select p.Patient)); + } + + [Test] + public void EqualTest1() + { + ForEachProvider(db => + { + var q = (from p in db.Parent select new { p1 = p, p2 = p }).First(); + Assert.AreSame(q.p1, q.p2); + }); + } + + [Test] + public void SelectEnumOnClient() + { + ForEachProvider(context => + { + var arr = new List<Person> { new Person() }; + var p = context.Person.Select(person => new { person.ID, Arr = arr.Take(1) }).FirstOrDefault(); + + p.Arr.Single(); + }); + } + + [TableName("Parent")] + public class TestParent + { + [MapField("ParentID")] public int ParentID_; + [MapField("Value1")] public int? Value1_; + } + + [Test] + public void SelectField() + { + using (var db = new TestDbManager()) + { + var q = + from p in db.GetTable<TestParent>() + select p.Value1_; + + var sql = q.ToString(); + + Assert.That(sql.IndexOf("ParentID_"), Is.LessThan(0)); + } + } + } +}