Added starter solution for Elm 0.19

This commit is contained in:
Chew Choon Keat 2019-04-23 12:59:50 +08:00
parent d86e26b192
commit 66759eeef9
4 changed files with 225 additions and 0 deletions

13
elm/Makefile Normal file
View 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
View 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
View 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

View 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)
]
]
]