242 lines
6.6 KiB
Elixir
242 lines
6.6 KiB
Elixir
|
defmodule AllergiesTest do
|
||
|
use ExUnit.Case
|
||
|
|
||
|
defp assert_is_a_set_containing(list, to_contain) do
|
||
|
set = Enum.into(list, MapSet.new())
|
||
|
|
||
|
same_contents =
|
||
|
to_contain
|
||
|
|> Enum.into(MapSet.new())
|
||
|
|> MapSet.equal?(set)
|
||
|
|
||
|
assert same_contents,
|
||
|
"Expected a set with: #{inspect(to_contain)} got #{inspect(set |> MapSet.to_list())}"
|
||
|
end
|
||
|
|
||
|
describe "allergy list against expected allergens -" do
|
||
|
test "no allergies at all" do
|
||
|
Allergies.list(0) |> assert_is_a_set_containing([])
|
||
|
end
|
||
|
|
||
|
test "allergic to just eggs" do
|
||
|
Allergies.list(1) |> assert_is_a_set_containing(~w[eggs])
|
||
|
end
|
||
|
|
||
|
test "allergic to just peanuts" do
|
||
|
Allergies.list(2) |> assert_is_a_set_containing(~w[peanuts])
|
||
|
end
|
||
|
|
||
|
test "allergic to just strawberries" do
|
||
|
Allergies.list(8) |> assert_is_a_set_containing(~w[strawberries])
|
||
|
end
|
||
|
|
||
|
test "allergic to eggs and peanuts" do
|
||
|
Allergies.list(3) |> assert_is_a_set_containing(~w[eggs peanuts])
|
||
|
end
|
||
|
|
||
|
test "allergic to more than eggs but not peanuts" do
|
||
|
Allergies.list(5) |> assert_is_a_set_containing(~w[eggs shellfish])
|
||
|
end
|
||
|
|
||
|
test "allergic to lots of stuff" do
|
||
|
Allergies.list(248)
|
||
|
|> assert_is_a_set_containing(~w[strawberries tomatoes chocolate pollen cats])
|
||
|
end
|
||
|
|
||
|
test "allergic to everything" do
|
||
|
Allergies.list(255)
|
||
|
|> assert_is_a_set_containing(
|
||
|
~w[eggs peanuts shellfish strawberries tomatoes chocolate pollen cats]
|
||
|
)
|
||
|
end
|
||
|
|
||
|
test "ignore non allergen score parts" do
|
||
|
Allergies.list(509)
|
||
|
|> assert_is_a_set_containing(
|
||
|
~w[eggs shellfish strawberries tomatoes chocolate pollen cats]
|
||
|
)
|
||
|
end
|
||
|
|
||
|
test "ignore non allergen score parts without highest valid score" do
|
||
|
Allergies.list(257)
|
||
|
|> assert_is_a_set_containing(~w[eggs])
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe "score for egg allergies -" do
|
||
|
test "not allergic to eggs" do
|
||
|
refute Allergies.allergic_to?(0, "eggs")
|
||
|
end
|
||
|
|
||
|
test "is allergic to only eggs" do
|
||
|
assert Allergies.allergic_to?(1, "eggs")
|
||
|
end
|
||
|
|
||
|
test "is allergic to eggs and something else" do
|
||
|
assert Allergies.allergic_to?(3, "eggs")
|
||
|
end
|
||
|
|
||
|
test "is allergic to something, but not eggs" do
|
||
|
refute Allergies.allergic_to?(2, "eggs")
|
||
|
end
|
||
|
|
||
|
test "is allergic to everything (including eggs)" do
|
||
|
assert Allergies.allergic_to?(255, "eggs")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe "score for peanuts allergies -" do
|
||
|
test "not allergic to peanuts" do
|
||
|
refute Allergies.allergic_to?(0, "peanuts")
|
||
|
end
|
||
|
|
||
|
test "is allergic to only peanuts" do
|
||
|
assert Allergies.allergic_to?(2, "peanuts")
|
||
|
end
|
||
|
|
||
|
test "is allergic to peanuts and something else" do
|
||
|
assert Allergies.allergic_to?(7, "peanuts")
|
||
|
end
|
||
|
|
||
|
test "is allergic to something, but not peanuts" do
|
||
|
refute Allergies.allergic_to?(5, "peanuts")
|
||
|
end
|
||
|
|
||
|
test "is allergic to everything (including peanuts)" do
|
||
|
assert Allergies.allergic_to?(255, "peanuts")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe "score for shellfish allergies -" do
|
||
|
test "not allergic to shellfish" do
|
||
|
refute Allergies.allergic_to?(0, "shellfish")
|
||
|
end
|
||
|
|
||
|
test "is allergic to only shellfish" do
|
||
|
assert Allergies.allergic_to?(4, "shellfish")
|
||
|
end
|
||
|
|
||
|
test "is allergic to shellfish and something else" do
|
||
|
assert Allergies.allergic_to?(14, "shellfish")
|
||
|
end
|
||
|
|
||
|
test "is allergic to something, but not shellfish" do
|
||
|
refute Allergies.allergic_to?(10, "shellfish")
|
||
|
end
|
||
|
|
||
|
test "is allergic to everything (including shellfish)" do
|
||
|
assert Allergies.allergic_to?(255, "shellfish")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe "score for strawberries allergies -" do
|
||
|
test "not allergic to strawberries" do
|
||
|
refute Allergies.allergic_to?(0, "strawberries")
|
||
|
end
|
||
|
|
||
|
test "is allergic to only strawberries" do
|
||
|
assert Allergies.allergic_to?(8, "strawberries")
|
||
|
end
|
||
|
|
||
|
test "is allergic to strawberries and something else" do
|
||
|
assert Allergies.allergic_to?(28, "strawberries")
|
||
|
end
|
||
|
|
||
|
test "is allergic to something, but not strawberries" do
|
||
|
refute Allergies.allergic_to?(20, "strawberries")
|
||
|
end
|
||
|
|
||
|
test "is allergic to everything (including strawberries)" do
|
||
|
assert Allergies.allergic_to?(255, "strawberries")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe "score for tomatoes allergies -" do
|
||
|
test "not allergic to tomatoes" do
|
||
|
refute Allergies.allergic_to?(0, "tomatoes")
|
||
|
end
|
||
|
|
||
|
test "is allergic to only tomatoes" do
|
||
|
assert Allergies.allergic_to?(16, "tomatoes")
|
||
|
end
|
||
|
|
||
|
test "is allergic to tomatoes and something else" do
|
||
|
assert Allergies.allergic_to?(56, "tomatoes")
|
||
|
end
|
||
|
|
||
|
test "is allergic to something, but not tomatoes" do
|
||
|
refute Allergies.allergic_to?(40, "tomatoes")
|
||
|
end
|
||
|
|
||
|
test "is allergic to everything (including tomatoes)" do
|
||
|
assert Allergies.allergic_to?(255, "tomatoes")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe "score for chocolate allergies -" do
|
||
|
test "not allergic to chocolate" do
|
||
|
refute Allergies.allergic_to?(0, "chocolate")
|
||
|
end
|
||
|
|
||
|
test "is allergic to only chocolate" do
|
||
|
assert Allergies.allergic_to?(32, "chocolate")
|
||
|
end
|
||
|
|
||
|
test "is allergic to chocolate and something else" do
|
||
|
assert Allergies.allergic_to?(112, "chocolate")
|
||
|
end
|
||
|
|
||
|
test "is allergic to something, but not chocolate" do
|
||
|
refute Allergies.allergic_to?(80, "chocolate")
|
||
|
end
|
||
|
|
||
|
test "is allergic to everything (including chocolate)" do
|
||
|
assert Allergies.allergic_to?(255, "chocolate")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe "score for pollen allergies -" do
|
||
|
test "not allergic to pollen" do
|
||
|
refute Allergies.allergic_to?(0, "pollen")
|
||
|
end
|
||
|
|
||
|
test "is allergic to only pollen" do
|
||
|
assert Allergies.allergic_to?(64, "pollen")
|
||
|
end
|
||
|
|
||
|
test "is allergic to pollen and something else" do
|
||
|
assert Allergies.allergic_to?(224, "pollen")
|
||
|
end
|
||
|
|
||
|
test "is allergic to something, but not pollen" do
|
||
|
refute Allergies.allergic_to?(160, "pollen")
|
||
|
end
|
||
|
|
||
|
test "is allergic to everything (including pollen)" do
|
||
|
assert Allergies.allergic_to?(255, "pollen")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe "score for cats allergies -" do
|
||
|
test "not allergic to cats" do
|
||
|
refute Allergies.allergic_to?(0, "cats")
|
||
|
end
|
||
|
|
||
|
test "is allergic to only cats" do
|
||
|
assert Allergies.allergic_to?(128, "cats")
|
||
|
end
|
||
|
|
||
|
test "is allergic to cats and something else" do
|
||
|
assert Allergies.allergic_to?(192, "cats")
|
||
|
end
|
||
|
|
||
|
test "is allergic to something, but not cats" do
|
||
|
refute Allergies.allergic_to?(64, "cats")
|
||
|
end
|
||
|
|
||
|
test "is allergic to everything (including cats)" do
|
||
|
assert Allergies.allergic_to?(255, "cats")
|
||
|
end
|
||
|
end
|
||
|
end
|