IValidationSpecification<T> interface provide special structure with validation result, error message and types of visited Specification - SpecificationResult.
Below is description of each property with examples.
We start of Specification:
var spec = Specification
.Length<Dictionary<int, string>>(3)
.And()
.Null(d => d.Comparer)
.And()
.All(Specification
.LessThan<KeyValuePair<int, string>, int>(
kv => kv.Key, 100));
spec.IsSatisfiedBy(new Dictionary<int, string>
{
{1, "First"},
{100, "Last"}
}, out var result);
result.ToString();
// Object length is not [3]
// Field 'Comparer' value is not valid
// Field 'Comparer': [Object is not null]
// One or more elements are not specified
// [1] Field 'Key' value is not valid
// [1] Field 'Key': [Object is greater than or equal to [100]]
- OverallResult - overall result returned for current candidate.
In example - false. - TotalSpecificationsCount - count of all executed Specifications in chain.
In example - 8.
Two Ands, Length, Null, All, LessThan and two properties Specifications (for 'Comparer' and 'Key'). - FailedSpecificationsCount - count of failed Specifications (returned false).
In example - 6.
And Specifications are "neutral" - thats why 6 but not 8. - Errors - list with all failed Specifications errors.
In example:
- Object length is not [3]
- Field 'Comparer' value is not valid
- Field 'Comparer': [Object is not null]
- One or more elements are not specified
- [1] Field 'Key' value is not valid
- [1] Field 'Key': [Object is greater than or equal to [100]]
- FailedSpecifications - list of failed Specifications (
FailedSpecificationstructure).- SpecificationType - type of failed Specification.
In example, in sequence -LengthSpecification<Dictionary<int, string>>,PropertySpecification<Dictionary<int, string>, IEqualityComparer<int>,NullSpecification<IEqualityComparer<int>>,AllSpecification<Dictionary<int, string>, KeyValuePair<int, string>>,PropertySpecification<KeyValuePair<int, string>, int>andLessThanSpecification<int>. - Parameters -
Dictionary<string, object>- parameters used during candidate verification.
In example:- Length - { "Length", 3 }
- Comparer Property - { "PropertySelector", d => d.Comparer }, { "PropertyName", "Comparer" }, { "PropertySpecification",
NullSpecification<IEqualityComparer<int>>object } - Null - none
- All - { "SpecificationForAll",
PropertySpecification<KeyValuePair<int, string>, int>object } - Key proerty - { "PropertySelector", kv => kv.Key }, { "PropertyName", "Key" }, { "PropertySpecification",
LessThanSpecification<int>object } - Less Than - { "LessThan", 100 }
- Candidate - used candidate.
In example:- Length -
Dictionary<int, string>object - Comparer Property -
Dictionary<int, string>object - Null -
GenericEqualityComparer<int>object - All -
Dictionary<int, string>object - Key proerty - { 100, "Last" }
- Less Than - 100
- Length -
- Errors - list of errors generated by this Specification.
In example:- Length - "Object length is not [3]"
- Comparer Property - "Field 'Comparer' value is not valid"
- Null - "Field 'Comparer': [Object is not null]"
- All - "One or more elements are not specified"
- Key proerty - "[1] Field 'Key' value is not valid"
- Less Than - "[1] Field 'Key': [Object is greater than or equal to [100]]"
- SpecificationType - type of failed Specification.
- Trace - trace message. Excellent for debugging Specifications chain behavior from left to right.
In example - "LengthSpecification<Dictionary<Int32,String>>+Failed And PropertySpecification<Dictionary<Int32,String>,IEqualityComparer>(NullSpecification<IEqualityComparer >+Failed)+Failed And AllSpecification<Dictionary<Int32,String>,KeyValuePair<Int32,String>>([0](PropertySpecification<KeyValuePair<Int32,String>,Int32> (LessThanSpecification )) And [1](PropertySpecification<KeyValuePair<Int32,String>,Int32> (LessThanSpecification +Failed)+Failed))+Failed"

