mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2025-12-12 20:32:15 +00:00
new version of erlang
This commit is contained in:
parent
045597940b
commit
3db5265f46
23
erlang/.gitignore
vendored
23
erlang/.gitignore
vendored
@ -1,2 +1,21 @@
|
|||||||
/_build
|
.rebar3
|
||||||
/*.txt
|
_*
|
||||||
|
.eunit
|
||||||
|
*.o
|
||||||
|
*.beam
|
||||||
|
*.plt
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
|
.erlang.cookie
|
||||||
|
ebin
|
||||||
|
log
|
||||||
|
erl_crash.dump
|
||||||
|
.rebar
|
||||||
|
logs
|
||||||
|
_build
|
||||||
|
*.iml
|
||||||
|
rebar3.crashdump
|
||||||
|
*~
|
||||||
|
*.iml
|
||||||
|
.idea
|
||||||
|
|
||||||
|
|||||||
@ -1,11 +1,26 @@
|
|||||||
# Erlang
|
GildedRose
|
||||||
|
=====
|
||||||
|
|
||||||
## Prerequisites
|
You will need to install [erlang](https://www.erlang.org/), and [rebar3](https://github.com/erlang/rebar3). I recommend following the instructions from JetBrains: [Getting Started with Erlang](https://www.jetbrains.com/help/idea/getting-started-with-erlang.html).
|
||||||
|
|
||||||
- Erlang/OTP 20 or later
|
When you open this project with IntelliJ I recommend that you do
|
||||||
|
|
||||||
## Running Tests
|
File | New | Project from existing sources
|
||||||
|
|
||||||
```
|
Then be sure to select "Erlang" as the project type, and configure the rebar3 location correctly.
|
||||||
./rebar3 eunit
|
|
||||||
```
|
Build
|
||||||
|
-----
|
||||||
|
|
||||||
|
$ rebar3 compile
|
||||||
|
|
||||||
|
Run Tests
|
||||||
|
---------
|
||||||
|
|
||||||
|
$ rebar3 eunit
|
||||||
|
|
||||||
|
TextTest Fixture
|
||||||
|
----------------
|
||||||
|
To run for 30 days:
|
||||||
|
|
||||||
|
$ update_quality_main.escript 30
|
||||||
1
erlang/include/TextTestFixture.hrl
Normal file
1
erlang/include/TextTestFixture.hrl
Normal file
@ -0,0 +1 @@
|
|||||||
|
-include("GildedRose.hrl").
|
||||||
@ -1,2 +1,2 @@
|
|||||||
{erl_opts, [warnings_as_errors]}.
|
{erl_opts, [debug_info]}.
|
||||||
{eunit_opts, [verbose]}.
|
{deps, []}.
|
||||||
1
erlang/rebar.lock
Normal file
1
erlang/rebar.lock
Normal file
@ -0,0 +1 @@
|
|||||||
|
[].
|
||||||
BIN
erlang/rebar3
BIN
erlang/rebar3
Binary file not shown.
14
erlang/src/GildedRose.app.src
Normal file
14
erlang/src/GildedRose.app.src
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{application, 'GildedRose',
|
||||||
|
[{description, "An OTP library"},
|
||||||
|
{vsn, "0.1.0"},
|
||||||
|
{registered, []},
|
||||||
|
{applications,
|
||||||
|
[kernel,
|
||||||
|
stdlib
|
||||||
|
]},
|
||||||
|
{env,[]},
|
||||||
|
{modules, []},
|
||||||
|
|
||||||
|
{licenses, ["Apache 2.0"]},
|
||||||
|
{links, []}
|
||||||
|
]}.
|
||||||
87
erlang/src/GildedRose.erl
Normal file
87
erlang/src/GildedRose.erl
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
-module('GildedRose').
|
||||||
|
|
||||||
|
-include("GildedRose.hrl").
|
||||||
|
|
||||||
|
-export([
|
||||||
|
update_quality/1
|
||||||
|
]).
|
||||||
|
|
||||||
|
-spec update_quality([#item{}]) -> [#item{}].
|
||||||
|
update_quality(Items) ->
|
||||||
|
lists:map(fun update_item/1, Items).
|
||||||
|
|
||||||
|
-spec update_item(#item{}) -> #item{}.
|
||||||
|
update_item(Item = #item{name = Name}) ->
|
||||||
|
Item1 = if
|
||||||
|
Name /= "Aged Brie" andalso Name /= "Backstage passes to a TAFKAL80ETC concert" ->
|
||||||
|
if
|
||||||
|
Item#item.quality > 0 ->
|
||||||
|
if
|
||||||
|
Name /= "Sulfuras, Hand of Ragnaros" ->
|
||||||
|
Item#item{quality = Item#item.quality - 1};
|
||||||
|
true ->
|
||||||
|
Item
|
||||||
|
end;
|
||||||
|
true ->
|
||||||
|
Item
|
||||||
|
end;
|
||||||
|
true ->
|
||||||
|
if
|
||||||
|
Item#item.quality < 50 ->
|
||||||
|
Item2 = Item#item{quality = Item#item.quality + 1},
|
||||||
|
if
|
||||||
|
Name == "Backstage passes to a TAFKAL80ETC concert" ->
|
||||||
|
Item3 = if
|
||||||
|
Item2#item.sell_in < 11 ->
|
||||||
|
if
|
||||||
|
Item2#item.quality < 50 ->
|
||||||
|
Item2#item{quality = Item2#item.quality + 1};
|
||||||
|
true -> Item2
|
||||||
|
end;
|
||||||
|
true -> Item2
|
||||||
|
end,
|
||||||
|
if
|
||||||
|
Item3#item.sell_in < 6 ->
|
||||||
|
if
|
||||||
|
Item3#item.quality < 50 ->
|
||||||
|
Item3#item{quality = Item3#item.quality + 1};
|
||||||
|
true -> Item3
|
||||||
|
end;
|
||||||
|
true -> Item3
|
||||||
|
end;
|
||||||
|
true -> Item2
|
||||||
|
end;
|
||||||
|
true -> Item
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
Item4 = if
|
||||||
|
Name /= "Sulfuras, Hand of Ragnaros" ->
|
||||||
|
Item1#item{sell_in = Item1#item.sell_in - 1};
|
||||||
|
true -> Item1
|
||||||
|
end,
|
||||||
|
if
|
||||||
|
Item4#item.sell_in < 0 ->
|
||||||
|
if
|
||||||
|
Name /= "Aged Brie" ->
|
||||||
|
if
|
||||||
|
Name /= "Backstage passes to a TAFKAL80ETC concert" ->
|
||||||
|
if
|
||||||
|
Item4#item.quality > 0 ->
|
||||||
|
if
|
||||||
|
Name /= "Sulfuras, Hand of Ragnaros" ->
|
||||||
|
Item4#item{quality = Item4#item.quality - 1};
|
||||||
|
true -> Item4
|
||||||
|
end;
|
||||||
|
true -> Item4
|
||||||
|
end;
|
||||||
|
true -> Item4#item{quality = Item4#item.quality - Item4#item.quality}
|
||||||
|
end;
|
||||||
|
true ->
|
||||||
|
if
|
||||||
|
Item4#item.quality < 50 ->
|
||||||
|
Item4#item{quality = Item4#item.quality + 1};
|
||||||
|
true -> Item4
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
true -> Item4
|
||||||
|
end.
|
||||||
20
erlang/src/TextTestFixture.erl
Normal file
20
erlang/src/TextTestFixture.erl
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
-module('TextTestFixture').
|
||||||
|
|
||||||
|
-include("GildedRose.hrl").
|
||||||
|
|
||||||
|
-export([print_update_quality/2]).
|
||||||
|
|
||||||
|
print_one_day(Day, Items) ->
|
||||||
|
io:format("~n-------- day ~p --------~n", [Day]),
|
||||||
|
io:format("name, sellIn, quality~n", []),
|
||||||
|
lists:foreach(fun(#item{name = Name, sell_in = SellIn, quality = Quality}) ->
|
||||||
|
io:format("~s, ~p, ~p~n", [Name, SellIn, Quality])
|
||||||
|
end, Items).
|
||||||
|
|
||||||
|
print_update_quality(Days, Items) ->
|
||||||
|
io:format("OMGHAI!"),
|
||||||
|
lists:foreach(
|
||||||
|
fun(Day) -> print_one_day(Day, Items),
|
||||||
|
'GildedRose':update_quality(Items)
|
||||||
|
end, lists:seq(0, Days - 1)).
|
||||||
|
|
||||||
@ -1 +0,0 @@
|
|||||||
{application, gilded_rose, [{vsn, "0.1"}]}.
|
|
||||||
@ -1,87 +0,0 @@
|
|||||||
-module(gilded_rose).
|
|
||||||
|
|
||||||
-include("gilded_rose.hrl").
|
|
||||||
|
|
||||||
-export([
|
|
||||||
update_quality/1
|
|
||||||
]).
|
|
||||||
|
|
||||||
-spec update_quality([#item{}]) -> [#item{}].
|
|
||||||
update_quality(Items) ->
|
|
||||||
lists:map(fun update_item/1, Items).
|
|
||||||
|
|
||||||
-spec update_item(#item{}) -> #item{}.
|
|
||||||
update_item(Item = #item{name = Name}) ->
|
|
||||||
Item1 = if
|
|
||||||
Name /= "Aged Brie" andalso Name /= "Backstage passes to a TAFKAL80ETC concert" ->
|
|
||||||
if
|
|
||||||
Item#item.quality > 0 ->
|
|
||||||
if
|
|
||||||
Name /= "Sulfuras, Hand of Ragnaros" ->
|
|
||||||
Item#item{quality = Item#item.quality - 1};
|
|
||||||
true ->
|
|
||||||
Item
|
|
||||||
end;
|
|
||||||
true ->
|
|
||||||
Item
|
|
||||||
end;
|
|
||||||
true ->
|
|
||||||
if
|
|
||||||
Item#item.quality < 50 ->
|
|
||||||
Item2 = Item#item{quality = Item#item.quality + 1},
|
|
||||||
if
|
|
||||||
Name == "Backstage passes to a TAFKAL80ETC concert" ->
|
|
||||||
Item3 = if
|
|
||||||
Item2#item.sell_in < 11 ->
|
|
||||||
if
|
|
||||||
Item2#item.quality < 50 ->
|
|
||||||
Item2#item{quality = Item2#item.quality + 1};
|
|
||||||
true -> Item2
|
|
||||||
end;
|
|
||||||
true -> Item2
|
|
||||||
end,
|
|
||||||
if
|
|
||||||
Item3#item.sell_in < 6 ->
|
|
||||||
if
|
|
||||||
Item3#item.quality < 50 ->
|
|
||||||
Item3#item{quality = Item3#item.quality + 1};
|
|
||||||
true -> Item3
|
|
||||||
end;
|
|
||||||
true -> Item3
|
|
||||||
end;
|
|
||||||
true -> Item2
|
|
||||||
end;
|
|
||||||
true -> Item
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
Item4 = if
|
|
||||||
Name /= "Sulfuras, Hand of Ragnaros" ->
|
|
||||||
Item1#item{sell_in = Item1#item.sell_in - 1};
|
|
||||||
true -> Item1
|
|
||||||
end,
|
|
||||||
if
|
|
||||||
Item4#item.sell_in < 0 ->
|
|
||||||
if
|
|
||||||
Name /= "Aged Brie" ->
|
|
||||||
if
|
|
||||||
Name /= "Backstage passes to a TAFKAL80ETC concert" ->
|
|
||||||
if
|
|
||||||
Item4#item.quality > 0 ->
|
|
||||||
if
|
|
||||||
Name /= "Sulfuras, Hand of Ragnaros" ->
|
|
||||||
Item4#item{quality = Item4#item.quality - 1};
|
|
||||||
true -> Item4
|
|
||||||
end;
|
|
||||||
true -> Item4
|
|
||||||
end;
|
|
||||||
true -> Item4#item{quality = Item4#item.quality - Item4#item.quality}
|
|
||||||
end;
|
|
||||||
true ->
|
|
||||||
if
|
|
||||||
Item4#item.quality < 50 ->
|
|
||||||
Item4#item{quality = Item4#item.quality + 1};
|
|
||||||
true -> Item4
|
|
||||||
end
|
|
||||||
end;
|
|
||||||
true -> Item4
|
|
||||||
end.
|
|
||||||
9
erlang/test/GildedRoseTest.erl
Normal file
9
erlang/test/GildedRoseTest.erl
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
-module('GildedRoseTest').
|
||||||
|
|
||||||
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
|
-include("GildedRose.hrl").
|
||||||
|
|
||||||
|
update_quality_test_() -> [
|
||||||
|
{"foo", ?_assertMatch([#item{name= "FixMe"}], 'GildedRose':update_quality([#item{name = "Foo", sell_in = 0, quality = 0}]))}
|
||||||
|
].
|
||||||
@ -1,44 +0,0 @@
|
|||||||
-module(gilded_rose_tests).
|
|
||||||
|
|
||||||
-include("gilded_rose.hrl").
|
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
|
||||||
|
|
||||||
-define(ITEMS, [
|
|
||||||
#item{name = "+5 Dexterity Vest", sell_in = 10, quality = 20},
|
|
||||||
#item{name = "Aged Brie", sell_in = 2, quality = 0},
|
|
||||||
#item{name = "Elixir of the Mongoose", sell_in = 5, quality = 7},
|
|
||||||
#item{name = "Sulfuras, Hand of Ragnaros", sell_in = 0, quality = 80},
|
|
||||||
#item{name = "Sulfuras, Hand of Ragnaros", sell_in = -1, quality = 80},
|
|
||||||
#item{name = "Backstage passes to a TAFKAL80ETC concert", sell_in = 15, quality = 20},
|
|
||||||
#item{name = "Backstage passes to a TAFKAL80ETC concert", sell_in = 10, quality = 49},
|
|
||||||
#item{name = "Backstage passes to a TAFKAL80ETC concert", sell_in = 5, quality = 49},
|
|
||||||
#item{name = "Conjured Mana Cake", sell_in = 3, quality = 6}
|
|
||||||
]).
|
|
||||||
|
|
||||||
golden_master_test() ->
|
|
||||||
Days = 30,
|
|
||||||
{ok, IoDevice} = file:open("actual_output.txt", [write]),
|
|
||||||
try
|
|
||||||
lists:foldl(fun(Day, Items) ->
|
|
||||||
io:format(IoDevice, "-------- day ~p --------~n", [Day]),
|
|
||||||
io:format(IoDevice, "name, sellIn, quality~n", []),
|
|
||||||
lists:foreach(fun(#item{name = Name, sell_in = SellIn, quality = Quality}) ->
|
|
||||||
io:format(IoDevice, "~s, ~p, ~p~n", [Name, SellIn, Quality])
|
|
||||||
end, Items),
|
|
||||||
io:nl(IoDevice),
|
|
||||||
gilded_rose:update_quality(Items)
|
|
||||||
end, ?ITEMS, lists:seq(0, Days - 1))
|
|
||||||
after
|
|
||||||
file:close(IoDevice)
|
|
||||||
end,
|
|
||||||
case file:read_file("expected_output.txt") of
|
|
||||||
{ok, ExpectedFile} ->
|
|
||||||
{ok, ActualFile} = file:read_file("actual_output.txt"),
|
|
||||||
?assertEqual(ExpectedFile, ActualFile);
|
|
||||||
{error, Reason} ->
|
|
||||||
?debugFmt("Could not read file 'expected_output.txt': ~p", [Reason])
|
|
||||||
end.
|
|
||||||
|
|
||||||
update_quality_test_() -> [
|
|
||||||
{"first test", ?_assertMatch([#item{}], gilded_rose:update_quality([#item{}]))}
|
|
||||||
].
|
|
||||||
Loading…
Reference in New Issue
Block a user