Skip to content

Fix determination of interface proxies #2070

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Mar 24, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
186 changes: 186 additions & 0 deletions src/NHibernate.Test/Async/NHSpecificTest/GH2067/Fixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by AsyncGenerator.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------


using System;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Mapping.ByCode;
using NHibernate.Proxy;
using NUnit.Framework;

namespace NHibernate.Test.NHSpecificTest.GH2067
{
using System.Threading.Tasks;
[TestFixture]
public class FixtureAsync : TestCaseMappingByCode
{
private object domesticCatId;
private object catId;

protected override HbmMapping GetMappings()
{
var mapper = new ModelMapper();
mapper.Class<Cat>(rc =>
{
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
rc.Property(x => x.Name);
});

mapper.JoinedSubclass<DomesticCat>(rc =>
{
rc.Proxy(typeof(IDomesticCat));
rc.Property(x => x.OwnerName);
});

return mapper.CompileMappingForAllExplicitlyAddedEntities();
}

protected override void OnSetUp()
{
using (var session = OpenSession())
using (var transaction = session.BeginTransaction())
{
catId = session.Save(new Cat { Name = "Bob" });

domesticCatId = session.Save(new DomesticCat {Name = "Tom", OwnerName = "Jerry"});

transaction.Commit();
}
}

protected override void OnTearDown()
{
using (var session = OpenSession())
using (var transaction = session.BeginTransaction())
{
// HQL Delete of entities with joins requires temp tables, which are not
// supported by all dialects: use in memory-delete instead.
session.Delete("from System.Object");

transaction.Commit();
}
}

[Test]
public async Task CanLoadDomesticCatUsingBaseClassAsync()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = await (session.LoadAsync<Cat>(domesticCatId));
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Tom"));
var domesticCat = (IDomesticCat) cat;
Assert.That(domesticCat.Name, Is.EqualTo("Tom"));
Assert.That(domesticCat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
}
}

[Test]
public async Task CanLoadDomesticCatUsingBaseClassInterfaceAsync()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = await (session.LoadAsync<ICat>(domesticCatId));
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Tom"));
var domesticCat = (IDomesticCat) cat;
Assert.That(domesticCat.Name, Is.EqualTo("Tom"));
Assert.That(domesticCat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
}
}

[Test]
public async Task CanLoadDomesticCatUsingInterfaceAsync()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = await (session.LoadAsync<IDomesticCat>(domesticCatId));
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Tom"));
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
}
}

[Test]
public void ThrowWhenTryToLoadDomesticCatUsingSealedClassAsync()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
Assert.ThrowsAsync<InvalidCastException>(() => session.LoadAsync<DomesticCat>(domesticCatId));
}
}

[Test]
public async Task CanLoadDomesticCatUsingSealedClassAsync()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = (IDomesticCat) await (session.LoadAsync(typeof(DomesticCat), domesticCatId));
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Tom"));
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
}
}

[Test]
public async Task CanLoadDomesticCatUsingSideInterfaceAsync()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = await (session.LoadAsync<IPet>(domesticCatId));
Assert.That(cat, Is.Not.Null);
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
}
}

[Test]
public async Task CanLoadCatUsingClassAsync()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = await (session.LoadAsync<Cat>(catId));
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Bob"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
}
}

[Test]
public async Task CanLoadCatUsingInterfaceAsync()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = await (session.LoadAsync<ICat>(catId));
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Bob"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
}
}
}
}
30 changes: 30 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/GH2067/Domain.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System;

namespace NHibernate.Test.NHSpecificTest.GH2067
{
public interface ICat
{
Guid Id { get; set; }
string Name { get; set; }
}

public class Cat : ICat
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
}

public interface IPet
{
string OwnerName { get; set; }
}

public interface IDomesticCat : IPet, ICat
{
}

public sealed class DomesticCat : Cat, IDomesticCat
{
public string OwnerName { get; set; }
}
}
175 changes: 175 additions & 0 deletions src/NHibernate.Test/NHSpecificTest/GH2067/Fixture.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
using System;
using NHibernate.Cfg.MappingSchema;
using NHibernate.Mapping.ByCode;
using NHibernate.Proxy;
using NUnit.Framework;

namespace NHibernate.Test.NHSpecificTest.GH2067
{
[TestFixture]
public class Fixture : TestCaseMappingByCode
{
private object domesticCatId;
private object catId;

protected override HbmMapping GetMappings()
{
var mapper = new ModelMapper();
mapper.Class<Cat>(rc =>
{
rc.Id(x => x.Id, m => m.Generator(Generators.GuidComb));
rc.Property(x => x.Name);
});

mapper.JoinedSubclass<DomesticCat>(rc =>
{
rc.Proxy(typeof(IDomesticCat));
rc.Property(x => x.OwnerName);
});

return mapper.CompileMappingForAllExplicitlyAddedEntities();
}

protected override void OnSetUp()
{
using (var session = OpenSession())
using (var transaction = session.BeginTransaction())
{
catId = session.Save(new Cat { Name = "Bob" });

domesticCatId = session.Save(new DomesticCat {Name = "Tom", OwnerName = "Jerry"});

transaction.Commit();
}
}

protected override void OnTearDown()
{
using (var session = OpenSession())
using (var transaction = session.BeginTransaction())
{
// HQL Delete of entities with joins requires temp tables, which are not
// supported by all dialects: use in memory-delete instead.
session.Delete("from System.Object");

transaction.Commit();
}
}

[Test]
public void CanLoadDomesticCatUsingBaseClass()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = session.Load<Cat>(domesticCatId);
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Tom"));
var domesticCat = (IDomesticCat) cat;
Assert.That(domesticCat.Name, Is.EqualTo("Tom"));
Assert.That(domesticCat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
}
}

[Test]
public void CanLoadDomesticCatUsingBaseClassInterface()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = session.Load<ICat>(domesticCatId);
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Tom"));
var domesticCat = (IDomesticCat) cat;
Assert.That(domesticCat.Name, Is.EqualTo("Tom"));
Assert.That(domesticCat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
}
}

[Test]
public void CanLoadDomesticCatUsingInterface()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = session.Load<IDomesticCat>(domesticCatId);
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Tom"));
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
}
}

[Test]
public void ThrowWhenTryToLoadDomesticCatUsingSealedClass()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
Assert.Throws<InvalidCastException>(() => session.Load<DomesticCat>(domesticCatId));
}
}

[Test]
public void CanLoadDomesticCatUsingSealedClass()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = (IDomesticCat) session.Load(typeof(DomesticCat), domesticCatId);
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Tom"));
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
}
}

[Test]
public void CanLoadDomesticCatUsingSideInterface()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = session.Load<IPet>(domesticCatId);
Assert.That(cat, Is.Not.Null);
Assert.That(cat.OwnerName, Is.EqualTo("Jerry"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(DomesticCat)));
}
}

[Test]
public void CanLoadCatUsingClass()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = session.Load<Cat>(catId);
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Bob"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
}
}

[Test]
public void CanLoadCatUsingInterface()
{
using (var session = OpenSession())
using (session.BeginTransaction())
{
var cat = session.Load<ICat>(catId);
Assert.That(cat, Is.Not.Null);
Assert.That(cat.Name, Is.EqualTo("Bob"));
var proxy = (INHibernateProxy) cat;
Assert.That(proxy.HibernateLazyInitializer.PersistentClass, Is.EqualTo(typeof(Cat)));
}
}
}
}
Loading