public async void TestInterimTimesCalculation()
        {
            // Setup
            var timestamps = new[] { 1576850000.000, 1576850001.111, 1576850002.222 };

            var sensorMeasurementDaoMock = new Mock <ISensorMeasurementDao>();

            sensorMeasurementDaoMock.Setup(d => d.GetMeasurementsForRun(It.IsAny <Run>()))
            .Returns(Task.FromResult(
                         timestamps.Select(t => new SensorMeasurement {
                Timestamp = t
            })
                         ));

            var runDaoMock = new Mock <IRunDao>();

            runDaoMock.Setup(d => d.GetBySkierAndRace(It.IsAny <Race>(), It.IsAny <int>(), It.IsAny <Skier>()))
            .Returns(Task.FromResult(new Run()));

            var daoProvider = DaoProviderHelper.GetPartialDaoProvider(
                sensorMeasurementDao: sensorMeasurementDaoMock.Object,
                runDao: runDaoMock.Object
                );
            var runService = new RunService(daoProvider, new SimulatorRaceClock());

            // Execute
            var calculatedTimespans = (await runService.GetInterimTimes(null, 1, null)).ToArray();

            // Assert
            Assert.Equal(timestamps.Length - 1, calculatedTimespans.Length);
            Assert.Equal(calculatedTimespans[0], TimeSpan.FromSeconds(timestamps[1] - timestamps[0]));
            Assert.Equal(calculatedTimespans[1], TimeSpan.FromSeconds(timestamps[2] - timestamps[0]));
        }
        public async void TestLeaderBoardCalculation()
        {
            // Setup
            var totalTimes = new[] { 2.2, 1.1, 3.3, 0.0, 0.0 };

            var runDaoMock = new Mock <IRunDao>();

            runDaoMock.Setup(d => d.GetAllRunsForRace(It.IsAny <Race>(), It.IsAny <int>()))
            .Returns(Task.FromResult(
                         totalTimes.Select(t => new Run {
                TotalTime = t
            })
                         ));

            var daoProvider = DaoProviderHelper.GetPartialDaoProvider(runDao: runDaoMock.Object);
            var runService  = new RunService(daoProvider, new SimulatorRaceClock());

            // Execute
            var leaderBoard = (await runService.GetLeaderBoard(null, 1)).ToArray();

            // Assert
            Assert.Equal(totalTimes.Length, leaderBoard.Length);
            Assert.Equal(1.1, leaderBoard[0].TotalTime);
            Assert.Equal(2.2, leaderBoard[1].TotalTime);
            Assert.Equal(3.3, leaderBoard[2].TotalTime);
            Assert.Equal(0.0, leaderBoard[3].TotalTime);
            Assert.Equal(0.0, leaderBoard[4].TotalTime);
        }
        public void TestRunStatusChangedEventInvocation()
        {
            // Setup
            var runDaoMock = new Mock <IRunDao>();

            runDaoMock.Setup(d => d.GetBySkierAndRace(It.IsAny <Race>(), It.IsAny <int>(), It.IsAny <Skier>()))
            .Returns(Task.FromResult(
                         new Run {
                Status = RunStatus.Ready
            })
                     );

            var daoProvider = DaoProviderHelper.GetPartialDaoProvider(runDao: runDaoMock.Object);
            var runService  = new RunService(daoProvider, new SimulatorRaceClock());

            var eventTriggered = false;

            runService.RunStatusChanged += (race, runNumber, skier, runStatus) => eventTriggered = true;

            // Execute
            runService.UpdateRunStatus(null, 1, null, RunStatus.InProgress);

            // Assert
            Assert.True(eventTriggered);
        }
        private static RunService GetRunServiceForSensorImpulseHandlingTest(IRaceClock raceClock)
        {
            var existingMeasurementsTimestamps = new[] { 1576850000.000, 1576850001.111, 1576850002.222 };

            var sensorMeasurementDaoMock = new Mock <ISensorMeasurementDao>();

            sensorMeasurementDaoMock.Setup(d => d.GetMeasurementsForRun(It.IsAny <Run>()))
            .Returns(Task.FromResult(
                         existingMeasurementsTimestamps.Select((t, i) => new SensorMeasurement
            {
                SensorId  = i,
                Timestamp = t
            })
                         ));

            var runDaoMock = new Mock <IRunDao>();

            runDaoMock.Setup(d => d.GetCurrentRun())
            .Returns(Task.FromResult(
                         new Run
            {
                Race = new Race {
                    NumberOfSensors = existingMeasurementsTimestamps.Length + 1
                }
            }
                         ));

            var daoProvider = DaoProviderHelper.GetPartialDaoProvider(
                runDao: runDaoMock.Object,
                sensorMeasurementDao: sensorMeasurementDaoMock.Object
                );

            return(new RunService(daoProvider, raceClock));
        }
        public void TestRaceStatusChangedEventInvocation()
        {
            // Setup
            var raceDaoMock = new Mock <IRaceDao>();

            raceDaoMock.Setup(d => d.FindById(It.IsAny <int>()))
            .Returns(Task.FromResult(
                         new Race {
                Status = RaceStatus.Ready
            })
                     );

            var daoProvider = DaoProviderHelper.GetPartialDaoProvider(raceDao: raceDaoMock.Object);
            var raceService = new RaceService(daoProvider);

            var eventTriggered = false;

            raceService.RaceStatusChanged += (race, status) => eventTriggered = true;

            // Execute and Assert
            raceService.EditRace(new Race {
                Status = RaceStatus.Ready
            });
            Assert.False(eventTriggered);

            raceService.EditRace(new Race {
                Status = RaceStatus.InProgress
            });
            Assert.True(eventTriggered);
        }
        public void TestAutomaticStartListCreation()
        {
            // Setup
            var skiers = new[] { new Skier(), new Skier(), new Skier() };

            var raceDaoMock = new Mock <IRaceDao>();
            var runDaoMock  = new Mock <IRunDao>();

            var daoProvider = DaoProviderHelper.GetPartialDaoProvider(
                raceDao: raceDaoMock.Object,
                runDao: runDaoMock.Object
                );
            var raceService = new RaceService(daoProvider);

            // Execute
            raceService.CreateRace(new Race(), skiers.ToList());

            // Assert
            runDaoMock.Verify(
                d => d.InsertMany(It.IsAny <IEnumerable <Run> >()),
                Times.Once()
                );
        }
        public void TestAutomaticInvertedStartListCreation()
        {
            // Setup
            var lastRunStatuses            = new[] { RunStatus.Completed, RunStatus.Disqualified, RunStatus.Completed };
            IEnumerable <Run> newRunsAdded = null;

            var raceDaoMock = new Mock <IRaceDao>();
            var runDaoMock  = new Mock <IRunDao>();

            runDaoMock.Setup(d => d.GetAllRunsForRace(It.IsAny <Race>(), It.IsAny <int>()))
            .Returns(Task.FromResult(
                         lastRunStatuses.Select(s => new Run {
                Status = s
            })
                         ));
            runDaoMock.Setup(d => d.InsertMany(It.IsAny <IEnumerable <Run> >()))
            .Callback <IEnumerable <Run> >(runs =>
                                           newRunsAdded = runs
                                           );

            var daoProvider = DaoProviderHelper.GetPartialDaoProvider(
                raceDao: raceDaoMock.Object,
                runDao: runDaoMock.Object
                );
            var raceService = new RaceService(daoProvider);

            // Execute
            raceService.CompleteRun(new Race(), 1);

            // Assert
            runDaoMock.Verify(
                d => d.InsertMany(It.IsAny <IEnumerable <Run> >()),
                Times.Once()
                );
            Assert.Equal(2, newRunsAdded.ToArray().Length);
        }