mirror of
https://github.com/emilybache/GildedRose-Refactoring-Kata.git
synced 2026-02-15 22:41:30 +00:00
All tests pass, both rspec as texttests. This gives me a good base to start implementing Conjured items. The idea is to implement Conjured items first before starting to clean up the code. My thought process when implementing new code is always: make it work -> make it safe -> clean it up
275 lines
7.0 KiB
Ruby
275 lines
7.0 KiB
Ruby
require_relative '../gilded_rose'
|
|
|
|
describe GildedRose do
|
|
let(:quality) { 3 }
|
|
let(:sell_in) { 3 }
|
|
let(:item_name) { 'Elixir of the Mongoose' }
|
|
let(:item) { Item.new(item_name, sell_in, quality) }
|
|
let(:items) { [item] }
|
|
|
|
subject { GildedRose.new(items) }
|
|
|
|
describe '#update_quality' do
|
|
context "when item is regular like e.g. 'Elixir of the Mongoose'" do
|
|
context 'when sell by date has not passed' do
|
|
it 'lowers quality by 1' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 2
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 2
|
|
end
|
|
end
|
|
|
|
context 'when 1 day left' do
|
|
let(:sell_in) { 1 }
|
|
|
|
it 'lowers quality by 1' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 2
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 0
|
|
end
|
|
end
|
|
|
|
context 'when sell by date has passed' do
|
|
let(:sell_in) { 0 }
|
|
|
|
it 'lowers quality by 2' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 1
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq -1
|
|
end
|
|
end
|
|
|
|
it 'does never lower the quality below 0' do
|
|
items = [Item.new(item_name, sell_in, 0)]
|
|
GildedRose.new(items).update_quality
|
|
expect(items[0].quality).to eq 0
|
|
end
|
|
end
|
|
|
|
context "when item name is 'Sulfuras, Hand of Ragnaros'" do
|
|
let(:item_name) { 'Sulfuras, Hand of Ragnaros' }
|
|
let(:quality) { 80 }
|
|
|
|
context 'when sell by date has not passed' do
|
|
it 'does not lower quality by 1' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 80
|
|
end
|
|
|
|
it 'does not lower sell_in' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 3
|
|
end
|
|
end
|
|
|
|
context 'when 1 day left' do
|
|
let(:sell_in) { 1 }
|
|
|
|
it 'does not lower quality by 1' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 80
|
|
end
|
|
|
|
it 'does not lower sell_in' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 1
|
|
end
|
|
end
|
|
|
|
context 'when sell by date has passed' do
|
|
let(:sell_in) { 0 }
|
|
|
|
it 'does not lower quality by 1' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 80
|
|
end
|
|
|
|
it 'does not lower sell_in' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 0
|
|
end
|
|
end
|
|
end
|
|
|
|
context "when item name is 'Aged Brie'" do
|
|
let(:item_name) { 'Aged Brie' }
|
|
|
|
context 'when sell by date has not passed' do
|
|
it 'increases quality by 1' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 4
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 2
|
|
end
|
|
end
|
|
|
|
context 'when sell by date has passed' do
|
|
let(:sell_in) { 0 }
|
|
|
|
it 'increases quality by 2' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 5
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq -1
|
|
end
|
|
end
|
|
|
|
context 'when 1 day left' do
|
|
let(:sell_in) { 1 }
|
|
|
|
it 'increases quality by 1' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 4
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 0
|
|
end
|
|
end
|
|
|
|
it 'does never raise the quality above 50' do
|
|
items = [Item.new(item_name, sell_in, 50)]
|
|
GildedRose.new(items).update_quality
|
|
expect(items[0].quality).to eq 50
|
|
end
|
|
end
|
|
|
|
context "when item name is 'Backstage passes to a TAFKAL80ETC concert'" do
|
|
let(:item_name) { 'Backstage passes to a TAFKAL80ETC concert' }
|
|
|
|
context 'when sell by date has not passed' do
|
|
context 'when 10 or less days remaining' do
|
|
let(:sell_in) { 10 }
|
|
|
|
it 'increases quality by 2' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 5
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 9
|
|
end
|
|
end
|
|
|
|
context 'when 5 or less days remaining' do
|
|
let(:sell_in) { 5 }
|
|
it 'increases quality by 3' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 6
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 4
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'when 1 day left' do
|
|
let(:sell_in) { 1 }
|
|
|
|
it 'increases quality by 3' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 6
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 0
|
|
end
|
|
end
|
|
|
|
context 'when sell by date has passed' do
|
|
let(:sell_in) { 0 }
|
|
|
|
it 'sets the quality to 0' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 0
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq -1
|
|
end
|
|
end
|
|
|
|
it 'does never raise the quality above 50' do
|
|
items = [Item.new(item_name, sell_in, 50)]
|
|
GildedRose.new(items).update_quality
|
|
expect(items[0].quality).to eq 50
|
|
end
|
|
end
|
|
|
|
xcontext "when item name is 'Conjured Mana Cake'" do
|
|
let(:item_name) { 'Conjured Mana Cake' }
|
|
|
|
context 'when sell by date has not passed' do
|
|
it 'lowers quality by 2' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 1
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 2
|
|
end
|
|
end
|
|
|
|
context 'when 1 day left' do
|
|
let(:sell_in) { 1 }
|
|
|
|
it 'lowers quality by 2' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 1
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq 2
|
|
end
|
|
end
|
|
|
|
context 'when sell by date has passed' do
|
|
let(:sell_in) { 0 }
|
|
let(:quality) { 6 }
|
|
|
|
it 'lowers quality by 4' do
|
|
subject.update_quality
|
|
expect(items[0].quality).to eq 2
|
|
end
|
|
|
|
it 'lowers sell_in by 1' do
|
|
subject.update_quality
|
|
expect(items[0].sell_in).to eq -1
|
|
end
|
|
end
|
|
|
|
it 'does never lower the quality below 0' do
|
|
items = [Item.new(item_name, sell_in, 0)]
|
|
GildedRose.new(items).update_quality
|
|
expect(items[0].quality).to eq 0
|
|
end
|
|
end
|
|
end
|
|
end
|