Пример #1
0
        public void TestTrailingOverride()
        {
            List <RouteScheduleOverride> routeScheduleOverrides;
            var schedule = InitialSchedule(8, 12, 9, 12, out routeScheduleOverrides);  // Override starts later, Both end at same time, leaving first part of original schedule

            var realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);

            Assert.AreEqual(1, realSchedules.Count);

            Assert.AreEqual(schedule.StartTime, realSchedules[0].StartTime);
            Assert.AreEqual(ScheduleTime(9, 0, 0), realSchedules[0].EndTime);


            routeScheduleOverrides[0].EndTime = ScheduleTime(13, 0, 0);  // Override ends past fixed schedule leaving the first part of original schedule
            realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);
            Assert.AreEqual(1, realSchedules.Count);

            Assert.AreEqual(schedule.StartTime, realSchedules[0].StartTime);
            Assert.AreEqual(ScheduleTime(9, 0, 0), realSchedules[0].EndTime);

            routeScheduleOverrides[0].EndTime = ScheduleTime(10, 0, 0);  // Override ends in middle of original schedule, leaving first and last segment
            realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);
            Assert.AreEqual(2, realSchedules.Count);

            Assert.AreEqual(schedule.StartTime, realSchedules[0].StartTime);
            Assert.AreEqual(ScheduleTime(9, 0, 0), realSchedules[0].EndTime);

            Assert.AreEqual(ScheduleTime(10, 0, 0), realSchedules[1].StartTime);
            Assert.AreEqual(schedule.EndTime, realSchedules[1].EndTime);
        }
        public static List <RouteScheduleSummary> GetSchedules()
        {
            using (var db = new TrolleyTracker.Models.TrolleyTrackerContext())
            {
                var currentDateTime = UTCToLocalTime.LocalTimeFromUTC(DateTime.UtcNow);

                var fixedRouteSchedules = (from route in db.Routes
                                           from routeSchedule in db.RouteSchedules
                                           orderby routeSchedule.StartTime, routeSchedule.Route.ShortName
                                           where (routeSchedule.RouteID == route.ID)
                                           select routeSchedule).ToList <RouteSchedule>();

                var today = currentDateTime.Date;
                var routeScheduleOverrideList = (from rso in db.RouteScheduleOverrides
                                                 orderby rso.OverrideDate, rso.StartTime, rso.NewRoute.ShortName
                                                 select rso).ToList <RouteScheduleOverride>();

                var scheduleToDate = new Dictionary <RouteSchedule, DateTime>();
                var routeSchedules = BuildScheduleView.BuildEffectiveRouteSchedule(currentDateTime, 7, fixedRouteSchedules, scheduleToDate, routeScheduleOverrideList);

                var schedules = new List <RouteScheduleSummary>();
                foreach (var routeSchedule in routeSchedules)
                {
                    schedules.Add(new RouteScheduleSummary(routeSchedule));
                }
                return(schedules);
            }
        }
Пример #3
0
        public void TestMultipleOverride()
        {
            List <RouteScheduleOverride> routeScheduleOverrides;
            var schedule = InitialSchedule(6, 23, 9, 12, out routeScheduleOverrides);  // Override starts later, Both end at same time, leaving first part of original schedule


            // Create second override
            var scheduleOverride = new RouteScheduleOverride();

            scheduleOverride.OverrideType = RouteScheduleOverride.OverrideRule.NoService;  // Result will be same for either NoService or Replace
            scheduleOverride.StartTime    = ScheduleTime(15, 0, 0);
            scheduleOverride.EndTime      = ScheduleTime(16, 0, 0);
            routeScheduleOverrides.Add(scheduleOverride);

            var realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);

            Assert.AreEqual(3, realSchedules.Count);

            // Leaves segments 6:00-9:00, 12:00-15:00, 16:00-23:00

            Assert.AreEqual(schedule.StartTime, realSchedules[0].StartTime);
            Assert.AreEqual(ScheduleTime(9, 0, 0), realSchedules[0].EndTime);

            Assert.AreEqual(ScheduleTime(12, 0, 0), realSchedules[1].StartTime);
            Assert.AreEqual(ScheduleTime(15, 0, 0), realSchedules[1].EndTime);

            Assert.AreEqual(ScheduleTime(16, 0, 0), realSchedules[2].StartTime);
            Assert.AreEqual(ScheduleTime(23, 0, 0), realSchedules[2].EndTime);
        }
Пример #4
0
        public void TestCoincidentOverride()
        {
            List <RouteScheduleOverride> routeScheduleOverrides;
            var schedule = InitialSchedule(6, 10, 6, 10, out routeScheduleOverrides);

            var realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);

            Assert.AreEqual(0, realSchedules.Count);  // Original schedule completely removed
        }
Пример #5
0
        public void TestRegularSchedule()
        {
            List <RouteScheduleOverride> routeScheduleOverrides;
            var schedule = InitialSchedule(6, 10, 12, 14, out routeScheduleOverrides);  // Non-overlapping times (No effect on fixed schedule)

            var realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);

            Assert.AreEqual(1, realSchedules.Count);

            Assert.AreEqual(realSchedules[0].StartTime, schedule.StartTime);
            Assert.AreEqual(realSchedules[0].EndTime, schedule.EndTime);
        }
Пример #6
0
        public void TestLeadingOverride()
        {
            List <RouteScheduleOverride> routeScheduleOverrides;
            var schedule = InitialSchedule(8, 10, 6, 10, out routeScheduleOverrides);  // Override starts early, Both end at same time

            var realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);

            Assert.AreEqual(0, realSchedules.Count);                   // Original schedule completely removed

            routeScheduleOverrides[0].EndTime = ScheduleTime(9, 0, 0); // Override ends early, leaving 1 hour of original schedule
            realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);
            Assert.AreEqual(1, realSchedules.Count);

            Assert.AreEqual(ScheduleTime(9, 0, 0), realSchedules[0].StartTime);
            Assert.AreEqual(schedule.EndTime, realSchedules[0].EndTime);

            routeScheduleOverrides[0].EndTime = ScheduleTime(12, 0, 0);  // Override ends past original schedule, cancelling it all
            realSchedules = BuildScheduleView.ModifyRouteScheduleForOverlap(schedule, routeScheduleOverrides);
            Assert.AreEqual(0, realSchedules.Count);
        }
        // Mapped as - GET: api/Routes/Active
        public List <RouteSummary> Get()
        {
            // Azure server instances run with DateTime.Now set to UTC
            var currentDateTime = UTCToLocalTime.LocalTimeFromUTC(DateTime.UtcNow);

            var activeRoutes = new List <RouteSummary>();
            var weekday      = (int)currentDateTime.DayOfWeek;

            // Note: ToList() to avoid "There is already an open DataReader associated with this Command which must be closed first." exception,
            // even though MultipleActiveResultSets is already true in the connection string.
            var todaysFixedRouteSchedules = (from route in db.Routes
                                             from routeSchedule in db.RouteSchedules
                                             orderby routeSchedule.StartTime
                                             where (routeSchedule.RouteID == route.ID) && (routeSchedule.DayOfWeek == weekday)
                                             select routeSchedule).ToList <RouteSchedule>();

            var today = currentDateTime.Date;
            var routeScheduleOverrideList = (from rso in db.RouteScheduleOverrides
                                             orderby rso.OverrideDate, rso.StartTime, rso.NewRoute.ShortName
                                             where rso.OverrideDate == today
                                             select rso).ToList <RouteScheduleOverride>();

            var scheduleToDate       = new Dictionary <RouteSchedule, DateTime>();
            var todaysRouteSchedules = BuildScheduleView.BuildEffectiveRouteSchedule(currentDateTime, 1, todaysFixedRouteSchedules, scheduleToDate, routeScheduleOverrideList);

            // Get today's effective routes
            // Return active routes 5 minutes early so that progress from garage to starting point
            // is shown, also if trolley is a few minutes early.

            var startTimeRef = currentDateTime.Add(new TimeSpan(0, 5, 0)).TimeOfDay;
            var endTimeRef   = currentDateTime.TimeOfDay;

            foreach (var routeSchedule in todaysRouteSchedules)
            {
                if ((startTimeRef > routeSchedule.StartTime.TimeOfDay) && (endTimeRef < routeSchedule.EndTime.TimeOfDay))
                {
                    activeRoutes.Add(new RouteSummary(routeSchedule.Route));
                }
            }
            return(activeRoutes);
        }