public void GetMailRulesNotEliminatedRejectsMailRuleIfAnyEliminatorRejectsIt()
        {
            // Assemble
            var startTime = DateTime.Now;
            var mailRule1 = new MailRule();
            var mailRule2 = new MailRule();
            var mailRule3 = new MailRule();
            var mailRule4 = new MailRule();
            var mailRules = new List <MailRule> {
                mailRule1, mailRule2, mailRule3, mailRule4
            };

            var eliminator1 = MockRepository.GenerateStrictMock <IMailRuleEliminator>();
            var eliminator2 = MockRepository.GenerateStrictMock <IMailRuleEliminator>();
            var eliminator3 = MockRepository.GenerateStrictMock <IMailRuleEliminator>();
            var eliminators = new List <IMailRuleEliminator> {
                eliminator1, eliminator2, eliminator3
            };

            // Eliminator1 is not proper for any mail rule.
            eliminator1.Expect(e1 => e1.IsProperEliminator(mailRule1)).Return(false);
            eliminator1.Expect(e1 => e1.IsProperEliminator(mailRule2)).Return(false);
            eliminator1.Expect(e1 => e1.IsProperEliminator(mailRule3)).Return(false);
            eliminator1.Expect(e1 => e1.IsProperEliminator(mailRule4)).Return(false);

            // Eliminator2 does not evaluate rule 1, rejects rule 2, passes rules 3 and 4
            eliminator2.Expect(e2 => e2.IsProperEliminator(mailRule1)).Return(false);
            eliminator2.Expect(e2 => e2.IsProperEliminator(mailRule2)).Return(true);
            eliminator2.Expect(e2 => e2.IsProperEliminator(mailRule3)).Return(true);
            eliminator2.Expect(e2 => e2.IsProperEliminator(mailRule4)).Return(true);
            eliminator2.Expect(e2 => e2.ShouldBeEliminated(mailRule2, startTime)).Return(true);
            eliminator2.Expect(e2 => e2.ShouldBeEliminated(mailRule3, startTime)).Return(false);
            eliminator2.Expect(e2 => e2.ShouldBeEliminated(mailRule4, startTime)).Return(false);

            // Eliminator3 passes rule 1, rejects rules 2 and 3, passes rule 4
            eliminator3.Expect(e3 => e3.IsProperEliminator(mailRule1)).Return(true);
            eliminator3.Expect(e3 => e3.IsProperEliminator(mailRule2)).Return(true);
            eliminator3.Expect(e3 => e3.IsProperEliminator(mailRule3)).Return(true);
            eliminator3.Expect(e3 => e3.IsProperEliminator(mailRule4)).Return(true);
            eliminator3.Expect(e3 => e3.ShouldBeEliminated(mailRule1, startTime)).Return(false);
            eliminator3.Expect(e3 => e3.ShouldBeEliminated(mailRule2, startTime)).Return(true);
            eliminator3.Expect(e3 => e3.ShouldBeEliminated(mailRule3, startTime)).Return(true);
            eliminator3.Expect(e3 => e3.ShouldBeEliminated(mailRule4, startTime)).Return(false);

            // Act
            this.ruleEliminator = new RuleEliminator(eliminators);
            var result = this.ruleEliminator.GetMailRulesNotEliminated(mailRules, startTime);

            // Assert
            Assert.AreEqual(result.Count, 2);
            Assert.IsTrue(result.Contains(mailRule1));
            Assert.IsFalse(result.Contains(mailRule2));
            Assert.IsFalse(result.Contains(mailRule3));
            Assert.IsTrue(result.Contains(mailRule4));
        }
        public void ConstructorAssignsProperDefaultEliminators()
        {
            // Assemble
            this.ruleEliminator = new RuleEliminator();

            // Act
            var eliminators = this.ruleEliminator.Eliminators;

            // Assert
            Assert.IsTrue(eliminators.Count == 5);
            Assert.IsTrue(eliminators.Count(e => e.GetType() == typeof(InactiveEliminator)) == 1);
            Assert.IsTrue(eliminators.Count(e => e.GetType() == typeof(MaxRecurrencesEliminator)) == 1);
            Assert.IsTrue(eliminators.Count(e => e.GetType() == typeof(PastEndDateEliminiator)) == 1);
            Assert.IsTrue(eliminators.Count(e => e.GetType() == typeof(RanTodayEliminator)) == 1);
            Assert.IsTrue(eliminators.Count(e => e.GetType() == typeof(StartDateEliminator)) == 1);
        }