Skip to content

Commit c8b9ae6

Browse files
hazzikfredericDelaporte
authored andcommitted
Fix determination of interface proxies (#2070)
1 parent 6277f51 commit c8b9ae6

File tree

11 files changed

+532
-54
lines changed

11 files changed

+532
-54
lines changed
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System;
12+
using NHibernate.Cfg.MappingSchema;
13+
using NHibernate.Mapping.ByCode;
14+
using NHibernate.Proxy;
15+
using NUnit.Framework;
16+
17+
namespace NHibernate.Test.NHSpecificTest.GH2067
18+
{
19+
using System.Threading.Tasks;
20+
[TestFixture]
21+
public class FixtureAsync : TestCaseMappingByCode
22+
{
23+
private object domesticCatId;
24+
private object catId;
25+
26+
protected override HbmMapping GetMappings()
27+
{
28+
var mapper = new ModelMapper();
29+
mapper.Class<Cat>(rc =>
30+
{
31+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
32+
rc.Property(x => x.Name);
33+
});
34+
35+
mapper.JoinedSubclass<DomesticCat>(rc =>
36+
{
37+
rc.Proxy(typeof(IDomesticCat));
38+
rc.Property(x => x.OwnerName);
39+
});
40+
41+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
42+
}
43+
44+
protected override void OnSetUp()
45+
{
46+
using (var session = OpenSession())
47+
using (var transaction = session.BeginTransaction())
48+
{
49+
catId = session.Save(new Cat { Name = "Bob" });
50+
51+
domesticCatId = session.Save(new DomesticCat {Name = "Tom", OwnerName = "Jerry"});
52+
53+
transaction.Commit();
54+
}
55+
}
56+
57+
protected override void OnTearDown()
58+
{
59+
using (var session = OpenSession())
60+
using (var transaction = session.BeginTransaction())
61+
{
62+
// HQL Delete of entities with joins requires temp tables, which are not
63+
// supported by all dialects: use in memory-delete instead.
64+
session.Delete("from System.Object");
65+
66+
transaction.Commit();
67+
}
68+
}
69+
70+
[Test]
71+
public async Task CanLoadDomesticCatUsingBaseClassAsync()
72+
{
73+
using (var session = OpenSession())
74+
using (session.BeginTransaction())
75+
{
76+
var cat = await (session.LoadAsync<Cat>(domesticCatId));
77+
Assert.That(cat, Is.Not.Null);
78+
Assert.That(cat.Name, Is.EqualTo("Tom"));
79+
var domesticCat = (IDomesticCat) cat;
80+
Assert.That(domesticCat.Name, Is.EqualTo("Tom"));
81+
Assert.That(domesticCat.OwnerName, Is.EqualTo("Jerry"));
82+
var proxy = (INHibernateProxy) cat;
83+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
84+
}
85+
}
86+
87+
[Test]
88+
public async Task CanLoadDomesticCatUsingBaseClassInterfaceAsync()
89+
{
90+
using (var session = OpenSession())
91+
using (session.BeginTransaction())
92+
{
93+
var cat = await (session.LoadAsync<ICat>(domesticCatId));
94+
Assert.That(cat, Is.Not.Null);
95+
Assert.That(cat.Name, Is.EqualTo("Tom"));
96+
var domesticCat = (IDomesticCat) cat;
97+
Assert.That(domesticCat.Name, Is.EqualTo("Tom"));
98+
Assert.That(domesticCat.OwnerName, Is.EqualTo("Jerry"));
99+
var proxy = (INHibernateProxy) cat;
100+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
101+
}
102+
}
103+
104+
[Test]
105+
public async Task CanLoadDomesticCatUsingInterfaceAsync()
106+
{
107+
using (var session = OpenSession())
108+
using (session.BeginTransaction())
109+
{
110+
var cat = await (session.LoadAsync<IDomesticCat>(domesticCatId));
111+
Assert.That(cat, Is.Not.Null);
112+
Assert.That(cat.Name, Is.EqualTo("Tom"));
113+
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
114+
var proxy = (INHibernateProxy) cat;
115+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
116+
}
117+
}
118+
119+
[Test]
120+
public void ThrowWhenTryToLoadDomesticCatUsingSealedClassAsync()
121+
{
122+
using (var session = OpenSession())
123+
using (session.BeginTransaction())
124+
{
125+
Assert.ThrowsAsync<InvalidCastException>(() => session.LoadAsync<DomesticCat>(domesticCatId));
126+
}
127+
}
128+
129+
[Test]
130+
public async Task CanLoadDomesticCatUsingSealedClassAsync()
131+
{
132+
using (var session = OpenSession())
133+
using (session.BeginTransaction())
134+
{
135+
var cat = (IDomesticCat) await (session.LoadAsync(typeof(DomesticCat), domesticCatId));
136+
Assert.That(cat, Is.Not.Null);
137+
Assert.That(cat.Name, Is.EqualTo("Tom"));
138+
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
139+
var proxy = (INHibernateProxy) cat;
140+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
141+
}
142+
}
143+
144+
[Test]
145+
public async Task CanLoadDomesticCatUsingSideInterfaceAsync()
146+
{
147+
using (var session = OpenSession())
148+
using (session.BeginTransaction())
149+
{
150+
var cat = await (session.LoadAsync<IPet>(domesticCatId));
151+
Assert.That(cat, Is.Not.Null);
152+
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
153+
var proxy = (INHibernateProxy) cat;
154+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
155+
}
156+
}
157+
158+
[Test]
159+
public async Task CanLoadCatUsingClassAsync()
160+
{
161+
using (var session = OpenSession())
162+
using (session.BeginTransaction())
163+
{
164+
var cat = await (session.LoadAsync<Cat>(catId));
165+
Assert.That(cat, Is.Not.Null);
166+
Assert.That(cat.Name, Is.EqualTo("Bob"));
167+
var proxy = (INHibernateProxy) cat;
168+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
169+
}
170+
}
171+
172+
[Test]
173+
public async Task CanLoadCatUsingInterfaceAsync()
174+
{
175+
using (var session = OpenSession())
176+
using (session.BeginTransaction())
177+
{
178+
var cat = await (session.LoadAsync<ICat>(catId));
179+
Assert.That(cat, Is.Not.Null);
180+
Assert.That(cat.Name, Is.EqualTo("Bob"));
181+
var proxy = (INHibernateProxy) cat;
182+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
183+
}
184+
}
185+
}
186+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.GH2067
4+
{
5+
public interface ICat
6+
{
7+
Guid Id { get; set; }
8+
string Name { get; set; }
9+
}
10+
11+
public class Cat : ICat
12+
{
13+
public virtual Guid Id { get; set; }
14+
public virtual string Name { get; set; }
15+
}
16+
17+
public interface IPet
18+
{
19+
string OwnerName { get; set; }
20+
}
21+
22+
public interface IDomesticCat : IPet, ICat
23+
{
24+
}
25+
26+
public sealed class DomesticCat : Cat, IDomesticCat
27+
{
28+
public string OwnerName { get; set; }
29+
}
30+
}
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
using System;
2+
using NHibernate.Cfg.MappingSchema;
3+
using NHibernate.Mapping.ByCode;
4+
using NHibernate.Proxy;
5+
using NUnit.Framework;
6+
7+
namespace NHibernate.Test.NHSpecificTest.GH2067
8+
{
9+
[TestFixture]
10+
public class Fixture : TestCaseMappingByCode
11+
{
12+
private object domesticCatId;
13+
private object catId;
14+
15+
protected override HbmMapping GetMappings()
16+
{
17+
var mapper = new ModelMapper();
18+
mapper.Class<Cat>(rc =>
19+
{
20+
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
21+
rc.Property(x => x.Name);
22+
});
23+
24+
mapper.JoinedSubclass<DomesticCat>(rc =>
25+
{
26+
rc.Proxy(typeof(IDomesticCat));
27+
rc.Property(x => x.OwnerName);
28+
});
29+
30+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
31+
}
32+
33+
protected override void OnSetUp()
34+
{
35+
using (var session = OpenSession())
36+
using (var transaction = session.BeginTransaction())
37+
{
38+
catId = session.Save(new Cat { Name = "Bob" });
39+
40+
domesticCatId = session.Save(new DomesticCat {Name = "Tom", OwnerName = "Jerry"});
41+
42+
transaction.Commit();
43+
}
44+
}
45+
46+
protected override void OnTearDown()
47+
{
48+
using (var session = OpenSession())
49+
using (var transaction = session.BeginTransaction())
50+
{
51+
// HQL Delete of entities with joins requires temp tables, which are not
52+
// supported by all dialects: use in memory-delete instead.
53+
session.Delete("from System.Object");
54+
55+
transaction.Commit();
56+
}
57+
}
58+
59+
[Test]
60+
public void CanLoadDomesticCatUsingBaseClass()
61+
{
62+
using (var session = OpenSession())
63+
using (session.BeginTransaction())
64+
{
65+
var cat = session.Load<Cat>(domesticCatId);
66+
Assert.That(cat, Is.Not.Null);
67+
Assert.That(cat.Name, Is.EqualTo("Tom"));
68+
var domesticCat = (IDomesticCat) cat;
69+
Assert.That(domesticCat.Name, Is.EqualTo("Tom"));
70+
Assert.That(domesticCat.OwnerName, Is.EqualTo("Jerry"));
71+
var proxy = (INHibernateProxy) cat;
72+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
73+
}
74+
}
75+
76+
[Test]
77+
public void CanLoadDomesticCatUsingBaseClassInterface()
78+
{
79+
using (var session = OpenSession())
80+
using (session.BeginTransaction())
81+
{
82+
var cat = session.Load<ICat>(domesticCatId);
83+
Assert.That(cat, Is.Not.Null);
84+
Assert.That(cat.Name, Is.EqualTo("Tom"));
85+
var domesticCat = (IDomesticCat) cat;
86+
Assert.That(domesticCat.Name, Is.EqualTo("Tom"));
87+
Assert.That(domesticCat.OwnerName, Is.EqualTo("Jerry"));
88+
var proxy = (INHibernateProxy) cat;
89+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
90+
}
91+
}
92+
93+
[Test]
94+
public void CanLoadDomesticCatUsingInterface()
95+
{
96+
using (var session = OpenSession())
97+
using (session.BeginTransaction())
98+
{
99+
var cat = session.Load<IDomesticCat>(domesticCatId);
100+
Assert.That(cat, Is.Not.Null);
101+
Assert.That(cat.Name, Is.EqualTo("Tom"));
102+
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
103+
var proxy = (INHibernateProxy) cat;
104+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
105+
}
106+
}
107+
108+
[Test]
109+
public void ThrowWhenTryToLoadDomesticCatUsingSealedClass()
110+
{
111+
using (var session = OpenSession())
112+
using (session.BeginTransaction())
113+
{
114+
Assert.Throws<InvalidCastException>(() => session.Load<DomesticCat>(domesticCatId));
115+
}
116+
}
117+
118+
[Test]
119+
public void CanLoadDomesticCatUsingSealedClass()
120+
{
121+
using (var session = OpenSession())
122+
using (session.BeginTransaction())
123+
{
124+
var cat = (IDomesticCat) session.Load(typeof(DomesticCat), domesticCatId);
125+
Assert.That(cat, Is.Not.Null);
126+
Assert.That(cat.Name, Is.EqualTo("Tom"));
127+
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
128+
var proxy = (INHibernateProxy) cat;
129+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
130+
}
131+
}
132+
133+
[Test]
134+
public void CanLoadDomesticCatUsingSideInterface()
135+
{
136+
using (var session = OpenSession())
137+
using (session.BeginTransaction())
138+
{
139+
var cat = session.Load<IPet>(domesticCatId);
140+
Assert.That(cat, Is.Not.Null);
141+
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
142+
var proxy = (INHibernateProxy) cat;
143+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
144+
}
145+
}
146+
147+
[Test]
148+
public void CanLoadCatUsingClass()
149+
{
150+
using (var session = OpenSession())
151+
using (session.BeginTransaction())
152+
{
153+
var cat = session.Load<Cat>(catId);
154+
Assert.That(cat, Is.Not.Null);
155+
Assert.That(cat.Name, Is.EqualTo("Bob"));
156+
var proxy = (INHibernateProxy) cat;
157+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
158+
}
159+
}
160+
161+
[Test]
162+
public void CanLoadCatUsingInterface()
163+
{
164+
using (var session = OpenSession())
165+
using (session.BeginTransaction())
166+
{
167+
var cat = session.Load<ICat>(catId);
168+
Assert.That(cat, Is.Not.Null);
169+
Assert.That(cat.Name, Is.EqualTo("Bob"));
170+
var proxy = (INHibernateProxy) cat;
171+
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
172+
}
173+
}
174+
}
175+
}

0 commit comments

Comments
 (0)