public void Should_Perform_And_Operation_On_Two_Invalid_Results() {
            // Arrange
            var rhs = new ValidationResult {
                ErrorMessages = new List<ValidationMessage> {
                    new ValidationMessage {Message = "Message1", ParamName = "ParamName1"}
                },
                Valid = false
            };
            var lhs = new ValidationResult {
                ErrorMessages = new List<ValidationMessage> {
                    new ValidationMessage {Message = "Message2", ParamName = "ParamName2"}
                },
                Valid = false
            };

            // Act
            var compound = rhs | lhs;

            // Assert
            compound.ErrorMessages.ShouldNotBeNull();
            compound.ErrorMessages.Count.ShouldEqual(2);
            compound.ErrorMessages.First().Message.ShouldEqual("Message1");
            compound.ErrorMessages.First().ParamName.ShouldEqual("ParamName1");
            compound.ErrorMessages.Last().Message.ShouldEqual("Message2");
            compound.ErrorMessages.Last().ParamName.ShouldEqual("ParamName2");
            compound.Valid.ShouldBeFalse();
        }
        public static ValidationResult operator |(ValidationResult lhs, ValidationResult rhs) {
            var result = new ValidationResult {
                Valid = lhs.Valid | rhs.Valid,
                ErrorMessages = new List<ValidationMessage>()
            };

            result.ErrorMessages.AddRange(lhs.ErrorMessages);
            result.ErrorMessages.AddRange(rhs.ErrorMessages);

            return result;
        }
        public void Should_Negate_True_Result() {
            // Arrange
            var start = new ValidationResult {ErrorMessages = new List<ValidationMessage>(), Valid = true};

            // Act
            var negated = !start;

            // Assert
            negated.ErrorMessages.ShouldNotBeNull();
            negated.ErrorMessages.ShouldBeEmpty();
            negated.Valid.ShouldBeFalse();
        }
        public void Should_Perform_Or_Operation_On_Two_Valid_Results() {
            // Arrange
            var rhs = new ValidationResult { ErrorMessages = new List<ValidationMessage>(), Valid = true };
            var lhs = new ValidationResult { ErrorMessages = new List<ValidationMessage>(), Valid = true };

            // Act
            var compound = rhs | lhs;

            // Assert
            compound.ErrorMessages.ShouldNotBeNull();
            compound.ErrorMessages.ShouldBeEmpty();
            compound.Valid.ShouldBeTrue();
        }
        public void Should_Negate_False_Result() {
            // Arrange
            var start = new ValidationResult {
                ErrorMessages = new List<ValidationMessage>
                {
                    new ValidationMessage { Message = "Message", ParamName = "ParamName"}
                }, Valid = false
            };

            // Act
            var negated = !start;

            // Assert
            negated.ErrorMessages.ShouldNotBeNull();
            negated.ErrorMessages.Count.ShouldEqual(1);
            negated.Valid.ShouldBeTrue();
        }
        public void Should_Perform_And_Operation_On_One_Valid_And_One_Valid_Result_Variant2() {
            // Arrange
            var rhs = new ValidationResult {
                ErrorMessages = new List<ValidationMessage> {
                    new ValidationMessage {Message = "Message", ParamName = "ParamName"}
                },
                Valid = false
            };
            var lhs = new ValidationResult { ErrorMessages = new List<ValidationMessage>(), Valid = true };

            // Act
            var compound = rhs | lhs;

            // Assert
            compound.ErrorMessages.ShouldNotBeNull();
            compound.ErrorMessages.Count.ShouldEqual(1);
            compound.ErrorMessages.First().Message.ShouldEqual("Message");
            compound.ErrorMessages.First().ParamName.ShouldEqual("ParamName");
            compound.Valid.ShouldBeTrue();
        }