1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/library/set/compare_by_identity_spec.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

144 lines
3.5 KiB
Ruby
Raw Normal View History

require_relative '../../spec_helper'
require 'set'
2019-04-27 12:53:23 -04:00
describe "Set#compare_by_identity" do
it "compares its members by identity" do
a = "a"
b1 = "b"
b2 = "b"
set = Set.new
set.compare_by_identity
set.merge([a, a, b1, b2])
set.to_a.sort.should == [a, b1, b2].sort
end
it "causes future comparisons on the receiver to be made by identity" do
elt = [1]
set = Set.new
set << elt
set.member?(elt.dup).should be_true
set.compare_by_identity
set.member?(elt.dup).should be_false
end
it "rehashes internally so that old members can be looked up" do
set = Set.new
(1..10).each { |k| set << k }
o = Object.new
def o.hash; 123; end
set << o
set.compare_by_identity
set.member?(o).should be_true
end
it "returns self" do
set = Set.new
result = set.compare_by_identity
result.should equal(set)
end
it "is idempotent and has no effect on an already compare_by_identity set" do
set = Set.new.compare_by_identity
set << :foo
set.compare_by_identity.should equal(set)
2020-05-03 06:28:29 -04:00
set.should.compare_by_identity?
2019-04-27 12:53:23 -04:00
set.to_a.should == [:foo]
end
it "uses the semantics of BasicObject#equal? to determine members identity" do
:a.equal?(:a).should == true
Set.new.compare_by_identity.merge([:a, :a]).to_a.should == [:a]
ary1 = [1]
ary2 = [1]
ary1.equal?(ary2).should == false
Set.new.compare_by_identity.merge([ary1, ary2]).to_a.sort.should == [ary1, ary2].sort
end
it "uses #equal? semantics, but doesn't actually call #equal? to determine identity" do
set = Set.new.compare_by_identity
obj = mock("equal")
obj.should_not_receive(:equal?)
set << :foo
set << obj
set.to_a.should == [:foo, obj]
end
it "does not call #hash on members" do
elt = mock("element")
elt.should_not_receive(:hash)
set = Set.new.compare_by_identity
set << elt
set.member?(elt).should be_true
end
it "regards #dup'd objects as having different identities" do
a1 = "a"
a2 = a1.dup
set = Set.new.compare_by_identity
set.merge([a1, a2])
set.to_a.sort.should == [a1, a2].sort
end
it "regards #clone'd objects as having different identities" do
a1 = "a"
a2 = a1.clone
set = Set.new.compare_by_identity
set.merge([a1, a2])
set.to_a.sort.should == [a1, a2].sort
end
it "raises a FrozenError on frozen sets" do
2019-04-27 12:53:23 -04:00
set = Set.new.freeze
2019-07-27 06:40:09 -04:00
-> {
set.compare_by_identity
}.should raise_error(FrozenError, /frozen Hash/)
2019-04-27 12:53:23 -04:00
end
it "persists over #dups" do
set = Set.new.compare_by_identity
set << :a
set_dup = set.dup
set_dup.should == set
set_dup << :a
set_dup.to_a.should == [:a]
end
it "persists over #clones" do
set = Set.new.compare_by_identity
set << :a
set_clone = set.clone
set_clone.should == set
set_clone << :a
set_clone.to_a.should == [:a]
end
it "is not equal to set what does not compare by identity" do
Set.new([1, 2]).should == Set.new([1, 2])
Set.new([1, 2]).should_not == Set.new([1, 2]).compare_by_identity
end
end
2019-04-27 12:53:23 -04:00
describe "Set#compare_by_identity?" do
it "returns false by default" do
2020-05-03 06:28:29 -04:00
Set.new.should_not.compare_by_identity?
2019-04-27 12:53:23 -04:00
end
2019-04-27 12:53:23 -04:00
it "returns true once #compare_by_identity has been invoked on self" do
set = Set.new
set.compare_by_identity
2020-05-03 06:28:29 -04:00
set.should.compare_by_identity?
2019-04-27 12:53:23 -04:00
end
2019-04-27 12:53:23 -04:00
it "returns true when called multiple times on the same set" do
set = Set.new
set.compare_by_identity
2020-05-03 06:28:29 -04:00
set.should.compare_by_identity?
set.should.compare_by_identity?
set.should.compare_by_identity?
end
end