GildedRose-Refactoring-Kata/ruby/specs/gilded_rose_spec.rb
Maarten Parmentier cc494bf27e Extract normal item cases
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
2023-06-27 20:37:29 +02:00

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