mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 14:31:28 +00:00
tests working - ready to refactor;
This commit is contained in:
parent
33373d6fd5
commit
9aafcea689
38
elixir/GildedRoseRequirements.txt
Normal file
38
elixir/GildedRoseRequirements.txt
Normal file
@ -0,0 +1,38 @@
|
||||
======================================
|
||||
Gilded Rose Requirements Specification
|
||||
======================================
|
||||
|
||||
Hi and welcome to team Gilded Rose. As you know, we are a small inn with a prime location in a
|
||||
prominent city ran by a friendly innkeeper named Allison. We also buy and sell only the finest goods.
|
||||
Unfortunately, our goods are constantly degrading in quality as they approach their sell by date. We
|
||||
have a system in place that updates our inventory for us. It was developed by a no-nonsense type named
|
||||
Leeroy, who has moved on to new adventures. Your task is to add the new feature to our system so that
|
||||
we can begin selling a new category of items. First an introduction to our system:
|
||||
|
||||
- All items have a SellIn value which denotes the number of days we have to sell the item
|
||||
- All items have a Quality value which denotes how valuable the item is
|
||||
- At the end of each day our system lowers both values for every item
|
||||
|
||||
Pretty simple, right? Well this is where it gets interesting:
|
||||
|
||||
- Once the sell by date has passed, Quality degrades twice as fast
|
||||
- The Quality of an item is never negative
|
||||
- "Aged Brie" actually increases in Quality the older it gets
|
||||
- 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 drops to 0 after the concert
|
||||
|
||||
We have recently signed a supplier of conjured items. This requires an update to our system:
|
||||
|
||||
- "Conjured" items degrade in Quality twice as fast as normal items
|
||||
|
||||
Feel free to make any changes to the UpdateQuality method and add any new code as long as everything
|
||||
still works correctly. However, do not alter the Item class or Items property as those belong to the
|
||||
goblin in the corner who will insta-rage and one-shot you as he doesn't believe in shared code
|
||||
ownership (you can make the UpdateQuality method and Items property static if you like, we'll cover
|
||||
for you).
|
||||
|
||||
Just for clarification, an item can never have its Quality increase above 50, however "Sulfuras" is a
|
||||
legendary item and as such its Quality is 80 and it never alters.
|
||||
@ -1,6 +1,205 @@
|
||||
defmodule GildedRoseTest do
|
||||
use ExUnit.Case
|
||||
|
||||
test "begin the journey of refactoring" do
|
||||
import GildedRose
|
||||
|
||||
@brie "Aged Brie"
|
||||
@sulfuras "Sulfuras, Hand of Ragnaros"
|
||||
@concert_ticket "Backstage passes to a TAFKAL80ETC concert"
|
||||
|
||||
def create_item() do
|
||||
[
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 13, quality: 1},
|
||||
%Item{name: @brie, sell_in: 13, quality: 1},
|
||||
]
|
||||
end
|
||||
|
||||
def elapse_days(items, 0), do: items
|
||||
|
||||
def elapse_days(items, days) do
|
||||
elapse_days(update_quality(items), days - 1)
|
||||
end
|
||||
|
||||
test "1 day pass" do
|
||||
result = create_item() |> elapse_days(1)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 12, quality: 2},
|
||||
%Item{name: @brie, sell_in: 12, quality: 2}
|
||||
]
|
||||
end
|
||||
|
||||
test "2 day pass" do
|
||||
result = create_item() |> elapse_days(2)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 11, quality: 3},
|
||||
%Item{name: @brie, sell_in: 11, quality: 3}
|
||||
]
|
||||
end
|
||||
|
||||
test "3 day pass" do
|
||||
result = create_item() |> elapse_days(3)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 10, quality: 4},
|
||||
%Item{name: @brie, sell_in: 10, quality: 4}
|
||||
]
|
||||
end
|
||||
|
||||
test "4 day pass" do
|
||||
result = create_item() |> elapse_days(4)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 9, quality: 6}, # Here the tickets start increasing by 2
|
||||
%Item{name: @brie, sell_in: 9, quality: 5}
|
||||
]
|
||||
end
|
||||
|
||||
test "5 day pass" do
|
||||
result = create_item() |> elapse_days(5)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 8, quality: 8},
|
||||
%Item{name: @brie, sell_in: 8, quality: 6}
|
||||
]
|
||||
end
|
||||
|
||||
|
||||
test "6 day pass" do
|
||||
result = create_item() |> elapse_days(6)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 7, quality: 10},
|
||||
%Item{name: @brie, sell_in: 7, quality: 7}
|
||||
]
|
||||
end
|
||||
|
||||
test "7 day pass" do
|
||||
result = create_item() |> elapse_days(7)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 6, quality: 12},
|
||||
%Item{name: @brie, sell_in: 6, quality: 8}
|
||||
]
|
||||
end
|
||||
|
||||
test "8 day pass" do
|
||||
result = create_item() |> elapse_days(8)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 5, quality: 14},
|
||||
%Item{name: @brie, sell_in: 5, quality: 9}
|
||||
]
|
||||
end
|
||||
|
||||
test "9 day pass" do
|
||||
result = create_item() |> elapse_days(9)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 4, quality: 17},
|
||||
%Item{name: @brie, sell_in: 4, quality: 10}
|
||||
]
|
||||
end
|
||||
|
||||
test "10 day pass" do
|
||||
result = create_item() |> elapse_days(10)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 3, quality: 20},
|
||||
%Item{name: @brie, sell_in: 3, quality: 11}
|
||||
]
|
||||
end
|
||||
|
||||
test "11 day pass" do
|
||||
result = create_item() |> elapse_days(11)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 2, quality: 23},
|
||||
%Item{name: @brie, sell_in: 2, quality: 12}
|
||||
]
|
||||
end
|
||||
|
||||
test "12 day pass" do
|
||||
result = create_item() |> elapse_days(12)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 1, quality: 26},
|
||||
%Item{name: @brie, sell_in: 1, quality: 13}
|
||||
]
|
||||
end
|
||||
|
||||
test "13 day pass" do
|
||||
result = create_item() |> elapse_days(13)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: 0, quality: 29},
|
||||
%Item{name: @brie, sell_in: 0, quality: 14}
|
||||
]
|
||||
end
|
||||
|
||||
test "14 day pass" do
|
||||
result = create_item() |> elapse_days(14)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: -1, quality: 0},
|
||||
%Item{name: @brie, sell_in: -1, quality: 16} # After days are over brie quality doubles
|
||||
]
|
||||
end
|
||||
|
||||
test "15 day pass" do
|
||||
result = create_item() |> elapse_days(15)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: -2, quality: 0},
|
||||
%Item{name: @brie, sell_in: -2, quality: 18},
|
||||
]
|
||||
end
|
||||
|
||||
test "16 day pass" do
|
||||
result = create_item() |> elapse_days(16)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: -3, quality: 0},
|
||||
%Item{name: @brie, sell_in: -3, quality: 20},
|
||||
]
|
||||
end
|
||||
|
||||
test "17 day pass" do
|
||||
result = create_item() |> elapse_days(17)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: -4, quality: 0},
|
||||
%Item{name: @brie, sell_in: -4, quality: 22},
|
||||
]
|
||||
end
|
||||
|
||||
test "18 day pass" do
|
||||
result = create_item() |> elapse_days(18)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: -5, quality: 0},
|
||||
%Item{name: @brie, sell_in: -5, quality: 24},
|
||||
]
|
||||
end
|
||||
|
||||
test "19 day pass" do
|
||||
result = create_item() |> elapse_days(19)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: -6, quality: 0},
|
||||
%Item{name: @brie, sell_in: -6, quality: 26},
|
||||
]
|
||||
end
|
||||
|
||||
test "20 day pass" do
|
||||
result = create_item() |> elapse_days(20)
|
||||
assert result === [
|
||||
%Item{name: @sulfuras, sell_in: 13, quality: 1},
|
||||
%Item{name: @concert_ticket, sell_in: -7, quality: 0},
|
||||
%Item{name: @brie, sell_in: -7, quality: 28},
|
||||
]
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
Loading…
Reference in New Issue
Block a user