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