diff --git a/README.md b/README.md index c83ad6ff..98d4f402 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ This is the Gilded Rose kata in JavaScript with Jest. -See `docs/GildedRoseRequirements-Simple.txt` for the business requirements. +See `docs/GildedRoseRequirements.txt` for the business requirements. ## Getting started diff --git a/docs/GildedRoseRequirements-Advanced.txt b/advanced/GildedRoseRequirements-Advanced.txt similarity index 100% rename from docs/GildedRoseRequirements-Advanced.txt rename to advanced/GildedRoseRequirements-Advanced.txt diff --git a/advanced/src/demo-advanced.js b/advanced/src/demo-advanced.js new file mode 100644 index 00000000..9641e56a --- /dev/null +++ b/advanced/src/demo-advanced.js @@ -0,0 +1,29 @@ + +const { Shop, Item } = require("./gilded_rose"); + +const items = [ + new Item("+5 Dexterity Vest", 10, 20), + new Item("Aged Brie", 2, 0), + new Item("Elixir of the Mongoose", 5, 7), + new Item("Sulfuras", 0, 80), + new Item("Sulfuras", -1, 80), + new Item("Backstage passes", 15, 20), + new Item("Backstage passes", 10, 49), + new Item("Backstage passes", 5, 49), + + // This Conjured item does not work properly yet + new Item("Conjured Mana Cake", 3, 6), +]; + +const days = Number(process.argv[2]) || 3; +const gildedRose = new Shop(items); + +console.log("Welcome to the Gilded Rose Demo!"); +console.log("================================") + +for (let day = 1; day <= days; day++) { + console.log(`\n-------- Day ${day} --------`); + console.log("name, sellIn, quality"); + items.forEach(item => console.log(`${item.name}, ${item.sellIn}, ${item.quality}`)); + gildedRose.updateQuality(); +} diff --git a/advanced/src/gilded-rose-advanced.js b/advanced/src/gilded-rose-advanced.js new file mode 100644 index 00000000..b0ada497 --- /dev/null +++ b/advanced/src/gilded-rose-advanced.js @@ -0,0 +1,67 @@ +class Item { + constructor(name, sellIn, quality){ + this.name = name; + this.sellIn = sellIn; + this.quality = quality; + } +} + +class Shop { + constructor(items=[]){ + this.items = items; + } + updateQuality() { + for (let i = 0; i < this.items.length; i++) { + if (this.items[i].name != 'Aged Brie' && this.items[i].name != 'Backstage passes') { + if (this.items[i].quality > 0) { + if (this.items[i].name != 'Sulfuras') { + this.items[i].quality = this.items[i].quality - 1; + } + } + } else { + if (this.items[i].quality < 50) { + this.items[i].quality = this.items[i].quality + 1; + if (this.items[i].name == 'Backstage passes') { + if (this.items[i].sellIn < 11) { + if (this.items[i].quality < 50) { + this.items[i].quality = this.items[i].quality + 1; + } + } + if (this.items[i].sellIn < 6) { + if (this.items[i].quality < 50) { + this.items[i].quality = this.items[i].quality + 1; + } + } + } + } + } + if (this.items[i].name != 'Sulfuras') { + this.items[i].sellIn = this.items[i].sellIn - 1; + } + if (this.items[i].sellIn < 0) { + if (this.items[i].name != 'Aged Brie') { + if (this.items[i].name != 'Backstage passes') { + if (this.items[i].quality > 0) { + if (this.items[i].name != 'Sulfuras') { + this.items[i].quality = this.items[i].quality - 1; + } + } + } else { + this.items[i].quality = this.items[i].quality - this.items[i].quality; + } + } else { + if (this.items[i].quality < 50) { + this.items[i].quality = this.items[i].quality + 1; + } + } + } + } + + return this.items; + } +} + +module.exports = { + Item, + Shop +} diff --git a/docs/GildedRoseRequirements-Simple.txt b/docs/GildedRoseRequirements-Simple.txt deleted file mode 100644 index 2e74aae6..00000000 --- a/docs/GildedRoseRequirements-Simple.txt +++ /dev/null @@ -1,38 +0,0 @@ -====================================== -Gilded Rose Requirements Specification -====================================== - -Hi and welcome to team Gilded Rose. As you know, we are a small inn with a prime location in a -prominent city ran by a friendly innkeeper named Allison. We also buy and sell only the finest goods. -Unfortunately, our goods are constantly degrading in quality as they approach their sell by date. We -have a system in place that updates our inventory for us. It was developed by a no-nonsense type named -Leeroy, who has moved on to new adventures. Your task is to add the new feature to our system so that -we can begin selling a new category of items. First an introduction to our system: - - - All items have a SellIn value which denotes the number of days we have to sell the item - - All items have a Quality value which denotes how valuable the item is - - At the end of each day our system lowers both values for every item - -Pretty simple, right? Well this is where it gets interesting: - - - Once the sell by date has passed, Quality degrades twice as fast - - The Quality of an item is never negative - - "Aged Brie" actually increases in Quality the older it gets - - The Quality of an item is never more than 50 - - "Sulfuras", being a legendary item, never has to be sold or decreases in Quality - - "Backstage passes", like aged brie, increases in Quality as its SellIn value approaches; - Quality increases by 2 when there are 10 days or less and by 3 when there are 5 days or less but - Quality drops to 0 after the concert - -We have recently signed a supplier of conjured items. This requires an update to our system: - - - "Conjured" items degrade in Quality twice as fast as normal items - -Feel free to make any changes to the UpdateQuality method and add any new code as long as everything -still works correctly. However, do not alter the Item class or Items property as those belong to the -goblin in the corner who will insta-rage and one-shot you as he doesn't believe in shared code -ownership (you can make the UpdateQuality method and Items property static if you like, we'll cover -for you). - -Just for clarification, an item can never have its Quality increase above 50, however "Sulfuras" is a -legendary item and as such its Quality is 80 and it never alters. diff --git a/docs/GildedRoseRequirements.txt b/docs/GildedRoseRequirements.txt new file mode 100644 index 00000000..d5cc3c88 --- /dev/null +++ b/docs/GildedRoseRequirements.txt @@ -0,0 +1,14 @@ +====================================== +Gilded Rose Requirements Specification +====================================== + +Hi and welcome to team Gilded Rose. As you know, we are a small inn with a prime location in a +prominent city ran by a friendly innkeeper named Allison. We also buy and sell only the finest goods. +Unfortunately, our goods are constantly degrading in quality as they approach their sell by date. We +have a system in place that updates our inventory for us. It was developed by a no-nonsense type named +Leeroy, who has moved on to new adventures. Your task is to add the new feature to our system so that +we can begin selling a new category of items. First an introduction to our system: + + - All items have a SellIn value which denotes the number of days we have to sell the item + - All items have a Quality value which denotes how valuable the item is + - At the end of each day our system lowers both values for every item diff --git a/src/demo.js b/src/demo.js index 9641e56a..0718ca1e 100644 --- a/src/demo.js +++ b/src/demo.js @@ -5,14 +5,6 @@ const items = [ new Item("+5 Dexterity Vest", 10, 20), new Item("Aged Brie", 2, 0), new Item("Elixir of the Mongoose", 5, 7), - new Item("Sulfuras", 0, 80), - new Item("Sulfuras", -1, 80), - new Item("Backstage passes", 15, 20), - new Item("Backstage passes", 10, 49), - new Item("Backstage passes", 5, 49), - - // This Conjured item does not work properly yet - new Item("Conjured Mana Cake", 3, 6), ]; const days = Number(process.argv[2]) || 3; diff --git a/src/gilded_rose.js b/src/gilded_rose.js index b0ada497..fcb5b251 100644 --- a/src/gilded_rose.js +++ b/src/gilded_rose.js @@ -5,56 +5,18 @@ class Item { this.quality = quality; } } - class Shop { constructor(items=[]){ this.items = items; } + updateQuality() { - for (let i = 0; i < this.items.length; i++) { - if (this.items[i].name != 'Aged Brie' && this.items[i].name != 'Backstage passes') { + for (let i = 0; i < this.items.length; i++) { if (this.items[i].quality > 0) { - if (this.items[i].name != 'Sulfuras') { this.items[i].quality = this.items[i].quality - 1; - } } - } else { - if (this.items[i].quality < 50) { - this.items[i].quality = this.items[i].quality + 1; - if (this.items[i].name == 'Backstage passes') { - if (this.items[i].sellIn < 11) { - if (this.items[i].quality < 50) { - this.items[i].quality = this.items[i].quality + 1; - } - } - if (this.items[i].sellIn < 6) { - if (this.items[i].quality < 50) { - this.items[i].quality = this.items[i].quality + 1; - } - } - } - } - } - if (this.items[i].name != 'Sulfuras') { + this.items[i].sellIn = this.items[i].sellIn - 1; - } - if (this.items[i].sellIn < 0) { - if (this.items[i].name != 'Aged Brie') { - if (this.items[i].name != 'Backstage passes') { - if (this.items[i].quality > 0) { - if (this.items[i].name != 'Sulfuras') { - this.items[i].quality = this.items[i].quality - 1; - } - } - } else { - this.items[i].quality = this.items[i].quality - this.items[i].quality; - } - } else { - if (this.items[i].quality < 50) { - this.items[i].quality = this.items[i].quality + 1; - } - } - } } return this.items;