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); } }
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); }
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 }
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); }
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); }