public void WhenSingleValidatorReturnsTrue()
        {
            ExclusiveValidatorGroup vg = new ExclusiveValidatorGroup(Expression.Parse("true"));

            vg.Actions.Add(new ErrorMessageAction("exclusiveError", "exclusiveErrors"));

            vg.Validators.Add(new FalseValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new FalseValidator());

            IValidationErrors errors = new ValidationErrors();

            errors.AddError("existingErrors", new ErrorMessage("error", null));

            bool valid = vg.Validate(new object(), errors);

            Assert.IsTrue(valid, "Validation should succeed when single inner validator returns true.");
            Assert.AreEqual(0, errors.GetErrors("errors").Count);
            Assert.AreEqual(0, errors.GetErrors("exclusiveErrors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);

            // ALL validators are called
            Assert.IsTrue(((BaseTestValidator)vg.Validators[0]).WasCalled);
            Assert.IsTrue(((BaseTestValidator)vg.Validators[1]).WasCalled);
            Assert.IsTrue(((BaseTestValidator)vg.Validators[2]).WasCalled);
        }
        public void WhenGroupIsNotValidatedBecauseWhenExpressionReturnsFalse()
        {
            ExclusiveValidatorGroup vg = new ExclusiveValidatorGroup("false");

            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.IsTrue(valid, "Validation should succeed when group validator is not evaluated.");
            Assert.AreEqual(0, errors.GetErrors("errors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
        }
        private void WhenMultipleValidatorsReturnTrue(ExclusiveValidatorGroup vg, IValidationErrors errors)
        {
            vg.Actions.Add(new ErrorMessageAction("exclusiveError", "exclusiveErrors"));

            vg.Validators.Add(new FalseValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new FalseValidator());

            errors.AddError("existingErrors", new ErrorMessage("error", null));

            bool valid = vg.Validate(new object(), errors);

            Assert.IsFalse(valid, "Validation should not succeed when multiple inner validators return true.");
            Assert.AreEqual(1, errors.GetErrors("exclusiveErrors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
        }
        public void WhenAllValidatorsReturnTrue()
        {
            ExclusiveValidatorGroup vg = new ExclusiveValidatorGroup("true");
            vg.Actions.Add(new ErrorMessageAction("exclusiveError", "exclusiveErrors"));

            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new TrueValidator());

            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 true.");
            Assert.AreEqual(0, errors.GetErrors("errors").Count);
            Assert.AreEqual(1, errors.GetErrors("exclusiveErrors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
        }
        public void WhenAllValidatorsReturnTrue()
        {
            ExclusiveValidatorGroup vg = new ExclusiveValidatorGroup("true");

            vg.Actions.Add(new ErrorMessageAction("exclusiveError", "exclusiveErrors"));

            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new TrueValidator());

            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 true.");
            Assert.AreEqual(0, errors.GetErrors("errors").Count);
            Assert.AreEqual(1, errors.GetErrors("exclusiveErrors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
        }
        public void WhenSingleValidatorReturnsTrue()
        {
            ExclusiveValidatorGroup vg = new ExclusiveValidatorGroup(Expression.Parse("true"));
            vg.Actions.Add(new ErrorMessageAction("exclusiveError", "exclusiveErrors"));

            vg.Validators.Add(new FalseValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new FalseValidator());

            IValidationErrors errors = new ValidationErrors();
            errors.AddError("existingErrors", new ErrorMessage("error", null));

            bool valid = vg.Validate(new object(), errors);

            Assert.IsTrue(valid, "Validation should succeed when single inner validator returns true.");
            Assert.AreEqual(0, errors.GetErrors("errors").Count);
            Assert.AreEqual(0, errors.GetErrors("exclusiveErrors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);

            // ALL validators are called
            Assert.IsTrue( ((BaseTestValidator)vg.Validators[0]).WasCalled );
            Assert.IsTrue( ((BaseTestValidator)vg.Validators[1]).WasCalled );
            Assert.IsTrue( ((BaseTestValidator)vg.Validators[2]).WasCalled );
        }
        public void WhenGroupIsNotValidatedBecauseWhenExpressionReturnsFalse()
        {
            ExclusiveValidatorGroup vg = new ExclusiveValidatorGroup("false");
            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.IsTrue(valid, "Validation should succeed when group validator is not evaluated.");
            Assert.AreEqual(0, errors.GetErrors("errors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
        }
        private void WhenMultipleValidatorsReturnTrue(ExclusiveValidatorGroup vg, IValidationErrors errors)
        {
            vg.Actions.Add(new ErrorMessageAction("exclusiveError", "exclusiveErrors"));

            vg.Validators.Add(new FalseValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new TrueValidator());
            vg.Validators.Add(new FalseValidator());

            errors.AddError("existingErrors", new ErrorMessage("error", null));

            bool valid = vg.Validate(new object(), errors);

            Assert.IsFalse(valid, "Validation should not succeed when multiple inner validators return true.");
            Assert.AreEqual(1, errors.GetErrors("exclusiveErrors").Count);
            Assert.AreEqual(1, errors.GetErrors("existingErrors").Count);
        }