updated Hash extensions and specs

This commit is contained in:
2011-03-12 22:21:15 +00:00
parent dcca3556ea
commit 43fc8bc2dd
2 changed files with 30 additions and 18 deletions

View File

@@ -1,21 +1,23 @@
class Hash
def merge_and_incr(hash)
raise ArgumentError unless hash.is_a?(Hash)
hash.each do |key, value|
if value.is_a?(Numeric)
self.set_or_incr(key, value)
else
self[key] = value
end
end
self.clone.merge_and_incr!(hash)
end
def set_or_incr(key, value)
return self unless value.is_a?(Numeric)
self[key] = 0 unless self.has_key?(key)
self[key] += value if self[key].is_a?(Numeric)
def merge_and_incr!(hash)
raise ArgumentError unless hash.is_a?(Hash)
hash.each do |key, value|
self[key] = value unless self.set_or_incr(key, value)
end
self
end
def set_or_incr(key, value)
return false unless value.is_a?(Numeric)
self[key] = 0 unless self.has_key?(key)
return false unless self[key].is_a?(Numeric)
self[key] += value
true
end
end

View File

@@ -4,17 +4,27 @@ describe Hash do
it "should #set_or_incr values" do
hash = {:count => 1}
hash.set_or_incr(:sum, 3)
hash.set_or_incr(:sum, 3).should be_true
hash.should == {:count => 1, :sum => 3}
hash.set_or_incr(:count, 4)
hash.set_or_incr(:count, 4).should be_true
hash.should == {:count => 5, :sum => 3}
hash.set_or_incr(:count, 'test').should be_false
hash.set_or_incr(:view, 'test').should be_false
hash.should == {:count => 5, :sum => 3}
hash[:view] = 'test'
hash.set_or_incr(:view, 3).should be_false
end
it "should #merge_and_incr hashes" do
hash = {:count => 1, :city => 'hell', :sum => 3, :name => 'john'}
new_hash = {:count => 3, :city => 'slum', :views => 2}
hash.merge_and_incr(new_hash)
hash.should == {:count => 4, :sum => 3, :views => 2, :city => 'slum', :name => 'john'}
hash = { :count => 1, :city => 'hell', :sum => 3, :name => 'john' }
new_hash = { :count => 3, :city => 'slum', :views => 2 }
hash.clone.merge_and_incr(new_hash).should == { :count => 4, :city => 'slum', :views => 2,
:sum => 3, :name => 'john' }
new_hash = { :count => 'six', :city => 'slum', :views => 2, :time => 'late' }
hash.clone.merge_and_incr(new_hash).should == { :count => 'six', :city => 'slum', :views => 2,
:sum => 3, :name => 'john', :time => 'late' }
end
end