mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 22:41:30 +00:00
Added starter solution for Elm 0.19
This commit is contained in:
parent
d86e26b192
commit
66759eeef9
13
elm/Makefile
Normal file
13
elm/Makefile
Normal file
@ -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
|
||||||
28
elm/elm.json
Normal file
28
elm/elm.json
Normal file
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
66
elm/src/GildedRose.elm
Normal file
66
elm/src/GildedRose.elm
Normal file
@ -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
|
||||||
118
elm/tests/GildedRoseTest.elm
Normal file
118
elm/tests/GildedRoseTest.elm
Normal file
@ -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)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
]
|
||||||
Loading…
Reference in New Issue
Block a user