public void ExerciseTrackerService_GetExecutionsOfDay_ReturnsAllOfDay()
        {
            // Arrange
            var testDataSet      = CreateTestDataSet();
            var stubDataService  = Substitute.For <IExerciseTrackerDataService>();
            var stubTimeProvider = Substitute.For <ITimeProvider>();
            var unitUnderTest    = new ExerciseTrackerService(stubDataService, stubTimeProvider);
            var expectedDay      = new DateTime(2017, 10, 19);

            stubDataService.GetByPeriod(Arg.Any <DateTime>(), Arg.Any <DateTime>())
            .Returns(x => testDataSet
                     .Where(ee => ee.ExecutionTime >= (DateTime)x[0] && ee.ExecutionTime <= (DateTime)x[1])
                     .ToList());

            // Using the percentages here instead of the date to make sure that the
            //  test won't use the same mistake in date selection.
            var expectedExerciseList = testDataSet.Where(ee => ee.PercentageCompleted >= 30 && ee.PercentageCompleted <= 50).ToList();

            // Act
            var actualResult = unitUnderTest.GetExecutionsOfDay(expectedDay);

            // Assert
            Assert.AreEqual(expectedDay, actualResult.Day);
            Assert.AreEqual(expectedExerciseList.Count, actualResult.ExersiseExecutions.Count);
            for (var i = 0; i < expectedExerciseList.Count; i++)
            {
                Assert.AreEqual(expectedExerciseList[i], actualResult.ExersiseExecutions[i]);
            }
        }
        public void ExerciseTrackerService_ExerciseFinished_RaisesDailyExerciseTrackerChangedEvent()
        {
            // Arrange
            var stubDataService  = Substitute.For <IExerciseTrackerDataService>();
            var stubTimeProvider = Substitute.For <ITimeProvider>();
            var stubExercise     = new TestableExercise(new ExerciseConfiguration());
            var unitUnderTest    = new ExerciseTrackerService(stubDataService, stubTimeProvider);
            var eventRaised      = new AutoResetEvent(false);

            unitUnderTest.DailyExerciseTrackerChanged += (sender, args) => eventRaised.Set();

            // Act
            unitUnderTest.ExerciseFinished(stubExercise);

            // Assert
            Assert.IsTrue(eventRaised.WaitOne(5000), "Expected event to be raised");
        }
        public void ExerciseTrackerService_ExerciseFinished_AddsExerciseToRepository()
        {
            // Arrange
            var mockDataService  = Substitute.For <IExerciseTrackerDataService>();
            var stubTimeProvider = Substitute.For <ITimeProvider>();
            var unitUnderTest    = new ExerciseTrackerService(mockDataService, stubTimeProvider);
            var stubExercise     = new TestableExercise(new ExerciseConfiguration());

            stubTimeProvider.Today.Returns(DateTime.Parse("2017/10/17 12:15:30"));

            // Act
            unitUnderTest.ExerciseFinished(stubExercise);

            // Assert
            mockDataService.Received(1)
            .Add(Arg.Is <ExersiseExecution>(ee =>
                                            ee.ExecutionTime.Equals(DateTime.Parse("2017/10/17 12:15:30")) &&
                                            ee.PercentageCompleted == 21));
        }
        public void ExerciseTrackerService_GetExecutionsOfPeriod_ReturnsAllOfPeriod()
        {
            // Arrange
            var testDataSet         = CreateTestDataSet();
            var stubDataService     = Substitute.For <IExerciseTrackerDataService>();
            var stubTimeProvider    = Substitute.For <ITimeProvider>();
            var unitUnderTest       = new ExerciseTrackerService(stubDataService, stubTimeProvider);
            var expectedPeriodStart = new DateTime(2017, 10, 19);
            var expectedPeriodEnd   = new DateTime(2017, 10, 20, 12, 00, 00);

            stubDataService.GetByPeriod(Arg.Any <DateTime>(), Arg.Any <DateTime>())
            .Returns(x => testDataSet
                     .Where(ee => ee.ExecutionTime >= (DateTime)x[0] && ee.ExecutionTime <= (DateTime)x[1])
                     .ToList());

            // Act
            var actualResult = unitUnderTest.GetExecutionsOfPeriod(expectedPeriodStart, expectedPeriodEnd);

            // Assert
            Assert.AreEqual(2, actualResult.Count, "Expected to get the data of 2 days");
            Assert.AreEqual(3, actualResult[0].ExersiseExecutions.Count, "Expected 3 exercises on 19-10");
            Assert.AreEqual(2, actualResult[1].ExersiseExecutions.Count, "Expected 2 exercises on 20-10 until 12:00");
        }