Skip to content

Instantly share code, notes, and snippets.

@simonkro
Forked from rosic/gilded_rose.rb
Last active August 29, 2015 14:00
Show Gist options
  • Save simonkro/11264526 to your computer and use it in GitHub Desktop.
Save simonkro/11264526 to your computer and use it in GitHub Desktop.
class GildedRose < Struct.new(:name, :days_remaining, :quality)
def tick
return if name == 'Sulfuras, Hand of Ragnaros'
self.days_remaining -= 1
case name
when 'Aged Brie' then
increase_quality
increase_quality if days_remaining < 0
when 'Backstage passes to a TAFKAL80ETC concert'
increase_quality
increase_quality if days_remaining < 5
increase_quality if days_remaining < 10
decrease_quality(quality) if days_remaining < 0
when 'Conjured Mana Cake'
decrease_quality(2)
decrease_quality(2) if days_remaining <= 0
else
decrease_quality
decrease_quality if days_remaining < 0
end
end
protected
def increase_quality(quantity = 1)
self.quality += quantity if quality < 50
end
def decrease_quality(quantity = 1)
self.quality -= quantity if quality > 0
end
end
require "minitest/autorun"
require "minitest/pride"
require_relative './gilded_rose'
class GildedRoseTest < MiniTest::Unit::TestCase
def update_quality_for_item_with(sell_in,
quality,
name = 'normal item',
sell_in_decrease = 1)
item = GildedRose.new(name, sell_in, quality)
item.tick
assert_equal item.days_remaining, sell_in - sell_in_decrease
item
end
def test_normal_item_before_sell_date
item = update_quality_for_item_with(5, 10, 'normal')
assert_equal 9, item.quality
end
def test_normal_item_on_sell_date
item = update_quality_for_item_with(0, 10, 'normal')
assert_equal 8, item.quality
end
def test_normal_item_after_sell_date
item = update_quality_for_item_with(-10, 10, 'normal')
assert_equal 8, item.quality
end
def test_normal_item_of_zero_quality
item = update_quality_for_item_with(5, 0, 'normal')
assert_equal 0, item.quality
end
def test_brie_before_sell_date
item = update_quality_for_item_with(5, 10, 'Aged Brie')
assert_equal 11, item.quality
end
def test_brie_before_sell_date_with_max_quality
item = update_quality_for_item_with(5, 50, 'Aged Brie')
assert_equal 50, item.quality
end
def test_brie_on_sell_date
item = update_quality_for_item_with(0, 10, 'Aged Brie')
assert_equal 12, item.quality
end
def test_brie_on_sell_date_near_max_quality
item = update_quality_for_item_with(5, 49, 'Aged Brie')
assert_equal 50, item.quality
end
def test_brie_on_sell_date_with_max_quality
item = update_quality_for_item_with(5, 50, 'Aged Brie')
assert_equal 50, item.quality
end
def test_brie_after_sell_date
item = update_quality_for_item_with(-10, 10, 'Aged Brie')
assert_equal 12, item.quality
end
def test_brie_after_sell_date_with_max_quality
item = update_quality_for_item_with(-10, 50, 'Aged Brie')
assert_equal 50, item.quality
end
def test_sulfuras_before_sell_date
item = update_quality_for_item_with(5, 80, 'Sulfuras, Hand of Ragnaros', 0)
assert_equal 80, item.quality
end
def test_sulfuras_on_sell_date
item = update_quality_for_item_with(0, 80, 'Sulfuras, Hand of Ragnaros', 0)
assert_equal 80, item.quality
end
def test_sulfuras_after_sell_date
item = update_quality_for_item_with(-10, 80, 'Sulfuras, Hand of Ragnaros', 0)
assert_equal 80, item.quality
end
def test_backstage_pass_long_before_sell_date
item = update_quality_for_item_with(11, 10, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 11, item.quality
end
def test_backstage_pass_medium_close_to_sell_date_upper_bound
item = update_quality_for_item_with(10, 10, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 12, item.quality
end
def test_backstage_pass_medium_close_to_sell_date_upper_bound_at_max_quality
item = update_quality_for_item_with(10, 50, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 50, item.quality
end
def test_backstage_pass_medium_close_to_sell_date_lower_bound
item = update_quality_for_item_with(6, 10, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 12, item.quality
end
def test_backstage_pass_medium_close_to_sell_date_lower_bound_at_max_quality
item = update_quality_for_item_with(6, 50, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 50, item.quality
end
def test_backstage_pass_very_close_to_sell_date_upper_bound
item = update_quality_for_item_with(5, 10, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 13, item.quality
end
def test_backstage_pass_very_close_to_sell_date_upper_bound_at_max_quality
item = update_quality_for_item_with(5, 50, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 50, item.quality
end
def test_backstage_pass_very_close_to_sell_date_lower_bound
item = update_quality_for_item_with(1, 10, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 13, item.quality
end
def test_backstage_pass_very_close_to_sell_date_lower_bound_at_max_quality
item = update_quality_for_item_with(1, 50, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 50, item.quality
end
def test_backstage_pass_on_sell_date
item = update_quality_for_item_with(0, 10, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 0, item.quality
end
def test_backstage_pass_after_sell_date
item = update_quality_for_item_with(-10, 10, 'Backstage passes to a TAFKAL80ETC concert')
assert_equal 0, item.quality
end
def test_conjured_item_before_sell_date
skip
item = update_quality_for_item_with(5, 10, 'Conjured Mana Cake')
assert_equal 8, item.quality
end
def test_conjured_item_at_zero_quality
skip
item = update_quality_for_item_with(5, 0, 'Conjured Mana Cake')
assert_equal 0, item.quality
end
def test_conjured_item_on_sell_date
skip
item = update_quality_for_item_with(0, 10, 'Conjured Mana Cake')
assert_equal 6, item.quality
end
def test_conjured_item_on_sell_date_at_zero_quality
skip
item = update_quality_for_item_with(0, 0, 'Conjured Mana Cake')
assert_equal 0, item.quality
end
def test_conjured_item_after_sell_date
skip
item = update_quality_for_item_with(-10, 10, 'Conjured Mana Cake')
assert_equal 6, item.quality
end
def test_conjured_item_after_sell_date_at_zero_quality
skip
item = update_quality_for_item_with(-10, 0, 'Conjured Mana Cake')
assert_equal 0, item.quality
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment