public void Specification_OrSpecification_AllInvalid_ShouldReturnFalse()
        {
            // Arrange
            var movie = MovieFactory.GetRatedR();

            var director = movie.Director.Name + " LastName";

            var kidSpec = new MovieForKidsSpecificationValidator();
            var dirSpec = new MovieDirectedBySpecificationValidator(director);

            var movieSpec = kidSpec.Or(dirSpec);

            // Act
            var result = movieSpec.Validate(movie);

            // Assert
            Assert.False(result.IsValid);
            Assert.Contains(result.Errors, e => e.ErrorMessage == "This film is not for children.");
            Assert.Contains(result.Errors, e => e.ErrorMessage == "The director name is different.");
        }
        public void Specification_AndSpecification_WithDifferentDirectorName_ShouldReturnFalse()
        {
            // Arrange
            var movie = MovieFactory.GetMixedMovies().FirstOrDefault(m =>
                                                                     m.MpaaRating <= MpaaRating.PG &&         // For kids
                                                                     m.ReleaseDate.Year < DateTime.Now.Year); // Last year or older

            var director = movie.Director.Name + " LastName";

            var kidSpec = new MovieForKidsSpecificationValidator();
            var dirSpec = new MovieDirectedBySpecificationValidator(director);

            var movieSpec = kidSpec.And(dirSpec);

            // Act
            var result = movieSpec.Validate(movie);

            // Assert
            Assert.False(result.IsValid);
            Assert.Contains(result.Errors, e => e.ErrorMessage == "The director name is different.");
        }
        public void Specification_AndSpecification_ShouldReturnTrue()
        {
            // Arrange
            var movie = MovieFactory.GetMixedMovies().FirstOrDefault(m =>
                                                                     m.MpaaRating <= MpaaRating.PG &&         // For kids
                                                                     m.ReleaseDate.Year < DateTime.Now.Year); // Last year or older

            var director = movie.Director.Name;

            var kidSpec = new MovieForKidsSpecificationValidator();
            var dirSpec = new MovieDirectedBySpecificationValidator(director);
            var dvdSpec = new AvailableOnStreamingSpecificationValidator();

            var movieSpec = kidSpec.And(dirSpec).And(dvdSpec);

            // Act
            var result = movieSpec.Validate(movie);

            // Assert
            Assert.True(result.IsValid);
        }