public void TwoFailuresOneSuccess()
        {
            var lots = new List <Lot>();

            var lot1 = new LotBuilder()
                       .NotExpired()
                       .Interdicted()
                       .Build();

            var lot2 = new LotBuilder()
                       .Expired()
                       .NotInterdicted()
                       .Build();

            var lot3 = new LotBuilder()
                       .NotExpired()
                       .NotInterdicted()
                       .Build();

            lots.Add(lot1);
            lots.Add(lot2);
            lots.Add(lot3);

            ISpecificationResults <Lot> result = Specification
                                                 .Create <Lot>(lots)
                                                 .ThatAreNot <Expired>()
                                                 .AndAre <Interdicted>()
                                                 .GetResults();

            Assert.False(result.AreAllCandidatesValid);

            Assert.Single(result.ValidCandidates);
            Assert.Equal(2, result.InvalidCandidates.Count());
            Assert.Equal(3, result.AllCandidates.Count());

            Assert.Contains(lot1, result.ValidCandidates);
            Assert.Contains(lot2, result.InvalidCandidates);
            Assert.Contains(lot3, result.InvalidCandidates);

            Assert.False(result.HasError <AvailableOnStock>());
            Assert.True(result.HasError <Expired>());
            Assert.True(result.HasError <Interdicted>());

            Assert.True(result.HasError <Expired>(lot2));
            Assert.True(result.HasError <Interdicted>(lot2));

            Assert.False(result.HasError <Expired>(lot3));
            Assert.True(result.HasError <Interdicted>(lot3));
        }
        public void SimpleOr()
        {
            var lots = new List <Lot>();

            var lot1 = new LotBuilder()
                       .NotExpired()
                       .Interdicted()
                       .Build();

            var lot2 = new LotBuilder()
                       .NotExpired()
                       .NotInterdicted()
                       .Build();

            lots.Add(lot1);
            lots.Add(lot2);

            ISpecificationResults <Lot> result = Specification
                                                 .Create <Lot>(lots)
                                                 .ThatAre <Expired>()
                                                 .OrAre <Interdicted>()
                                                 .GetResults();

            Assert.False(result.AreAllCandidatesValid);

            Assert.Single(result.ValidCandidates);
            Assert.Single(result.InvalidCandidates);
            Assert.Equal(2, result.AllCandidates.Count());

            Assert.True(result.HasError <Expired>());
            Assert.True(result.HasError <Interdicted>());

            Assert.False(result.HasError <Expired>(lot1));
            Assert.True(result.HasError <Expired>(lot2));
            Assert.True(result.HasError <Interdicted>(lot2));
        }
        public void AllFaling()
        {
            var lots = new List <Lot>();

            var lot1 = new LotBuilder()
                       .LotNumber("Lot1")
                       .Expired()
                       .Interdicted()
                       .AvailableOnStock()
                       .Build();

            var lot2 = new LotBuilder()
                       .LotNumber("Lot2")
                       .Expired()
                       .NotInterdicted()
                       .NotAvailableOnStock()
                       .Build();

            var lot3 = new LotBuilder()
                       .LotNumber("Lot3")
                       .NotExpired()
                       .Interdicted()
                       .NotAvailableOnStock()
                       .Build();

            lots.Add(lot1);
            lots.Add(lot2);
            lots.Add(lot3);

            string fullErrorMessages = new StringBuilder()
                                       .Append(new Interdicted().GetErrorMessageWhenExpectingTrue(lot2))
                                       .ToString();

            ISpecificationResults <Lot> result = Specification
                                                 .Create <Lot>(lots)
                                                 .ThatAre <Expired>()
                                                 .AndAre <Interdicted>()
                                                 .AndAreNot <AvailableOnStock>()
                                                 .GetResults();

            Assert.False(result.AreAllCandidatesValid);

            Assert.False(result.ValidCandidates.Any());
            Assert.Equal(3, result.InvalidCandidates.Count());
            Assert.Equal(3, result.AllCandidates.Count());

            Assert.True(result.HasError <Expired>());
            Assert.True(result.HasError <Interdicted>());
            Assert.True(result.HasError <AvailableOnStock>());

            Assert.False(result.HasError <Expired>(lot1));
            Assert.False(result.HasError <Expired>(lot2));
            Assert.True(result.HasError <Expired>(lot3));

            Assert.True(result.HasError <Interdicted>(lot2));
            Assert.False(result.HasError <Interdicted>(lot1));
            Assert.False(result.HasError <Interdicted>(lot3));

            Assert.False(result.HasError <AvailableOnStock>(lot2));
            Assert.False(result.HasError <AvailableOnStock>(lot3));
            Assert.True(result.HasError <AvailableOnStock>(lot1));

            Assert.Equal(3, result.TotalOfErrors);
            Assert.Equal(0, result.TotalOfWarnings);

            Assert.Equal(fullErrorMessages, result.ErrorMessages);
        }