/// <inheritdoc/>
        public void MakeRunningAndListeningHistoryComparisonWithDateRange(DateTime startDate, DateTime endDate)
        {
            var subsetMappedSongsToActivities = new Dictionary <object, List <object> >();

            foreach (var item in activitiesAndSongs.Keys)
            {
                if (item is StravaActivity stravaRun)
                {
                    if (stravaRun.start_date.Date >= startDate.Date && stravaRun.start_date.Date <= endDate)
                    {
                        subsetMappedSongsToActivities.Add(stravaRun, activitiesAndSongs[stravaRun]);
                    }
                }
                else if (item is Fitbit.Api.Portable.Models.Activities fitBitRun)
                {
                    if (fitBitRun.StartTime.Date >= startDate.Date && fitBitRun.StartTime.Date <= endDate)
                    {
                        subsetMappedSongsToActivities.Add(fitBitRun, activitiesAndSongs[fitBitRun]);
                    }
                }
            }

            var insightsManager = new InsightsManager();

            fastestActivityAndSongs = insightsManager.GetFastestActivityWithListeningHistory(subsetMappedSongsToActivities);
        }
        public void GetFastestActivitySongsWithNoActivitiesOrSongs_ExceptionThrown()
        {
            sut = new InsightsManager();
            Action exceptionAction = () => sut.GetFastestActivityWithListeningHistory(new Dictionary <object, List <object> >());

            exceptionAction.Should().Throw <IndexOutOfRangeException>().WithMessage("No activities in parsed array dictionary.");
        }
        /// <inheritdoc/>
        public void MakeRunningAndListeningHistoryComparison()
        {
            // Determine what date to search on...
            DateTime dateToSearchOn = new DateTime();

            if (activitiesAndSongs.Keys.First() is StravaActivity stravaActivity)
            {
                dateToSearchOn = stravaActivity.start_date;
            }
            else if (activitiesAndSongs.Keys.First() is Fitbit.Api.Portable.Models.Activities fitBitActivity)
            {
                dateToSearchOn = fitBitActivity.StartTime.DateTime;
            }

            Dictionary <object, List <object> > subsetMappedSongsToActivities = new Dictionary <object, List <object> >();

            foreach (var item in activitiesAndSongs.Keys)
            {
                if (item is StravaActivity stravaRun)
                {
                    if (stravaRun.start_date.Date == dateToSearchOn.Date)
                    {
                        subsetMappedSongsToActivities.Add(stravaRun, activitiesAndSongs[stravaRun]);
                    }
                }
                else if (item is Fitbit.Api.Portable.Models.Activities fitBitRun)
                {
                    if (fitBitRun.StartTime.DateTime.Date == dateToSearchOn.Date)
                    {
                        subsetMappedSongsToActivities.Add(fitBitRun, activitiesAndSongs[fitBitRun]);
                    }
                }
            }
            // Then make comparison
            var insightsManager = new InsightsManager();

            fastestActivityAndSongs = insightsManager.GetFastestActivityWithListeningHistory(subsetMappedSongsToActivities);
        }
        public void GetFastestActivitySongs_FastestActivitySongsReturned()
        {
            var now = DateTime.UtcNow;

            var activity1 = new StravaActivity
            {
                type          = "Run",
                average_speed = 3.5,
                start_date    = now.AddHours(-2),
                elapsed_time  = 3600
            };
            var listOfActivity1PlayHistory = new List <object>
            {
                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-2),
                    Track    = new SimpleTrack
                    {
                        Name       = "Song 1",
                        DurationMs = 3600
                    }
                },

                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-2).AddMinutes(5),
                    Track    = new SimpleTrack
                    {
                        Name       = "Song 2",
                        DurationMs = 3600
                    }
                },

                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-2).AddMinutes(10),
                    Track    = new SimpleTrack
                    {
                        Name       = "Song 3",
                        DurationMs = 3600
                    }
                }
            };

            var activity2 = new StravaActivity
            {
                type          = "Run",
                average_speed = 4.5,
                start_date    = now.AddHours(-1),
                elapsed_time  = 3600
            };

            var listOfActivity2PlayHistory = new List <object>
            {
                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-1).AddMinutes(5),
                    Track    = new SimpleTrack
                    {
                        Name       = "Faster Song 1",
                        DurationMs = 600
                    }
                },

                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-1).AddMinutes(10),
                    Track    = new SimpleTrack
                    {
                        Name       = "Faster Song 2",
                        DurationMs = 900
                    }
                },

                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-1).AddMinutes(15),
                    Track    = new SimpleTrack
                    {
                        Name       = "Faster Song 3",
                        DurationMs = 1200
                    }
                },

                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-1).AddMinutes(20),
                    Track    = new SimpleTrack
                    {
                        Name       = "Faster Song 4",
                        DurationMs = 600
                    }
                },
            };

            var sampleData = new Dictionary <object, List <object> >
            {
                { activity1, listOfActivity1PlayHistory },
                { activity2, listOfActivity2PlayHistory }
            };

            sut = new InsightsManager();
            var result = sut.GetFastestActivityWithListeningHistory(sampleData);

            result.Keys.Should().Contain(activity2);
            result.Keys.Should().HaveCount(1);
            result.Values.ToList()[0].Should().BeEquivalentTo(listOfActivity2PlayHistory);
        }
        public void GetFastestActivitySongsWithMultipleTypesOfActivity_FastestActivitySongsReturned()
        {
            var now = DateTime.UtcNow;

            var activity1 = new StravaActivity
            {
                type          = "Run",
                average_speed = 3.5,
                start_date    = now.AddHours(-2),
                elapsed_time  = 3600
            };
            var listOfActivity1PlayHistory = new List <object>
            {
                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-2),
                    Track    = new SimpleTrack
                    {
                        Name       = "Song 1",
                        DurationMs = 3600
                    }
                },

                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-2).AddMinutes(5),
                    Track    = new SimpleTrack
                    {
                        Name       = "Song 2",
                        DurationMs = 3600
                    }
                },

                new PlayHistoryItem
                {
                    PlayedAt = now.AddHours(-2).AddMinutes(10),
                    Track    = new SimpleTrack
                    {
                        Name       = "Song 3",
                        DurationMs = 3600
                    }
                }
            };

            var activity2 = new Fitbit.Api.Portable.Models.Activities
            {
                ActivityTypeId = 1,
                Duration       = 3600,
                Speed          = 4.5,
                StartTime      = now.AddHours(-2)
            };

            var listOfActivity2PlayHistory = new List <object>
            {
                new LastTrack
                {
                    TimePlayed = now.AddHours(-2),
                    Name       = "Last FM song 1",
                    Duration   = new TimeSpan(0, 3, 0)
                },
                new LastTrack
                {
                    TimePlayed = now.AddHours(-2).AddMinutes(3),
                    Name       = "Last FM song 2",
                    Duration   = new TimeSpan(0, 3, 0)
                },
            };

            var sampleData = new Dictionary <object, List <object> >
            {
                { activity1, listOfActivity1PlayHistory },
                { activity2, listOfActivity2PlayHistory }
            };


            sut = new InsightsManager();
            var result = sut.GetFastestActivityWithListeningHistory(sampleData);

            result.Keys.Should().Contain(activity2);
            result.Keys.Should().HaveCount(1);
            result.Values.ToList()[0].Should().BeEquivalentTo(listOfActivity2PlayHistory);
        }