private static ExerciseSegment CreateExerciseSegment(Extension segment) { var exerciseSegment = new ExerciseSegment(); foreach (var extension in segment.Extension) { switch (extension.Url) { case HealthVaultExtensions.ExerciseSegmentActivity: exerciseSegment.Activity = ((CodeableConcept)extension.Value).ToCodableValue(); break; case HealthVaultExtensions.ExerciseSegmentTitle: exerciseSegment.Title = ((FhirString)extension.Value).Value; break; case HealthVaultExtensions.ExerciseSegmentDuration: exerciseSegment.Duration = (double?)((FhirDecimal)extension.Value).Value; break; case HealthVaultExtensions.ExerciseSegmentDistance: var valueQuantity = (Quantity)extension.Value; if (valueQuantity?.Value != null) { exerciseSegment.Distance = new Length((double)valueQuantity.Value); } break; case HealthVaultExtensions.ExerciseSegmentOffset: exerciseSegment.Offset = (double?)((FhirDecimal)extension.Value).Value; break; case HealthVaultExtensions.ExerciseDetail: ExerciseDetail exerciseDetail; var key = GetExerciseDetail(extension, out exerciseDetail); if (!string.IsNullOrEmpty(key)) { exerciseSegment.Details.Add(key, exerciseDetail); } break; } } return(exerciseSegment); }
private static Extension CreateSegmentExtension(ExerciseSegment segment) { var extension = new Extension { Url = HealthVaultExtensions.ExerciseSegment }; extension.AddExtension(HealthVaultExtensions.ExerciseSegmentActivity, segment.Activity.ToFhir()); if (!string.IsNullOrEmpty(segment.Title)) { extension.AddExtension(HealthVaultExtensions.ExerciseSegmentTitle, new FhirString(segment.Title)); } if (segment.Duration.HasValue) { extension.AddExtension(HealthVaultExtensions.ExerciseSegmentDuration, new FhirDecimal((decimal)segment.Duration)); } if (segment.Distance != null) { extension.AddExtension(HealthVaultExtensions.ExerciseSegmentDistance, new Quantity { Value = (decimal)segment.Distance.Value, Unit = UnitAbbreviations.Meter }); } if (segment.Offset.HasValue) { extension.AddExtension(HealthVaultExtensions.ExerciseSegmentOffset, new FhirDecimal((decimal)segment.Offset)); } if (segment.Details != null) { foreach (var detail in segment.Details) { extension.Extension.Add(CreateDetailExtension(detail.Key, detail.Value)); } } return(extension); }
public void WhenHeathVaultExerciseTransformedToFhir_ThenCodeAndValuesEqual() { var swimmingCodableValue = new CodableValue("Swimming", "swimming", "exercise-activities", "wc", "1"); var secondsCodableValue = new CodableValue("seconds", "s", "duration-units", "wc", "1"); var exerciseSegment = new ExerciseSegment(swimmingCodableValue) { Duration = 180, Distance = new Length(31.5), Offset = 43.3, Title = "Segment 1" }; exerciseSegment.Details.Add("segment 1 - lap 1", new ExerciseDetail(swimmingCodableValue[0], new StructuredMeasurement(46.2, secondsCodableValue))); exerciseSegment.Details.Add("segment 1 - lap 2", new ExerciseDetail(swimmingCodableValue[0], new StructuredMeasurement(21, secondsCodableValue))); var exercise = new Exercise(new ApproximateDateTime(SystemClock.Instance.InUtc().GetCurrentLocalDateTime()), swimmingCodableValue) { Distance = new Length(30), Duration = 10, Title = "New Swim" }; exercise.Segments.Add(exerciseSegment); exercise.Details.Add("lap 1", new ExerciseDetail(swimmingCodableValue[0], new StructuredMeasurement(30, secondsCodableValue))); exercise.Details.Add("lap 2", new ExerciseDetail(swimmingCodableValue[0], new StructuredMeasurement(28, secondsCodableValue))); var observation = exercise.ToFhir(); Assert.IsNotNull(observation); Assert.AreEqual(5, observation.Extension.Count); Assert.AreEqual(HealthVaultThingTypeNameCodes.Exercise, observation.Code.Coding[0]); var detailExtensions = observation.Extension.Where(x => x.Url == HealthVaultExtensions.ExerciseDetail).ToList(); Assert.AreEqual(2, detailExtensions.Count); Assert.AreEqual("lap 1", ((FhirString)detailExtensions[0].Extension[0].Value).Value); Assert.AreEqual("swimming", ((Coding)detailExtensions[0].Extension[1].Value).Code); Assert.AreEqual(30, ((Quantity)detailExtensions[0].Extension[2].Value).Value); Assert.AreEqual("seconds", ((Quantity)detailExtensions[0].Extension[2].Value).Unit); var segmentExtensions = observation.Extension.Where(x => x.Url == HealthVaultExtensions.ExerciseSegment).ToList(); Assert.AreEqual(1, segmentExtensions.Count); Assert.AreEqual("swimming", ((CodeableConcept)segmentExtensions[0].Extension[0].Value).Coding[0].Code); Assert.AreEqual("Segment 1", ((FhirString)segmentExtensions[0].Extension[1].Value).Value); Assert.AreEqual(180, ((FhirDecimal)segmentExtensions[0].Extension[2].Value).Value); Assert.AreEqual(31.5m, ((Quantity)segmentExtensions[0].Extension[3].Value).Value); Assert.AreEqual(43.3m, ((FhirDecimal)segmentExtensions[0].Extension[4].Value).Value); Assert.AreEqual(3, segmentExtensions[0].Extension[5].Extension.Count); Assert.AreEqual("segment 1 - lap 1", ((FhirString)segmentExtensions[0].Extension[5].Extension[0].Value).Value); Assert.AreEqual(HealthVaultVocabularies.ExerciseDistance, observation.Component[0].Code.Text); Assert.AreEqual(30, ((Quantity)observation.Component[0].Value).Value); Assert.AreEqual("m", ((Quantity)observation.Component[0].Value).Unit); Assert.AreEqual(HealthVaultVocabularies.ExerciseDuration, observation.Component[1].Code.Text); Assert.AreEqual(10, ((Quantity)observation.Component[1].Value).Value); Assert.AreEqual("min", ((Quantity)observation.Component[1].Value).Unit); Assert.AreEqual(HealthVaultVocabularies.ExerciseActivity, observation.Component[2].Code.Text); Assert.AreEqual("swimming", ((CodeableConcept)observation.Component[2].Value).Coding[0].Code); }