From 9aafcea689e17056bcf350d7e86bd0edcedbb75f Mon Sep 17 00:00:00 2001 From: Nelson Date: Fri, 29 Jan 2021 15:00:03 -0700 Subject: [PATCH] tests working - ready to refactor; --- elixir/GildedRoseRequirements.txt | 38 ++++++ elixir/test/gilded_rose_test.exs | 201 +++++++++++++++++++++++++++++- 2 files changed, 238 insertions(+), 1 deletion(-) create mode 100644 elixir/GildedRoseRequirements.txt diff --git a/elixir/GildedRoseRequirements.txt b/elixir/GildedRoseRequirements.txt new file mode 100644 index 00000000..5090a67a --- /dev/null +++ b/elixir/GildedRoseRequirements.txt @@ -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. \ No newline at end of file diff --git a/elixir/test/gilded_rose_test.exs b/elixir/test/gilded_rose_test.exs index b0db3381..de522e8b 100644 --- a/elixir/test/gilded_rose_test.exs +++ b/elixir/test/gilded_rose_test.exs @@ -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