From 004ade711950a207dd320aec23f60aa09d530243 Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Sat, 17 Jan 2026 09:39:14 -0500
Subject: [PATCH 01/19] Updated the Version
---
JMayer.Data/JMayer.Data.csproj | 2 +-
TestProject/TestProject.csproj | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/JMayer.Data/JMayer.Data.csproj b/JMayer.Data/JMayer.Data.csproj
index 3563567..22ff1b0 100644
--- a/JMayer.Data/JMayer.Data.csproj
+++ b/JMayer.Data/JMayer.Data.csproj
@@ -4,7 +4,7 @@
net9.0
enable
enable
- 9.0.0
+ 9.1.0
jmayer913
jmayer913
Package contains generic data access via HTTP or a Database.
diff --git a/TestProject/TestProject.csproj b/TestProject/TestProject.csproj
index 26d7960..39b217b 100644
--- a/TestProject/TestProject.csproj
+++ b/TestProject/TestProject.csproj
@@ -7,7 +7,7 @@
false
true
- 9.0.0
+ 9.1.0
From 574400a37e5b49362a1242ca54fcc2fa80d7e750 Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Sat, 17 Jan 2026 09:39:54 -0500
Subject: [PATCH 02/19] Create RequiredDependsOnAttribute.cs
---
.../RequiredDependsOnAttribute.cs | 153 ++++++++++++++++++
1 file changed, 153 insertions(+)
create mode 100644 JMayer.Data/DataAnnotations/RequiredDependsOnAttribute.cs
diff --git a/JMayer.Data/DataAnnotations/RequiredDependsOnAttribute.cs b/JMayer.Data/DataAnnotations/RequiredDependsOnAttribute.cs
new file mode 100644
index 0000000..8b5e243
--- /dev/null
+++ b/JMayer.Data/DataAnnotations/RequiredDependsOnAttribute.cs
@@ -0,0 +1,153 @@
+using System.ComponentModel.DataAnnotations;
+using System.Reflection;
+
+namespace JMayer.Data.DataAnnotations;
+
+///
+/// The class does the required data annotation check if it matches a specific condition on another field or property in the same instance being validated.
+/// The condition can be a boolean or an enum value.
+///
+///
+/// To use, add the attribute to the public field or property which is required on a condition. Set the dependentMemberName to the name of the public field or property
+/// which has the condition that needs to be evaluated. Set the conditionValue to true, false or an enum value based on what condition needs to occur for the required
+/// data annotation to be evaluated.
+///
+/// [RequiredDependsOn(dependentMemberName: nameof(DependentBoolMember), conditionValue: true)]
+/// public string ConditionalRequiredProperty { get; set; }
+///
+/// public bool DependentBoolMember { get; set; }
+///
+/// or
+///
+/// [RequiredDependsOn(dependentMemberName: nameof(DependentEnumMember), conditionValue: YourEnum.RequiredValue)]
+/// public string ConditionalRequiredProperty { get; set; }
+///
+/// public YourEnum DependentEnumMember { get; set; }
+///
+///
+[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
+public sealed class RequiredDependsOnAttribute : RequiredAttribute
+{
+ ///
+ /// The value to run the Required data annotation.
+ ///
+ private readonly object _conditionValue;
+
+ ///
+ /// The name of the member the Required data annotation is dependent on.
+ ///
+ private readonly string _dependentMemberName;
+
+ ///
+ /// The constant for the same member error message.
+ ///
+ internal const string SameMemberErrorMessage = "Failed to validate because the dependent member name is the same as the attribute's member name.";
+
+ ///
+ /// The constant for the member not found error message.
+ ///
+ internal const string MemberNotFoundErrorMessage = "Failled to validate because the dependent member name was not found.";
+
+ ///
+ /// The constant for the type mismatch error message.
+ ///
+ internal const string TypeMismatchErrorMessage = "Failed to validate because the dependent member value type does not match the required value type.";
+
+ ///
+ /// The constructor which takes the dependency and condition.
+ ///
+ /// The name of the member the Required data annotation is dependent on.
+ /// The value to run the Required data annotation.
+ /// Thrown when the dependentMemberName parameter is null or an empty string.
+ /// Thrown when the conditionValue parameter is null.
+ public RequiredDependsOnAttribute(string dependentMemberName, object conditionValue)
+ {
+ ArgumentNullException.ThrowIfNull(conditionValue);
+ ArgumentException.ThrowIfNullOrEmpty(dependentMemberName);
+
+ _conditionValue = conditionValue;
+ _dependentMemberName = dependentMemberName;
+ }
+
+ ///
+ /// The method returns the value stored by the dependent member.
+ ///
+ /// Meta data about the depedent member.
+ /// The instance of the object being validated.
+ /// The value or null if not found.
+ private static object? GetDependentMemberValue(MemberInfo dependentMemberInfo, object objectInstance)
+ {
+ if (dependentMemberInfo is FieldInfo fieldInfo)
+ {
+ return fieldInfo.GetValue(objectInstance);
+ }
+ else if (dependentMemberInfo is PropertyInfo propertyInfo)
+ {
+ return propertyInfo.GetValue(objectInstance);
+ }
+
+ return null;
+ }
+
+ ///
+ /// The method returns if the dependent member matches the required condition.
+ ///
+ /// The bool value of the dependent member.
+ /// The bool value we are expecting for the dependent member.
+ /// True means the Required data annotation check occurs.
+ private static bool IsRequiredCondition(bool dependentMemberValue, bool conditionValue) => dependentMemberValue == conditionValue;
+
+ ///
+ /// The method returns if the dependent member matches the required condition.
+ ///
+ /// The bool value of the dependent member.
+ /// The bool value we are expecting for the dependent member.
+ /// True means the Required data annotation check occurs.
+ private static bool IsRequiredCondition(Enum dependentMemberValue, Enum conditionValue) => dependentMemberValue.Equals(conditionValue);
+
+ ///
+ /// Overridden to run the required data annotation if it matches the dependent condition. Success will be return when it doesn't match the dependent condition.
+ protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
+ {
+ if (_dependentMemberName == validationContext.MemberName)
+ {
+ return new ValidationResult(SameMemberErrorMessage);
+ }
+
+ MemberInfo? dependentMemberInfo = validationContext.ObjectType.FindMembers(MemberTypes.Field | MemberTypes.Property, BindingFlags.Public | BindingFlags.Instance, Type.FilterName, _dependentMemberName).FirstOrDefault();
+
+ if (dependentMemberInfo is null)
+ {
+ return new ValidationResult(MemberNotFoundErrorMessage);
+ }
+
+ object? dependentMemberValue = GetDependentMemberValue(dependentMemberInfo, validationContext.ObjectInstance);
+
+ if (dependentMemberValue is null)
+ {
+ return ValidationResult.Success;
+ }
+
+ if (dependentMemberValue.GetType() != _conditionValue.GetType())
+ {
+ return new ValidationResult(TypeMismatchErrorMessage);
+ }
+
+ if (dependentMemberValue is bool dependentMemberBoolValue && _conditionValue is bool conditionBoolValue)
+ {
+ if (IsRequiredCondition(dependentMemberBoolValue, conditionBoolValue))
+ {
+ return base.IsValid(value, validationContext);
+ }
+ }
+ else if (dependentMemberValue is Enum dependentMemberEnumValue && _conditionValue is Enum conditionEnumValue)
+ {
+ if (IsRequiredCondition(dependentMemberEnumValue, conditionEnumValue))
+ {
+ return base.IsValid(value, validationContext);
+ }
+ }
+
+ return ValidationResult.Success;
+ }
+}
From 99a1ae5e94a2c0b7c06767cb918d1e4f0f07a15b Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Sat, 17 Jan 2026 09:57:00 -0500
Subject: [PATCH 03/19] Added unit test for RequiredDependsOn
---
.../Data/DataAnnotations/ConditionalEnum.cs | 10 +
.../DataAnnotations/RequiredDependsOnEnum.cs | 21 ++
.../DataAnnotations/RequiredDependsOnFalse.cs | 21 ++
.../RequiredDependsOnMemberNotFound.cs | 21 ++
.../RequiredDependsOnSameMemeber.cs | 21 ++
.../DataAnnotations/RequiredDependsOnTrue.cs | 21 ++
.../RequiredDependsOnTypeMismatch.cs | 21 ++
.../RequiredDependsOnUnitTest.cs | 212 ++++++++++++++++++
8 files changed, 348 insertions(+)
create mode 100644 TestProject/Data/DataAnnotations/ConditionalEnum.cs
create mode 100644 TestProject/Data/DataAnnotations/RequiredDependsOnEnum.cs
create mode 100644 TestProject/Data/DataAnnotations/RequiredDependsOnFalse.cs
create mode 100644 TestProject/Data/DataAnnotations/RequiredDependsOnMemberNotFound.cs
create mode 100644 TestProject/Data/DataAnnotations/RequiredDependsOnSameMemeber.cs
create mode 100644 TestProject/Data/DataAnnotations/RequiredDependsOnTrue.cs
create mode 100644 TestProject/Data/DataAnnotations/RequiredDependsOnTypeMismatch.cs
create mode 100644 TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
diff --git a/TestProject/Data/DataAnnotations/ConditionalEnum.cs b/TestProject/Data/DataAnnotations/ConditionalEnum.cs
new file mode 100644
index 0000000..8e0b07f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/ConditionalEnum.cs
@@ -0,0 +1,10 @@
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// An enumeration used by the RequiredDependsOn tests.
+///
+internal enum ConditionalEnum
+{
+ Condition1,
+ Condition2,
+}
diff --git a/TestProject/Data/DataAnnotations/RequiredDependsOnEnum.cs b/TestProject/Data/DataAnnotations/RequiredDependsOnEnum.cs
new file mode 100644
index 0000000..62eec00
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/RequiredDependsOnEnum.cs
@@ -0,0 +1,21 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the RequiredDependsOn attribute when the condition is for a enum value.
+///
+internal class RequiredDependsOnEnum : DataObject
+{
+ ///
+ /// The property gets/sets the string value evaluated by the RequiredDependsOn attribute.
+ ///
+ [RequiredDependsOn(dependentMemberName: nameof(DependentOnMember), conditionValue: ConditionalEnum.Condition2)]
+ public string ConditionalRequireValue { get; set; } = string.Empty;
+
+ ///
+ /// The property gets/sets the enum value the ConditionalRequire property is dependent on.
+ ///
+ public ConditionalEnum DependentOnMember { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/RequiredDependsOnFalse.cs b/TestProject/Data/DataAnnotations/RequiredDependsOnFalse.cs
new file mode 100644
index 0000000..052df62
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/RequiredDependsOnFalse.cs
@@ -0,0 +1,21 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the RequiredDependsOn attribute when the condition is false.
+///
+internal class RequiredDependsOnFalse : DataObject
+{
+ ///
+ /// The property gets/sets the string value evaluated by the RequiredDependsOn attribute.
+ ///
+ [RequiredDependsOn(dependentMemberName: nameof(DependentOnMember), conditionValue: false)]
+ public string ConditionalRequireValue { get; set; } = string.Empty;
+
+ ///
+ /// The property gets/sets the boolean value the ConditionalRequire property is dependent on.
+ ///
+ public bool DependentOnMember { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/RequiredDependsOnMemberNotFound.cs b/TestProject/Data/DataAnnotations/RequiredDependsOnMemberNotFound.cs
new file mode 100644
index 0000000..b9a3588
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/RequiredDependsOnMemberNotFound.cs
@@ -0,0 +1,21 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the RequiredDependsOn attribute when the member is not found.
+///
+internal class RequiredDependsOnMemberNotFound : DataObject
+{
+ ///
+ /// The property gets/sets the string value evaluated by the RequiredDependsOn attribute.
+ ///
+ [RequiredDependsOn(dependentMemberName: "NotFoundMember", conditionValue: true)]
+ public string ConditionalRequireValue { get; set; } = string.Empty;
+
+ ///
+ /// The property gets/sets the boolean value the ConditionalRequire property is dependent on.
+ ///
+ public bool DependentOnMember { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/RequiredDependsOnSameMemeber.cs b/TestProject/Data/DataAnnotations/RequiredDependsOnSameMemeber.cs
new file mode 100644
index 0000000..bc8bcfe
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/RequiredDependsOnSameMemeber.cs
@@ -0,0 +1,21 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the RequiredDependsOn attribute when the same member is used.
+///
+internal class RequiredDependsOnSameMemeber : DataObject
+{
+ ///
+ /// The property gets/sets the string value evaluated by the RequiredDependsOn attribute.
+ ///
+ [RequiredDependsOn(dependentMemberName: nameof(ConditionalRequireValue), conditionValue: true)]
+ public string ConditionalRequireValue { get; set; } = string.Empty;
+
+ ///
+ /// The property gets/sets the boolean value the ConditionalRequire property is dependent on.
+ ///
+ public bool DependentOnMember { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/RequiredDependsOnTrue.cs b/TestProject/Data/DataAnnotations/RequiredDependsOnTrue.cs
new file mode 100644
index 0000000..624dac4
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/RequiredDependsOnTrue.cs
@@ -0,0 +1,21 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the RequiredDependsOn attribute when the condition is true.
+///
+internal class RequiredDependsOnTrue : DataObject
+{
+ ///
+ /// The property gets/sets the string value evaluated by the RequiredDependsOn attribute.
+ ///
+ [RequiredDependsOn(dependentMemberName: nameof(DependentOnMember), conditionValue: true)]
+ public string ConditionalRequireValue { get; set; } = string.Empty;
+
+ ///
+ /// The property gets/sets the boolean value the ConditionalRequire property is dependent on.
+ ///
+ public bool DependentOnMember { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/RequiredDependsOnTypeMismatch.cs b/TestProject/Data/DataAnnotations/RequiredDependsOnTypeMismatch.cs
new file mode 100644
index 0000000..c244186
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/RequiredDependsOnTypeMismatch.cs
@@ -0,0 +1,21 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the RequiredDependsOn attribute when there is a type mismatch between the conditionValue and dependent on member.
+///
+internal class RequiredDependsOnTypeMismatch : DataObject
+{
+ ///
+ /// The property gets/sets the string value evaluated by the RequiredDependsOn attribute.
+ ///
+ [RequiredDependsOn(dependentMemberName: nameof(DependentOnMember), conditionValue: ConditionalEnum.Condition1)]
+ public string ConditionalRequireValue { get; set; } = string.Empty;
+
+ ///
+ /// The property gets/sets the boolean value the ConditionalRequire property is dependent on.
+ ///
+ public bool DependentOnMember { get; set; }
+}
diff --git a/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs b/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
new file mode 100644
index 0000000..8e14a1d
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
@@ -0,0 +1,212 @@
+using JMayer.Data.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations;
+
+namespace TestProject.Test.DataAnnotations;
+
+#warning I'm only testing properties. I should also test fields.
+#warning I need to decide if the errors on evaluation should return the member name or not.
+
+///
+/// The class manages tests for the RequiredDependsOnAttribute object.
+///
+public class RequiredDependsOnUnitTest
+{
+ ///
+ /// The method verifies an argument null exception is thrown when null is passed into the constructor for the conditionValue parameter.
+ ///
+ [Fact]
+ public void VerifyConstructorThrowsArgumentNullExceptionForConditionValueParameter() => Assert.Throws(() => new RequiredDependsOnAttribute("A Member", null));
+
+ ///
+ /// The method verifies an argument exception is thrown when an empty string is passed into the constructor for the dependentMemberName parameter.
+ ///
+ [Fact]
+ public void VerifyConstructorThrowsArgumentExceptionForDependentMemberNameParameter() => Assert.Throws(() => new RequiredDependsOnAttribute(string.Empty, true));
+
+ ///
+ /// The method verifies an argument null exception is thrown when null is passed into the constructor for the dependentMemberName parameter.
+ ///
+ [Fact]
+ public void VerifyConstructorThrowsArgumentNullExceptionForDependentMemberNameParameter() => Assert.Throws(() => new RequiredDependsOnAttribute(null, true));
+
+ ///
+ /// The method verifies a failure when the depends on member is not found.
+ ///
+ [Fact]
+ public void VerifyFailureMemberNameNotFound()
+ {
+ RequiredDependsOnMemberNotFound dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(RequiredDependsOnAttribute.MemberNotFoundErrorMessage, validationResults[0].ErrorMessage);
+ //Assert.Single(validationResults[0].MemberNames);
+ //Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ }
+
+ ///
+ /// The method verifies a failure when the depends on member is the same member of the evaluating member.
+ ///
+ [Fact]
+ public void VerifyFailureSameMember()
+ {
+ RequiredDependsOnSameMemeber dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(RequiredDependsOnAttribute.SameMemberErrorMessage, validationResults[0].ErrorMessage);
+ //Assert.Single(validationResults[0].MemberNames);
+ //Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ }
+
+ ///
+ /// The method verifies a failure when the depends on member has a different type than the condition value.
+ ///
+ [Fact]
+ public void VerifyFailureTypeMismatch()
+ {
+ RequiredDependsOnTypeMismatch dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(RequiredDependsOnAttribute.TypeMismatchErrorMessage, validationResults[0].ErrorMessage);
+ //Assert.Single(validationResults[0].MemberNames);
+ //Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ }
+
+ ///
+ /// The method verifies the Required data annotation is evaluated when depends on condition is set to the required enum value.
+ ///
+ [Theory]
+ [InlineData("")]
+ [InlineData("Text")]
+ public void VerifyRequiredDependsOnEnumConditionEvaluated(string conditionalRequireValue)
+ {
+ RequiredDependsOnEnum dataObject = new()
+ {
+ ConditionalRequireValue = conditionalRequireValue,
+ DependentOnMember = ConditionalEnum.Condition2,
+ };
+ List validationResults = dataObject.Validate();
+
+ if (conditionalRequireValue.Length > 0)
+ {
+ Assert.Empty(validationResults);
+ }
+ else
+ {
+ Assert.Single(validationResults);
+ Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Single(validationResults[0].MemberNames);
+ Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ }
+ }
+
+ ///
+ /// The method verifies the Required data annotation is ignored.
+ ///
+ [Theory]
+ [InlineData("")]
+ [InlineData("Text")]
+ public void VerifyRequiredDependsOnEnumConditionIgnored(string conditionalRequireValue)
+ {
+ RequiredDependsOnEnum dataObject = new()
+ {
+ ConditionalRequireValue = conditionalRequireValue,
+ DependentOnMember = ConditionalEnum.Condition1,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the Required data annotation is evaluated when depends on condition is true.
+ ///
+ [Theory]
+ [InlineData("")]
+ [InlineData("Text")]
+ public void VerifyRequiredDependsOnFalseConditionEvaluated(string conditionalRequireValue)
+ {
+ RequiredDependsOnFalse dataObject = new()
+ {
+ ConditionalRequireValue = conditionalRequireValue,
+ DependentOnMember = false,
+ };
+ List validationResults = dataObject.Validate();
+
+ if (conditionalRequireValue.Length > 0)
+ {
+ Assert.Empty(validationResults);
+ }
+ else
+ {
+ Assert.Single(validationResults);
+ Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Single(validationResults[0].MemberNames);
+ Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ }
+ }
+
+ ///
+ /// The method verifies the Required data annotation is ignored.
+ ///
+ [Theory]
+ [InlineData("")]
+ [InlineData("Text")]
+ public void VerifyRequiredDependsOnFalseConditionIgnored(string conditionalRequireValue)
+ {
+ RequiredDependsOnFalse dataObject = new()
+ {
+ ConditionalRequireValue = conditionalRequireValue,
+ DependentOnMember = true,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the Required data annotation is evaluated when depends on condition is true.
+ ///
+ [Theory]
+ [InlineData("")]
+ [InlineData("Text")]
+ public void VerifyRequiredDependsOnTrueConditionEvaluated(string conditionalRequireValue)
+ {
+ RequiredDependsOnTrue dataObject = new()
+ {
+ ConditionalRequireValue = conditionalRequireValue,
+ DependentOnMember = true,
+ };
+ List validationResults = dataObject.Validate();
+
+ if (conditionalRequireValue.Length > 0)
+ {
+ Assert.Empty(validationResults);
+ }
+ else
+ {
+ Assert.Single(validationResults);
+ Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Single(validationResults[0].MemberNames);
+ Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ }
+ }
+
+ ///
+ /// The method verifies the Required data annotation is ignored.
+ ///
+ [Theory]
+ [InlineData("")]
+ [InlineData("Text")]
+ public void VerifyRequiredDependsOnTrueConditionIgnored(string conditionalRequireValue)
+ {
+ RequiredDependsOnTrue dataObject = new()
+ {
+ ConditionalRequireValue = conditionalRequireValue,
+ DependentOnMember = false,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
From c98f2f625943e276d81a1c12fe96c53bf86c74cf Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Sat, 14 Feb 2026 11:16:08 -0500
Subject: [PATCH 04/19] Added CompareToOtherMember attribute
---
.../CompareToOtherMemberAttribute.cs | 409 ++++++++++++++++++
.../DataAnnotations/ComparisonOperation.cs | 43 ++
.../DataAnnotationMemberHelper.cs | 49 +++
.../RequiredDependsOnAttribute.cs | 71 +--
.../RequiredDependsOnInvalidType.cs | 21 +
.../RequiredDependsOnUnitTest.cs | 25 +-
6 files changed, 562 insertions(+), 56 deletions(-)
create mode 100644 JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
create mode 100644 JMayer.Data/DataAnnotations/ComparisonOperation.cs
create mode 100644 JMayer.Data/DataAnnotations/DataAnnotationMemberHelper.cs
create mode 100644 TestProject/Data/DataAnnotations/RequiredDependsOnInvalidType.cs
diff --git a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
new file mode 100644
index 0000000..cdd1924
--- /dev/null
+++ b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
@@ -0,0 +1,409 @@
+using System.ComponentModel.DataAnnotations;
+using System.Reflection;
+
+namespace JMayer.Data.DataAnnotations;
+
+///
+/// The class does a value comparison with the member the attribute is registered too and another member on the
+/// same instance being validated. The following types are supported: bool, byte, sbyte, short, ushort, int, uint, long,
+/// ulong, float, double, decimal, char, string, DateTime, DateOffset, Timespan and Enum. The following comparison
+/// operations are suppored: ==, !=, <, <=, >, and >=; bool, char, string and Enum only support == and !=.
+///
+///
+/// To use, add the attribute to the public field or property that needs to be compared with another public field or
+/// property in the same class. Set the otherMemberName to the name of the other public field or property which needs to be
+/// compared against. Set the comparisonOperation to operation that needs to be preformed when the comparison is done.
+/// Set the allowNullCheck if you want both values being null to pass an Equal comparison or if you want one being null
+/// to pass a NotEqual comparison.
+///
+/// public class ObjectRequiringValidation
+/// {
+/// //IntMember will need to be less than OtherIntMember in order to pass validation.
+/// [CompareToOtherMember(otherMemberName: nameof(OtherIntMember), comparisonOperation: ComparisonOperation.LessThan)]
+/// public int IntMember { get; set; }
+///
+/// public int OtherIntMember { get; set; }
+/// }
+///
+///
+[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
+public sealed class CompareToOtherMemberAttribute : ValidationAttribute
+{
+ ///
+ /// Allows the CompareToOtherMember data annotation to return success when the comparison is equal and both members
+ /// have a null value or the comparison is not equal and one of the members has a null value.
+ ///
+ private readonly bool _allowNullCheck;
+
+ ///
+ /// The operation used when the CompareToOtherMember data annotation does the comparison.
+ ///
+ private readonly ComparisonOperation _comparisonOperation;
+
+ ///
+ /// The name of the other member the CompareToOtherMember data annotation will compare against.
+ ///
+ private readonly string _otherMemberName;
+
+ ///
+ /// The constant for the invalid comparison for boolean values error message.
+ ///
+ internal const string InvalidComparisonForBoolErrorMessage = "Failed to validate because an equal and not equal comparison is only allowed for boolean values.";
+
+ ///
+ /// The constant for the invalid comparison for char values error message.
+ ///
+ internal const string InvalidComparisonForCharErrorMessage = "Failed to validate because an equal and not equal comparison is only allowed for character values.";
+
+ ///
+ /// The constant for the invalid comparison for Enum values error message.
+ ///
+ internal const string InvalidComparisonForEnumErrorMessage = "Failed to validate because an equal and not equal comparison is only allowed for Enum values.";
+
+ ///
+ /// The constant for the invalid comparison for string values error message.
+ ///
+ internal const string InvalidComparisonForStringErrorMessage = "Failed to validate because an equal and not equal comparison is only allowed for string values.";
+
+ ///
+ /// The constructor which takes the comparison info.
+ ///
+ /// The name of the other member the CompareToOtherMember data annotation will compare against.
+ /// The operation used when the CompareToOtherMember data annotation does the comparison.
+ ///
+ /// Allows the CompareToOtherMember data annotation to return success when the comparison is equal and both members
+ /// have a null value or the comparison is not equal and one of the members has a null value.
+ ///
+ /// Thrown when the otherMemberName parameter is null or an empty string.
+ public CompareToOtherMemberAttribute(string otherMemberName, ComparisonOperation compareToOperation, bool allowNullCheck)
+ {
+ ArgumentException.ThrowIfNullOrEmpty(otherMemberName);
+
+ _allowNullCheck = allowNullCheck;
+ _comparisonOperation = compareToOperation;
+ _otherMemberName = otherMemberName;
+ }
+
+ ///
+ /// The method returns if the character values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckCharacterComparison(char registeredMemberValue, char otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method returns if the bool values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckBoolValues(bool registeredMemberValue, bool otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method returns if the date values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckDateValues(DateTime registeredMemberValue, DateTime otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method returns if the date values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckDateValues(DateTimeOffset registeredMemberValue, DateTimeOffset otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method returns if the decimal values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckDecimalValues(decimal registeredMemberValue, decimal otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method returns if the enum values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckEnumValues(Enum registeredMemberValue, Enum otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue.Equals(otherMemberValue),
+ ComparisonOperation.NotEqual => registeredMemberValue.Equals(otherMemberValue) is false,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method returns if the integer values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckIntegerValues(long registeredMemberValue, long otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method does a comparison for null values; equal needs both to be null and not equal needs
+ /// one to be null.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckNullVaues(object? registeredMemberValue, object? otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue is null && otherMemberValue is null,
+ ComparisonOperation.NotEqual => (registeredMemberValue is null && otherMemberValue is not null) || (registeredMemberValue is not null && otherMemberValue is null),
+ _ => false,
+ };
+ }
+
+ ///
+ /// The method returns if the string values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckStringValues(string registeredMemberValue, string otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method returns if the time values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckTimeValues(TimeSpan registeredMemberValue, TimeSpan otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// The method returns if the unsigned integer values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckUnsignedIntegerValues(ulong registeredMemberValue, ulong otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
+ ///
+ /// Overridden to compare the member the attribute is registered too and an another member on the instance.
+ protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
+ {
+ if (_otherMemberName == validationContext.MemberName)
+ {
+ return new ValidationResult(DataAnnotationMemberHelper.SameMemberErrorMessage);
+ }
+
+ MemberInfo? otherMemberInfo = validationContext.ObjectType.FindMembers(MemberTypes.Field | MemberTypes.Property, BindingFlags.Public | BindingFlags.Instance, Type.FilterName, _otherMemberName).FirstOrDefault();
+
+ if (otherMemberInfo is null)
+ {
+ return new ValidationResult(DataAnnotationMemberHelper.MemberNotFoundErrorMessage);
+ }
+
+ object? otherMemberValue = DataAnnotationMemberHelper.GetMemberValue(otherMemberInfo, validationContext.ObjectInstance);
+
+ bool success = false;
+
+ if (_allowNullCheck)
+ {
+ success = CheckNullVaues(value, otherMemberValue);
+ }
+
+ if (value is bool registeredMemberBoolValue && otherMemberValue is bool otherMemberBoolValue)
+ {
+ //Only equal and not equal are supported for this type.
+ if (_comparisonOperation is not ComparisonOperation.Equal and ComparisonOperation.NotEqual)
+ {
+ return new ValidationResult(InvalidComparisonForBoolErrorMessage);
+ }
+
+ success = CheckBoolValues(registeredMemberBoolValue, otherMemberBoolValue);
+ }
+ else if (value is sbyte or short or int or long && otherMemberValue is sbyte or short or int or long)
+ {
+ success = CheckIntegerValues((long)value, (long)otherMemberValue);
+ }
+ else if (value is byte or ushort or uint or ulong && otherMemberValue is byte or ushort or uint or ulong)
+ {
+ success = CheckUnsignedIntegerValues((ulong)value, (ulong)otherMemberValue);
+ }
+ else if (value is float or double or decimal && otherMemberValue is float or double or decimal)
+ {
+ success = CheckDecimalValues((decimal)value, (decimal)otherMemberValue);
+ }
+ else if (value is char registeredMemberdCharacterValue && otherMemberValue is char otherMemberdCharacterValue)
+ {
+ //Only equal and not equal are supported for this type.
+ if (_comparisonOperation is not ComparisonOperation.Equal and ComparisonOperation.NotEqual)
+ {
+ return new ValidationResult(InvalidComparisonForCharErrorMessage);
+ }
+
+ success = CheckCharacterComparison(registeredMemberdCharacterValue, otherMemberdCharacterValue);
+ }
+ else if (value is string registeredMemberdStringValue && otherMemberValue is string otherMemberdStringValue)
+ {
+ //Only equal and not equal are supported for this type.
+ if (_comparisonOperation is not ComparisonOperation.Equal and ComparisonOperation.NotEqual)
+ {
+ return new ValidationResult(InvalidComparisonForStringErrorMessage);
+ }
+
+ success = CheckStringValues(registeredMemberdStringValue, otherMemberdStringValue);
+ }
+ else if (value is DateTime registeredMemberDateValue && otherMemberValue is DateTime otherMemberDateValue)
+ {
+ success = CheckDateValues(registeredMemberDateValue, otherMemberDateValue);
+ }
+ else if (value is DateTimeOffset registeredMemberDateOffsetValue && otherMemberValue is DateTimeOffset otherMemberDateOffsetValue)
+ {
+ success = CheckDateValues(registeredMemberDateOffsetValue, otherMemberDateOffsetValue);
+ }
+ else if (value is TimeSpan registeredMemberTimeValue && otherMemberValue is TimeSpan otherMemberTimeValue)
+ {
+ success = CheckTimeValues(registeredMemberTimeValue, otherMemberTimeValue);
+ }
+ else if (value is Enum registeredMemberEnumValue && otherMemberValue is Enum otherMemberEnumValue)
+ {
+ //Only equal and not equal are supported for this type.
+ if (_comparisonOperation is not ComparisonOperation.Equal and ComparisonOperation.NotEqual)
+ {
+ return new ValidationResult(InvalidComparisonForEnumErrorMessage);
+ }
+ //The enums need to be of the same type.
+ else if (otherMemberValue.GetType() != value.GetType())
+ {
+ return new ValidationResult(DataAnnotationMemberHelper.TypeMismatchErrorMessage);
+ }
+
+ success = CheckEnumValues(registeredMemberEnumValue, otherMemberEnumValue);
+ }
+ else if (value is not null && otherMemberValue is not null)
+ {
+ //At this point, there's either a type mismatch or the type is not supported.
+ if (otherMemberValue.GetType() != value.GetType())
+ {
+ return new ValidationResult(DataAnnotationMemberHelper.TypeMismatchErrorMessage);
+ }
+ else
+ {
+ return new ValidationResult(DataAnnotationMemberHelper.InvalidTypeErrorMessage);
+ }
+ }
+
+ if (success is false)
+ {
+ if (validationContext.MemberName is not null)
+ {
+ return new ValidationResult(ErrorMessage, [validationContext.MemberName, _otherMemberName]);
+ }
+ else
+ {
+ return new ValidationResult(ErrorMessage, [_otherMemberName]);
+ }
+ }
+
+ return ValidationResult.Success;
+ }
+}
diff --git a/JMayer.Data/DataAnnotations/ComparisonOperation.cs b/JMayer.Data/DataAnnotations/ComparisonOperation.cs
new file mode 100644
index 0000000..d5e3195
--- /dev/null
+++ b/JMayer.Data/DataAnnotations/ComparisonOperation.cs
@@ -0,0 +1,43 @@
+namespace JMayer.Data.DataAnnotations;
+
+///
+/// The enumeration for the comparison operations.
+///
+public enum ComparisonOperation
+{
+ ///
+ /// The CompareToOtherMember attribute will do an equal check on the member its registered too against
+ /// another member.
+ ///
+ Equal = 0,
+
+ ///
+ /// The CompareToOtherMember attribute will do a not equal check on the member its registered too against
+ /// another member.
+ ///
+ NotEqual,
+
+ ///
+ /// The CompareToOtherMember attribute will do a greater than check on the member its registered too against
+ /// another member.
+ ///
+ GreaterThan,
+
+ ///
+ /// The CompareToOtherMember attribute will do a greater than or equal check on the member its registered too against
+ /// another member.
+ ///
+ GreaterThanOrEqual,
+
+ ///
+ /// The CompareToOtherMember attribute will do a less than check on the member its registered too against
+ /// another member.
+ ///
+ LessThan,
+
+ ///
+ /// The CompareToOtherMember attribute will do a less than or equal check on the member its registered too against
+ /// another member.
+ ///
+ LessThanOrEqual,
+}
diff --git a/JMayer.Data/DataAnnotations/DataAnnotationMemberHelper.cs b/JMayer.Data/DataAnnotations/DataAnnotationMemberHelper.cs
new file mode 100644
index 0000000..a946041
--- /dev/null
+++ b/JMayer.Data/DataAnnotations/DataAnnotationMemberHelper.cs
@@ -0,0 +1,49 @@
+using System.Reflection;
+
+namespace JMayer.Data.DataAnnotations;
+
+///
+/// The static class contains common contants and methods for member access.
+///
+internal class DataAnnotationMemberHelper
+{
+ ///
+ /// The constant for an invalid type error message.
+ ///
+ public const string InvalidTypeErrorMessage = "Failed to vaidate because the type is not supported.";
+
+ ///
+ /// The constant for the member not found error message.
+ ///
+ public const string MemberNotFoundErrorMessage = "Failed to validate because the member name was not found.";
+
+ ///
+ /// The constant for the same member error message.
+ ///
+ public const string SameMemberErrorMessage = "Failed to validate because the other member name is the same as the member name the attribute's registered too.";
+
+ ///
+ /// The constant for the type mismatch error message.
+ ///
+ public const string TypeMismatchErrorMessage = "Failed to validate because there is a type mismatch between the values being compared.";
+
+ ///
+ /// The method returns the value stored a member.
+ ///
+ /// Meta data about the member.
+ /// The instance of the object being validated.
+ /// The value or null if not found.
+ public static object? GetMemberValue(MemberInfo memberInfo, object objectInstance)
+ {
+ if (memberInfo is FieldInfo fieldInfo)
+ {
+ return fieldInfo.GetValue(objectInstance);
+ }
+ else if (memberInfo is PropertyInfo propertyInfo)
+ {
+ return propertyInfo.GetValue(objectInstance);
+ }
+
+ return null;
+ }
+}
diff --git a/JMayer.Data/DataAnnotations/RequiredDependsOnAttribute.cs b/JMayer.Data/DataAnnotations/RequiredDependsOnAttribute.cs
index 8b5e243..ee69fe8 100644
--- a/JMayer.Data/DataAnnotations/RequiredDependsOnAttribute.cs
+++ b/JMayer.Data/DataAnnotations/RequiredDependsOnAttribute.cs
@@ -12,17 +12,25 @@ namespace JMayer.Data.DataAnnotations;
/// which has the condition that needs to be evaluated. Set the conditionValue to true, false or an enum value based on what condition needs to occur for the required
/// data annotation to be evaluated.
///
-/// [RequiredDependsOn(dependentMemberName: nameof(DependentBoolMember), conditionValue: true)]
-/// public string ConditionalRequiredProperty { get; set; }
-///
-/// public bool DependentBoolMember { get; set; }
+/// public class ObjectRequiringValidation
+/// {
+/// //A required validation check will be done if DependentBoolMember is true.
+/// [RequiredDependsOn(dependentMemberName: nameof(DependentBoolMember), conditionValue: true)]
+/// public string ConditionalRequiredProperty { get; set; }
+///
+/// public bool DependentBoolMember { get; set; }
+/// }
///
/// or
///
-/// [RequiredDependsOn(dependentMemberName: nameof(DependentEnumMember), conditionValue: YourEnum.RequiredValue)]
-/// public string ConditionalRequiredProperty { get; set; }
-///
-/// public YourEnum DependentEnumMember { get; set; }
+/// public class ObjectRequiringValidation
+/// {
+/// //A required validation check will be done if DependentEnumMember is YourEnum.RequiredValue.
+/// [RequiredDependsOn(dependentMemberName: nameof(DependentEnumMember), conditionValue: YourEnum.RequiredValue)]
+/// public string ConditionalRequiredProperty { get; set; }
+///
+/// public YourEnum DependentEnumMember { get; set; }
+/// }
///
///
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
@@ -38,21 +46,6 @@ public sealed class RequiredDependsOnAttribute : RequiredAttribute
///
private readonly string _dependentMemberName;
- ///
- /// The constant for the same member error message.
- ///
- internal const string SameMemberErrorMessage = "Failed to validate because the dependent member name is the same as the attribute's member name.";
-
- ///
- /// The constant for the member not found error message.
- ///
- internal const string MemberNotFoundErrorMessage = "Failled to validate because the dependent member name was not found.";
-
- ///
- /// The constant for the type mismatch error message.
- ///
- internal const string TypeMismatchErrorMessage = "Failed to validate because the dependent member value type does not match the required value type.";
-
///
/// The constructor which takes the dependency and condition.
///
@@ -69,26 +62,6 @@ public RequiredDependsOnAttribute(string dependentMemberName, object conditionVa
_dependentMemberName = dependentMemberName;
}
- ///
- /// The method returns the value stored by the dependent member.
- ///
- /// Meta data about the depedent member.
- /// The instance of the object being validated.
- /// The value or null if not found.
- private static object? GetDependentMemberValue(MemberInfo dependentMemberInfo, object objectInstance)
- {
- if (dependentMemberInfo is FieldInfo fieldInfo)
- {
- return fieldInfo.GetValue(objectInstance);
- }
- else if (dependentMemberInfo is PropertyInfo propertyInfo)
- {
- return propertyInfo.GetValue(objectInstance);
- }
-
- return null;
- }
-
///
/// The method returns if the dependent member matches the required condition.
///
@@ -111,17 +84,17 @@ public RequiredDependsOnAttribute(string dependentMemberName, object conditionVa
{
if (_dependentMemberName == validationContext.MemberName)
{
- return new ValidationResult(SameMemberErrorMessage);
+ return new ValidationResult(DataAnnotationMemberHelper.SameMemberErrorMessage);
}
MemberInfo? dependentMemberInfo = validationContext.ObjectType.FindMembers(MemberTypes.Field | MemberTypes.Property, BindingFlags.Public | BindingFlags.Instance, Type.FilterName, _dependentMemberName).FirstOrDefault();
if (dependentMemberInfo is null)
{
- return new ValidationResult(MemberNotFoundErrorMessage);
+ return new ValidationResult(DataAnnotationMemberHelper.MemberNotFoundErrorMessage);
}
- object? dependentMemberValue = GetDependentMemberValue(dependentMemberInfo, validationContext.ObjectInstance);
+ object? dependentMemberValue = DataAnnotationMemberHelper.GetMemberValue(dependentMemberInfo, validationContext.ObjectInstance);
if (dependentMemberValue is null)
{
@@ -130,7 +103,7 @@ public RequiredDependsOnAttribute(string dependentMemberName, object conditionVa
if (dependentMemberValue.GetType() != _conditionValue.GetType())
{
- return new ValidationResult(TypeMismatchErrorMessage);
+ return new ValidationResult(DataAnnotationMemberHelper.TypeMismatchErrorMessage);
}
if (dependentMemberValue is bool dependentMemberBoolValue && _conditionValue is bool conditionBoolValue)
@@ -147,6 +120,10 @@ public RequiredDependsOnAttribute(string dependentMemberName, object conditionVa
return base.IsValid(value, validationContext);
}
}
+ else
+ {
+ return new ValidationResult(DataAnnotationMemberHelper.InvalidTypeErrorMessage);
+ }
return ValidationResult.Success;
}
diff --git a/TestProject/Data/DataAnnotations/RequiredDependsOnInvalidType.cs b/TestProject/Data/DataAnnotations/RequiredDependsOnInvalidType.cs
new file mode 100644
index 0000000..c3dd3ce
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/RequiredDependsOnInvalidType.cs
@@ -0,0 +1,21 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the RequiredDependsOn attribute when the types are invalid.
+///
+internal class RequiredDependsOnInvalidType : DataObject
+{
+ ///
+ /// The property gets/sets the string value evaluated by the RequiredDependsOn attribute.
+ ///
+ [RequiredDependsOn(dependentMemberName: nameof(DependentOnMember), conditionValue: 0)]
+ public int ConditionalRequireValue { get; set; }
+
+ ///
+ /// The property gets/sets the boolean value the ConditionalRequire property is dependent on.
+ ///
+ public int DependentOnMember { get; set; }
+}
diff --git a/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs b/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
index 8e14a1d..ef5dc63 100644
--- a/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
@@ -30,6 +30,19 @@ public class RequiredDependsOnUnitTest
[Fact]
public void VerifyConstructorThrowsArgumentNullExceptionForDependentMemberNameParameter() => Assert.Throws(() => new RequiredDependsOnAttribute(null, true));
+ ///
+ /// The method verifies a failure when the types are invalid.
+ ///
+ [Fact]
+ public void VerifyFailureInvalidType()
+ {
+ RequiredDependsOnInvalidType dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(DataAnnotationMemberHelper.InvalidTypeErrorMessage, validationResults[0].ErrorMessage);
+ }
+
///
/// The method verifies a failure when the depends on member is not found.
///
@@ -40,9 +53,7 @@ public void VerifyFailureMemberNameNotFound()
List validationResults = dataObject.Validate();
Assert.Single(validationResults);
- Assert.Equal(RequiredDependsOnAttribute.MemberNotFoundErrorMessage, validationResults[0].ErrorMessage);
- //Assert.Single(validationResults[0].MemberNames);
- //Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ Assert.Equal(DataAnnotationMemberHelper.MemberNotFoundErrorMessage, validationResults[0].ErrorMessage);
}
///
@@ -55,9 +66,7 @@ public void VerifyFailureSameMember()
List validationResults = dataObject.Validate();
Assert.Single(validationResults);
- Assert.Equal(RequiredDependsOnAttribute.SameMemberErrorMessage, validationResults[0].ErrorMessage);
- //Assert.Single(validationResults[0].MemberNames);
- //Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ Assert.Equal(DataAnnotationMemberHelper.SameMemberErrorMessage, validationResults[0].ErrorMessage);
}
///
@@ -70,9 +79,7 @@ public void VerifyFailureTypeMismatch()
List validationResults = dataObject.Validate();
Assert.Single(validationResults);
- Assert.Equal(RequiredDependsOnAttribute.TypeMismatchErrorMessage, validationResults[0].ErrorMessage);
- //Assert.Single(validationResults[0].MemberNames);
- //Assert.Equal(nameof(RequiredDependsOnTrue.ConditionalRequireValue), validationResults[0].MemberNames.First());
+ Assert.Equal(DataAnnotationMemberHelper.TypeMismatchErrorMessage, validationResults[0].ErrorMessage);
}
///
From 3f6ebcd242081155ca69340ad5eeb895cf9cedd9 Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Sun, 22 Feb 2026 11:44:16 -0500
Subject: [PATCH 05/19] Started on the CompareToOtherMember unit tests
---
.../CompareToOtherMemberAttribute.cs | 2 +-
.../CompareToOtherMemberBoolEqual.cs | 21 +++++++
.../CompareToOtherMemberUnitTest.cs | 55 +++++++++++++++++++
3 files changed, 77 insertions(+), 1 deletion(-)
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
diff --git a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
index cdd1924..0357588 100644
--- a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
+++ b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
@@ -75,7 +75,7 @@ public sealed class CompareToOtherMemberAttribute : ValidationAttribute
/// have a null value or the comparison is not equal and one of the members has a null value.
///
/// Thrown when the otherMemberName parameter is null or an empty string.
- public CompareToOtherMemberAttribute(string otherMemberName, ComparisonOperation compareToOperation, bool allowNullCheck)
+ public CompareToOtherMemberAttribute(string otherMemberName, ComparisonOperation compareToOperation, bool allowNullCheck = false)
{
ArgumentException.ThrowIfNullOrEmpty(otherMemberName);
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs
new file mode 100644
index 0000000..b3b3584
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs
@@ -0,0 +1,21 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two bool properties to be equal.
+///
+internal class CompareToOtherMemberBoolEqual : DataObject
+{
+ ///
+ /// The property gets/sets
+ ///
+ [CompareToOtherMember(nameof(BoolProperty2), ComparisonOperation.Equal)]
+ public bool BoolProperty1 { get; set; }
+
+ ///
+ ///
+ ///
+ public bool BoolProperty2 { get; set; }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
new file mode 100644
index 0000000..0a761c5
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
@@ -0,0 +1,55 @@
+using JMayer.Data.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations;
+
+namespace TestProject.Test.DataAnnotations;
+
+#warning I need some sort of default error message when validation fails but it also needs to respect when a custom error message is set.
+#warning The base has a reference to the default and custom error message but those are private and the public ErrorMessage property returns one of them.
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object.
+///
+public class CompareToOtherMemberUnitTest
+{
+ ///
+ /// The method verifies an argument null exception is thrown when null is passed into the constructor for the conditionValue parameter.
+ ///
+ [Fact]
+ public void VerifyConstructorThrowsArgumentNullExceptionForOtherMemberNameParameter() => Assert.Throws(() => new CompareToOtherMemberAttribute(null, ComparisonOperation.Equal));
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two bool properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyCompareToOtherBoolMemberEqualFailure()
+ {
+ CompareToOtherMemberBoolEqual dataObject = new()
+ {
+ BoolProperty1 = true,
+ BoolProperty2 = false,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.BoolProperty1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.BoolProperty2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two bool properties equal each other.
+ ///
+ [Fact]
+ public void VerifyCompareToOtherBoolMemberEqualSuccess()
+ {
+ CompareToOtherMemberBoolEqual dataObject = new()
+ {
+ BoolProperty1 = true,
+ BoolProperty2 = true,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
From 00a39fe48f01fa5f295af2593a028c3e9e01781f Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Tue, 24 Feb 2026 15:17:40 -0500
Subject: [PATCH 06/19] Test Units
---
.../CompareToOtherMemberAttribute.cs | 15 +-
.../CompareToOtherMemberBoolEqual.cs | 9 +-
.../CompareToOtherMemberBoolGreaterThan.cs | 15 +
...pareToOtherMemberBoolGreaterThanOrEqual.cs | 15 +
.../CompareToOtherMemberBoolLessThan.cs | 15 +
...CompareToOtherMemberBoolLessThanOrEqual.cs | 15 +
.../CompareToOtherMemberBoolNotEqual.cs | 18 ++
.../CompareToOtherMemberByteEqual.cs | 15 +
.../CompareToOtherMemberByteGreaterThan.cs | 15 +
...pareToOtherMemberByteGreaterThanOrEqual.cs | 15 +
.../CompareToOtherMemberByteLessThan.cs | 15 +
...CompareToOtherMemberByteLessThanOrEqual.cs | 15 +
.../CompareToOtherMemberByteNotEqual.cs | 15 +
.../CompareToOtherMemberInvalidType.cs | 15 +
.../CompareToOtherMemberNotFound.cs | 15 +
.../CompareToOtherMemberNullEqual.cs | 15 +
.../CompareToOtherMemberNullGreaterThan.cs | 15 +
...pareToOtherMemberNullGreaterThanOrEqual.cs | 15 +
.../CompareToOtherMemberNullLessThan.cs | 15 +
...CompareToOtherMemberNullLessThanOrEqual.cs | 15 +
.../CompareToOtherMemberNullNotEqual.cs | 15 +
.../CompareToOtherMemberSameMember.cs | 15 +
.../CompareToOtherMemberStringEqual.cs | 12 +
.../CompareToOtherMemberStringGreaterThan.cs | 12 +
...reToOtherMemberStringGreaterThanOrEqual.cs | 12 +
.../CompareToOtherMemberStringLessThan.cs | 12 +
...mpareToOtherMemberStringLessThanOrEqual.cs | 12 +
.../CompareToOtherMemberStringNotEqual.cs | 12 +
.../CompareToOtherMemberTypeMismatch.cs | 15 +
.../CompareToOtherMemberBoolUnitTest.cs | 167 +++++++++++
.../CompareToOtherMemberByteUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberNullUnitTest.cs | 217 +++++++++++++++
.../CompareToOtherMemberStringUnitTest.cs | 193 +++++++++++++
.../CompareToOtherMemberUnitTest.cs | 57 ++--
34 files changed, 1275 insertions(+), 33 deletions(-)
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberBoolNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberByteEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberByteNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberInvalidType.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberNotFound.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberNullEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberNullNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberSameMember.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberStringEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberStringNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMemberTypeMismatch.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberBoolUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberByteUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberNullUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberStringUnitTest.cs
diff --git a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
index 0357588..812078f 100644
--- a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
+++ b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
@@ -307,13 +307,14 @@ private bool CheckUnsignedIntegerValues(ulong registeredMemberValue, ulong other
if (_allowNullCheck)
{
+#warning I'm not making sure they're the same type.
success = CheckNullVaues(value, otherMemberValue);
}
if (value is bool registeredMemberBoolValue && otherMemberValue is bool otherMemberBoolValue)
{
//Only equal and not equal are supported for this type.
- if (_comparisonOperation is not ComparisonOperation.Equal and ComparisonOperation.NotEqual)
+ if (_comparisonOperation is not ComparisonOperation.Equal and not ComparisonOperation.NotEqual)
{
return new ValidationResult(InvalidComparisonForBoolErrorMessage);
}
@@ -322,20 +323,20 @@ private bool CheckUnsignedIntegerValues(ulong registeredMemberValue, ulong other
}
else if (value is sbyte or short or int or long && otherMemberValue is sbyte or short or int or long)
{
- success = CheckIntegerValues((long)value, (long)otherMemberValue);
+ success = CheckIntegerValues(Convert.ToInt64(value), Convert.ToInt64(otherMemberValue));
}
else if (value is byte or ushort or uint or ulong && otherMemberValue is byte or ushort or uint or ulong)
{
- success = CheckUnsignedIntegerValues((ulong)value, (ulong)otherMemberValue);
+ success = CheckUnsignedIntegerValues(Convert.ToUInt64(value), Convert.ToUInt64(otherMemberValue));
}
else if (value is float or double or decimal && otherMemberValue is float or double or decimal)
{
- success = CheckDecimalValues((decimal)value, (decimal)otherMemberValue);
+ success = CheckDecimalValues(Convert.ToDecimal(value), Convert.ToDecimal(otherMemberValue));
}
else if (value is char registeredMemberdCharacterValue && otherMemberValue is char otherMemberdCharacterValue)
{
//Only equal and not equal are supported for this type.
- if (_comparisonOperation is not ComparisonOperation.Equal and ComparisonOperation.NotEqual)
+ if (_comparisonOperation is not ComparisonOperation.Equal and not ComparisonOperation.NotEqual)
{
return new ValidationResult(InvalidComparisonForCharErrorMessage);
}
@@ -345,7 +346,7 @@ private bool CheckUnsignedIntegerValues(ulong registeredMemberValue, ulong other
else if (value is string registeredMemberdStringValue && otherMemberValue is string otherMemberdStringValue)
{
//Only equal and not equal are supported for this type.
- if (_comparisonOperation is not ComparisonOperation.Equal and ComparisonOperation.NotEqual)
+ if (_comparisonOperation is not ComparisonOperation.Equal and not ComparisonOperation.NotEqual)
{
return new ValidationResult(InvalidComparisonForStringErrorMessage);
}
@@ -367,7 +368,7 @@ private bool CheckUnsignedIntegerValues(ulong registeredMemberValue, ulong other
else if (value is Enum registeredMemberEnumValue && otherMemberValue is Enum otherMemberEnumValue)
{
//Only equal and not equal are supported for this type.
- if (_comparisonOperation is not ComparisonOperation.Equal and ComparisonOperation.NotEqual)
+ if (_comparisonOperation is not ComparisonOperation.Equal and not ComparisonOperation.NotEqual)
{
return new ValidationResult(InvalidComparisonForEnumErrorMessage);
}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs
index b3b3584..66ab182 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs
@@ -8,14 +8,11 @@ namespace TestProject.Data.DataAnnotations;
///
internal class CompareToOtherMemberBoolEqual : DataObject
{
- ///
- /// The property gets/sets
- ///
- [CompareToOtherMember(nameof(BoolProperty2), ComparisonOperation.Equal)]
- public bool BoolProperty1 { get; set; }
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public bool Property1 { get; set; }
///
///
///
- public bool BoolProperty2 { get; set; }
+ public bool Property2 { get; set; }
}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThan.cs
new file mode 100644
index 0000000..cffd4fd
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the greater than comparison operator is not suppored for the CompareToOtherMember attribute.
+///
+public class CompareToOtherMemberBoolGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public bool Property1 { get; set; }
+
+ public bool Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThanOrEqual.cs
new file mode 100644
index 0000000..fe2556d
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the greater than or equal comparison operator is not suppored for the CompareToOtherMember attribute.
+///
+internal class CompareToOtherMemberBoolGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public bool Property1 { get; set; }
+
+ public bool Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThan.cs
new file mode 100644
index 0000000..8a0ebee
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the less than comparison operator is not suppored for the CompareToOtherMember attribute.
+///
+internal class CompareToOtherMemberBoolLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public bool Property1 { get; set; }
+
+ public bool Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThanOrEqual.cs
new file mode 100644
index 0000000..273ccd0
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the less than or equal comparison operator is not suppored for the CompareToOtherMember attribute.
+///
+internal class CompareToOtherMemberBoolLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public bool Property1 { get; set; }
+
+ public bool Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolNotEqual.cs
new file mode 100644
index 0000000..7ffc20b
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolNotEqual.cs
@@ -0,0 +1,18 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two bool properties to be not equal.
+///
+internal class CompareToOtherMemberBoolNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public bool Property1 { get; set; }
+
+ ///
+ ///
+ ///
+ public bool Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteEqual.cs
new file mode 100644
index 0000000..5731d92
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberByteEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public byte Property1 { get; set; }
+
+ public byte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThan.cs
new file mode 100644
index 0000000..ff4db43
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberByteGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public byte Property1 { get; set; }
+
+ public byte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThanOrEqual.cs
new file mode 100644
index 0000000..d14b0eb
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberByteGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public byte Property1 { get; set; }
+
+ public byte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThan.cs
new file mode 100644
index 0000000..2a40884
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberByteLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public byte Property1 { get; set; }
+
+ public byte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThanOrEqual.cs
new file mode 100644
index 0000000..7955dbc
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberByteLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public byte Property1 { get; set; }
+
+ public byte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteNotEqual.cs
new file mode 100644
index 0000000..598199c
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberByteNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberByteNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public byte Property1 { get; set; }
+
+ public byte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberInvalidType.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberInvalidType.cs
new file mode 100644
index 0000000..ddbc230
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberInvalidType.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when the type is invalid.
+///
+internal class CompareToOtherMemberInvalidType : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public object Property1 { get; set; } = new();
+
+ public object Property2 { get; set; } = new();
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNotFound.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberNotFound.cs
new file mode 100644
index 0000000..4e3e2f2
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberNotFound.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when the member is not found.
+///
+internal class CompareToOtherMemberNotFound : DataObject
+{
+ [CompareToOtherMember("MemberNotFound", ComparisonOperation.Equal)]
+ public bool Property1 { get; set; }
+
+ public bool Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullEqual.cs
new file mode 100644
index 0000000..921f229
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two nullable properties and both need to be null.
+///
+internal class CompareToOtherMemberNullEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal, allowNullCheck: true)]
+ public int? Property1 { get; set; }
+
+ public int? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThan.cs
new file mode 100644
index 0000000..063ed65
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test a false is returned when one of the properties null for the CompareToOtherMember attribute.
+///
+internal class CompareToOtherMemberNullGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan, allowNullCheck: true)]
+ public int? Property1 { get; set; }
+
+ public int? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThanOrEqual.cs
new file mode 100644
index 0000000..697f4ca
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test a false is returned when one of the properties null for the CompareToOtherMember attribute.
+///
+internal class CompareToOtherMemberNullGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual, allowNullCheck: true)]
+ public int? Property1 { get; set; }
+
+ public int? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThan.cs
new file mode 100644
index 0000000..71939c4
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute will return a failure when one of the two properties is null.
+///
+internal class CompareToOtherMemberNullLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan, allowNullCheck: true)]
+ public int? Property1 { get; set; }
+
+ public int? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThanOrEqual.cs
new file mode 100644
index 0000000..2c695a9
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test a false is returned when one of the properties null for the CompareToOtherMember attribute.
+///
+internal class CompareToOtherMemberNullLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual, allowNullCheck: true)]
+ public int? Property1 { get; set; }
+
+ public int? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullNotEqual.cs
new file mode 100644
index 0000000..05cd26f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberNullNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two nullable properties and one needs to be not null.
+///
+internal class CompareToOtherMemberNullNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual, allowNullCheck: true)]
+ public int? Property1 { get; set; }
+
+ public int? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberSameMember.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberSameMember.cs
new file mode 100644
index 0000000..1c58806
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberSameMember.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when the same member is used.
+///
+internal class CompareToOtherMemberSameMember : DataObject
+{
+ [CompareToOtherMember(nameof(Property1), ComparisonOperation.Equal)]
+ public bool Property1 { get; set; }
+
+ public bool Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringEqual.cs
new file mode 100644
index 0000000..008a9fb
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+internal class CompareToOtherMemberStringEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public string? Property1 { get; set; }
+
+ public string? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThan.cs
new file mode 100644
index 0000000..87161ac
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThan.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+internal class CompareToOtherMemberStringGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public string? Property1 { get; set; }
+
+ public string? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThanOrEqual.cs
new file mode 100644
index 0000000..a206a1b
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThanOrEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+internal class CompareToOtherMemberStringGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public string? Property1 { get; set; }
+
+ public string? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThan.cs
new file mode 100644
index 0000000..91c94f6
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThan.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+internal class CompareToOtherMemberStringLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public string? Property1 { get; set; }
+
+ public string? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThanOrEqual.cs
new file mode 100644
index 0000000..a466270
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThanOrEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+internal class CompareToOtherMemberStringLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public string? Property1 { get; set; }
+
+ public string? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringNotEqual.cs
new file mode 100644
index 0000000..5ebfdce
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberStringNotEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+internal class CompareToOtherMemberStringNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public string? Property1 { get; set; }
+
+ public string? Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberTypeMismatch.cs b/TestProject/Data/DataAnnotations/CompareToOtherMemberTypeMismatch.cs
new file mode 100644
index 0000000..5ed9685
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMemberTypeMismatch.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when there is a type mismatch.
+///
+internal class CompareToOtherMemberTypeMismatch : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public bool Property1 { get; set; } = new();
+
+ public int Property2 { get; set; } = new();
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberBoolUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberBoolUnitTest.cs
new file mode 100644
index 0000000..9e4453d
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberBoolUnitTest.cs
@@ -0,0 +1,167 @@
+using JMayer.Data.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the bool data type.
+///
+public class CompareToOtherMemberBoolUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two bool properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberBoolEqual dataObject = new()
+ {
+ Property1 = true,
+ Property2 = false,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = false;
+ dataObject.Property2 = true;
+
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two bool properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberBoolEqual dataObject = new()
+ {
+ Property1 = true,
+ Property2 = true,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = false;
+ dataObject.Property2 = false;
+
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two bool properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberBoolNotEqual dataObject = new()
+ {
+ Property1 = true,
+ Property2 = true,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = false;
+ dataObject.Property2 = false;
+
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two bool properties don't equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberBoolNotEqual dataObject = new()
+ {
+ Property1 = true,
+ Property2 = false,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = false;
+ dataObject.Property2 = true;
+
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is greater than.
+ ///
+ [Fact]
+ public void VerifyFailureGreaterThanNotSupported()
+ {
+ CompareToOtherMemberBoolGreaterThan dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForBoolErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is greater than or equal.
+ ///
+ [Fact]
+ public void VerifyFailureGreaterThanOrEqualNotSupported()
+ {
+ CompareToOtherMemberBoolGreaterThanOrEqual dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForBoolErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is less than.
+ ///
+ [Fact]
+ public void VerifyFailureLessThanNotSupported()
+ {
+ CompareToOtherMemberBoolLessThan dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForBoolErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is less than or equal.
+ ///
+ [Fact]
+ public void VerifyFailureLessThanOrEqualNotSupported()
+ {
+ CompareToOtherMemberBoolLessThanOrEqual dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForBoolErrorMessage, validationResults[0].ErrorMessage);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberByteUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberByteUnitTest.cs
new file mode 100644
index 0000000..433f9df
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberByteUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the byte data type.
+///
+public class CompareToOtherMemberByteUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberByteEqual dataObject = new()
+ {
+ Property1 = byte.MaxValue,
+ Property2 = byte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberByteEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberByteEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = byte.MinValue;
+ dataObject.Property2 = byte.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberByteEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberByteEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberByteEqual dataObject = new()
+ {
+ Property1 = byte.MaxValue,
+ Property2 = byte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = byte.MinValue;
+ dataObject.Property2 = byte.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberByteGreaterThan dataObject = new()
+ {
+ Property1 = byte.MinValue,
+ Property2 = byte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberByteGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberByteGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberByteGreaterThan dataObject = new()
+ {
+ Property1 = byte.MaxValue,
+ Property2 = byte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberByteGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = byte.MinValue,
+ Property2 = byte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberByteGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberByteGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberByteGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = byte.MaxValue,
+ Property2 = byte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = byte.MaxValue;
+ dataObject.Property2 = byte.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberByteLessThan dataObject = new()
+ {
+ Property1 = byte.MaxValue,
+ Property2 = byte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberByteLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberByteLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberByteLessThan dataObject = new()
+ {
+ Property1 = byte.MinValue,
+ Property2 = byte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberByteLessThanOrEqual dataObject = new()
+ {
+ Property1 = byte.MaxValue,
+ Property2 = byte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberByteLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberByteLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberByteLessThanOrEqual dataObject = new()
+ {
+ Property1 = byte.MinValue,
+ Property2 = byte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = byte.MaxValue;
+ dataObject.Property2 = byte.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberByteNotEqual dataObject = new()
+ {
+ Property1 = byte.MaxValue,
+ Property2 = byte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberByteNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberByteNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = byte.MinValue;
+ dataObject.Property2 = byte.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberByteNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberByteNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberByteNotEqual dataObject = new()
+ {
+ Property1 = byte.MaxValue,
+ Property2 = byte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = byte.MinValue;
+ dataObject.Property2 = byte.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberNullUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberNullUnitTest.cs
new file mode 100644
index 0000000..4de5674
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberNullUnitTest.cs
@@ -0,0 +1,217 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the null values.
+///
+public class CompareToOtherMemberNullUnitTest
+{
+ ///
+ /// The method verifies the CompareToOtherMember data annotation return failure when the two properties do not both equal null.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberNullEqual dataObject = new()
+ {
+ Property1 = null,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = int.MaxValue;
+ dataObject.Property2 = null;
+
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOtherMember data annotation return success when the two properties are both null.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberNullEqual dataObject = new()
+ {
+ Property1 = null,
+ Property2 = null,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOtherMember data annotation return failure when the two properties are not null.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNullNotEqual dataObject = new()
+ {
+ Property1 = null,
+ Property2 = null,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOtherMember data annotation return success when one of the two properties is null.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNullNotEqual dataObject = new()
+ {
+ Property1 = null,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = int.MaxValue;
+ dataObject.Property2 = null;
+
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOtherMember data annotation returns failure when one of the two properties is null.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberNullGreaterThan dataObject = new()
+ {
+ Property1 = null,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullGreaterThan.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = int.MaxValue;
+ dataObject.Property2 = null;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOtherMember data annotation returns failure when one of the two properties is null.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberNullGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = null,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = int.MaxValue;
+ dataObject.Property2 = null;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOtherMember data annotation returns failure when one of the two properties is null.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberNullLessThan dataObject = new()
+ {
+ Property1 = null,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullLessThan.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = int.MaxValue;
+ dataObject.Property2 = null;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOtherMember data annotation returns failure when one of the two properties is null.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberNullLessThanOrEqual dataObject = new()
+ {
+ Property1 = null,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = int.MaxValue;
+ dataObject.Property2 = null;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNullLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNullLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberStringUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberStringUnitTest.cs
new file mode 100644
index 0000000..987a826
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberStringUnitTest.cs
@@ -0,0 +1,193 @@
+using JMayer.Data.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the string data type.
+///
+public class CompareToOtherMemberStringUnitTest
+{
+ ///
+ /// The constant for a string.
+ ///
+ private const string AString = "A String";
+
+ ///
+ /// The constant for a different string.
+ ///
+ private const string DifferentString = "Different String";
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberStringEqual dataObject = new()
+ {
+ Property1 = AString,
+ Property2 = DifferentString,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = DifferentString;
+ dataObject.Property2 = AString;
+
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberStringEqual dataObject = new()
+ {
+ Property1 = AString,
+ Property2 = AString,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = DifferentString;
+ dataObject.Property2 = DifferentString;
+
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberStringNotEqual dataObject = new()
+ {
+ Property1 = AString,
+ Property2 = AString,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = DifferentString;
+ dataObject.Property2 = DifferentString;
+
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties don't equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberStringNotEqual dataObject = new()
+ {
+ Property1 = AString,
+ Property2 = DifferentString,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = DifferentString;
+ dataObject.Property2 = AString;
+
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is greater than.
+ ///
+ [Fact]
+ public void VerifyFailureGreaterThanNotSupported()
+ {
+ CompareToOtherMemberStringGreaterThan dataObject = new()
+ {
+ Property1 = AString,
+ Property2 = DifferentString,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForStringErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is greater than or equal.
+ ///
+ [Fact]
+ public void VerifyFailureGreaterThanOrEqualNotSupported()
+ {
+ CompareToOtherMemberStringGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = AString,
+ Property2 = DifferentString,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForStringErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is less than.
+ ///
+ [Fact]
+ public void VerifyFailureLessThanNotSupported()
+ {
+ CompareToOtherMemberStringLessThan dataObject = new()
+ {
+ Property1 = AString,
+ Property2 = DifferentString,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForStringErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is less than or equal.
+ ///
+ [Fact]
+ public void VerifyFailureLessThanOrEqualNotSupported()
+ {
+ CompareToOtherMemberStringLessThanOrEqual dataObject = new()
+ {
+ Property1 = AString,
+ Property2 = DifferentString,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForStringErrorMessage, validationResults[0].ErrorMessage);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
index 0a761c5..b88394a 100644
--- a/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
@@ -8,7 +8,7 @@ namespace TestProject.Test.DataAnnotations;
#warning The base has a reference to the default and custom error message but those are private and the public ErrorMessage property returns one of them.
///
-/// The class manages tests for the CompareToOtherMemberAttribute object.
+/// The class manages general tests for the CompareToOtherMemberAttribute object.
///
public class CompareToOtherMemberUnitTest
{
@@ -19,37 +19,54 @@ public class CompareToOtherMemberUnitTest
public void VerifyConstructorThrowsArgumentNullExceptionForOtherMemberNameParameter() => Assert.Throws(() => new CompareToOtherMemberAttribute(null, ComparisonOperation.Equal));
///
- /// The method verifies the CompareToOther data annotation return failure when the two bool properties do not equal each other.
+ /// The method verifies a failure when the types are invalid.
///
[Fact]
- public void VerifyCompareToOtherBoolMemberEqualFailure()
+ public void VerifyFailureInvalidType()
{
- CompareToOtherMemberBoolEqual dataObject = new()
- {
- BoolProperty1 = true,
- BoolProperty2 = false,
- };
+ CompareToOtherMemberInvalidType dataObject = new();
List validationResults = dataObject.Validate();
Assert.Single(validationResults);
- //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
- Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.BoolProperty1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.BoolProperty2), validationResults[0].MemberNames.Last());
+ Assert.Equal(DataAnnotationMemberHelper.InvalidTypeErrorMessage, validationResults[0].ErrorMessage);
}
///
- /// The method verifies the CompareToOther data annotation return success when the two bool properties equal each other.
+ /// The method verifies a failure when the depends on member is not found.
///
[Fact]
- public void VerifyCompareToOtherBoolMemberEqualSuccess()
+ public void VerifyFailureMemberNameNotFound()
{
- CompareToOtherMemberBoolEqual dataObject = new()
- {
- BoolProperty1 = true,
- BoolProperty2 = true,
- };
+ CompareToOtherMemberNotFound dataObject = new();
List validationResults = dataObject.Validate();
- Assert.Empty(validationResults);
+
+ Assert.Single(validationResults);
+ Assert.Equal(DataAnnotationMemberHelper.MemberNotFoundErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the depends on member is the same member of the evaluating member.
+ ///
+ [Fact]
+ public void VerifyFailureSameMember()
+ {
+ CompareToOtherMemberSameMember dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(DataAnnotationMemberHelper.SameMemberErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the depends on member has a different type than the other property.
+ ///
+ [Fact]
+ public void VerifyFailureTypeMismatch()
+ {
+ CompareToOtherMemberTypeMismatch dataObject = new();
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(DataAnnotationMemberHelper.TypeMismatchErrorMessage, validationResults[0].ErrorMessage);
}
}
From 158d9811b23ca83d67b351a154e6be52a33fdfe0 Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Mon, 16 Mar 2026 14:40:45 -0400
Subject: [PATCH 07/19] Unit tests; Fixed float, double, decimal handling
Restructured the CompareToOtherMember objects used for testing.
---
.../CompareToOtherMemberAttribute.cs | 26 +-
.../Bool/CompareToOtherMemberEqual.cs} | 4 +-
.../Bool/CompareToOtherMemberGreaterThan.cs} | 4 +-
...CompareToOtherMemberGreaterThanOrEqual.cs} | 4 +-
.../Bool/CompareToOtherMemberLessThan.cs} | 4 +-
.../CompareToOtherMemberLessThanOrEqual.cs} | 4 +-
.../Bool/CompareToOtherMemberNotEqual.cs} | 4 +-
.../Byte/CompareToOtherMemberEqual.cs} | 4 +-
.../Byte/CompareToOtherMemberGreaterThan.cs} | 4 +-
...CompareToOtherMemberGreaterThanOrEqual.cs} | 4 +-
.../Byte/CompareToOtherMemberLessThan.cs} | 4 +-
.../CompareToOtherMemberLessThanOrEqual.cs} | 4 +-
.../Byte/CompareToOtherMemberNotEqual.cs} | 4 +-
.../CompareToOtherMemberInvalidType.cs | 2 +-
.../CompareToOtherMemberNotFound.cs | 2 +-
.../CompareToOtherMemberSameMember.cs | 2 +-
.../CompareToOtherMemberTypeMismatch.cs | 2 +-
.../Decimal/CompareToOtherMemberEqual.cs | 15 +
.../CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Decimal/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Decimal/CompareToOtherMemberNotEqual.cs | 15 +
.../Double/CompareToOtherMemberEqual.cs | 15 +
.../Double/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Double/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Double/CompareToOtherMemberNotEqual.cs | 15 +
.../Float/CompareToOtherMemberEqual.cs | 15 +
.../Float/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Float/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Float/CompareToOtherMemberNotEqual.cs | 15 +
.../Int/CompareToOtherMemberEqual.cs | 15 +
.../Int/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Int/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Int/CompareToOtherMemberNotEqual.cs | 15 +
.../Long/CompareToOtherMemberEqual.cs | 15 +
.../Long/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Long/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Long/CompareToOtherMemberNotEqual.cs | 15 +
.../Null/CompareToOtherMemberEqual.cs} | 4 +-
.../Null/CompareToOtherMemberGreaterThan.cs} | 4 +-
...CompareToOtherMemberGreaterThanOrEqual.cs} | 4 +-
.../Null/CompareToOtherMemberLessThan.cs} | 4 +-
.../CompareToOtherMemberLessThanOrEqual.cs} | 4 +-
.../Null/CompareToOtherMemberNotEqual.cs} | 4 +-
.../Sbyte/CompareToOtherMemberEqual.cs | 15 +
.../Sbyte/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Sbyte/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Sbyte/CompareToOtherMemberNotEqual.cs | 15 +
.../Short/CompareToOtherMemberEqual.cs | 15 +
.../Short/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Short/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Short/CompareToOtherMemberNotEqual.cs | 15 +
.../String/CompareToOtherMemberEqual.cs} | 4 +-
.../CompareToOtherMemberGreaterThan.cs} | 4 +-
...CompareToOtherMemberGreaterThanOrEqual.cs} | 4 +-
.../String/CompareToOtherMemberLessThan.cs} | 4 +-
.../CompareToOtherMemberLessThanOrEqual.cs} | 4 +-
.../String/CompareToOtherMemberNotEqual.cs} | 4 +-
.../Uint/CompareToOtherMemberEqual.cs | 15 +
.../Uint/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Uint/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Uint/CompareToOtherMemberNotEqual.cs | 15 +
.../Ulong/CompareToOtherMemberEqual.cs | 15 +
.../Ulong/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Ulong/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Ulong/CompareToOtherMemberNotEqual.cs | 15 +
.../Ushort/CompareToOtherMemberEqual.cs | 15 +
.../Ushort/CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../Ushort/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../Ushort/CompareToOtherMemberNotEqual.cs | 15 +
.../CompareToOtherMemberBoolUnitTest.cs | 34 +--
.../CompareToOtherMemberByteUnitTest.cs | 58 ++--
.../CompareToOtherMemberDecimalUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberDoubleUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberFloatUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberIntUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberLongUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberNullUnitTest.cs | 62 ++---
.../CompareToOtherMemberSbyteUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberShortUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberStringUnitTest.cs | 34 +--
.../CompareToOtherMemberUintUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberUlongUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberUnitTest.cs | 2 +-
.../CompareToOtherMemberUshortUnitTest.cs | 260 ++++++++++++++++++
104 files changed, 3672 insertions(+), 148 deletions(-)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberBoolEqual.cs => CompareToOtherMembers/Bool/CompareToOtherMemberEqual.cs} (76%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberBoolGreaterThan.cs => CompareToOtherMembers/Bool/CompareToOtherMemberGreaterThan.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberBoolGreaterThanOrEqual.cs => CompareToOtherMembers/Bool/CompareToOtherMemberGreaterThanOrEqual.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberBoolLessThan.cs => CompareToOtherMembers/Bool/CompareToOtherMemberLessThan.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberBoolLessThanOrEqual.cs => CompareToOtherMembers/Bool/CompareToOtherMemberLessThanOrEqual.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberBoolNotEqual.cs => CompareToOtherMembers/Bool/CompareToOtherMemberNotEqual.cs} (76%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberByteEqual.cs => CompareToOtherMembers/Byte/CompareToOtherMemberEqual.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberByteGreaterThan.cs => CompareToOtherMembers/Byte/CompareToOtherMemberGreaterThan.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberByteGreaterThanOrEqual.cs => CompareToOtherMembers/Byte/CompareToOtherMemberGreaterThanOrEqual.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberByteLessThan.cs => CompareToOtherMembers/Byte/CompareToOtherMemberLessThan.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberByteLessThanOrEqual.cs => CompareToOtherMembers/Byte/CompareToOtherMemberLessThanOrEqual.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberByteNotEqual.cs => CompareToOtherMembers/Byte/CompareToOtherMemberNotEqual.cs} (74%)
rename TestProject/Data/DataAnnotations/{ => CompareToOtherMembers}/CompareToOtherMemberInvalidType.cs (86%)
rename TestProject/Data/DataAnnotations/{ => CompareToOtherMembers}/CompareToOtherMemberNotFound.cs (85%)
rename TestProject/Data/DataAnnotations/{ => CompareToOtherMembers}/CompareToOtherMemberSameMember.cs (85%)
rename TestProject/Data/DataAnnotations/{ => CompareToOtherMembers}/CompareToOtherMemberTypeMismatch.cs (86%)
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberNotEqual.cs
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberNullEqual.cs => CompareToOtherMembers/Null/CompareToOtherMemberEqual.cs} (76%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberNullGreaterThan.cs => CompareToOtherMembers/Null/CompareToOtherMemberGreaterThan.cs} (75%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberNullGreaterThanOrEqual.cs => CompareToOtherMembers/Null/CompareToOtherMemberGreaterThanOrEqual.cs} (74%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberNullLessThan.cs => CompareToOtherMembers/Null/CompareToOtherMemberLessThan.cs} (75%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberNullLessThanOrEqual.cs => CompareToOtherMembers/Null/CompareToOtherMemberLessThanOrEqual.cs} (75%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberNullNotEqual.cs => CompareToOtherMembers/Null/CompareToOtherMemberNotEqual.cs} (76%)
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberNotEqual.cs
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberStringEqual.cs => CompareToOtherMembers/String/CompareToOtherMemberEqual.cs} (64%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberStringGreaterThan.cs => CompareToOtherMembers/String/CompareToOtherMemberGreaterThan.cs} (63%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberStringGreaterThanOrEqual.cs => CompareToOtherMembers/String/CompareToOtherMemberGreaterThanOrEqual.cs} (63%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberStringLessThan.cs => CompareToOtherMembers/String/CompareToOtherMemberLessThan.cs} (63%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberStringLessThanOrEqual.cs => CompareToOtherMembers/String/CompareToOtherMemberLessThanOrEqual.cs} (63%)
rename TestProject/Data/DataAnnotations/{CompareToOtherMemberStringNotEqual.cs => CompareToOtherMembers/String/CompareToOtherMemberNotEqual.cs} (63%)
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberDecimalUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberDoubleUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberFloatUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberIntUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberLongUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberSbyteUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberShortUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberUintUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberUlongUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberUshortUnitTest.cs
diff --git a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
index 812078f..4fa080b 100644
--- a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
+++ b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
@@ -176,6 +176,26 @@ private bool CheckDecimalValues(decimal registeredMemberValue, decimal otherMemb
};
}
+ ///
+ /// The method returns if the double values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckDoubleValues(double registeredMemberValue, double otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
///
/// The method returns if the enum values pass the comparison.
///
@@ -329,7 +349,11 @@ private bool CheckUnsignedIntegerValues(ulong registeredMemberValue, ulong other
{
success = CheckUnsignedIntegerValues(Convert.ToUInt64(value), Convert.ToUInt64(otherMemberValue));
}
- else if (value is float or double or decimal && otherMemberValue is float or double or decimal)
+ else if (value is float or double && otherMemberValue is float or double)
+ {
+ success = CheckDoubleValues(Convert.ToDouble(value), Convert.ToDouble(otherMemberValue));
+ }
+ else if (value is decimal && otherMemberValue is decimal)
{
success = CheckDecimalValues(Convert.ToDecimal(value), Convert.ToDecimal(otherMemberValue));
}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberEqual.cs
similarity index 76%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberEqual.cs
index 66ab182..7076363 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Bool;
///
/// The class is used to test the CompareToOtherMember attribute when comparing two bool properties to be equal.
///
-internal class CompareToOtherMemberBoolEqual : DataObject
+internal class CompareToOtherMemberEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
public bool Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberGreaterThan.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThan.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberGreaterThan.cs
index cffd4fd..01b309e 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThan.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberGreaterThan.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Bool;
///
/// The class is used to test the greater than comparison operator is not suppored for the CompareToOtherMember attribute.
///
-public class CompareToOtherMemberBoolGreaterThan : DataObject
+public class CompareToOtherMemberGreaterThan : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
public bool Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberGreaterThanOrEqual.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThanOrEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberGreaterThanOrEqual.cs
index fe2556d..95e2eb2 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolGreaterThanOrEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Bool;
///
/// The class is used to test the greater than or equal comparison operator is not suppored for the CompareToOtherMember attribute.
///
-internal class CompareToOtherMemberBoolGreaterThanOrEqual : DataObject
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
public bool Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberLessThan.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThan.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberLessThan.cs
index 8a0ebee..ed0fc9d 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThan.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberLessThan.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Bool;
///
/// The class is used to test the less than comparison operator is not suppored for the CompareToOtherMember attribute.
///
-internal class CompareToOtherMemberBoolLessThan : DataObject
+internal class CompareToOtherMemberLessThan : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
public bool Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberLessThanOrEqual.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThanOrEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberLessThanOrEqual.cs
index 273ccd0..908466d 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolLessThanOrEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberLessThanOrEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Bool;
///
/// The class is used to test the less than or equal comparison operator is not suppored for the CompareToOtherMember attribute.
///
-internal class CompareToOtherMemberBoolLessThanOrEqual : DataObject
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
public bool Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberNotEqual.cs
similarity index 76%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberBoolNotEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberNotEqual.cs
index 7ffc20b..7865f81 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberBoolNotEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Bool/CompareToOtherMemberNotEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Bool;
///
/// The class is used to test the CompareToOtherMember attribute when comparing two bool properties to be not equal.
///
-internal class CompareToOtherMemberBoolNotEqual : DataObject
+internal class CompareToOtherMemberNotEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
public bool Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberEqual.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberByteEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberEqual.cs
index 5731d92..8da7647 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Byte;
///
/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
///
-internal class CompareToOtherMemberByteEqual : DataObject
+internal class CompareToOtherMemberEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
public byte Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberGreaterThan.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThan.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberGreaterThan.cs
index ff4db43..c6aaa94 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThan.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberGreaterThan.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Byte;
///
/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
///
-internal class CompareToOtherMemberByteGreaterThan : DataObject
+internal class CompareToOtherMemberGreaterThan : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
public byte Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberGreaterThanOrEqual.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThanOrEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberGreaterThanOrEqual.cs
index d14b0eb..196ccc3 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteGreaterThanOrEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Byte;
///
/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
///
-internal class CompareToOtherMemberByteGreaterThanOrEqual : DataObject
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
public byte Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberLessThan.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThan.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberLessThan.cs
index 2a40884..de4bd19 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThan.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberLessThan.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Byte;
///
/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
///
-internal class CompareToOtherMemberByteLessThan : DataObject
+internal class CompareToOtherMemberLessThan : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
public byte Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberLessThanOrEqual.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThanOrEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberLessThanOrEqual.cs
index 7955dbc..3db94ad 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteLessThanOrEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberLessThanOrEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Byte;
///
/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
///
-internal class CompareToOtherMemberByteLessThanOrEqual : DataObject
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
public byte Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberNotEqual.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberByteNotEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberNotEqual.cs
index 598199c..78849af 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberByteNotEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Byte/CompareToOtherMemberNotEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Byte;
///
/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
///
-internal class CompareToOtherMemberByteNotEqual : DataObject
+internal class CompareToOtherMemberNotEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
public byte Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberInvalidType.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberInvalidType.cs
similarity index 86%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberInvalidType.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberInvalidType.cs
index ddbc230..35ea821 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberInvalidType.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberInvalidType.cs
@@ -1,7 +1,7 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers;
///
/// The class is used to test the CompareToOtherMember attribute when the type is invalid.
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNotFound.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberNotFound.cs
similarity index 85%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberNotFound.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberNotFound.cs
index 4e3e2f2..5be6914 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberNotFound.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberNotFound.cs
@@ -1,7 +1,7 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers;
///
/// The class is used to test the CompareToOtherMember attribute when the member is not found.
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberSameMember.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberSameMember.cs
similarity index 85%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberSameMember.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberSameMember.cs
index 1c58806..63a3ee0 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberSameMember.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberSameMember.cs
@@ -1,7 +1,7 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers;
///
/// The class is used to test the CompareToOtherMember attribute when the same member is used.
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberTypeMismatch.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberTypeMismatch.cs
similarity index 86%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberTypeMismatch.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberTypeMismatch.cs
index 5ed9685..d616786 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberTypeMismatch.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/CompareToOtherMemberTypeMismatch.cs
@@ -1,7 +1,7 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers;
///
/// The class is used to test the CompareToOtherMember attribute when there is a type mismatch.
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..fe5f3e8
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Decimal;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public decimal Property1 { get; set; }
+
+ public decimal Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..cf67965
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Decimal;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public decimal Property1 { get; set; }
+
+ public decimal Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..60dbce6
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Decimal;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public decimal Property1 { get; set; }
+
+ public decimal Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..4e29f57
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Decimal;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public decimal Property1 { get; set; }
+
+ public decimal Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..f24b98e
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Decimal;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public decimal Property1 { get; set; }
+
+ public decimal Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..e6dbf2b
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Decimal/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Decimal;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public decimal Property1 { get; set; }
+
+ public decimal Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..dbb6e26
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Double;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public double Property1 { get; set; }
+
+ public double Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..86787ca
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Double;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public double Property1 { get; set; }
+
+ public double Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..00173b4
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Double;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public double Property1 { get; set; }
+
+ public double Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..044c8f3
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Double;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public double Property1 { get; set; }
+
+ public double Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..17cfdd8
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Double;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public double Property1 { get; set; }
+
+ public double Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..f59d8bd
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Double/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Double;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public double Property1 { get; set; }
+
+ public double Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..c623223
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Float;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public float Property1 { get; set; }
+
+ public float Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..a42a423
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Float;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public float Property1 { get; set; }
+
+ public float Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..bf27561
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Float;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public float Property1 { get; set; }
+
+ public float Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..15336a6
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Float;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public float Property1 { get; set; }
+
+ public float Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..0d6b1fa
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Float;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public float Property1 { get; set; }
+
+ public float Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..00552c5
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Float/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Float;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public float Property1 { get; set; }
+
+ public float Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..fe95e4b
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Int;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public int Property1 { get; set; }
+
+ public int Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..b50d67b
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Int;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public int Property1 { get; set; }
+
+ public int Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..1960902
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Int;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public int Property1 { get; set; }
+
+ public int Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..b67681d
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Int;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public int Property1 { get; set; }
+
+ public int Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..cbe5f6d
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Int;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public int Property1 { get; set; }
+
+ public int Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..7865ebd
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Int/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Int;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public int Property1 { get; set; }
+
+ public int Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..845c1a6
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Long;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public long Property1 { get; set; }
+
+ public long Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..5655a85
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Long;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public long Property1 { get; set; }
+
+ public long Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..d2c075a
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Long;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public long Property1 { get; set; }
+
+ public long Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..9db1f2f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Long;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public long Property1 { get; set; }
+
+ public long Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..4dbd42c
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Long;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public long Property1 { get; set; }
+
+ public long Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..7964a9f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Long/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Long;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public long Property1 { get; set; }
+
+ public long Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberEqual.cs
similarity index 76%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberNullEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberEqual.cs
index 921f229..58b3d22 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Null;
///
/// The class is used to test the CompareToOtherMember attribute when comparing two nullable properties and both need to be null.
///
-internal class CompareToOtherMemberNullEqual : DataObject
+internal class CompareToOtherMemberEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal, allowNullCheck: true)]
public int? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberGreaterThan.cs
similarity index 75%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThan.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberGreaterThan.cs
index 063ed65..eb7c6cd 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThan.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberGreaterThan.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Null;
///
/// The class is used to test a false is returned when one of the properties null for the CompareToOtherMember attribute.
///
-internal class CompareToOtherMemberNullGreaterThan : DataObject
+internal class CompareToOtherMemberGreaterThan : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan, allowNullCheck: true)]
public int? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberGreaterThanOrEqual.cs
similarity index 74%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThanOrEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberGreaterThanOrEqual.cs
index 697f4ca..ab983c8 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullGreaterThanOrEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Null;
///
/// The class is used to test a false is returned when one of the properties null for the CompareToOtherMember attribute.
///
-internal class CompareToOtherMemberNullGreaterThanOrEqual : DataObject
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual, allowNullCheck: true)]
public int? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberLessThan.cs
similarity index 75%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThan.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberLessThan.cs
index 71939c4..bf0d9ce 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThan.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberLessThan.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Null;
///
/// The class is used to test the CompareToOtherMember attribute will return a failure when one of the two properties is null.
///
-internal class CompareToOtherMemberNullLessThan : DataObject
+internal class CompareToOtherMemberLessThan : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan, allowNullCheck: true)]
public int? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberLessThanOrEqual.cs
similarity index 75%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThanOrEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberLessThanOrEqual.cs
index 2c695a9..e9392e3 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullLessThanOrEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberLessThanOrEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Null;
///
/// The class is used to test a false is returned when one of the properties null for the CompareToOtherMember attribute.
///
-internal class CompareToOtherMemberNullLessThanOrEqual : DataObject
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual, allowNullCheck: true)]
public int? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberNotEqual.cs
similarity index 76%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberNullNotEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberNotEqual.cs
index 05cd26f..4d3a6d0 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberNullNotEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Null/CompareToOtherMemberNotEqual.cs
@@ -1,12 +1,12 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Null;
///
/// The class is used to test the CompareToOtherMember attribute when comparing two nullable properties and one needs to be not null.
///
-internal class CompareToOtherMemberNullNotEqual : DataObject
+internal class CompareToOtherMemberNotEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual, allowNullCheck: true)]
public int? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..aa3e9fd
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Sbyte;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public sbyte Property1 { get; set; }
+
+ public sbyte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..e72ff2c
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Sbyte;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public sbyte Property1 { get; set; }
+
+ public sbyte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..62030d1
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Sbyte;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public sbyte Property1 { get; set; }
+
+ public sbyte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..7a021c6
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Sbyte;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public sbyte Property1 { get; set; }
+
+ public sbyte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..681a7c5
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Sbyte;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public sbyte Property1 { get; set; }
+
+ public sbyte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..9614de5
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Sbyte/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Sbyte;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public sbyte Property1 { get; set; }
+
+ public sbyte Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..a341e40
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Short;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public short Property1 { get; set; }
+
+ public short Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..999a56a
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Short;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public short Property1 { get; set; }
+
+ public short Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..0bf3ded
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Short;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public short Property1 { get; set; }
+
+ public short Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..197a109
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Short;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public short Property1 { get; set; }
+
+ public short Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..dd2bd2b
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Short;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public short Property1 { get; set; }
+
+ public short Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..d6ae303
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Short/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Short;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public short Property1 { get; set; }
+
+ public short Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberEqual.cs
similarity index 64%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberStringEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberEqual.cs
index 008a9fb..e8809ba 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberEqual.cs
@@ -1,9 +1,9 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.String;
-internal class CompareToOtherMemberStringEqual : DataObject
+internal class CompareToOtherMemberEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
public string? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberGreaterThan.cs
similarity index 63%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThan.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberGreaterThan.cs
index 87161ac..90f0b4e 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThan.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberGreaterThan.cs
@@ -1,9 +1,9 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.String;
-internal class CompareToOtherMemberStringGreaterThan : DataObject
+internal class CompareToOtherMemberGreaterThan : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
public string? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberGreaterThanOrEqual.cs
similarity index 63%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThanOrEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberGreaterThanOrEqual.cs
index a206a1b..c1674d4 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringGreaterThanOrEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -1,9 +1,9 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.String;
-internal class CompareToOtherMemberStringGreaterThanOrEqual : DataObject
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
public string? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberLessThan.cs
similarity index 63%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThan.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberLessThan.cs
index 91c94f6..97c9db0 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThan.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberLessThan.cs
@@ -1,9 +1,9 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.String;
-internal class CompareToOtherMemberStringLessThan : DataObject
+internal class CompareToOtherMemberLessThan : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
public string? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberLessThanOrEqual.cs
similarity index 63%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThanOrEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberLessThanOrEqual.cs
index a466270..0e79517 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringLessThanOrEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberLessThanOrEqual.cs
@@ -1,9 +1,9 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.String;
-internal class CompareToOtherMemberStringLessThanOrEqual : DataObject
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
public string? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberNotEqual.cs
similarity index 63%
rename from TestProject/Data/DataAnnotations/CompareToOtherMemberStringNotEqual.cs
rename to TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberNotEqual.cs
index 5ebfdce..4d35930 100644
--- a/TestProject/Data/DataAnnotations/CompareToOtherMemberStringNotEqual.cs
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/String/CompareToOtherMemberNotEqual.cs
@@ -1,9 +1,9 @@
using JMayer.Data.Data;
using JMayer.Data.DataAnnotations;
-namespace TestProject.Data.DataAnnotations;
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.String;
-internal class CompareToOtherMemberStringNotEqual : DataObject
+internal class CompareToOtherMemberNotEqual : DataObject
{
[CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
public string? Property1 { get; set; }
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..4b63860
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Uint;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public uint Property1 { get; set; }
+
+ public uint Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..0917c33
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Uint;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public uint Property1 { get; set; }
+
+ public uint Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..faa0f9c
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Uint;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public uint Property1 { get; set; }
+
+ public uint Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..f5b5c4e
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Uint;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public uint Property1 { get; set; }
+
+ public uint Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..3749c99
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Uint;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public uint Property1 { get; set; }
+
+ public uint Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..7da7bb7
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Uint/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Uint;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public uint Property1 { get; set; }
+
+ public uint Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..e087b7b
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ulong;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public ulong Property1 { get; set; }
+
+ public ulong Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..aa8f8f5
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ulong;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public ulong Property1 { get; set; }
+
+ public ulong Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..fb70e70
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ulong;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public ulong Property1 { get; set; }
+
+ public ulong Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..3471a20
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ulong;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public ulong Property1 { get; set; }
+
+ public ulong Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..35d55bf
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ulong;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public ulong Property1 { get; set; }
+
+ public ulong Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..7430344
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ulong/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ulong;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public ulong Property1 { get; set; }
+
+ public ulong Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..09fb9fe
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ushort;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public ushort Property1 { get; set; }
+
+ public ushort Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..60ccc34
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ushort;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public ushort Property1 { get; set; }
+
+ public ushort Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..d2a7e8f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ushort;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public ushort Property1 { get; set; }
+
+ public ushort Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..adcd5a9
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ushort;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public ushort Property1 { get; set; }
+
+ public ushort Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..a1e4943
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ushort;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public ushort Property1 { get; set; }
+
+ public ushort Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..c3f66d9
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Ushort/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Ushort;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public ushort Property1 { get; set; }
+
+ public ushort Property2 { get; set; }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberBoolUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberBoolUnitTest.cs
index 9e4453d..1f356c7 100644
--- a/TestProject/Test/DataAnnotations/CompareToOtherMemberBoolUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberBoolUnitTest.cs
@@ -1,6 +1,6 @@
using JMayer.Data.DataAnnotations;
using System.ComponentModel.DataAnnotations;
-using TestProject.Data.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Bool;
namespace TestProject.Test.DataAnnotations;
@@ -15,7 +15,7 @@ public class CompareToOtherMemberBoolUnitTest
[Fact]
public void VerifyEqualFailure()
{
- CompareToOtherMemberBoolEqual dataObject = new()
+ CompareToOtherMemberEqual dataObject = new()
{
Property1 = true,
Property2 = false,
@@ -25,8 +25,8 @@ public void VerifyEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = false;
dataObject.Property2 = true;
@@ -36,8 +36,8 @@ public void VerifyEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -46,7 +46,7 @@ public void VerifyEqualFailure()
[Fact]
public void VerifyEqualSuccess()
{
- CompareToOtherMemberBoolEqual dataObject = new()
+ CompareToOtherMemberEqual dataObject = new()
{
Property1 = true,
Property2 = true,
@@ -67,7 +67,7 @@ public void VerifyEqualSuccess()
[Fact]
public void VerifyNotEqualFailure()
{
- CompareToOtherMemberBoolNotEqual dataObject = new()
+ CompareToOtherMemberNotEqual dataObject = new()
{
Property1 = true,
Property2 = true,
@@ -77,8 +77,8 @@ public void VerifyNotEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = false;
dataObject.Property2 = false;
@@ -88,8 +88,8 @@ public void VerifyNotEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberBoolEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -98,7 +98,7 @@ public void VerifyNotEqualFailure()
[Fact]
public void VerifyNotEqualSuccess()
{
- CompareToOtherMemberBoolNotEqual dataObject = new()
+ CompareToOtherMemberNotEqual dataObject = new()
{
Property1 = true,
Property2 = false,
@@ -119,7 +119,7 @@ public void VerifyNotEqualSuccess()
[Fact]
public void VerifyFailureGreaterThanNotSupported()
{
- CompareToOtherMemberBoolGreaterThan dataObject = new();
+ CompareToOtherMemberGreaterThan dataObject = new();
List validationResults = dataObject.Validate();
Assert.Single(validationResults);
@@ -132,7 +132,7 @@ public void VerifyFailureGreaterThanNotSupported()
[Fact]
public void VerifyFailureGreaterThanOrEqualNotSupported()
{
- CompareToOtherMemberBoolGreaterThanOrEqual dataObject = new();
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new();
List validationResults = dataObject.Validate();
Assert.Single(validationResults);
@@ -145,7 +145,7 @@ public void VerifyFailureGreaterThanOrEqualNotSupported()
[Fact]
public void VerifyFailureLessThanNotSupported()
{
- CompareToOtherMemberBoolLessThan dataObject = new();
+ CompareToOtherMemberLessThan dataObject = new();
List validationResults = dataObject.Validate();
Assert.Single(validationResults);
@@ -158,7 +158,7 @@ public void VerifyFailureLessThanNotSupported()
[Fact]
public void VerifyFailureLessThanOrEqualNotSupported()
{
- CompareToOtherMemberBoolLessThanOrEqual dataObject = new();
+ CompareToOtherMemberLessThanOrEqual dataObject = new();
List validationResults = dataObject.Validate();
Assert.Single(validationResults);
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberByteUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberByteUnitTest.cs
index 433f9df..f6fd379 100644
--- a/TestProject/Test/DataAnnotations/CompareToOtherMemberByteUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberByteUnitTest.cs
@@ -1,5 +1,5 @@
using System.ComponentModel.DataAnnotations;
-using TestProject.Data.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Byte;
namespace TestProject.Test.DataAnnotations;
@@ -14,7 +14,7 @@ public class CompareToOtherMemberByteUnitTest
[Fact]
public void VerifyEqualFailure()
{
- CompareToOtherMemberByteEqual dataObject = new()
+ CompareToOtherMemberEqual dataObject = new()
{
Property1 = byte.MaxValue,
Property2 = byte.MinValue,
@@ -24,8 +24,8 @@ public void VerifyEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberByteEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberByteEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = byte.MinValue;
dataObject.Property2 = byte.MaxValue;
@@ -34,8 +34,8 @@ public void VerifyEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberByteEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberByteEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -44,7 +44,7 @@ public void VerifyEqualFailure()
[Fact]
public void VerifyEqualSuccess()
{
- CompareToOtherMemberByteEqual dataObject = new()
+ CompareToOtherMemberEqual dataObject = new()
{
Property1 = byte.MaxValue,
Property2 = byte.MaxValue,
@@ -64,7 +64,7 @@ public void VerifyEqualSuccess()
[Fact]
public void VerifyGreaterThanFailure()
{
- CompareToOtherMemberByteGreaterThan dataObject = new()
+ CompareToOtherMemberGreaterThan dataObject = new()
{
Property1 = byte.MinValue,
Property2 = byte.MaxValue,
@@ -74,8 +74,8 @@ public void VerifyGreaterThanFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberByteGreaterThan.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberByteGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -84,7 +84,7 @@ public void VerifyGreaterThanFailure()
[Fact]
public void VerifyGreaterThanSuccess()
{
- CompareToOtherMemberByteGreaterThan dataObject = new()
+ CompareToOtherMemberGreaterThan dataObject = new()
{
Property1 = byte.MaxValue,
Property2 = byte.MinValue,
@@ -99,7 +99,7 @@ public void VerifyGreaterThanSuccess()
[Fact]
public void VerifyGreaterThanOrEqualFailure()
{
- CompareToOtherMemberByteGreaterThanOrEqual dataObject = new()
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
{
Property1 = byte.MinValue,
Property2 = byte.MaxValue,
@@ -109,8 +109,8 @@ public void VerifyGreaterThanOrEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberByteGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberByteGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -119,7 +119,7 @@ public void VerifyGreaterThanOrEqualFailure()
[Fact]
public void VerifyGreaterThanOrEqualSuccess()
{
- CompareToOtherMemberByteGreaterThanOrEqual dataObject = new()
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
{
Property1 = byte.MaxValue,
Property2 = byte.MinValue,
@@ -139,7 +139,7 @@ public void VerifyGreaterThanOrEqualSuccess()
[Fact]
public void VerifyLessThanFailure()
{
- CompareToOtherMemberByteLessThan dataObject = new()
+ CompareToOtherMemberLessThan dataObject = new()
{
Property1 = byte.MaxValue,
Property2 = byte.MinValue,
@@ -149,8 +149,8 @@ public void VerifyLessThanFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberByteLessThan.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberByteLessThan.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -159,7 +159,7 @@ public void VerifyLessThanFailure()
[Fact]
public void VerifyLessThanSuccess()
{
- CompareToOtherMemberByteLessThan dataObject = new()
+ CompareToOtherMemberLessThan dataObject = new()
{
Property1 = byte.MinValue,
Property2 = byte.MaxValue,
@@ -174,7 +174,7 @@ public void VerifyLessThanSuccess()
[Fact]
public void VerifyLessThanOrEqualFailure()
{
- CompareToOtherMemberByteLessThanOrEqual dataObject = new()
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
{
Property1 = byte.MaxValue,
Property2 = byte.MinValue,
@@ -184,8 +184,8 @@ public void VerifyLessThanOrEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberByteLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberByteLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -194,7 +194,7 @@ public void VerifyLessThanOrEqualFailure()
[Fact]
public void VerifyLessThanOrEqualSuccess()
{
- CompareToOtherMemberByteLessThanOrEqual dataObject = new()
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
{
Property1 = byte.MinValue,
Property2 = byte.MaxValue,
@@ -214,7 +214,7 @@ public void VerifyLessThanOrEqualSuccess()
[Fact]
public void VerifyNotEqualFailure()
{
- CompareToOtherMemberByteNotEqual dataObject = new()
+ CompareToOtherMemberNotEqual dataObject = new()
{
Property1 = byte.MaxValue,
Property2 = byte.MaxValue,
@@ -224,8 +224,8 @@ public void VerifyNotEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberByteNotEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberByteNotEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = byte.MinValue;
dataObject.Property2 = byte.MinValue;
@@ -234,8 +234,8 @@ public void VerifyNotEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberByteNotEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberByteNotEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -244,7 +244,7 @@ public void VerifyNotEqualFailure()
[Fact]
public void VerifyNotEqualSuccess()
{
- CompareToOtherMemberByteNotEqual dataObject = new()
+ CompareToOtherMemberNotEqual dataObject = new()
{
Property1 = byte.MaxValue,
Property2 = byte.MinValue,
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberDecimalUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberDecimalUnitTest.cs
new file mode 100644
index 0000000..db3304a
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberDecimalUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Decimal;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the decimal data type.
+///
+public class CompareToOtherMemberDecimalUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = decimal.MaxValue,
+ Property2 = decimal.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = decimal.MinValue;
+ dataObject.Property2 = decimal.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = decimal.MaxValue,
+ Property2 = decimal.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = decimal.MinValue;
+ dataObject.Property2 = decimal.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = decimal.MinValue,
+ Property2 = decimal.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = decimal.MaxValue,
+ Property2 = decimal.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = decimal.MinValue,
+ Property2 = decimal.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = decimal.MaxValue,
+ Property2 = decimal.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = decimal.MaxValue;
+ dataObject.Property2 = decimal.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = decimal.MaxValue,
+ Property2 = decimal.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = decimal.MinValue,
+ Property2 = decimal.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = decimal.MaxValue,
+ Property2 = decimal.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = decimal.MinValue,
+ Property2 = decimal.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = decimal.MaxValue;
+ dataObject.Property2 = decimal.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = decimal.MaxValue,
+ Property2 = decimal.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = decimal.MinValue;
+ dataObject.Property2 = decimal.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = decimal.MaxValue,
+ Property2 = decimal.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = decimal.MinValue;
+ dataObject.Property2 = decimal.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberDoubleUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberDoubleUnitTest.cs
new file mode 100644
index 0000000..196fdac
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberDoubleUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Double;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the double data type.
+///
+public class CompareToOtherMemberDoubleUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = double.MaxValue,
+ Property2 = double.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = double.MinValue;
+ dataObject.Property2 = double.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = double.MaxValue,
+ Property2 = double.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = double.MinValue;
+ dataObject.Property2 = double.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = double.MinValue,
+ Property2 = double.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = double.MaxValue,
+ Property2 = double.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = double.MinValue,
+ Property2 = double.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = double.MaxValue,
+ Property2 = double.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = double.MaxValue;
+ dataObject.Property2 = double.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = double.MaxValue,
+ Property2 = double.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = double.MinValue,
+ Property2 = double.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = double.MaxValue,
+ Property2 = double.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = double.MinValue,
+ Property2 = double.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = double.MaxValue;
+ dataObject.Property2 = double.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = double.MaxValue,
+ Property2 = double.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = double.MinValue;
+ dataObject.Property2 = double.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = double.MaxValue,
+ Property2 = double.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = double.MinValue;
+ dataObject.Property2 = double.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberFloatUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberFloatUnitTest.cs
new file mode 100644
index 0000000..214b073
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberFloatUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Float;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the float data type.
+///
+public class CompareToOtherMemberFloatUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = float.MaxValue,
+ Property2 = float.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = float.MinValue;
+ dataObject.Property2 = float.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = float.MaxValue,
+ Property2 = float.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = float.MinValue;
+ dataObject.Property2 = float.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = float.MinValue,
+ Property2 = float.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = float.MaxValue,
+ Property2 = float.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = float.MinValue,
+ Property2 = float.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = float.MaxValue,
+ Property2 = float.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = float.MaxValue;
+ dataObject.Property2 = float.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = float.MaxValue,
+ Property2 = float.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = float.MinValue,
+ Property2 = float.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = float.MaxValue,
+ Property2 = float.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = float.MinValue,
+ Property2 = float.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = float.MaxValue;
+ dataObject.Property2 = float.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = float.MaxValue,
+ Property2 = float.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = float.MinValue;
+ dataObject.Property2 = float.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = float.MaxValue,
+ Property2 = float.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = float.MinValue;
+ dataObject.Property2 = float.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberIntUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberIntUnitTest.cs
new file mode 100644
index 0000000..da4cc0a
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberIntUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Int;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the int data type.
+///
+public class CompareToOtherMemberIntUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = int.MaxValue,
+ Property2 = int.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = int.MinValue;
+ dataObject.Property2 = int.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = int.MaxValue,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = int.MinValue;
+ dataObject.Property2 = int.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = int.MinValue,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = int.MaxValue,
+ Property2 = int.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = int.MinValue,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = int.MaxValue,
+ Property2 = int.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = int.MaxValue;
+ dataObject.Property2 = int.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = int.MaxValue,
+ Property2 = int.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = int.MinValue,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = int.MaxValue,
+ Property2 = int.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = int.MinValue,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = int.MaxValue;
+ dataObject.Property2 = int.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = int.MaxValue,
+ Property2 = int.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = int.MinValue;
+ dataObject.Property2 = int.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = int.MaxValue,
+ Property2 = int.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = int.MinValue;
+ dataObject.Property2 = int.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberLongUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberLongUnitTest.cs
new file mode 100644
index 0000000..799a103
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberLongUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Long;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the long data type.
+///
+public class CompareToOtherMemberLongUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = long.MaxValue,
+ Property2 = long.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = long.MinValue;
+ dataObject.Property2 = long.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = long.MaxValue,
+ Property2 = long.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = long.MinValue;
+ dataObject.Property2 = long.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = long.MinValue,
+ Property2 = long.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = long.MaxValue,
+ Property2 = long.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = long.MinValue,
+ Property2 = long.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = long.MaxValue,
+ Property2 = long.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = long.MaxValue;
+ dataObject.Property2 = long.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = long.MaxValue,
+ Property2 = long.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = long.MinValue,
+ Property2 = long.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = long.MaxValue,
+ Property2 = long.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = long.MinValue,
+ Property2 = long.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = long.MaxValue;
+ dataObject.Property2 = long.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = long.MaxValue,
+ Property2 = long.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = long.MinValue;
+ dataObject.Property2 = long.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = long.MaxValue,
+ Property2 = long.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = long.MinValue;
+ dataObject.Property2 = long.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberNullUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberNullUnitTest.cs
index 4de5674..9cbbfea 100644
--- a/TestProject/Test/DataAnnotations/CompareToOtherMemberNullUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberNullUnitTest.cs
@@ -1,5 +1,5 @@
using System.ComponentModel.DataAnnotations;
-using TestProject.Data.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Null;
namespace TestProject.Test.DataAnnotations;
@@ -14,7 +14,7 @@ public class CompareToOtherMemberNullUnitTest
[Fact]
public void VerifyEqualFailure()
{
- CompareToOtherMemberNullEqual dataObject = new()
+ CompareToOtherMemberEqual dataObject = new()
{
Property1 = null,
Property2 = int.MaxValue,
@@ -24,8 +24,8 @@ public void VerifyEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = int.MaxValue;
dataObject.Property2 = null;
@@ -35,8 +35,8 @@ public void VerifyEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -45,7 +45,7 @@ public void VerifyEqualFailure()
[Fact]
public void VerifyEqualSuccess()
{
- CompareToOtherMemberNullEqual dataObject = new()
+ CompareToOtherMemberEqual dataObject = new()
{
Property1 = null,
Property2 = null,
@@ -60,7 +60,7 @@ public void VerifyEqualSuccess()
[Fact]
public void VerifyNotEqualFailure()
{
- CompareToOtherMemberNullNotEqual dataObject = new()
+ CompareToOtherMemberNotEqual dataObject = new()
{
Property1 = null,
Property2 = null,
@@ -70,8 +70,8 @@ public void VerifyNotEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullNotEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullNotEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -80,7 +80,7 @@ public void VerifyNotEqualFailure()
[Fact]
public void VerifyNotEqualSuccess()
{
- CompareToOtherMemberNullNotEqual dataObject = new()
+ CompareToOtherMemberNotEqual dataObject = new()
{
Property1 = null,
Property2 = int.MaxValue,
@@ -101,7 +101,7 @@ public void VerifyNotEqualSuccess()
[Fact]
public void VerifyGreaterThanFailure()
{
- CompareToOtherMemberNullGreaterThan dataObject = new()
+ CompareToOtherMemberGreaterThan dataObject = new()
{
Property1 = null,
Property2 = int.MaxValue,
@@ -111,8 +111,8 @@ public void VerifyGreaterThanFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullGreaterThan.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = int.MaxValue;
dataObject.Property2 = null;
@@ -121,8 +121,8 @@ public void VerifyGreaterThanFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullGreaterThan.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -131,7 +131,7 @@ public void VerifyGreaterThanFailure()
[Fact]
public void VerifyGreaterThanOrEqualFailure()
{
- CompareToOtherMemberNullGreaterThanOrEqual dataObject = new()
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
{
Property1 = null,
Property2 = int.MaxValue,
@@ -141,8 +141,8 @@ public void VerifyGreaterThanOrEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = int.MaxValue;
dataObject.Property2 = null;
@@ -151,8 +151,8 @@ public void VerifyGreaterThanOrEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -161,7 +161,7 @@ public void VerifyGreaterThanOrEqualFailure()
[Fact]
public void VerifyLessThanFailure()
{
- CompareToOtherMemberNullLessThan dataObject = new()
+ CompareToOtherMemberLessThan dataObject = new()
{
Property1 = null,
Property2 = int.MaxValue,
@@ -171,8 +171,8 @@ public void VerifyLessThanFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullLessThan.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullLessThan.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = int.MaxValue;
dataObject.Property2 = null;
@@ -181,8 +181,8 @@ public void VerifyLessThanFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullLessThan.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullLessThan.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -191,7 +191,7 @@ public void VerifyLessThanFailure()
[Fact]
public void VerifyLessThanOrEqualFailure()
{
- CompareToOtherMemberNullLessThanOrEqual dataObject = new()
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
{
Property1 = null,
Property2 = int.MaxValue,
@@ -201,8 +201,8 @@ public void VerifyLessThanOrEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = int.MaxValue;
dataObject.Property2 = null;
@@ -211,7 +211,7 @@ public void VerifyLessThanOrEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberNullLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberNullLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
}
}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberSbyteUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberSbyteUnitTest.cs
new file mode 100644
index 0000000..b6cfcc3
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberSbyteUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Sbyte;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the sbyte data type.
+///
+public class CompareToOtherMemberSsbyteUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = sbyte.MaxValue,
+ Property2 = sbyte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = sbyte.MinValue;
+ dataObject.Property2 = sbyte.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = sbyte.MaxValue,
+ Property2 = sbyte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = sbyte.MinValue;
+ dataObject.Property2 = sbyte.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = sbyte.MinValue,
+ Property2 = sbyte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = sbyte.MaxValue,
+ Property2 = sbyte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = sbyte.MinValue,
+ Property2 = sbyte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = sbyte.MaxValue,
+ Property2 = sbyte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = sbyte.MaxValue;
+ dataObject.Property2 = sbyte.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = sbyte.MaxValue,
+ Property2 = sbyte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = sbyte.MinValue,
+ Property2 = sbyte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = sbyte.MaxValue,
+ Property2 = sbyte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = sbyte.MinValue,
+ Property2 = sbyte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = sbyte.MaxValue;
+ dataObject.Property2 = sbyte.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = sbyte.MaxValue,
+ Property2 = sbyte.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = sbyte.MinValue;
+ dataObject.Property2 = sbyte.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = sbyte.MaxValue,
+ Property2 = sbyte.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = sbyte.MinValue;
+ dataObject.Property2 = sbyte.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberShortUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberShortUnitTest.cs
new file mode 100644
index 0000000..29ff014
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberShortUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Short;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the short data type.
+///
+public class CompareToOtherMemberShortUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = short.MaxValue,
+ Property2 = short.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = short.MinValue;
+ dataObject.Property2 = short.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = short.MaxValue,
+ Property2 = short.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = short.MinValue;
+ dataObject.Property2 = short.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = short.MinValue,
+ Property2 = short.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = short.MaxValue,
+ Property2 = short.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = short.MinValue,
+ Property2 = short.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = short.MaxValue,
+ Property2 = short.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = short.MaxValue;
+ dataObject.Property2 = short.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = short.MaxValue,
+ Property2 = short.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = short.MinValue,
+ Property2 = short.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = short.MaxValue,
+ Property2 = short.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = short.MinValue,
+ Property2 = short.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = short.MaxValue;
+ dataObject.Property2 = short.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = short.MaxValue,
+ Property2 = short.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = short.MinValue;
+ dataObject.Property2 = short.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = short.MaxValue,
+ Property2 = short.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = short.MinValue;
+ dataObject.Property2 = short.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberStringUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberStringUnitTest.cs
index 987a826..90ec4c1 100644
--- a/TestProject/Test/DataAnnotations/CompareToOtherMemberStringUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberStringUnitTest.cs
@@ -1,6 +1,6 @@
using JMayer.Data.DataAnnotations;
using System.ComponentModel.DataAnnotations;
-using TestProject.Data.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.String;
namespace TestProject.Test.DataAnnotations;
@@ -25,7 +25,7 @@ public class CompareToOtherMemberStringUnitTest
[Fact]
public void VerifyEqualFailure()
{
- CompareToOtherMemberStringEqual dataObject = new()
+ CompareToOtherMemberEqual dataObject = new()
{
Property1 = AString,
Property2 = DifferentString,
@@ -35,8 +35,8 @@ public void VerifyEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = DifferentString;
dataObject.Property2 = AString;
@@ -46,8 +46,8 @@ public void VerifyEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -56,7 +56,7 @@ public void VerifyEqualFailure()
[Fact]
public void VerifyEqualSuccess()
{
- CompareToOtherMemberStringEqual dataObject = new()
+ CompareToOtherMemberEqual dataObject = new()
{
Property1 = AString,
Property2 = AString,
@@ -77,7 +77,7 @@ public void VerifyEqualSuccess()
[Fact]
public void VerifyNotEqualFailure()
{
- CompareToOtherMemberStringNotEqual dataObject = new()
+ CompareToOtherMemberNotEqual dataObject = new()
{
Property1 = AString,
Property2 = AString,
@@ -87,8 +87,8 @@ public void VerifyNotEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
dataObject.Property1 = DifferentString;
dataObject.Property2 = DifferentString;
@@ -98,8 +98,8 @@ public void VerifyNotEqualFailure()
Assert.Single(validationResults);
//Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
Assert.Equal(2, validationResults[0].MemberNames.Count());
- Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property1), validationResults[0].MemberNames.First());
- Assert.Equal(nameof(CompareToOtherMemberStringEqual.Property2), validationResults[0].MemberNames.Last());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
}
///
@@ -108,7 +108,7 @@ public void VerifyNotEqualFailure()
[Fact]
public void VerifyNotEqualSuccess()
{
- CompareToOtherMemberStringNotEqual dataObject = new()
+ CompareToOtherMemberNotEqual dataObject = new()
{
Property1 = AString,
Property2 = DifferentString,
@@ -129,7 +129,7 @@ public void VerifyNotEqualSuccess()
[Fact]
public void VerifyFailureGreaterThanNotSupported()
{
- CompareToOtherMemberStringGreaterThan dataObject = new()
+ CompareToOtherMemberGreaterThan dataObject = new()
{
Property1 = AString,
Property2 = DifferentString,
@@ -146,7 +146,7 @@ public void VerifyFailureGreaterThanNotSupported()
[Fact]
public void VerifyFailureGreaterThanOrEqualNotSupported()
{
- CompareToOtherMemberStringGreaterThanOrEqual dataObject = new()
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
{
Property1 = AString,
Property2 = DifferentString,
@@ -163,7 +163,7 @@ public void VerifyFailureGreaterThanOrEqualNotSupported()
[Fact]
public void VerifyFailureLessThanNotSupported()
{
- CompareToOtherMemberStringLessThan dataObject = new()
+ CompareToOtherMemberLessThan dataObject = new()
{
Property1 = AString,
Property2 = DifferentString,
@@ -180,7 +180,7 @@ public void VerifyFailureLessThanNotSupported()
[Fact]
public void VerifyFailureLessThanOrEqualNotSupported()
{
- CompareToOtherMemberStringLessThanOrEqual dataObject = new()
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
{
Property1 = AString,
Property2 = DifferentString,
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberUintUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberUintUnitTest.cs
new file mode 100644
index 0000000..baf21cd
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberUintUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Uint;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the uint data type.
+///
+public class CompareToOtherMemberUuintUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = uint.MaxValue,
+ Property2 = uint.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = uint.MinValue;
+ dataObject.Property2 = uint.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = uint.MaxValue,
+ Property2 = uint.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = uint.MinValue;
+ dataObject.Property2 = uint.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = uint.MinValue,
+ Property2 = uint.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = uint.MaxValue,
+ Property2 = uint.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = uint.MinValue,
+ Property2 = uint.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = uint.MaxValue,
+ Property2 = uint.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = uint.MaxValue;
+ dataObject.Property2 = uint.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = uint.MaxValue,
+ Property2 = uint.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = uint.MinValue,
+ Property2 = uint.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = uint.MaxValue,
+ Property2 = uint.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = uint.MinValue,
+ Property2 = uint.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = uint.MaxValue;
+ dataObject.Property2 = uint.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = uint.MaxValue,
+ Property2 = uint.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = uint.MinValue;
+ dataObject.Property2 = uint.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = uint.MaxValue,
+ Property2 = uint.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = uint.MinValue;
+ dataObject.Property2 = uint.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberUlongUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberUlongUnitTest.cs
new file mode 100644
index 0000000..ef60e00
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberUlongUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Ulong;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the ulong data type.
+///
+public class CompareToOtherMemberUulongUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = ulong.MaxValue,
+ Property2 = ulong.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = ulong.MinValue;
+ dataObject.Property2 = ulong.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = ulong.MaxValue,
+ Property2 = ulong.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = ulong.MinValue;
+ dataObject.Property2 = ulong.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = ulong.MinValue,
+ Property2 = ulong.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = ulong.MaxValue,
+ Property2 = ulong.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = ulong.MinValue,
+ Property2 = ulong.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = ulong.MaxValue,
+ Property2 = ulong.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = ulong.MaxValue;
+ dataObject.Property2 = ulong.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = ulong.MaxValue,
+ Property2 = ulong.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = ulong.MinValue,
+ Property2 = ulong.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = ulong.MaxValue,
+ Property2 = ulong.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = ulong.MinValue,
+ Property2 = ulong.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = ulong.MaxValue;
+ dataObject.Property2 = ulong.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = ulong.MaxValue,
+ Property2 = ulong.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = ulong.MinValue;
+ dataObject.Property2 = ulong.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = ulong.MaxValue,
+ Property2 = ulong.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = ulong.MinValue;
+ dataObject.Property2 = ulong.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
index b88394a..7c0b571 100644
--- a/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
@@ -1,6 +1,6 @@
using JMayer.Data.DataAnnotations;
using System.ComponentModel.DataAnnotations;
-using TestProject.Data.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers;
namespace TestProject.Test.DataAnnotations;
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberUshortUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberUshortUnitTest.cs
new file mode 100644
index 0000000..27b9269
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberUshortUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Ushort;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the ushort data type.
+///
+public class CompareToOtherMemberUushortUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = ushort.MaxValue,
+ Property2 = ushort.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = ushort.MinValue;
+ dataObject.Property2 = ushort.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = ushort.MaxValue,
+ Property2 = ushort.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = ushort.MinValue;
+ dataObject.Property2 = ushort.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = ushort.MinValue,
+ Property2 = ushort.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = ushort.MaxValue,
+ Property2 = ushort.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = ushort.MinValue,
+ Property2 = ushort.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = ushort.MaxValue,
+ Property2 = ushort.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = ushort.MaxValue;
+ dataObject.Property2 = ushort.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = ushort.MaxValue,
+ Property2 = ushort.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = ushort.MinValue,
+ Property2 = ushort.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = ushort.MaxValue,
+ Property2 = ushort.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = ushort.MinValue,
+ Property2 = ushort.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = ushort.MaxValue;
+ dataObject.Property2 = ushort.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = ushort.MaxValue,
+ Property2 = ushort.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = ushort.MinValue;
+ dataObject.Property2 = ushort.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = ushort.MaxValue,
+ Property2 = ushort.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = ushort.MinValue;
+ dataObject.Property2 = ushort.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
From 51bdbeaafcd5a7d8d9e4e3160184d561434d13a3 Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Tue, 17 Mar 2026 10:08:17 -0400
Subject: [PATCH 08/19] Added null ignore in unit tests
---
.../CompareToOtherMemberUnitTest.cs | 2 +-
.../RequiredDependsOnUnitTest.cs | 4 ++--
.../Database/StandardCRUDDataLayerUnitTest.cs | 24 +++++++++----------
.../HTTP/StandardCRUDDataLayerUnitTest.cs | 10 ++++----
.../HTTP/StandardSubCRUDDataLayerUnitTest.cs | 8 +++----
5 files changed, 24 insertions(+), 24 deletions(-)
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
index 7c0b571..f293b91 100644
--- a/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberUnitTest.cs
@@ -16,7 +16,7 @@ public class CompareToOtherMemberUnitTest
/// The method verifies an argument null exception is thrown when null is passed into the constructor for the conditionValue parameter.
///
[Fact]
- public void VerifyConstructorThrowsArgumentNullExceptionForOtherMemberNameParameter() => Assert.Throws(() => new CompareToOtherMemberAttribute(null, ComparisonOperation.Equal));
+ public void VerifyConstructorThrowsArgumentNullExceptionForOtherMemberNameParameter() => Assert.Throws(() => new CompareToOtherMemberAttribute(null!, ComparisonOperation.Equal));
///
/// The method verifies a failure when the types are invalid.
diff --git a/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs b/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
index ef5dc63..5f348f5 100644
--- a/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
+++ b/TestProject/Test/DataAnnotations/RequiredDependsOnUnitTest.cs
@@ -16,7 +16,7 @@ public class RequiredDependsOnUnitTest
/// The method verifies an argument null exception is thrown when null is passed into the constructor for the conditionValue parameter.
///
[Fact]
- public void VerifyConstructorThrowsArgumentNullExceptionForConditionValueParameter() => Assert.Throws(() => new RequiredDependsOnAttribute("A Member", null));
+ public void VerifyConstructorThrowsArgumentNullExceptionForConditionValueParameter() => Assert.Throws(() => new RequiredDependsOnAttribute("A Member", null!));
///
/// The method verifies an argument exception is thrown when an empty string is passed into the constructor for the dependentMemberName parameter.
@@ -28,7 +28,7 @@ public class RequiredDependsOnUnitTest
/// The method verifies an argument null exception is thrown when null is passed into the constructor for the dependentMemberName parameter.
///
[Fact]
- public void VerifyConstructorThrowsArgumentNullExceptionForDependentMemberNameParameter() => Assert.Throws(() => new RequiredDependsOnAttribute(null, true));
+ public void VerifyConstructorThrowsArgumentNullExceptionForDependentMemberNameParameter() => Assert.Throws(() => new RequiredDependsOnAttribute(null!, true));
///
/// The method verifies a failure when the types are invalid.
diff --git a/TestProject/Test/Database/StandardCRUDDataLayerUnitTest.cs b/TestProject/Test/Database/StandardCRUDDataLayerUnitTest.cs
index 6bc14f0..3765058 100644
--- a/TestProject/Test/Database/StandardCRUDDataLayerUnitTest.cs
+++ b/TestProject/Test/Database/StandardCRUDDataLayerUnitTest.cs
@@ -90,7 +90,7 @@ public async Task VerifyCount()
/// The method verifies if a null data object is passed to the StandardCRUDDataLayer.CountAsync(), an exception is thrown.
///
[Fact]
- public async Task VerifyCountThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().CountAsync(null));
+ public async Task VerifyCountThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().CountAsync(null!));
///
/// The method verifies the StandardCRUDDataLayer.CountAsync() will return a count for a where predicate.
@@ -137,8 +137,8 @@ await Assert.RaisesAsync
[Fact]
public async Task VerifyCreateThrowsArgumentNullException()
{
- await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().CreateAsync((SimpleDataObject)null));
- await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().CreateAsync((List)null));
+ await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().CreateAsync((SimpleDataObject)null!));
+ await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().CreateAsync((List)null!));
}
///
@@ -307,9 +307,9 @@ async Task () =>
[Fact]
public async Task VerifyDeleteThrowsArgumentNullException()
{
- await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().DeleteAsync((SimpleDataObject)null));
- await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().DeleteAsync((List)null));
- await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().DeleteAsync((Expression>)null));
+ await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().DeleteAsync((SimpleDataObject)null!));
+ await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().DeleteAsync((List)null!));
+ await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().DeleteAsync((Expression>)null!));
}
///
@@ -389,7 +389,7 @@ public async Task VerifyDeleteWithWherePredicate()
/// The method verifies if a null data object is passed to the StandardCRUDDataLayer.ExistAsync(), an exception is thrown.
///
[Fact]
- public async Task VerifyExistThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().ExistAsync(null));
+ public async Task VerifyExistThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().ExistAsync(null!));
///
/// The method verifies StandardCRUDDataLayer.ExistAsync() can determine if a data object exists or not.
@@ -677,13 +677,13 @@ public async Task VerifyGetPageListView()
/// The method verifies if a null data object is passed to the StandardCRUDDataLayer.GetPageListViewAsync(), an exception is thrown.
///
[Fact]
- public async Task VerifyGetPageListViewThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().GetPageListViewAsync(null));
+ public async Task VerifyGetPageListViewThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().GetPageListViewAsync(null!));
///
/// The method verifies if a null data object is passed to the StandardCRUDDataLayer.GetPageAsync(), an exception is thrown.
///
[Fact]
- public async Task VerifyGetPageThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().GetPageAsync(null));
+ public async Task VerifyGetPageThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().GetPageAsync(null!));
///
/// The method verifies StandardCRUDDataLayer.GetSingleAsync() returns the first data object.
@@ -783,8 +783,8 @@ async Task () =>
[Fact]
public async Task VerifyUpdateThrowsArgumentNullException()
{
- await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().UpdateAsync((SimpleDataObject)null));
- await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().UpdateAsync((List)null));
+ await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().UpdateAsync((SimpleDataObject)null!));
+ await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().UpdateAsync((List)null!));
}
///
@@ -1039,5 +1039,5 @@ public async Task VerifyValidateUniqueName()
/// The method verifies if a null data object is passed to the StandardCRUDDataLayer.ValidateAsync(), an exception is thrown.
///
[Fact]
- public async Task VerifyValidateThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().ValidateAsync(null));
+ public async Task VerifyValidateThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleStandardDataLayer().ValidateAsync(null!));
}
diff --git a/TestProject/Test/HTTP/StandardCRUDDataLayerUnitTest.cs b/TestProject/Test/HTTP/StandardCRUDDataLayerUnitTest.cs
index be2a3cc..37d0887 100644
--- a/TestProject/Test/HTTP/StandardCRUDDataLayerUnitTest.cs
+++ b/TestProject/Test/HTTP/StandardCRUDDataLayerUnitTest.cs
@@ -234,7 +234,7 @@ public async Task VerifyCreate(HttpStatusCode httpStatusCode)
///
/// A Task object for the async.
[Fact]
- public async Task VerifyCreateThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().CreateAsync(null));
+ public async Task VerifyCreateThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().CreateAsync(null!));
///
/// The method verifies if StandardCRUDDataLayer.CreateAsync() receives an empty string in the response, an exception is thrown.
@@ -380,7 +380,7 @@ public async Task VerifyDelete(HttpStatusCode httpStatusCode)
///
/// A Task object for the async.
[Fact]
- public async Task VerifyDeleteThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().DeleteAsync(null));
+ public async Task VerifyDeleteThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().DeleteAsync(null!));
///
/// The method verifies the StandardCRUDDataLayer.GetAllAsync() request and response based on the status code.
@@ -688,14 +688,14 @@ public async Task VerifyGetPageListView(HttpStatusCode httpStatusCode)
///
/// A Task object for the async.
[Fact]
- public async Task VerifyGetPageThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().GetPageAsync(null));
+ public async Task VerifyGetPageThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().GetPageAsync(null!));
///
/// The method confirms if a null query definition is passed to the StandardCRUDDataLayer.GetPageListViewAsync(), an exception is thrown.
///
/// A Task object for the async.
[Fact]
- public async Task VerifyGetPageListViewThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().GetPageListViewAsync(null));
+ public async Task VerifyGetPageListViewThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().GetPageListViewAsync(null!));
///
/// The method verifies the StandardCRUDDataLayer.GetSingleAsync() request and response based on the status code.
@@ -932,7 +932,7 @@ public async Task VerifyUpdate(HttpStatusCode httpStatusCode)
///
/// A Task object for the async.
[Fact]
- public async Task VerifyUpdateThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().UpdateAsync(null));
+ public async Task VerifyUpdateThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleDataLayer().UpdateAsync(null!));
///
/// The method verifies if StandardCRUDDataLayer.UpdateAsync() receives an empty string in the response, an exception is thrown.
diff --git a/TestProject/Test/HTTP/StandardSubCRUDDataLayerUnitTest.cs b/TestProject/Test/HTTP/StandardSubCRUDDataLayerUnitTest.cs
index dddf843..f0331bd 100644
--- a/TestProject/Test/HTTP/StandardSubCRUDDataLayerUnitTest.cs
+++ b/TestProject/Test/HTTP/StandardSubCRUDDataLayerUnitTest.cs
@@ -281,14 +281,14 @@ public async Task VerifyGetPage(HttpStatusCode httpStatusCode)
///
/// A Task object for the async.
[Fact]
- public async Task VerifyGetPageThrowsArgumentException() => await Assert.ThrowsAsync(() => new SimpleSubDataLayer().GetPageAsync(string.Empty, null));
+ public async Task VerifyGetPageThrowsArgumentException() => await Assert.ThrowsAsync(() => new SimpleSubDataLayer().GetPageAsync(string.Empty, null!));
///
/// The method verifies if a null query definition is passed to the StandardSubCRUDDataLayer.GetPageAsync(), an exception is thrown.
///
/// A Task object for the async.
[Fact]
- public async Task VerifyGetPageThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleSubDataLayer().GetPageAsync(1, null));
+ public async Task VerifyGetPageThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleSubDataLayer().GetPageAsync(1, null!));
///
/// The method verifies the StandardSubCRUDDataLayer.GetPageListViewAsync() request and response based on the status code.
@@ -394,12 +394,12 @@ public async Task VerifyGetPageListView(HttpStatusCode httpStatusCode)
///
/// A Task object for the async.
[Fact]
- public async Task VerifyGetPageListViewThrowsArgumentException() => await Assert.ThrowsAsync(() => new SimpleSubDataLayer().GetPageListViewAsync(string.Empty, null));
+ public async Task VerifyGetPageListViewThrowsArgumentException() => await Assert.ThrowsAsync(() => new SimpleSubDataLayer().GetPageListViewAsync(string.Empty, null!));
///
/// The method verifies if a null query definition is passed to the StandardSubCRUDDataLayer.GetPageListViewAsync(), an exception is thrown.
///
/// A Task object for the async.
[Fact]
- public async Task VerifyGetPageListViewThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleSubDataLayer().GetPageListViewAsync(1, null));
+ public async Task VerifyGetPageListViewThrowsArgumentNullException() => await Assert.ThrowsAsync(() => new SimpleSubDataLayer().GetPageListViewAsync(1, null!));
}
From 95e8e84bea59f18c0bca46decc79f05ff226f6ae Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Tue, 17 Mar 2026 10:08:41 -0400
Subject: [PATCH 09/19] Added DateTime & DateTimeOffset unit tests
---
.../DateTime/CompareToOtherMemberEqual.cs | 15 +
.../CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../DateTime/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../DateTime/CompareToOtherMemberNotEqual.cs | 15 +
.../CompareToOtherMemberEqual.cs | 15 +
.../CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../CompareToOtherMemberNotEqual.cs | 15 +
...pareToOtherMemberDateTimeOffsetUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberDateTimeUnitTest.cs | 260 ++++++++++++++++++
14 files changed, 700 insertions(+)
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberDateTimeOffsetUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberDateTimeUnitTest.cs
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..ed8afce
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTime;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public System.DateTime Property1 { get; set; }
+
+ public System.DateTime Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..f84b9a0
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTime;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public System.DateTime Property1 { get; set; }
+
+ public System.DateTime Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..7aef591
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTime;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public System.DateTime Property1 { get; set; }
+
+ public System.DateTime Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..4aa9daa
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTime;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public System.DateTime Property1 { get; set; }
+
+ public System.DateTime Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..48725c1
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTime;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public System.DateTime Property1 { get; set; }
+
+ public System.DateTime Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..ac5cbe6
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTime/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTime;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public System.DateTime Property1 { get; set; }
+
+ public System.DateTime Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..86a8c93
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTimeOffset;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public System.DateTimeOffset Property1 { get; set; }
+
+ public System.DateTimeOffset Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..db26af3
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTimeOffset;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public System.DateTimeOffset Property1 { get; set; }
+
+ public System.DateTimeOffset Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..db97a5e
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTimeOffset;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public System.DateTimeOffset Property1 { get; set; }
+
+ public System.DateTimeOffset Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..849e804
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTimeOffset;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public System.DateTimeOffset Property1 { get; set; }
+
+ public System.DateTimeOffset Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..46c57f0
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTimeOffset;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public System.DateTimeOffset Property1 { get; set; }
+
+ public System.DateTimeOffset Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..2bf5cad
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateTimeOffset/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTimeOffset;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public System.DateTimeOffset Property1 { get; set; }
+
+ public System.DateTimeOffset Property2 { get; set; }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberDateTimeOffsetUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberDateTimeOffsetUnitTest.cs
new file mode 100644
index 0000000..bcd7d33
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberDateTimeOffsetUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTimeOffset;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the DateTimeOffset data type.
+///
+public class CompareToOtherMemberDateTimeOffsetUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MaxValue,
+ Property2 = System.DateTimeOffset.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = System.DateTimeOffset.MinValue;
+ dataObject.Property2 = System.DateTimeOffset.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MaxValue,
+ Property2 = System.DateTimeOffset.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateTimeOffset.MinValue;
+ dataObject.Property2 = System.DateTimeOffset.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MinValue,
+ Property2 = System.DateTimeOffset.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MaxValue,
+ Property2 = System.DateTimeOffset.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MinValue,
+ Property2 = System.DateTimeOffset.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MaxValue,
+ Property2 = System.DateTimeOffset.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateTimeOffset.MaxValue;
+ dataObject.Property2 = System.DateTimeOffset.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MaxValue,
+ Property2 = System.DateTimeOffset.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MinValue,
+ Property2 = System.DateTimeOffset.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MaxValue,
+ Property2 = System.DateTimeOffset.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MinValue,
+ Property2 = System.DateTimeOffset.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateTimeOffset.MaxValue;
+ dataObject.Property2 = System.DateTimeOffset.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MaxValue,
+ Property2 = System.DateTimeOffset.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = System.DateTimeOffset.MinValue;
+ dataObject.Property2 = System.DateTimeOffset.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = System.DateTimeOffset.MaxValue,
+ Property2 = System.DateTimeOffset.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateTimeOffset.MinValue;
+ dataObject.Property2 = System.DateTimeOffset.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberDateTimeUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberDateTimeUnitTest.cs
new file mode 100644
index 0000000..25f3899
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberDateTimeUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.DateTime;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the DateTime data type.
+///
+public class CompareToOtherMemberDateTimeUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = System.DateTime.MaxValue,
+ Property2 = System.DateTime.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = System.DateTime.MinValue;
+ dataObject.Property2 = System.DateTime.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = System.DateTime.MaxValue,
+ Property2 = System.DateTime.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateTime.MinValue;
+ dataObject.Property2 = System.DateTime.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = System.DateTime.MinValue,
+ Property2 = System.DateTime.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the prperty 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanSuccess()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = System.DateTime.MaxValue,
+ Property2 = System.DateTime.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualFailure()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = System.DateTime.MinValue,
+ Property2 = System.DateTime.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is greater than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanOrEqualSuccess()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = System.DateTime.MaxValue,
+ Property2 = System.DateTime.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateTime.MaxValue;
+ dataObject.Property2 = System.DateTime.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanFailure()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = System.DateTime.MaxValue,
+ Property2 = System.DateTime.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanSuccess()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = System.DateTime.MinValue,
+ Property2 = System.DateTime.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is greater than property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualFailure()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = System.DateTime.MaxValue,
+ Property2 = System.DateTime.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberLessThanOrEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the property 1 is less than or equal property 2.
+ ///
+ [Fact]
+ public void VerifyLessThanOrEqualSuccess()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = System.DateTime.MinValue,
+ Property2 = System.DateTime.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateTime.MaxValue;
+ dataObject.Property2 = System.DateTime.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = System.DateTime.MaxValue,
+ Property2 = System.DateTime.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = System.DateTime.MinValue;
+ dataObject.Property2 = System.DateTime.MinValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberNotEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = System.DateTime.MaxValue,
+ Property2 = System.DateTime.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateTime.MinValue;
+ dataObject.Property2 = System.DateTime.MaxValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+}
From 5eea480433316f0ae048f28815c60ec047db0ba6 Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Tue, 17 Mar 2026 10:09:05 -0400
Subject: [PATCH 10/19] Added handling for DateOnly & TimeOnly
---
.../CompareToOtherMemberAttribute.cs | 50 ++++++++++++++++++-
1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
index 4fa080b..5165f76 100644
--- a/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
+++ b/JMayer.Data/DataAnnotations/CompareToOtherMemberAttribute.cs
@@ -6,7 +6,7 @@ namespace JMayer.Data.DataAnnotations;
///
/// The class does a value comparison with the member the attribute is registered too and another member on the
/// same instance being validated. The following types are supported: bool, byte, sbyte, short, ushort, int, uint, long,
-/// ulong, float, double, decimal, char, string, DateTime, DateOffset, Timespan and Enum. The following comparison
+/// ulong, float, double, decimal, char, string, DateTime, DateOffset, DateOnly, TimeOnly, Timespan and Enum. The following comparison
/// operations are suppored: ==, !=, <, <=, >, and >=; bool, char, string and Enum only support == and !=.
///
///
@@ -156,6 +156,26 @@ private bool CheckDateValues(DateTimeOffset registeredMemberValue, DateTimeOffse
};
}
+ ///
+ /// The method returns if the date values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckDateValues(DateOnly registeredMemberValue, DateOnly otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
///
/// The method returns if the decimal values pass the comparison.
///
@@ -265,6 +285,26 @@ private bool CheckStringValues(string registeredMemberValue, string otherMemberV
};
}
+ ///
+ /// The method returns if the time values pass the comparison.
+ ///
+ /// The value of the member the attribute is registered too.
+ /// The value of the other member.
+ /// True means the comparison passed.
+ private bool CheckTimeValues(TimeOnly registeredMemberValue, TimeOnly otherMemberValue)
+ {
+ return _comparisonOperation switch
+ {
+ ComparisonOperation.Equal => registeredMemberValue == otherMemberValue,
+ ComparisonOperation.GreaterThan => registeredMemberValue > otherMemberValue,
+ ComparisonOperation.GreaterThanOrEqual => registeredMemberValue >= otherMemberValue,
+ ComparisonOperation.LessThan => registeredMemberValue < otherMemberValue,
+ ComparisonOperation.LessThanOrEqual => registeredMemberValue <= otherMemberValue,
+ ComparisonOperation.NotEqual => registeredMemberValue != otherMemberValue,
+ _ => false
+ };
+ }
+
///
/// The method returns if the time values pass the comparison.
///
@@ -385,6 +425,14 @@ private bool CheckUnsignedIntegerValues(ulong registeredMemberValue, ulong other
{
success = CheckDateValues(registeredMemberDateOffsetValue, otherMemberDateOffsetValue);
}
+ else if (value is DateOnly registeredMemberDateOnlyValue && otherMemberValue is DateOnly otherMemberDateOnlyValue)
+ {
+ success = CheckDateValues(registeredMemberDateOnlyValue, otherMemberDateOnlyValue);
+ }
+ else if (value is TimeOnly registeredMemberTimeOnlyValue && otherMemberValue is TimeOnly otherMemberTimeOnlyValue)
+ {
+ success = CheckTimeValues(registeredMemberTimeOnlyValue, otherMemberTimeOnlyValue);
+ }
else if (value is TimeSpan registeredMemberTimeValue && otherMemberValue is TimeSpan otherMemberTimeValue)
{
success = CheckTimeValues(registeredMemberTimeValue, otherMemberTimeValue);
From dc039894dd1dbe4d595a4bf58cd3e6718a99c896 Mon Sep 17 00:00:00 2001
From: jmayer913 <72579603+jmayer913@users.noreply.github.com>
Date: Tue, 17 Mar 2026 10:45:28 -0400
Subject: [PATCH 11/19] Unit Tests
---
.../Char/CompareToOtherMemberEqual.cs | 12 +
.../Char/CompareToOtherMemberGreaterThan.cs | 12 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 12 +
.../Char/CompareToOtherMemberLessThan.cs | 12 +
.../CompareToOtherMemberLessThanOrEqual.cs | 12 +
.../Char/CompareToOtherMemberNotEqual.cs | 12 +
.../DateOnly/CompareToOtherMemberEqual.cs | 15 +
.../CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../DateOnly/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../DateOnly/CompareToOtherMemberNotEqual.cs | 15 +
.../Enum/CompareToOtherMemberEqual.cs | 12 +
.../Enum/CompareToOtherMemberGreaterThan.cs | 12 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 12 +
.../Enum/CompareToOtherMemberLessThan.cs | 12 +
.../CompareToOtherMemberLessThanOrEqual.cs | 12 +
.../Enum/CompareToOtherMemberNotEqual.cs | 12 +
.../Enum/CompareToOtherMemberTypeMismatch.cs | 15 +
.../CompareToOtherMembers/Enum/TestEnum.cs | 10 +
.../TimeOnly/CompareToOtherMemberEqual.cs | 15 +
.../CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../TimeOnly/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../TimeOnly/CompareToOtherMemberNotEqual.cs | 15 +
.../TimeSpan/CompareToOtherMemberEqual.cs | 15 +
.../CompareToOtherMemberGreaterThan.cs | 15 +
.../CompareToOtherMemberGreaterThanOrEqual.cs | 15 +
.../TimeSpan/CompareToOtherMemberLessThan.cs | 15 +
.../CompareToOtherMemberLessThanOrEqual.cs | 15 +
.../TimeSpan/CompareToOtherMemberNotEqual.cs | 15 +
.../CompareToOtherMemberCharUnitTest.cs | 183 ++++++++++++
.../CompareToOtherMemberDateOnlyUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberEnumUnitTest.cs | 196 +++++++++++++
.../CompareToOtherMemberTimeOnlyUnitTest.cs | 260 ++++++++++++++++++
.../CompareToOtherMemberTimeSpanUnitTest.cs | 260 ++++++++++++++++++
37 files changed, 1598 insertions(+)
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberTypeMismatch.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/TestEnum.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberGreaterThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberGreaterThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberLessThan.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberLessThanOrEqual.cs
create mode 100644 TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberNotEqual.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberCharUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberDateOnlyUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberEnumUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberTimeOnlyUnitTest.cs
create mode 100644 TestProject/Test/DataAnnotations/CompareToOtherMemberTimeSpanUnitTest.cs
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..ef2ad35
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Char;
+
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public char Property1 { get; set; }
+
+ public char Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..de2eeb3
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Char;
+
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public char Property1 { get; set; }
+
+ public char Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..e1ffecd
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Char;
+
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public char Property1 { get; set; }
+
+ public char Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..c8f5cd6
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Char;
+
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public char Property1 { get; set; }
+
+ public char Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..8649d19
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Char;
+
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public char Property1 { get; set; }
+
+ public char Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..929814d
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Char/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Char;
+
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public char Property1 { get; set; }
+
+ public char Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..ca90617
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public System.DateOnly Property1 { get; set; }
+
+ public System.DateOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..5be7ee5
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public System.DateOnly Property1 { get; set; }
+
+ public System.DateOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..e525869
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public System.DateOnly Property1 { get; set; }
+
+ public System.DateOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..c1d2958
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public System.DateOnly Property1 { get; set; }
+
+ public System.DateOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..a852946
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public System.DateOnly Property1 { get; set; }
+
+ public System.DateOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..7a68db5
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/DateOnly/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.DateOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public System.DateOnly Property1 { get; set; }
+
+ public System.DateOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..ff2a5e9
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Enum;
+
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public TestEnum Property1 { get; set; }
+
+ public TestEnum Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..7fbff3f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Enum;
+
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public TestEnum Property1 { get; set; }
+
+ public TestEnum Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..e245466
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Enum;
+
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public TestEnum Property1 { get; set; }
+
+ public TestEnum Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..e042b27
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Enum;
+
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public TestEnum Property1 { get; set; }
+
+ public TestEnum Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..cab8b8f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Enum;
+
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public TestEnum Property1 { get; set; }
+
+ public TestEnum Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..cddf2cc
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,12 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Enum;
+
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public TestEnum Property1 { get; set; }
+
+ public TestEnum Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberTypeMismatch.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberTypeMismatch.cs
new file mode 100644
index 0000000..dcddf46
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/CompareToOtherMemberTypeMismatch.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Enum;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when the type is invalid.
+///
+internal class CompareToOtherMemberTypeMismatch : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public TestEnum Property1 { get; set; } = new();
+
+ public ConditionalEnum Property2 { get; set; } = new();
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/TestEnum.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/TestEnum.cs
new file mode 100644
index 0000000..726b66d
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/Enum/TestEnum.cs
@@ -0,0 +1,10 @@
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.Enum;
+
+///
+/// An enumeration used by the CompareToOtherMember tests.
+///
+internal enum TestEnum
+{
+ Value1,
+ Value2
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..9ae253c
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public System.TimeOnly Property1 { get; set; }
+
+ public System.TimeOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..cf9aa2f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public System.TimeOnly Property1 { get; set; }
+
+ public System.TimeOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..09744bb
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public System.TimeOnly Property1 { get; set; }
+
+ public System.TimeOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..461e999
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public System.TimeOnly Property1 { get; set; }
+
+ public System.TimeOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..10d07b2
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public System.TimeOnly Property1 { get; set; }
+
+ public System.TimeOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..0313a99
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeOnly/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeOnly;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public System.TimeOnly Property1 { get; set; }
+
+ public System.TimeOnly Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberEqual.cs
new file mode 100644
index 0000000..9fb074f
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeSpan;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be equal.
+///
+internal class CompareToOtherMemberEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.Equal)]
+ public System.TimeSpan Property1 { get; set; }
+
+ public System.TimeSpan Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberGreaterThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberGreaterThan.cs
new file mode 100644
index 0000000..3ee9210
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberGreaterThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeSpan;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than property 2.
+///
+internal class CompareToOtherMemberGreaterThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThan)]
+ public System.TimeSpan Property1 { get; set; }
+
+ public System.TimeSpan Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberGreaterThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberGreaterThanOrEqual.cs
new file mode 100644
index 0000000..9bbfcdd
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberGreaterThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeSpan;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be greater than or equal to property 2.
+///
+internal class CompareToOtherMemberGreaterThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.GreaterThanOrEqual)]
+ public System.TimeSpan Property1 { get; set; }
+
+ public System.TimeSpan Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberLessThan.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberLessThan.cs
new file mode 100644
index 0000000..28724de
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberLessThan.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeSpan;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than property 2.
+///
+internal class CompareToOtherMemberLessThan : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThan)]
+ public System.TimeSpan Property1 { get; set; }
+
+ public System.TimeSpan Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberLessThanOrEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberLessThanOrEqual.cs
new file mode 100644
index 0000000..0954485
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberLessThanOrEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeSpan;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing property 1 to be less than or equal to property 2.
+///
+internal class CompareToOtherMemberLessThanOrEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.LessThanOrEqual)]
+ public System.TimeSpan Property1 { get; set; }
+
+ public System.TimeSpan Property2 { get; set; }
+}
diff --git a/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberNotEqual.cs b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberNotEqual.cs
new file mode 100644
index 0000000..6052555
--- /dev/null
+++ b/TestProject/Data/DataAnnotations/CompareToOtherMembers/TimeSpan/CompareToOtherMemberNotEqual.cs
@@ -0,0 +1,15 @@
+using JMayer.Data.Data;
+using JMayer.Data.DataAnnotations;
+
+namespace TestProject.Data.DataAnnotations.CompareToOtherMembers.TimeSpan;
+
+///
+/// The class is used to test the CompareToOtherMember attribute when comparing two byte properties to be not equal.
+///
+internal class CompareToOtherMemberNotEqual : DataObject
+{
+ [CompareToOtherMember(nameof(Property2), ComparisonOperation.NotEqual)]
+ public System.TimeSpan Property1 { get; set; }
+
+ public System.TimeSpan Property2 { get; set; }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberCharUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberCharUnitTest.cs
new file mode 100644
index 0000000..d240332
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberCharUnitTest.cs
@@ -0,0 +1,183 @@
+using JMayer.Data.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.Char;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the char data type.
+///
+public class CompareToOtherMemberCharUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = char.MinValue,
+ Property2 = char.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = char.MaxValue;
+ dataObject.Property2 = char.MinValue;
+
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = char.MinValue,
+ Property2 = char.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = char.MaxValue;
+ dataObject.Property2 = char.MaxValue;
+
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualFailure()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = char.MinValue,
+ Property2 = char.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = char.MaxValue;
+ dataObject.Property2 = char.MaxValue;
+
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties don't equal each other.
+ ///
+ [Fact]
+ public void VerifyNotEqualSuccess()
+ {
+ CompareToOtherMemberNotEqual dataObject = new()
+ {
+ Property1 = char.MinValue,
+ Property2 = char.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = char.MaxValue;
+ dataObject.Property2 = char.MinValue;
+
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is greater than.
+ ///
+ [Fact]
+ public void VerifyFailureGreaterThanNotSupported()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = char.MinValue,
+ Property2 = char.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForCharErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is greater than or equal.
+ ///
+ [Fact]
+ public void VerifyFailureGreaterThanOrEqualNotSupported()
+ {
+ CompareToOtherMemberGreaterThanOrEqual dataObject = new()
+ {
+ Property1 = char.MinValue,
+ Property2 = char.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForCharErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is less than.
+ ///
+ [Fact]
+ public void VerifyFailureLessThanNotSupported()
+ {
+ CompareToOtherMemberLessThan dataObject = new()
+ {
+ Property1 = char.MinValue,
+ Property2 = char.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForCharErrorMessage, validationResults[0].ErrorMessage);
+ }
+
+ ///
+ /// The method verifies a failure when the the comparison operation is less than or equal.
+ ///
+ [Fact]
+ public void VerifyFailureLessThanOrEqualNotSupported()
+ {
+ CompareToOtherMemberLessThanOrEqual dataObject = new()
+ {
+ Property1 = char.MinValue,
+ Property2 = char.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ Assert.Equal(CompareToOtherMemberAttribute.InvalidComparisonForCharErrorMessage, validationResults[0].ErrorMessage);
+ }
+}
diff --git a/TestProject/Test/DataAnnotations/CompareToOtherMemberDateOnlyUnitTest.cs b/TestProject/Test/DataAnnotations/CompareToOtherMemberDateOnlyUnitTest.cs
new file mode 100644
index 0000000..22df8cd
--- /dev/null
+++ b/TestProject/Test/DataAnnotations/CompareToOtherMemberDateOnlyUnitTest.cs
@@ -0,0 +1,260 @@
+using System.ComponentModel.DataAnnotations;
+using TestProject.Data.DataAnnotations.CompareToOtherMembers.DateOnly;
+
+namespace TestProject.Test.DataAnnotations;
+
+///
+/// The class manages tests for the CompareToOtherMemberAttribute object for the DateOnly data type.
+///
+public class CompareToOtherMemberDateOnlyUnitTest
+{
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the two properties do not equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualFailure()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = System.DateOnly.MaxValue,
+ Property2 = System.DateOnly.MinValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+
+ dataObject.Property1 = System.DateOnly.MinValue;
+ dataObject.Property2 = System.DateOnly.MaxValue;
+ validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberEqual.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return success when the two properties equal each other.
+ ///
+ [Fact]
+ public void VerifyEqualSuccess()
+ {
+ CompareToOtherMemberEqual dataObject = new()
+ {
+ Property1 = System.DateOnly.MaxValue,
+ Property2 = System.DateOnly.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+
+ dataObject.Property1 = System.DateOnly.MinValue;
+ dataObject.Property2 = System.DateOnly.MinValue;
+ validationResults = dataObject.Validate();
+ Assert.Empty(validationResults);
+ }
+
+ ///
+ /// The method verifies the CompareToOther data annotation return failure when the property 1 is less than property 2.
+ ///
+ [Fact]
+ public void VerifyGreaterThanFailure()
+ {
+ CompareToOtherMemberGreaterThan dataObject = new()
+ {
+ Property1 = System.DateOnly.MinValue,
+ Property2 = System.DateOnly.MaxValue,
+ };
+ List validationResults = dataObject.Validate();
+
+ Assert.Single(validationResults);
+ //Assert.Equal($"The {nameof(RequiredDependsOnTrue.ConditionalRequireValue)} field is required.", validationResults[0].ErrorMessage);
+ Assert.Equal(2, validationResults[0].MemberNames.Count());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property1), validationResults[0].MemberNames.First());
+ Assert.Equal(nameof(CompareToOtherMemberGreaterThan.Property2), validationResults[0].MemberNames.Last());
+ }
+
+ ///