protected SpecificationResult Compare( SpecificationValue left, SpecificationValue rigth, SpecificationEvaluationSettings settings) { if (left.ValueType != rigth.ValueType) { List <object> cast = new List <object>(); foreach (object leftValue in left.Values) { if (TypeHelper.HasMappingOrCast(leftValue, rigth.ValueType, settings.ValueSettings, out object leftCast)) { cast.Add(leftCast); } else { if (settings.ThrowValueErrors) { throw new InvalidOperationException( string.Format( SpecAbsRes.KeyValueSpecificationTypeNotMatch, left.ValueType, this.Key, this.Value.ValueType)); } return(SpecificationResult.Create( false, settings.IncludeDetails ? string.Format( SpecAbsRes.KeyValueSpecificationTypeNotMatch, left.ValueType, this.Key, rigth.ValueType) : null)); } } if (left.Values.Count == 1) { left = SpecificationValue.Single(cast.Single()); } if (left.ValueMultiplicity == SpecificationValue.Multiplicity.AnyOf) { left = SpecificationValue.AnyOf(cast); } else if (left.ValueMultiplicity == SpecificationValue.Multiplicity.AllOf) { left = SpecificationValue.AllOf(cast); } else { throw new InvalidOperationException(); } } return(this.CompareSafeTypes(left, rigth, settings)); }
public void AllOfInt() { SpecificationValue value = SpecificationValue.AllOf(1, 2, 4); Assert.NotNull(value); Assert.Collection(value.Values.OfType <int>(), i => Assert.Equal(1, i), i => Assert.Equal(2, i), i => Assert.Equal(4, i)); Assert.Equal(SpecificationValue.Multiplicity.AllOf, value.ValueMultiplicity); Assert.Equal(SpecificationValue.DataType.Int, value.ValueType); Assert.Equal("All of (1, 2, 4)", value.ToString()); }
public void SingleAll(int l, int r1, int r2, bool result) { EqualSpecification specification = new EqualSpecification( "key", SpecificationValue.AllOf(new List <int> { r1, r2 })); Assert.Equal(result, specification.Evaluate(new Dictionary <string, object> { { "key", l } }).IsSatisfied); Assert.Equal( result, specification.Evaluate(new Dictionary <string, object> { { "key", SpecificationValue.Single(l) } }) .IsSatisfied); }
public void AnyAll(int l1, int l2, int r1, int r2, bool result) { EqualSpecification specification = new EqualSpecification("key", SpecificationValue.AllOf(r1, r2)); Assert.Equal( result, specification.Evaluate(new Dictionary <string, object> { { "key", new List <int> { l1, l2 } } }) .IsSatisfied); Assert.Equal( result, specification.Evaluate(new Dictionary <string, object> { { "key", SpecificationValue.AnyOf(l1, l2) } }) .IsSatisfied); }