public void Specification_OrSpecification_ShouldFilterMovies()
        {
            // Arrange
            var movieCount = MovieFactory.GetMixedMovies().Count(m =>
                                                                 m.MpaaRating <= MpaaRating.PG || // For kids OR
                                                                 m.Rating >= 4);                  // Best Rates

            var kidSpec = new MovieForKidsSpecificationValidator();
            var dirBest = new BestRatedFilmsSpecificationValidator();

            var movieSpec = kidSpec.Or(dirBest);

            // Act
            var result = MovieFactory.GetMixedMovies().Where(movieSpec.IsSatisfiedBy);

            // Assert
            Assert.Equal(movieCount, result.Count());
        }
        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 SpecValidation_Validate_ShouldReturnFalseWithErrorMessages()
        {
            // Arrange
            var movie = MovieFactory.GetMixedMovies().FirstOrDefault(m =>
                                                                     m.MpaaRating <= MpaaRating.R &&           // Not For kids
                                                                     m.ReleaseDate.Year < DateTime.Now.Year && // Old(?) Release
                                                                     m.Rating < 4);                            // Bad ratings

            var less1YearSpec = new LessThanOneYearSpecificationValidator();
            var forKidsSpec   = new MovieForKidsSpecificationValidator();
            var bestRatedSpec = new BestRatedFilmsSpecificationValidator();

            var newestGoodMoviesForKidsValidation = less1YearSpec.Or(forKidsSpec.Or(bestRatedSpec));

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

            // Assert
            Assert.False(result.IsValid);
            Assert.Contains(result.Errors, e => e.ErrorMessage == "This movie was released over a year ago.");
            Assert.Contains(result.Errors, e => e.ErrorMessage == "This film is not for children.");
            Assert.Contains(result.Errors, e => e.ErrorMessage == "This film is not well rated.");
        }