From 76525db162966a4e8441938953facf7522bdbb70 Mon Sep 17 00:00:00 2001 From: mgifos Date: Mon, 27 Aug 2018 14:18:23 +0200 Subject: [PATCH] Custom HR target spec #25 --- .../com.github.mgifos.workouts/model/Target.scala | 13 ++++++++++++- .../github/mgifos/workouts/model/TargetSpec.scala | 13 +++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/scala/com.github.mgifos.workouts/model/Target.scala b/src/main/scala/com.github.mgifos.workouts/model/Target.scala index ffdfb0d..34f04d2 100644 --- a/src/main/scala/com.github.mgifos.workouts/model/Target.scala +++ b/src/main/scala/com.github.mgifos.workouts/model/Target.scala @@ -16,6 +16,16 @@ case class HrZoneTarget(zone: Int) extends Target { "zoneNumber" -> zone.toString) } +case class HrCustomTarget(from: Int, to: Int) extends Target { + override def json = Json.obj( + "targetType" -> Json.obj( + "workoutTargetTypeId" -> 4, + "workoutTargetTypeKey" -> "heart.rate.zone"), + "targetValueOne" -> from, + "targetValueTwo" -> to, + "zoneNumber" -> JsNull) +} + case class PaceTarget(from: Pace, to: Pace) extends Target { override def json = Json.obj( "targetType" -> Json.obj( @@ -66,12 +76,13 @@ case class Speed(unit: DistanceUnits.DistanceUnit, exp: String) { object Target { private val HrZoneRx = """^z(\d)$""".r + private val HrCustomRx = """^(\d{1,3})\s*-\s*(\d{1,3})\s*bpm$""".r private val PaceRangeRx = """^(\d{1,2}:\d{2})\s*-\s*(\d{1,2}:\d{2})\s*(mpk|mpm)?$""".r - private val SpeedRangeRx = """^(\d{1,3}(\.\d{1})?)\s*-\s*(\d{1,3}(\.\d{1})?)\s*(kph|mph)?""".r def parse(x: String)(implicit msys: MeasurementSystems.MeasurementSystem): Target = x.trim match { case HrZoneRx(zone) => HrZoneTarget(zone.toInt) + case HrCustomRx(from, to) => HrCustomTarget(from.toInt, to.toInt) case SpeedRangeRx(from, _, to, _, uom) => val du = Option(uom).fold(msys.distance)(DistanceUnits.withSpeedUOM) SpeedTarget(Speed(du, from), Speed(du, to)) diff --git a/src/test/scala/com/github/mgifos/workouts/model/TargetSpec.scala b/src/test/scala/com/github/mgifos/workouts/model/TargetSpec.scala index aff04eb..1593008 100644 --- a/src/test/scala/com/github/mgifos/workouts/model/TargetSpec.scala +++ b/src/test/scala/com/github/mgifos/workouts/model/TargetSpec.scala @@ -2,6 +2,7 @@ package com.github.mgifos.workouts.model import org.scalatest.{ FlatSpec, Matchers } import com.github.mgifos.workouts.model.DistanceUnits._ +import play.api.libs.json.{ JsNull, Json } class TargetSpec extends FlatSpec with Matchers { @@ -30,4 +31,16 @@ class TargetSpec extends FlatSpec with Matchers { a[IllegalArgumentException] should be thrownBy Target.parse("5:20-04:30 unknownUOM") } + + "Target" should "handle custom HR specification correctly" in { + val hrcTarget = Target.parse("130-150 bpm").asInstanceOf[HrCustomTarget] + hrcTarget should be(HrCustomTarget(130, 150)) + hrcTarget.json should be(Json.obj( + "targetType" -> Json.obj( + "workoutTargetTypeId" -> 4, + "workoutTargetTypeKey" -> "heart.rate.zone"), + "targetValueOne" -> 130, + "targetValueTwo" -> 150, + "zoneNumber" -> JsNull)) + } }