From 7d60aeae2597110185a04456781eea7677d7bc5c Mon Sep 17 00:00:00 2001 From: Nelson Date: Fri, 29 Jan 2021 17:25:58 -0700 Subject: [PATCH] all tests passing --- elixir/GildedRoseRequirements.txt | 3 +- elixir/lib/gilded_rose.ex | 51 ++++++++++++++++++++++++-- elixir/test/gilded_rose_test.exs | 61 +++++++++++++++++++++++-------- 3 files changed, 95 insertions(+), 20 deletions(-) diff --git a/elixir/GildedRoseRequirements.txt b/elixir/GildedRoseRequirements.txt index 5090a67a..cd704fac 100644 --- a/elixir/GildedRoseRequirements.txt +++ b/elixir/GildedRoseRequirements.txt @@ -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: diff --git a/elixir/lib/gilded_rose.ex b/elixir/lib/gilded_rose.ex index 7edd8c83..bff40513 100644 --- a/elixir/lib/gilded_rose.ex +++ b/elixir/lib/gilded_rose.ex @@ -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" -> diff --git a/elixir/test/gilded_rose_test.exs b/elixir/test/gilded_rose_test.exs index 624e6d62..f28c78f5 100644 --- a/elixir/test/gilded_rose_test.exs +++ b/elixir/test/gilded_rose_test.exs @@ -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