Skip to content

Commit ff6e513

Browse files
authored
Test case for subclass column uses wrong table in generated SQL (#2242)
See NH-3972 (#1189)
1 parent d33bce9 commit ff6e513

File tree

14 files changed

+482
-0
lines changed

14 files changed

+482
-0
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
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 System.Linq;
13+
using NUnit.Framework;
14+
using NHibernate.Linq;
15+
16+
namespace NHibernate.Test.NHSpecificTest.NH3972
17+
{
18+
using System.Threading.Tasks;
19+
[KnownBug("NH-3972(GH-1189)")]
20+
[TestFixture]
21+
public class FixtureAsync : BugTestCase
22+
{
23+
private DataChangeState changeState = null;
24+
private DataRequestForChangeState rfcState = null;
25+
private DataIncidentState incidentState = null;
26+
private DataProblemState problemState = null;
27+
28+
protected override void OnSetUp()
29+
{
30+
using (var session = OpenSession())
31+
using (var transaction = session.BeginTransaction())
32+
{
33+
foreach (ChangeInternalState state in Enum.GetValues(typeof(ChangeInternalState)))
34+
{
35+
changeState = new DataChangeState { State = state, Description = Enum.GetName(typeof(ChangeInternalState), state) };
36+
session.Save(changeState);
37+
}
38+
39+
foreach (RequestForChangeInternalState state in Enum.GetValues(typeof(RequestForChangeInternalState)))
40+
{
41+
rfcState = new DataRequestForChangeState { State = state, Description = Enum.GetName(typeof(RequestForChangeInternalState), state) };
42+
session.Save(rfcState);
43+
}
44+
45+
foreach (IncidentInternalState state in Enum.GetValues(typeof(IncidentInternalState)))
46+
{
47+
incidentState = new DataIncidentState { State = state, Description = Enum.GetName(typeof(IncidentInternalState), state) };
48+
session.Save(incidentState);
49+
}
50+
51+
foreach (ProblemInternalState state in Enum.GetValues(typeof(ProblemInternalState)))
52+
{
53+
problemState = new DataProblemState { State = state, Description = Enum.GetName(typeof(ProblemInternalState), state) };
54+
session.Save(problemState);
55+
}
56+
57+
session.Save(new RequestForChange { Subject = "I have a request", State = rfcState });
58+
session.Save(new Change { Subject = "I have changed the following stuff", State = changeState, ExecutedBy = "Me" });
59+
session.Save(new Incident { Subject = "Can someone look for this", State = incidentState, ReportedBy = "Someone" });
60+
session.Save(new Problem { Subject = "We have a problem", State = problemState });
61+
62+
session.Flush();
63+
transaction.Commit();
64+
}
65+
}
66+
67+
protected override void OnTearDown()
68+
{
69+
using (var session = OpenSession())
70+
using (var transaction = session.BeginTransaction())
71+
{
72+
session.Delete("from System.Object");
73+
74+
session.Flush();
75+
transaction.Commit();
76+
}
77+
}
78+
79+
[Test]
80+
public async Task QueryingAllAsync()
81+
{
82+
using (var session = OpenSession())
83+
{
84+
var result = await (session.Query<DataRecord>().ToListAsync());
85+
Assert.That(result.Count, Is.EqualTo(4));
86+
}
87+
}
88+
89+
[Test]
90+
public async Task QueryingSubPropertiesWithDifferentNamesAsync()
91+
{
92+
using (var session = OpenSession())
93+
{
94+
var result = await (session.Query<DataRecord>().Select(x => new
95+
{
96+
x.Subject,
97+
((Incident) x).ReportedBy,
98+
((Change) x).ExecutedBy
99+
}).ToListAsync());
100+
Assert.That(result.Count, Is.EqualTo(4));
101+
Assert.That(result.Count(x => x.ReportedBy == "Someone") == 1, Is.True); // there is one entity with a set ReportedBy column, i.e. the entity of type "Incident"
102+
Assert.That(result.Count(x => x.ExecutedBy == "Me") == 1, Is.True); // there is one entity with a set ExecutedBy column, i.e. the entity of type "Change"
103+
}
104+
}
105+
106+
[Test]
107+
public async Task QueryingSubPropertyWithTheSameNameAsync()
108+
{
109+
using (var session = OpenSession())
110+
{
111+
var result = await (session.Query<DataRecord>().Select(x => new
112+
{
113+
x.Subject,
114+
IncidentState = ((Incident) x).State.Description
115+
}).ToListAsync());
116+
Assert.That(result.Count, Is.EqualTo(4));
117+
Assert.That(result.Count(x => x.IncidentState == incidentState.Description) == 1, Is.True);
118+
}
119+
}
120+
121+
[Test]
122+
public async Task QueryingSubPropertiesWithTheSameNamesAsync()
123+
{
124+
using (var session = OpenSession())
125+
{
126+
var result = await (session.Query<DataRecord>().Select(x => new
127+
{
128+
x.Subject,
129+
IncidentState = ((Incident) x).State.Description,
130+
ChangeState = ((Change) x).State.Description
131+
}).ToListAsync());
132+
Assert.That(result.Count, Is.EqualTo(4));
133+
Assert.That(result.Count(x => x.IncidentState == incidentState.Description) == 1, Is.True); // there is only one "Incident" entity
134+
Assert.That(result.Count(x => x.ChangeState == changeState.Description) == 1, Is.True); // there is only one "Change" entity
135+
}
136+
}
137+
}
138+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3972
2+
{
3+
public class Change : DataRecord
4+
{
5+
public Change()
6+
{
7+
Type = DataRecordType.Change;
8+
}
9+
10+
public virtual DataChangeState State { get; set; }
11+
12+
public virtual string ExecutedBy { get; set; }
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3972
2+
{
3+
public enum ChangeInternalState { New, Completed }
4+
5+
public class DataChangeState : DataState
6+
{
7+
public DataChangeState()
8+
{
9+
Type = DataRecordType.Change;
10+
}
11+
12+
public virtual ChangeInternalState State { get; set; }
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3972
2+
{
3+
public enum IncidentInternalState { New, Assigned, Closed, Solved }
4+
5+
public class DataIncidentState : DataState
6+
{
7+
public DataIncidentState()
8+
{
9+
Type = DataRecordType.Incident;
10+
}
11+
12+
public virtual IncidentInternalState State { get; set; }
13+
}
14+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3972
2+
{
3+
public enum ProblemInternalState { New, Closed }
4+
5+
public class DataProblemState : DataState
6+
{
7+
public DataProblemState()
8+
{
9+
Type = DataRecordType.Problem;
10+
}
11+
12+
public virtual ProblemInternalState State { get; set; }
13+
}
14+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Diagnostics;
2+
3+
namespace NHibernate.Test.NHSpecificTest.NH3972
4+
{
5+
public enum DataRecordType
6+
{
7+
Incident,
8+
Problem,
9+
RequestForChange,
10+
Change
11+
}
12+
13+
[DebuggerDisplay("{Subject}")]
14+
public class DataRecord : Entity
15+
{
16+
public virtual DataRecordType Type { get; set; }
17+
public virtual string Subject { get; set; }
18+
}
19+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3972
2+
{
3+
public enum RequestForChangeInternalState { New, Orded, Closed, Cancelled }
4+
5+
public class DataRequestForChangeState : DataState
6+
{
7+
public DataRequestForChangeState()
8+
{
9+
Type = DataRecordType.RequestForChange;
10+
}
11+
12+
public virtual RequestForChangeInternalState State { get; set; }
13+
}
14+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using System.Diagnostics;
2+
3+
namespace NHibernate.Test.NHSpecificTest.NH3972
4+
{
5+
[DebuggerDisplay("{Description}")]
6+
public class DataState : Entity
7+
{
8+
public virtual DataRecordType Type { get; set; }
9+
public virtual string Description { get; set; }
10+
}
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
3+
namespace NHibernate.Test.NHSpecificTest.NH3972
4+
{
5+
public class Entity
6+
{
7+
public virtual Guid Id { get; set; }
8+
public virtual int Version { get; set; }
9+
}
10+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
using System;
2+
using System.Linq;
3+
using NUnit.Framework;
4+
5+
namespace NHibernate.Test.NHSpecificTest.NH3972
6+
{
7+
[KnownBug("NH-3972(GH-1189)")]
8+
[TestFixture]
9+
public class Fixture : BugTestCase
10+
{
11+
private DataChangeState changeState = null;
12+
private DataRequestForChangeState rfcState = null;
13+
private DataIncidentState incidentState = null;
14+
private DataProblemState problemState = null;
15+
16+
protected override void OnSetUp()
17+
{
18+
using (var session = OpenSession())
19+
using (var transaction = session.BeginTransaction())
20+
{
21+
foreach (ChangeInternalState state in Enum.GetValues(typeof(ChangeInternalState)))
22+
{
23+
changeState = new DataChangeState { State = state, Description = Enum.GetName(typeof(ChangeInternalState), state) };
24+
session.Save(changeState);
25+
}
26+
27+
foreach (RequestForChangeInternalState state in Enum.GetValues(typeof(RequestForChangeInternalState)))
28+
{
29+
rfcState = new DataRequestForChangeState { State = state, Description = Enum.GetName(typeof(RequestForChangeInternalState), state) };
30+
session.Save(rfcState);
31+
}
32+
33+
foreach (IncidentInternalState state in Enum.GetValues(typeof(IncidentInternalState)))
34+
{
35+
incidentState = new DataIncidentState { State = state, Description = Enum.GetName(typeof(IncidentInternalState), state) };
36+
session.Save(incidentState);
37+
}
38+
39+
foreach (ProblemInternalState state in Enum.GetValues(typeof(ProblemInternalState)))
40+
{
41+
problemState = new DataProblemState { State = state, Description = Enum.GetName(typeof(ProblemInternalState), state) };
42+
session.Save(problemState);
43+
}
44+
45+
session.Save(new RequestForChange { Subject = "I have a request", State = rfcState });
46+
session.Save(new Change { Subject = "I have changed the following stuff", State = changeState, ExecutedBy = "Me" });
47+
session.Save(new Incident { Subject = "Can someone look for this", State = incidentState, ReportedBy = "Someone" });
48+
session.Save(new Problem { Subject = "We have a problem", State = problemState });
49+
50+
session.Flush();
51+
transaction.Commit();
52+
}
53+
}
54+
55+
protected override void OnTearDown()
56+
{
57+
using (var session = OpenSession())
58+
using (var transaction = session.BeginTransaction())
59+
{
60+
session.Delete("from System.Object");
61+
62+
session.Flush();
63+
transaction.Commit();
64+
}
65+
}
66+
67+
[Test]
68+
public void QueryingAll()
69+
{
70+
using (var session = OpenSession())
71+
{
72+
var result = session.Query<DataRecord>().ToList();
73+
Assert.That(result.Count, Is.EqualTo(4));
74+
}
75+
}
76+
77+
[Test]
78+
public void QueryingSubPropertiesWithDifferentNames()
79+
{
80+
using (var session = OpenSession())
81+
{
82+
var result = session.Query<DataRecord>().Select(x => new
83+
{
84+
x.Subject,
85+
((Incident) x).ReportedBy,
86+
((Change) x).ExecutedBy
87+
}).ToList();
88+
Assert.That(result.Count, Is.EqualTo(4));
89+
Assert.That(result.Count(x => x.ReportedBy == "Someone") == 1, Is.True); // there is one entity with a set ReportedBy column, i.e. the entity of type "Incident"
90+
Assert.That(result.Count(x => x.ExecutedBy == "Me") == 1, Is.True); // there is one entity with a set ExecutedBy column, i.e. the entity of type "Change"
91+
}
92+
}
93+
94+
[Test]
95+
public void QueryingSubPropertyWithTheSameName()
96+
{
97+
using (var session = OpenSession())
98+
{
99+
var result = session.Query<DataRecord>().Select(x => new
100+
{
101+
x.Subject,
102+
IncidentState = ((Incident) x).State.Description
103+
}).ToList();
104+
Assert.That(result.Count, Is.EqualTo(4));
105+
Assert.That(result.Count(x => x.IncidentState == incidentState.Description) == 1, Is.True);
106+
}
107+
}
108+
109+
[Test]
110+
public void QueryingSubPropertiesWithTheSameNames()
111+
{
112+
using (var session = OpenSession())
113+
{
114+
var result = session.Query<DataRecord>().Select(x => new
115+
{
116+
x.Subject,
117+
IncidentState = ((Incident) x).State.Description,
118+
ChangeState = ((Change) x).State.Description
119+
}).ToList();
120+
Assert.That(result.Count, Is.EqualTo(4));
121+
Assert.That(result.Count(x => x.IncidentState == incidentState.Description) == 1, Is.True); // there is only one "Incident" entity
122+
Assert.That(result.Count(x => x.ChangeState == changeState.Description) == 1, Is.True); // there is only one "Change" entity
123+
}
124+
}
125+
}
126+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace NHibernate.Test.NHSpecificTest.NH3972
2+
{
3+
public class Incident : DataRecord
4+
{
5+
public Incident()
6+
{
7+
Type = DataRecordType.Incident;
8+
}
9+
10+
public virtual DataIncidentState State { get; set; }
11+
12+
public virtual string ReportedBy { get; set; }
13+
}
14+
}

0 commit comments

Comments
 (0)