Hi -
> Looking forward to those other tests you mention. :)
I have now written quite quickly a bunch of tests where also things like (a +
b) + c happen. For that, I have also upgraded the "MassTestingFixture" - it
assigns now also null values to nullable properties.
I have attached the new and the changed file.
However, two tests now fail: Test_NotEqualIsTheSameAsNotequal and
Test_NotNotCanBeEliminated :-(. Maybe I find the problem quickly ... my
motivation right now is limited to play hide and seek with such things ...
Regards
Harald
--
NEU: FreePhone - kostenlos mobil telefonieren und surfen!
Jetzt informieren: http://www.gmx.net/de/go/freephone
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using NHibernate.Linq;
using NUnit.Framework;
namespace NHibernate.Test.NHSpecificTest.NH2583
{
public class MassTestingMoreOperatorsFixture : AbstractMassTestingFixture
{
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);
var forceDBRun = result.ToList();
IEnumerable<int> resultNullTo0 = forceDBRun.Select(i => i ?? 0);
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
[Test]
public void TestNestedPlus()
{
RunTest(x => (x.K1 + x.K2) + x.K2 == null || (x.K1 + x.K2) + x.K2
== null,
Setters<TK, TK>(MyBO.SetK1, MyBO.SetK2));
}
[Test]
public void TestNestedPlusBehindNot()
{
RunTest(x => !((x.K1 + x.K2) + x.K2 != null),
Setters<TK, TK>(MyBO.SetK1, MyBO.SetK2));
}
[Test]
public void TestNestedPlusBehindNotAnd()
{
RunTest(x => !((x.K1 + x.K2) + x.K2 != null && (x.K1 + x.K2) + x.K2
!= null),
Setters<TK, TK>(MyBO.SetK1, MyBO.SetK2));
}
[Test]
public void TestNestedPlusBehindNotOr()
{
RunTest(x => !((x.K1 + x.K2) + x.K2 != null || (x.K1 + x.K2) + x.K2
!= null),
Setters<TK, TK>(MyBO.SetK1, MyBO.SetK2));
}
[Test]
public void TestNestedPlusBehindOrNav()
{
RunTest(x => (x.BO1.I1 + x.BO1.I2) + x.BO1.I2 == null || (x.BO1.I1
+ x.BO1.I2) + x.BO1.I2 == null,
Setters<TBO1_I, TBO1_I>(MyBO.SetBO1_I1, MyBO.SetBO1_I2));
}
[Test]
public void TestNestedPlusBehindNotNav()
{
RunTest(x => !((x.BO1.I1 + x.BO1.I2) + x.BO1.I2 != null),
Setters<TBO1_I, TBO1_I>(MyBO.SetBO1_I1, MyBO.SetBO1_I2));
}
[Test]
public void TestNestedPlusBehindNotAndNav()
{
RunTest(x => !((x.BO1.I1 + x.BO1.I2) + x.BO1.I2 != null &&
(x.BO1.I1 + x.BO1.I2) + x.BO1.I2 != null),
Setters<TBO1_I, TBO1_I>(MyBO.SetBO1_I1, MyBO.SetBO1_I2));
}
[Test]
public void TestNestedPlusBehindNotOrNav()
{
RunTest(x => !((x.BO1.I1 + x.BO1.I2) + x.BO1.I2 != null ||
(x.BO1.I1 + x.BO1.I2) + x.BO1.I2 != null),
Setters<TBO1_I, TBO1_I>(MyBO.SetBO1_I1, MyBO.SetBO1_I2));
}
[Test]
public void TestNestedPlusBehindOrNav2()
{
RunTest(x => (x.BO1.I1 + x.BO1.I2) + x.BO1.I2 == null || (x.BO2.J1
+ x.BO2.J2) + x.BO2.J2 == null,
Setters<TBO1_I, TBO1_I, TBO2_J, TBO2_J>(MyBO.SetBO1_I1,
MyBO.SetBO1_I2, MyBO.SetBO2_J1, MyBO.SetBO2_J2));
}
[Test]
public void TestNestedPlusBehindNotOrNav2()
{
RunTest(x => !((x.BO1.I1 + x.BO1.I2) + x.BO1.I2 == null ||
(x.BO2.J1 + x.BO2.J2) + x.BO2.J2 == null),
Setters<TBO1_I, TBO1_I, TBO2_J, TBO2_J>(MyBO.SetBO1_I1,
MyBO.SetBO1_I2, MyBO.SetBO2_J1, MyBO.SetBO2_J2));
}
[Test]
public void TestNestedPlusBehindNotAndNav2()
{
RunTest(x => !((x.BO1.I1 + x.BO1.I2) + x.BO1.I2 == null &&
(x.BO2.J1 + x.BO2.J2) + x.BO2.J2 == null),
Setters<TBO1_I, TBO1_I, TBO2_J, TBO2_J>(MyBO.SetBO1_I1,
MyBO.SetBO1_I2, MyBO.SetBO2_J1, MyBO.SetBO2_J2));
}
[Test]
public void TestNestedPlusBehindOrNav3()
{
RunTest(x => (x.BO1.I1 + x.BO1.I2) + x.BO2.J2 == null || (x.BO2.J1
+ x.BO2.J2) + x.BO1.I2 == null,
Setters<TBO1_I, TBO2_J, TBO2_J, TBO1_I>(MyBO.SetBO1_I1,
MyBO.SetBO2_J2, MyBO.SetBO2_J1, MyBO.SetBO1_I2));
}
[Test]
public void TestNestedPlusBehindNotOrNav3()
{
RunTest(x => !((x.BO1.I1 + x.BO1.I2) + x.BO2.J2 == null ||
(x.BO2.J1 + x.BO2.J2) + x.BO1.I2 == null),
Setters<TBO1_I, TBO2_J, TBO2_J, TBO1_I>(MyBO.SetBO1_I1,
MyBO.SetBO2_J2, MyBO.SetBO2_J1, MyBO.SetBO1_I2));
}
[Test]
public void TestNestedPlusBehindNotAndNav3()
{
RunTest(x => !((x.BO1.I1 + x.BO1.I2) + x.BO2.J2 == null &&
(x.BO2.J1 + x.BO2.J2) + x.BO1.I2 == null),
Setters<TBO1_I, TBO2_J, TBO2_J, TBO1_I>(MyBO.SetBO1_I1,
MyBO.SetBO2_J2, MyBO.SetBO2_J1, MyBO.SetBO1_I2));
}
}
}
using System;
namespace NHibernate.Test.NHSpecificTest.NH2583
{
public class MyRef1
{
private static int _idCt = 1000;
private int _id;
public MyRef1()
{
_id = ++_idCt;
}
public virtual int Id
{
get { return _id; }
set { _id = value; }
}
public virtual int? I1 { get; set; }
public virtual int I2 { get; set; }
public virtual int I3 { get; set; }
public virtual MyRef2 BO2 { get; set; }
public virtual MyRef3 BO3 { get; set; }
public virtual MyRef2 GetOrCreateBO2(ISession s)
{
if (BO2 == null)
{
BO2 = new MyRef2();
s.Save(BO2);
}
return BO2;
}
public virtual MyRef3 GetOrCreateBO3(ISession s)
{
if (BO3 == null)
{
BO3 = new MyRef3();
s.Save(BO3);
}
return BO3;
}
}
public class MyRef2
{
private static int _idCt = 1000;
private int _id;
public MyRef2()
{
_id = ++_idCt;
}
public virtual int Id
{
get { return _id; }
set { _id = value; }
}
public virtual int? J1 { get; set; }
public virtual int J2 { get; set; }
public virtual int J3 { get; set; }
}
public class MyRef3
{
private static int _idCt = 3000;
private int _id;
public MyRef3()
{
_id = ++_idCt;
}
public virtual int Id
{
get { return _id; }
set { _id = value; }
}
public virtual int L1 { get; set; }
}
public enum Ignore { Ignore }
public enum TK { ValueNull, Zero, One }
public enum TBO1_I { Null, ValueNull, Zero, One }
public enum TBO2_J { Null, ValueNull, Zero, One }
public enum TBO1_BO2_J { Null, BO1, ValueNull, Zero, One }
public enum TBO1_BO3_L { Null, BO1, ValueNull, Zero, One }
public class MyBO
{
private static int _idCt = 0;
private int _id;
public MyBO()
{
_id = ++_idCt;
}
public virtual int Id
{
get { return _id; }
set { _id = value; }
}
public virtual string Name { get; set; }
public virtual MyBO LeftSon { get; set; }
public virtual MyBO RightSon { get; set; }
public virtual MyRef1 BO1 { get; set; }
public virtual MyRef1 OtherBO1 { get; set; }
public virtual MyRef2 BO2 { get; set; }
public virtual int? K1 { get; set; }
public virtual int K2 { get; set; }
public virtual int K3 { get; set; }
private MyRef1 GetOrCreateBO1(ISession s)
{
if (BO1 == null)
{
BO1 = new MyRef1();
s.Save(BO1);
}
return BO1;
}
private MyRef2 GetOrCreateBO2(ISession s)
{
if (BO2 == null)
{
BO2 = new MyRef2();
s.Save(BO2);
}
return BO2;
}
public static void SetK1(MyBO bo, ISession s, TK value)
{
switch (value)
{
case TK.ValueNull:
bo.K1 = null;
break;
case TK.Zero:
bo.K1 = 0;
break;
case TK.One:
bo.K1 = 1;
break;
default:
throw new Exception("Value " + value + " not handled in
code");
}
}
public static void SetK2(MyBO bo, ISession s, TK value)
{
bo.K2 = value == TK.One ? 1 : 0;
}
public static void SetK3(MyBO bo, ISession s, TK value)
{
bo.K3 = value == TK.One ? 1 : 0;
}
private static void SetBO1_I(MyBO bo, ISession s, TBO1_I value,
Action<MyRef1, int?> set)
{
switch (value)
{
case TBO1_I.Null:
bo.BO1 = null;
break;
case TBO1_I.ValueNull:
set(bo.GetOrCreateBO1(s), null);
break;
case TBO1_I.Zero:
set(bo.GetOrCreateBO1(s), 0);
break;
case TBO1_I.One:
set(bo.GetOrCreateBO1(s), 1);
break;
default:
throw new Exception("Value " + value + " not handled in
code");
}
}
public static void SetBO1_I1(MyBO bo, ISession s, TBO1_I value)
{
SetBO1_I(bo, s, value, (b, i) => b.I1 = i);
}
public static void SetBO1_I2(MyBO bo, ISession s, TBO1_I value)
{
SetBO1_I(bo, s, value, (b, i) => b.I2 = i ?? 0);
}
public static void SetBO1_I3(MyBO bo, ISession s, TBO1_I value)
{
SetBO1_I(bo, s, value, (b, i) => b.I3 = i ?? 0);
}
private static void SetBO2_J(MyBO bo, ISession s, TBO2_J value,
Action<MyRef2, int?> set)
{
switch (value)
{
case TBO2_J.Null:
bo.BO2 = null;
break;
case TBO2_J.ValueNull:
set(bo.GetOrCreateBO2(s), null);
break;
case TBO2_J.Zero:
set(bo.GetOrCreateBO2(s), 0);
break;
case TBO2_J.One:
set(bo.GetOrCreateBO2(s), 1);
break;
default:
throw new Exception("Value " + value + " not handled in
code");
}
}
public static void SetBO2_J1(MyBO bo, ISession s, TBO2_J value)
{
SetBO2_J(bo, s, value, (b, i) => b.J1 = i);
}
public static void SetBO2_J2(MyBO bo, ISession s, TBO2_J value)
{
SetBO2_J(bo, s, value, (b, i) => b.J2 = i ?? 0);
}
public static void SetBO2_J3(MyBO bo, ISession s, TBO2_J value)
{
SetBO2_J(bo, s, value, (b, i) => b.J3 = i ?? 0);
}
private static void SetBO1_BO2_J(MyBO bo, ISession s, TBO1_BO2_J value,
Action<MyRef2, int?> set)
{
switch (value)
{
case TBO1_BO2_J.Null:
bo.BO1 = null;
break;
case TBO1_BO2_J.BO1:
bo.GetOrCreateBO1(s).BO2 = null;
break;
case TBO1_BO2_J.ValueNull:
set(bo.GetOrCreateBO1(s).GetOrCreateBO2(s), null);
break;
case TBO1_BO2_J.Zero:
set(bo.GetOrCreateBO1(s).GetOrCreateBO2(s), 0);
break;
case TBO1_BO2_J.One:
set(bo.GetOrCreateBO1(s).GetOrCreateBO2(s), 1);
break;
default:
throw new Exception("Value " + value + " not handled in
code");
}
}
public static void SetBO1_BO2_J1(MyBO bo, ISession s, TBO1_BO2_J value)
{
SetBO1_BO2_J(bo, s, value, (b, i) => b.J1 = i);
}
public static void Set_BO1_BO2_J2(MyBO bo, ISession s, TBO1_BO2_J value)
{
SetBO1_BO2_J(bo, s, value, (b, i) => b.J2 = i ?? 0);
}
public static void SetBO1_BO3_L1(MyBO bo, ISession s, TBO1_BO3_L value)
{
switch (value)
{
case TBO1_BO3_L.Null:
bo.BO1 = null;
break;
case TBO1_BO3_L.BO1:
bo.GetOrCreateBO1(s).BO3 = null;
break;
case TBO1_BO3_L.ValueNull:
bo.GetOrCreateBO1(s).GetOrCreateBO3(s).L1 = 0; // L1 is
int, not int?
break;
case TBO1_BO3_L.Zero:
bo.GetOrCreateBO1(s).GetOrCreateBO3(s).L1 = 0;
break;
case TBO1_BO3_L.One:
bo.GetOrCreateBO1(s).GetOrCreateBO3(s).L1 = 1;
break;
default:
throw new Exception("Value " + value + " not handled in
code");
}
}
}
}