public void Each_returned_error_has_a_key_that_reflects_the_tested_member()
            {
                var req1 = new Mock <IRequirement <int> >();

                req1.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError {
                                                                               Message = "A"
                                                                           } });
                var req2 = new Mock <IRequirement <int> >();

                req2.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError {
                                                                               Message = "B"
                                                                           } });
                var req3 = new Mock <IRequirement <int> >();

                req3.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError {
                                                                               Message = "C"
                                                                           } });
                var list = new RequirementList <string, int>(t => t.Length);

                list.Add(req1.Object);
                list.Add(req2.Object);
                list.Add(req3.Object);

                var errors = list.Check("").ToArray();

                Assert.Equal("Length", errors[0].Key);
                Assert.Equal("Length", errors[1].Key);
                Assert.Equal("Length", errors[2].Key);
            }
Example #2
0
        private AggregateResult <ExamplePerson> SetName(string name)
        {
            Action action = () => _name = name.Trim();

            var requirements = RequirementList.Create()

                               .AddExceptionRequirement(
                () => name != null,
                new ArgumentNullException(nameof(name)))

                               .AddNotificationRequirement(
                () => name.Trim().Length > 0,
                nameof(Name),
                "A name is required.")

                               .AddNotificationRequirement(    // TODO: Remove. Here for a UI test
                () => name != "Jar Jar Binks",
                nameof(Name),
                "Jar Jar Binks is not wanted here!");

            return(AggregateExecution
                   .CheckRequirements(requirements)
                   .ExecuteAction(action)
                   .ReturnAggregateResult(this));
        }
            public void Each_returned_error_contains_the_message_returned_by_the_requirement()
            {
                var req1 = new Mock <IRequirement <int> >();

                req1.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError {
                                                                               Message = "A"
                                                                           } });
                var req2 = new Mock <IRequirement <int> >();

                req2.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError {
                                                                               Message = "B"
                                                                           } });
                var req3 = new Mock <IRequirement <int> >();

                req3.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError {
                                                                               Message = "C"
                                                                           } });
                var list = new RequirementList <string, int>(t => t.Length);

                list.Add(req1.Object);
                list.Add(req2.Object);
                list.Add(req3.Object);

                var errors = list.Check("").ToArray();

                Assert.Equal("A", errors[0].Message);
                Assert.Equal("B", errors[1].Message);
                Assert.Equal("C", errors[2].Message);
            }
            public void Returns_an_error_string_for_each_failed_requirement()
            {
                var reqA = new Mock <IRequirement <object> >();

                reqA.Setup(t => t.Check(It.IsAny <object>())).Returns(new[] { new ValidationError {
                                                                                  Message = "errorA"
                                                                              } }).Verifiable();
                var reqB = new Mock <IRequirement <object> >();

                reqB.Setup(t => t.Check(It.IsAny <object>())).Returns(new ValidationError[0]).Verifiable();
                var reqC = new Mock <IRequirement <object> >();

                reqC.Setup(t => t.Check(It.IsAny <object>())).Returns(new[] { new ValidationError {
                                                                                  Message = "errorC"
                                                                              } }).Verifiable();
                var list = new RequirementList <object, object>(t => ToString());

                list.Add(reqA.Object);
                list.Add(reqB.Object);
                list.Add(reqC.Object);

                var errors = list.Check("").ToArray();

                reqA.Verify();
                reqB.Verify();
                reqC.Verify();
                Assert.Equal(2, errors.Count());
                Assert.NotEmpty(errors.Where(t => t.Message == "errorA"));
                Assert.NotEmpty(errors.Where(t => t.Message == "errorC"));
            }
			public void If_a_key_is_specified_it_overrides_the_generated_key() {
				var req = new Mock<AbstractRequirement<int>>() { CallBase = true };
				req.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "A" } });
				var list = new RequirementList<string, int>(t => t.Length, "Overridden");
				list.Add(req.Object);

				var errors = list.Check("").ToArray();
				Assert.Equal("Overridden", errors[0].Key);
			}
      public void Do_not_shortcircuit_null_values() {
        var reqA = new Mock<AbstractRequirement<object>>() { CallBase = true };
        reqA.Setup(t => t.Check(It.IsAny<object>())).Returns(new[] { new ValidationError { Message = "errorA" } });
        var list = new RequirementList<object, object>(t => ToString());
        list.Add(reqA.Object);

        var errors = list.Check(null).ToArray();
        Assert.NotEmpty(errors);
      }
			public void If_error_from_requirement_already_has_a_key_that_key_is_appended_to_the_member_name_separated_by_a_dot() {
				var req1 = new Mock<IRequirement<int>>();
				req1.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "A", Key="X" } });
				var list = new RequirementList<string, int>(t => t.Length);
				list.Add(req1.Object);

				var errors = list.Check("").ToArray();
				Assert.Equal("Length.X", errors[0].Key);
			}
 public void Stop_at_first_failing_validator() {
   var reqA = new Mock<AbstractRequirement<object>> { CallBase = true };
   var reqB = new Mock<AbstractRequirement<object>> { CallBase = true };
   reqA.Setup(t => t.Check(It.IsAny<object>())).Returns(new []{ new ValidationError() });
   var list = new RequirementList<object, object>(t => ToString());
   list.Add(reqA.Object);
   list.Add(reqB.Object);
   list.Check(null).ToArray();
   reqB.Verify(t=>t.Check(It.IsAny<object>(),It.IsAny<object>()),Times.Never());
 }
Example #9
0
        public static IRequirementList <TProperty, TProperty> If <T, TProperty>(this IRequirementList <T, TProperty> list, Func <T, TProperty, bool> predicate) where T : class
        {
            var nested = new RequirementList <TProperty, TProperty>(t => t, String.Empty);

            list.Add(new NestedRequirement <T, TProperty>(nested)
            {
                Predicate = predicate
            });
            return(nested);
        }
            public void If_error_from_requirement_already_has_a_key_that_key_is_appended_to_the_member_name_separated_by_a_dot()
            {
                var req1 = new Mock <IRequirement <int> >();

                req1.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError {
                                                                               Message = "A", Key = "X"
                                                                           } });
                var list = new RequirementList <string, int>(t => t.Length);

                list.Add(req1.Object);

                var errors = list.Check("").ToArray();

                Assert.Equal("Length.X", errors[0].Key);
            }
        public void Should_apply_nested_requirements()
        {
            var obj = new Model {
                Value = "Bob"
            };
            var req  = new StringRequirement();
            var list = new RequirementList <Model, string>(t => t.Value);

            list.Add(req);
            var nestedRequirement = new NestedRequirement <object, Model>(list);

            nestedRequirement.Check(obj).ToArray();
            Assert.Same(obj, req.Container);
            Assert.Same(obj.Value, req.Value);
        }
			public void Each_returned_error_has_a_key_that_reflects_the_tested_member() {
				var req1 = new Mock<AbstractRequirement<int>>() { CallBase = true };
				req1.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "A" } });
				var req2 = new Mock<AbstractRequirement<int>>() { CallBase = true };
				req2.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "B" } });
				var req3 = new Mock<AbstractRequirement<int>>() { CallBase = true };
				req3.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "C" } });
        var list = new RequirementList<string, int>(t => t.Length) { ContinueOnError = true }; ;
				list.Add(req1.Object);
				list.Add(req2.Object);
				list.Add(req3.Object);

				var errors = list.Check("").ToArray();
				Assert.Equal("Length", errors[0].Key);
				Assert.Equal("Length", errors[1].Key);
				Assert.Equal("Length", errors[2].Key);
			}
Example #13
0
            public void Containing_object_is_passed_as_context_to_property_requirements()
            {
                var req = new Mock <AbstractRequirement <string> >()
                {
                    CallBase = true
                };
                var list = new RequirementList <Model, string>(t => t.Name);

                list.Add(req.Object);

                var obj = new Model {
                    Name = "Bob"
                };

                list.Check(obj).ToArray();
                req.Verify(t => t.Check(obj, It.IsAny <string>()));
            }
			public void Each_returned_error_contains_the_message_returned_by_the_requirement() {
				var req1 = new Mock<IRequirement<int>>();
				req1.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "A" } });
				var req2 = new Mock<IRequirement<int>>();
				req2.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "B" } });
				var req3 = new Mock<IRequirement<int>>();
				req3.Setup(t => t.Check(It.IsAny<int>())).Returns(new[] { new ValidationError { Message= "C" } });
				var list = new RequirementList<string, int>(t => t.Length);
				list.Add(req1.Object);
				list.Add(req2.Object);
				list.Add(req3.Object);

				var errors = list.Check("").ToArray();
				Assert.Equal("A", errors[0].Message);
				Assert.Equal("B", errors[1].Message);
				Assert.Equal("C", errors[2].Message);
			}
Example #15
0
            public void Stop_at_first_failing_validator()
            {
                var reqA = new Mock <AbstractRequirement <object> > {
                    CallBase = true
                };
                var reqB = new Mock <AbstractRequirement <object> > {
                    CallBase = true
                };

                reqA.Setup(t => t.Check(It.IsAny <object>())).Returns(new [] { new ValidationError() });
                var list = new RequirementList <object, object>(t => ToString());

                list.Add(reqA.Object);
                list.Add(reqB.Object);
                list.Check(null).ToArray();
                reqB.Verify(t => t.Check(It.IsAny <object>(), It.IsAny <object>()), Times.Never());
            }
Example #16
0
            public void If_a_key_is_specified_it_overrides_the_generated_key()
            {
                var req = new Mock <AbstractRequirement <int> >()
                {
                    CallBase = true
                };

                req.Setup(t => t.Check(It.IsAny <int>())).Returns(new[] { new ValidationError {
                                                                              Message = "A"
                                                                          } });
                var list = new RequirementList <string, int>(t => t.Length, "Overridden");

                list.Add(req.Object);

                var errors = list.Check("").ToArray();

                Assert.Equal("Overridden", errors[0].Key);
            }
Example #17
0
            public void Do_not_shortcircuit_null_values()
            {
                var reqA = new Mock <AbstractRequirement <object> >()
                {
                    CallBase = true
                };

                reqA.Setup(t => t.Check(It.IsAny <object>())).Returns(new[] { new ValidationError {
                                                                                  Message = "errorA"
                                                                              } });
                var list = new RequirementList <object, object>(t => ToString());

                list.Add(reqA.Object);

                var errors = list.Check(null).ToArray();

                Assert.NotEmpty(errors);
            }
Example #18
0
        private AggregateResult <ExamplePerson> SetEmailAddress(string emailAddress)
        {
            Action action = () => _emailAddress = emailAddress.Trim();

            var requirements = RequirementList.Create()

                               .AddExceptionRequirement(
                () => emailAddress != null,
                new ArgumentNullException(nameof(emailAddress)))

                               .AddNotificationRequirement(
                () => RegexUtilities.IsValidEmail(emailAddress),
                nameof(EmailAddress),
                "A valid email address is required.");

            return(AggregateExecution                   // TODO: Inject as 'AggregateService'?
                   .CheckRequirements(requirements)
                   .ExecuteAction(action)
                   .ReturnAggregateResult(this));
        }
      public void Returns_an_error_string_for_each_failed_requirement_if_continue_on_error_is_true() {
        var reqA = new Mock<AbstractRequirement<object>>() { CallBase = true };
        reqA.Setup(t => t.Check(It.IsAny<object>())).Returns(new[] { new ValidationError { Message = "errorA" } }).Verifiable();
        var reqB = new Mock<AbstractRequirement<object>>() { CallBase = true };
        reqB.Setup(t => t.Check(It.IsAny<object>())).Returns(new ValidationError[0]).Verifiable();
        var reqC = new Mock<AbstractRequirement<object>>() { CallBase = true };
        reqC.Setup(t => t.Check(It.IsAny<object>())).Returns(new[] { new ValidationError { Message = "errorC" } }).Verifiable();
        var list = new RequirementList<object, object>(t => ToString()) { ContinueOnError = true }; ;
        list.Add(reqA.Object);
        list.Add(reqB.Object);
        list.Add(reqC.Object);

        var errors = list.Check("").ToArray();
        reqA.Verify();
        reqB.Verify();
        reqC.Verify();
        Assert.Equal(2, errors.Count());
        Assert.NotEmpty(errors.Where(t => t.Message=="errorA"));
        Assert.NotEmpty(errors.Where(t => t.Message=="errorC"));
      }
			public void Containing_object_is_passed_as_context_to_property_requirements() {
				var req = new Mock<AbstractRequirement<string>>() { CallBase = true };
				var list = new RequirementList<Model, string>(t => t.Name);
				list.Add(req.Object);

				var obj = new Model {Name = "Bob"};
				list.Check(obj).ToArray();
				req.Verify(t => t.Check(obj, It.IsAny<string>()));
			}