public void TestRepeatStepFITDeserialization() { Workout placeholderWorkout = new Workout("Test", PluginMain.GetApplication().Logbook.ActivityCategories[0]); RegularStep regularStep; RepeatStep repeatStep = new RepeatStep(placeholderWorkout); FITMessage serializedMessage = new FITMessage(FITGlobalMessageIds.WorkoutStep); FITMessageField durationValueField = new FITMessageField((Byte)FITWorkoutStepFieldIds.DurationValue); FITMessageField durationTypeField = new FITMessageField((Byte)FITWorkoutStepFieldIds.DurationType); FITMessageField targetValueField = new FITMessageField((Byte)FITWorkoutStepFieldIds.TargetValue); regularStep = placeholderWorkout.Steps[0] as RegularStep; // Setup message serializedMessage.AddField(durationValueField); serializedMessage.AddField(durationTypeField); serializedMessage.AddField(targetValueField); durationValueField.SetUInt32(0); // Step id to start repeat at durationTypeField.SetEnum((Byte)FITWorkoutStepDurationTypes.RepeatCount); targetValueField.SetUInt32(2); // This test is a little hard to follow because repeat steps in FIT format regroup previously deserialized steps. // We will illustrate the expected output throughout the test to ease validation. // At this point we have the following // - Root // - Regular step (id = 0) // By deserializing the message we should get the following // - Root // - Repeat step (id = 1) // - Regular step (id = 0) repeatStep.DeserializeFromFIT(serializedMessage); placeholderWorkout.Steps.AddStepToRoot(repeatStep); Assert.AreEqual(1, placeholderWorkout.Steps.Count, "Incorrect number of steps in workout after FIT deserialization of repeat step with single child"); Assert.AreEqual(2, placeholderWorkout.StepCount, "Incorrect number of steps in workout after FIT deserialization of repeat step with single child"); Assert.IsTrue(placeholderWorkout.Steps[0] is RepeatStep, "Invalid workout structure after FIT deserialization of repeat step with single child"); Assert.AreEqual(repeatStep, placeholderWorkout.Steps[0], "Invalid workout structure after FIT deserialization of repeat step with single child"); Assert.AreEqual(1, repeatStep.StepsToRepeat.Count, "Invalid number of children in repeat after FIT deserialization of repeat step with single child"); Assert.AreEqual(regularStep, repeatStep.StepsToRepeat[0], "Invalid child in repeat after FIT deserialization of repeat step with single child"); placeholderWorkout.Steps.AddStepToRoot(new RegularStep(placeholderWorkout)); placeholderWorkout.Steps.AddStepToRoot(new RegularStep(placeholderWorkout)); repeatStep = new RepeatStep(placeholderWorkout); durationValueField.SetUInt32(2); // Step id to start repeat at // At this point we have the following // - Root // - Repeat step (id = 1) // - Regular step (id = 0) // - Regular step (id = 2) // - Regular step (id = 3) // By deserializing the message we should get the following // - Root // - Repeat step (id = 1) // - Regular step (id = 0) // - Repeat step (id = 4) // - Regular step (id = 2) // - Regular step (id = 3) repeatStep.DeserializeFromFIT(serializedMessage); placeholderWorkout.Steps.AddStepToRoot(repeatStep); Assert.AreEqual(2, placeholderWorkout.Steps.Count, "Incorrect number of steps in workout after FIT deserialization of repeat step with multiple children"); Assert.AreEqual(5, placeholderWorkout.StepCount, "Incorrect number of steps in workout after FIT deserialization of repeat step with multiple children"); Assert.IsTrue(placeholderWorkout.Steps[1] is RepeatStep, "Invalid workout structure after FIT deserialization of repeat step with multiple children"); Assert.AreEqual(repeatStep, placeholderWorkout.Steps[1], "Invalid workout structure after FIT deserialization of repeat step with multiple children"); Assert.AreEqual(2, repeatStep.StepsToRepeat.Count, "Invalid number of children in repeat after FIT deserialization of repeat step with multiple children"); Assert.IsTrue(placeholderWorkout.Steps[0] is RepeatStep, "Invalid repeat step structure after FIT deserialization of repeat step with multiple children"); Assert.IsTrue(placeholderWorkout.Steps[1] is RepeatStep, "Invalid repeat step structure after FIT deserialization of repeat step with multiple children"); regularStep = new RegularStep(placeholderWorkout); placeholderWorkout.Steps.InsertStepBeforeStep(regularStep, placeholderWorkout.Steps[0]); repeatStep = new RepeatStep(placeholderWorkout); durationValueField.SetUInt32(1); // Step id to start repeat at // At this point we have the following // - Root // - Regular step (id = 0) // - Repeat step (id = 2) // - Regular step (id = 1) // - Repeat step (id = 5) // - Regular step (id = 4) // - Regular step (id = 5) // - Repeat step (not deserialized yet) // By deserializing the message we should get the following // - Root // - Regular step (id = 0) // - Repeat step (id = 6) // - Repeat step (id = 2) // - Regular step (id = 1) // - Repeat step (id = 5) // - Regular step (id = 3) // - Regular step (id = 4) repeatStep.DeserializeFromFIT(serializedMessage); placeholderWorkout.Steps.AddStepToRoot(repeatStep); Assert.AreEqual(2, placeholderWorkout.Steps.Count, "Incorrect number of steps in workout after FIT deserialization of repeat step with multiple nested children"); Assert.AreEqual(7, placeholderWorkout.StepCount, "Incorrect number of steps in workout after FIT deserialization of repeat step with multiple nested children"); Assert.IsTrue(placeholderWorkout.Steps[0] is RegularStep, "Invalid workout structure after FIT deserialization of repeat step with multiple nested children"); Assert.IsTrue(placeholderWorkout.Steps[1] is RepeatStep, "Invalid workout structure after FIT deserialization of repeat step with multiple nested children"); Assert.AreEqual(regularStep, placeholderWorkout.Steps[0], "Invalid workout structure after FIT deserialization of repeat step with multiple nested children"); Assert.AreEqual(repeatStep, placeholderWorkout.Steps[1], "Invalid workout structure after FIT deserialization of repeat step with multiple nested children"); Assert.AreEqual(2, repeatStep.StepsToRepeat.Count, "Invalid number of children in repeat after FIT deserialization of repeat step with multiple nested children"); Assert.IsTrue(repeatStep.StepsToRepeat[0] is RepeatStep, "Invalid repeat step structure after FIT deserialization of repeat step with multiple nested children"); Assert.IsTrue(repeatStep.StepsToRepeat[1] is RepeatStep, "Invalid repeat step structure after FIT deserialization of repeat step with multiple nested children"); }
public override void DeserializeFromFIT(FITMessage workoutMessage) { FITMessage stepMessage; FITMessageField numStepsField = workoutMessage.GetField((Byte)FITWorkoutFieldIds.NumSteps); if (numStepsField != null) { UInt16 numSteps = numStepsField.GetUInt16(); FITParser.Instance.RestartParsing(); m_Steps.Clear(); do { stepMessage = FITParser.Instance.ReadNextMessage(); if (stepMessage != null) { switch (stepMessage.GlobalMessageType) { case FITGlobalMessageIds.WorkoutStep: { FITMessageField stepTypeField = stepMessage.GetField((Byte)FITWorkoutStepFieldIds.DurationType); if (stepTypeField != null) { FITWorkoutStepDurationTypes durationType = (FITWorkoutStepDurationTypes)stepTypeField.GetEnum(); IStep newStep = null; switch (durationType) { case FITWorkoutStepDurationTypes.Calories: case FITWorkoutStepDurationTypes.Distance: case FITWorkoutStepDurationTypes.HeartRateGreaterThan: case FITWorkoutStepDurationTypes.HeartRateLessThan: case FITWorkoutStepDurationTypes.Open: case FITWorkoutStepDurationTypes.Time: case FITWorkoutStepDurationTypes.PowerGreaterThan: case FITWorkoutStepDurationTypes.PowerLessThan: { newStep = new RegularStep(this); break; } case FITWorkoutStepDurationTypes.RepeatCount: case FITWorkoutStepDurationTypes.RepeatUntilCalories: case FITWorkoutStepDurationTypes.RepeatUntilDistance: case FITWorkoutStepDurationTypes.RepeatUntilHeartRateGreaterThan: case FITWorkoutStepDurationTypes.RepeatUntilHeartRateLessThan: case FITWorkoutStepDurationTypes.RepeatUntilPowerGreaterThan: case FITWorkoutStepDurationTypes.RepeatUntilPowerLessThan: case FITWorkoutStepDurationTypes.RepeatUntilTime: { newStep = new RepeatStep(this); break; } } newStep.DeserializeFromFIT(stepMessage); m_Steps.AddStepToRoot(newStep); } else { throw new FITParserException("Missing duration type field"); } break; } default: { // Nothing to do break; } } } } while (stepMessage != null && m_Steps.StepCount < numSteps); if (m_Steps.StepCount < numSteps) { throw new FITParserException("Unable to deserialize all steps"); } } else { throw new FITParserException("No step count field"); } }