示例#1
0
        public void TestExceptions()
        {
            schedule = new WorkSchedule("Exceptions", "Test exceptions");
            Duration  shiftDuration = Duration.FromHours(24);
            LocalTime shiftStart    = new LocalTime(7, 0, 0);

            NonWorkingPeriod period = schedule.CreateNonWorkingPeriod("Non-working", "Non-working period",
                                                                      new LocalDateTime(2017, 1, 1, 0, 0, 0), Duration.FromHours(24));

            try
            {
                period.Duration = Duration.FromSeconds(0);
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            try
            {
                // same period
                schedule.CreateNonWorkingPeriod("Non-working", "Non-working period", new LocalDateTime(2017, 1, 1, 0, 0, 0),
                                                Duration.FromHours(24));
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            // shift
            Shift shift = schedule.CreateShift("Test", "Test shift", shiftStart, shiftDuration);

            try
            {
                // crosses midnight
                shift.CalculateWorkingTime(shiftStart.Minus(Period.FromHours(1)), shift.GetEnd().PlusHours(1));
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            try
            {
                shift.Duration = Duration.FromSeconds(0);
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            try
            {
                shift.Duration = Duration.FromSeconds(48 * 3600);
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            try
            {
                // same shift
                shift = schedule.CreateShift("Test", "Test shift", shiftStart, shiftDuration);
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            Rotation rotation = new Rotation("Rotation", "Rotation");

            rotation.AddSegment(shift, 5, 2);

            LocalDate startRotation = new LocalDate(2016, 12, 31);
            Team      team          = schedule.CreateTeam("Team", "Team", rotation, startRotation);

            // ok
            schedule.CalculateWorkingTime(new LocalDateTime(2017, 1, 1, 7, 0, 0), new LocalDateTime(2017, 2, 1, 0, 0, 0));

            try
            {
                // end before start
                schedule.CalculateWorkingTime(new LocalDateTime(2017, 1, 2, 0, 0, 0), new LocalDateTime(2017, 1, 1, 0, 0, 0));
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            try
            {
                // same team
                team = schedule.CreateTeam("Team", "Team", rotation, startRotation);
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            try
            {
                // date before start
                team.GetDayInRotation(new LocalDate(2016, 1, 1));
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            try
            {
                // end before start
                schedule.PrintShiftInstances(new LocalDate(2017, 1, 2), new LocalDate(2017, 1, 1));
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            try
            {
                // delete in-use shift
                schedule.DeleteShift(shift);
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            // breaks
            Break lunch = shift.CreateBreak("Lunch", "Lunch", new LocalTime(12, 0, 0), Duration.FromMinutes(60));

            lunch.Duration  = Duration.FromMinutes(30);
            lunch.StartTime = new LocalTime(11, 30, 0);
            shift.RemoveBreak(lunch);
            shift.RemoveBreak(lunch);

            Shift shift2 = schedule.CreateShift("Test2", "Test shift2", shiftStart, shiftDuration);

            Assert.IsFalse(shift.Equals(shift2));

            Break lunch2 = shift2.CreateBreak("Lunch2", "Lunch", new LocalTime(12, 0, 0), Duration.FromMinutes(60));

            shift.RemoveBreak(lunch2);

            // ok to delete
            WorkSchedule schedule2 = new WorkSchedule("Exceptions2", "Test exceptions2");

            schedule2.Name        = "Schedule 2";
            schedule2.Description = "a description";

            schedule2.DeleteShift(shift);
            schedule2.DeleteTeam(team);
            schedule2.DeleteNonWorkingPeriod(period);

            // nulls
            try
            {
                schedule.CreateShift(null, "1", shiftStart, Duration.FromMinutes(60));
                Assert.Fail();
            }
            catch (Exception)
            {
            }

            Assert.IsFalse(shift.Equals(rotation));

            // hashcode()
            team.GetHashCode();
            String name = team.Name;
            Dictionary <String, Team> teams = new Dictionary <String, Team>();

            teams[name] = team;
            Team t = teams[name];
        }
示例#2
0
        public void TestNonWorkingTime()
        {
            schedule = new WorkSchedule("Non Working Time", "Test non working time");
            LocalDate date = new LocalDate(2017, 1, 1);
            LocalTime time = new LocalTime(7, 0, 0);

            NonWorkingPeriod period1 = schedule.CreateNonWorkingPeriod("Day1", "First test day",
                                                                       date.At(LocalTime.Midnight), Duration.FromHours(24));
            NonWorkingPeriod period2 = schedule.CreateNonWorkingPeriod("Day2", "First test day",
                                                                       date.PlusDays(7).At(time), Duration.FromHours(24));

            LocalDateTime from = date.At(time);
            LocalDateTime to   = date.At(time.PlusHours(1));

            // case #1
            Duration duration = schedule.CalculateNonWorkingTime(from, to);

            Assert.IsTrue(duration.Equals(Duration.FromHours(1)));

            // case #2
            from     = date.Minus(Period.FromDays(1)).At(time);
            to       = date.PlusDays(1).At(time);
            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(24)));

            // case #3
            from     = date.Minus(Period.FromDays(1)).At(time);
            to       = date.Minus(Period.FromDays(1)).At(time.PlusHours(1));
            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(0)));

            // case #4
            from     = date.PlusDays(1).At(time);
            to       = date.PlusDays(1).At(time.PlusHours(1));
            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(0)));

            // case #5
            from     = date.Minus(Period.FromDays(1)).At(time);
            to       = date.At(time);
            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(7)));

            // case #6
            from     = date.At(time);
            to       = date.PlusDays(1).At(time);
            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(17)));

            // case #7
            from     = date.At(LocalTime.Noon);
            to       = date.PlusDays(7).At(LocalTime.Noon);
            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(17)));

            // case #8
            from     = date.Minus(Period.FromDays(1)).At(LocalTime.Noon);
            to       = date.PlusDays(8).At(LocalTime.Noon);
            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(48)));

            // case #9
            schedule.DeleteNonWorkingPeriod(period1);
            schedule.DeleteNonWorkingPeriod(period2);
            from = date.At(time);
            to   = date.At(time.PlusHours(1));

            // case #10
            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(0)));

            Duration  shiftDuration = Duration.FromHours(8);
            LocalTime shiftStart    = new LocalTime(7, 0, 0);

            Shift shift = schedule.CreateShift("Work Shift1", "Working time shift", shiftStart, shiftDuration);

            Rotation rotation = new Rotation("Case 10", "Case10");

            rotation.AddSegment(shift, 1, 1);

            LocalDate startRotation = new LocalDate(2017, 1, 1);
            Team      team          = schedule.CreateTeam("Team", "Team", rotation, startRotation);

            team.RotationStart = startRotation;

            period1 = schedule.CreateNonWorkingPeriod("Day1", "First test day", date.At(LocalTime.Midnight),
                                                      Duration.FromHours(24));

            LocalDate mark = date.PlusDays(rotation.GetDayCount());

            from = mark.At(time.Minus(Period.FromHours(2)));
            to   = mark.At(time.Minus(Period.FromHours(1)));

            // case #11
            duration = schedule.CalculateWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(0)));

            // case #12
            from = date.At(shiftStart);
            to   = date.At(time.PlusHours(8));

            duration = schedule.CalculateNonWorkingTime(from, to);
            Assert.IsTrue(duration.Equals(Duration.FromHours(8)));
        }
示例#3
0
        public void TestGenericShift()
        {
            // regular work week with holidays and breaks
            schedule = new WorkSchedule("Regular 40 hour work week", "9 to 5");

            // holidays
            NonWorkingPeriod memorialDay = schedule.CreateNonWorkingPeriod("MEMORIAL DAY", "Memorial day", new LocalDateTime(2016, 5, 30, 0, 0, 0),
                                                                           Duration.FromHours(24));

            schedule.CreateNonWorkingPeriod("INDEPENDENCE DAY", "Independence day", new LocalDateTime(2016, 7, 4, 0, 0, 0),
                                            Duration.FromHours(24));
            schedule.CreateNonWorkingPeriod("LABOR DAY", "Labor day", new LocalDateTime(2016, 9, 5, 0, 0, 0),
                                            Duration.FromHours(24));
            schedule.CreateNonWorkingPeriod("THANKSGIVING", "Thanksgiving day and day after",
                                            new LocalDateTime(2016, 11, 24, 0, 0, 0), Duration.FromHours(48));
            schedule.CreateNonWorkingPeriod("CHRISTMAS SHUTDOWN", "Christmas week scheduled maintenance",
                                            new LocalDateTime(2016, 12, 25, 0, 30, 0), Duration.FromHours(168));

            // each shift duration
            Duration  shiftDuration = Duration.FromHours(8);
            LocalTime shift1Start   = new LocalTime(7, 0, 0);
            LocalTime shift2Start   = new LocalTime(15, 0, 0);

            // shift 1
            Shift shift1 = schedule.CreateShift("Shift1", "Shift #1", shift1Start, shiftDuration);

            // breaks
            shift1.CreateBreak("10AM", "10 am break", new LocalTime(10, 0, 0), Duration.FromMinutes(15));
            shift1.CreateBreak("LUNCH", "lunch", new LocalTime(12, 0, 0), Duration.FromHours(1));
            shift1.CreateBreak("2PM", "2 pm break", new LocalTime(14, 0, 0), Duration.FromMinutes(15));

            // shift 2
            Shift shift2 = schedule.CreateShift("Shift2", "Shift #2", shift2Start, shiftDuration);

            // shift 1, 5 days ON, 2 OFF
            Rotation rotation1 = new Rotation("Shift1", "Shift1");

            rotation1.AddSegment(shift1, 5, 2);

            // shift 2, 5 days ON, 2 OFF
            Rotation rotation2 = new Rotation("Shift2", "Shift2");

            rotation2.AddSegment(shift2, 5, 2);

            LocalDate startRotation = new LocalDate(2016, 1, 1);
            Team      team1         = schedule.CreateTeam("Team1", "Team #1", rotation1, startRotation);
            Team      team2         = schedule.CreateTeam("Team2", "Team #2", rotation2, startRotation);

            // same day
            LocalDateTime from = startRotation.PlusDays(7).At(shift1Start);
            LocalDateTime to;

            Duration totalWorking = Duration.Zero;

            // 21 days, team1
            Duration d = Duration.Zero;

            for (int i = 0; i < 21; i++)
            {
                to           = from.PlusDays(i);
                totalWorking = team1.CalculateWorkingTime(from, to);
                int dir = team1.GetDayInRotation(to.Date);

                Assert.IsTrue(totalWorking.Equals(d));

                TimePeriod period = rotation1.GetPeriods()[dir - 1];
                if (period is Shift)
                {
                    d = d.Plus(shiftDuration);
                }
            }
            Duration totalSchedule = totalWorking;

            // 21 days, team2
            from = startRotation.PlusDays(7).At(shift2Start);
            d    = Duration.Zero;

            for (int i = 0; i < 21; i++)
            {
                to           = from.PlusDays(i);
                totalWorking = team2.CalculateWorkingTime(from, to);
                int dir = team2.GetDayInRotation(to.Date);

                Assert.IsTrue(totalWorking.Equals(d));

                if (rotation1.GetPeriods()[dir - 1] is Shift)
                {
                    d = d.Plus(shiftDuration);
                }
            }
            totalSchedule = totalSchedule.Plus(totalWorking);

            Duration scheduleDuration   = schedule.CalculateWorkingTime(from, from.PlusDays(21));
            Duration nonWorkingDuration = schedule.CalculateNonWorkingTime(from, from.PlusDays(21));

            Assert.IsTrue(scheduleDuration.Plus(nonWorkingDuration).Equals(totalSchedule));

            // breaks
            Duration allBreaks = Duration.FromMinutes(90);

            Assert.IsTrue(shift1.CalculateBreakTime().Equals(allBreaks));

            // misc
            WorkSchedule schedule2 = new WorkSchedule();

            Shift shift3 = new Shift();

            shift3.Name = "Shift3";
            Assert.IsTrue(shift3.WorkSchedule == null);
            Assert.IsTrue(shift3.CompareTo(shift3) == 0);

            Team team3 = new Team();

            Assert.IsTrue(team3.WorkSchedule == null);

            RotationSegment segment = new RotationSegment();

            segment.Sequence      = 1;
            segment.StartingShift = shift2;
            segment.DaysOn        = 5;
            segment.DaysOff       = 2;
            Assert.IsTrue(segment.Rotation == null);

            Rotation rotation3 = new Rotation();

            rotation3.Name = "Rotation3";
            Assert.IsTrue(rotation3.CompareTo(rotation3) == 0);
            Assert.IsTrue(rotation3.RotationSegments.Count == 0);

            NonWorkingPeriod nwp = new NonWorkingPeriod();

            Assert.IsTrue(nwp.WorkSchedule == null);


            Assert.IsTrue(team1.WorkSchedule.Equals(schedule));


            Assert.IsTrue(!team1.IsDayOff(startRotation));


            Assert.IsTrue(team1.CompareTo(team1) == 0);
            team3.Rotation = rotation1;


            Assert.IsTrue(!memorialDay.IsInPeriod(new LocalDate(2016, 1, 1)));

            runBaseTest(schedule, Duration.FromHours(40), Duration.FromDays(7), new LocalDate(2016, 1, 1));
        }