From 8c8b8d5c936be08416b23901a34b3990ea128f63 Mon Sep 17 00:00:00 2001 From: eeichinger Date: Sat, 25 Oct 2008 16:35:56 +0000 Subject: [PATCH] resolved SPRNET-1033, introduced new "ShortcircuitEvaluate" property on ValidatorGroup --- .../Spring.Core/Validation/ValidatorGroup.cs | 19 ++++++++++++++++++- .../Validation/ValidatorGroupTests.cs | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/Spring/Spring.Core/Validation/ValidatorGroup.cs b/src/Spring/Spring.Core/Validation/ValidatorGroup.cs index 8d845e3f..fb763af9 100644 --- a/src/Spring/Spring.Core/Validation/ValidatorGroup.cs +++ b/src/Spring/Spring.Core/Validation/ValidatorGroup.cs @@ -44,7 +44,7 @@ namespace Spring.Validation #region Fields private IList validators = new ArrayList(); - + private bool shortcircuitEvaluate = false; #endregion #region Constructors @@ -83,6 +83,19 @@ namespace Spring.Validation set { validators = value; } } + /// + /// When set true, shortcircuits evaluation. + /// + /// + /// The validators within the group will only be validated + /// in order until the first validator fails. + /// + public bool ShortcircuitEvaluate + { + get { return shortcircuitEvaluate; } + set { shortcircuitEvaluate = value; } + } + #endregion /// @@ -101,6 +114,10 @@ namespace Spring.Validation foreach (IValidator validator in validators) { valid = validator.Validate(validationContext, contextParams, errors) && valid; + if (shortcircuitEvaluate && !valid) + { + break; + } } ProcessActions(valid, validationContext, contextParams, errors); } diff --git a/test/Spring/Spring.Core.Tests/Validation/ValidatorGroupTests.cs b/test/Spring/Spring.Core.Tests/Validation/ValidatorGroupTests.cs index f1be5848..d29a68e4 100644 --- a/test/Spring/Spring.Core.Tests/Validation/ValidatorGroupTests.cs +++ b/test/Spring/Spring.Core.Tests/Validation/ValidatorGroupTests.cs @@ -56,6 +56,25 @@ namespace Spring.Validation Assert.AreEqual(1, errors.GetErrors("existingErrors").Count); } + [Test] + public void WhenAllValidatorsReturnFalseFast() + { + ValidatorGroup vg = new ValidatorGroup(); + vg.ShortcircuitEvaluate = true; + vg.Validators.Add(new FalseValidator()); + vg.Validators.Add(new FalseValidator()); + vg.Validators.Add(new FalseValidator()); + + IValidationErrors errors = new ValidationErrors(); + errors.AddError("existingErrors", new ErrorMessage("error", null)); + + bool valid = vg.Validate(new object(), errors); + + Assert.IsFalse(valid, "Validation should fail when all inner validators return false."); + Assert.AreEqual(1, errors.GetErrors("errors").Count); + Assert.AreEqual(1, errors.GetErrors("existingErrors").Count); + } + [Test] public void WhenAllValidatorsReturnTrue() {