|
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.
|