作って学ぶElixir(2) テスト

## 前回の記事
[作って学ぶElixir(1) 引数の順序とパイプ演算子](https://qiita.com/yo4raw/items/ebbc479ced12fb2e7798)

## テストを書こう
さて、前回関数の仕様が確定したので実際に実装してしまいたいところですが、先にテストケースをいくつか書いてしまいましょう。何度もiexで実行するのは手間ですからね。
なによりElixirはイミュータブルですから単体テストも効果的です。

まっさらな状態だとこんなテストモジュールになるかと思います。

```elixir:test/summary_test.exs
defmodule SummaryTest do
  use ExUnit.Case
  doctest Summary

  end
end
```
doctestに関してはこちらの記事が参考になりますので、参考にしてみてください。
[Elixir の doctest 書き方まとめ](https://qiita.com/ma2ge/items/b6b26335ecc1b2181897)
この記事ではdoctestに関しては割愛します。

こんな感じでひたすらテストケースを作成してみます。
実装する際にサンプルで使用しそうな値を予めassertで書いてしまうと良いでしょう。
特に思い浮かばない場合は0の場合、1の場合、多数の場合と境界値を意識するとテストケースが思い浮かぶのではないでしょうか。

```elixir:test/summary_test.exs
defmodule SummaryTest do
  use ExUnit.Case
  #doctest Summary

  test "1行の場合" do
    data = [%{"name" => "sato", "script" => "hello"}]
    assert data
           |> Summary.by_key("name") ==
             [%{"name" => "sato", "contents" => [%{"script" => "hello"}]}]
  end
  test "同じキーが2行の場合" do
    data = [%{"name" => "sato", "script" => "hello"}, %{"name" => "sato", "script" => "hello"}]
    assert data
           |> Summary.by_key("name") ==
             [%{"name" => "sato", "contents" => [%{"script" => "hello"}, %{"script" => "hello"}]}]
  end

  test "違うキーが2行の場合" do
    data = [%{"name" => "sato", "script" => "hello"}, %{"name" => "tanaka", "script" => "hello"}]
    assert data
           |> Summary.by_key("name") ==
             [
               %{"name" => "sato", "contents" => [%{"script" => "hello"}]},
               %{"name" => "tanaka", "contents" => [%{"script" => "hello"}]}
             ]
  end

  test "違うキーで3行の場合" do
    data = [%{"name" => "sato", "script" => "hello"}, %{"name" => "tanaka", "script" => "hello"}]
    assert data
           |> Summary.by_key("name") ==
             [
               %{"name" => "sato", "contents" => [%{"script" => "hello"}]},
               %{"name" => "tanaka", "contents" => [%{"script" => "hello"}]}
             ]
  end

  test "違うキーで4行の場合" do
    data = [
      %{"name" => "sato", "script" => "hello"},
      %{"name" => "tanaka", "script" => "hello"},
      %{"name" => "sato", "script" => "hello"},
      %{"name" => "tanaka", "script" => "hello"}
    ]
    assert data
           |> Summary.by_key("name") ==
             [
               %{"name" => "sato", "contents" => [%{"script" => "hello"}]},
               %{"name" => "tanaka", "contents" => [%{"script" => "hello"}]},
               %{"name" => "sato", "contents" => [%{"script" => "hello"}]},
               %{"name" => "tanaka", "contents" => [%{"script" => "hello"}]}
             ]
  end
  test "一部同じキーで4行の場合" do
    data = [
      %{"name" => "sato", "script" => "hello"},
      %{"name" => "tanaka", "script" => "hello"},
      %{"name" => "tanaka", "script" => "hello"},
      %{"name" => "sato", "script" => "hello"}
    ]
    assert data
           |> Summary.by_key("name") ==
             [
               %{"name" => "sato", "contents" => [%{"script" => "hello"}]},
               %{"name" => "tanaka", "contents" => [%{"script" => "hello"}, %{"script" => "hello"}]},
               %{"name" => "sato", "contents" => [%{"script" => "hello"}]}
             ],
           [
             %{
               "script" => "hello",
               "contents" => [
                 %{"name" => "sato"},
                 %{"name" => "tanaka"},
                 %{"name" => "tanaka"},
                 %{"name" => "kobayashi"}
               ]
             }
           ]
  end
end
```