Fixed OrderedHash merge bug. New tests for OrderedHash.
This commit is contained in:
parent
98bbc34fac
commit
cb2d775bb1
|
@ -34,9 +34,20 @@ class OrderedHash < Hash
|
|||
@ordered_keys.each { |k| yield k, self[k] }
|
||||
end
|
||||
|
||||
def values
|
||||
collect { |k, v| v }
|
||||
end
|
||||
|
||||
def merge(other)
|
||||
oh = self.dup
|
||||
oh.merge!(other)
|
||||
oh
|
||||
end
|
||||
|
||||
def merge!(other)
|
||||
@ordered_keys ||= []
|
||||
@ordered_keys += other.keys # unordered if not an OrderedHash
|
||||
@ordered_keys.uniq!
|
||||
super(other)
|
||||
end
|
||||
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
|
||||
require 'mongo/util/ordered_hash'
|
||||
require 'test/unit'
|
||||
|
||||
# NOTE: assumes Mongo is running
|
||||
class OrderedHashTest < Test::Unit::TestCase
|
||||
|
||||
def setup
|
||||
@oh = OrderedHash.new
|
||||
@oh['c'] = 1
|
||||
@oh['a'] = 2
|
||||
@oh['z'] = 3
|
||||
@ordered_keys = %w(c a z)
|
||||
end
|
||||
|
||||
def test_empty
|
||||
assert_equal [], OrderedHash.new.keys
|
||||
end
|
||||
|
||||
def test_order_preserved
|
||||
assert_equal @ordered_keys, @oh.keys
|
||||
end
|
||||
|
||||
def test_order_preserved_after_replace
|
||||
@oh['a'] = 42
|
||||
assert_equal @ordered_keys, @oh.keys
|
||||
@oh['c'] = 'foobar'
|
||||
assert_equal @ordered_keys, @oh.keys
|
||||
@oh['z'] = /huh?/
|
||||
assert_equal @ordered_keys, @oh.keys
|
||||
end
|
||||
|
||||
def test_each
|
||||
keys = []
|
||||
@oh.each { |k, v| keys << k }
|
||||
assert_equal keys, @oh.keys
|
||||
|
||||
@oh['z'] = 42
|
||||
assert_equal keys, @oh.keys
|
||||
end
|
||||
|
||||
def test_values
|
||||
assert_equal [1, 2, 3], @oh.values
|
||||
end
|
||||
|
||||
def test_merge
|
||||
other = OrderedHash.new
|
||||
other['f'] = 'foo'
|
||||
noob = @oh.merge(other)
|
||||
assert_equal @ordered_keys + ['f'], noob.keys
|
||||
assert_equal [1, 2, 3, 'foo'], noob.values
|
||||
end
|
||||
|
||||
def test_merge_bang
|
||||
other = OrderedHash.new
|
||||
other['f'] = 'foo'
|
||||
@oh.merge!(other)
|
||||
assert_equal @ordered_keys + ['f'], @oh.keys
|
||||
assert_equal [1, 2, 3, 'foo'], @oh.values
|
||||
end
|
||||
|
||||
def test_merge_bang_with_overlap
|
||||
other = OrderedHash.new
|
||||
other['a'] = 'apple'
|
||||
other['c'] = 'crab'
|
||||
other['f'] = 'foo'
|
||||
@oh.merge!(other)
|
||||
assert_equal @ordered_keys + ['f'], @oh.keys
|
||||
assert_equal ['crab', 'apple', 3, 'foo'], @oh.values
|
||||
end
|
||||
|
||||
def test_merge_bang_with_hash_with_overlap
|
||||
other = Hash.new
|
||||
other['a'] = 'apple'
|
||||
other['c'] = 'crab'
|
||||
other['f'] = 'foo'
|
||||
@oh.merge!(other)
|
||||
assert_equal @ordered_keys + ['f'], @oh.keys
|
||||
assert_equal ['crab', 'apple', 3, 'foo'], @oh.values
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue