From ba7b983723c0b3b27b52aa3ec1902b91c8527bb0 Mon Sep 17 00:00:00 2001 From: Cyril Lepagnot Date: Tue, 26 Sep 2017 09:49:31 +0200 Subject: [PATCH 1/5] Add specs --- ruby/gilded_rose_spec.rb | 243 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 237 insertions(+), 6 deletions(-) diff --git a/ruby/gilded_rose_spec.rb b/ruby/gilded_rose_spec.rb index 269fe1b0..1dddb62a 100644 --- a/ruby/gilded_rose_spec.rb +++ b/ruby/gilded_rose_spec.rb @@ -1,13 +1,244 @@ require File.join(File.dirname(__FILE__), 'gilded_rose') describe GildedRose do + subject { Item.new(name: name, sell_in: sell_in, quality: quality) } - 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" + let(:items) { [subject] } + + describe '#update_quality' do + let(:sell_in) { 0 } + let(:quality) { 0 } + + before do + GildedRose + .new(items: items) + .update_quality + end + + shared_examples :does_not_change_the_name do + describe '#items' do + describe '#first' do + describe '#name' do + it { expect(subject.name).to eq(name) } + end + end + end + end + + context 'when #name is any_other' do + let(:name) { 'any_other' } + + it_behaves_like :does_not_change_the_name + + context 'when sell_in is negative' do + let(:sell_in) { -42 } + + it { expect(subject.sell_in).to eq(-43) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(48) } + end + end + + context 'when sell_in is 4' do + let(:sell_in) { 4 } + + it { expect(subject.sell_in).to eq(3) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(49) } + end + end + + context 'when sell_in is 8' do + let(:sell_in) { 8 } + + it { expect(subject.sell_in).to eq(7) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(49) } + end + end + + context 'when sell_in is 12' do + let(:sell_in) { 12 } + + it { expect(subject.sell_in).to eq(11) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(49) } + end + end + end + + context 'when #name is Aged Brie' do + let(:name) { 'Aged Brie' } + + it_behaves_like :does_not_change_the_name + + context 'when sell_in is negative' do + let(:sell_in) { -42 } + + it { expect(subject.sell_in).to eq(-43) } + it { expect(subject.quality).to eq(2) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + + context 'when sell_in is 4' do + let(:sell_in) { 4 } + + it { expect(subject.sell_in).to eq(3) } + it { expect(subject.quality).to eq(1) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + + context 'when sell_in is 8' do + let(:sell_in) { 8 } + + it { expect(subject.sell_in).to eq(7) } + it { expect(subject.quality).to eq(1) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + + context 'when sell_in is 12' do + let(:sell_in) { 12 } + + it { expect(subject.sell_in).to eq(11) } + it { expect(subject.quality).to eq(1) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + end + + context 'when #name is Sulfuras, Hand of Ragnaros' do + let(:name) { 'Sulfuras, Hand of Ragnaros' } + + it_behaves_like :does_not_change_the_name + + context 'when sell_in is negative' do + let(:sell_in) { -42 } + + it { expect(subject.sell_in).to eq(-42) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + + context 'when sell_in is 4' do + let(:sell_in) { 4 } + + it { expect(subject.sell_in).to eq(4) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + + context 'when sell_in is 8' do + let(:sell_in) { 8 } + + it { expect(subject.sell_in).to eq(8) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + + context 'when sell_in is 12' do + let(:sell_in) { 12 } + + it { expect(subject.sell_in).to eq(12) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + end + + context 'when #name is Backstage passes to a TAFKAL80ETC concert' do + let(:name) { 'Backstage passes to a TAFKAL80ETC concert' } + + it_behaves_like :does_not_change_the_name + + context 'when sell_in is negative' do + let(:sell_in) { -42 } + + it { expect(subject.sell_in).to eq(-43) } + it { expect(subject.quality).to eq(0) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(0) } + end + end + + context 'when sell_in is 4' do + let(:sell_in) { 4 } + + it { expect(subject.sell_in).to eq(3) } + it { expect(subject.quality).to eq(3) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + + context 'when sell_in is 8' do + let(:sell_in) { 8 } + + it { expect(subject.sell_in).to eq(7) } + it { expect(subject.quality).to eq(2) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end + + context 'when sell_in is 12' do + let(:sell_in) { 12 } + + it { expect(subject.sell_in).to eq(11) } + it { expect(subject.quality).to eq(1) } + + context 'when quality is >= 50' do + let(:quality) { 50 } + it { expect(subject.quality).to eq(50) } + end + end end end - end From 83d1c27b45f6bfb1d6403fdc05c279562df644ef Mon Sep 17 00:00:00 2001 From: Cyril Lepagnot Date: Tue, 26 Sep 2017 10:00:47 +0200 Subject: [PATCH 2/5] Remove test unit tests (already have rspec) --- ruby/gilded_rose_tests.rb | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 ruby/gilded_rose_tests.rb 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 From cb96a2f394aef734de380a6f71c646d9a1a82ff3 Mon Sep 17 00:00:00 2001 From: Cyril Lepagnot Date: Tue, 26 Sep 2017 10:02:02 +0200 Subject: [PATCH 3/5] Use named params --- ruby/gilded_rose.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ruby/gilded_rose.rb b/ruby/gilded_rose.rb index 3c260621..a18b6ba2 100644 --- a/ruby/gilded_rose.rb +++ b/ruby/gilded_rose.rb @@ -1,6 +1,6 @@ class GildedRose - def initialize(items) + def initialize(items:) @items = items end @@ -56,7 +56,7 @@ end class Item attr_accessor :name, :sell_in, :quality - def initialize(name, sell_in, quality) + def initialize(name:, sell_in:, quality:) @name = name @sell_in = sell_in @quality = quality @@ -65,4 +65,4 @@ class Item def to_s() "#{@name}, #{@sell_in}, #{@quality}" end -end \ No newline at end of file +end From 0f683493b0ba974eb207e04263d1cfcb66302458 Mon Sep 17 00:00:00 2001 From: Cyril Lepagnot Date: Tue, 26 Sep 2017 10:05:10 +0200 Subject: [PATCH 4/5] Move item to another item.rb --- ruby/gilded_rose.rb | 14 -------------- ruby/gilded_rose_spec.rb | 3 ++- ruby/item.rb | 13 +++++++++++++ ruby/item_spec.rb | 15 +++++++++++++++ 4 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 ruby/item.rb create mode 100644 ruby/item_spec.rb diff --git a/ruby/gilded_rose.rb b/ruby/gilded_rose.rb index a18b6ba2..20bf3dea 100644 --- a/ruby/gilded_rose.rb +++ b/ruby/gilded_rose.rb @@ -52,17 +52,3 @@ class GildedRose end end end - -class Item - attr_accessor :name, :sell_in, :quality - - def initialize(name:, sell_in:, quality:) - @name = name - @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 1dddb62a..d21f6937 100644 --- a/ruby/gilded_rose_spec.rb +++ b/ruby/gilded_rose_spec.rb @@ -1,6 +1,7 @@ require File.join(File.dirname(__FILE__), 'gilded_rose') +require File.join(File.dirname(__FILE__), 'item') -describe GildedRose do +RSpec.describe GildedRose do subject { Item.new(name: name, sell_in: sell_in, quality: quality) } let(:items) { [subject] } diff --git a/ruby/item.rb b/ruby/item.rb new file mode 100644 index 00000000..5e4f1e9a --- /dev/null +++ b/ruby/item.rb @@ -0,0 +1,13 @@ +class Item + attr_accessor :name, :sell_in, :quality + + def initialize(name:, sell_in:, quality:) + @name = name + @sell_in = sell_in + @quality = quality + end + + def to_s() + "#{@name}, #{@sell_in}, #{@quality}" + end +end diff --git a/ruby/item_spec.rb b/ruby/item_spec.rb new file mode 100644 index 00000000..01aa4ee1 --- /dev/null +++ b/ruby/item_spec.rb @@ -0,0 +1,15 @@ +require File.join(File.dirname(__FILE__), 'item') + +RSpec.describe Item do + let(:item) do + described_class.new( + name: 'a', + sell_in: 0, + quality: 0, + ) + end + + describe '#to_s' do + it { expect(item.to_s).to eq('a, 0, 0') } + end +end From 4a7c5cef3fe2a50203813618a091151eda0958d3 Mon Sep 17 00:00:00 2001 From: Cyril Lepagnot Date: Tue, 26 Sep 2017 10:09:34 +0200 Subject: [PATCH 5/5] Use OpenStruct for item --- ruby/item.rb | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/ruby/item.rb b/ruby/item.rb index 5e4f1e9a..8821fdc3 100644 --- a/ruby/item.rb +++ b/ruby/item.rb @@ -1,13 +1,7 @@ -class Item - attr_accessor :name, :sell_in, :quality +require 'ostruct' - def initialize(name:, sell_in:, quality:) - @name = name - @sell_in = sell_in - @quality = quality - end - - def to_s() - "#{@name}, #{@sell_in}, #{@quality}" +class Item < OpenStruct + def to_s + [name, sell_in, quality].join ', ' end end