Skip to content

Instantly share code, notes, and snippets.

@neenjaw
Last active December 8, 2019 08:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save neenjaw/2f917a802edb98da450e0638fc9da98d to your computer and use it in GitHub Desktop.
Save neenjaw/2f917a802edb98da450e0638fc9da98d to your computer and use it in GitHub Desktop.
Rescuing the bowling example
defmodule Bowling do
# ...
def test_all_last() do
ll = [
{:invalid, [10, 10, 10, 1]},
{:valid, [10, 10, 10]},
{:invalid, [10, 10, 5, 5, 1]},
{:invalid, [10, 10, 5, 1, 1]},
{:invalid, [10, 10, 5, 1]},
{:invalid, [10, 5, 5, 1, 1]},
{:invalid, [10, 5, 5, 1]},
{:valid, [10, 5, 1]},
{:invalid, [5, 5, 10, 1]},
{:valid, [5, 5, 10]},
{:invalid, [5, 5, 5, 5, 1]},
{:invalid, [5, 5, 5, 1, 1]},
{:invalid, [5, 5, 5, 1]},
{:valid, [5, 5, 5]},
{:valid, [5, 5, 1]},
{:invalid, [1, 1, 1]},
{:valid, [1, 1]},
]
ll
|> Enum.map(fn {s, l} ->
result =
try do
test_last(l)
rescue
ArgumentError -> {:error, :arg_error}
end
{s, l, result}
end)
|> Enum.map(fn
{:invalid, l, {:error, _} = e} -> {:works, :invalid, l, e}
{:invalid, l, g} -> {:broke, :invalid, l, g}
{:valid, l, {:error, _} = e} -> {:broke, :valid, l, e}
{:valid, l, g} -> {:works, :valid, l, g}
end)
end
def test_last(l) do
g = start()
Enum.reduce([1, 0, 2, 0, 3, 0, 4, 0, 1, 0, 2, 0, 3, 0, 4, 0, 4, 4] ++ l, g, fn r, g -> Bowling.roll(g, r) end)
end
end
[
{:works, :invalid, [10, 10, 10, 1],
{:error, "Cannot roll after game is over"}},
{:works, :valid, '\n\n\n',
%BowlingGame{
current_frame: 13,
roll_in_frame: 1,
scores: [
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[4, 4],
[10, 0],
[10, 0],
[10, 0]
]
}},
{:works, :invalid, [10, 10, 5, 5, 1], {:error, :arg_error}},
{:works, :invalid, [10, 10, 5, 1, 1], {:error, :arg_error}},
{:works, :invalid, [10, 10, 5, 1], {:error, "Cannot roll after game is over"}},
{:works, :invalid, [10, 5, 5, 1, 1], {:error, :arg_error}},
{:works, :invalid, [10, 5, 5, 1], {:error, "Cannot roll after game is over"}},
{:works, :valid, [10, 5, 1],
%BowlingGame{
current_frame: 12,
roll_in_frame: 1,
scores: [
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[4, 4],
[10, 0],
[5, 1],
[0, 0]
]
}},
{:works, :invalid, [5, 5, 10, 1], {:error, "Cannot roll after game is over"}},
{:works, :valid, [5, 5, 10],
%BowlingGame{
current_frame: 12,
roll_in_frame: 1,
scores: [
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[4, 4],
[5, 5],
[10, 0],
[0, 0]
]
}},
{:works, :invalid, [5, 5, 5, 5, 1], {:error, :arg_error}},
{:works, :invalid, [5, 5, 5, 1, 1], {:error, :arg_error}},
{:works, :invalid, [5, 5, 5, 1], {:error, "Cannot roll after game is over"}},
{:works, :valid, [5, 5, 5],
%BowlingGame{
current_frame: 11,
roll_in_frame: 2,
scores: [
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[4, 4],
[5, 5],
[5, 0],
[0, 0]
]
}},
{:works, :valid, [5, 5, 1],
%BowlingGame{
current_frame: 11,
roll_in_frame: 2,
scores: [
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[4, 4],
[5, 5],
[1, 0],
[0, 0]
]
}},
{:works, :invalid, [1, 1, 1], {:error, "Cannot roll after game is over"}},
{:works, :valid, [1, 1],
%BowlingGame{
current_frame: 11,
roll_in_frame: 1,
scores: [
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[1, 0],
[2, 0],
[3, 0],
[4, 0],
[4, 4],
[1, 1],
[0, 0],
[0, 0]
]
}}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment