From 899821440c67d9d208e8f3655e49f870e39236c9 Mon Sep 17 00:00:00 2001 From: Feken Baboyan Date: Thu, 4 Mar 2021 13:19:17 -0500 Subject: [PATCH] Switch ItemFactory to ItemWrapperFactory --- ruby/lib/gilded_rose.rb | 2 +- ruby/lib/gilded_rose/item_factory.rb | 17 ------ ruby/lib/gilded_rose/item_wrapper_factory.rb | 18 ++++++ ruby/lib/gilded_rose/store.rb | 60 +++++++------------ ruby/tests/gilded_rose/item_factory_tests.rb | 27 --------- .../gilded_rose/item_wrapper_factory_tests.rb | 42 +++++++++++++ 6 files changed, 81 insertions(+), 85 deletions(-) delete mode 100644 ruby/lib/gilded_rose/item_factory.rb create mode 100644 ruby/lib/gilded_rose/item_wrapper_factory.rb delete mode 100644 ruby/tests/gilded_rose/item_factory_tests.rb create mode 100644 ruby/tests/gilded_rose/item_wrapper_factory_tests.rb diff --git a/ruby/lib/gilded_rose.rb b/ruby/lib/gilded_rose.rb index 938ce5ce..685d2a74 100644 --- a/ruby/lib/gilded_rose.rb +++ b/ruby/lib/gilded_rose.rb @@ -1,5 +1,5 @@ require File.join(File.dirname(__FILE__), "gilded_rose/store" ) -require File.join(File.dirname(__FILE__), "gilded_rose/item_factory" ) +require File.join(File.dirname(__FILE__), "gilded_rose/item_wrapper_factory" ) module GildedRose end \ No newline at end of file diff --git a/ruby/lib/gilded_rose/item_factory.rb b/ruby/lib/gilded_rose/item_factory.rb deleted file mode 100644 index c6747988..00000000 --- a/ruby/lib/gilded_rose/item_factory.rb +++ /dev/null @@ -1,17 +0,0 @@ -module GildedRose - class ItemFactory - SPECIAL_ITEM_KLASSES = { - "Aged Brie" => AgedBrieItem, - "Backstage passes to a TAFKAL80ETC concert" => BackstagePassesItem, - "Sulfuras, Hand of Ragnaros" => SulfurasItem, - } - - GENERIC_ITEM_KLASS = GenericItem - - def self.create_item(name:, sell_in:, quality:) - klass = SPECIAL_ITEM_KLASSES.fetch(name, GENERIC_ITEM_KLASS) - klass.new(name, sell_in, quality) - end - end -end - diff --git a/ruby/lib/gilded_rose/item_wrapper_factory.rb b/ruby/lib/gilded_rose/item_wrapper_factory.rb new file mode 100644 index 00000000..8066f400 --- /dev/null +++ b/ruby/lib/gilded_rose/item_wrapper_factory.rb @@ -0,0 +1,18 @@ +module GildedRose + class ItemWrapperFactory + + SPECIAL_ITEM_WRAPPER_KLASSES = { + "Aged Brie" => AgedBrieItemWrapper, + "Backstage passes to a TAFKAL80ETC concert" => BackstagePassesItemWrapper, + "Sulfuras, Hand of Ragnaros" => SulfurasItemWrapper, + } + + GENERIC_ITEM_WRAPPER_KLASS = GenericItemWrapper + + def self.wrap(item: ) + klass = SPECIAL_ITEM_WRAPPER_KLASSES.fetch(item.name, GENERIC_ITEM_WRAPPER_KLASS) + klass.new(item: item) + end + end +end + diff --git a/ruby/lib/gilded_rose/store.rb b/ruby/lib/gilded_rose/store.rb index 717c82cb..91f6ff90 100644 --- a/ruby/lib/gilded_rose/store.rb +++ b/ruby/lib/gilded_rose/store.rb @@ -55,7 +55,7 @@ module GildedRose def items @items ||= @raw_items.map do |item| - ItemFactory.create_item(name: item.name, sell_in: item.sell_in, quality: item.quality) + ItemWrapperFactory.wrap(item: item) end end end @@ -74,52 +74,32 @@ module GildedRose end end - class GenericItem < Item + class AbstractItemWrapper + def initialize(item: ) + @item = item + end + def update_quality - if @quality > 0 - @quality -= 1 + if item.quality > 0 + item.quality -= 1 end end def update_sell_in - @sell_in -= 1 + item.sell_in -= 1 end + + def method_missing(method_name, *args) + item.send(method_name, *args) + end + + private + attr_reader :item end - class AgedBrieItem < Item - def update_quality - if @quality > 0 - @quality -= 1 - end - end - - def update_sell_in - @sell_in -= 1 - end - end - - class BackstagePassesItem < Item - def update_quality - if @quality > 0 - @quality -= 1 - end - end - - def update_sell_in - @sell_in -= 1 - end - end - - class SulfurasItem < Item - def update_quality - if @quality > 0 - @quality -= 1 - end - end - - def update_sell_in - @sell_in -= 1 - end - end + class GenericItemWrapper < AbstractItemWrapper; end + class AgedBrieItemWrapper < AbstractItemWrapper; end + class BackstagePassesItemWrapper < AbstractItemWrapper; end + class SulfurasItemWrapper < AbstractItemWrapper; end end diff --git a/ruby/tests/gilded_rose/item_factory_tests.rb b/ruby/tests/gilded_rose/item_factory_tests.rb deleted file mode 100644 index 05022f1f..00000000 --- a/ruby/tests/gilded_rose/item_factory_tests.rb +++ /dev/null @@ -1,27 +0,0 @@ -require_relative '../../lib/gilded_rose' -require 'test/unit' - -module GildedRose - class ItemFactoryTests < Test::Unit::TestCase - test ".create_item returns GenericItem instance if it is not a special item" do - created_item = ItemFactory.create_item(name: "random_item", sell_in: 0, quality: 0) - assert_instance_of GenericItem, created_item - end - - test ".create_item returns AgedBrieItem instance if Aged Brie item is given" do - created_item = ItemFactory.create_item(name: "Aged Brie", sell_in: 0, quality: 0) - assert_instance_of AgedBrieItem, created_item - end - - test ".create_item returns BackstagePassesItem instance if Backstage passes to a TAFKAL80ETC concert item is given" do - created_item = ItemFactory.create_item(name: "Backstage passes to a TAFKAL80ETC concert", sell_in: 0, quality: 0) - assert_instance_of BackstagePassesItem, created_item - end - - test ".create_item returns SulfurasItem instance if Sulfuras, Hand of Ragnaros item is given" do - created_item = ItemFactory.create_item(name: "Sulfuras, Hand of Ragnaros", sell_in: 0, quality: 0) - assert_instance_of SulfurasItem, created_item - end - end -end - diff --git a/ruby/tests/gilded_rose/item_wrapper_factory_tests.rb b/ruby/tests/gilded_rose/item_wrapper_factory_tests.rb new file mode 100644 index 00000000..844c2760 --- /dev/null +++ b/ruby/tests/gilded_rose/item_wrapper_factory_tests.rb @@ -0,0 +1,42 @@ +require_relative '../../lib/gilded_rose' +require 'test/unit' + +module GildedRose + class ItemWrapperFactoryTests < Test::Unit::TestCase + test ".create_item returns GenericItem instance if it is not a special item" do + item = make_item(name: "random_item", sell_in: 0, quality: 0) + + created_item = ItemWrapperFactory.wrap(item: item) + assert_instance_of GenericItemWrapper, created_item + end + + test ".create_item returns AgedBrieItem instance if Aged Brie item is given" do + item = make_item(name: "Aged Brie", sell_in: 0, quality: 0) + + created_item = ItemWrapperFactory.wrap(item: item) + assert_instance_of AgedBrieItemWrapper, created_item + end + + test ".create_item returns BackstagePassesItem instance if Backstage passes to a TAFKAL80ETC concert item is given" do + item = make_item(name: "Backstage passes to a TAFKAL80ETC concert", sell_in: 0, quality: 0) + + created_item = ItemWrapperFactory.wrap(item: item) + assert_instance_of BackstagePassesItemWrapper, created_item + end + + test ".create_item returns SulfurasItem instance if Sulfuras, Hand of Ragnaros item is given" do + item = make_item(name: "Sulfuras, Hand of Ragnaros", sell_in: 0, quality: 0) + + created_item = ItemWrapperFactory.wrap(item: item) + assert_instance_of SulfurasItemWrapper, created_item + end + + + private + + def make_item(name:, sell_in:, quality:) + Item.new(name, sell_in, quality) + end + end +end +