public void AircraftDetailFetcher_BaseStationDatabase_FileNameChanged_Forces_Refresh_Of_All_Database_Details_On_Next_Fast_Tick() { // If it performed the refetch immediately then it could cause the options screen to appear to hang as the event // is probably being raised on the GUI thread. Pushing it to the next fast heartbeat stops that, it'll happen on // our timer thread. _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "OLD" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraft = new BaseStationAircraft() { ModeS = "ABC123", Registration = "NEW" }; _Database.Raise(r => r.FileNameChanged += null, EventArgs.Empty); Assert.AreEqual(1, _FetchedHandler.CallCount); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); Assert.AreEqual(2, _FetchedHandler.CallCount); var lastArgs = _FetchedHandler.AllArgs[1].Value; Assert.AreSame(_DatabaseAircraft, lastArgs.Aircraft); }
public void AircraftDetailFetcher_RegisterAircraft_Always_Returns_Null_On_First_Add() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; Assert.IsNull(_Fetcher.RegisterAircraft(_Aircraft.Object)); }
public void AircraftDetailFetcher_Fetched_Not_Raised_If_BaseStationDatabase_AircraftUpdated_Raised_For_Unknown_Aircraft() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "New" }; _Database.Raise(r => r.AircraftUpdated += null, new EventArgs <BaseStationAircraft>(_DatabaseAircraftAndFlights)); Assert.AreEqual(0, _FetchedHandler.CallCount); }
public void AircraftDetailFetcher_RegisterAircraft_Searches_For_AircraftType_Using_Database_Detail() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", ICAOTypeCode = "B747" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _StandingDataManager.Verify(r => r.FindAircraftType("B747"), Times.Once()); }
public void AircraftDetailFetcher_RegisterAircraft_Does_Not_Make_Individual_Requests_For_Flight_Counts() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _Database.Verify(r => r.GetCountOfFlightsForAircraft(It.IsAny <BaseStationAircraft>(), It.IsAny <SearchBaseStationCriteria>()), Times.Never()); }
public void AircraftDetailFetcher_RegisterAircraft_Exposes_AircraftType_In_Results() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", ICAOTypeCode = "B747" }; _FindAircraftType = "B747"; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); Assert.AreSame(_AircraftType, _FetchedHandler.Args.Value.AircraftType); }
public void AircraftDetailFetcher_RegisterAircraft_Fetches_Aircraft_Picture_Only_On_First_Fast_Tick() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _AircraftPictureManager.Verify(r => r.FindPicture(It.IsAny <IDirectoryCache>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <PictureDetail>()), Times.Once()); }
public void AircraftDetailFetcher_RegisterAircraft_Fetches_Aircraft_Record_Only_On_First_Fast_Tick() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); Assert.AreEqual("ABC123", _GetManyAircraftAndFlightsByCodes.Single()); }
public void AircraftDetailFetcher_Fetched_Not_Raised_If_AircraftType_Does_Not_Change() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", ICAOTypeCode = "B747" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); Assert.AreEqual(1, _FetchedHandler.CallCount); }
public void AircraftDetailFetcher_Fetched_Not_Raised_If_Aircraft_Record_Added_Before_Interval_Has_Elapsed() { _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds - 1); _Heartbeat.Raise(r => r.SlowTick += null, EventArgs.Empty); Assert.AreEqual(1, _FetchedHandler.CallCount); }
public void AircraftDetailFetcher_Fetched_Raised_If_Picture_Exists() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "ABC" }; _PictureManagerReg = "ABC"; _PictureManagerIcao24 = "ABC123"; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); Assert.AreSame(_PictureDetail, _FetchedHandler.Args.Value.Picture); }
public void AircraftDetailFetcher_AutoConfigPictureFolderCache_CacheConfigurationChanged_Does_Not_Rerun_Database_Search() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "ABC" }; _PictureManagerReg = "ABC"; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _AutoConfigPictureFolderCache.Raise(r => r.CacheConfigurationChanged += null, EventArgs.Empty); _AircraftPictureManager.Verify(r => r.FindPicture(_PictureFolderCache.Object, "ABC123", "ABC", It.IsAny <PictureDetail>()), Times.Exactly(2)); Assert.AreEqual("ABC123", _GetManyAircraftAndFlightsByCodes.Single()); }
public void StandingDataManager_LoadCompleted_Does_Not_Rerun_A_Database_Search() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", ICAOTypeCode = "B747" }; _FindAircraftType = "B747"; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _StandingDataManager.Raise(r => r.LoadCompleted += null, EventArgs.Empty); _StandingDataManager.Verify(r => r.FindAircraftType("B747"), Times.Exactly(2)); Assert.AreEqual("ABC123", _GetManyAircraftAndFlightsByCodes.Single()); }
/// <summary> /// Fetches many aircraft simultaneously. /// </summary> /// <param name="fetchedDetails"></param> /// <returns></returns> protected override bool DoFetchManyAircraft(IEnumerable <AircraftFetcher <string, AircraftDetail> .FetchedDetail> fetchedDetails) { var allIcaos = fetchedDetails.Select(r => r.Key).ToArray(); var newIcaos = fetchedDetails.Where(r => r.Detail == null || r.Detail.Aircraft == null).Select(r => r.Key).ToArray(); var existingIcaos = fetchedDetails.Where(r => r.Detail != null && r.Detail.Aircraft != null).Select(r => r.Key).ToArray(); var aircraftAndFlightCounts = _AutoConfigDatabase.Database.GetManyAircraftAndFlightsCountByCode(newIcaos); var aircraft = _AutoConfigDatabase.Database.GetManyAircraftByCode(existingIcaos); var combinedAircraft = new Dictionary <string, BaseStationAircraft>(); foreach (var kvp in aircraftAndFlightCounts) { combinedAircraft.Add(kvp.Key, kvp.Value); } foreach (var kvp in aircraft) { combinedAircraft.Add(kvp.Key, kvp.Value); } var allOnlineAircraft = _AircraftOnlineLookupManager.LookupMany(allIcaos, combinedAircraft); foreach (var kvp in fetchedDetails) { var icao24 = kvp.Key; var fetchedDetail = kvp; BaseStationAircraft databaseAircraft = null; BaseStationAircraftAndFlightsCount databaseAircraftAndFlights = null; if (!aircraft.TryGetValue(icao24, out databaseAircraft)) { aircraftAndFlightCounts.TryGetValue(icao24, out databaseAircraftAndFlights); } AircraftOnlineLookupDetail onlineAircraft; allOnlineAircraft.TryGetValue(icao24, out onlineAircraft); kvp.Detail = ApplyDatabaseRecord( fetchedDetail.Detail, databaseAircraftAndFlights ?? databaseAircraft, onlineAircraft, fetchedDetail.Aircraft, fetchedDetail.IsFirstFetch, databaseAircraftAndFlights != null ? databaseAircraftAndFlights.FlightsCount : fetchedDetail.Detail != null ? fetchedDetail.Detail.FlightsCount : 0 ); } return(true); }
public void AircraftDetailFetcher_Fetched_Raised_If_Aircraft_Has_Database_Record() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", FlightsCount = 100 }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); Assert.AreEqual(1, _FetchedHandler.CallCount); Assert.AreSame(_DatabaseAircraftAndFlights, _FetchedHandler.Args.Value.Aircraft); Assert.AreEqual(100, _FetchedHandler.Args.Value.FlightsCount); Assert.AreEqual("ABC123", _FetchedHandler.Args.Value.Icao24); Assert.AreSame(_Fetcher, _FetchedHandler.Sender); }
public void AircraftDetailFetcher_RegisterAircraft_Does_Not_Raise_Multiple_Events_When_Same_Aircraft_Registered_Twice_Before_Initial_Lookup() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; var sameAircraftDifferentObject = TestUtilities.CreateMockInstance <IAircraft>(); sameAircraftDifferentObject.Setup(r => r.Icao24).Returns("ABC123"); _Fetcher.RegisterAircraft(_Aircraft.Object); _Fetcher.RegisterAircraft(sameAircraftDifferentObject.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); Assert.AreEqual(1, _FetchedHandler.CallCount); }
public void AircraftDetailFetcher_Fetched_Raised_If_BaseStationDatabase_AircraftUpdated_Raised_And_Details_Have_Not_Changed() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Database.Raise(r => r.AircraftUpdated += null, new EventArgs <BaseStationAircraft>(_DatabaseAircraftAndFlights)); Assert.AreEqual(1, _FetchedHandler.CallCount); }
public void AircraftDetailFetcher_Fetched_Does_Not_Fetch_Aircraft_Record_If_BaseStationDatabase_AircraftUpdated_Raised() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "New" }; _Database.Raise(r => r.AircraftUpdated += null, new EventArgs <BaseStationAircraft>(_DatabaseAircraftAndFlights)); Assert.AreEqual("ABC123", _GetManyAircraftAndFlightsByCodes.Single()); }
public void AircraftDetailFetcher_Fetched_Not_Raised_If_AircraftType_Changes() { // Standing data manager will tell us if it's possible that the aircraft type has changed - we should // only check it if the code changes and we already have a test for that. _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", ICAOTypeCode = "B747" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _FindAircraftType = "B747"; _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); Assert.AreEqual(1, _FetchedHandler.CallCount); }
public void AircraftDetailFetcher_Fetched_Raised_With_Null_Aircraft_If_Aircraft_Record_Removed_After_Interval_Has_Elapsed() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraftAndFlights = null; _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); _Heartbeat.Raise(r => r.SlowTick += null, EventArgs.Empty); Assert.AreEqual(2, _FetchedHandler.CallCount); Assert.IsNotNull(_FetchedHandler.AllArgs[0].Value.Aircraft); Assert.IsNull(_FetchedHandler.AllArgs[1].Value.Aircraft); }
public void AircraftDetailFetcher_Fetched_Not_Raised_If_Aircraft_Record_Remains_Deleted_After_Interval_Elapses_Twice() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); // First raise of Fetched _DatabaseAircraftAndFlights = null; _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); _Heartbeat.Raise(r => r.SlowTick += null, EventArgs.Empty); // Second raise of Fetched _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); _Heartbeat.Raise(r => r.SlowTick += null, EventArgs.Empty); // Should not trigger a third Assert.AreEqual(2, _FetchedHandler.CallCount); }
public void AircraftDetailFetcher_Fetched_Refetches_Aircraft_Picture_If_BaseStationDatabase_AircraftUpdated_Raised_With_Same_Registration() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "ABC" }; _PictureManagerReg = "XYZ"; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "ABC" }; _Database.Raise(r => r.AircraftUpdated += null, new EventArgs <BaseStationAircraft>(_DatabaseAircraftAndFlights)); _AircraftPictureManager.Verify(r => r.FindPicture(_PictureFolderCache.Object, "ABC123", "ABC", It.IsAny <PictureDetail>()), Times.Exactly(2)); }
public void AircraftDetailFetcher_Fetched_Raised_If_Picture_Found_But_Database_Record_Unchanged() { _DatabaseAircraft = _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "ABC" }; _PictureManagerReg = null; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); _PictureManagerReg = "ABC"; _PictureManagerIcao24 = "ABC123"; _Heartbeat.Raise(r => r.SlowTick += null, EventArgs.Empty); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); Assert.AreEqual(2, _FetchedHandler.CallCount); Assert.AreSame(_PictureDetail, _FetchedHandler.Args.Value.Picture); }
public void AircraftDetailFetcher_Fetched_Not_Raised_If_Aircraft_Unchanged_After_AircraftUpdated_Raised() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraft = new BaseStationAircraft() { ModeS = "ABC123", Registration = "New" }; _Database.Raise(r => r.AircraftUpdated += null, new EventArgs <BaseStationAircraft>(_DatabaseAircraftAndFlights)); _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); _Heartbeat.Raise(r => r.SlowTick += null, EventArgs.Empty); Assert.AreEqual(2, _FetchedHandler.CallCount); }
public void AircraftDetailFetcher_Fetched_Raised_If_Aircraft_Record_Changes() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", FlightsCount = 52 }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraft = new BaseStationAircraft() { ModeS = "ABC123", Registration = "New Registration" }; _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); _Heartbeat.Raise(r => r.SlowTick += null, EventArgs.Empty); Assert.AreEqual(2, _FetchedHandler.CallCount); Assert.AreEqual("New Registration", _FetchedHandler.Args.Value.Aircraft.Registration); Assert.AreEqual(52, _FetchedHandler.Args.Value.FlightsCount); }
public void StandingDataManager_LoadCompleted_Exceptions_Get_Logged_But_Do_Not_Bubble_Up() { var messageLogged = false; _Log.Setup(r => r.WriteLine(It.IsAny <string>())).Callback((string x) => { messageLogged = true; }); _Log.Setup(r => r.WriteLine(It.IsAny <string>(), It.IsAny <object[]>())).Callback((string x, object[] args) => { messageLogged = true; }); _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", ICAOTypeCode = "B747" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _StandingDataManager.Setup(r => r.FindAircraftType(It.IsAny <string>())) .Callback((string code) => { throw new InvalidOperationException(); }); _StandingDataManager.Raise(r => r.LoadCompleted += null, EventArgs.Empty); Assert.IsTrue(messageLogged); }
public void AircraftDetailFetcher_StandingDataManager_AutoConfigPictureFolderCache_CacheConfigurationChanged_Exceptions_Get_Logged_But_Do_Not_Bubble_Up() { var messageLogged = false; _PictureManagerIcao24 = "ABC123"; _Log.Setup(r => r.WriteLine(It.IsAny <string>())).Callback((string x) => { messageLogged = true; }); _Log.Setup(r => r.WriteLine(It.IsAny <string>(), It.IsAny <object[]>())).Callback((string x, object[] args) => { messageLogged = true; }); _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "ABC" }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _PictureManagerThrowException = true; _AutoConfigPictureFolderCache.Raise(r => r.CacheConfigurationChanged += null, EventArgs.Empty); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); Assert.IsTrue(messageLogged); }
public void AircraftDetailFetcher_RegisterAircraft_Does_Not_Refetch_AircraftType_If_ModelIcao_Has_Not_Changed() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", ICAOTypeCode = "B747" }; _FindAircraftType = "B747"; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _Clock.UtcNowValue = _Clock.UtcNowValue.AddMilliseconds(IntervalMilliseconds); _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "ABC", ICAOTypeCode = "B747" }; _Heartbeat.Raise(r => r.SlowTick += null, EventArgs.Empty); _StandingDataManager.Verify(r => r.FindAircraftType("B747"), Times.Once()); Assert.AreEqual(2, _FetchedHandler.CallCount); Assert.AreSame(_AircraftType, _FetchedHandler.AllArgs[1].Value.AircraftType); }
public void AircraftDetailFetcher_RegisterAircraft_Returns_The_Correct_Details_If_The_Aircraft_Has_Already_Been_Registered() { var sameAircraftDifferentObject = TestUtilities.CreateMockInstance <IAircraft>(); sameAircraftDifferentObject.Setup(r => r.Icao24).Returns("ABC123"); sameAircraftDifferentObject.Setup(r => r.Registration).Returns("G-ABCD"); _PictureManagerReg = "G-ABCD"; _PictureManagerIcao24 = "ABC123"; _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "G-ABCD", FlightsCount = 88 }; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); var details = _Fetcher.RegisterAircraft(sameAircraftDifferentObject.Object); Assert.AreSame(_DatabaseAircraftAndFlights, details.Aircraft); Assert.AreEqual(88, details.FlightsCount); Assert.AreSame(_PictureDetail, details.Picture); }
public void AircraftDetailFetcher_Fetched_Does_Refetches_Aircraft_Picture_If_BaseStationDatabase_AircraftUpdated_Raised_With_New_Registration() { _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "ABC" }; _PictureManagerReg = "XYZ"; _PictureManagerIcao24 = "ABC123"; _Fetcher.RegisterAircraft(_Aircraft.Object); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _DatabaseAircraftAndFlights = new BaseStationAircraftAndFlightsCount() { ModeS = "ABC123", Registration = "XYZ" }; _Database.Raise(r => r.AircraftUpdated += null, new EventArgs <BaseStationAircraft>(_DatabaseAircraftAndFlights)); _Heartbeat.Raise(r => r.FastTick += null, EventArgs.Empty); _AircraftPictureManager.Verify(r => r.FindPicture(_PictureFolderCache.Object, "ABC123", "ABC", It.IsAny <PictureDetail>()), Times.Once()); _AircraftPictureManager.Verify(r => r.FindPicture(_PictureFolderCache.Object, "ABC123", "XYZ", It.IsAny <PictureDetail>()), Times.Once()); Assert.AreSame(_PictureDetail, _FetchedHandler.AllArgs[1].Value.Picture); }