コード例 #1
0
        public async Task <TocLookup> UpdateTocsAsync(TocLookup lookup, CancellationToken token)
        {
            TrainOperatingCompanyList tocs = null;

            try
            {
                tocs = await _knowledgebase.GetTocs(token).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                _logger.Warning(e, "Error loading Knowledgebase Tocs.");
            }

            if (tocs == null)
            {
                return(lookup);
            }

            foreach (var toc in tocs.TrainOperatingCompany)
            {
                try
                {
                    var t = TocMapper.Map(toc);
                    lookup.AddIfNotExist(toc.AtocCode, t);
                }
                catch (Exception e)
                {
                    _logger.Warning(e, "Error loading Knowledgebase Toc: {toc}.", toc.AtocCode);
                }
            }

            return(lookup);
        }
コード例 #2
0
        private static Timetable.Data TestData()
        {
            var tocs = new TocLookup(Substitute.For <ILogger>(),
                                     new Dictionary <string, Toc>()
            {
                { "VT", new Toc("VT")
                  {
                      Name = "Avanti"
                  } }
            });

            var data = Substitute.For <ILocationData>();

            data.Locations.Returns(TestLocations());

            return(new Timetable.Data()
            {
                Tocs = tocs,
                Locations = data,
                Darwin = new RealtimeData()
                {
                    CancelReasons = CreateReasons("Cancel"),
                    LateRunningReasons = CreateReasons("Late"),
                    Sources = new Dictionary <string, string>()
                    {
                        { "AM01", "Southern Metropolitan" },
                        { "at02", "Birmingham" },
                        { "si01", "St Pancras" },
                    }
                }
            });
        }
コード例 #3
0
        public async Task <Data> LoadAsync(CancellationToken token)
        {
            var  tocs = new TocLookup(_logger);
            Data data = new Data()
            {
                Archive   = _cif.ArchiveFile,
                Tocs      = tocs,
                Locations = await LoadLocationsAsync(tocs, token).ConfigureAwait(false)
            };

            var enrichRefDataTask = Task.Run(async() =>
            {
                data = await _darwin.EnrichReferenceDataAsync(data, token).ConfigureAwait(false);
                data = await _knowledgebase.EnrichReferenceDataAsync(data, token).ConfigureAwait(false);
            });
            var cifTask = Task.Run(async() =>
            {
                data = await _cif.LoadCif(data, token).ConfigureAwait(false);
            });

            if (Task.WaitAll(new Task[] { enrichRefDataTask, cifTask }, Timeout))
            {
                return(data);
            }

            return(new Data());
        }
コード例 #4
0
        public void CreatesNewToc()
        {
            var lookup = new TocLookup(Substitute.For <ILogger>(), new Dictionary <string, Toc>());

            var toc = lookup.FindOrAdd("VT");

            Assert.Equal("VT", toc.Code);
        }
コード例 #5
0
        public void ReturnsSameTocOnSubsequentCalls()
        {
            var lookup = new TocLookup(Substitute.For <ILogger>(), new Dictionary <string, Toc>());

            var toc1 = lookup.FindOrAdd("VT");
            var toc2 = lookup.FindOrAdd("VT");

            Assert.Same(toc2, toc1);
        }
コード例 #6
0
        private static TocLookup CreateTocLookup()
        {
            var lookup = new TocLookup(Substitute.For <ILogger>(),
                                       new Dictionary <string, Toc>()
            {
                { "VT", VT }
            });

            return(lookup);
        }
コード例 #7
0
        public TocLookupTest()
        {
            TestTocs = new List <Toc>();
            var lookup = new TocLookup(Substitute.For <ILogger>(), new Dictionary <string, Toc>());

            TestTocs.Add(lookup.FindOrAdd("VT"));
            TestTocs.Add(lookup.FindOrAdd("GR"));
            TestTocs.Add(lookup.FindOrAdd("GW"));
            TestLookup = lookup;
        }
コード例 #8
0
        public void AddOrReplaceAddsNewTocWhenNotExist()
        {
            var avanti = new Toc("VT", "Avanti");
            var lookup = new TocLookup(Substitute.For <ILogger>(), new Dictionary <string, Toc>());

            lookup.AddOrReplace("VT", avanti);
            var toc = lookup["VT"].Single();

            Assert.Same(avanti, toc);
        }
コード例 #9
0
        public async Task UpdateStations()
        {
            var tocs   = new TocLookup(Substitute.For <ILogger>());
            var loader = CreateLoader(knowledgebase: MockKnowledgebase);

            var locations = Timetable.Test.Data.TestData.Locations;

            locations = await loader.UpdateLocationsWithKnowledgebaseStationsAsync(locations, tocs, CancellationToken.None);

            locations.TryGetStation("WAT", out Station waterloo);
            Assert.Equal("Waterloo", waterloo.Name);
        }
コード例 #10
0
        public async Task UpdateTocsDoesNotAddIfExists()
        {
            var loader    = CreateLoader(knowledgebase: MockKnowledgebase);
            var tocLookup = new TocLookup(Substitute.For <ILogger>());

            tocLookup.AddOrReplace("VT", new Toc("VT", "Already added"));
            var tocs = await loader.UpdateTocsAsync(tocLookup, CancellationToken.None);

            var vt = tocs["VT"].Single();

            Assert.Equal("Already added", vt.Name);
        }
コード例 #11
0
        public async Task <TocLookup> UpdateTocsAsync(TocLookup tocs, CancellationToken token)
        {
            var refData = await GetReferenceData(token).ConfigureAwait(false);

            foreach (var toc in refData.TocRef)
            {
                var t = TocMapper.Map(toc);
                tocs.AddOrReplace(t.Code, t);
            }

            return(tocs);
        }
コード例 #12
0
        public async Task UpdateStationsEvenWhenSet()
        {
            var tocs   = new TocLookup(Substitute.For <ILogger>());
            var loader = CreateLoader(knowledgebase: MockKnowledgebase);

            var locations = Timetable.Test.Data.TestData.Locations;

            locations.TryGetStation("SUR", out var surbiton);
            surbiton.Name = "Original";

            locations = await loader.UpdateLocationsWithKnowledgebaseStationsAsync(locations, tocs, CancellationToken.None);

            Assert.Equal("Surbiton", surbiton.Name);
        }
コード例 #13
0
        public void ReturnsExistingToc()
        {
            var vt = new Toc("VT");

            var lookup = new TocLookup(Substitute.For <ILogger>(),
                                       new Dictionary <string, Toc>()
            {
                { "VT", vt }
            });

            var toc = lookup.FindOrAdd("VT");

            Assert.Same(vt, toc);
        }
コード例 #14
0
        public void AddOrReplaceReplacesExistingToc()
        {
            var avanti = new Toc("VT", "Avanti");

            var lookup = new TocLookup(Substitute.For <ILogger>(),
                                       new Dictionary <string, Toc>()
            {
                { "VT", avanti }
            });

            var virgin = new Toc("VT", "Virgin");

            lookup.AddOrReplace("VT", virgin);
            var toc = lookup["VT"].Single();

            Assert.Same(virgin, toc);
        }
コード例 #15
0
        public void IgnoresAddingExistingToc()
        {
            var avanti = new Toc("VT", "Avanti");

            var lookup = new TocLookup(Substitute.For <ILogger>(),
                                       new Dictionary <string, Toc>()
            {
                { "VT", avanti }
            });

            var virgin = new Toc("VT", "Virgin");

            lookup.AddIfNotExist("VT", virgin);
            var toc = lookup["VT"].Single();

            Assert.Same(avanti, toc);
        }
コード例 #16
0
 internal async Task <ILocationData> LoadLocationsAsync(TocLookup lookup, CancellationToken token)
 {
     return(await _cif.LoadStationMasterListAsync(token).ConfigureAwait(false));
 }
コード例 #17
0
        public async Task <ILocationData> UpdateLocationsWithKnowledgebaseStationsAsync(ILocationData locations,
                                                                                        TocLookup lookup, CancellationToken token)
        {
            var mapper = new StationMapper(lookup);

            StationList stations = null;

            try
            {
                stations = await _knowledgebase.GetStations(token).ConfigureAwait(false);
            }
            catch (Exception e)
            {
                _logger.Warning(e, "Error loading Knowledgebase Stations.");
            }

            if (stations == null)
            {
                return(locations);
            }

            foreach (var station in stations.Station)
            {
                try
                {
                    if (locations.TryGetStation(station.CrsCode, out var target))
                    {
                        mapper.Update(target, station);
                    }
                }
                catch (Exception e)
                {
                    _logger.Warning(e, "Error updating station: {station} with knowledgebase.", station.CrsCode);
                }
            }

            return(locations);
        }
コード例 #18
0
 internal StationMapper(TocLookup lookup, ILocationData locations, ILogger log)
 {
     _tocLookup = lookup;
     _locations = locations;
     _log       = log;
 }
コード例 #19
0
        public async Task <ILocationData> EnrichLocationsAsync(ILocationData locations, TocLookup lookup, CancellationToken token)
        {
            var refData = await GetReferenceData(token).ConfigureAwait(false);

            var mapper = new StationMapper(lookup, locations, _logger);

            foreach (var location in refData.LocationRef)
            {
                try
                {
                    if (ShouldUpdate(location) && locations.TryGetStation(location.crs, out var target))
                    {
                        mapper.Update(target, location);
                    }
                    else
                    {
                        _logger.Debug("Darwin Location not loaded: {tpl} : {name}", location.tpl, location.locname);
                    }
                }
                catch (Exception e)
                {
                    _logger.Warning(e, "Error updating station: {station} with Darwin data.", location.crs);
                }
            }

            foreach (var viaRule in refData.Via)
            {
                try
                {
                    if (locations.TryGetStation(viaRule.at, out var target))
                    {
                        mapper.AddRule(target, viaRule);
                    }
                }
                catch (Exception e)
                {
                    _logger.Warning(e, "Error updating station: {station} with Via rule.", viaRule.at);
                }
            }

            return(locations);

            bool ShouldUpdate(LocationRef location)
            {
                return(!string.IsNullOrEmpty(location.crs));
            }
        }
コード例 #20
0
 internal StationMapper(TocLookup lookup)
 {
     _tocLookup = lookup;
 }