Skip to content

Commit a2a808e

Browse files
committedAug 26, 2020
Modified Linq Enum unit tests to test alternate mappings
1 parent 2d3649e commit a2a808e

File tree

1 file changed

+168
-56
lines changed

1 file changed

+168
-56
lines changed
 

‎src/NHibernate.Test/Linq/EnumTests.cs

+168-56
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,209 @@
1-
using System.Linq;
2-
using NHibernate.DomainModel.Northwind.Entities;
1+
using System;
2+
using System.Linq;
3+
using NHibernate.Cfg.MappingSchema;
4+
using NHibernate.Mapping.ByCode;
5+
using NHibernate.SqlTypes;
6+
using NHibernate.Type;
37
using NUnit.Framework;
48

59
namespace NHibernate.Test.Linq
610
{
7-
[TestFixture]
8-
public class EnumTests : LinqTestCase
11+
[TestFixture(typeof(EnumType<TestEnum>))]
12+
[TestFixture(typeof(EnumStringType<TestEnum>))]
13+
[TestFixture(typeof(EnumAnsiStringType<TestEnum>))]
14+
public class EnumTests : TestCaseMappingByCode
915
{
10-
[Test]
11-
public void CanQueryOnEnumStoredAsInt32_High_1()
16+
private IType _enumType;
17+
18+
19+
public EnumTests(System.Type enumType)
1220
{
13-
CanQueryOnEnumStoredAsInt32(EnumStoredAsInt32.High, 1);
21+
_enumType = (IType) Activator.CreateInstance(enumType);
1422
}
1523

16-
[Test]
17-
public void CanQueryOnEnumStoredAsInt32_Unspecified_2()
24+
protected override HbmMapping GetMappings()
25+
{
26+
var mapper = new ModelMapper();
27+
mapper.Class<EnumEntity>(
28+
rc =>
29+
{
30+
rc.Table("EnumEntity");
31+
rc.Id(x => x.Id, m => m.Generator(Generators.Identity));
32+
rc.Property(x => x.Name);
33+
rc.Property(x => x.Enum, m => m.Type(_enumType));
34+
rc.Property(x => x.NullableEnum, m => m.Type(_enumType));
35+
rc.ManyToOne(x => x.Other, m => m.Cascade(Mapping.ByCode.Cascade.All));
36+
});
37+
38+
39+
return mapper.CompileMappingForAllExplicitlyAddedEntities();
40+
}
41+
42+
protected override void OnSetUp()
1843
{
19-
CanQueryOnEnumStoredAsInt32(EnumStoredAsInt32.Unspecified, 2);
44+
base.OnSetUp();
45+
using (var session = OpenSession())
46+
using (var trans = session.BeginTransaction())
47+
{
48+
session.Save(new EnumEntity { Enum = TestEnum.Unspecified });
49+
session.Save(new EnumEntity { Enum = TestEnum.Small });
50+
session.Save(new EnumEntity { Enum = TestEnum.Small });
51+
session.Save(new EnumEntity { Enum = TestEnum.Medium });
52+
session.Save(new EnumEntity { Enum = TestEnum.Medium });
53+
session.Save(new EnumEntity { Enum = TestEnum.Medium });
54+
session.Save(new EnumEntity { Enum = TestEnum.Large });
55+
session.Save(new EnumEntity { Enum = TestEnum.Large });
56+
session.Save(new EnumEntity { Enum = TestEnum.Large });
57+
session.Save(new EnumEntity { Enum = TestEnum.Large });
58+
trans.Commit();
59+
}
2060
}
2161

22-
public void CanQueryOnEnumStoredAsInt32(EnumStoredAsInt32 type, int expectedCount)
62+
protected override void OnTearDown()
2363
{
24-
var query = (from user in db.Users
25-
where user.Enum2 == type
26-
select user).ToList();
64+
using (var session = OpenSession())
65+
using (var transaction = session.BeginTransaction())
66+
{
67+
session.Delete("from System.Object");
2768

28-
Assert.AreEqual(expectedCount, query.Count);
69+
session.Flush();
70+
transaction.Commit();
71+
}
2972
}
3073

3174
[Test]
32-
public void CanQueryOnEnumStoredAsString_Meduim_2()
75+
public void CanQueryOnEnum_Large_4()
3376
{
34-
CanQueryOnEnumStoredAsString(EnumStoredAsString.Medium, 2);
77+
CanQueryOnEnum(TestEnum.Large, 4);
3578
}
3679

3780
[Test]
38-
public void CanQueryOnEnumStoredAsString_Small_1()
81+
public void CanQueryOnEnum_Medium_3()
3982
{
40-
CanQueryOnEnumStoredAsString(EnumStoredAsString.Small, 1);
83+
CanQueryOnEnum(TestEnum.Medium, 3);
4184
}
4285

43-
public void CanQueryOnEnumStoredAsString(EnumStoredAsString type, int expectedCount)
86+
[Test]
87+
public void CanQueryOnEnum_Small_2()
4488
{
45-
var query = (from user in db.Users
46-
where user.Enum1 == type
47-
select user).ToList();
89+
CanQueryOnEnum(TestEnum.Small, 2);
90+
}
4891

49-
Assert.AreEqual(expectedCount, query.Count);
92+
[Test]
93+
public void CanQueryOnEnum_Unspecified_1()
94+
{
95+
CanQueryOnEnum(TestEnum.Unspecified, 1);
96+
}
97+
98+
private void CanQueryOnEnum(TestEnum type, int expectedCount)
99+
{
100+
using (var session = OpenSession())
101+
using (var trans = session.BeginTransaction())
102+
{
103+
var query = session.Query<EnumEntity>().Where(x => x.Enum == type).ToList();
104+
105+
Assert.AreEqual(expectedCount, query.Count);
106+
}
50107
}
51108

52109
[Test]
53-
public void CanQueryWithContainsOnEnumStoredAsString_Small_1()
110+
public void CanQueryWithContainsOnTestEnum_Small_1()
54111
{
55-
var values = new[] { EnumStoredAsString.Small, EnumStoredAsString.Medium };
56-
var query = db.Users.Where(x => values.Contains(x.Enum1)).ToList();
57-
Assert.AreEqual(3, query.Count);
112+
var values = new[] { TestEnum.Small, TestEnum.Medium };
113+
using (var session = OpenSession())
114+
using (var trans = session.BeginTransaction())
115+
{
116+
var query = session.Query<EnumEntity>().Where(x => values.Contains(x.Enum)).ToList();
117+
118+
Assert.AreEqual(5, query.Count);
119+
}
58120
}
59121

60122
[Test]
61123
public void ConditionalNavigationProperty()
62124
{
63-
EnumStoredAsString? type = null;
64-
db.Users.Where(o => o.Enum1 == EnumStoredAsString.Large).ToList();
65-
db.Users.Where(o => EnumStoredAsString.Large != o.Enum1).ToList();
66-
db.Users.Where(o => (o.NullableEnum1 ?? EnumStoredAsString.Large) == EnumStoredAsString.Medium).ToList();
67-
db.Users.Where(o => ((o.NullableEnum1 ?? type) ?? o.Enum1) == EnumStoredAsString.Medium).ToList();
68-
69-
db.Users.Where(o => (o.NullableEnum1.HasValue ? o.Enum1 : EnumStoredAsString.Unspecified) == EnumStoredAsString.Medium).ToList();
70-
db.Users.Where(o => (o.Enum1 != EnumStoredAsString.Large
71-
? (o.NullableEnum1.HasValue ? o.Enum1 : EnumStoredAsString.Unspecified)
72-
: EnumStoredAsString.Small) == EnumStoredAsString.Medium).ToList();
73-
74-
db.Users.Where(o => (o.Enum1 == EnumStoredAsString.Large ? o.Role : o.Role).Name == "test").ToList();
125+
TestEnum? type = null;
126+
using (var session = OpenSession())
127+
using (var trans = session.BeginTransaction())
128+
{
129+
var entities = session.Query<EnumEntity>();
130+
entities.Where(o => o.Enum == TestEnum.Large).ToList();
131+
entities.Where(o => TestEnum.Large != o.Enum).ToList();
132+
entities.Where(o => (o.NullableEnum ?? TestEnum.Large) == TestEnum.Medium).ToList();
133+
entities.Where(o => ((o.NullableEnum ?? type) ?? o.Enum) == TestEnum.Medium).ToList();
134+
135+
entities.Where(o => (o.NullableEnum.HasValue ? o.Enum : TestEnum.Unspecified) == TestEnum.Medium).ToList();
136+
entities.Where(o => (o.Enum != TestEnum.Large
137+
? (o.NullableEnum.HasValue ? o.Enum : TestEnum.Unspecified)
138+
: TestEnum.Small) == TestEnum.Medium).ToList();
139+
140+
entities.Where(o => (o.Enum == TestEnum.Large ? o.Other : o.Other).Name == "test").ToList();
141+
}
75142
}
76143

77144
[Test]
78-
public void CanQueryComplexExpressionOnEnumStoredAsString()
145+
public void CanQueryComplexExpressionOnTestEnum()
146+
{
147+
var type = TestEnum.Unspecified;
148+
using (var session = OpenSession())
149+
using (var trans = session.BeginTransaction())
150+
{
151+
var entities = session.Query<EnumEntity>();
152+
153+
var query = (from user in entities
154+
where (user.NullableEnum == TestEnum.Large
155+
? TestEnum.Medium
156+
: user.NullableEnum ?? user.Enum
157+
) == type
158+
select new
159+
{
160+
user,
161+
simple = user.Enum,
162+
condition = user.Enum == TestEnum.Large ? TestEnum.Medium : user.Enum,
163+
coalesce = user.NullableEnum ?? TestEnum.Medium
164+
}).ToList();
165+
166+
Assert.That(query.Count, Is.EqualTo(1));
167+
}
168+
}
169+
170+
public class EnumEntity
171+
{
172+
public virtual int Id { get; set; }
173+
public virtual string Name { get; set; }
174+
175+
public virtual TestEnum Enum { get; set; }
176+
public virtual TestEnum? NullableEnum { get; set; }
177+
178+
public virtual EnumEntity Other { get; set; }
179+
}
180+
181+
public enum TestEnum
79182
{
80-
var type = EnumStoredAsString.Unspecified;
81-
var query = (from user in db.Users
82-
where (user.NullableEnum1 == EnumStoredAsString.Large
83-
? EnumStoredAsString.Medium
84-
: user.NullableEnum1 ?? user.Enum1
85-
) == type
86-
select new
87-
{
88-
user,
89-
simple = user.Enum1,
90-
condition = user.Enum1 == EnumStoredAsString.Large ? EnumStoredAsString.Medium : user.Enum1,
91-
coalesce = user.NullableEnum1 ?? EnumStoredAsString.Medium
92-
}).ToList();
93-
94-
Assert.That(query.Count, Is.EqualTo(0));
183+
Unspecified,
184+
Small,
185+
Medium,
186+
Large
187+
}
188+
189+
[Serializable]
190+
public class EnumAnsiStringType<T> : EnumStringType
191+
{
192+
private readonly string typeName;
193+
194+
public EnumAnsiStringType()
195+
: base(typeof(T))
196+
{
197+
System.Type type = GetType();
198+
typeName = type.FullName + ", " + type.Assembly.GetName().Name;
199+
}
200+
201+
public override string Name
202+
{
203+
get { return typeName; }
204+
}
205+
206+
public override SqlType SqlType => SqlTypeFactory.GetAnsiString(255);
95207
}
96208
}
97209
}

0 commit comments

Comments
 (0)