public void BuildRaceTrace_ShouldThrowException_WhenDriverLookupIsNull( RaceTraceFactory raceTraceFactory, DriverCodeGenerator driverCodeGenerator) { var driverRaceData = new DriverRaceData(driverCodeGenerator.Generate()); var raceData = new RaceData(driverRaceData); var timeSpan = TimeSpan.FromTicks(TimeSpan.TicksPerMinute); var referenceTime = new ReferenceTime(timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds); Assert.Throws <ArgumentNullException>(() => raceTraceFactory.Build(raceData, referenceTime, null)); }
public void BuildRaceTrace_ShouldThrowException_WhenRaceDataIsNull( RaceTraceFactory raceTraceFactory, DriverCodeGenerator driverCodeGenerator, string driverName) { var timeSpan = TimeSpan.FromTicks(TimeSpan.TicksPerMinute); var referenceTime = new ReferenceTime(timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds); var diverLookup = new Dictionary <DriverCode, string> { { driverCodeGenerator.Generate(), driverName } }; Assert.Throws <ArgumentNullException>(() => raceTraceFactory.Build(null, referenceTime, diverLookup)); }
public void GetNextAllowedCallTime_WhenOnePreviousCallWasMadeMoreThanTimespanAgo_ReturnsZero(int lastCallMillisecondsAgo) { var currentDate = new DateTime(2018, 01, 01); ReferenceTime.FreezeAtUtc(currentDate); var callTracker = new Tracker(_store); callTracker.CallWillHappenIn(-lastCallMillisecondsAgo); var standardRateLimit = new StandardLimit(1, TimeSpan.FromMilliseconds(lastCallMillisecondsAgo - 100)); var nextAllowedCallTime = standardRateLimit.GetNextAllowedCallTime(callTracker); Assert.Equal(0, nextAllowedCallTime); ReferenceTime.Unfreeze(); }
public void GetNextAllowedCallTime_WhenOnePreviousCallTrackedForCurrentTime_ShouldBeNowPlusTimespanRange(int millisecondsTimespan) { var currentDate = new DateTime(2018, 01, 01); ReferenceTime.FreezeAtUtc(currentDate); var callTracker = new Tracker(_store); callTracker.CallWillHappenIn(0); var standardRateLimit = new StandardLimit(1, TimeSpan.FromMilliseconds(millisecondsTimespan)); var nextAllowedCallTime = standardRateLimit.GetNextAllowedCallTime(callTracker); Assert.Equal(millisecondsTimespan, nextAllowedCallTime); ReferenceTime.Unfreeze(); }
public void GetNextAllowedCallTime_ForTwoPreviousCalls_ReturnsCorrectTimespan() { var currentDate = new DateTime(2018, 01, 01); ReferenceTime.FreezeAtUtc(currentDate); var callTracker = new Tracker(_store); callTracker.CallWillHappenIn(10); callTracker.CallWillHappenIn(30); var standardRateLimit = new StandardLimit(2, TimeSpan.FromMilliseconds(100)); var nextAllowedCallTime = standardRateLimit.GetNextAllowedCallTime(callTracker); // 2 calls allowed every 100 milliseconds, so next call should be allowed in 110 milliseconds Assert.Equal(110, nextAllowedCallTime); ReferenceTime.Unfreeze(); }
public void TrimCallsForRateLimits_ForOneRateLimit_KeepsTheMostRecentCalls() { var now = new DateTime(2018, 01, 01); ReferenceTime.FreezeAtUtc(now); var callTracker = new Tracker(_store); callTracker.CallWillHappenIn(0); callTracker.CallWillHappenIn(1000); var rateLimit = new StandardLimit(1, TimeSpan.FromSeconds(1)); callTracker.TrimCallsForRateLimits(rateLimit); Assert.Single(callTracker.History); Assert.Equal(now.AddMilliseconds(1000), callTracker.History.Single()); ReferenceTime.Unfreeze(); }
public void BuildRaceTrace_CalculatesTrace_ForSingleDriver( RaceTraceFactory raceTraceFactory, DriverCodeGenerator driverCodeGenerator, LapDataGenerator lapDataGenerator, string driverName) { var driverCode = driverCodeGenerator.Generate(); var driverRaceData = new DriverRaceData(driverCode); var laps = lapDataGenerator.GenerateLaps(4); foreach (var(lapTime, lapData) in laps) { driverRaceData.AddLap(lapTime, lapData); } var raceData = new RaceData(driverRaceData); var timeSpan = TimeSpan.FromTicks(TimeSpan.TicksPerMinute); var referenceTime = new ReferenceTime(timeSpan.Minutes, timeSpan.Seconds, timeSpan.Milliseconds); var diverLookup = new Dictionary <DriverCode, string> { { driverCode, driverName } }; var raceTrace = raceTraceFactory.Build(raceData, referenceTime, diverLookup); Assert.NotNull(raceTrace); Assert.Equal(1, raceTrace.DriverCodes.Count); var traceData = raceTrace.GetDataForDriver(driverCode); Assert.NotNull(traceData); var traceLapDeltas = traceData.GetAllLaps(); Assert.Equal(4, traceLapDeltas.Count); }
/// <summary> /// Update <see cref="ReferenceTime"/> to observers. /// </summary> /// <param name="referenceTime">The reference time.</param> public void UpdateReferenceTime(ReferenceTime referenceTime) { _referenceTimeSubject.OnNext(referenceTime); }
private void CalculateRaceTrace(ReferenceTime referenceTime) { var traceData = _raceTraceFactory.Build(_raceData, referenceTime, _driveTeamLookup); PublishRaceTrace(traceData); }
//--------------------------------------------------------------------------------------------------------------------- public override string GetExecutionLogMessage() { return(String.Format("reference time of last run: {0}", ReferenceTime.ToString(@"yyyy\-MM\-dd\THH\:mm\:ss.fff\Z"))); }