From 51674035c50877979bb7d0b2eae9f2f86b2d16a4 Mon Sep 17 00:00:00 2001 From: mgifos Date: Mon, 9 Jul 2018 20:24:16 +0200 Subject: [PATCH] Workouts definitions can be referenced within a same week. #20 --- .../model/WeeklyPlan.scala | 15 +++++++-------- .../github/mgifos/workouts/WeekPlanSpec.scala | 17 +++++++++++++++++ .../mgifos/workouts/model/WorkoutSpec.scala | 1 - 3 files changed, 24 insertions(+), 9 deletions(-) create mode 100644 src/test/scala/com/github/mgifos/workouts/WeekPlanSpec.scala diff --git a/src/main/scala/com.github.mgifos.workouts/model/WeeklyPlan.scala b/src/main/scala/com.github.mgifos.workouts/model/WeeklyPlan.scala index 88aef36..1fb0808 100644 --- a/src/main/scala/com.github.mgifos.workouts/model/WeeklyPlan.scala +++ b/src/main/scala/com.github.mgifos.workouts/model/WeeklyPlan.scala @@ -10,15 +10,14 @@ class WeeklyPlan(csv: Array[Byte]) { private lazy val processed: Seq[Option[Workout]] = { - def weekPlan(week: Week, acc: Seq[Option[Workout]]): Seq[Option[Workout]] = Seq.tabulate(7) { weekDayNo => - val maybeDayText = week.lift(weekDayNo + 1).flatMap(text => Option(text.trim).filter(_.nonEmpty)) - maybeDayText.map { dayText => - Workout.parseDef(dayText) match { - case Right(definition) => definition - case Left(_) => onlyDefs(acc).find(_.name == dayText).map(_.toRef).getOrElse(WorkoutNote(dayText)) - } + def weekPlan(week: Week, previousWeeks: Seq[Option[Workout]]): Seq[Option[Workout]] = Seq.tabulate(7) { weekDayNo => + week.lift(weekDayNo + 1).flatMap(text => Option(text.trim).filter(_.nonEmpty)) + }.foldLeft(Seq.empty[Option[Workout]])((acc, maybeDayText) => acc :+ maybeDayText.map { dayText => + Workout.parseDef(dayText) match { + case Right(definition) => definition + case Left(_) => onlyDefs(previousWeeks ++ acc).find(_.name == dayText).map(_.toRef).getOrElse(WorkoutNote(dayText)) } - } + }) def loop(weeks: List[Week], acc: Seq[Option[Workout]]): Seq[Option[Workout]] = weeks match { case Nil => acc diff --git a/src/test/scala/com/github/mgifos/workouts/WeekPlanSpec.scala b/src/test/scala/com/github/mgifos/workouts/WeekPlanSpec.scala new file mode 100644 index 0000000..b48567a --- /dev/null +++ b/src/test/scala/com/github/mgifos/workouts/WeekPlanSpec.scala @@ -0,0 +1,17 @@ +package com.github.mgifos.workouts + +import com.github.mgifos.workouts.model._ +import org.scalatest.{ FlatSpec, Matchers } + +class WeekPlanSpec extends FlatSpec with Matchers { + + val runFast = "running: run-fast\n- warmup: 10:00\n- repeat: 2\n - run: 1500m @ 4:30-5:00\n - recover: 01:30 @ z2\n- cooldown: lap-button" + val runSlow = "running: run-slow\n- warmup: 10:00\n- run: 5km @ z2\n- cooldown: lap-button" + val testPlan = s"""1,"$runFast",,run-fast,,run-fast,,,\n2,,run-fast,"$runSlow",run-fast,,run-slow,,""" + + "WeekPlan" should "detect workout definitions and references properly" in { + val plan = new WeeklyPlan(testPlan.getBytes) + plan.get.flatten should have size 7 + plan.workouts should have size 2 + } +} diff --git a/src/test/scala/com/github/mgifos/workouts/model/WorkoutSpec.scala b/src/test/scala/com/github/mgifos/workouts/model/WorkoutSpec.scala index caf1d3b..3622ae6 100644 --- a/src/test/scala/com/github/mgifos/workouts/model/WorkoutSpec.scala +++ b/src/test/scala/com/github/mgifos/workouts/model/WorkoutSpec.scala @@ -40,7 +40,6 @@ class WorkoutSpec extends FlatSpec with Matchers { testNames.foreach { testName => val x = Workout.parseDef(testWO.replace("run-fast", testName)) - println(x) x.right.get.name should be(testName) } }