public void Should_replace_array_index_with_correct_index_value() { Expression<Func<DrugTestForm, object>> expr = f => f.DrugTestDrugTestResults[int.MaxValue].SubstanceTested; var result = new IndexReplacerVisitor(5).Visit(expr); Assert.AreEqual("f => f.DrugTestDrugTestResults[5].SubstanceTested", result.ToString()); }
public ExecutionResult ValidateCommand(object commandMessage, ICommandConfiguration commandConfiguration) { var totalResult = new ExecutionResult(); IEnumerable<ValidationRuleInstance> ruleInstances = commandConfiguration.GetValidationRules(); foreach (ValidationRuleInstance instance in ruleInstances) { if (instance.ShouldApply != null) if (!(bool) instance.ShouldApply.DynamicInvoke(commandMessage)) continue; Delegate compile = instance.ToCheckExpression.Compile(); object input = compile.DynamicInvoke(new object[] {commandMessage}); bool stopProcessing = false; if (instance.ArrayRule) { var enumerable = (IEnumerable) input; int i = 0; foreach (object item in enumerable) { if (item == null) continue; IValidationRule rule = _ruleFactory.ConstructRule(instance); string result = rule.IsValid(item); bool ruleFailed = result != null; if (ruleFailed) { var indexedUiExpression = new IndexReplacerVisitor(i).Visit(instance.UIAttributeExpression); totalResult.AddMessage(result, instance.ToCheckExpression, (LambdaExpression)indexedUiExpression, instance.ToCompareExpression); if (rule.StopProcessing) { stopProcessing = true; break; } } i++; } } else { IValidationRule rule = _ruleFactory.ConstructRule(instance); if (rule is ICrossReferencedValidationRule) { Delegate toCompareDelegate = instance.ToCompareExpression.Compile(); object toCompare = toCompareDelegate.DynamicInvoke(new object[] {commandMessage}); ((ICrossReferencedValidationRule) rule).ToCompare = toCompare; } string result = rule.IsValid(input); bool ruleFailed = result != null; if (ruleFailed) { totalResult.AddMessage(result, instance.ToCheckExpression, instance.UIAttributeExpression, instance.ToCompareExpression); if (rule.StopProcessing) { break; } } } if (stopProcessing) break; } return totalResult; }