From: <pa...@us...> - 2011-04-17 22:28:51
|
Revision: 5716 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5716&view=rev Author: patearl Date: 2011-04-17 22:28:45 +0000 (Sun, 17 Apr 2011) Log Message: ----------- Linq: Member join test improvements and a bug fix. (NH-2583 again) Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/AbstractMassTestingFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/ManualTestFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingNotAndDeMorganFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingOneOrTreeFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingOrderByFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingSelectFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingThreeOrTreesSideBySideFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingTwoOrTreesSideBySideFixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/SelfJoinTestFixture.cs Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/WhereJoinDetector.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -320,6 +320,22 @@ } } + protected override Expression VisitConstantExpression(ConstantExpression expression) + { + if (expression.Type == typeof(bool)) + { + if ((bool)expression.Value) + { + _memberExpressionMapping = FixedMapping(new string[0], T); + } + else + { + _memberExpressionMapping = FixedMapping(new string[0], F); + } + } + return expression; + } + internal static void Find(Expression expression, NameGenerator nameGenerator, IIsEntityDecider isEntityDecider, Dictionary<string, NhJoinClause> joins, Dictionary<MemberExpression, QuerySourceReferenceExpression> expressionMap) { WhereJoinDetector f = new WhereJoinDetector(nameGenerator, isEntityDecider, joins, expressionMap); Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/AbstractMassTestingFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/AbstractMassTestingFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/AbstractMassTestingFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -87,7 +87,7 @@ } - protected void RunTest<T1, T2, T3, T4, T5, T6, T7>(Expression<Func<MyBO, bool>> condition, SetterTuple<T1, T2, T3, T4, T5, T6, T7> setters) + protected int RunTest<T1, T2, T3, T4, T5, T6, T7>(Expression<Func<MyBO, bool>> condition, SetterTuple<T1, T2, T3, T4, T5, T6, T7> setters) { if (condition == null) { @@ -119,7 +119,7 @@ { using (session.BeginTransaction()) { - TestAndAssert(condition, session, expectedIds); + return TestAndAssert(condition, session, expectedIds); } } @@ -141,7 +141,7 @@ } } - protected abstract void TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds); + protected abstract int TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds); protected static SetterTuple<T1, T2, T3, T4, T5, T6, T7> Setters<T1, T2, T3, T4, T5, T6, T7>(Action<MyBO, ISession, T1> set1, Action<MyBO, ISession, T2> set2, Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/ManualTestFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/ManualTestFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/ManualTestFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -13,7 +13,6 @@ /// This setup is used in most tests in here - but not all; and we might want to /// twist it for special tests. Therefore, the OnSetUp mechanism is not used. /// </summary> - [Test] private void StandardSetUp() { using (var session = OpenSession()) @@ -49,6 +48,7 @@ } } + [Test] public void OrWithTrueShouldBeEqualToTrue() { StandardSetUp(); Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingNotAndDeMorganFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingNotAndDeMorganFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingNotAndDeMorganFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -9,38 +9,41 @@ { public class MassTestingNotAndDeMorganFixture : AbstractMassTestingFixture { - protected override void TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) + protected override int TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) { var result = session.Query<MyBO>().Where(condition); AreEqual(expectedIds, result.Select(bo => bo.Id).ToArray()); + return expectedIds.Count(); } [Test] - public void Test_NotUnequalIsNotTheSameAsEqual() + public void Test_NotUnequalIsTheSameAsEqual() { - RunTest(x => !(x.BO1.I1 != 1), - Setters<TBO1_I>(MyBO.SetBO1_I1)); - // ... is the same as ... - RunTest(x => !(x.BO1.I1 != 1), - Setters<TBO1_I>(MyBO.SetBO1_I1)); - // ... is NOT the same as ... - RunTest(x => x.BO1.I1 == 1, - Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); - // The latter returns fewer results! - namely NOT the ones where BO1 is null. + int r1 = RunTest(x => !(x.BO1.I1 != 1), + Setters<TBO1_I>(MyBO.SetBO1_I1)); + int r2 = RunTest(x => x.BO1.I1 == 1, + Setters<TBO1_I>(MyBO.SetBO1_I1)); + Assert.AreEqual(r1, r2); + Assert.Greater(r1, 0); + + r1 = RunTest(x => !(x.BO1.I1 != 1), + Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + r2 = RunTest(x => x.BO1.I1 == 1, + Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + Assert.AreEqual(r1, r2); + Assert.Greater(r1, 0); } [Test] - public void Test_NotEqualIsNotTheSameAsNotequal() + public void Test_NotEqualIsTheSameAsNotequal() { - RunTest(x => !(x.BO1.I1 == 1), - Setters<TBO1_I>(MyBO.SetBO1_I1)); + int r1 = RunTest(x => !(x.BO1.I1 == 1), + Setters<TBO1_I>(MyBO.SetBO1_I1)); // ... is the same as ... - RunTest(x => !(x.BO1.I1 == 1), - Setters<TBO1_I>(MyBO.SetBO1_I1)); - // ... is NOT the same as ... - RunTest(x => x.BO1.I1 != 1, - Setters<TBO1_I>(MyBO.SetBO1_I1)); - // As before, the latter returns fewer results! - namely NOT the ones where BO1 is null. + int r2 = RunTest(x => x.BO1.I1 != 1, + Setters<TBO1_I>(MyBO.SetBO1_I1)); + Assert.AreEqual(r1, r2); + Assert.Greater(r1, 0); } [Test] @@ -64,22 +67,25 @@ [Test] public void Test_DeMorganNotOr() { - RunTest(x => !(x.BO1.I1 != 1 || x.BO2.J1 != 1), - Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); - RunTest(x => !(x.BO1.I1 != 1 || x.BO2.J1 != 1), - Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); - RunTest(x => !(x.BO1.I1 != 1) && !(x.BO2.J1 != 1), - Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); - // ... is NOT the same as ... - RunTest(x => x.BO1.I1 == 1 && x.BO2.J1 == 1, - Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + int r1 = RunTest(x => !(x.BO1.I1 != 1 || x.BO2.J1 != 1), + Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + int r2 = RunTest(x => !(x.BO1.I1 != 1) && !(x.BO2.J1 != 1), + Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + int r3 = RunTest(x => x.BO1.I1 == 1 && x.BO2.J1 == 1, + Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + Assert.AreEqual(r1, r2); + Assert.AreEqual(r2, r3); + Assert.Greater(r1, 0); } [Test] public void Test_NotNotCanBeEliminated() { - RunTest(x => !(!(x.BO1.I1 != 1 && x.BO2.J1 != 1)), - Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + int r1 = RunTest(x => !(!(x.BO1.I1 != 1 && x.BO2.J1 != 1)), + Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + int r2 = RunTest(x => x.BO1.I1 != 1 && x.BO2.J1 != 1, + Setters<TBO1_I, TBO2_J>(MyBO.SetBO1_I1, MyBO.SetBO2_J1)); + Assert.AreEqual(r1, r2); } } } Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingOneOrTreeFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingOneOrTreeFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingOneOrTreeFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -9,10 +9,11 @@ { public class MassTestingOneOrTreeFixture : AbstractMassTestingFixture { - protected override void TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) + protected override int TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) { var result = session.Query<MyBO>().Where(condition); AreEqual(expectedIds, result.Select(bo => bo.Id).ToArray()); + return expectedIds.Count(); } // Condition pattern: (A && B) && (C || D) Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingOrderByFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingOrderByFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingOrderByFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -9,13 +9,15 @@ { public class MassTestingOrderByFixture : AbstractMassTestingFixture { - protected override void TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) + protected override int TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) { IQueryable<MyBO> result = session.Query<MyBO>().Where(condition).OrderByDescending(bo => bo.BO1.I1 ?? bo.BO1.Id); var forceDBRun = result.ToList(); AreEqual(expectedIds, forceDBRun.Select(bo => bo.Id).ToArray()); + + return expectedIds.Count(); } // Condition pattern: (A && B) && (C || D) ORDER BY F @@ -66,7 +68,7 @@ Setters<TK, TK, TBO1_I, TK>(MyBO.SetK1, MyBO.SetK2, MyBO.SetBO1_I1, MyBO.SetK3)); } - [Test, Ignore("RED!")] // TODO: Analyze and repair! + [Test] public void Test_xyP_in_C_F____xy_OJ() { RunTest(x => (x.K1 == 1 && x.K1 == 1) && (x.BO1.Id > 0 && x.K2 == 1 || x.K3 == 1), Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingSelectFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingSelectFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingSelectFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -9,7 +9,7 @@ { public class MassTestingSelectFixture : AbstractMassTestingFixture { - protected override void TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) + protected override int TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) { IQueryable<int?> result = session.Query<MyBO>().Where(condition).Select(bo => (int?) bo.BO1.Id); @@ -19,6 +19,9 @@ var expectedBO1Ids = session.Query<MyBO>().Where(bo => expectedIds.Contains(bo.Id)).Select(bo => bo.BO1 == null ? 0 : bo.BO1.Id).ToList(); AreEqual(expectedBO1Ids, resultNullTo0.ToArray()); + + // Unused result. + return -1; } // Condition pattern: (A && B) && (C || D) SELECT E @@ -69,7 +72,7 @@ Setters<TK, TK, TBO1_I, TK>(MyBO.SetK1, MyBO.SetK2, MyBO.SetBO1_I1, MyBO.SetK3)); } - [Test, Ignore("RED!")] // TODO: Analyze and repair! + [Test] public void Test_xyP_in_C_E____xy_OJ() { RunTest(x => (x.K1 == 1 && x.K1 == 1) && (x.BO1.Id > 0 && x.K2 == 1 || x.K3 == 1), Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingThreeOrTreesSideBySideFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingThreeOrTreesSideBySideFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingThreeOrTreesSideBySideFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -11,14 +11,17 @@ { protected void RunTest<T1, T2, T3, T4, T5, T6, T7>(Expression<Func<MyBO, bool>> c1, Expression<Func<MyBO, bool>> c2, SetterTuple<T1, T2, T3, T4, T5, T6, T7> setters) { - RunTest(c1, setters); - RunTest(c2, setters); + int r1 = RunTest(c1, setters); + int r2 = RunTest(c2, setters); + Assert.AreEqual(r1, r2); + Assert.Greater(r1, 0); } - protected override void TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) + protected override int TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) { var result = session.Query<MyBO>().Where(condition); AreEqual(expectedIds, result.Select(bo => bo.Id).ToArray()); + return expectedIds.Count(); } // Condition pattern: (A || B) || (C || D), A || (B || (C || D)) Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingTwoOrTreesSideBySideFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingTwoOrTreesSideBySideFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/MassTestingTwoOrTreesSideBySideFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -9,10 +9,11 @@ { public class MassTestingTwoOrTreesSideBySideFixture : AbstractMassTestingFixture { - protected override void TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) + protected override int TestAndAssert(Expression<Func<MyBO, bool>> condition, ISession session, IEnumerable<int> expectedIds) { var result = session.Query<MyBO>().Where(condition); AreEqual(expectedIds, result.Select(bo => bo.Id).ToArray()); + return expectedIds.Count(); } // Condition pattern: (A || B) && (C || D) Modified: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/SelfJoinTestFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/SelfJoinTestFixture.cs 2011-04-17 12:03:53 UTC (rev 5715) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2583/SelfJoinTestFixture.cs 2011-04-17 22:28:45 UTC (rev 5716) @@ -54,7 +54,8 @@ where bo.LeftSon.LeftSon.K1 == null || bo.RightSon.RightSon.K1 == null select bo).ToList().Select(bo => bo.Name); - //Assert.That(() => result.ToList(), Is.EquivalentTo(new[] { "1", "2", "3", ...and many more... })); + Assert.That(!result.Contains("1")); + Assert.That(result.Count(), Is.EqualTo(18)); } } @@ -67,7 +68,8 @@ where bo.LeftSon.K1 == null || bo.RightSon.K1 == null select bo).ToList().Select(bo => bo.Name); - //Assert.That(() => result.ToList(), Is.EquivalentTo(new[] { "1", "1L", "1R", "2", "2L", "2R", "3", "3L", "4", ...and many more... })); + Assert.That(!result.Contains("1")); + Assert.That(result.Count(), Is.EqualTo(18)); } } @@ -78,11 +80,11 @@ using (var tx = session.BeginTransaction()) { { - var bLeftLeft = new MyBO { Id = 111, Name = "1LL", K2 = 1 }; + var bLeftLeft = new MyBO { Id = 111, Name = "1LL", K2 = 1, K1 = 1 }; var bLeftRight = new MyBO { Id = 112, Name = "1LR", K2 = 1 }; - var bLeft = new MyBO { Id = 11, Name = "1L", LeftSon = bLeftLeft, RightSon = bLeftRight }; - var bRightRight = new MyBO { Id = 122, Name = "1RR", K2 = 1 }; - var bRight = new MyBO { Id = 12, Name = "1R", RightSon = bRightRight }; + var bLeft = new MyBO { Id = 11, Name = "1L", LeftSon = bLeftLeft, RightSon = bLeftRight, K1 = 1 }; + var bRightRight = new MyBO { Id = 122, Name = "1RR", K2 = 1, K1 = 1 }; + var bRight = new MyBO { Id = 12, Name = "1R", RightSon = bRightRight, K1 = 1 }; var bRoot = new MyBO { Id = 1, Name = "1", LeftSon = bLeft, RightSon = bRight }; session.Save(bLeftLeft); session.Save(bLeftRight); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |