Второй игрок победил! Сборка кода и прохождение тестов

Теперь, согласно нашим тестам, мы добавим условие, которое гарантирует, что второй игрок является победителем.

Наш модуль Game выглядит следующим образом:

# lib/game.ex

defmodule Game do
  @moduledoc """
  Documentation for `Game`.
  """
  @stone 1
  @paper 2
  @scissor 3

  def play(first_player_choice, second_player_choice) do
    result(first_player_choice, second_player_choice)
  end

  defp result(first_player_choice, second_player_choice) do
    cond do
      first_player_choice == second_player_choice ->
        {:ok, "Draw!"}

      first_player_choice == @scissor && second_player_choice == @paper ->
        {:ok, "First player win!!!"}

      first_player_choice == @paper && second_player_choice == @stone ->
        {:ok, "First player win!!!"}

      first_player_choice == @stone && second_player_choice == @scissor ->
        {:ok, "First player win!!!"}
    end
  end
end

Вход в полноэкранный режим Выход из полноэкранного режима

Если мы запустим тесты сейчас:

mix test
Войти в полноэкранный режим Выйти из полноэкранного режима

Мы увидим сбои в тестах:

..

  1) test Game.play/2 when second player wins when second player chooses stone and first player chooses scissors (GameTest)
     test/game_test.exs:85
     ** (CondClauseError) no cond clause evaluated to a truthy value
     code: assert {:ok, match} = Game.play(first_player_choice, second_player_choise)
     stacktrace:
       (rock_paper_scissor_elixir 0.1.0) lib/game.ex:24: Game.result/2
       test/game_test.exs:89: (test)



  2) test Game.play/2 when second player wins when second player chooses scissors and first player chooses paper (GameTest)
     test/game_test.exs:67
     ** (CondClauseError) no cond clause evaluated to a truthy value
     code: assert {:ok, match} = Game.play(first_player_choice, second_player_choise)
     stacktrace:
       (rock_paper_scissor_elixir 0.1.0) lib/game.ex:24: Game.result/2
       test/game_test.exs:71: (test)

...

  3) test Game.play/2 when second player wins when second player chooses paper and first player chooses stone (GameTest)
     test/game_test.exs:76
     ** (CondClauseError) no cond clause evaluated to a truthy value
     code: assert {:ok, match} = Game.play(first_player_choice, second_player_choise)
     stacktrace:
       (rock_paper_scissor_elixir 0.1.0) lib/game.ex:24: Game.result/2
       test/game_test.exs:80: (test)

.

Finished in 0.05 seconds (0.00s async, 0.05s sync)
9 tests, 3 failures

Randomized with seed 710365
Войти в полноэкранный режим Выйти из полноэкранного режима

Когда первый игрок выбирает бумагу, а второй — ножницы

Добавим условие, когда первый игрок выбирает бумагу, а второй — ножницы:

# lib/game.ex

defmodule Game do
  @moduledoc """
  Documentation for `Game`.
  """

  def play(first_player_choice, second_player_choice) do
    result(first_player_choice, second_player_choice)
  end

  defp result(first_player_choice, second_player_choice) do
    cond do
      # ...

      first_player_choice == @paper && second_player_choice == @scissor ->
        {:ok, "Second player win!!!"}
    end
  end
end
Войти в полноэкранный режим Выход из полноэкранного режима

А теперь, если мы повторно запустим тесты:

mix test
Войти в полноэкранный режим Выйти из полноэкранного режима

Тест с реальным сценарием прошел нормально. Теперь у нас есть только два теста с неудачей.

Compiling 1 file (.ex)
.

  1) test Game.play/2 when second player wins when second player chooses stone and first player chooses scissors (GameTest)
     test/game_test.exs:85
     ** (CondClauseError) no cond clause evaluated to a truthy value
     code: assert {:ok, match} = Game.play(first_player_choice, second_player_choise)
     stacktrace:
       (rock_paper_scissor_elixir 0.1.0) lib/game.ex:27: Game.result/2
       test/game_test.exs:89: (test)

.....

  2) test Game.play/2 when second player wins when second player chooses paper and first player chooses stone (GameTest)
     test/game_test.exs:76
     ** (CondClauseError) no cond clause evaluated to a truthy value
     code: assert {:ok, match} = Game.play(first_player_choice, second_player_choise)
     stacktrace:
       (rock_paper_scissor_elixir 0.1.0) lib/game.ex:27: Game.result/2
       test/game_test.exs:80: (test)

.

Finished in 0.04 seconds (0.00s async, 0.04s sync)
9 tests, 2 failures

Randomized with seed 862104
Вход в полноэкранный режим Выход из полноэкранного режима

Когда первый игрок выбирает камень, а второй игрок выбирает бумагу

  • Добавим условие, когда первый игрок выбирает камень, а второй — бумагу:
# lib/game.ex

defmodule Game do
  @moduledoc """
  Documentation for `Game`.
  """

  def play(first_player_choice, second_player_choice) do
    result(first_player_choice, second_player_choice)
  end

  defp result(first_player_choice, second_player_choice) do
    cond do
      # ...

      first_player_choice == @paper && second_player_choice == @scissor ->
        {:ok, "Second player win!!!"}

      first_player_choice == @stone && second_player_choice == @paper ->
        {:ok, "Second player win!!!"}
    end
  end
end
Вход в полноэкранный режим Выход из полноэкранного режима

А теперь, если мы повторно запустим тесты:

mix test
Войти в полноэкранный режим Выйти из полноэкранного режима

Тест с реальным сценарием прошел нормально. И теперь у нас есть только один тест с неудачей.

Compiling 1 file (.ex)


  1) test Game.play/2 when second player wins when second player chooses stone and first player chooses scissors (GameTest)
     test/game_test.exs:85
     ** (CondClauseError) no cond clause evaluated to a truthy value
     code: assert {:ok, match} = Game.play(first_player_choice, second_player_choise)
     stacktrace:
       (rock_paper_scissor_elixir 0.1.0) lib/game.ex:30: Game.result/2
       test/game_test.exs:89: (test)

........

Finished in 0.04 seconds (0.00s async, 0.04s sync)
9 tests, 1 failure

Randomized with seed 980583
Вход в полноэкранный режим Выход из полноэкранного режима

Когда первый игрок выбирает ножницы, а второй игрок выбирает камень

  • Добавим условие, когда первый игрок выбирает ножницы, а второй — камень:
# lib/game.ex

defmodule Game do
  @moduledoc """
  Documentation for `Game`.
  """

  def play(first_player_choice, second_player_choice) do
    result(first_player_choice, second_player_choice)
  end

  defp result(first_player_choice, second_player_choice) do
    cond do
      # ...

      first_player_choice == @paper && second_player_choice == @scissor ->
        {:ok, "Second player win!!!"}

      first_player_choice == @stone && second_player_choice == @paper ->
        {:ok, "Second player win!!!"}

      first_player_choice == @scissor && second_player_choice == @stone ->
        {:ok, "Second player win!!!"}
    end
  end
end
Войти в полноэкранный режим Выход из полноэкранного режима

А теперь, если мы повторно запустим тесты:

mix test
Войти в полноэкранный режим Выйти из полноэкранного режима

Все тесты пройдут успешно.

Compiling 1 file (.ex)
......

Finished in 0.03 seconds (0.00s async, 0.03s sync)
6 tests, 0 failures

Randomized with seed 795123
Вход в полноэкранный режим Выход из полноэкранного режима

В следующем посте (скоро) мы рефакторим и улучшим наш модуль Game.

Контакты

Email: contato@diegonovais.com.br
Linkedin: https://www.linkedin.com/in/diegonovais/
Twitter: https://twitter.com/diegonovaistech

Оцените статью
devanswers.ru
Добавить комментарий