Skip to content

Commit be757e6

Browse files
AlexanderKotfredericDelaporte
authored andcommitted
NHV-132 Enum validation implementation & test (#8)
1 parent 2d7b80e commit be757e6

24 files changed

+921
-683
lines changed

src/NHibernate.Validator.Tests/Base/Address.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using NHibernate.Validator.Cfg.Loquacious;
23
using NHibernate.Validator.Constraints;
34

@@ -20,6 +21,8 @@ public class Address
2021
private string line2;
2122
private string state;
2223
private string zip;
24+
private AddressType addressType = AddressType.Mailing;
25+
private AddressFlag addressFlags = AddressFlag.Flag0;
2326

2427
[Min(1), Range(Max = 2000), Max(2500)]
2528
public long Id
@@ -69,8 +72,38 @@ public bool InternalValid
6972
get { return internalValid; }
7073
set { internalValid = value; }
7174
}
75+
76+
[Enum]
77+
public AddressType AddressType
78+
{
79+
get { return addressType; }
80+
set { addressType = value; }
81+
}
82+
83+
[Enum]
84+
public AddressFlag AddressFlags
85+
{
86+
get { return addressFlags; }
87+
set { addressFlags = value; }
88+
}
7289
}
7390

91+
public enum AddressType : byte
92+
{
93+
Home = 0,
94+
Mailing = 1
95+
}
96+
97+
[Flags]
98+
public enum AddressFlag : byte
99+
{
100+
Flag0 = 0,
101+
Flag1 = 1,
102+
Flag2 = 2,
103+
Flag4 = 4
104+
}
105+
106+
74107
public class AddressDef: ValidationDef<Address>
75108
{
76109
public AddressDef()
@@ -93,6 +126,8 @@ public AddressDef()
93126
.MatchWith("[0-9]+");
94127
Define(x => x.InternalValid)
95128
.IsTrue();
129+
Define(x => x.AddressType).Enum();
130+
Define(x => x.AddressFlags).Enum();
96131
}
97132
}
98133
}

src/NHibernate.Validator.Tests/Base/Address.nhv.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,13 @@
4040
<property name="InternalValid">
4141
<asserttrue />
4242
</property>
43+
44+
<property name="AddressType">
45+
<enum />
46+
</property>
47+
48+
<property name="AddressFlags">
49+
<enum />
50+
</property>
4351
</class>
4452
</nhv-mapping>

src/NHibernate.Validator.Tests/Integration/Address.hbm.xml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="utf-8" ?>
22
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
3-
namespace="NHibernate.Validator.Tests.Base"
4-
assembly="NHibernate.Validator.Tests"
5-
default-lazy="false">
3+
namespace="NHibernate.Validator.Tests.Base"
4+
assembly="NHibernate.Validator.Tests"
5+
default-lazy="false">
66

77
<class name="Address">
88

@@ -16,5 +16,7 @@
1616
<property name="Line1" />
1717
<property name="Line2" />
1818
<property name ="floor" access="field"/>
19+
<property name="AddressType" />
20+
<property name="AddressFlags" />
1921
</class>
2022
</hibernate-mapping>

src/NHibernate.Validator.Tests/Integration/HibernateAnnotationIntegrationFixture.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public void CleanupData()
7878
public virtual void EnsureSharedEngine()
7979
{
8080
Assert.IsTrue(ReferenceEquals(fortest, Cfg.Environment.SharedEngineProvider),
81-
"some process change the shared engine instance");
81+
"some process change the shared engine instance");
8282
// Have something initialized before and after lister initialization
8383
Assert.IsNotNull(fortest.GetEngine().GetValidator<AnyClass>());
8484
Assert.IsNotNull(fortest.GetEngine().GetValidator<Address>());
@@ -136,6 +136,22 @@ public void SingleTableAvoidNotNull()
136136
Assert.IsTrue(serialColumn.IsNullable, "Notnull should not be applied on single tables");
137137
}
138138

139+
[Test]
140+
public void ApplyOnEnumColumn()
141+
{
142+
PersistentClass classMapping = cfg.GetClassMapping(typeof(Address));
143+
IEnumerator ie = classMapping.GetProperty("AddressType").ColumnIterator.GetEnumerator();
144+
ie.MoveNext();
145+
Column serialColumn = (Column)ie.Current;
146+
Assert.AreEqual("AddressType in (0, 1)", serialColumn.CheckConstraint , "Validator annotation shout generate valid check for Enums");
147+
148+
ie = classMapping.GetProperty("AddressFlags").ColumnIterator.GetEnumerator();
149+
ie.MoveNext();
150+
serialColumn = (Column)ie.Current;
151+
152+
Assert.That(serialColumn.CheckConstraint, Is.Null.Or.Empty, "Validator annotation should not generate check for [Flag]ed Enums");
153+
}
154+
139155
/// <summary>
140156
/// Test pre-update/save events and custom interpolator
141157
/// </summary>
@@ -151,6 +167,8 @@ public void Events()
151167
a.Line1 = "Line 1";
152168
a.Zip = "nonnumeric";
153169
a.State = "NY";
170+
a.AddressType = (AddressType) 42;
171+
a.AddressFlags = AddressFlag.Flag1 | AddressFlag.Flag2 | (AddressFlag)66;
154172
s = OpenSession();
155173
tx = s.BeginTransaction();
156174
s.Save(a);
@@ -163,7 +181,7 @@ public void Events()
163181
{
164182
//success
165183
var invalidValues = e.GetInvalidValues();
166-
Assert.That(invalidValues, Has.Length.EqualTo(2));
184+
Assert.That(invalidValues, Has.Length.EqualTo(4));
167185
Assert.That(invalidValues, Has.All.Message.StartsWith("prefix_"), "Environment.MESSAGE_INTERPOLATOR_CLASS does not work");
168186
}
169187
finally
@@ -182,6 +200,8 @@ public void Events()
182200
a.State = "NY";
183201
s.Save(a);
184202
a.State = "TOOLONG";
203+
a.AddressType = AddressType.Mailing;
204+
a.AddressFlags = AddressFlag.Flag1 | AddressFlag.Flag2 | AddressFlag.Flag4;
185205
try
186206
{
187207
s.Flush();

src/NHibernate.Validator.Tests/Mappings/ReflectionClassMappingFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public void Members()
5151
{
5252
ReflectionClassMapping rm = new ReflectionClassMapping(typeof (Address));
5353
List<MemberInfo> mi = new List<MemberInfo>(rm.GetMembers());
54-
Assert.AreEqual(16, mi.Count);
54+
Assert.AreEqual(20, mi.Count);
5555

5656
rm = new ReflectionClassMapping(typeof(Polimorphism.DerivatedClass));
5757
mi = new List<MemberInfo>(rm.GetMembers());

src/NHibernate.Validator.Tests/Mappings/XmlClassMappingFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public void Members()
6262
{
6363
XmlClassMapping rm = new XmlClassMapping(GetNhvClassFor(typeof(Address)));
6464
List<MemberInfo> mi = new List<MemberInfo>(rm.GetMembers());
65-
Assert.AreEqual(8, mi.Count);
65+
Assert.AreEqual(10, mi.Count);
6666
}
6767

6868
[Test]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace NHibernate.Validator.Cfg.Loquacious
2+
{
3+
public interface IEnumConstraints
4+
{
5+
IChainableConstraint<IEnumConstraints> NotNullable();
6+
7+
IChainableConstraint<IEnumConstraints> Enum();
8+
}
9+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Reflection;
2+
using NHibernate.Validator.Constraints;
3+
4+
namespace NHibernate.Validator.Cfg.Loquacious.Impl
5+
{
6+
class EnumConstraints : BaseConstraints<IEnumConstraints>, IEnumConstraints
7+
{
8+
public EnumConstraints(IConstraintAggregator parent, MemberInfo member) : base(parent, member) {}
9+
10+
#region Implementation of IEnumConstraints
11+
12+
public IChainableConstraint<IEnumConstraints> NotNullable()
13+
{
14+
return AddWithConstraintsChain(new NotNullAttribute());
15+
}
16+
17+
public IChainableConstraint<IEnumConstraints> Enum()
18+
{
19+
return AddWithConstraintsChain(new EnumAttribute());
20+
}
21+
22+
#endregion
23+
}
24+
}

src/NHibernate.Validator/Cfg/Loquacious/ValidationDef.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,11 @@ public IRelationshipConstraints Define(Expression<Func<T, object>> property)
171171
return new RelationshipConstraints(this, DecodeMemberAccessExpression(property));
172172
}
173173

174+
public IEnumConstraints Define(Expression<Func<T, Enum>> property)
175+
{
176+
return new EnumConstraints(this, DecodeMemberAccessExpression(property));
177+
}
178+
174179
public void Add(MemberInfo member, Attribute ruleArgs)
175180
{
176181
classMap.AddMemberConstraint(member, ruleArgs);

src/NHibernate.Validator/Cfg/MappingSchema/RuleAttributeFactory.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
using System;
22
using System.Reflection;
33
using System.Text.RegularExpressions;
4+
using System.Collections.Generic;
45

56
using NHibernate.Util;
6-
using System.Collections.Generic;
77
using NHibernate.Validator.Constraints;
88
using NHibernate.Validator.Engine;
99
using NHibernate.Validator.Exceptions;
@@ -43,6 +43,7 @@ static RuleAttributeFactory()
4343
wellKnownRules[typeof(NhvmFileexists)] = ConvertToFileExists;
4444
wellKnownRules[typeof(NhvmValid)] = ConvertToValid;
4545
wellKnownRules[typeof(NhvmIban)] = ConvertToIBAN;
46+
wellKnownRules[typeof(NhvmEnum)] = ConvertToEnum;
4647
}
4748

4849
private static Attribute ConvertToDecimalMin(XmlNhvmRuleConverterArgs rule)
@@ -437,7 +438,6 @@ private static Attribute ConvertToFuture(XmlNhvmRuleConverterArgs rule)
437438
return thisAttribute;
438439
}
439440

440-
441441
private static Attribute ConvertToSize(XmlNhvmRuleConverterArgs rule)
442442
{
443443
NhvmSize sizeRule = (NhvmSize)rule.schemaRule;
@@ -561,7 +561,6 @@ private static Attribute ConvertToNotNull(XmlNhvmRuleConverterArgs rule)
561561
return thisAttribute;
562562
}
563563

564-
565564
private static Attribute ConvertToFileExists(XmlNhvmRuleConverterArgs rule)
566565
{
567566
NhvmFileexists fileExistsRule = (NhvmFileexists)rule.schemaRule;
@@ -591,6 +590,21 @@ private static Attribute ConvertToIBAN(XmlNhvmRuleConverterArgs rule)
591590
return thisAttribute;
592591
}
593592

593+
private static Attribute ConvertToEnum(XmlNhvmRuleConverterArgs rule)
594+
{
595+
NhvmEnum notNullRule = (NhvmEnum)rule.schemaRule;
596+
EnumAttribute thisAttribute = new EnumAttribute();
597+
log.Info("Converting to EnumAttribute");
598+
599+
if (notNullRule.message != null)
600+
{
601+
thisAttribute.Message = notNullRule.message;
602+
}
603+
AssignTagsFromString(thisAttribute, notNullRule.tags);
604+
605+
return thisAttribute;
606+
}
607+
594608
private delegate Attribute ConvertSchemaRule(XmlNhvmRuleConverterArgs schemaRule);
595609
private class XmlNhvmRuleConverterArgs
596610
{

0 commit comments

Comments
 (0)