diff --git a/lib/gilded_rose.rb b/lib/gilded_rose.rb index 5cced0fe..3445e3ad 100644 --- a/lib/gilded_rose.rb +++ b/lib/gilded_rose.rb @@ -1,49 +1,82 @@ -def update_quality(items) - items.each do |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 +require 'delegate' + +class ItemDecorator < SimpleDelegator + def self.decorate(item) + case item.name + when 'Aged Brie' + AgedBrie.new(item) + when 'Backstage passes to a TAFKAL80ETC concert' + BackstagePass.new(item) + when 'Sulfuras, Hand of Ragnaros' + LegendaryItem.new(item) + when 'Conjured Mana Cake' + ConjuredItem.new(item) 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 + ItemDecorator.new(item) end end + + def update + decrement_quality + decrement_sell_in + decrement_quality if self.sell_in < 0 + end + + private + + def decrement_quality + self.quality -= 1 if self.quality > 0 + end + + def increment_quality + self.quality += 1 if self.quality < 50 + end + + def decrement_sell_in + self.sell_in -= 1 + end + + def zero_out_quality + self.quality = 0 + end +end + +class AgedBrie < ItemDecorator + def update + increment_quality + decrement_sell_in + increment_quality if self.sell_in < 0 + end +end + +class BackstagePass < ItemDecorator + def update + increment_quality + increment_quality if self.sell_in < 11 + increment_quality if self.sell_in < 6 + decrement_sell_in + zero_out_quality if self.sell_in < 0 + end +end + +class LegendaryItem < ItemDecorator + def update; end # No-Op +end + +class ConjuredItem < ItemDecorator + def update + decrement_quality + decrement_quality + decrement_sell_in + decrement_quality if self.sell_in < 0 + decrement_quality if self.sell_in < 0 + end +end + +def update_quality(items) + items.each do |item| + ItemDecorator.decorate(item).update + end end #---------------------------- diff --git a/spec/gilded_rose_spec.rb b/spec/gilded_rose_spec.rb index 0503195f..ceb6e7ac 100644 --- a/spec/gilded_rose_spec.rb +++ b/spec/gilded_rose_spec.rb @@ -191,36 +191,36 @@ context 'before the sell date' do let(:initial_sell_in) { 5 } - xit { expect(item.quality).to eq(initial_quality - 2) } + it { expect(item.quality).to eq(initial_quality - 2) } context 'at zero quality' do let(:initial_quality) { 0 } - xit { expect(item.quality).to eq(initial_quality) } + it { expect(item.quality).to eq(initial_quality) } end end context 'on sell date' do let(:initial_sell_in) { 0 } - xit { expect(item.quality).to eq(initial_quality - 4) } + it { expect(item.quality).to eq(initial_quality - 4) } context 'at zero quality' do let(:initial_quality) { 0 } - xit { expect(item.quality).to eq(initial_quality) } + it { expect(item.quality).to eq(initial_quality) } end end context 'after sell date' do let(:initial_sell_in) { -10 } - xit { expect(item.quality).to eq(initial_quality - 4) } + it { expect(item.quality).to eq(initial_quality - 4) } context 'at zero quality' do let(:initial_quality) { 0 } - xit { expect(item.quality).to eq(initial_quality) } + it { expect(item.quality).to eq(initial_quality) } end end end