public void SpecValidation_Validate_ShouldReturnTrue()
        {
            // Arrange
            var movie = MovieFactory.GetMixedMovies().FirstOrDefault(m =>
                                                                     m.MpaaRating <= MpaaRating.PG &&           // For kids
                                                                     m.ReleaseDate.Year == DateTime.Now.Year && // New Release
                                                                     m.Rating >= 4);                            // Best ratings

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

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

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

            // Assert
            Assert.True(result.IsValid);
        }
        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.");
        }