public void TestComplicated()
        {
            AbstractJobProcessor jobProcessor = new SimpleJobProcessor();
            var job = new Job();

            var runTimes = new List <DateTime>();

            jobProcessor.JobStarted += (object s, JobEventArgs a) => runTimes.Add(a.DateTime);

            job.Settings           = new ScheduleSettings();
            job.Settings.StartDate = new DateTime(2014, 11, 20);
            job.Settings.SetFrequency(ReccurPeriodTimeUnit.Weekly, 1);
            job.Settings.ActiveWeekDays.Add(DayOfWeek.Monday);
            job.Settings.ActiveWeekDays.Add(DayOfWeek.Wednesday);

            job.Settings.DailyFrequency.PeriodTimeUnit      = DailyFrequency.TimeUnit.Hour;
            job.Settings.DailyFrequency.PeriodTimeUnitCount = 7;
            job.Settings.DailyFrequency.EndingAt            = new TimeSpan(hours: 20, minutes: 0, seconds: 0);

            job.Settings.EndDate    = new DateTime(2015, 5, 10);
            job.Settings.HasEndDate = true;

            var allDates = new HashSet <DateTime>();

            for (var dt = new DateTime(2014, 10, 20).AddMinutes(-1);
                 dt < new DateTime(2015, 10, 2); dt = dt.AddMinutes(15))
            {
                jobProcessor.RunIfTime(job, dt);

                if (dt < job.Settings.StartDate)
                {
                    continue;
                }

                if (job.Settings.ActiveWeekDays.Contains(dt.DayOfWeek) && !allDates.Contains(dt.Date) &&
                    dt <= job.Settings.EndDate &&
                    dt.TimeOfDay <= job.Settings.DailyFrequency.EndingAt.Value)
                {
                    allDates.Add(dt.Date);
                }
            }

            var runDates = runTimes.Select(dt => dt.Date).Distinct().ToList();

            Assert.IsTrue(allDates.SequenceEqual(runDates));
            Assert.AreEqual(runDates.Count * 3, runTimes.Count);
        }
        public void TestMethod1()
        {
            AbstractJobProcessor jobProcessor = new SimpleJobProcessor();
            var ranCount = 0;

            var job = new Job();

            jobProcessor.JobStarted += delegate { ranCount++; };

            job.Settings            = new ScheduleSettings();
            job.Settings.StartDate  = new DateTime(1980, 2, 26);
            job.Settings.EndDate    = new DateTime(2980, 2, 26);
            job.Settings.HasEndDate = true;
            job.Settings.SetFrequency(ReccurPeriodTimeUnit.Daily, 1);

            job.Settings.DailyFrequency.PeriodTimeUnit      = DailyFrequency.TimeUnit.Hour;
            job.Settings.DailyFrequency.PeriodTimeUnitCount = 1;

            jobProcessor.RunIfTime(job, new DateTime(year: 1980, month: 2, day: 25, hour: 23, minute: 30, second: 0));
            Assert.AreEqual(0, ranCount);

            jobProcessor.RunIfTime(job, new DateTime(1980, 2, 26, 0, 30, 0));
            Assert.AreEqual(1, ranCount);
            jobProcessor.RunIfTime(job, new DateTime(1980, 2, 26, 0, 30, 0));
            Assert.AreEqual(1, ranCount);

            jobProcessor.RunIfTime(job, new DateTime(1980, 2, 26, 1, 0, 0));
            Assert.AreEqual(2, ranCount);

            jobProcessor.RunIfTime(job, new DateTime(1979, 2, 26, 0, 30, 0));
            Assert.AreEqual(2, ranCount);

            jobProcessor.RunIfTime(job, new DateTime(2000, 2, 26, 0, 30, 0));
            Assert.AreEqual(3, ranCount);

            DateTime nextDateTime;

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(1980, 2, 25), out nextDateTime));
            Assert.AreEqual(new DateTime(1980, 2, 26), nextDateTime);

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(1980, 2, 26), out nextDateTime));
            Assert.AreEqual(new DateTime(1980, 2, 26, 1, 0, 0), nextDateTime);

            Assert.IsFalse(job.Settings.GetNextTime(new DateTime(2980, 2, 27, 0, 0, 0), out nextDateTime));
        }
        public void TestMonthly()
        {
            AbstractJobProcessor jobProcessor = new SimpleJobProcessor();

            var runs = new List <DateTime>();
            var job  = new Job();

            jobProcessor.JobStarted += (object s, JobEventArgs a) => runs.Add(a.DateTime);

            job.Settings                      = new ScheduleSettings();
            job.Settings.StartDate            = new DateTime(2014, 11, 20);
            job.Settings.ReccurPeriod         = new TimeUnitBasedPeriod(ReccurPeriodTimeUnit.Monthly, 2);
            job.Settings.DayOfMonth.DayNumber = 15;

            job.Settings.DailyFrequency.OccursOnceTime = new TimeSpan(hours: 8, minutes: 0, seconds: 0);
            job.Settings.DailyFrequency.OccursOnce     = true;

            jobProcessor.RunIfTime(job, new DateTime(2014, 11, 20));
            Assert.AreEqual(0, runs.Count);
            jobProcessor.RunIfTime(job, new DateTime(2015, 1, 15, 7, 0, 0));
            Assert.AreEqual(0, runs.Count);

            DateTime nextRun;

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(2015, 1, 15, 7, 0, 0), out nextRun));
            Assert.AreEqual(new DateTime(2015, 1, 15, 8, 0, 0), nextRun);

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(2015, 1, 14, 8, 0, 0), out nextRun));
            Assert.AreEqual(new DateTime(2015, 1, 15, 8, 0, 0), nextRun);

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(2015, 1, 14, 9, 0, 0), out nextRun));
            Assert.AreEqual(new DateTime(2015, 1, 15, 8, 0, 0), nextRun);

            jobProcessor.RunIfTime(job, new DateTime(2015, 1, 15, 9, 0, 0));
            Assert.AreEqual(1, runs.Count);
            jobProcessor.RunIfTime(job, new DateTime(2015, 1, 20, 0, 0, 0));
            Assert.AreEqual(1, runs.Count);
            jobProcessor.RunIfTime(job, new DateTime(2015, 1, 20, 10, 0, 0));
            Assert.AreEqual(1, runs.Count);
        }
        public void TestDailyHourly()
        {
            AbstractJobProcessor jobProcessor = new SimpleJobProcessor();

            var runTimes = new List <DateTime>();
            var job      = new Job();

            jobProcessor.JobStarted += (object s, JobEventArgs a) => runTimes.Add(a.DateTime);

            job.Settings              = new ScheduleSettings();
            job.Settings.StartDate    = new DateTime(2014, 11, 20);
            job.Settings.ReccurPeriod = new TimeUnitBasedPeriod(ReccurPeriodTimeUnit.Daily, 1);

            job.Settings.DailyFrequency.PeriodTimeUnit      = DailyFrequency.TimeUnit.Hour;
            job.Settings.DailyFrequency.PeriodTimeUnitCount = 1;

            for (var dt = new DateTime(2014, 11, 20); dt < new DateTime(2014, 11, 23); dt = dt.AddMinutes(0.5))
            {
                jobProcessor.RunIfTime(job, dt);
            }

            Assert.AreEqual(3 * 24, runTimes.Count);
        }
        public void TestOvernight()
        {
            AbstractJobProcessor jobProcessor = new SimpleJobProcessor();

            var runs = new List <DateTime>();
            var job  = new Job();

            jobProcessor.JobStarted += (object s, JobEventArgs a) => runs.Add(a.DateTime);

            job.Settings              = new ScheduleSettings();
            job.Settings.StartDate    = new DateTime(2014, 11, 20);
            job.Settings.ReccurPeriod = new TimeUnitBasedPeriod(ReccurPeriodTimeUnit.Daily, 1);

            job.Settings.DailyFrequency.PeriodTimeUnit      = DailyFrequency.TimeUnit.Minute;
            job.Settings.DailyFrequency.PeriodTimeUnitCount = 1;

            DateTime next;

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(2014, 11, 21, 23, 58, 30), out next));
            Assert.AreEqual(new DateTime(2014, 11, 21, 23, 59, 0), next);

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(2014, 11, 21, 23, 59, 30), out next));
            Assert.AreEqual(new DateTime(2014, 11, 22, 0, 0, 0), next);

            job.Settings.DailyFrequency.StartingAt = TimeSpan.FromSeconds(5);
            job.Settings.DailyFrequency.EndingAt   = new TimeSpan(23, 59, 59, 59, 9999);

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(2014, 11, 21, 23, 58, 30), out next));
            Assert.AreEqual(new DateTime(2014, 11, 21, 23, 59, 05), next);

            Assert.IsTrue(job.Settings.GetNextTime(new DateTime(2014, 11, 21, 23, 59, 30), out next));
            Assert.AreEqual(new DateTime(2014, 11, 22, 0, 0, 05), next);

            for (var dt = new DateTime(2014, 11, 21, 23, 57, 30);
                 dt < new DateTime(2014, 11, 22, 0, 1, 30);
                 dt = dt.AddSeconds(1))
            {
                jobProcessor.RunIfTime(job, dt);
            }

            Assert.AreEqual(5, runs.Count);
            Assert.AreEqual(runs.Last().Date, new DateTime(2014, 11, 22));

            runs.Clear();

            // every seccond for several days
            for (var dt = new DateTime(2014, 11, 22, 23, 57, 30);
                 dt < new DateTime(2014, 12, 15, 9, 10, 30);
                 dt = dt.AddSeconds(1))
            {
                jobProcessor.RunIfTime(job, dt);
            }

            var runDated = runs.Select(t => t.Date).Distinct().ToList();

            //Assert.AreEqual(`);

            Assert.AreEqual(runs.Last().Date, new DateTime(2014, 12, 15));

            for (var i = 0; i < runs.Count - 1; i++)
            {
                Assert.IsTrue(runs[i + 1] - runs[i] < new TimeSpan(0, 1, 1));
            }
        }