diff --git a/elixir/GildedRoseRequirements.txt b/elixir/GildedRoseRequirements.txt index cd704fac..5090a67a 100644 --- a/elixir/GildedRoseRequirements.txt +++ b/elixir/GildedRoseRequirements.txt @@ -21,8 +21,7 @@ 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: diff --git a/elixir/lib/gilded_rose.ex b/elixir/lib/gilded_rose.ex index bff40513..02323f55 100644 --- a/elixir/lib/gilded_rose.ex +++ b/elixir/lib/gilded_rose.ex @@ -1,53 +1,61 @@ defmodule GildedRose do + @max_quality 50 + def update_quality(items) do Enum.map(items, &update_item_new/1) end + # Passes + @ticket "Backstage passes to a TAFKAL80ETC concert" - def update_item_new(item = %{ name: @ticket , sell_in: days, quality: quality }) when days - 1 < 0, do: + def update_item_new(item = %{ name: @ticket , sell_in: days }) 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 < 5, do: + %{item | sell_in: days - 1, quality: updated_quality(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 }) when days - 1 < 10, do: + %{item | sell_in: days - 1, quality: updated_quality(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) } + %{item | sell_in: days - 1, quality: updated_quality(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 @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) } + %{item | sell_in: days - 1, quality: updated_quality(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) } + %{item | sell_in: days - 1, quality: updated_quality(quality + 1) } + # Legendary + @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 + def update_item_new(item = %{ name: @sulfuras }), do: + %{item | quality: 80 } - defp updated_quality(max, new_amount) when new_amount > max, do: max - defp updated_quality(_, new_amount), do: new_amount + # Conjured + + # Normal + + def update_item_new(item = %{sell_in: sell_in }) when sell_in - 1 < 0, do: + %{item | sell_in: sell_in - 1, quality: updated_quality(item.quality - 2) } + def update_item_new(item), do: %{item | sell_in: item.sell_in - 1, quality: updated_quality(item.quality - 1) } + # Utils + + defp updated_quality(new_amount) + defp updated_quality(new_amount) when new_amount < 0, do: 0 + defp updated_quality(new_amount) when new_amount > @max_quality, do: @max_quality + defp updated_quality(new_amount), do: new_amount def update_item(item) do diff --git a/elixir/test/gilded_rose_test.exs b/elixir/test/gilded_rose_test.exs index f28c78f5..c73e83d0 100644 --- a/elixir/test/gilded_rose_test.exs +++ b/elixir/test/gilded_rose_test.exs @@ -3,15 +3,18 @@ defmodule GildedRoseTest do import GildedRose - @brie "Aged Brie" + @brie "Aged Brie" + @conjured "Conjured" + @normal "Normal Item" @sulfuras "Sulfuras, Hand of Ragnaros" - @concert_ticket "Backstage passes to a TAFKAL80ETC concert" + @passes "Backstage passes to a TAFKAL80ETC concert" def create_items(sell_in, quality) do [ - %Item{name: @sulfuras, sell_in: sell_in, quality: quality}, - %Item{name: @concert_ticket, sell_in: sell_in, quality: quality}, + %Item{name: @sulfuras, sell_in: sell_in, quality: 80}, + %Item{name: @passes, sell_in: sell_in, quality: quality}, %Item{name: @brie, sell_in: sell_in, quality: quality}, + %Item{name: @normal, sell_in: sell_in, quality: quality} ] end @@ -23,44 +26,78 @@ defmodule GildedRoseTest do test "all items quality _ 11 days or more left" do days_left = 12 - initial_quality = 0 + initial_quality = 1 result = create_items(days_left, initial_quality) |> elapse_days(1) assert result === [ - %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} + %Item{name: @sulfuras, sell_in: 12, quality: 80}, + %Item{name: @passes, sell_in: 11, quality: 2}, + %Item{name: @brie, sell_in: 11, quality: 2}, + %Item{name: @normal, sell_in: 11, quality: 0}, ] end - test "ticket quality _ 10 days or less" do - days_left = 11 - initial_quality = 0 - [_, ticket, _] = create_items(days_left, initial_quality) |> elapse_days(1) + test "normal item quality _ any day greater than 0" do + days_left = 10 + initial_quality = 10 + [_, _, _, normal] = create_items(days_left, initial_quality) |> elapse_days(1) - assert ticket === %Item{name: @concert_ticket, sell_in: 10, quality: 2} + assert normal === %Item{name: @normal, sell_in: 9, quality: 9} + end + + test "normal item quality _ last day" do + days_left = 1 + initial_quality = 5 + [_, _, _, normal] = create_items(days_left, initial_quality) |> elapse_days(1) + + assert normal === %Item{name: @normal, sell_in: 0, quality: 4} + end + + + test "normal item quality _ no days left" do + days_left = 0 + initial_quality = 4 + [_, _, _, normal] = create_items(days_left, initial_quality) |> elapse_days(1) + + assert normal === %Item{name: @normal, sell_in: -1, quality: 2} + end + + test "normal item quality _ no days left _ no more quality" do + days_left = 0 + initial_quality = 4 + [_, _, _, normal] = create_items(days_left, initial_quality) |> elapse_days(4) + + assert normal === %Item{name: @normal, sell_in: -4, quality: 0} + end + + test "ticket quality _ 10 days or less" do + days_left = 10 + initial_quality = 0 + [_, ticket, _, _] = create_items(days_left, initial_quality) |> elapse_days(1) + + assert ticket === %Item{name: @passes, sell_in: 9, quality: 2} end test "ticket quality _ 5 days or less" do - days_left = 6 + days_left = 5 initial_quality = 0 - [_, ticket, _] = create_items(days_left, initial_quality) |> elapse_days(1) + [_, ticket, _, _] = create_items(days_left, initial_quality) |> elapse_days(1) - assert ticket === %Item{name: @concert_ticket, sell_in: 5, quality: 3} + assert ticket === %Item{name: @passes, sell_in: 4, quality: 3} end test "ticket quality _ after concert" do days_left = 0 initial_quality = 0 - [_, ticket, _] = create_items(days_left, initial_quality) |> elapse_days(1) + [_, ticket, _, _] = create_items(days_left, initial_quality) |> elapse_days(1) - assert ticket === %Item{name: @concert_ticket, sell_in: -1, quality: 0} + assert ticket === %Item{name: @passes, sell_in: -1, quality: 0} end test "brie quality _ greater than 0 days left " do days_left = 1 initial_quality = 0 - [_, _, brie] = create_items(days_left, initial_quality) |> elapse_days(1) + [_, _, brie, _] = create_items(days_left, initial_quality) |> elapse_days(1) assert brie === %Item{name: @brie, sell_in: 0, quality: 1} end @@ -69,7 +106,7 @@ defmodule GildedRoseTest 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) + [_, _, brie, _] = create_items(days_left, initial_quality) |> elapse_days(1) assert brie === %Item{name: @brie, sell_in: -1, quality: 2} end @@ -77,29 +114,17 @@ defmodule GildedRoseTest do test "sulfuras quality _ any days left" do days_left = 20 initial_quality = 40 - [sulfuras, _, _] = create_items(days_left, initial_quality) |> elapse_days(40) - - 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) + [sulfuras, _, _, _] = create_items(days_left, initial_quality) |> elapse_days(40) 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) + test "sulfuras quality _ lengendary quality" do + days_left = 20 + initial_quality = 100 + [sulfuras, _, _, _] = 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} - ] + assert sulfuras === %Item{name: @sulfuras, sell_in: 20, quality: 80} end test "all items quality _ reaching max quality" do @@ -108,9 +133,10 @@ defmodule GildedRoseTest do 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} + %Item{name: @sulfuras, sell_in: 5, quality: 80}, + %Item{name: @passes, sell_in: 0, quality: 50}, + %Item{name: @brie, sell_in: 0, quality: 50}, + %Item{name: @normal, sell_in: 0, quality: 44} ] end