diff --git a/award.rb b/award.rb index 5208232..c3bf64d 100644 --- a/award.rb +++ b/award.rb @@ -1 +1,85 @@ -Award = Struct.new(:name, :expires_in, :quality) +# frozen_string_literal: true + +# Award class +class Award + attr_accessor :name, :expires_in, :quality + + AWARDS = ['Blue Compare', 'Blue First', 'Blue Distinction Plus', 'Blue Star'].freeze + + def initialize(name, expires_in, quality) + @name = name + @expires_in = expires_in + @quality = quality + end + + def update_quality + return update unless AWARDS.include?(@name) + + Object.const_get(@name.delete(' ')).new(self).update + end + + def update + @quality -= 1 if @quality.positive? + @expires_in -= 1 + @quality -= 1 if @expires_in <= 0 && @quality.positive? + end +end + +# blue_compare class +class BlueCompare + def initialize(award) + @award = award + end + + def update + if @award.expires_in <= 0 + @award.quality = 0 + elsif @award.expires_in <= 5 + @award.quality += 3 + elsif @award.expires_in <= 10 + @award.quality += 2 + else + @award.quality += 1 + end + + @award.quality = 50 if @award.quality > 50 + @award.expires_in -= 1 + end +end + +# blue_first class +class BlueFirst + def initialize(award) + @award = award + end + + def update + @award.quality += @award.expires_in.positive? ? 1 : 2 + @award.quality = 50 if @award.quality > 50 + @award.expires_in -= 1 + end +end + +# blue_distinction_plus class +class BlueDistinctionPlus + def initialize(award) + @award = award + end + + def update + @award + end +end + +# blue_star class +class BlueStar + def initialize(award) + @award = award + end + + def update + @award.quality -= 2 if @award.quality.positive? + @award.expires_in -= 1 + @award.quality -= 2 if @award.expires_in <= 0 && @award.quality.positive? + end +end diff --git a/update_quality.rb b/update_quality.rb index bd1f10f..e417de8 100644 --- a/update_quality.rb +++ b/update_quality.rb @@ -1,49 +1,6 @@ -require 'award' +# frozen_string-literal: true +# update award functionality 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 - end + awards.each(&:update_quality) end diff --git a/update_quality_spec.rb b/update_quality_spec.rb index 973940d..937527f 100644 --- a/update_quality_spec.rb +++ b/update_quality_spec.rb @@ -1,5 +1,6 @@ require 'rspec' require 'update_quality' +require 'award' describe '#update_quality' do @@ -8,6 +9,7 @@ let(:initial_quality) { 10 } let(:award) { Award.new(name, initial_expires_in, initial_quality) } + context 'when quality is updated' do before do update_quality([award]) @@ -177,7 +179,6 @@ end context 'given a Blue Star award' do - before { pending } let(:name) { 'Blue Star' } before { award.expires_in.should == initial_expires_in-1 }