From 908055ba3eb70c74c99c7bcb9061d7cda0e918b8 Mon Sep 17 00:00:00 2001 From: Kieran Date: Fri, 16 Oct 2020 18:59:43 +0800 Subject: [PATCH 1/4] Gilded rose in Nim - I've started with a small refactor, Command to function. This was done as the most obvious way to do it (to me) as in the original, would not compile in Nim due to violating memory lifetimes. I could have made it take a ref seq[Item], but then I would need to instatiate a ref seq and I didn't want to make a change that drastic. Also due to Nim's UFCS, the ultimate implementation would be basically the same anyway. --- nim/src/gildedrose.nim | 35 ++++++++++++ nim/src/items.nim | 12 ++++ nim/test/gilded.nim | 126 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 nim/src/gildedrose.nim create mode 100644 nim/src/items.nim create mode 100644 nim/test/gilded.nim diff --git a/nim/src/gildedrose.nim b/nim/src/gildedrose.nim new file mode 100644 index 00000000..69129341 --- /dev/null +++ b/nim/src/gildedrose.nim @@ -0,0 +1,35 @@ +import items + +proc updateQuality*(items: var seq[Item]) = + for i in 0 ..< items.len: + if items[i].name != "Aged Brie" and items[i].name != "Backstage passes to a TAFKAL80ETC concert": + if items[i].quality > 0: + if items[i].name != "Sulfuras, Hand of Ragnaros": + items[i].quality = items[i].quality - 1 + else: + if items[i].quality < 50: + items[i].quality = items[i].quality + 1 + + if items[i].name == "Backstage passes to a TAFKAL80ETC concert": + if items[i].sellIn < 11: + if items[i].quality < 50: + items[i].quality = items[i].quality + 1 + + if items[i].sellIn < 6: + if items[i].quality < 50: + items[i].quality = items[i].quality + 1 + + if items[i].name != "Sulfuras, Hand of Ragnaros": + items[i].sellIn = items[i].sellIn - 1 + + if items[i].sellIn < 0: + if items[i].name != "Aged Brie": + if items[i].name != "Backstage passes to a TAFKAL80ETC concert": + if items[i].quality > 0: + if items[i].name != "Sulfuras, Hand of Ragnaros": + items[i].quality = items[i].quality - 1 + else: + items[i].quality = items[i].quality - items[i].quality + else: + if items[i].quality < 50: + items[i].quality = items[i].quality + 1 diff --git a/nim/src/items.nim b/nim/src/items.nim new file mode 100644 index 00000000..bb9527dd --- /dev/null +++ b/nim/src/items.nim @@ -0,0 +1,12 @@ +import strformat + +type + Item* = object + name*: string + sellIn*, quality*: int + +proc initItem*(name: string, sellIn, quality: int): Item = + Item(name: name, sellIn: sellIn, quality: quality) + +proc `$`*(item: Item): string = + &"{item.name}, {item.sellIn}, {item.quality}" diff --git a/nim/test/gilded.nim b/nim/test/gilded.nim new file mode 100644 index 00000000..5def5628 --- /dev/null +++ b/nim/test/gilded.nim @@ -0,0 +1,126 @@ +import unittest +import ../src/items +import ../src/gildedrose + +let list = @[ + initItem("+5 Dexterity Vest", 10, 20), + initItem("Aged Brie", 2, 0), + # this doesn't have any special treatment, but if you want you can think of something and add a test + initItem("Elixir of the Mongoose", 5, 7), + initItem("Sulfuras, Hand of Ragnaros", 0, 80), + initItem("Sulfuras, Hand of Ragnaros", -1, 80), + initItem("Backstage passes to a TAFKAL80ETC concert", 15, 20), + initItem("Backstage passes to a TAFKAL80ETC concert", 10, 49), + initItem("Backstage passes to a TAFKAL80ETC concert", 5, 49), + # this conjured item does not work properly yet + initItem("Conjured Mana Cake", 3, 6) +] + +template checkItem(item: Item, s, q: int) = + check: + item.sellIn == s + item.quality == q + +proc days(count: int): seq[Item] = + var items = list + for _ in 1 .. count: + items.updateQuality() + items + +suite "+5 Dexterity Vest [0]": + + test "1 day": + var items = days(1) + checkItem(items[0], 9, 19) + + test "5 days, check for cumulative depeciation": + let items = days(5) + checkItem(items[0], 5, 15) + + test "10 days, expiration day": + let items = days 10 + checkItem(items[0], 0, 10) + + test "14 days, check for expired depreciation": + let items = days(14) + checkItem(items[0], -4, 2) + + test "20 days, quality should not be negative": + let items = days 20 + checkItem(items[0], -10, 0) + +suite "Aged Brie [1]": + test "1 day, brie increases value": + let items = days(1) + checkItem(items[1], 1, 1) + + test "2 days, expiration day": + let items = days(2) + checkItem(items[1], 0, 2) + + test "4 days, extra increase after expiration": + let items = days(4) + checkItem(items[1], -2, 6) + + test "30 days, should reach max quality": + let items = days 30 + checkItem items[1], -28, 50 + +suite "Sulfuras, Hand of Ragnaros [3]": + test "1 day": + let items = days(1) + checkItem(items[3], 0, 80) + + test "2 days": + let items = days(2) + checkItem(items[3], 0, 80) + +suite "Sulfuras, Hand of Ragnaros [4]": + test "1 day": + let items = days(1) + checkItem(items[4], -1, 80) + + +suite "Backstage passes to a TAFKAL80ETC concert [5]": + test "1 day": + let items= days(1) + checkItem(items[5], 14, 21) + + test "5 days": + let items = days 5 + checkItem items[5], 10, 25 + + test "7 days, increase appreciation": + let items = days 7 + checkItem items[5], 8, 29 + + test "12 days, extra increased appriciation": + let items = days 12 + checkItem items[5], 3, 41 + + test "14 days, day before concert": + let items = days 14 + checkItem items[5], 1, 47 + + test "16 days, day after concert": + let items = days 16 + checkItem items[5], -1, 0 + +suite "Backstage passes to a TAFKAL80ETC concert [6]": + test "1 day, should reach max quality even though concert is soon": + let items = days 1 + checkItem items[6], 9, 50 + + test "11 days, day after concert": + let items = days 11 + checkItem items[6], -1, 0 + +suite "Backstage passes to a TAFKAL80ETC concert [7]": + test "1 day, should reach max quality even though concert is imminent": + let items = days 1 + checkItem items[7], 4, 50 + +suite "Conjured Mana cake [8]": + test "1 day, should decrease by double": + let items = days 1 + checkItem items[8], 2, 4 From 0c61f88ffc40f8777a9dd485ba714dc3ad2e42a1 Mon Sep 17 00:00:00 2001 From: Kieran Date: Fri, 16 Oct 2020 19:12:05 +0800 Subject: [PATCH 2/4] Used consistant calling syntax in tests --- nim/test/gilded.nim | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/nim/test/gilded.nim b/nim/test/gilded.nim index 5def5628..c86e5d16 100644 --- a/nim/test/gilded.nim +++ b/nim/test/gilded.nim @@ -30,37 +30,37 @@ proc days(count: int): seq[Item] = suite "+5 Dexterity Vest [0]": test "1 day": - var items = days(1) - checkItem(items[0], 9, 19) + var items = days 1 + checkItem items[0], 9, 19 test "5 days, check for cumulative depeciation": - let items = days(5) - checkItem(items[0], 5, 15) + let items = days 5 + checkItem items[0], 5, 15 test "10 days, expiration day": let items = days 10 - checkItem(items[0], 0, 10) + checkItem items[0], 0, 10 test "14 days, check for expired depreciation": - let items = days(14) - checkItem(items[0], -4, 2) + let items = days 14 + checkItem items[0], -4, 2 test "20 days, quality should not be negative": let items = days 20 - checkItem(items[0], -10, 0) + checkItem items[0], -10, 0 suite "Aged Brie [1]": test "1 day, brie increases value": - let items = days(1) - checkItem(items[1], 1, 1) + let items = days 1 + checkItem items[1], 1, 1 test "2 days, expiration day": - let items = days(2) - checkItem(items[1], 0, 2) + let items = days 2 + checkItem items[1], 0, 2 test "4 days, extra increase after expiration": - let items = days(4) - checkItem(items[1], -2, 6) + let items = days 4 + checkItem items[1], -2, 6 test "30 days, should reach max quality": let items = days 30 @@ -68,23 +68,23 @@ suite "Aged Brie [1]": suite "Sulfuras, Hand of Ragnaros [3]": test "1 day": - let items = days(1) - checkItem(items[3], 0, 80) + let items = days 1 + checkItem items[3], 0, 80 test "2 days": - let items = days(2) - checkItem(items[3], 0, 80) + let items = days 2 + checkItem items[3], 0, 80 suite "Sulfuras, Hand of Ragnaros [4]": test "1 day": - let items = days(1) - checkItem(items[4], -1, 80) + let items = days 1 + checkItem items[4], -1, 80 suite "Backstage passes to a TAFKAL80ETC concert [5]": test "1 day": - let items= days(1) - checkItem(items[5], 14, 21) + let items= days 1 + checkItem items[5], 14, 21 test "5 days": let items = days 5 From ab84d1696c124e32da3a9eab9d321361242d447a Mon Sep 17 00:00:00 2001 From: Peter Kofler Date: Thu, 7 Dec 2023 13:07:18 +0100 Subject: [PATCH 3/4] Replace complete test with sample test. --- nim/test/gilded.nim | 126 ++------------------------------------------ 1 file changed, 5 insertions(+), 121 deletions(-) diff --git a/nim/test/gilded.nim b/nim/test/gilded.nim index c86e5d16..fa441583 100644 --- a/nim/test/gilded.nim +++ b/nim/test/gilded.nim @@ -2,125 +2,9 @@ import unittest import ../src/items import ../src/gildedrose -let list = @[ - initItem("+5 Dexterity Vest", 10, 20), - initItem("Aged Brie", 2, 0), - # this doesn't have any special treatment, but if you want you can think of something and add a test - initItem("Elixir of the Mongoose", 5, 7), - initItem("Sulfuras, Hand of Ragnaros", 0, 80), - initItem("Sulfuras, Hand of Ragnaros", -1, 80), - initItem("Backstage passes to a TAFKAL80ETC concert", 15, 20), - initItem("Backstage passes to a TAFKAL80ETC concert", 10, 49), - initItem("Backstage passes to a TAFKAL80ETC concert", 5, 49), - # this conjured item does not work properly yet - initItem("Conjured Mana Cake", 3, 6) -] +suite "Gilded Rose": -template checkItem(item: Item, s, q: int) = - check: - item.sellIn == s - item.quality == q - -proc days(count: int): seq[Item] = - var items = list - for _ in 1 .. count: - items.updateQuality() - items - -suite "+5 Dexterity Vest [0]": - - test "1 day": - var items = days 1 - checkItem items[0], 9, 19 - - test "5 days, check for cumulative depeciation": - let items = days 5 - checkItem items[0], 5, 15 - - test "10 days, expiration day": - let items = days 10 - checkItem items[0], 0, 10 - - test "14 days, check for expired depreciation": - let items = days 14 - checkItem items[0], -4, 2 - - test "20 days, quality should not be negative": - let items = days 20 - checkItem items[0], -10, 0 - -suite "Aged Brie [1]": - test "1 day, brie increases value": - let items = days 1 - checkItem items[1], 1, 1 - - test "2 days, expiration day": - let items = days 2 - checkItem items[1], 0, 2 - - test "4 days, extra increase after expiration": - let items = days 4 - checkItem items[1], -2, 6 - - test "30 days, should reach max quality": - let items = days 30 - checkItem items[1], -28, 50 - -suite "Sulfuras, Hand of Ragnaros [3]": - test "1 day": - let items = days 1 - checkItem items[3], 0, 80 - - test "2 days": - let items = days 2 - checkItem items[3], 0, 80 - -suite "Sulfuras, Hand of Ragnaros [4]": - test "1 day": - let items = days 1 - checkItem items[4], -1, 80 - - -suite "Backstage passes to a TAFKAL80ETC concert [5]": - test "1 day": - let items= days 1 - checkItem items[5], 14, 21 - - test "5 days": - let items = days 5 - checkItem items[5], 10, 25 - - test "7 days, increase appreciation": - let items = days 7 - checkItem items[5], 8, 29 - - test "12 days, extra increased appriciation": - let items = days 12 - checkItem items[5], 3, 41 - - test "14 days, day before concert": - let items = days 14 - checkItem items[5], 1, 47 - - test "16 days, day after concert": - let items = days 16 - checkItem items[5], -1, 0 - -suite "Backstage passes to a TAFKAL80ETC concert [6]": - test "1 day, should reach max quality even though concert is soon": - let items = days 1 - checkItem items[6], 9, 50 - - test "11 days, day after concert": - let items = days 11 - checkItem items[6], -1, 0 - -suite "Backstage passes to a TAFKAL80ETC concert [7]": - test "1 day, should reach max quality even though concert is imminent": - let items = days 1 - checkItem items[7], 4, 50 - -suite "Conjured Mana cake [8]": - test "1 day, should decrease by double": - let items = days 1 - checkItem items[8], 2, 4 + test "foo": + var items = @[initItem("foo", 0, 0)] + items.updateQuality() + check items[0].name == "fixme" From 77a444b60029a90bfd81c1edd8b269be7ddd3e00 Mon Sep 17 00:00:00 2001 From: Peter Kofler Date: Thu, 7 Dec 2023 13:07:29 +0100 Subject: [PATCH 4/4] Standard ignores for Nim. --- nim/.gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 nim/.gitignore diff --git a/nim/.gitignore b/nim/.gitignore new file mode 100644 index 00000000..32e1dc0f --- /dev/null +++ b/nim/.gitignore @@ -0,0 +1,3 @@ +nimcache/ +nimblecache/ +htmldocs/