all tests passing

This commit is contained in:
Nelson 2021-01-29 17:25:58 -07:00
parent 5998bc8afa
commit 7d60aeae25
3 changed files with 95 additions and 20 deletions

View File

@ -21,7 +21,8 @@ Pretty simple, right? Well this is where it gets interesting:
- The Quality of an item is never more than 50
- "Sulfuras", being a legendary item, never has to be sold or decreases in Quality
- "Backstage passes", like aged brie, increases in Quality as its SellIn value approaches;
Quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less but
Quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less but
Quality drops to 0 after the concert
We have recently signed a supplier of conjured items. This requires an update to our system:

View File

@ -1,12 +1,55 @@
defmodule GildedRose do
# Example
# update_quality([%Item{name: "Backstage passes to a TAFKAL80ETC concert", sell_in: 9, quality: 1}])
# => [%Item{name: "Backstage passes to a TAFKAL80ETC concert", sell_in: 8, quality: 3}]
def update_quality(items) do
Enum.map(items, &update_item/1)
Enum.map(items, &update_item_new/1)
end
@ticket "Backstage passes to a TAFKAL80ETC concert"
def update_item_new(item = %{ name: @ticket , sell_in: days, quality: quality }) when days - 1 < 0, do:
%{item | sell_in: days - 1, quality: 0 }
def update_item_new(item = %{ name: @ticket , sell_in: days, quality: quality }) when days - 1 <= 5, do:
%{item | sell_in: days - 1, quality: updated_quality(50, quality + 3) }
def update_item_new(item = %{ name: @ticket , sell_in: days, quality: quality }) when days - 1 <= 10, do:
%{item | sell_in: days - 1, quality: updated_quality(50, quality + 2) }
def update_item_new(item = %{ name: @ticket , sell_in: days, quality: quality }), do:
%{item | sell_in: days - 1, quality: updated_quality(50, quality + 1) }
# def update_item_new(item = %{ name: @ticket , sell_in: days, quality: quality }) do
# left = days - 1
# cond do
# left > 5 && left < 10 -> %{item | sell_in: left, quality: updated_quality(50, quality + 2) }
# left > 0 && left < 5 -> %{item | sell_in: left, quality: updated_quality(50, quality + 3) }
# left < 0 -> %{item | sell_in: left, quality: 0 }
# true -> %{item | sell_in: left, quality: updated_quality(50, quality + 1) }
# end
# end
@brie "Aged Brie"
def update_item_new(item = %{ name: @brie, sell_in: days, quality: quality }) when days - 1 < 0, do:
%{item | sell_in: days - 1, quality: updated_quality(50, quality + 2) }
def update_item_new(item = %{ name: @brie, sell_in: days, quality: quality }), do:
%{item | sell_in: days - 1, quality: updated_quality(50, quality + 1) }
@sulfuras "Sulfuras, Hand of Ragnaros"
def update_item_new(item = %{ name: @sulfuras, quality: quality }) when quality > 80, do: %{item | quality: 80 }
def update_item_new(item = %{ name: @sulfuras }), do: item
defp updated_quality(max, new_amount) when new_amount > max, do: max
defp updated_quality(_, new_amount), do: new_amount
def update_item(item) do
item = cond do
item.name != "Aged Brie" && item.name != "Backstage passes to a TAFKAL80ETC concert" ->

View File

@ -21,37 +21,35 @@ defmodule GildedRoseTest do
elapse_days(update_quality(items), days - 1)
end
# Price degradation as tests pass
test "all items quality _ 11 or more days left" do
days_left = 11
test "all items quality _ 11 days or more left" do
days_left = 12
initial_quality = 0
result = create_items(days_left, initial_quality) |> elapse_days(1)
assert result === [
%Item{name: @sulfuras, sell_in: 11, quality: 0},
%Item{name: @concert_ticket, sell_in: 10, quality: 1},
%Item{name: @brie, sell_in: 10, quality: 1}
%Item{name: @sulfuras, sell_in: 12, quality: 0},
%Item{name: @concert_ticket, sell_in: 11, quality: 1},
%Item{name: @brie, sell_in: 11, quality: 1}
]
end
test "ticket quality _ 10 days left" do
days_left = 10
test "ticket quality _ 10 days or less" do
days_left = 11
initial_quality = 0
[_, ticket, _] = create_items(days_left, initial_quality) |> elapse_days(1)
assert ticket === %Item{name: @concert_ticket, sell_in: 9, quality: 2}
assert ticket === %Item{name: @concert_ticket, sell_in: 10, quality: 2}
end
test "ticket quality _ 5 days leff" do
days_left = 5
test "ticket quality _ 5 days or less" do
days_left = 6
initial_quality = 0
[_, ticket, _] = create_items(days_left, initial_quality) |> elapse_days(1)
assert ticket === %Item{name: @concert_ticket, sell_in: 4, quality: 3}
assert ticket === %Item{name: @concert_ticket, sell_in: 5, quality: 3}
end
test "ticket quality _ 0 days left" do
test "ticket quality _ after concert" do
days_left = 0
initial_quality = 0
[_, ticket, _] = create_items(days_left, initial_quality) |> elapse_days(1)
@ -68,7 +66,7 @@ defmodule GildedRoseTest do
end
test "brie quality _ 0 days left" do
test "brie quality _ past sell in day" do
days_left = 0
initial_quality = 0
[_, _, brie] = create_items(days_left, initial_quality) |> elapse_days(1)
@ -84,4 +82,37 @@ defmodule GildedRoseTest do
assert sulfuras === %Item{name: @sulfuras, sell_in: 20, quality: 40}
end
test "sulfuras quality _ max quality exceeded" do
days_left = 20
initial_quality = 100
[sulfuras, _, _] = create_items(days_left, initial_quality) |> elapse_days(1)
assert sulfuras === %Item{name: @sulfuras, sell_in: 20, quality: 80}
end
test "all items quality _ max quality exeeded (exclude sulfuras)" do
days_left = 11
initial_quality = 60
result = create_items(days_left, initial_quality) |> elapse_days(1)
assert result === [
%Item{name: @sulfuras, sell_in: 11, quality: 60},
%Item{name: @concert_ticket, sell_in: 10, quality: 50},
%Item{name: @brie, sell_in: 10, quality: 50}
]
end
test "all items quality _ reaching max quality" do
days_left = 5
initial_quality = 49
result = create_items(days_left, initial_quality) |> elapse_days(5)
assert result === [
%Item{name: @sulfuras, sell_in: 5, quality: 49},
%Item{name: @concert_ticket, sell_in: 0, quality: 50},
%Item{name: @brie, sell_in: 0, quality: 50}
]
end
end