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);
        }
Пример #2
0
        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);
        }