public void Algorithm_QualityStep_PostExpiration_IncrementingBy2()
        {
            var    pre   = 0;
            var    post  = 2;
            var    algo  = new QualityStepAlgorithm(pre, post);
            IAward award = new AcmePartnerFacilityAward(0, TimeSpan.FromDays(0));

            award.IncrementDay();
            Assert.IsTrue(award.IsExpired);

            var runner = new AwardAlgorithmRunner(algo);

            runner.Add(award);

            // NOTE: we do 25 iterations to avoid the 50 quality cap which will mess with our
            //       our nice simple loop to check qualities
            //
            runner.RunAlgorithm(25);
            var history = runner.AwardInfos[0].history;

            for (var i = 0; i < history.Count; i++)
            {
                Assert.AreEqual(i * 2, history[i], $"Algorithm history mismatch on iteration '{i}'");
            }
        }
        public void Algorithm_BlueCompare()
        {
            var    algo   = new BlueCompareAlgorithm();
            IAward award  = new BlueCompareAward(0, TimeSpan.FromDays(15));
            var    runner = new AwardAlgorithmRunner(algo);

            runner.Add(award);

            runner.RunAlgorithmWithDayIncrement(16);

            var expected = new[] { 0, 1, 2, 3, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32, 0 };

            CollectionAssert.AreEqual(expected, runner.AwardInfos[0].history);
        }
        public void Algorithm_QualityStep_PreExpiration_IncrementingBy1()
        {
            var    step  = 1;
            var    algo  = new QualityStepAlgorithm(step, step);
            IAward award = new AcmePartnerFacilityAward(0, TimeSpan.FromDays(60));

            var runner = new AwardAlgorithmRunner(algo);

            runner.Add(award);
            runner.RunAlgorithm(50);
            var history = runner.AwardInfos[0].history;

            for (var i = 0; i < history.Count; i++)
            {
                Assert.AreEqual(i, history[i], $"Algorithm history mismatch on iteration '{i}'");
            }
        }
        public void Award_BlueCompare()
        {
            // we don't explicitly test for expiration here, the behavior of this particular
            // award is fairly complex and relies on the expiration functionality working properly.
            // If the algorithm works as expected, the expiration is necessarily working as expected.
            //
            IAward award = new BlueCompareAward(0, TimeSpan.FromDays(15));
            var    algo  = award.UpdateAlgorithm;

            var runner = new AwardAlgorithmRunner(algo);

            runner.Add(award);

            runner.RunAlgorithmWithDayIncrement(16);

            var expected = new[] { 0, 1, 2, 3, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32, 0 };

            CollectionAssert.AreEqual(expected, runner.AwardInfos[0].history);
        }
        public void Algorithm_QualityStep_PostExpiration_DecrementingBy1()
        {
            var    pre   = 0;
            var    post  = -1;
            var    algo  = new QualityStepAlgorithm(pre, post);
            IAward award = new AcmePartnerFacilityAward(50, TimeSpan.FromDays(0));

            award.IncrementDay();
            Assert.IsTrue(award.IsExpired);

            var runner = new AwardAlgorithmRunner(algo);

            runner.Add(award);
            runner.RunAlgorithm(50);
            var history = runner.AwardInfos[0].history;

            for (var i = 0; i < history.Count; i++)
            {
                Assert.AreEqual(50 - i, history[i], $"Algorithm history mismatch on iteration '{i}'");
            }
        }