public void TestImportFitlogData() { string path = @"data\data_mini.fitlog"; FitLogImporter importer = new FitLogImporter(); IList <ActivityEntity> activities; using (FileStream fs = File.OpenRead(path)) { activities = new List <ActivityEntity>(importer.ImportActivitiesStream(fs, new Dictionary <string, ACTIVITY_SPORT> { { "e41b80e4-fa5f-48e3-95be-d0e66b72ab7c", ACTIVITY_SPORT.BIKING }, { "eca38408-cb82-42ed-b242-166b43b785a6", ACTIVITY_SPORT.RUNNING }, { "6f2fdaf9-4c5a-4c2c-a4fa-5be42e9733dd", ACTIVITY_SPORT.SWIMMING } })); } activities.Should().HaveCountGreaterOrEqualTo(1, "expected data_mini.fitlog to contain at least 1 activity"); activities.Should().ContainSingle(a => a.OriginId == "81f11f5f-fa73-42d4-a7f9-e71a74313ba6"); var activity = activities.Where(a => a.OriginId == "81f11f5f-fa73-42d4-a7f9-e71a74313ba6").Single(); activity.Tracks.Should().ContainSingle(); activity.Tracks.Single().TrackSegments.Should().ContainSingle(); var tp = activity.Tracks.Single().TrackSegments.Single().TrackPoints; tp.Should().HaveCountGreaterOrEqualTo(10); activity.Should().Match <ActivityEntity>(a => (a.TimeSpan.Ticks > 0)); }
public void TestPrepareEchartsAthleteData() { string path = @"data\data_mini.fitlog"; FitLogImporter importer = new FitLogImporter(); IList <ActivityEntity> activities; using (FileStream fs = File.OpenRead(path)) { activities = new List <ActivityEntity>(importer.ImportActivitiesStream(fs, new Dictionary <string, ACTIVITY_SPORT> { { "e41b80e4-fa5f-48e3-95be-d0e66b72ab7c", ACTIVITY_SPORT.BIKING }, { "eca38408-cb82-42ed-b242-166b43b785a6", ACTIVITY_SPORT.RUNNING }, { "6f2fdaf9-4c5a-4c2c-a4fa-5be42e9733dd", ACTIVITY_SPORT.SWIMMING } })); } IEChartsService eChartsService = new EChartsService(); var now = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day); DateTimeOffset StartingDate = new DateTime(now.Year - 2, 1, 1); DateTimeOffset EndingDate = now; var json = eChartsService.SerializeAthleteData(activities, new SerializeAthleteDataConfig { StartingDate = StartingDate, EndingDate = EndingDate }); json.Length.Should().BeGreaterThan(0); }
public void TestLoadFileToDatabase() { var configuration = new ConfigurationBuilder() .AddInMemoryCollection(new Dictionary <string, string>() { { "ConnectionStrings:Default", "Data Source=geosports.db" } }).Build(); var dbContext = new OpenSportLogContext(configuration); dbContext.Database.EnsureDeleted(); dbContext.Database.Migrate(); string path = @"data\data_tiny.fitlog"; FitLogImporter importer = new FitLogImporter(); List <ActivityEntity> activities = new List <ActivityEntity>(); var athlete = new AthleteEntity(activities, "Sample", 1); dbContext.Athletes.Add(athlete); using (FileStream fs = File.OpenRead(path)) { foreach (var activity in importer.ImportActivitiesStream(fs, new Dictionary <string, ACTIVITY_SPORT> { { "e41b80e4-fa5f-48e3-95be-d0e66b72ab7c", ACTIVITY_SPORT.BIKING }, { "eca38408-cb82-42ed-b242-166b43b785a6", ACTIVITY_SPORT.RUNNING }, { "6f2fdaf9-4c5a-4c2c-a4fa-5be42e9733dd", ACTIVITY_SPORT.SWIMMING } })) { athlete.Activities.Add(activity); } } dbContext.SaveChanges(); var count = dbContext.Athletes.CountAsync().GetAwaiter().GetResult(); Assert.AreEqual(1, count); count = dbContext.Athletes.Include(a => a.Activities).CountAsync().GetAwaiter().GetResult(); Assert.AreEqual(1, count); var activitiesRead = dbContext.Athletes.Include(a => a.Activities).ToList()[0].Activities; Assert.IsTrue(activitiesRead.Count > 0); var tracksPointsRead = dbContext.Athletes .FirstOrDefault() .Activities .FirstOrDefault() .Tracks .FirstOrDefault() .TrackSegments .FirstOrDefault() .TrackPoints; Assert.IsTrue(tracksPointsRead.Count > 0); //dbContext.Database.EnsureDeleted(); }
public void TestImportFitlogSports() { string path = @"data\data_mini.fitlog"; FitLogImporter importer = new FitLogImporter(); IDictionary <string, string> sports; using (FileStream fs = File.OpenRead(path)) { sports = importer.GetSports(fs); } sports.Should().HaveCountGreaterOrEqualTo(1, "expected data_mini.fitlog to contain at least 1 sport"); }
public AthleteDetailsVM(IDataAccessService DbAccess, FitLogImporter FitLogImporter, GpxImporter GpxImporter) { _Logger = NLog.LogManager.GetCurrentClassLogger(); _DbAccess = DbAccess; _FitLogImporter = FitLogImporter; _GpxImporter = GpxImporter; Messenger.Default.Register <NotificationMessage <IList <AthleteEntity> > >(this, message => { if (message.Notification == MessengerNotifications.LOADED) { if (message.Content == null) { Athletes = new ObservableCollection <AthleteEntity>(); } else { Athletes = new ObservableCollection <AthleteEntity>(message.Content); } } }); Messenger.Default.Register <NotificationMessage <ImporterTypeEnum> >(this, message => { if (message.Notification == MessengerNotifications.IMPORT) { ImportDialog(message.Content); } }); Messenger.Default.Register <NotificationMessage <AthleteEntity> >(this, message => { if (message.Notification == MessengerNotifications.NEW) { var athlete = message.Content; Athletes.Add(athlete); SelectedAthlete = athlete; } }); Messenger.Default.Register <NotificationMessage <ACTION_TYPE> >(this, message => { if (message.Notification == MessengerNotifications.ASK_FOR_ACTION && message.Content == ACTION_TYPE.DELETE_SELECTED_ACTIVITIES) { DispatcherHelper.CheckBeginInvokeOnUI(() => { var toRemove = new List <ActivityEntity>(SelectedActivities); foreach (var activity in toRemove) { _SelectedAthlete.Activities.Remove(activity); } }); } }); }
public void TestImportFitlogAverages() { string fitlog = @"<?xml version=""1.0"" encoding=""utf-8""?> <FitnessWorkbook xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns=""http://www.zonefivesoftware.com/xmlschemas/FitnessLogbook/v3""> <AthleteLog> <Athlete Id=""989703a1-f7b8-4af3-b4ae-9dd862fed016"" Name=""Nicolas Mayeur"" /> <Activity StartTime=""2019-12-25T09:45:07Z"" Id=""9fe01c40-fe66-48e2-b5fa-97370c94e9e8""> <Metadata Source="""" Created=""2020-01-19T10:16:01Z"" Modified=""2020-01-19T10:16:17Z"" /> <Calories TotalCal=""2153"" /> <Name>Lonchamp de Noël</Name> <Category Id=""e41b80e4-fa5f-48e3-95be-d0e66b72ab7c"" Name=""Vélo"" /> <Location Name=""Longchamps"" /> <EquipmentUsed> <EquipmentItem Id=""67713a66-5c4d-43b6-9386-df3e431d06fa"" Name=""Giant - TCR advanced 2007"" /> </EquipmentUsed> <Track StartTime=""2019-12-25T09:45:07Z""> <pt tm=""0"" lat=""48.8676490783691"" lon=""2.20366406440735"" ele=""91.4405212402344"" hr=""140"" cadence=""0"" /> <pt tm=""1"" lat=""48.8676490783691"" lon=""2.2036669254303"" ele=""91.4514389038086"" hr=""140"" cadence=""100"" /> <pt tm=""8"" lat=""48.8676490783691"" lon=""2.2036759853363"" ele=""91.4860000610352"" hr=""150"" cadence=""100"" /> <pt tm=""10"" lat=""48.8676147460938"" lon=""2.20368194580078"" ele=""91.4503021240234"" hr=""150"" cadence=""160"" /> </Track> </Activity> </AthleteLog> </FitnessWorkbook>"; byte[] byteArray = Encoding.UTF8.GetBytes(fitlog); FitLogImporter importer = new FitLogImporter(); List <ActivityEntity> activities; using (Stream fs = new MemoryStream(byteArray)) { activities = new List <ActivityEntity>(importer.ImportActivitiesStream(fs, new Dictionary <string, ACTIVITY_SPORT> { { "e41b80e4-fa5f-48e3-95be-d0e66b72ab7c", ACTIVITY_SPORT.BIKING }, { "eca38408-cb82-42ed-b242-166b43b785a6", ACTIVITY_SPORT.RUNNING }, { "6f2fdaf9-4c5a-4c2c-a4fa-5be42e9733dd", ACTIVITY_SPORT.SWIMMING } })); } activities.Should().HaveCountLessOrEqualTo(1, "expected data_tiny.fitlog to contain at least 1 activity"); var activity = activities[0]; activity.Cadence.Should().Be(120); activity.HeartRate.Should().Be(145); }
public void TestImportMultiTracksFitlogStream() { string fitlog = @"<?xml version=""1.0"" encoding=""utf-8""?> <FitnessWorkbook xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns=""http://www.zonefivesoftware.com/xmlschemas/FitnessLogbook/v3""> <AthleteLog> <Athlete Id=""989703a1-f7b8-4af3-b4ae-9dd862fed016"" Name=""Nicolas Mayeur"" /> <Activity StartTime=""2019-12-25T09:45:07Z"" Id=""9fe01c40-fe66-48e2-b5fa-97370c94e9e8""> <Metadata Source="""" Created=""2020-01-19T10:16:01Z"" Modified=""2020-01-19T10:16:17Z"" /> <Calories TotalCal=""2153"" /> <Name>Lonchamp de Noël</Name> <Category Id=""e41b80e4-fa5f-48e3-95be-d0e66b72ab7c"" Name=""Vélo"" /> <Location Name=""Longchamps"" /> <EquipmentUsed> <EquipmentItem Id=""67713a66-5c4d-43b6-9386-df3e431d06fa"" Name=""Giant - TCR advanced 2007"" /> </EquipmentUsed> <Track StartTime=""2019-12-25T09:45:07Z""> <pt tm=""0"" lat=""48.8676490783691"" lon=""2.20366406440735"" ele=""91.4405212402344"" hr=""71"" cadence=""0"" /> <pt tm=""1"" lat=""48.8676490783691"" lon=""2.2036669254303"" ele=""91.4514389038086"" hr=""71"" cadence=""0"" /> <pt tm=""8"" lat=""48.8676490783691"" lon=""2.2036759853363"" ele=""91.4860000610352"" hr=""74"" cadence=""0"" /> <pt tm=""10"" lat=""48.8676147460938"" lon=""2.20368194580078"" ele=""91.4503021240234"" hr=""79"" cadence=""27"" /> <pt tm=""11"" lat=""48.8675918579102"" lon=""2.20368409156799"" ele=""91.4193572998047"" hr=""81"" cadence=""47"" /> <pt tm=""13"" lat=""48.8675346374512"" lon=""2.20368790626526"" ele=""91.3357162475586"" hr=""84"" cadence=""58"" /> <pt tm=""16"" lat=""48.8674278259277"" lon=""2.20366907119751"" ele=""91.1220474243164"" hr=""85"" cadence=""55"" /> <pt tm=""19"" lat=""48.867317199707"" lon=""2.20367789268494"" ele=""91.0210494995117"" hr=""85"" cadence=""60"" /> <pt tm=""21"" lat=""48.8672409057617"" lon=""2.2037239074707"" ele=""91.0951538085938"" hr=""86"" cadence=""54"" /> <pt tm=""23"" lat=""48.8671646118164"" lon=""2.20372295379639"" ele=""91.0001678466797"" hr=""89"" cadence=""22"" /> <pt tm=""26"" lat=""48.8670387268066"" lon=""2.20373702049255"" ele=""90.8997421264648"" hr=""91"" cadence=""67"" /> <pt tm=""30"" lat=""48.8668174743652"" lon=""2.20377111434937"" ele=""90.7569808959961"" hr=""93"" cadence=""77"" /> <pt tm=""31"" lat=""48.866756439209"" lon=""2.20379495620728"" ele=""90.7695693969726"" hr=""93"" cadence=""77"" /> <pt tm=""32"" lat=""48.8667068481445"" lon=""2.20384001731873"" ele=""90.8722763061524"" hr=""93"" cadence=""18"" /> <pt tm=""34"" lat=""48.8666305541992"" lon=""2.20396900177002"" ele=""91.2986831665039"" hr=""95"" cadence=""79"" /> <pt tm=""37"" lat=""48.8665428161621"" lon=""2.20420503616333"" ele=""92.0136871337891"" hr=""99"" cadence=""78"" /> </Track> <Track StartTime=""2020-04-13T08:02:13Z""> <pt tm=""0"" lat=""40.7790069580078"" lon=""-73.9657745361328"" ele=""26.6031761169434"" hr=""101"" cadence=""69"" /> <pt tm=""1"" lat=""40.7789878845215"" lon=""-73.9657897949219"" ele=""26.5597133636475"" hr=""102"" cadence=""77"" /> <pt tm=""2"" lat=""40.7789611816406"" lon=""-73.9658050537109"" ele=""26.4984683990478"" hr=""103"" cadence=""78"" /> <pt tm=""3"" lat=""40.7789344787598"" lon=""-73.9658279418945"" ele=""26.4409465789795"" hr=""104"" cadence=""78"" /> <pt tm=""4"" lat=""40.7789077758789"" lon=""-73.9658508300781"" ele=""26.4481735229492"" hr=""104"" cadence=""78"" /> <pt tm=""5"" lat=""40.7788696289062"" lon=""-73.9658813476562"" ele=""26.4804992675781"" hr=""104"" cadence=""80"" /> <pt tm=""6"" lat=""40.7788391113281"" lon=""-73.9659042358398"" ele=""26.5025596618652"" hr=""103"" cadence=""79"" /> <pt tm=""7"" lat=""40.77880859375"" lon=""-73.9659423828125"" ele=""26.5894317626953"" hr=""103"" cadence=""80"" /> <pt tm=""8"" lat=""40.7787704467773"" lon=""-73.9659729003906"" ele=""26.6311454772949"" hr=""102"" cadence=""80"" /> <pt tm=""9"" lat=""40.7787322998047"" lon=""-73.9660110473633"" ele=""26.7084484100342"" hr=""102"" cadence=""80"" /> <pt tm=""10"" lat=""40.7786903381348"" lon=""-73.9660491943359"" ele=""26.7819728851318"" hr=""101"" cadence=""75"" /> <pt tm=""11"" lat=""40.7786521911621"" lon=""-73.9660873413086"" ele=""26.8678684234619"" hr=""101"" cadence=""75"" /> <pt tm=""12"" lat=""40.7786102294922"" lon=""-73.9661254882812"" ele=""26.950403213501"" hr=""102"" cadence=""76"" /> <pt tm=""13"" lat=""40.7785682678223"" lon=""-73.9661712646484"" ele=""27.0715885162354"" hr=""102"" cadence=""77"" /> <pt tm=""14"" lat=""40.7785263061523"" lon=""-73.9662094116211"" ele=""27.1638050079346"" hr=""102"" cadence=""77"" /> </Track> </Activity> </AthleteLog> </FitnessWorkbook>"; byte[] byteArray = Encoding.UTF8.GetBytes(fitlog); FitLogImporter importer = new FitLogImporter(); List <ActivityEntity> activities; using (Stream fs = new MemoryStream(byteArray)) { activities = new List <ActivityEntity>(importer.ImportActivitiesStream(fs, new Dictionary <string, ACTIVITY_SPORT> { { "e41b80e4-fa5f-48e3-95be-d0e66b72ab7c", ACTIVITY_SPORT.BIKING }, { "eca38408-cb82-42ed-b242-166b43b785a6", ACTIVITY_SPORT.RUNNING }, { "6f2fdaf9-4c5a-4c2c-a4fa-5be42e9733dd", ACTIVITY_SPORT.SWIMMING } })); } activities.Should().HaveCountLessOrEqualTo(1, "expected data_tiny.fitlog to contain at least 1 activity"); var activity = activities[0]; activity.Name.Should().Be("Lonchamp de Noël"); activity.Location.Should().Be("Longchamps"); activity.Sport.Should().Be(ACTIVITY_SPORT.BIKING); activity.Calories.Should().Be(2153); activity.Tracks.Should().HaveCount(2); activity.Tracks[0].TrackSegments[0].TrackPoints[0].Time.Should().Be(DateTimeOffset.Parse("2019-12-25T09:45:07Z")); var style = System.Globalization.NumberStyles.AllowDecimalPoint; var culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); activity.Tracks[0].TrackSegments[0].TrackPoints[0].Latitude.Should().Be(float.Parse("48.8676490783691", style, culture)); activity.Tracks[0].TrackSegments[0].TrackPoints[0].Longitude.Should().Be(float.Parse("2.20366406440735", style, culture)); activity.Tracks[0].TrackSegments[0].TrackPoints[0].Elevation.Should().Be(float.Parse("91.4405212402344", style, culture)); activity.Tracks[0].TrackSegments[0].TrackPoints[0].HeartRate.Should().Be(71); activity.Tracks[0].TrackSegments[0].TrackPoints[0].Cadence.Should().Be(0); activity.Tracks[0].TrackSegments[0].TrackPoints[3].Cadence.Should().Be(27); activity.Tracks[1].TrackSegments[0].TrackPoints[5].Cadence.Should().Be(80); }