From f0204a4b1ed0a182f5ad1ecb720115a372ab4745 Mon Sep 17 00:00:00 2001 From: Maarten Parmentier Date: Mon, 26 Jun 2023 22:47:38 +0200 Subject: [PATCH] Write tests for all types of items Without looking at the code I've written specs based on the requirements listed and the output of the texttest. All specs are green except for the expected 2 failing 'quality' tests for the new 'Conjured' item. With all models tested I feel more comfortable starting the refactor. The plan at the moment is to extract the code of 1 type of item at the time into it's own method. --- ruby/gilded_rose_spec.rb | 13 --- ruby/gilded_rose_tests.rb | 12 -- ruby/specs/gilded_rose_spec.rb | 204 +++++++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+), 25 deletions(-) delete mode 100644 ruby/gilded_rose_spec.rb delete mode 100644 ruby/gilded_rose_tests.rb create mode 100644 ruby/specs/gilded_rose_spec.rb diff --git a/ruby/gilded_rose_spec.rb b/ruby/gilded_rose_spec.rb deleted file mode 100644 index 269fe1b0..00000000 --- a/ruby/gilded_rose_spec.rb +++ /dev/null @@ -1,13 +0,0 @@ -require File.join(File.dirname(__FILE__), 'gilded_rose') - -describe GildedRose do - - 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" - end - end - -end diff --git a/ruby/gilded_rose_tests.rb b/ruby/gilded_rose_tests.rb deleted file mode 100644 index 2e1b70d1..00000000 --- a/ruby/gilded_rose_tests.rb +++ /dev/null @@ -1,12 +0,0 @@ -require File.join(File.dirname(__FILE__), 'gilded_rose') -require 'test/unit' - -class TestUntitled < Test::Unit::TestCase - - def test_foo - items = [Item.new("foo", 0, 0)] - GildedRose.new(items).update_quality() - assert_equal items[0].name, "fixme" - end - -end \ No newline at end of file diff --git a/ruby/specs/gilded_rose_spec.rb b/ruby/specs/gilded_rose_spec.rb new file mode 100644 index 00000000..77e994c0 --- /dev/null +++ b/ruby/specs/gilded_rose_spec.rb @@ -0,0 +1,204 @@ +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 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)] + subject.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 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 + + it 'does never raise the quality above 50' do + items = [Item.new(item_name, sell_in, 50)] + subject.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 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 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)] + subject.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 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)] + subject.update_quality + expect(items[0].quality).to eq 0 + end + end + end +end