From 4c80a03125a6e44c3cf5ab17d184888f0f43383e Mon Sep 17 00:00:00 2001 From: Naresh Singh Date: Fri, 22 Dec 2023 17:27:53 +0530 Subject: [PATCH] refator code --- ruby/gilded_rose.rb | 111 +++++++++++++++++++++---------------- ruby/gilded_rose_spec.rb | 117 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 172 insertions(+), 56 deletions(-) diff --git a/ruby/gilded_rose.rb b/ruby/gilded_rose.rb index e177a497..043e03d3 100644 --- a/ruby/gilded_rose.rb +++ b/ruby/gilded_rose.rb @@ -1,56 +1,73 @@ class GildedRose - def initialize(items) @items = items end - def update_quality() + def update_quality @items.each do |item| - if item.name != "Aged Brie" and item.name != "Backstage passes to a TAFKAL80ETC concert" - if item.quality > 0 - if item.name != "Sulfuras, Hand of Ragnaros" - item.quality = item.quality - 1 - end - end - else - if item.quality < 50 - item.quality = item.quality + 1 - if item.name == "Backstage passes to a TAFKAL80ETC concert" - if item.sell_in < 11 - if item.quality < 50 - item.quality = item.quality + 1 - end - end - if item.sell_in < 6 - if item.quality < 50 - item.quality = item.quality + 1 - end - end - end - end - end - if item.name != "Sulfuras, Hand of Ragnaros" - item.sell_in = 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 = item.quality - 1 - end - end - else - item.quality = item.quality - item.quality - end - else - if item.quality < 50 - item.quality = item.quality + 1 - end - end - end + update_item(item) end end + + private + + def update_item(item) + if item.name == 'Sulfuras, Hand of Ragnaros' + return # Legendary item, no need to update + end + + update_sell_in(item) + + case item.name + when 'Aged Brie' + update_aged_brie(item) + when 'Backstage passes to a TAFKAL80ETC concert' + update_backstage_pass(item) + when 'Conjured Mana Cake' + update_conjured_item(item) + else + update_normal_item(item) + end + end + + def update_sell_in(item) + item.sell_in -= 1 unless item.name == 'Sulfuras, Hand of Ragnaros' + end + + def update_aged_brie(item) + increase_quality(item) + increase_quality(item) if item.sell_in < 0 + end + + def update_backstage_pass(item) + if item.sell_in <= 0 + item.quality = 0 + elsif item.sell_in <= 5 + increase_quality(item, 3) + elsif item.sell_in <= 10 + increase_quality(item, 2) + else + increase_quality(item) + end + end + + def update_conjured_item(item) + decrease_quality(item, 2) + decrease_quality(item, 2) if item.sell_in < 0 + end + + def update_normal_item(item) + decrease_quality(item) + decrease_quality(item) if item.sell_in < 0 + end + + def increase_quality(item, amount = 1) + item.quality = [item.quality + amount, 50].min + end + + def decrease_quality(item, amount = 1) + item.quality = [item.quality - amount, 0].max + end end class Item @@ -61,8 +78,4 @@ class Item @sell_in = sell_in @quality = quality end - - def to_s() - "#{@name}, #{@sell_in}, #{@quality}" - end end diff --git a/ruby/gilded_rose_spec.rb b/ruby/gilded_rose_spec.rb index 269fe1b0..e1bea3d4 100644 --- a/ruby/gilded_rose_spec.rb +++ b/ruby/gilded_rose_spec.rb @@ -1,13 +1,116 @@ -require File.join(File.dirname(__FILE__), 'gilded_rose') +require 'rspec' +require_relative 'gilded_rose' describe GildedRose do + describe '#update_quality' do + context 'with normal items' do + it 'decreases quality and sell_in by 1' do + items = [Item.new('Normal Item', 5, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(9) + expect(items[0].sell_in).to eq(4) + end - describe "#update_quality" do - it "does not change the name" do - items = [Item.new("foo", 0, 0)] - GildedRose.new(items).update_quality() - expect(items[0].name).to eq "fixme" + it 'decreases quality twice as fast after sell by date' do + items = [Item.new('Normal Item', 0, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(8) + end + + it 'never sets quality to a negative value' do + items = [Item.new('Normal Item', 5, 0)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(0) + end + end + + context 'with Aged Brie' do + it 'increases in quality as it gets older' do + items = [Item.new('Aged Brie', 5, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(11) + end + + it 'increases in quality twice as fast after sell by date' do + items = [Item.new('Aged Brie', 0, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(12) + end + + it 'never sets quality above 50' do + items = [Item.new('Aged Brie', 5, 50)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(50) + end + end + + context 'with Sulfuras' do + it 'never changes quality or sell_in' do + items = [Item.new('Sulfuras, Hand of Ragnaros', 5, 80)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(80) + expect(items[0].sell_in).to eq(5) + end + end + + context 'with Backstage passes' do + it 'increases quality by 1 when more than 10 days left' do + items = [Item.new('Backstage passes to a TAFKAL80ETC concert', 15, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(11) + end + + it 'increases quality by 2 when 10 days or less left' do + items = [Item.new('Backstage passes to a TAFKAL80ETC concert', 10, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(12) + end + + it 'increases quality by 3 when 5 days or less left' do + items = [Item.new('Backstage passes to a TAFKAL80ETC concert', 5, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(13) + end + + it 'drops quality to 0 after the concert' do + items = [Item.new('Backstage passes to a TAFKAL80ETC concert', 0, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(0) + end + end + + context 'with Conjured items' do + it 'degrades in quality twice as fast as normal items' do + items = [Item.new('Conjured Mana Cake', 5, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(8) + end + + it 'degrades in quality twice as fast after sell by date' do + items = [Item.new('Conjured Mana Cake', 0, 10)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(6) + end + + it 'never sets quality to a negative value' do + items = [Item.new('Conjured Mana Cake', 5, 0)] + gilded_rose = GildedRose.new(items) + gilded_rose.update_quality + expect(items[0].quality).to eq(0) + end end end - end