Skip to content

Commit aaf7810

Browse files
committed
More test cases
1 parent 7c31eb5 commit aaf7810

File tree

7 files changed

+222
-35
lines changed

7 files changed

+222
-35
lines changed

src/NHibernate.Test/NHSpecificTest/NH750/Device.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ namespace NHibernate.Test.NHSpecificTest.NH750
66
{
77
public class Device
88
{
9+
private int _id;
10+
private Device _template;
11+
private IList<Drive> _drives = new List<Drive>();
12+
private IList<Drive> _drivesNotIgnored = new List<Drive>();
13+
914
public Device() : base()
1015
{
1116
}
@@ -16,32 +21,34 @@ public Device(string manifacturer)
1621
_manifacturer = manifacturer;
1722
}
1823

19-
private int _id;
24+
public virtual Device Template
25+
{
26+
get => _template;
27+
set => _template = value;
28+
}
2029

21-
public int Id
30+
public virtual int Id
2231
{
2332
get { return _id; }
2433
set { _id = value; }
2534
}
2635

2736
private string _manifacturer;
2837

29-
public string Manifacturer
38+
public virtual string Manifacturer
3039
{
3140
get { return _manifacturer; }
3241
set { _manifacturer = value; }
3342
}
3443

35-
private IList<Drive> _drives = new List<Drive>();
36-
private IList<Drive> _drivesNotIgnored = new List<Drive>();
3744

38-
public IList<Drive> Drives
45+
public virtual IList<Drive> Drives
3946
{
4047
get { return _drives; }
4148
set { _drives = value; }
4249
}
4350

44-
public IList<Drive> DrivesNotIgnored
51+
public virtual IList<Drive> DrivesNotIgnored
4552
{
4653
get => _drivesNotIgnored;
4754
set => _drivesNotIgnored = value;

src/NHibernate.Test/NHSpecificTest/NH750/Drive.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ public Drive(string classFullName)
1616

1717
private int _id;
1818

19-
public int Id
19+
public virtual int Id
2020
{
2121
get { return _id; }
2222
set { _id = value; }
2323
}
2424

2525
private string _classFullName;
2626

27-
public string ClassFullName
27+
public virtual string ClassFullName
2828
{
2929
get { return _classFullName; }
3030
set { _classFullName = value; }
@@ -44,4 +44,4 @@ public override int GetHashCode()
4444
return _classFullName.GetHashCode();
4545
}
4646
}
47-
}
47+
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
using System;
2+
using NHibernate.Criterion;
3+
using NHibernate.Transform;
4+
using NUnit.Framework;
5+
6+
namespace NHibernate.Test.NHSpecificTest.NH750
7+
{
8+
[TestFixture(0)]
9+
[TestFixture(1)]
10+
[TestFixture(2)]
11+
public class ManyToManyFixture : BugTestCase
12+
{
13+
private int id2;
14+
private readonly int _drivesCount;
15+
private int _withTempalteId;
16+
private int ValidDrivesCount => _drivesCount;
17+
18+
public ManyToManyFixture(int drivesCount)
19+
{
20+
_drivesCount = drivesCount;
21+
}
22+
23+
protected override void OnSetUp()
24+
{
25+
Drive dr1 = new Drive("Drive 1");
26+
Drive dr2 = new Drive("Drive 2");
27+
Drive dr3 = new Drive("Drive 3");
28+
Device dv1 = new Device("Device 1");
29+
Device dv2 = new Device("Device 2");
30+
var withTempalte = new Device("Device With Device 2 template") { Template = dv2 };
31+
using var s = Sfi.OpenSession();
32+
using var t = s.BeginTransaction();
33+
s.Save(dr1);
34+
s.Save(dr2);
35+
s.Save(dr3);
36+
AddDrive(dv1, dr2);
37+
AddDrive(dv1, dr1);
38+
AddDrive(dv2, dr3);
39+
AddDrive(dv2, dr1);
40+
41+
s.Save(dv1);
42+
id2 = (int) s.Save(dv2);
43+
_withTempalteId = (int)s.Save(withTempalte);
44+
t.Commit();
45+
}
46+
47+
private void AddDrive(Device dv, Drive drive)
48+
{
49+
if(dv.DrivesNotIgnored.Count >= _drivesCount)
50+
return;
51+
dv.DrivesNotIgnored.Add(drive);
52+
}
53+
54+
protected override void OnTearDown()
55+
{
56+
using var s = Sfi.OpenSession();
57+
using var t = s.BeginTransaction();
58+
59+
s.CreateSQLQuery("delete from DriveOfDevice").ExecuteUpdate();
60+
s.Delete("from Device");
61+
s.Delete("from Drive");
62+
t.Commit();
63+
}
64+
65+
[Test]
66+
public void QueryOverFetch()
67+
{
68+
using var log = new SqlLogSpy();
69+
using var s = OpenSession();
70+
var dv2 = s.QueryOver<Device>()
71+
.Fetch(SelectMode.Fetch, x => x.DrivesNotIgnored)
72+
.Where(Restrictions.IdEq(id2))
73+
.TransformUsing(Transformers.DistinctRootEntity)
74+
.SingleOrDefault();
75+
76+
Assert.That(NHibernateUtil.IsInitialized(dv2.DrivesNotIgnored), Is.True);
77+
Assert.That(dv2.DrivesNotIgnored, Has.Count.EqualTo(ValidDrivesCount).And.None.Null);
78+
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(1));
79+
}
80+
81+
[Test]
82+
public void QueryOverFetch2()
83+
{
84+
using var log = new SqlLogSpy();
85+
using var s = OpenSession();
86+
var withTemplate = s.QueryOver<Device>()
87+
.Fetch(SelectMode.Fetch, x => x.Template, x => x.Template.DrivesNotIgnored)
88+
.Where(Restrictions.IdEq(_withTempalteId))
89+
.TransformUsing(Transformers.DistinctRootEntity)
90+
.SingleOrDefault();
91+
92+
Assert.That(NHibernateUtil.IsInitialized(withTemplate.Template), Is.True);
93+
Assert.That(NHibernateUtil.IsInitialized(withTemplate.Template.DrivesNotIgnored), Is.True);
94+
Assert.That(withTemplate.Template.DrivesNotIgnored, Has.Count.EqualTo(ValidDrivesCount).And.None.Null);
95+
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(1));
96+
}
97+
98+
[Test]
99+
public void HqlFetch()
100+
{
101+
using var log = new SqlLogSpy();
102+
using var s = OpenSession();
103+
var dv2 = s.CreateQuery("from Device d left join fetch d.DrivesNotIgnored where d.id = :id")
104+
.SetResultTransformer(Transformers.DistinctRootEntity)
105+
.SetParameter("id", id2)
106+
.UniqueResult<Device>();
107+
108+
Assert.That(NHibernateUtil.IsInitialized(dv2.DrivesNotIgnored), Is.True);
109+
Assert.That(dv2.DrivesNotIgnored, Has.Count.EqualTo(ValidDrivesCount).And.None.Null);
110+
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(1));
111+
}
112+
113+
[Test]
114+
public void HqlFetch2()
115+
{
116+
using var log = new SqlLogSpy();
117+
using var s = OpenSession();
118+
var withTemplate = s.CreateQuery("from Device t left join fetch t.Template d left join fetch d.DrivesNotIgnored where d.id = :id")
119+
.SetResultTransformer(Transformers.DistinctRootEntity)
120+
.SetParameter("id", id2)
121+
.UniqueResult<Device>();
122+
123+
Assert.That(NHibernateUtil.IsInitialized(withTemplate.Template), Is.True);
124+
Assert.That(NHibernateUtil.IsInitialized(withTemplate.Template.DrivesNotIgnored), Is.True);
125+
Assert.That(withTemplate.Template.DrivesNotIgnored, Has.Count.EqualTo(ValidDrivesCount).And.None.Null);
126+
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(1));
127+
}
128+
129+
[Test]
130+
public void LazyLoad()
131+
{
132+
using var log = new SqlLogSpy();
133+
using var s = OpenSession();
134+
135+
var dv2 = s.Get<Device>(id2);
136+
137+
NHibernateUtil.Initialize(dv2.DrivesNotIgnored);
138+
Assert.That(NHibernateUtil.IsInitialized(dv2.DrivesNotIgnored), Is.True);
139+
Assert.That(dv2.DrivesNotIgnored, Has.Count.EqualTo(ValidDrivesCount).And.None.Null);
140+
// First query for Device, second for Drives collection
141+
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(2));
142+
}
143+
}
144+
}

src/NHibernate.Test/NHSpecificTest/NH750/ManyToManyNotFoundIgnoreFixture.cs

Lines changed: 57 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class ManyToManyNotFoundIgnoreFixture : BugTestCase
1313
private int id1;
1414
private int id2;
1515
private int _drive2Id;
16+
private int _withTempalteId;
1617
private readonly int _drivesCount;
1718
private int ValidDrivesCount => _drivesCount == 0? 0 : _drivesCount - 1;
1819

@@ -28,25 +29,26 @@ protected override void OnSetUp()
2829
Drive dr3 = new Drive("Drive 3");
2930
Device dv1 = new Device("Device 1");
3031
Device dv2 = new Device("Device 2");
31-
using (var s = Sfi.OpenSession())
32-
using (var t = s.BeginTransaction())
33-
{
34-
s.Save(dr1);
35-
_drive2Id = (int)s.Save(dr2);
36-
s.Save(dr3);
37-
AddDrive(dv1, dr2);
38-
AddDrive(dv1, dr1);
39-
AddDrive(dv2, dr3);
40-
AddDrive(dv2, dr1);
41-
42-
id1 = (int) s.Save(dv1);
43-
id2 = (int) s.Save(dv2);
44-
s.Flush();
32+
var withTempalte = new Device("Device With Device 2 template") { Template = dv2 };
4533

46-
s.Clear();
47-
s.Delete(dr3);
48-
t.Commit();
49-
}
34+
using var s = Sfi.OpenSession();
35+
using var t = s.BeginTransaction();
36+
s.Save(dr1);
37+
_drive2Id = (int)s.Save(dr2);
38+
s.Save(dr3);
39+
AddDrive(dv1, dr2);
40+
AddDrive(dv1, dr1);
41+
AddDrive(dv2, dr3);
42+
AddDrive(dv2, dr1);
43+
44+
id1 = (int) s.Save(dv1);
45+
id2 = (int) s.Save(dv2);
46+
_withTempalteId = (int)s.Save(withTempalte);
47+
s.Flush();
48+
49+
s.Clear();
50+
s.Delete(dr3);
51+
t.Commit();
5052
}
5153

5254
private void AddDrive(Device dv, Drive drive)
@@ -76,6 +78,8 @@ public void DeviceOfDrive()
7678
{
7779
dv1 = (Device) s.Load(typeof(Device), id1);
7880
dv2 = (Device) s.Load(typeof(Device), id2);
81+
NHibernateUtil.Initialize(dv1.Drives);
82+
NHibernateUtil.Initialize(dv2.Drives);
7983
}
8084

8185
Assert.That(dv1.Drives, Has.Count.EqualTo(_drivesCount).And.None.Null);
@@ -141,6 +145,23 @@ public void QueryOverFetch()
141145
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(1));
142146
}
143147

148+
[Test]
149+
public void QueryOverFetch2()
150+
{
151+
using var log = new SqlLogSpy();
152+
using var s = OpenSession();
153+
var withTemplate = s.QueryOver<Device>()
154+
.Fetch(SelectMode.Fetch, x => x.Template, x => x.Template.Drives)
155+
.Where(Restrictions.IdEq(_withTempalteId))
156+
.TransformUsing(Transformers.DistinctRootEntity)
157+
.SingleOrDefault();
158+
159+
Assert.That(NHibernateUtil.IsInitialized(withTemplate.Template), Is.True);
160+
Assert.That(NHibernateUtil.IsInitialized(withTemplate.Template.Drives), Is.True);
161+
Assert.That(withTemplate.Template.Drives, Has.Count.EqualTo(ValidDrivesCount).And.None.Null);
162+
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(1));
163+
}
164+
144165
[Test]
145166
public void HqlFetch()
146167
{
@@ -157,17 +178,31 @@ public void HqlFetch()
157178
}
158179

159180
[Test]
160-
public void LazyLoad()
181+
public void HqlFetch2()
161182
{
162183
using var log = new SqlLogSpy();
163184
using var s = OpenSession();
185+
var withTemplate = s.CreateQuery("from Device t left join fetch t.Template d left join fetch d.Drives where d.id = :id")
186+
.SetResultTransformer(Transformers.DistinctRootEntity)
187+
.SetParameter("id", id2)
188+
.UniqueResult<Device>();
189+
190+
Assert.That(NHibernateUtil.IsInitialized(withTemplate.Template), Is.True);
191+
Assert.That(NHibernateUtil.IsInitialized(withTemplate.Template.Drives), Is.True);
192+
Assert.That(withTemplate.Template.Drives, Has.Count.EqualTo(ValidDrivesCount).And.None.Null);
193+
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(1));
194+
}
195+
196+
[Test]
197+
public void LazyLoad()
198+
{
199+
using var s = OpenSession();
164200

165201
var dv2 = s.Get<Device>(id2);
202+
using var log = new SqlLogSpy();
166203

167-
Assert.That(NHibernateUtil.IsInitialized(dv2.Drives), Is.True);
168204
Assert.That(dv2.Drives, Has.Count.EqualTo(ValidDrivesCount).And.None.Null);
169-
// First query for Device, second for Drives collection
170-
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(2));
205+
Assert.That(log.Appender.GetEvents().Length, Is.EqualTo(1));
171206
}
172207
}
173208
}

src/NHibernate.Test/NHSpecificTest/NH750/ManyToManyThrowsForNotFoundFixture.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ protected override void OnTearDown()
4444
[Test]
4545
public void LazyLoad()
4646
{
47+
using var log = new SqlLogSpy();
4748
using var s = OpenSession();
4849
var device = s.Get<Device>(_id);
4950
Assert.Throws<ObjectNotFoundException>(() => NHibernateUtil.Initialize(device.DrivesNotIgnored));

src/NHibernate.Test/NHSpecificTest/NH750/Mappings.hbm.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
33
assembly="NHibernate.Test"
44
namespace="NHibernate.Test.NHSpecificTest.NH750"
5-
default-access="field.camelcase-underscore"
6-
default-lazy="false">
5+
default-access="field.camelcase-underscore">
76
<class name="Device">
87
<id name="Id" column="`_id`" type="Int32">
98
<generator class="native"/>
109
</id>
1110
<property name="Manifacturer"/>
11+
<many-to-one name="Template" />
1212
<bag name="Drives" table="DriveOfDevice" cascade="all">
1313
<key column="DeviceId"/>
1414
<many-to-many class="Drive" column="DriveId" not-found="ignore"/>

src/NHibernate.Test/SubselectFetchTest/SubselectFetchFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ public void ManyToManyCriteriaJoin()
280280

281281
s = OpenSession();
282282
t = s.BeginTransaction();
283-
283+
var log = new SqlLogSpy();
284284
s.CreateCriteria(typeof(Parent))
285285
.AddOrder(Order.Desc("Name"))
286286
// H3 has this after CreateCriteria("Friends"), but it's not yet supported in NH

0 commit comments

Comments
 (0)