예제 #1
0
        public void GetsTocSchedulesHandlesIndividualDodgyServicesAndLogsAsWarning()
        {
            var logger    = Substitute.For <ILogger>();
            var timetable = CreateTimetable(logger);

            var schedule = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var start    = TestSchedules.Ten;
            var stops    = new ScheduleLocation[]
            {
                TestScheduleLocations.CreatePass(TestStations.Vauxhall, start.AddMinutes(10)),
                TestScheduleLocations.CreatePass(TestStations.ClaphamJunction, start.AddMinutes(20)),
                TestScheduleLocations.CreatePass(TestStations.Wimbledon, start.AddMinutes(20)),
            };
            var dodgySchedule = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "D11111", calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday), stops: stops);
            var schedule3     = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "X98765", calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            var found     = timetable.GetSchedulesByToc("VT", MondayAugust12, Time.Midnight);
            var schedules = found.services.Select(s => s.Details).ToArray();

            Assert.Contains <ISchedule>(schedule, schedules);
            Assert.Contains <ISchedule>(schedule3, schedules);
            Assert.All(found.services, s => { Assert.Equal(MondayAugust12, s.On); });

            logger.Received().Warning(Arg.Any <InvalidOperationException>(), Arg.Any <string>(), Arg.Any <IService>());
        }
예제 #2
0
        public void GetsTocSchedulesRunningOnRailDay()
        {
            var timetable = CreateTimetable();

            var schedule      = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule2     = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));
            var startsRailDay = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "X98765",
                                                                        calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday | DaysFlag.Tuesday),
                                                                        stops: TestSchedules.CreateThreeStopSchedule(Time.StartRailDay));
            var startsBeforeRailDay = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "X98764",
                                                                              calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday | DaysFlag.Tuesday),
                                                                              stops: TestSchedules.CreateThreeStopSchedule(Time.StartRailDay.AddMinutes(-1)));
            var startsAfterRailDay = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "X98766",
                                                                             calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday | DaysFlag.Tuesday),
                                                                             stops: TestSchedules.CreateThreeStopSchedule(Time.StartRailDay.AddMinutes(1)));

            var found = timetable.GetSchedulesByToc("VT", MondayAugust12, Time.StartRailDay);

            var startDaySchedule = found.services.Single(s => s.Details == startsRailDay);

            Assert.Equal(MondayAugust12, startDaySchedule.On);

            var startAfterDaySchedule = found.services.Single(s => s.Details == startsAfterRailDay);

            Assert.Equal(MondayAugust12, startAfterDaySchedule.On);

            var startBeforeDaySchedule = found.services.Single(s => s.Details == startsBeforeRailDay);

            Assert.Equal(TuesdayAugust13, startBeforeDaySchedule.On);

            Assert.Equal(4, found.services.Length);
        }
예제 #3
0
        public void GetScheduleByRetailServiceIdInvalidRetailServiceId(string retailServiceId)
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            var found = timetable.GetScheduleByRetailServiceId(retailServiceId, MondayAugust12);

            Assert.Empty(found.services);
            Assert.Equal(LookupStatus.InvalidRetailServiceId, found.status);
        }
예제 #4
0
        public void ScheduleNotFoundBasedUponRetailServiceId()
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            var found = timetable.GetScheduleByRetailServiceId("VT999900", MondayAugust12);

            Assert.Empty(found.services);
            Assert.Equal(LookupStatus.ServiceNotFound, found.status);
        }
예제 #5
0
        public void FindScheduleBasedUponTimetableUid(string timetableUid, string expected)
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "A00001");
            TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "A00002");

            var service = timetable.GetScheduleByTimetableUid(timetableUid, MondayAugust12).service;

            Assert.Equal(expected, service?.Details.TimetableUid);
        }
예제 #6
0
        public void ScheduleNotFound()
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            var found = timetable.GetScheduleByTimetableUid("Z98765", MondayAugust12);

            Assert.Null(found.service);
            Assert.Equal(LookupStatus.ServiceNotFound, found.status);
        }
예제 #7
0
        public void ScheduleNotRunningOnDate()
        {
            var timetable = CreateTimetable();
            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));

            var found = timetable.GetScheduleByTimetableUid("X12345", MondayAugust12.AddDays(2));

            Assert.Null(found.service);
            Assert.Equal(LookupStatus.NoScheduleOnDate, found.status);
        }
예제 #8
0
        public void ScheduleNotRunningOnDateBasedUponRetailServiceId()
        {
            var timetable = CreateTimetable();
            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));

            var found = timetable.GetScheduleByRetailServiceId("VT123400", MondayAugust12.AddDays(2));

            Assert.Empty(found.services);
            Assert.Equal(LookupStatus.NoScheduleOnDate, found.status);
        }
예제 #9
0
        public void FindScheduleBasedUponRetailServiceId(string retailServiceId, string expected)
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "A00001", retailServiceId: "VT1000");
            TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "A00002", retailServiceId: "VT200000");

            var services = timetable.GetScheduleByRetailServiceId(retailServiceId, MondayAugust12);
            var service  = services.services.FirstOrDefault()?.Details;

            Assert.Equal(expected, service?.RetailServiceId);
        }
예제 #10
0
        public void ScheduleNotFoundBasedUponRetailServiceIdWhenHaveTwoDifferentRetailServiceIdsForSameService()
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday), retailServiceId: "VT999900");

            var found = timetable.GetScheduleByRetailServiceId("VT999900", MondayAugust12);

            Assert.Empty(found.services);
            Assert.Equal(LookupStatus.NoScheduleOnDate, found.status);
        }
예제 #11
0
        public void TocScheduleNotFound()
        {
            var timetable = CreateTimetable();

            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));
            var schedule3 = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "X98765", calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            var found = timetable.GetSchedulesByToc("GR", MondayAugust12, Time.Midnight);

            Assert.Empty(found.services);
            Assert.Equal(LookupStatus.ServiceNotFound, found.status);
        }
예제 #12
0
        public void DoesNotReturnCancelledSchedulesRunningOnDate()
        {
            var timetable = CreateTimetable();

            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Everyday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            schedule2.StpIndicator = StpIndicator.Cancelled;

            var filter = new TocServicesFilter(timetable, Filters);
            var found  = filter.GetServicesByToc(false)("VT", MondayAugust12, Time.Midnight);

            Assert.Empty(found.services);
        }
예제 #13
0
        public void ResolvedServiceAlsoIncludesAssociatedServices()
        {
            var timetable  = CreateTimetable();
            var main       = TestSchedules.CreateScheduleInTimetable(timetable, "X12345", retailServiceId: "VT123401").Service;
            var associated = TestSchedules.CreateScheduleInTimetable(timetable, "A98765", retailServiceId: "VT123402").Service;

            var associations = new [] {
                TestAssociations.CreateAssociationWithServices(main, associated)
            };

            var found            = timetable.GetScheduleByTimetableUid("X12345", MondayAugust12);
            var withAssociations = found.service as ResolvedServiceWithAssociations;

            Assert.NotEmpty(withAssociations.Associations);
        }
예제 #14
0
        public void GetsScheduleRunningOnDateBasedUponRetailServiceId()
        {
            var timetable = CreateTimetable();

            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));

            var found = timetable.GetScheduleByRetailServiceId("VT123400", MondayAugust12).services.First();

            Assert.Equal(schedule, found.Details);
            Assert.Equal(MondayAugust12, found.On);

            found = timetable.GetScheduleByRetailServiceId("VT123400", TuesdayAugust13).services.First();
            Assert.Equal(TuesdayAugust13, found.On);
            Assert.Equal(schedule2, found.Details);
        }
예제 #15
0
        public void GetsScheduleRunningOnDate()
        {
            var timetable = CreateTimetable();

            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));

            var found = timetable.GetScheduleByTimetableUid("X12345", MondayAugust12);

            Assert.Equal(schedule, found.service.Details);
            Assert.Equal(MondayAugust12, found.service.On);

            found = timetable.GetScheduleByTimetableUid("X12345", TuesdayAugust13);
            Assert.Equal(schedule2, found.service.Details);
            Assert.Equal(TuesdayAugust13, found.service.On);
        }
예제 #16
0
        public void GetsCancelledSchedulesRunningOnDate()
        {
            var timetable = CreateTimetable();

            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Everyday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            schedule2.StpIndicator = StpIndicator.Cancelled;

            var filter  = new TocServicesFilter(timetable, Filters);
            var found   = filter.GetServicesByToc(true)("VT", MondayAugust12, Time.Midnight);
            var service = found.services[0];

            Assert.True(service.IsCancelled);
            Assert.Equal(MondayAugust12, service.On);
            Assert.Equal(schedule, service.Details);
        }
예제 #17
0
        public void AddAssociationToServices()
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, "X12345");
            TestSchedules.CreateScheduleInTimetable(timetable, "A98765");

            var associations = new [] {
                TestAssociations.CreateAssociation("X12345", "A98765")
            };

            var count = timetable.AddAssociations(associations);

            Assert.Equal(1, count);
            var service = timetable.GetService("X12345");

            Assert.Single(service.GetAssociations());
        }
예제 #18
0
        public void OnlyAddAssociationIfBothMainAndAssociatedServiceExist()
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, "X12345");

            var associations = new [] {
                TestAssociations.CreateAssociation("X12345", "A98765"),
                TestAssociations.CreateAssociation("A98765", "X12345")
            };

            var count = timetable.AddAssociations(associations);

            Assert.Equal(0, count);
            var service = timetable.GetService("X12345");

            Assert.Null(service.GetAssociations());
        }
예제 #19
0
        public void ScheduleCancelledOnDateBasedUponRetailServiceId()
        {
            var timetable = CreateTimetable();
            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Weekdays));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));

            schedule2.StpIndicator = StpIndicator.Cancelled;

            var found = timetable.GetScheduleByRetailServiceId("VT123400", MondayAugust12).services.First();

            Assert.False(found.IsCancelled);
            Assert.Equal(MondayAugust12, found.On);
            Assert.Equal(schedule, found.Details);

            found = timetable.GetScheduleByRetailServiceId("VT123400", TuesdayAugust13).services.First();
            Assert.True(found.IsCancelled);
            Assert.Equal(TuesdayAugust13, found.On);
            Assert.Equal(schedule, found.Details);
        }
예제 #20
0
        public void ScheduleCancelledOnDate()
        {
            var timetable = CreateTimetable();
            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Weekdays));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));

            schedule2.StpIndicator = StpIndicator.Cancelled;

            var found = timetable.GetScheduleByTimetableUid("X12345", MondayAugust12);

            Assert.False(found.service.IsCancelled);
            Assert.Equal(schedule, found.service.Details);
            Assert.Equal(MondayAugust12, found.service.On);

            found = timetable.GetScheduleByTimetableUid("X12345", TuesdayAugust13);
            Assert.Equal(LookupStatus.Success, found.status);
            Assert.True(found.service.IsCancelled);
            Assert.Equal(TuesdayAugust13, found.service.On);
            Assert.Equal(schedule, found.service.Details);
        }
예제 #21
0
        public void AddMultipleVersionsOfAnAssociationToServices()
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, "X12345");
            TestSchedules.CreateScheduleInTimetable(timetable, "A98765");

            var associations = new [] {
                TestAssociations.CreateAssociation("X12345", "A98765", StpIndicator.Permanent),
                TestAssociations.CreateAssociation("X12345", "A98765", StpIndicator.Override),
                TestAssociations.CreateAssociation("X12345", "A98765",
                                                   calendar: TestSchedules.CreateEverydayCalendar(new DateTime(2019, 9, 1), new DateTime(2019, 9, 30)))
            };

            var count = timetable.AddAssociations(associations);

            Assert.Equal(3, count);
            var service = timetable.GetService("X12345");

            Assert.Single(service.GetAssociations());
        }
예제 #22
0
        public void GetsTocSchedulesRunningOnDate()
        {
            var timetable = CreateTimetable();

            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Tuesday));
            var schedule3 = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "X98765", calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            var found     = timetable.GetSchedulesByToc("VT", MondayAugust12, Time.Midnight);
            var schedules = found.services.Select(s => s.Details).ToArray();

            Assert.Contains <ISchedule>(schedule, schedules);
            Assert.Contains <ISchedule>(schedule3, schedules);
            Assert.All(found.services, s => { Assert.Equal(MondayAugust12, s.On); });


            found     = timetable.GetSchedulesByToc("VT", TuesdayAugust13, Time.Midnight);
            schedules = found.services.Select(s => s.Details).ToArray();
            Assert.Contains <ISchedule>(schedule2, schedules);
            Assert.All(found.services, s => { Assert.Equal(TuesdayAugust13, s.On); });
        }
예제 #23
0
        public void GetsTocSchedulesHandlesIndividualServiceError()
        {
            var logger    = Substitute.For <ILogger>();
            var timetable = CreateTimetable(logger);

            var schedule  = TestSchedules.CreateScheduleInTimetable(timetable, calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule2 = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "CORRUPT", calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));
            var schedule3 = TestSchedules.CreateScheduleInTimetable(timetable, timetableId: "X98765", calendar: TestSchedules.CreateAugust2019Calendar(DaysFlag.Monday));

            var data = timetable.AsDynamic()._timetableUidMap.RealObject as Dictionary <string, IService>;

            data["CORRUPT"] = null;    // Force an error

            var found     = timetable.GetSchedulesByToc("VT", MondayAugust12, Time.Midnight);
            var schedules = found.services.Select(s => s.Details).ToArray();

            Assert.Contains <ISchedule>(schedule, schedules);
            Assert.Contains <ISchedule>(schedule3, schedules);
            Assert.All(found.services, s => { Assert.Equal(MondayAugust12, s.On); });

            logger.Received().Error(Arg.Any <Exception>(), Arg.Any <string>(), Arg.Any <IService>());
        }
예제 #24
0
        public void DoNotAddToOtherServiceIfAddingToMainFails()
        {
            var timetable = CreateTimetable();

            TestSchedules.CreateScheduleInTimetable(timetable, "X12345");
            TestSchedules.CreateScheduleInTimetable(timetable, "A98765");

            var associations = new [] {
                TestAssociations.CreateAssociation("X12345", "A98765", StpIndicator.Permanent),
                TestAssociations.CreateAssociation("X12345", "A98765", StpIndicator.Override),
                TestAssociations.CreateAssociation("X12345", "A98765", StpIndicator.Override),
            };

            var count = timetable.AddAssociations(associations);

            Assert.Equal(2, count);
            //TODO Inconsistent We remove original association in main but leave the original in the other service.
            var service = timetable.GetService("X12345");

            Assert.Single(service.GetAssociations().First().Value);
            var other = timetable.GetService("A98765");

            Assert.Equal(2, other.GetAssociations().First().Value.Count);
        }