Permalink
Browse files

Initial Ruby version (with working tests)

0 parents commit 65c5a9f1e792c1d6efb9f50c09e123d2c0e80272 Jim Weirich committed Feb 16, 2011
Showing with 333 additions and 0 deletions.
  1. +1 −0 .rspec
  2. +45 −0 README.md
  3. +6 −0 Rakefile
  4. +96 −0 gilded_rose.cs
  5. +62 −0 gilded_rose.rb
  6. +123 −0 gilded_rose_spec.rb
1 .rspec
@@ -0,0 +1 @@
+-I. --color
@@ -0,0 +1,45 @@
+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 it's
+ 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). Your work needs to be completed by Friday, February 18, 2011
+08:00:00 AM PST.
+
+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.
@@ -0,0 +1,6 @@
+
+task :default => :spec
+
+task :spec do
+ sh "rspec ."
+end
@@ -0,0 +1,96 @@
+// Original C# code for the Gilded Rose Kata
+
+void UpdateQuality()
+{
+ for (var i = 0; i < Items.Count; i++)
+ {
+ if (Items[i].Name != "Aged Brie" && 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;
+ }
+ }
+ }
+ }
+}
+
+IList<Item> Items = new List<Item>
+{
+ new Item { Name = "+5 Dexterity Vest", SellIn = 10, Quality = 20 },
+ new Item { Name = "Aged Brie", SellIn = 2, Quality = 0 },
+ new Item { Name = "Elixir of the Mongoose", SellIn = 5, Quality = 7 },
+ new Item { Name = "Sulfuras, Hand of Ragnaros", SellIn = 0, Quality = 80 },
+ new Item { Name = "Backstage passes to a TAFKAL80ETC concert", SellIn = 15, Quality = 20 },
+ new Item { Name = "Conjured Mana Cake", SellIn = 3, Quality = 6 }
+};
+
+class Item
+{
+ public string Name { get; set; }
+
+ public int SellIn { get; set; }
+
+ public int Quality { get; set; }
+}
@@ -0,0 +1,62 @@
+def update_quality
+ Items.each do |item|
+ update_quality_of(item)
+ end
+end
+
+def update_quality_of(item)
+ if item.name != 'Aged Brie' && item.name != 'Backstage passes to a TAFKAL80ETC concert'
+ if item.quality > 0
+ if item.name != 'Sulfuras, Hand of Ragnaros'
+ item.quality -= 1
+ end
+ end
+ else
+ if item.quality < 50
+ item.quality += 1
+ if item.name == 'Backstage passes to a TAFKAL80ETC concert'
+ if item.sell_in < 11
+ if item.quality < 50
+ item.quality += 1
+ end
+ end
+ if item.sell_in < 6
+ if item.quality < 50
+ item.quality += 1
+ end
+ end
+ end
+ end
+ end
+ if item.name != 'Sulfuras, Hand of Ragnaros'
+ item.sell_in -= 1
+ end
+ if item.sell_in < 0
+ if item.name != "Aged Brie"
+ if item.name != 'Backstage passes to a TAFKAL80ETC concert'
+ if item.quality > 0
+ if item.name != 'Sulfuras, Hand of Ragnaros'
+ item.quality -= 1
+ end
+ end
+ else
+ item.quality = item.quality - item.quality
+ end
+ else
+ if item.quality < 50
+ item.quality += 1
+ end
+ end
+ end
+end
+
+Item = Struct.new(:name, :sell_in, :quality)
+
+Items = [
+ Item.new("+5 Dexterity Vest", 10, 20),
+ Item.new("Aged Brie", 2, 0),
+ Item.new("Elixir of the Mongoose", 5, 7),
+ Item.new("Sulfuras, Hand of Ragnaros", 0, 80),
+ Item.new("Backstage passes to a TAFKAL80ETC concert", 15, 20),
+ Item.new("Conjured Mana Cake", 3, 6),
+]
@@ -0,0 +1,123 @@
+require 'rspec/given'
+require 'gilded_rose'
+
+describe "#update_quality_of" do
+ Given(:sell_in) { 5 }
+ Given(:quality) { 10 }
+
+ When { update_quality_of(item) }
+
+ context "with a normal item" do
+ Given(:item) { Item.new("NORMAL ITEM", sell_in, quality) }
+
+ context "before sell date" do
+ Then { item.quality.should == quality - 1 }
+ Then { item.sell_in.should == sell_in - 1 }
+ end
+
+ context "on sell date" do
+ Given(:sell_in) { 0 }
+ Then { item.quality.should == quality - 2 }
+ Then { item.sell_in.should == sell_in - 1 }
+ end
+
+ context "after sell date" do
+ Given(:sell_in) { -10 }
+ Then { item.quality.should == quality - 2 }
+ Then { item.sell_in.should == sell_in - 1 }
+ end
+
+ context "of zero quality" do
+ Given(:quality) { 0 }
+ Then { item.quality.should == 0 }
+ end
+ end
+
+ context "with Aged Brie" do
+ Given(:item) { Item.new("Aged Brie", sell_in, quality) }
+
+ context "before sell date" do
+ Then { item.quality.should == quality+1 }
+
+ context "with max quality" do
+ Given(:quality) { 50 }
+ Then { item.quality.should == quality }
+ end
+ end
+
+ context "on sell date" do
+ Given(:sell_in) { 0 }
+ Then { item.quality.should == quality+2 }
+ end
+
+ context "after sell date" do
+ Given(:sell_in) { -10 }
+ Then { item.quality.should == quality+2 }
+
+ context "with max quality" do
+ Given(:quality) { 50 }
+ Then { item.quality.should == quality }
+ end
+ end
+ end
+
+ context "with Sulfuras" do
+ Given(:quality) { 80 }
+ Given(:item) { Item.new("Sulfuras, Hand of Ragnaros", sell_in, quality) }
+
+ context "before sell date" do
+ Then { item.quality.should == quality }
+ Then { item.sell_in.should == sell_in }
+ end
+
+ context "on sell date" do
+ Given(:sell_in) { 0 }
+ Then { item.quality.should == quality }
+ Then { item.sell_in.should == sell_in }
+ end
+
+ context "after sell date" do
+ Given(:sell_in) { -10 }
+ Then { item.quality.should == quality }
+ Then { item.sell_in.should == sell_in }
+ end
+ end
+
+ context "with Backstage passes" do
+ Given(:item) { Item.new("Backstage passes to a TAFKAL80ETC concert", sell_in, quality) }
+
+ context "long before sell date" do
+ Given(:sell_in) { 11 }
+ Then { item.quality.should == quality+1 }
+ Then { item.sell_in.should == sell_in-1 }
+
+ context "at max quality" do
+ Given(:quality) { 50 }
+ Then { item.quality.should == quality }
+ end
+ end
+
+ context "closer to sell date" do
+ Given(:sell_in) { 10 }
+ Then { item.quality.should == quality+2 }
+ Then { item.sell_in.should == sell_in-1 }
+
+ context "at max quality" do
+ Given(:quality) { 50 }
+ Then { item.quality.should == quality }
+ end
+ end
+
+ context "on sell date" do
+ Given(:sell_in) { 0 }
+ Then { item.quality.should == 0 }
+ Then { item.sell_in.should == sell_in-1 }
+ end
+
+ context "after sell date" do
+ Given(:sell_in) { -10 }
+ Then { item.quality.should == 0 }
+ Then { item.sell_in.should == sell_in-1 }
+ end
+ end
+end

0 comments on commit 65c5a9f

Please sign in to comment.