From d87dfa2ef6d5a444678380a94cf640b6b90e8662 Mon Sep 17 00:00:00 2001 From: Joseph Yin Date: Sat, 4 Feb 2023 21:22:04 -0500 Subject: [PATCH] Refactor: update_quality & award --- award.rb | 103 ++++++++++++++++++++++++++++++++++++++++- update_quality.rb | 44 +----------------- update_quality_spec.rb | 2 +- 3 files changed, 104 insertions(+), 45 deletions(-) diff --git a/award.rb b/award.rb index 5208232..6b8add1 100644 --- a/award.rb +++ b/award.rb @@ -1 +1,102 @@ -Award = Struct.new(:name, :expires_in, :quality) +class Award + + @@award_type = [ + 'NORMAL ITEM', + 'Blue Star', + 'Blue First', + 'Blue Compare', + 'Blue Distinction Plus' + ] + + attr_reader :name, :expires_in, :quality + + def initialize(name, expires_in, quality) + @name = name + @expires_in = expires_in + @quality = quality + end + + def update_quality + transaction(self.clone) do + downcase_name = name.downcase + raise "Error: Unknow Award Name -- #{@name}" if !@@award_type.map(&:downcase).include? downcase_name + + send "update_#{downcase_name.gsub(' ', '_')}".to_sym + end + end + + def expired? + @expires_in < 1 + end + + private + + # NORMAL ITEM + def update_normal_item + decrease_quality(1) + decrease_quality(1) if expired? + decrease_expires_in + end + + # Blue Star + def update_blue_star + decrease_quality(2) + decrease_quality(2) if expired? + decrease_expires_in + end + + # Blue First + def update_blue_first + increase_quality(1) + increase_quality(1) if expired? + decrease_expires_in + end + + # Blue Compare + def update_blue_compare + if expired? + decrease_quality(@quality) + elsif expires_in > 10 + increase_quality(1) + elsif expires_in > 5 + increase_quality(2) + else + increase_quality(3) + end + decrease_expires_in + end + + # Blue Distinction Plus + def update_blue_distinction_plus + @quality = 80 + end + + def decrease_expires_in + @expires_in -= 1 + end + + def increase_quality(num) + quality_control { @quality += num } + end + + def decrease_quality(num) + quality_control { @quality -= num } + end + + def quality_control + yield + @quality = [[0, @quality].max, 50].min + end + + def transaction(award_backup) + yield + rescue => e + puts e + @expires_in = award_backup.expires_in + @quality = award_backup.quality + end + + # def method_missing(method_name, *args, &block) + # update_normal_item + # end +end diff --git a/update_quality.rb b/update_quality.rb index bd1f10f..4c3fd04 100644 --- a/update_quality.rb +++ b/update_quality.rb @@ -2,48 +2,6 @@ def update_quality(awards) awards.each do |award| - if award.name != 'Blue First' && award.name != 'Blue Compare' - if award.quality > 0 - if award.name != 'Blue Distinction Plus' - award.quality -= 1 - end - end - else - if award.quality < 50 - award.quality += 1 - if award.name == 'Blue Compare' - if award.expires_in < 11 - if award.quality < 50 - award.quality += 1 - end - end - if award.expires_in < 6 - if award.quality < 50 - award.quality += 1 - end - end - end - end - end - if award.name != 'Blue Distinction Plus' - award.expires_in -= 1 - end - if award.expires_in < 0 - if award.name != 'Blue First' - if award.name != 'Blue Compare' - if award.quality > 0 - if award.name != 'Blue Distinction Plus' - award.quality -= 1 - end - end - else - award.quality = award.quality - award.quality - end - else - if award.quality < 50 - award.quality += 1 - end - end - end + award.update_quality end end diff --git a/update_quality_spec.rb b/update_quality_spec.rb index 973940d..de75e1d 100644 --- a/update_quality_spec.rb +++ b/update_quality_spec.rb @@ -177,7 +177,7 @@ end context 'given a Blue Star award' do - before { pending } + # before { pending } let(:name) { 'Blue Star' } before { award.expires_in.should == initial_expires_in-1 }