From c1e66457127b430a7886ba2736625144fd34d204 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 15 Oct 2020 14:19:16 +0900
Subject: [PATCH 01/25] =?UTF-8?q?SonarCloud=E9=80=A3=E6=90=BA=E3=83=86?=
 =?UTF-8?q?=E3=82=B9=E3=83=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .github/workflows/build.yml | 20 ++++++++++++++++++++
 sonar-project.properties    | 12 ++++++++++++
 2 files changed, 32 insertions(+)
 create mode 100644 .github/workflows/build.yml
 create mode 100644 sonar-project.properties

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000..43d8350
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,20 @@
+name: Build
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    types: [opened, synchronize, reopened]
+jobs:
+  sonarcloud:
+    name: SonarCloud
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v2
+        with:
+          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis
+      - name: SonarCloud Scan
+        uses: SonarSource/sonarcloud-github-action@master
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Needed to get PR information, if any
+          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
\ No newline at end of file
diff --git a/sonar-project.properties b/sonar-project.properties
new file mode 100644
index 0000000..9e2d71c
--- /dev/null
+++ b/sonar-project.properties
@@ -0,0 +1,12 @@
+sonar.projectKey=acala-quiz
+sonar.organization=chatwork-sonar
+
+# This is the name and version displayed in the SonarCloud UI.
+#sonar.projectName=acala-quiz
+#sonar.projectVersion=1.0
+
+# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
+#sonar.sources=.
+
+# Encoding of the source code. Default is default system encoding
+#sonar.sourceEncoding=UTF-8
\ No newline at end of file

From 6a40861eba54a49dae9f3031de8a20a0299a8a4a Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 09:32:44 +0900
Subject: [PATCH 02/25] =?UTF-8?q?=E3=83=86=E3=82=B9=E3=83=88=E3=81=8C?=
 =?UTF-8?q?=E9=80=9A=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../scala/com/chatwork/quiz/MyOption.scala    | 60 +++++++++----------
 .../com/chatwork/quiz/collection/MyList.scala | 57 ++++++++++++------
 .../scala/com/chatwork/quiz/misc/BTree.scala  | 42 ++++++++-----
 .../com/chatwork/quiz/misc/WordCounter.scala  | 10 +++-
 .../com/chatwork/quiz/MyOptionSpec.scala      | 37 +-----------
 .../chatwork/quiz/collection/MyListSpec.scala | 14 ++---
 .../com/chatwork/quiz/misc/BTreeSpec.scala    |  7 +--
 .../chatwork/quiz/misc/WordCounterSpec.scala  | 20 ++-----
 8 files changed, 120 insertions(+), 127 deletions(-)

diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index 13d0839..f0c0218 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -11,7 +11,7 @@ sealed trait MyOption[+A] {
     * 格納された値を返す。
     *
     * @return 値
-    * @throws NoSuchElementException 値が存在しない場合スローする
+    * @throws 値が存在しない場合 NoSuchElementException をスローする
     */
   def get: A
 
@@ -29,7 +29,10 @@ sealed trait MyOption[+A] {
     * @tparam B 新しい型
     * @return 新しい [[MyOption]]
     */
-  def map[B](f: A => B): MyOption[B] = ???
+  def map[B](f: A => B): MyOption[B] = this match {
+    case MyNone        => MyNone
+    case MySome(value) => MySome(f(value))
+  }
 
   /**
     * 値が存在する場合に、値の変換を行う。
@@ -38,7 +41,10 @@ sealed trait MyOption[+A] {
     * @tparam B 新しい型
     * @return 新しい [[MyOption]]
     */
-  def flatMap[B](f: A => MyOption[B]): MyOption[B] = ???
+  def flatMap[B](f: A => MyOption[B]): MyOption[B] = this match {
+    case MyNone        => MyNone
+    case MySome(value) => f(value)
+  }
 
   /**
     * 値が存在する場合に、値をフィルタリングする。
@@ -46,16 +52,10 @@ sealed trait MyOption[+A] {
     * @param f フィルターのための述語関数
     * @return 新しい [[MyOption]]
     */
-  def filter(f: A => Boolean): MyOption[A] = ???
-
-  /**
-   * 値が存在する場合に、値をフィルタリングする。
-   * 本来であれば中間状態を作成しないものだが今回はfilterで実装する
-   *
-   * @param f フィルターのための述語関数
-   * @return 新しい [[MyOption]]
-   */
-  def withFilter(f: A => Boolean): MyOption[A] = filter(f)
+  def filter(f: A => Boolean): MyOption[A] = this match {
+    case MyNone        => MyNone
+    case MySome(value) => if (f(value)) this else MyNone
+  }
 
   /**
     * 格納された値を返す。値がない場合は指定された値を返す。
@@ -64,7 +64,10 @@ sealed trait MyOption[+A] {
     * @tparam B 新しい要素型
     * @return 値
     */
-  def getOrElse[B >: A](elseValue: B): B = ???
+  def getOrElse[B >: A](elseValue: B): B = this match {
+    case MyNone        => elseValue
+    case MySome(value) => value
+  }
 
   /**
     * 値が存在しない場合に、指定した式を評価し返す。
@@ -73,7 +76,10 @@ sealed trait MyOption[+A] {
     * @tparam B 新しい要素型
     * @return elseValueを評価した値
     */
-  def orElse[B >: A](elseValue: => MyOption[B]): MyOption[B] = ???
+  def orElse[B >: A](elseValue: => MyOption[B]): MyOption[B] = this match {
+    case MyNone    => elseValue
+    case MySome(_) => this
+  }
 
 }
 
@@ -82,9 +88,9 @@ sealed trait MyOption[+A] {
   */
 case object MyNone extends MyOption[Nothing] {
 
-  def get: Nothing = ???
+  def get: Nothing = throw new NoSuchElementException
 
-  def isEmpty: Boolean = ???
+  def isEmpty: Boolean = true
 
 }
 
@@ -96,9 +102,9 @@ case object MyNone extends MyOption[Nothing] {
   */
 case class MySome[+A](value: A) extends MyOption[A] {
 
-  def get: A = ???
+  def get: A = value
 
-  def isEmpty: Boolean = ???
+  def isEmpty: Boolean = false
 
 }
 
@@ -114,18 +120,6 @@ object MyOption {
     * @tparam A 値の型
     * @return [[MyOption]]
     */
-  def apply[A](value: A): MyOption[A] = ???
-
-  /**
-    * for式 練習問題1
-    * @return [[MyOption]] MySome(6)
-    */
-  def translateToForComprehensions1: MyOption[Int] = ???
-
-  /**
-   * for式 練習問題2
-   * @return [[MyOption]] MyNone
-   */
-  def translateToForComprehensions2: MyOption[Int] = ???
+  def apply[A](value: A): MyOption[A] = MySome(value)
 
-}
+}
\ No newline at end of file
diff --git a/src/main/scala/com/chatwork/quiz/collection/MyList.scala b/src/main/scala/com/chatwork/quiz/collection/MyList.scala
index cb343e2..4f70224 100644
--- a/src/main/scala/com/chatwork/quiz/collection/MyList.scala
+++ b/src/main/scala/com/chatwork/quiz/collection/MyList.scala
@@ -1,52 +1,75 @@
 package com.chatwork.quiz.collection
 
-import com.chatwork.quiz.MyOption
+import com.chatwork.quiz.{ MyNone, MyOption, MySome }
 
 sealed trait MyList[+A] {
 
   // Easy
-  def length: Int = ???
+  def length: Int = this.foldRight(0)((_, z) => z + 1)
 
   // Normal
-  def foldLeft[B](z: B)(f: (B, A) => B): B = ???
+  def foldLeft[B](z: B)(f: (B, A) => B): B = this match {
+    case MyNil              => z
+    case MyCons(head, tail) => tail.foldLeft(f(z, head))(f)
+  }
 
   // 難易度選択制
   // Normal: 条件 - 特にありません、気の向くままに実装してください。
   // Hard:   条件 - foldLeftを使って実装してください。
-  def foldRight[B](z: B)(f: (A, B) => B): B = ???
+  def foldRight[B](z: B)(f: (A, B) => B): B = this match {
+    case MyNil              => z
+    case MyCons(head, tail) => f(head, tail.foldRight(z)(f))
+  }
 
   // Normal
   // scalastyle:off
-  def ::[B >: A](b: B): MyList[B] = ???
+  def ::[B >: A](b: B): MyList[B] = this match {
+    case MyNil        => MyList(b)
+    case MyCons(_, _) => MyCons(b, this)
+  }
   // scalastyle:on
 
   // Normal
-  def reverse: MyList[A] = ???
+  def reverse: MyList[A] = this.foldLeft(MyNil: MyList[A])((z, item) => MyCons(item, z))
 
   // Normal
   // scalastyle:off
-  def ++[B >: A](b: MyList[B]): MyList[B] = ???
+  def ++[B >: A](b: MyList[B]): MyList[B] = this match {
+    case MyNil        => this
+    case MyCons(_, _) => this.foldRight(b)((item, z) => MyCons(item, z))
+  }
   // scalastyle:on
 
   // Normal
-  def map[B](f: A => B): MyList[B] = ???
+  def map[B](f: A => B): MyList[B] = this.foldRight(MyNil: MyList[B])((item, z) => MyCons(f(item), z))
 
   // Normal
-  def flatMap[B](f: A => MyList[B]): MyList[B] = ???
+  def flatMap[B](f: A => MyList[B]): MyList[B] = this.foldRight(MyNil: MyList[B])((item, z) => f(item) ++ z)
 
   // Normal
-  def filter(f: A => Boolean): MyList[A] = ???
+  def filter(f: A => Boolean): MyList[A] =
+    this.foldRight(MyNil: MyList[A])((item, z) => if (f(item)) MyCons(item, z) else z)
 
   // Normal: 条件 - filterと同様の実装でも構いません。
   // Hard:   条件 - 中間リストを生成しないように実装してください。
-  def withFilter(f: A => Boolean): MyList[A] = ???
+  def withFilter(f: A => Boolean): MyList[A] = this.foldRight(MyNil: MyList[A])((b, z) => if (f(b)) MyCons(b, z) else z)
 
   // Normal
-  def find(f: A => Boolean): MyOption[A] = ???
+  def find(f: A => Boolean): MyOption[A] =
+    this.foldRight(MyNone: MyOption[A])((b, z) => if (f(b)) MySome(b) else z)
 
   // Normal
-  def startsWith[B >: A](prefix: MyList[B]): Boolean = ???
-
+  def startsWith[B >: A](prefix: MyList[B]): Boolean =
+    if (this.length < prefix.length) false
+    else
+      prefix match {
+        case MyNil => true
+        case MyCons(pHead, pTail) =>
+          this match {
+            case MyNil              => false
+            case MyCons(head, tail) => if (pHead == head) tail.startsWith(pTail) else false
+          }
+      }
 }
 
 case object MyNil extends MyList[Nothing]
@@ -56,9 +79,9 @@ case class MyCons[+A](head: A, tail: MyList[A]) extends MyList[A]
 object MyList {
 
   // Easy
-  def empty[A]: MyList[A] = ???
+  def empty[A]: MyList[A] = MyNil
 
   // Normal
-  def apply[A](as: A*): MyList[A] = ???
+  def apply[A](as: A*): MyList[A] = as.foldRight(MyNil: MyList[A])((b, z) => MyCons(b, z))
 
-}
+}
\ No newline at end of file
diff --git a/src/main/scala/com/chatwork/quiz/misc/BTree.scala b/src/main/scala/com/chatwork/quiz/misc/BTree.scala
index 85eb293..de9d5ff 100644
--- a/src/main/scala/com/chatwork/quiz/misc/BTree.scala
+++ b/src/main/scala/com/chatwork/quiz/misc/BTree.scala
@@ -54,17 +54,21 @@ sealed trait Node {
   */
 case class Branch(left: Node, value: Int, right: Node) extends Node {
 
-  val size: Int = ???
+  val size: Int = left.size + right.size + 1
 
-  val sum: Int = ???
+  val sum: Int = left.value + right.value + this.value
 
-  val avg: Double = ???
+  val avg: Double = this.sum / this.size
 
-  val max: Int = ???
+  private val list = List(left.value, right.value, this.value)
 
-  val min: Int = ???
+  val max: Int = list.max
 
-  def find(value: Int): Option[Node] = ???
+  val min: Int = list.min
+
+  def find(value: Int): Option[Node] =
+    if (value == this.value) Some(this)
+    else left.find(value).orElse(right.find(value)).orElse(None)
 
 }
 
@@ -75,17 +79,17 @@ case class Branch(left: Node, value: Int, right: Node) extends Node {
   */
 case class Leaf(value: Int) extends Node {
 
-  val size: Int = ???
+  val size: Int = 1
 
-  val sum: Int = ???
+  val sum: Int = value
 
-  val avg: Double = ???
+  val avg: Double = value
 
-  val max: Int = ???
+  val max: Int = value
 
-  val min: Int = ???
+  val min: Int = value
 
-  def find(value: Int): Option[Node] = ???
+  def find(value: Int): Option[Node] = if (value == this.value) Some(this) else None
 
 }
 
@@ -121,6 +125,14 @@ object BTree {
     * @param values ノードに格納する値の集合
     * @return [[BTree]]
     */
-  def apply(values: List[Int]): BTree = ???
-
-}
+  def apply(values: List[Int]): BTree = {
+    values match {
+      case value :: Nil => BTree(Leaf(value))
+      case _ => {
+        val (left, mid :: right) = values.splitAt(values.size / 2)
+        BTree(Branch(apply(left).node, mid, apply(right).node))
+      }
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/src/main/scala/com/chatwork/quiz/misc/WordCounter.scala b/src/main/scala/com/chatwork/quiz/misc/WordCounter.scala
index f72aecc..e89cc58 100644
--- a/src/main/scala/com/chatwork/quiz/misc/WordCounter.scala
+++ b/src/main/scala/com/chatwork/quiz/misc/WordCounter.scala
@@ -1,16 +1,22 @@
 package com.chatwork.quiz.misc
 
+import scala.collection.immutable.HashMap
+
 /**
   * ワードをカウントするオブジェクト。
   */
 object WordCounter {
 
+  val SEPARATOR = " "
+
   /**
     * 文字列から単語数をカウントする。
     *
     * @param words 文字列
     * @return 単語がキー、単語数がヴァリューのマップ
     */
-  def countWords(words: List[String]): Map[String, Int] = ???
+  def countWords(words: List[String]): Map[String, Int] = {
+    words.map(elm => elm.split(SEPARATOR)).flatten.groupMapReduce(t => t)(_ => 1)((x, y) => x + y)
+  }
 
-}
+}
\ No newline at end of file
diff --git a/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala b/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
index 3d662fe..cf7c1e3 100644
--- a/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
@@ -1,9 +1,8 @@
 package com.chatwork.quiz
 
-import org.scalatest.funspec.AnyFunSpec
-import org.scalatest.matchers.should.Matchers
+import org.scalatest.{Matchers, FunSpec}
 
-class MyOptionSpec extends AnyFunSpec with Matchers {
+class MyOptionSpec extends FunSpec with Matchers {
 
   describe("MyOption#get") {
     it("should return a value if it's not empty") {
@@ -70,34 +69,4 @@ class MyOptionSpec extends AnyFunSpec with Matchers {
     }
   }
 
-  describe("MyOption#translateToForComprehensions1") {
-    it("should return MySome(6)") {
-      val expected =
-        MyOption(1).flatMap { one =>
-          MyOption(2).flatMap { two =>
-            MyOption(3).map { three =>
-              one + two + three
-            }
-          }
-        }
-      MyOption.translateToForComprehensions1 shouldBe expected
-      MyOption.translateToForComprehensions1 shouldBe MySome(6)
-    }
-  }
-
-  describe("MyOption#translateToForComprehensions2") {
-    it("should return MyNone") {
-      val expected =
-        MyOption(1).flatMap { one =>
-          MyOption(-2).withFilter(_ > 0).flatMap { two =>
-            MyOption(3).map { three =>
-              one + two + three
-            }
-          }
-        }
-      MyOption.translateToForComprehensions2 shouldBe expected
-      MyOption.translateToForComprehensions2 shouldBe MyNone
-    }
-  }
-
-}
+}
\ No newline at end of file
diff --git a/src/test/scala/com/chatwork/quiz/collection/MyListSpec.scala b/src/test/scala/com/chatwork/quiz/collection/MyListSpec.scala
index faf0507..5bb9398 100644
--- a/src/test/scala/com/chatwork/quiz/collection/MyListSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/collection/MyListSpec.scala
@@ -1,10 +1,9 @@
 package com.chatwork.quiz.collection
 
-import com.chatwork.quiz.{ MyNone, MySome }
-import org.scalatest.funspec.AnyFunSpec
-import org.scalatest.matchers.should.Matchers
+import com.chatwork.quiz.{MySome, MyNone}
+import org.scalatest.{FunSpec, Matchers}
 
-class MyListSpec extends AnyFunSpec with Matchers {
+class MyListSpec extends FunSpec with Matchers {
 
   describe("MyList#apply") {
     it("should return a new MyList instance") {
@@ -51,8 +50,7 @@ class MyListSpec extends AnyFunSpec with Matchers {
 
   describe("MyList#flatMap") {
     it("should apply an operator to each element in the list and flatten") {
-      MyList(MyList(1, 2), MyList(3, 4), MyList(5, 6), MyList(7, 8))
-        .flatMap(_.map(_ * 2)) shouldEqual MyList(2, 4, 6, 8, 10, 12, 14, 16)
+      MyList(MyList(1, 2), MyList(3, 4), MyList(5, 6), MyList(7, 8)).flatMap(_.map(_ * 2)) shouldEqual MyList(2, 4, 6, 8, 10, 12, 14, 16)
     }
   }
 
@@ -72,7 +70,7 @@ class MyListSpec extends AnyFunSpec with Matchers {
   describe("for comprehension") {
     it("should provide for comprehension") {
       (for {
-        suit   <- MyList("Diamond", "Heart", "Spade", "Club")
+        suit <- MyList("Diamond", "Heart", "Spade", "Club")
         number <- MyList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
         if suit == "Diamond"
       } yield {
@@ -81,4 +79,4 @@ class MyListSpec extends AnyFunSpec with Matchers {
     }
   }
 
-}
+}
\ No newline at end of file
diff --git a/src/test/scala/com/chatwork/quiz/misc/BTreeSpec.scala b/src/test/scala/com/chatwork/quiz/misc/BTreeSpec.scala
index 4673df8..8e01850 100644
--- a/src/test/scala/com/chatwork/quiz/misc/BTreeSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/misc/BTreeSpec.scala
@@ -1,11 +1,10 @@
 package com.chatwork.quiz.misc
 
-import org.scalatest.funspec.AnyFunSpec
-import org.scalatest.matchers.should.Matchers
+import org.scalatest.{Matchers, FunSpec}
 
 import scala.math.Ordering.IntOrdering
 
-class BTreeSpec extends AnyFunSpec with Matchers {
+class BTreeSpec extends FunSpec with Matchers  {
 
   describe("BTree#size") {
     it("should return the number of elements in the BTree") {
@@ -50,4 +49,4 @@ class BTreeSpec extends AnyFunSpec with Matchers {
     }
   }
 
-}
+}
\ No newline at end of file
diff --git a/src/test/scala/com/chatwork/quiz/misc/WordCounterSpec.scala b/src/test/scala/com/chatwork/quiz/misc/WordCounterSpec.scala
index dfb65e3..be9d7a4 100644
--- a/src/test/scala/com/chatwork/quiz/misc/WordCounterSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/misc/WordCounterSpec.scala
@@ -1,23 +1,15 @@
 package com.chatwork.quiz.misc
 
-import org.scalatest.funspec.AnyFunSpec
-import org.scalatest.matchers.should.Matchers
+import org.scalatest.{FunSpec, Matchers}
 
-class WordCounterSpec extends AnyFunSpec with Matchers {
+
+class WordCounterSpec extends FunSpec with Matchers {
 
   describe("WordCounter#countWord") {
     it("should count words") {
-      val words = List("apple banana", "orange apple mango", "kiwi papaya orange", "mango orange muscat apple")
-      WordCounter.countWords(words) shouldBe Map(
-        "banana" -> 1,
-        "muscat" -> 1,
-        "orange" -> 3,
-        "mango"  -> 2,
-        "apple"  -> 3,
-        "kiwi"   -> 1,
-        "papaya" -> 1
-      )
+      val words = List("apple banana", "orange apple mango", "kiwi papaya orange","mango orange muscat apple")
+      WordCounter.countWords(words) shouldBe  Map("banana" -> 1, "muscat" -> 1, "orange" -> 3, "mango" -> 2, "apple" -> 3, "kiwi" -> 1, "papaya" -> 1)
     }
   }
 
-}
+}
\ No newline at end of file

From c6d055b93b35f72a803cf46b8e8da75caf252a3b Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 09:46:52 +0900
Subject: [PATCH 03/25] =?UTF-8?q?=E3=82=AB=E3=83=90=E3=83=AC=E3=83=83?=
 =?UTF-8?q?=E3=82=B8=E3=82=92=E5=8F=96=E3=82=8C=E3=82=8B=E3=82=88=E3=81=86?=
 =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 project/plugins.sbt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/project/plugins.sbt b/project/plugins.sbt
index a37251a..00b2159 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1 +1,2 @@
-addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.3.4")
+addSbtPlugin("org.scalameta" % "sbt-scalafmt"  % "2.3.4")
+addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.1")

From 036f0fa5b740141be013c9dbceb35fe3f759e481 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 09:47:28 +0900
Subject: [PATCH 04/25] =?UTF-8?q?=E3=82=84=E3=82=84=E3=81=93=E3=81=97?=
 =?UTF-8?q?=E3=81=84=E3=82=B4=E3=83=9F=E3=82=92=E5=89=8A=E9=99=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .github/workflows/build.yml | 20 --------------------
 sonar-project.properties    | 12 ------------
 2 files changed, 32 deletions(-)
 delete mode 100644 .github/workflows/build.yml
 delete mode 100644 sonar-project.properties

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
deleted file mode 100644
index 43d8350..0000000
--- a/.github/workflows/build.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-name: Build
-on:
-  push:
-    branches:
-      - master
-  pull_request:
-    types: [opened, synchronize, reopened]
-jobs:
-  sonarcloud:
-    name: SonarCloud
-    runs-on: ubuntu-latest
-    steps:
-      - uses: actions/checkout@v2
-        with:
-          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis
-      - name: SonarCloud Scan
-        uses: SonarSource/sonarcloud-github-action@master
-        env:
-          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Needed to get PR information, if any
-          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
\ No newline at end of file
diff --git a/sonar-project.properties b/sonar-project.properties
deleted file mode 100644
index 9e2d71c..0000000
--- a/sonar-project.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-sonar.projectKey=acala-quiz
-sonar.organization=chatwork-sonar
-
-# This is the name and version displayed in the SonarCloud UI.
-#sonar.projectName=acala-quiz
-#sonar.projectVersion=1.0
-
-# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows.
-#sonar.sources=.
-
-# Encoding of the source code. Default is default system encoding
-#sonar.sourceEncoding=UTF-8
\ No newline at end of file

From 5dbaf3707c16f62d93202c89d8e64233124ab3a7 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 09:52:54 +0900
Subject: [PATCH 05/25] =?UTF-8?q?SonarCloud=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/scala/com/chatwork/quiz/MyOption.scala | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index f0c0218..f61eff9 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -110,6 +110,7 @@ case class MySome[+A](value: A) extends MyOption[A] {
 
 /**
   * [[MyOption]]のコンパニオンオブジェクト。
+  *
   */
 object MyOption {
 
@@ -122,4 +123,4 @@ object MyOption {
     */
   def apply[A](value: A): MyOption[A] = MySome(value)
 
-}
\ No newline at end of file
+}

From e99e8a33962159e654a9f296d33908d583d0f32b Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 09:56:35 +0900
Subject: [PATCH 06/25] =?UTF-8?q?SonarCloud=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/scala/com/chatwork/quiz/MyOption.scala | 1 -
 1 file changed, 1 deletion(-)

diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index f61eff9..8429ee2 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -110,7 +110,6 @@ case class MySome[+A](value: A) extends MyOption[A] {
 
 /**
   * [[MyOption]]のコンパニオンオブジェクト。
-  *
   */
 object MyOption {
 

From acaf480682ecd2a753ce168f701910a021958c1f Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 09:59:40 +0900
Subject: [PATCH 07/25] =?UTF-8?q?SonarCloud=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/scala/com/chatwork/quiz/MyOption.scala | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index 8429ee2..f61eff9 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -110,6 +110,7 @@ case class MySome[+A](value: A) extends MyOption[A] {
 
 /**
   * [[MyOption]]のコンパニオンオブジェクト。
+  *
   */
 object MyOption {
 

From 8649f17692be57ef1a7ab745d01ab7d2133d9e83 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 14:30:52 +0900
Subject: [PATCH 08/25] =?UTF-8?q?SonarCloud=E7=94=A8=E3=81=AE=E3=83=97?=
 =?UTF-8?q?=E3=83=AD=E3=83=91=E3=83=86=E3=82=A3=E3=83=95=E3=82=A1=E3=82=A4?=
 =?UTF-8?q?=E3=83=AB=E3=82=92=E8=BF=BD=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .sonarcloud.properties | 16 ++++++++++++++++
 build.sbt              |  5 +++--
 2 files changed, 19 insertions(+), 2 deletions(-)
 create mode 100644 .sonarcloud.properties

diff --git a/.sonarcloud.properties b/.sonarcloud.properties
new file mode 100644
index 0000000..59909cf
--- /dev/null
+++ b/.sonarcloud.properties
@@ -0,0 +1,16 @@
+sonar.projectName=pegasus
+sonar.host.url=https://sonarcloud.io
+sonar.language=scala
+sonar.projectKey=chatwork_pegasus
+
+sonar.sources=src/main
+
+# Path to tests
+sonar.tests=src/test
+
+# Source encoding
+sonar.sourceEncoding=UTF-8
+
+sonar.scala.coverage.reportPaths=\
+  target/scala-2.13/scoverage-report, \
+  target/scala-2.13/scoverage-report/scoverage.xml
\ No newline at end of file
diff --git a/build.sbt b/build.sbt
index f2bb7f0..9608158 100644
--- a/build.sbt
+++ b/build.sbt
@@ -13,5 +13,6 @@ lazy val root: Project = (project in file("."))
       ),
     libraryDependencies ++= Seq(
         "org.scalatest" %% "scalatest" % "3.1.1" % Test
-      )
-  )
+      ),
+    coverageEnabled := true
+  )
\ No newline at end of file

From dbf0d317d2ad6637bade7bede5f385e71fbefd0d Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 14:52:50 +0900
Subject: [PATCH 09/25] =?UTF-8?q?SonarCloud=E7=94=A8=E3=81=AE=E3=83=97?=
 =?UTF-8?q?=E3=83=AD=E3=83=91=E3=83=86=E3=82=A3=E3=83=95=E3=82=A1=E3=82=A4?=
 =?UTF-8?q?=E3=83=AB=E3=82=92=E8=BF=BD=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .sonarcloud.properties | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.sonarcloud.properties b/.sonarcloud.properties
index 59909cf..a475c53 100644
--- a/.sonarcloud.properties
+++ b/.sonarcloud.properties
@@ -1,7 +1,7 @@
-sonar.projectName=pegasus
+sonar.projectName=scala-quiz
 sonar.host.url=https://sonarcloud.io
 sonar.language=scala
-sonar.projectKey=chatwork_pegasus
+sonar.projectKey=chatwork_scala-quiz
 
 sonar.sources=src/main
 

From d8ab2f94502050536f21cb99e1526317f63d228b Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 16:26:18 +0900
Subject: [PATCH 10/25] =?UTF-8?q?sbt-sonar=E7=94=A8=E3=81=AE=E8=A8=AD?=
 =?UTF-8?q?=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .sonarcloud.properties   |  1 +
 build.sbt                |  6 +++++-
 project/plugins.sbt      |  2 ++
 sonar-project.properties | 25 +++++++++++++++++++++++++
 4 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 sonar-project.properties

diff --git a/.sonarcloud.properties b/.sonarcloud.properties
index a475c53..0916678 100644
--- a/.sonarcloud.properties
+++ b/.sonarcloud.properties
@@ -1,3 +1,4 @@
+sonar.organization=chatwork-sonar
 sonar.projectName=scala-quiz
 sonar.host.url=https://sonarcloud.io
 sonar.language=scala
diff --git a/build.sbt b/build.sbt
index 9608158..9a13d65 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,3 +1,5 @@
+import sbtsonar.SonarPlugin.autoImport._
+
 lazy val root: Project = (project in file("."))
   .settings(
     organization := "com.chatwork",
@@ -14,5 +16,7 @@ lazy val root: Project = (project in file("."))
     libraryDependencies ++= Seq(
         "org.scalatest" %% "scalatest" % "3.1.1" % Test
       ),
-    coverageEnabled := true
+    coverageEnabled := true,
+    sonarUseExternalConfig := true,
+    aggregate in sonarScan := false
   )
\ No newline at end of file
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 00b2159..8ddbaa6 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1,2 +1,4 @@
 addSbtPlugin("org.scalameta" % "sbt-scalafmt"  % "2.3.4")
 addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.1")
+
+addSbtPlugin("com.github.mwz" % "sbt-sonar" % "2.1.0")
diff --git a/sonar-project.properties b/sonar-project.properties
new file mode 100644
index 0000000..b3e233f
--- /dev/null
+++ b/sonar-project.properties
@@ -0,0 +1,25 @@
+sonar.organization=chatwork-sonar
+sonar.projectName=scala-quiz
+sonar.host.url=https://sonarcloud.io
+sonar.language=scala
+sonar.projectKey=chatwork_scala-quiz
+
+sonar.sources=src/main
+
+# Path to tests
+sonar.tests=src/test
+
+# Source encoding
+sonar.sourceEncoding=UTF-8
+
+sonar.scala.scoverage.reportPath=\
+  target/scala-2.13/scoverage-report, \
+  target/scala-2.13/scoverage-report/scoverage.xml
+
+sonar.scala.pullrequest.provider=github
+sonar.scala.pullrequest.github.repository=chatwork/scala-quiz
+sonar.scala.pullrequest.number=7
+
+# 以下はコミット注意!!!!
+sonar.scala.pullrequest.github.oauth=#GitHubで生成したトークン
+sonar.login=#SonarCloudで生成したトークン

From d82497ec7bcd7cc3fb94919adb6843236d649629 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 17:00:06 +0900
Subject: [PATCH 11/25] =?UTF-8?q?=E3=81=93=E3=81=93=E3=81=8B=E3=82=89?=
 =?UTF-8?q?=E5=85=88=E3=81=AF=E3=80=81sonar-scala=E3=81=AF=E7=84=A1?=
 =?UTF-8?q?=E5=8A=B9=E3=81=AB=E3=81=97=E3=81=A6SonarCloud=E3=81=A0?=
 =?UTF-8?q?=E3=81=91=E3=81=A7=E3=82=AB=E3=83=90=E3=83=AC=E3=83=83=E3=82=B8?=
 =?UTF-8?q?=E5=8F=96=E5=BE=97=E3=82=92=E8=A9=A6=E3=81=BF=E3=82=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .sonarcloud.properties | 4 ++++
 build.sbt              | 8 ++++----
 project/plugins.sbt    | 2 +-
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/.sonarcloud.properties b/.sonarcloud.properties
index 0916678..1791d12 100644
--- a/.sonarcloud.properties
+++ b/.sonarcloud.properties
@@ -12,6 +12,10 @@ sonar.tests=src/test
 # Source encoding
 sonar.sourceEncoding=UTF-8
 
+sonar.scala.scoverage.reportPaths=\
+  target/scala-2.13/scoverage-report, \
+  target/scala-2.13/scoverage-report/scoverage.xml
+
 sonar.scala.coverage.reportPaths=\
   target/scala-2.13/scoverage-report, \
   target/scala-2.13/scoverage-report/scoverage.xml
\ No newline at end of file
diff --git a/build.sbt b/build.sbt
index 9a13d65..1a28879 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,4 +1,4 @@
-import sbtsonar.SonarPlugin.autoImport._
+//import sbtsonar.SonarPlugin.autoImport._
 
 lazy val root: Project = (project in file("."))
   .settings(
@@ -16,7 +16,7 @@ lazy val root: Project = (project in file("."))
     libraryDependencies ++= Seq(
         "org.scalatest" %% "scalatest" % "3.1.1" % Test
       ),
-    coverageEnabled := true,
-    sonarUseExternalConfig := true,
-    aggregate in sonarScan := false
+    coverageEnabled := true
+//    sonarUseExternalConfig := true,
+//    aggregate in sonarScan := false
   )
\ No newline at end of file
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 8ddbaa6..99e1fed 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1,4 +1,4 @@
 addSbtPlugin("org.scalameta" % "sbt-scalafmt"  % "2.3.4")
 addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.1")
 
-addSbtPlugin("com.github.mwz" % "sbt-sonar" % "2.1.0")
+//addSbtPlugin("com.github.mwz" % "sbt-sonar" % "2.1.0")

From 0f603ad459edcfb3227e07fcdfd5a1d9b3ea8360 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 17:28:47 +0900
Subject: [PATCH 12/25] =?UTF-8?q?SonarCloud=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/scala/com/chatwork/quiz/MyOption.scala | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index f61eff9..db739e5 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -111,6 +111,7 @@ case class MySome[+A](value: A) extends MyOption[A] {
 /**
   * [[MyOption]]のコンパニオンオブジェクト。
   *
+  *
   */
 object MyOption {
 

From cd453d247a82febf6c86fe0d1d6e55394adf7540 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Thu, 29 Oct 2020 17:29:55 +0900
Subject: [PATCH 13/25] =?UTF-8?q?SonarCloud=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/scala/com/chatwork/quiz/MyOption.scala | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index db739e5..e493733 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -112,6 +112,7 @@ case class MySome[+A](value: A) extends MyOption[A] {
   * [[MyOption]]のコンパニオンオブジェクト。
   *
   *
+  *
   */
 object MyOption {
 

From 4bb80ae633998925b5d2233f26aa56fd9b3ebdb5 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Fri, 30 Oct 2020 21:01:59 +0900
Subject: [PATCH 14/25] =?UTF-8?q?CircleCI=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .circleci/config.yml     | 21 +++++++++++++++++++++
 .sonarcloud.properties   |  4 ----
 sonar-project.properties |  8 --------
 3 files changed, 21 insertions(+), 12 deletions(-)
 create mode 100644 .circleci/config.yml

diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 0000000..e3a85c7
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,21 @@
+version: 2.1
+
+jobs:
+  build:
+    docker:
+      - image: chatwork/sbt-ci-openjdk8:jdk8u252-b09-1.3.10
+    steps:
+      - checkout
+      - run:
+          name: "unit tests"
+          command: sbt -mem 2048 test coverage coverageReport
+      - sonarcloud/scan
+
+orbs:
+  sonarcloud: sonarsource/sonarcloud@1.0.1
+
+workflows:
+  main:
+    jobs:
+      - build:
+          context: SonarCloud
\ No newline at end of file
diff --git a/.sonarcloud.properties b/.sonarcloud.properties
index 1791d12..0916678 100644
--- a/.sonarcloud.properties
+++ b/.sonarcloud.properties
@@ -12,10 +12,6 @@ sonar.tests=src/test
 # Source encoding
 sonar.sourceEncoding=UTF-8
 
-sonar.scala.scoverage.reportPaths=\
-  target/scala-2.13/scoverage-report, \
-  target/scala-2.13/scoverage-report/scoverage.xml
-
 sonar.scala.coverage.reportPaths=\
   target/scala-2.13/scoverage-report, \
   target/scala-2.13/scoverage-report/scoverage.xml
\ No newline at end of file
diff --git a/sonar-project.properties b/sonar-project.properties
index b3e233f..e6c6e45 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -15,11 +15,3 @@ sonar.sourceEncoding=UTF-8
 sonar.scala.scoverage.reportPath=\
   target/scala-2.13/scoverage-report, \
   target/scala-2.13/scoverage-report/scoverage.xml
-
-sonar.scala.pullrequest.provider=github
-sonar.scala.pullrequest.github.repository=chatwork/scala-quiz
-sonar.scala.pullrequest.number=7
-
-# 以下はコミット注意!!!!
-sonar.scala.pullrequest.github.oauth=#GitHubで生成したトークン
-sonar.login=#SonarCloudで生成したトークン

From 4fe172c22b3d2e67bbe4287f3d142e01a3c0ea75 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Fri, 30 Oct 2020 21:05:27 +0900
Subject: [PATCH 15/25] =?UTF-8?q?CircleCI=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/scala/com/chatwork/quiz/MyOption.scala | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index e493733..93dcb75 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -113,6 +113,7 @@ case class MySome[+A](value: A) extends MyOption[A] {
   *
   *
   *
+  *
   */
 object MyOption {
 

From fbed298338bf10d75af2d262fbecb0e22fe43364 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Fri, 30 Oct 2020 21:09:20 +0900
Subject: [PATCH 16/25] =?UTF-8?q?CircleCI=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/main/scala/com/chatwork/quiz/MyOption.scala | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index 93dcb75..2187e34 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -114,6 +114,7 @@ case class MySome[+A](value: A) extends MyOption[A] {
   *
   *
   *
+  *
   */
 object MyOption {
 

From 696f49d8c7c8ef5e2b79a7c8a21fb13fe2d796f6 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Fri, 30 Oct 2020 21:13:47 +0900
Subject: [PATCH 17/25] =?UTF-8?q?CircleCI=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .circleci/config.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.circleci/config.yml b/.circleci/config.yml
index e3a85c7..7d79c79 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -7,7 +7,7 @@ jobs:
     steps:
       - checkout
       - run:
-          name: "unit tests"
+          name: "coverage"
           command: sbt -mem 2048 test coverage coverageReport
       - sonarcloud/scan
 

From 8f3e96ee5048052fc17b0ace09468a06d4aed00b Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Fri, 30 Oct 2020 21:18:03 +0900
Subject: [PATCH 18/25] =?UTF-8?q?=E3=82=B4=E3=83=9F=E3=82=92=E6=95=B4?=
 =?UTF-8?q?=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .sonarcloud.properties   | 17 -----------------
 sonar-project.properties | 13 +++++--------
 2 files changed, 5 insertions(+), 25 deletions(-)
 delete mode 100644 .sonarcloud.properties

diff --git a/.sonarcloud.properties b/.sonarcloud.properties
deleted file mode 100644
index 0916678..0000000
--- a/.sonarcloud.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-sonar.organization=chatwork-sonar
-sonar.projectName=scala-quiz
-sonar.host.url=https://sonarcloud.io
-sonar.language=scala
-sonar.projectKey=chatwork_scala-quiz
-
-sonar.sources=src/main
-
-# Path to tests
-sonar.tests=src/test
-
-# Source encoding
-sonar.sourceEncoding=UTF-8
-
-sonar.scala.coverage.reportPaths=\
-  target/scala-2.13/scoverage-report, \
-  target/scala-2.13/scoverage-report/scoverage.xml
\ No newline at end of file
diff --git a/sonar-project.properties b/sonar-project.properties
index e6c6e45..71bac1d 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -1,17 +1,14 @@
+sonar.host.url=https://sonarcloud.io
 sonar.organization=chatwork-sonar
 sonar.projectName=scala-quiz
-sonar.host.url=https://sonarcloud.io
-sonar.language=scala
 sonar.projectKey=chatwork_scala-quiz
 
-sonar.sources=src/main
+sonar.sourceEncoding=UTF-8
 
-# Path to tests
+sonar.sources=src/main
 sonar.tests=src/test
 
-# Source encoding
-sonar.sourceEncoding=UTF-8
+sonar.language=scala
 
 sonar.scala.scoverage.reportPath=\
-  target/scala-2.13/scoverage-report, \
-  target/scala-2.13/scoverage-report/scoverage.xml
+  target/scala-2.13/scoverage-report

From c0274b11386bd88e8502ed6f162ab34826cb4f9b Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Fri, 30 Oct 2020 23:53:28 +0900
Subject: [PATCH 19/25] =?UTF-8?q?build.sbt=E3=81=AE=E3=82=AA=E3=83=97?=
 =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E5=89=8A=E9=99=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 build.sbt | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/build.sbt b/build.sbt
index 1a28879..c78967a 100644
--- a/build.sbt
+++ b/build.sbt
@@ -15,8 +15,5 @@ lazy val root: Project = (project in file("."))
       ),
     libraryDependencies ++= Seq(
         "org.scalatest" %% "scalatest" % "3.1.1" % Test
-      ),
-    coverageEnabled := true
-//    sonarUseExternalConfig := true,
-//    aggregate in sonarScan := false
+      )
   )
\ No newline at end of file

From 0f84f7b7ba7793afbcab83a0d9ef12b2ca0435f0 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Fri, 30 Oct 2020 23:55:53 +0900
Subject: [PATCH 20/25] =?UTF-8?q?build.sbt=E3=81=AE=E3=82=AA=E3=83=97?=
 =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E5=BE=A9=E6=B4=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 build.sbt | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/build.sbt b/build.sbt
index c78967a..1a28879 100644
--- a/build.sbt
+++ b/build.sbt
@@ -15,5 +15,8 @@ lazy val root: Project = (project in file("."))
       ),
     libraryDependencies ++= Seq(
         "org.scalatest" %% "scalatest" % "3.1.1" % Test
-      )
+      ),
+    coverageEnabled := true
+//    sonarUseExternalConfig := true,
+//    aggregate in sonarScan := false
   )
\ No newline at end of file

From d94e8afd2f8457c5f5533310b5d436824d5e978c Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Sat, 31 Oct 2020 00:00:00 +0900
Subject: [PATCH 21/25] =?UTF-8?q?master=E3=81=A8=E3=81=AE=E5=B7=AE?=
 =?UTF-8?q?=E5=88=86=E3=81=8C=E3=82=8F=E3=81=8B=E3=82=8B=E3=82=88=E3=81=86?=
 =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?=
 =?UTF-8?q?=E3=82=92=E6=95=B4=E7=90=86=E3=81=99=E3=82=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 build.sbt                                     |  4 --
 project/plugins.sbt                           |  2 -
 .../scala/com/chatwork/quiz/MyOption.scala    | 63 ++++++++++---------
 .../com/chatwork/quiz/collection/MyList.scala | 57 +++++------------
 .../scala/com/chatwork/quiz/misc/BTree.scala  | 42 +++++--------
 .../com/chatwork/quiz/misc/WordCounter.scala  | 10 +--
 .../com/chatwork/quiz/MyOptionSpec.scala      | 43 ++++++++++++-
 .../chatwork/quiz/collection/MyListSpec.scala | 14 +++--
 .../com/chatwork/quiz/misc/BTreeSpec.scala    |  7 ++-
 .../chatwork/quiz/misc/WordCounterSpec.scala  | 20 ++++--
 10 files changed, 132 insertions(+), 130 deletions(-)

diff --git a/build.sbt b/build.sbt
index 1a28879..9608158 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,5 +1,3 @@
-//import sbtsonar.SonarPlugin.autoImport._
-
 lazy val root: Project = (project in file("."))
   .settings(
     organization := "com.chatwork",
@@ -17,6 +15,4 @@ lazy val root: Project = (project in file("."))
         "org.scalatest" %% "scalatest" % "3.1.1" % Test
       ),
     coverageEnabled := true
-//    sonarUseExternalConfig := true,
-//    aggregate in sonarScan := false
   )
\ No newline at end of file
diff --git a/project/plugins.sbt b/project/plugins.sbt
index 99e1fed..00b2159 100644
--- a/project/plugins.sbt
+++ b/project/plugins.sbt
@@ -1,4 +1,2 @@
 addSbtPlugin("org.scalameta" % "sbt-scalafmt"  % "2.3.4")
 addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.6.1")
-
-//addSbtPlugin("com.github.mwz" % "sbt-sonar" % "2.1.0")
diff --git a/src/main/scala/com/chatwork/quiz/MyOption.scala b/src/main/scala/com/chatwork/quiz/MyOption.scala
index 2187e34..13d0839 100644
--- a/src/main/scala/com/chatwork/quiz/MyOption.scala
+++ b/src/main/scala/com/chatwork/quiz/MyOption.scala
@@ -11,7 +11,7 @@ sealed trait MyOption[+A] {
     * 格納された値を返す。
     *
     * @return 値
-    * @throws 値が存在しない場合 NoSuchElementException をスローする
+    * @throws NoSuchElementException 値が存在しない場合スローする
     */
   def get: A
 
@@ -29,10 +29,7 @@ sealed trait MyOption[+A] {
     * @tparam B 新しい型
     * @return 新しい [[MyOption]]
     */
-  def map[B](f: A => B): MyOption[B] = this match {
-    case MyNone        => MyNone
-    case MySome(value) => MySome(f(value))
-  }
+  def map[B](f: A => B): MyOption[B] = ???
 
   /**
     * 値が存在する場合に、値の変換を行う。
@@ -41,10 +38,7 @@ sealed trait MyOption[+A] {
     * @tparam B 新しい型
     * @return 新しい [[MyOption]]
     */
-  def flatMap[B](f: A => MyOption[B]): MyOption[B] = this match {
-    case MyNone        => MyNone
-    case MySome(value) => f(value)
-  }
+  def flatMap[B](f: A => MyOption[B]): MyOption[B] = ???
 
   /**
     * 値が存在する場合に、値をフィルタリングする。
@@ -52,10 +46,16 @@ sealed trait MyOption[+A] {
     * @param f フィルターのための述語関数
     * @return 新しい [[MyOption]]
     */
-  def filter(f: A => Boolean): MyOption[A] = this match {
-    case MyNone        => MyNone
-    case MySome(value) => if (f(value)) this else MyNone
-  }
+  def filter(f: A => Boolean): MyOption[A] = ???
+
+  /**
+   * 値が存在する場合に、値をフィルタリングする。
+   * 本来であれば中間状態を作成しないものだが今回はfilterで実装する
+   *
+   * @param f フィルターのための述語関数
+   * @return 新しい [[MyOption]]
+   */
+  def withFilter(f: A => Boolean): MyOption[A] = filter(f)
 
   /**
     * 格納された値を返す。値がない場合は指定された値を返す。
@@ -64,10 +64,7 @@ sealed trait MyOption[+A] {
     * @tparam B 新しい要素型
     * @return 値
     */
-  def getOrElse[B >: A](elseValue: B): B = this match {
-    case MyNone        => elseValue
-    case MySome(value) => value
-  }
+  def getOrElse[B >: A](elseValue: B): B = ???
 
   /**
     * 値が存在しない場合に、指定した式を評価し返す。
@@ -76,10 +73,7 @@ sealed trait MyOption[+A] {
     * @tparam B 新しい要素型
     * @return elseValueを評価した値
     */
-  def orElse[B >: A](elseValue: => MyOption[B]): MyOption[B] = this match {
-    case MyNone    => elseValue
-    case MySome(_) => this
-  }
+  def orElse[B >: A](elseValue: => MyOption[B]): MyOption[B] = ???
 
 }
 
@@ -88,9 +82,9 @@ sealed trait MyOption[+A] {
   */
 case object MyNone extends MyOption[Nothing] {
 
-  def get: Nothing = throw new NoSuchElementException
+  def get: Nothing = ???
 
-  def isEmpty: Boolean = true
+  def isEmpty: Boolean = ???
 
 }
 
@@ -102,19 +96,14 @@ case object MyNone extends MyOption[Nothing] {
   */
 case class MySome[+A](value: A) extends MyOption[A] {
 
-  def get: A = value
+  def get: A = ???
 
-  def isEmpty: Boolean = false
+  def isEmpty: Boolean = ???
 
 }
 
 /**
   * [[MyOption]]のコンパニオンオブジェクト。
-  *
-  *
-  *
-  *
-  *
   */
 object MyOption {
 
@@ -125,6 +114,18 @@ object MyOption {
     * @tparam A 値の型
     * @return [[MyOption]]
     */
-  def apply[A](value: A): MyOption[A] = MySome(value)
+  def apply[A](value: A): MyOption[A] = ???
+
+  /**
+    * for式 練習問題1
+    * @return [[MyOption]] MySome(6)
+    */
+  def translateToForComprehensions1: MyOption[Int] = ???
+
+  /**
+   * for式 練習問題2
+   * @return [[MyOption]] MyNone
+   */
+  def translateToForComprehensions2: MyOption[Int] = ???
 
 }
diff --git a/src/main/scala/com/chatwork/quiz/collection/MyList.scala b/src/main/scala/com/chatwork/quiz/collection/MyList.scala
index 4f70224..cb343e2 100644
--- a/src/main/scala/com/chatwork/quiz/collection/MyList.scala
+++ b/src/main/scala/com/chatwork/quiz/collection/MyList.scala
@@ -1,75 +1,52 @@
 package com.chatwork.quiz.collection
 
-import com.chatwork.quiz.{ MyNone, MyOption, MySome }
+import com.chatwork.quiz.MyOption
 
 sealed trait MyList[+A] {
 
   // Easy
-  def length: Int = this.foldRight(0)((_, z) => z + 1)
+  def length: Int = ???
 
   // Normal
-  def foldLeft[B](z: B)(f: (B, A) => B): B = this match {
-    case MyNil              => z
-    case MyCons(head, tail) => tail.foldLeft(f(z, head))(f)
-  }
+  def foldLeft[B](z: B)(f: (B, A) => B): B = ???
 
   // 難易度選択制
   // Normal: 条件 - 特にありません、気の向くままに実装してください。
   // Hard:   条件 - foldLeftを使って実装してください。
-  def foldRight[B](z: B)(f: (A, B) => B): B = this match {
-    case MyNil              => z
-    case MyCons(head, tail) => f(head, tail.foldRight(z)(f))
-  }
+  def foldRight[B](z: B)(f: (A, B) => B): B = ???
 
   // Normal
   // scalastyle:off
-  def ::[B >: A](b: B): MyList[B] = this match {
-    case MyNil        => MyList(b)
-    case MyCons(_, _) => MyCons(b, this)
-  }
+  def ::[B >: A](b: B): MyList[B] = ???
   // scalastyle:on
 
   // Normal
-  def reverse: MyList[A] = this.foldLeft(MyNil: MyList[A])((z, item) => MyCons(item, z))
+  def reverse: MyList[A] = ???
 
   // Normal
   // scalastyle:off
-  def ++[B >: A](b: MyList[B]): MyList[B] = this match {
-    case MyNil        => this
-    case MyCons(_, _) => this.foldRight(b)((item, z) => MyCons(item, z))
-  }
+  def ++[B >: A](b: MyList[B]): MyList[B] = ???
   // scalastyle:on
 
   // Normal
-  def map[B](f: A => B): MyList[B] = this.foldRight(MyNil: MyList[B])((item, z) => MyCons(f(item), z))
+  def map[B](f: A => B): MyList[B] = ???
 
   // Normal
-  def flatMap[B](f: A => MyList[B]): MyList[B] = this.foldRight(MyNil: MyList[B])((item, z) => f(item) ++ z)
+  def flatMap[B](f: A => MyList[B]): MyList[B] = ???
 
   // Normal
-  def filter(f: A => Boolean): MyList[A] =
-    this.foldRight(MyNil: MyList[A])((item, z) => if (f(item)) MyCons(item, z) else z)
+  def filter(f: A => Boolean): MyList[A] = ???
 
   // Normal: 条件 - filterと同様の実装でも構いません。
   // Hard:   条件 - 中間リストを生成しないように実装してください。
-  def withFilter(f: A => Boolean): MyList[A] = this.foldRight(MyNil: MyList[A])((b, z) => if (f(b)) MyCons(b, z) else z)
+  def withFilter(f: A => Boolean): MyList[A] = ???
 
   // Normal
-  def find(f: A => Boolean): MyOption[A] =
-    this.foldRight(MyNone: MyOption[A])((b, z) => if (f(b)) MySome(b) else z)
+  def find(f: A => Boolean): MyOption[A] = ???
 
   // Normal
-  def startsWith[B >: A](prefix: MyList[B]): Boolean =
-    if (this.length < prefix.length) false
-    else
-      prefix match {
-        case MyNil => true
-        case MyCons(pHead, pTail) =>
-          this match {
-            case MyNil              => false
-            case MyCons(head, tail) => if (pHead == head) tail.startsWith(pTail) else false
-          }
-      }
+  def startsWith[B >: A](prefix: MyList[B]): Boolean = ???
+
 }
 
 case object MyNil extends MyList[Nothing]
@@ -79,9 +56,9 @@ case class MyCons[+A](head: A, tail: MyList[A]) extends MyList[A]
 object MyList {
 
   // Easy
-  def empty[A]: MyList[A] = MyNil
+  def empty[A]: MyList[A] = ???
 
   // Normal
-  def apply[A](as: A*): MyList[A] = as.foldRight(MyNil: MyList[A])((b, z) => MyCons(b, z))
+  def apply[A](as: A*): MyList[A] = ???
 
-}
\ No newline at end of file
+}
diff --git a/src/main/scala/com/chatwork/quiz/misc/BTree.scala b/src/main/scala/com/chatwork/quiz/misc/BTree.scala
index de9d5ff..85eb293 100644
--- a/src/main/scala/com/chatwork/quiz/misc/BTree.scala
+++ b/src/main/scala/com/chatwork/quiz/misc/BTree.scala
@@ -54,21 +54,17 @@ sealed trait Node {
   */
 case class Branch(left: Node, value: Int, right: Node) extends Node {
 
-  val size: Int = left.size + right.size + 1
+  val size: Int = ???
 
-  val sum: Int = left.value + right.value + this.value
+  val sum: Int = ???
 
-  val avg: Double = this.sum / this.size
+  val avg: Double = ???
 
-  private val list = List(left.value, right.value, this.value)
+  val max: Int = ???
 
-  val max: Int = list.max
+  val min: Int = ???
 
-  val min: Int = list.min
-
-  def find(value: Int): Option[Node] =
-    if (value == this.value) Some(this)
-    else left.find(value).orElse(right.find(value)).orElse(None)
+  def find(value: Int): Option[Node] = ???
 
 }
 
@@ -79,17 +75,17 @@ case class Branch(left: Node, value: Int, right: Node) extends Node {
   */
 case class Leaf(value: Int) extends Node {
 
-  val size: Int = 1
+  val size: Int = ???
 
-  val sum: Int = value
+  val sum: Int = ???
 
-  val avg: Double = value
+  val avg: Double = ???
 
-  val max: Int = value
+  val max: Int = ???
 
-  val min: Int = value
+  val min: Int = ???
 
-  def find(value: Int): Option[Node] = if (value == this.value) Some(this) else None
+  def find(value: Int): Option[Node] = ???
 
 }
 
@@ -125,14 +121,6 @@ object BTree {
     * @param values ノードに格納する値の集合
     * @return [[BTree]]
     */
-  def apply(values: List[Int]): BTree = {
-    values match {
-      case value :: Nil => BTree(Leaf(value))
-      case _ => {
-        val (left, mid :: right) = values.splitAt(values.size / 2)
-        BTree(Branch(apply(left).node, mid, apply(right).node))
-      }
-    }
-  }
-
-}
\ No newline at end of file
+  def apply(values: List[Int]): BTree = ???
+
+}
diff --git a/src/main/scala/com/chatwork/quiz/misc/WordCounter.scala b/src/main/scala/com/chatwork/quiz/misc/WordCounter.scala
index e89cc58..f72aecc 100644
--- a/src/main/scala/com/chatwork/quiz/misc/WordCounter.scala
+++ b/src/main/scala/com/chatwork/quiz/misc/WordCounter.scala
@@ -1,22 +1,16 @@
 package com.chatwork.quiz.misc
 
-import scala.collection.immutable.HashMap
-
 /**
   * ワードをカウントするオブジェクト。
   */
 object WordCounter {
 
-  val SEPARATOR = " "
-
   /**
     * 文字列から単語数をカウントする。
     *
     * @param words 文字列
     * @return 単語がキー、単語数がヴァリューのマップ
     */
-  def countWords(words: List[String]): Map[String, Int] = {
-    words.map(elm => elm.split(SEPARATOR)).flatten.groupMapReduce(t => t)(_ => 1)((x, y) => x + y)
-  }
+  def countWords(words: List[String]): Map[String, Int] = ???
 
-}
\ No newline at end of file
+}
diff --git a/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala b/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
index cf7c1e3..ebda2a4 100644
--- a/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
@@ -1,8 +1,15 @@
 package com.chatwork.quiz
 
-import org.scalatest.{Matchers, FunSpec}
+import org.scalatest.funspec.AnyFunSpec
+import org.scalatest.matchers.should.Matchers
 
-class MyOptionSpec extends FunSpec with Matchers {
+class MyOptionSpec extends AnyFunSpec with Matchers {
+
+  describe("MyOption#apply") {
+    it("should return MyNone if it's null") {
+      MyOption(null) shouldBe MyNone
+    }
+  }
 
   describe("MyOption#get") {
     it("should return a value if it's not empty") {
@@ -69,4 +76,34 @@ class MyOptionSpec extends FunSpec with Matchers {
     }
   }
 
-}
\ No newline at end of file
+  describe("MyOption#translateToForComprehensions1") {
+    it("should return MySome(6)") {
+      val expected =
+        MyOption(1).flatMap { one =>
+          MyOption(2).flatMap { two =>
+            MyOption(3).map { three =>
+              one + two + three
+            }
+          }
+        }
+      MyOption.translateToForComprehensions1 shouldBe expected
+      MyOption.translateToForComprehensions1 shouldBe MySome(6)
+    }
+  }
+
+  describe("MyOption#translateToForComprehensions2") {
+    it("should return MyNone") {
+      val expected =
+        MyOption(1).flatMap { one =>
+          MyOption(-2).withFilter(_ > 0).flatMap { two =>
+            MyOption(3).map { three =>
+              one + two + three
+            }
+          }
+        }
+      MyOption.translateToForComprehensions2 shouldBe expected
+      MyOption.translateToForComprehensions2 shouldBe MyNone
+    }
+  }
+
+}
diff --git a/src/test/scala/com/chatwork/quiz/collection/MyListSpec.scala b/src/test/scala/com/chatwork/quiz/collection/MyListSpec.scala
index 5bb9398..faf0507 100644
--- a/src/test/scala/com/chatwork/quiz/collection/MyListSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/collection/MyListSpec.scala
@@ -1,9 +1,10 @@
 package com.chatwork.quiz.collection
 
-import com.chatwork.quiz.{MySome, MyNone}
-import org.scalatest.{FunSpec, Matchers}
+import com.chatwork.quiz.{ MyNone, MySome }
+import org.scalatest.funspec.AnyFunSpec
+import org.scalatest.matchers.should.Matchers
 
-class MyListSpec extends FunSpec with Matchers {
+class MyListSpec extends AnyFunSpec with Matchers {
 
   describe("MyList#apply") {
     it("should return a new MyList instance") {
@@ -50,7 +51,8 @@ class MyListSpec extends FunSpec with Matchers {
 
   describe("MyList#flatMap") {
     it("should apply an operator to each element in the list and flatten") {
-      MyList(MyList(1, 2), MyList(3, 4), MyList(5, 6), MyList(7, 8)).flatMap(_.map(_ * 2)) shouldEqual MyList(2, 4, 6, 8, 10, 12, 14, 16)
+      MyList(MyList(1, 2), MyList(3, 4), MyList(5, 6), MyList(7, 8))
+        .flatMap(_.map(_ * 2)) shouldEqual MyList(2, 4, 6, 8, 10, 12, 14, 16)
     }
   }
 
@@ -70,7 +72,7 @@ class MyListSpec extends FunSpec with Matchers {
   describe("for comprehension") {
     it("should provide for comprehension") {
       (for {
-        suit <- MyList("Diamond", "Heart", "Spade", "Club")
+        suit   <- MyList("Diamond", "Heart", "Spade", "Club")
         number <- MyList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
         if suit == "Diamond"
       } yield {
@@ -79,4 +81,4 @@ class MyListSpec extends FunSpec with Matchers {
     }
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/scala/com/chatwork/quiz/misc/BTreeSpec.scala b/src/test/scala/com/chatwork/quiz/misc/BTreeSpec.scala
index 8e01850..4673df8 100644
--- a/src/test/scala/com/chatwork/quiz/misc/BTreeSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/misc/BTreeSpec.scala
@@ -1,10 +1,11 @@
 package com.chatwork.quiz.misc
 
-import org.scalatest.{Matchers, FunSpec}
+import org.scalatest.funspec.AnyFunSpec
+import org.scalatest.matchers.should.Matchers
 
 import scala.math.Ordering.IntOrdering
 
-class BTreeSpec extends FunSpec with Matchers  {
+class BTreeSpec extends AnyFunSpec with Matchers {
 
   describe("BTree#size") {
     it("should return the number of elements in the BTree") {
@@ -49,4 +50,4 @@ class BTreeSpec extends FunSpec with Matchers  {
     }
   }
 
-}
\ No newline at end of file
+}
diff --git a/src/test/scala/com/chatwork/quiz/misc/WordCounterSpec.scala b/src/test/scala/com/chatwork/quiz/misc/WordCounterSpec.scala
index be9d7a4..dfb65e3 100644
--- a/src/test/scala/com/chatwork/quiz/misc/WordCounterSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/misc/WordCounterSpec.scala
@@ -1,15 +1,23 @@
 package com.chatwork.quiz.misc
 
-import org.scalatest.{FunSpec, Matchers}
+import org.scalatest.funspec.AnyFunSpec
+import org.scalatest.matchers.should.Matchers
 
-
-class WordCounterSpec extends FunSpec with Matchers {
+class WordCounterSpec extends AnyFunSpec with Matchers {
 
   describe("WordCounter#countWord") {
     it("should count words") {
-      val words = List("apple banana", "orange apple mango", "kiwi papaya orange","mango orange muscat apple")
-      WordCounter.countWords(words) shouldBe  Map("banana" -> 1, "muscat" -> 1, "orange" -> 3, "mango" -> 2, "apple" -> 3, "kiwi" -> 1, "papaya" -> 1)
+      val words = List("apple banana", "orange apple mango", "kiwi papaya orange", "mango orange muscat apple")
+      WordCounter.countWords(words) shouldBe Map(
+        "banana" -> 1,
+        "muscat" -> 1,
+        "orange" -> 3,
+        "mango"  -> 2,
+        "apple"  -> 3,
+        "kiwi"   -> 1,
+        "papaya" -> 1
+      )
     }
   }
 
-}
\ No newline at end of file
+}

From a0a95dbf856cf49ca0ab1fc7292e3fa27d0c24fa Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Sat, 31 Oct 2020 00:07:00 +0900
Subject: [PATCH 22/25] =?UTF-8?q?master=E3=81=A8=E3=81=AE=E5=B7=AE?=
 =?UTF-8?q?=E5=88=86=E3=81=8C=E3=82=8F=E3=81=8B=E3=82=8B=E3=82=88=E3=81=86?=
 =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?=
 =?UTF-8?q?=E3=82=92=E6=95=B4=E7=90=86=E3=81=99=E3=82=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/test/scala/com/chatwork/quiz/MyOptionSpec.scala | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala b/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
index ebda2a4..3d662fe 100644
--- a/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
@@ -5,12 +5,6 @@ import org.scalatest.matchers.should.Matchers
 
 class MyOptionSpec extends AnyFunSpec with Matchers {
 
-  describe("MyOption#apply") {
-    it("should return MyNone if it's null") {
-      MyOption(null) shouldBe MyNone
-    }
-  }
-
   describe("MyOption#get") {
     it("should return a value if it's not empty") {
       MySome(100).get shouldBe 100

From 9a6f245236f686b93a7ec36beb439735d0ea6a65 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Sat, 31 Oct 2020 00:09:08 +0900
Subject: [PATCH 23/25] =?UTF-8?q?master=E3=81=A8=E3=81=AE=E5=B7=AE?=
 =?UTF-8?q?=E5=88=86=E3=81=8C=E3=82=8F=E3=81=8B=E3=82=8B=E3=82=88=E3=81=86?=
 =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?=
 =?UTF-8?q?=E3=82=92=E6=95=B4=E7=90=86=E3=81=99=E3=82=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/test/scala/com/chatwork/quiz/MyOptionSpec.scala | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala b/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
index 3d662fe..ebda2a4 100644
--- a/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
+++ b/src/test/scala/com/chatwork/quiz/MyOptionSpec.scala
@@ -5,6 +5,12 @@ import org.scalatest.matchers.should.Matchers
 
 class MyOptionSpec extends AnyFunSpec with Matchers {
 
+  describe("MyOption#apply") {
+    it("should return MyNone if it's null") {
+      MyOption(null) shouldBe MyNone
+    }
+  }
+
   describe("MyOption#get") {
     it("should return a value if it's not empty") {
       MySome(100).get shouldBe 100

From 6b4912f541b93c06ca7d2832b3b51060033d26c9 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Mon, 2 Nov 2020 18:26:54 +0900
Subject: [PATCH 24/25] =?UTF-8?q?CircleCI=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 sonar-project.properties | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sonar-project.properties b/sonar-project.properties
index 71bac1d..29ff935 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -12,3 +12,5 @@ sonar.language=scala
 
 sonar.scala.scoverage.reportPath=\
   target/scala-2.13/scoverage-report
+
+#
\ No newline at end of file

From 5573e1556c185c7a5c10bb93a8f64d458a30bce1 Mon Sep 17 00:00:00 2001
From: "louvre2489@gmail.com" <louvre2489@gmail.com>
Date: Mon, 2 Nov 2020 18:28:06 +0900
Subject: [PATCH 25/25] =?UTF-8?q?CircleCI=E5=8B=95=E3=81=91=EF=BC=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 sonar-project.properties | 2 --
 1 file changed, 2 deletions(-)

diff --git a/sonar-project.properties b/sonar-project.properties
index 29ff935..71bac1d 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -12,5 +12,3 @@ sonar.language=scala
 
 sonar.scala.scoverage.reportPath=\
   target/scala-2.13/scoverage-report
-
-#
\ No newline at end of file