1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
require "spec_helper"
require "hamster/set"
require 'set'
describe Hamster::Set do
[:include?, :member?].each do |method|
describe "##{method}" do
let(:set) { S["A", "B", "C", 2.0, nil] }
["A", "B", "C", 2.0, nil].each do |value|
it "returns true for an existing value (#{value.inspect})" do
set.send(method, value).should == true
end
end
it "returns false for a non-existing value" do
set.send(method, "D").should == false
end
it "returns true even if existing value is nil" do
S[nil].include?(nil).should == true
end
it "returns true even if existing value is false" do
S[false].include?(false).should == true
end
it "returns false for a mutable item which is mutated after adding" do
item = ['mutable']
item = [rand(1000000)] while (item.hash.abs & 31 == [item[0], 'HOSED!'].hash.abs & 31)
set = S[item]
item.push('HOSED!')
set.include?(item).should == false
end
it "uses #eql? for equality" do
set.send(method, 2).should == false
end
it "returns the right answers after a lot of addings and removings" do
array, set, rb_set = [], S.new, ::Set.new
1000.times do
if rand(2) == 0
array << (item = rand(10000))
rb_set.add(item)
set = set.add(item)
set.include?(item).should == true
else
item = array.sample
rb_set.delete(item)
set = set.delete(item)
set.include?(item).should == false
end
end
array.each { |item| set.include?(item).should == rb_set.include?(item) }
end
end
end
end
|