mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-16 06:51:27 +00:00
added normal items
This commit is contained in:
parent
7d60aeae25
commit
dbc6d77ad8
@ -21,8 +21,7 @@ Pretty simple, right? Well this is where it gets interesting:
|
|||||||
- The Quality of an item is never more than 50
|
- The Quality of an item is never more than 50
|
||||||
- "Sulfuras", being a legendary item, never has to be sold or decreases in Quality
|
- "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;
|
- "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
|
Quality drops to 0 after the concert
|
||||||
|
|
||||||
We have recently signed a supplier of conjured items. This requires an update to our system:
|
We have recently signed a supplier of conjured items. This requires an update to our system:
|
||||||
|
|||||||
@ -1,53 +1,61 @@
|
|||||||
defmodule GildedRose do
|
defmodule GildedRose do
|
||||||
|
|
||||||
|
@max_quality 50
|
||||||
|
|
||||||
def update_quality(items) do
|
def update_quality(items) do
|
||||||
Enum.map(items, &update_item_new/1)
|
Enum.map(items, &update_item_new/1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Passes
|
||||||
|
|
||||||
@ticket "Backstage passes to a TAFKAL80ETC concert"
|
@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 }
|
%{item | sell_in: days - 1, quality: 0 }
|
||||||
|
|
||||||
def update_item_new(item = %{ name: @ticket , sell_in: days, quality: quality }) when days - 1 <= 5, do:
|
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) }
|
%{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:
|
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) }
|
%{item | sell_in: days - 1, quality: updated_quality(quality + 2) }
|
||||||
|
|
||||||
def update_item_new(item = %{ name: @ticket , sell_in: days, quality: quality }), do:
|
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
|
# Brie
|
||||||
# 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"
|
@brie "Aged Brie"
|
||||||
def update_item_new(item = %{ name: @brie, sell_in: days, quality: quality }) when days - 1 < 0, do:
|
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:
|
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"
|
@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:
|
||||||
def update_item_new(item = %{ name: @sulfuras }), do: item
|
%{item | quality: 80 }
|
||||||
|
|
||||||
|
|
||||||
defp updated_quality(max, new_amount) when new_amount > max, do: max
|
# Conjured
|
||||||
defp updated_quality(_, new_amount), do: new_amount
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 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
|
def update_item(item) do
|
||||||
|
|||||||
@ -3,15 +3,18 @@ defmodule GildedRoseTest do
|
|||||||
|
|
||||||
import GildedRose
|
import GildedRose
|
||||||
|
|
||||||
@brie "Aged Brie"
|
@brie "Aged Brie"
|
||||||
|
@conjured "Conjured"
|
||||||
|
@normal "Normal Item"
|
||||||
@sulfuras "Sulfuras, Hand of Ragnaros"
|
@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
|
def create_items(sell_in, quality) do
|
||||||
[
|
[
|
||||||
%Item{name: @sulfuras, sell_in: sell_in, quality: quality},
|
%Item{name: @sulfuras, sell_in: sell_in, quality: 80},
|
||||||
%Item{name: @concert_ticket, sell_in: sell_in, quality: quality},
|
%Item{name: @passes, sell_in: sell_in, quality: quality},
|
||||||
%Item{name: @brie, 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
|
end
|
||||||
|
|
||||||
@ -23,44 +26,78 @@ defmodule GildedRoseTest do
|
|||||||
|
|
||||||
test "all items quality _ 11 days or more left" do
|
test "all items quality _ 11 days or more left" do
|
||||||
days_left = 12
|
days_left = 12
|
||||||
initial_quality = 0
|
initial_quality = 1
|
||||||
result = create_items(days_left, initial_quality) |> elapse_days(1)
|
result = create_items(days_left, initial_quality) |> elapse_days(1)
|
||||||
|
|
||||||
assert result === [
|
assert result === [
|
||||||
%Item{name: @sulfuras, sell_in: 12, quality: 0},
|
%Item{name: @sulfuras, sell_in: 12, quality: 80},
|
||||||
%Item{name: @concert_ticket, sell_in: 11, quality: 1},
|
%Item{name: @passes, sell_in: 11, quality: 2},
|
||||||
%Item{name: @brie, sell_in: 11, quality: 1}
|
%Item{name: @brie, sell_in: 11, quality: 2},
|
||||||
|
%Item{name: @normal, sell_in: 11, quality: 0},
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
test "ticket quality _ 10 days or less" do
|
test "normal item quality _ any day greater than 0" do
|
||||||
days_left = 11
|
days_left = 10
|
||||||
initial_quality = 0
|
initial_quality = 10
|
||||||
[_, ticket, _] = create_items(days_left, initial_quality) |> elapse_days(1)
|
[_, _, _, 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
|
end
|
||||||
|
|
||||||
test "ticket quality _ 5 days or less" do
|
test "ticket quality _ 5 days or less" do
|
||||||
days_left = 6
|
days_left = 5
|
||||||
initial_quality = 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: 5, quality: 3}
|
assert ticket === %Item{name: @passes, sell_in: 4, quality: 3}
|
||||||
end
|
end
|
||||||
|
|
||||||
test "ticket quality _ after concert" do
|
test "ticket quality _ after concert" do
|
||||||
days_left = 0
|
days_left = 0
|
||||||
initial_quality = 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
|
end
|
||||||
|
|
||||||
test "brie quality _ greater than 0 days left " do
|
test "brie quality _ greater than 0 days left " do
|
||||||
days_left = 1
|
days_left = 1
|
||||||
initial_quality = 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: 0, quality: 1}
|
assert brie === %Item{name: @brie, sell_in: 0, quality: 1}
|
||||||
end
|
end
|
||||||
@ -69,7 +106,7 @@ defmodule GildedRoseTest do
|
|||||||
test "brie quality _ past sell in day" do
|
test "brie quality _ past sell in day" do
|
||||||
days_left = 0
|
days_left = 0
|
||||||
initial_quality = 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}
|
assert brie === %Item{name: @brie, sell_in: -1, quality: 2}
|
||||||
end
|
end
|
||||||
@ -77,29 +114,17 @@ defmodule GildedRoseTest do
|
|||||||
test "sulfuras quality _ any days left" do
|
test "sulfuras quality _ any days left" do
|
||||||
days_left = 20
|
days_left = 20
|
||||||
initial_quality = 40
|
initial_quality = 40
|
||||||
[sulfuras, _, _] = create_items(days_left, initial_quality) |> elapse_days(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)
|
|
||||||
|
|
||||||
assert sulfuras === %Item{name: @sulfuras, sell_in: 20, quality: 80}
|
assert sulfuras === %Item{name: @sulfuras, sell_in: 20, quality: 80}
|
||||||
end
|
end
|
||||||
|
|
||||||
test "all items quality _ max quality exeeded (exclude sulfuras)" do
|
test "sulfuras quality _ lengendary quality" do
|
||||||
days_left = 11
|
days_left = 20
|
||||||
initial_quality = 60
|
initial_quality = 100
|
||||||
result = create_items(days_left, initial_quality) |> elapse_days(1)
|
[sulfuras, _, _, _] = create_items(days_left, initial_quality) |> elapse_days(1)
|
||||||
|
|
||||||
assert result === [
|
assert sulfuras === %Item{name: @sulfuras, sell_in: 20, quality: 80}
|
||||||
%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
|
end
|
||||||
|
|
||||||
test "all items quality _ reaching max quality" do
|
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)
|
result = create_items(days_left, initial_quality) |> elapse_days(5)
|
||||||
|
|
||||||
assert result === [
|
assert result === [
|
||||||
%Item{name: @sulfuras, sell_in: 5, quality: 49},
|
%Item{name: @sulfuras, sell_in: 5, quality: 80},
|
||||||
%Item{name: @concert_ticket, sell_in: 0, quality: 50},
|
%Item{name: @passes, sell_in: 0, quality: 50},
|
||||||
%Item{name: @brie, sell_in: 0, quality: 50}
|
%Item{name: @brie, sell_in: 0, quality: 50},
|
||||||
|
%Item{name: @normal, sell_in: 0, quality: 44}
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user