From 304f079d9ed05cd350c17451f4ed5145ab6ca62a Mon Sep 17 00:00:00 2001
From: "quentin.leblanc@etu.hesge.ch" <quentin.leblanc@etu.hesge.ch>
Date: Thu, 5 Mar 2020 16:56:26 +0100
Subject: [PATCH] TP6

---
 TP3/src/main/scala/6.collect.scala      | 72 +++++++++++++++++++++++++
 TP3/src/test/scala/6.collect_test.scala | 45 ++++++++++++++++
 2 files changed, 117 insertions(+)
 create mode 100644 TP3/src/main/scala/6.collect.scala
 create mode 100644 TP3/src/test/scala/6.collect_test.scala

diff --git a/TP3/src/main/scala/6.collect.scala b/TP3/src/main/scala/6.collect.scala
new file mode 100644
index 0000000..351270b
--- /dev/null
+++ b/TP3/src/main/scala/6.collect.scala
@@ -0,0 +1,72 @@
+package ch.hepia.tpscala
+
+
+/* Implémentez les fonctions suivantes. 
+ */
+object Collect {
+
+  case class Album( title: String, artist: String, year: Int )
+  case class Duration( minutes: Int, seconds: Int ) {
+    def +(that: Duration): Duration = {
+      var min = this.minutes + that.minutes
+      var sec = (this.seconds+that.seconds)
+      if(sec > 60) {
+        min+=1
+        sec-=60
+      }
+      Duration(min, sec)
+    }
+  }
+  case class Track( title: String, duration: Duration )
+
+  val albums = List(
+    Album( "Mit Gas", "Tomahawk", 2003 ),
+    Album( "Pork Soda", "Primus", 1993 ),
+    Album( "Brown Album", "Primus", 1997 ),
+    Album( "Distraction Pieces", "Scroobius Pip", 2011 )
+  )
+
+  val tracks = Map(
+    "Mit Gas" -> List(
+      Track( "Mayday", Duration( 3, 32 ) )
+    ),
+    "Pork Soda" -> List(
+      Track( "DMV", Duration( 4, 58 ) ),
+      Track( "Mr. Krinkle", Duration( 5, 27 ) )
+    ),
+    "Brown Album" -> List(
+      Track( "Fisticuffs", Duration( 4, 25 ) ),
+      Track( "Camelback Cinema", Duration( 4, 0 ) ),
+      Track( "Kalamazoo", Duration( 3, 31 ) )
+    ),
+    "Distraction Pieces" -> List(
+      Track( "Let 'Em Come", Duration( 4, 25 ) ),
+      Track( "Domestic Silence", Duration( 3, 58 ) )
+    )
+  )
+
+  /* Retourne la liste de morceaux associés à un artiste */
+  def tracksOf( artist: String ): List[Track] = {
+    albums.filter{ a => a.artist == artist}.map{ a => a.title}.flatMap(tracks)
+  }
+
+  /* Retourne la liste de tous les morceaux de moins de 4 minutes */
+  def shortTracks: List[Track] = {
+    tracks.flatMap(_._2.filter(_.duration.minutes < 4)).toList
+  }
+
+  /* Retourne les titres des morceaux antérieurs à une année */
+  def titlesBefore( year: Int ): List[String] = {
+    albums.filter(_.year<year).map(_.title).flatMap(tracks).map(_.title)
+  }
+
+  /* Calcule la durée totale de tous les morceaux disponibles.
+     REMARQUE: ont veut que les secondes soient inférieures à 60 mais les
+     minutes peuvent dépasser ce total.
+   */
+  def totalDuration: Duration = {
+    tracks.values.flatten.map(_.duration).reduce(_+_)
+  }
+
+
+}
diff --git a/TP3/src/test/scala/6.collect_test.scala b/TP3/src/test/scala/6.collect_test.scala
new file mode 100644
index 0000000..8cdbf15
--- /dev/null
+++ b/TP3/src/test/scala/6.collect_test.scala
@@ -0,0 +1,45 @@
+package ch.hepia.tpscala
+
+import org.scalatest.funsuite.AnyFunSuite
+
+import Collect._
+
+class Collect6Suite extends AnyFunSuite {
+
+  test( "tracksOf" ) {
+    assert( tracksOf("Justin Bieber").isEmpty )
+    assert( tracksOf("Tomahawk") == List( Track( "Mayday", Duration( 3, 32 ) ) ) )
+    assert( tracksOf("Primus").size == 5 )
+  }
+
+  test( "shortTracks" ) {
+    assert(
+      shortTracks.toSet == Set(
+        Track( "Mayday", Duration( 3, 32 ) ),
+        Track( "Kalamazoo", Duration( 3, 31 ) ),
+        Track( "Domestic Silence", Duration( 3, 58 ) )
+      )
+    )
+  }
+
+  test( "titlesBefore" ) {
+    assert( titlesBefore( 1928 ).size == 0 )
+    assert( titlesBefore( 2020 ).size == 8 )
+    assert(
+      titlesBefore( 2000 ).toSet == Set(
+        "DMV",
+        "Mr. Krinkle",
+        "Fisticuffs",
+        "Camelback Cinema",
+        "Kalamazoo"
+      )
+    )
+  }
+
+  test( "totalDuration" ) {
+    assert( totalDuration == Duration( 34, 16 ) )
+  }
+
+
+
+}
-- 
GitLab