Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 77 additions & 1 deletion award.rb
Original file line number Diff line number Diff line change
@@ -1 +1,77 @@
Award = Struct.new(:name, :expires_in, :quality)
class Award
attr_accessor :name, :expires_in, :quality

# Award type constants
BLUE_FIRST = 'Blue First'
BLUE_COMPARE = 'Blue Compare'
BLUE_DISTINCTION_PLUS = 'Blue Distinction Plus'
BLUE_STAR = 'Blue Star'

# Quality constraints
MIN_QUALITY = 0
MAX_QUALITY = 50

def initialize(name, expires_in, quality)
@name = name
@expires_in = expires_in
@quality = quality
end

def update_quality
return if @name == BLUE_DISTINCTION_PLUS

adjust_quality

@expires_in -= 1

adjust_quality_for_expiration if @expires_in < 0
end

private

def adjust_quality
case @name
when BLUE_FIRST
increase_quality(1)

when BLUE_COMPARE
increase_quality(quality_increase_for_blue_compare)

when BLUE_STAR
decrease_quality(2)

else
decrease_quality(1)
end
end

def adjust_quality_for_expiration
case @name
when BLUE_FIRST
increase_quality(1) # Gets better with age, even after expiration

when BLUE_COMPARE
@quality = 0 # Drops to zero immediately after expiration

when BLUE_STAR
decrease_quality(2) # Degrades twice as fast = 4 total per day

else
decrease_quality(1) # Normal awards degrade twice as fast = 2 total per day
end
end

def quality_increase_for_blue_compare
return 3 if @expires_in <= 5
return 2 if @expires_in <= 10
1
end

def increase_quality(amount)
@quality = [@quality + amount, MAX_QUALITY].min
end

def decrease_quality(amount)
@quality = [@quality - amount, MIN_QUALITY].max
end
end
44 changes: 1 addition & 43 deletions update_quality.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
1 change: 0 additions & 1 deletion update_quality_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,6 @@
end

context 'given a Blue Star award' do
before { pending }
let(:name) { 'Blue Star' }
before { award.expires_in.should == initial_expires_in-1 }

Expand Down