Fixed ActiveSupport::OrderedHash #delete_if, #reject!, and #reject, which did not sync the @keys after the operation.

This probably holds true for other mutating methods as well.

Signed-off-by: Michael Koziarski <michael@koziarski.com>
This commit is contained in:
Eloy Duran 2008-12-11 14:12:06 +01:00 committed by Michael Koziarski
parent 69387ce016
commit 7394d12dc7
2 changed files with 46 additions and 1 deletions

@ -25,6 +25,25 @@ def delete(key)
super super
end end
def delete_if
super
sync_keys!
self
end
def reject!
super
sync_keys!
self
end
def reject(&block)
dup.reject!(&block)
end
alias_method :super_keys, :keys
private :super_keys
def keys def keys
@keys @keys
end end
@ -48,6 +67,12 @@ def each_value
def each def each
keys.each {|key| yield [key, self[key]]} keys.each {|key| yield [key, self[key]]}
end end
private
def sync_keys!
(@keys - super_keys).each { |k| @keys.delete(k) }
end
end end
end end
end end

@ -83,4 +83,24 @@ def test_each
def test_each_with_index def test_each_with_index
@ordered_hash.each_with_index { |pair, index| assert_equal [@keys[index], @values[index]], pair} @ordered_hash.each_with_index { |pair, index| assert_equal [@keys[index], @values[index]], pair}
end end
end
def test_delete_if
(copy = @ordered_hash.dup).delete('pink')
assert_equal copy, @ordered_hash.delete_if { |k, _| k == 'pink' }
assert !@ordered_hash.keys.include?('pink')
end
def test_reject!
(copy = @ordered_hash.dup).delete('pink')
@ordered_hash.reject! { |k, _| k == 'pink' }
assert_equal copy, @ordered_hash
assert !@ordered_hash.keys.include?('pink')
end
def test_reject
copy = @ordered_hash.dup
new_ordered_hash = @ordered_hash.reject { |k, _| k == 'pink' }
assert_equal copy, @ordered_hash
assert !new_ordered_hash.keys.include?('pink')
end
end