From 66759eeef96418acbe16cc498785b34852660f70 Mon Sep 17 00:00:00 2001 From: Chew Choon Keat Date: Tue, 23 Apr 2019 12:59:50 +0800 Subject: [PATCH] Added starter solution for Elm 0.19 --- elm/Makefile | 13 ++++ elm/elm.json | 28 +++++++++ elm/src/GildedRose.elm | 66 ++++++++++++++++++++ elm/tests/GildedRoseTest.elm | 118 +++++++++++++++++++++++++++++++++++ 4 files changed, 225 insertions(+) create mode 100644 elm/Makefile create mode 100644 elm/elm.json create mode 100644 elm/src/GildedRose.elm create mode 100644 elm/tests/GildedRoseTest.elm diff --git a/elm/Makefile b/elm/Makefile new file mode 100644 index 00000000..eb967cbe --- /dev/null +++ b/elm/Makefile @@ -0,0 +1,13 @@ +test: elm.json package.json elm-test + elm-test --watch + +elm-test: + which elm-test || npm install elm-test --save-dev + grep elm-explorations/test elm.json || elm-test init + +package.json: + echo '{}' > package.json + +elm.json: + which elm || (echo "First, install elm https://guide.elm-lang.org/install.html"; exit 1) + elm init diff --git a/elm/elm.json b/elm/elm.json new file mode 100644 index 00000000..5ed958a6 --- /dev/null +++ b/elm/elm.json @@ -0,0 +1,28 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.0", + "dependencies": { + "direct": { + "elm/browser": "1.0.1", + "elm/core": "1.0.2", + "elm/html": "1.0.0" + }, + "indirect": { + "elm/json": "1.1.3", + "elm/time": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.2" + } + }, + "test-dependencies": { + "direct": { + "elm-explorations/test": "1.2.1" + }, + "indirect": { + "elm/random": "1.0.0" + } + } +} diff --git a/elm/src/GildedRose.elm b/elm/src/GildedRose.elm new file mode 100644 index 00000000..00055658 --- /dev/null +++ b/elm/src/GildedRose.elm @@ -0,0 +1,66 @@ +module GildedRose exposing (Days(..), Item(..), Quality(..), endOfDay, newItem) + + +type Quality + = Quality Int + + +type Days + = Days Int + + +type Item + = RegularItem Days Quality String + | BackstagePasses Days Quality + | AgedBrie Days Quality + | Sulfuras + + +newItem : Days -> Quality -> String -> Item +newItem (Days days) (Quality quality) name = + if name == "Sulfuras" then + Sulfuras + + else if name == "Backstage passes" then + BackstagePasses (Days days) (Quality quality) + + else if name == "Aged Brie" then + AgedBrie (Days days) (Quality quality) + + else + RegularItem (Days days) (Quality quality) name + + +updateItem : Item -> Item +updateItem item = + case item of + RegularItem (Days days) (Quality quality) name -> + if days <= 0 then + RegularItem (Days (days - 1)) (Quality (min 50 (max 0 (quality - 2)))) name + + else + RegularItem (Days (days - 1)) (Quality (min 50 (max 0 (quality - 1)))) name + + BackstagePasses (Days days) (Quality quality) -> + if days <= 0 then + BackstagePasses (Days (days - 1)) (Quality 0) + + else if days <= 5 then + BackstagePasses (Days (days - 1)) (Quality (min 50 (quality + 3))) + + else if days <= 10 then + BackstagePasses (Days (days - 1)) (Quality (min 50 (quality + 2))) + + else + BackstagePasses (Days (days - 1)) (Quality (min 50 (quality + 1))) + + AgedBrie (Days days) (Quality quality) -> + AgedBrie (Days (days - 1)) (Quality (min 50 (quality + 1))) + + Sulfuras -> + item + + +endOfDay : List Item -> List Item +endOfDay itemList = + List.map updateItem itemList diff --git a/elm/tests/GildedRoseTest.elm b/elm/tests/GildedRoseTest.elm new file mode 100644 index 00000000..b7ae3624 --- /dev/null +++ b/elm/tests/GildedRoseTest.elm @@ -0,0 +1,118 @@ +module GildedRoseTest exposing (suite) + +import Expect exposing (Expectation) +import Fuzz exposing (Fuzzer, int, list, string) +import GildedRose exposing (Days(..), Quality(..), endOfDay, newItem) +import Test exposing (..) + + +suite : Test +suite = + describe "GildedRose" + [ describe "At the end of each day" + [ test "our system lowers both values for every item" <| + \_ -> + let + givenItems = + [ newItem (Days 10) (Quality 10) "Thing" ] + + expectedItems = + [ newItem (Days 9) (Quality 9) "Thing" ] + in + Expect.equal expectedItems (endOfDay givenItems) + , test "Once the sell by date has passed, Quality degrades twice as fast" <| + \_ -> + let + givenItems = + [ newItem (Days 0) (Quality 10) "Thing" ] + + expectedItems = + [ newItem (Days -1) (Quality 8) "Thing" ] + in + Expect.equal expectedItems (endOfDay givenItems) + , test "The Quality of an item is never negative" <| + \_ -> + let + givenItems = + [ newItem (Days 10) (Quality 0) "Thing" ] + + expectedItems = + [ newItem (Days 9) (Quality 0) "Thing" ] + in + Expect.equal expectedItems (endOfDay givenItems) + , test "'Aged Brie' actually increases in Quality the older it gets" <| + \_ -> + let + givenItems = + [ newItem (Days 10) (Quality 0) "Aged Brie" ] + + expectedItems = + [ newItem (Days 9) (Quality 1) "Aged Brie" ] + in + Expect.equal expectedItems (endOfDay givenItems) + , test "The Quality of an item is never more than 50" <| + \_ -> + let + givenItems = + [ newItem (Days 10) (Quality 50) "Aged Brie" + , newItem (Days 10) (Quality 100) "Thing" + ] + + expectedItems = + [ newItem (Days 9) (Quality 50) "Aged Brie" + , newItem (Days 9) (Quality 50) "Thing" + ] + in + Expect.equal expectedItems (endOfDay givenItems) + , test "\"Sulfuras\", being a legendary item, never has to be sold or decreases in Quality" <| + \_ -> + let + givenItems = + [ newItem (Days 10) (Quality 80) "Sulfuras" ] + + expectedItems = + [ newItem (Days 10) (Quality 80) "Sulfuras" ] + in + Expect.equal expectedItems (endOfDay givenItems) + , describe "Backstage passes" + [ test "like aged brie, increases in Quality as its SellIn value approaches" <| + \_ -> + let + givenItems = + [ newItem (Days 20) (Quality 0) "Backstage passes" ] + + expectedItems = + [ newItem (Days 19) (Quality 1) "Backstage passes" ] + in + Expect.equal expectedItems (endOfDay givenItems) + , test "Quality increases by 2 when there are 10 days or less; by 3 when there are 5 days or less; drops to 0 after the concert" <| + \_ -> + let + givenItems = + [ newItem (Days 11) (Quality 0) "Backstage passes" + , newItem (Days 10) (Quality 0) "Backstage passes" + , newItem (Days 9) (Quality 0) "Backstage passes" + , newItem (Days 6) (Quality 0) "Backstage passes" + , newItem (Days 5) (Quality 0) "Backstage passes" + , newItem (Days 4) (Quality 0) "Backstage passes" + , newItem (Days 1) (Quality 10) "Backstage passes" + , newItem (Days 0) (Quality 10) "Backstage passes" + , newItem (Days -1) (Quality 10) "Backstage passes" + ] + + expectedItems = + [ newItem (Days 10) (Quality 1) "Backstage passes" + , newItem (Days 9) (Quality 2) "Backstage passes" + , newItem (Days 8) (Quality 2) "Backstage passes" + , newItem (Days 5) (Quality 2) "Backstage passes" + , newItem (Days 4) (Quality 3) "Backstage passes" + , newItem (Days 3) (Quality 3) "Backstage passes" + , newItem (Days 0) (Quality 13) "Backstage passes" + , newItem (Days -1) (Quality 0) "Backstage passes" + , newItem (Days -2) (Quality 0) "Backstage passes" + ] + in + Expect.equal expectedItems (endOfDay givenItems) + ] + ] + ]