public void AddLapResult_RaceFinishesAfterMaxLapsWithMultipleTimers() { int numberOflaps = 5; _raceManager.WaitForAllCarsToFinishDuration = 10000; _raceManager.SetMaxParticipants(3); var ip1 = IPAddress.Parse("1.1.1.1"); var ip2 = IPAddress.Parse("2.2.2.2"); var ip3 = IPAddress.Parse("3.3.3.3"); _raceManager.Register(ip1.ToString()); _raceManager.Register(ip2.ToString()); _raceManager.Register(ip3.ToString()); _raceManager.NumberOfLaps = numberOflaps; _raceManager.StartRace(0); for (int i = 0; i < numberOflaps - 1; i++) { _raceManager.AddLapResult(ip3, new TimeSpan(0, 1, i - 1)); _raceManager.AddLapResult(ip2, new TimeSpan(0, 1, i)); _raceManager.AddLapResult(ip1, new TimeSpan(0, 1, i + 1)); Assert.Equal(RaceState.InProgress, _raceManager.GetRaceState()); } _raceManager.AddLapResult(ip3, new TimeSpan(0, 1, 1)); // first car finishes Assert.Equal(RaceState.FinishCountdown, _raceManager.GetRaceState()); _raceManager.AddLapResult(ip1, new TimeSpan(0, 1, 2)); Assert.Equal(RaceState.FinishCountdown, _raceManager.GetRaceState()); _raceManager.AddLapResult(ip2, new TimeSpan(0, 1, 3)); // last car finishes Assert.Equal(RaceState.Finished, _raceManager.GetRaceState()); var finishedIds = _raceManager.GetFinishedParticipantsForLastRace(); // assert finished order Assert.Equal(3, finishedIds[0]); Assert.Equal(1, finishedIds[1]); Assert.Equal(2, finishedIds[2]); }