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

Revert "SortedSet was removed at a3db08d7b6ff119223f77e3df00b4f6deac971e2"

* This reverts commit b06ffce4ae.
* Do not revert specs, wrap them with `ruby_version_is` (tool for that in next commit).
This commit is contained in:
Benoit Daloze 2020-12-05 11:16:32 +01:00
parent 5e58a9033f
commit d0bd43c332
52 changed files with 939 additions and 0 deletions

View file

@ -0,0 +1,39 @@
require_relative '../../../spec_helper'
require 'set'
require_relative 'shared/add'
describe "SortedSet#add" do
it_behaves_like :sorted_set_add, :add
it "takes only values which responds <=>" do
obj = mock('no_comparison_operator')
obj.stub!(:respond_to?).with(:<=>).and_return(false)
-> { SortedSet["hello"].add(obj) }.should raise_error(ArgumentError)
end
it "raises on incompatible <=> comparison" do
# Use #to_a here as elements are sorted only when needed.
# Therefore the <=> incompatibility is only noticed on sorting.
-> { SortedSet['1', '2'].add(3).to_a }.should raise_error(ArgumentError)
end
end
describe "SortedSet#add?" do
before :each do
@set = SortedSet.new
end
it "adds the passed Object to self" do
@set.add?("cat")
@set.should include("cat")
end
it "returns self when the Object has not yet been added to self" do
@set.add?("cat").should equal(@set)
end
it "returns nil when the Object has already been added to self" do
@set.add?("cat")
@set.add?("cat").should be_nil
end
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require 'set'
require_relative 'shared/add'
describe "SortedSet#<<" do
it_behaves_like :sorted_set_add, :<<
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require_relative 'shared/include'
require 'set'
describe "SortedSet#===" do
it_behaves_like :sorted_set_include, :===
end

View file

@ -0,0 +1,27 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#classify" do
before :each do
@set = SortedSet["one", "two", "three", "four"]
end
it "yields each Object in self in sorted order" do
res = []
@set.classify { |x| res << x }
res.should == ["one", "two", "three", "four"].sort
end
it "returns an Enumerator when passed no block" do
enum = @set.classify
enum.should be_an_instance_of(Enumerator)
classified = enum.each { |x| x.length }
classified.should == { 3 => SortedSet["one", "two"], 4 => SortedSet["four"], 5 => SortedSet["three"] }
end
it "classifies the Objects in self based on the block's return value" do
classified = @set.classify { |x| x.length }
classified.should == { 3 => SortedSet["one", "two"], 4 => SortedSet["four"], 5 => SortedSet["three"] }
end
end

View file

@ -0,0 +1,17 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#clear" do
before :each do
@set = SortedSet["one", "two", "three", "four"]
end
it "removes all elements from self" do
@set.clear
@set.should be_empty
end
it "returns self" do
@set.clear.should equal(@set)
end
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require 'set'
require_relative 'shared/collect'
describe "SortedSet#collect!" do
it_behaves_like :sorted_set_collect_bang, :collect!
end

View file

@ -0,0 +1,15 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet[]" do
it "returns a new SortedSet populated with the passed Objects" do
set = SortedSet[1, 2, 3]
set.instance_of?(SortedSet).should be_true
set.size.should eql(3)
set.should include(1)
set.should include(2)
set.should include(3)
end
end

View file

@ -0,0 +1,38 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#delete_if" do
before :each do
@set = SortedSet["one", "two", "three"]
end
it "yields each Object in self in sorted order" do
ret = []
@set.delete_if { |x| ret << x }
ret.should == ["one", "two", "three"].sort
end
it "deletes every element from self for which the passed block returns true" do
@set.delete_if { |x| x.size == 3 }
@set.size.should eql(1)
@set.should_not include("one")
@set.should_not include("two")
@set.should include("three")
end
it "returns self" do
@set.delete_if { |x| x }.should equal(@set)
end
it "returns an Enumerator when passed no block" do
enum = @set.delete_if
enum.should be_an_instance_of(Enumerator)
enum.each { |x| x.size == 3 }
@set.should_not include("one")
@set.should_not include("two")
@set.should include("three")
end
end

View file

@ -0,0 +1,37 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#delete" do
before :each do
@set = SortedSet["a", "b", "c"]
end
it "deletes the passed Object from self" do
@set.delete("a")
@set.should_not include("a")
end
it "returns self" do
@set.delete("a").should equal(@set)
@set.delete("x").should equal(@set)
end
end
describe "SortedSet#delete?" do
before :each do
@set = SortedSet["a", "b", "c"]
end
it "deletes the passed Object from self" do
@set.delete?("a")
@set.should_not include("a")
end
it "returns self when the passed Object is in self" do
@set.delete?("a").should equal(@set)
end
it "returns nil when the passed Object is not in self" do
@set.delete?("x").should be_nil
end
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require 'set'
require_relative 'shared/difference'
describe "SortedSet#difference" do
it_behaves_like :sorted_set_difference, :difference
end

View file

@ -0,0 +1,34 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#divide" do
it "divides self into a set of subsets based on the blocks return values" do
set = SortedSet["one", "two", "three", "four", "five"].divide { |x| x.length }
set.map { |x| x.to_a }.to_a.sort.should == [["five", "four"], ["one", "two"], ["three"]]
end
it "yields each Object in self in sorted order" do
ret = []
SortedSet["one", "two", "three", "four", "five"].divide { |x| ret << x }
ret.should == ["one", "two", "three", "four", "five"].sort
end
# BUG: Does not raise a LocalJumpError, but a NoMethodError
#
# it "raises a LocalJumpError when not passed a block" do
# lambda { SortedSet[1].divide }.should raise_error(LocalJumpError)
# end
end
describe "SortedSet#divide when passed a block with an arity of 2" do
it "divides self into a set of subsets based on the blocks return values" do
set = SortedSet[1, 3, 4, 6, 9, 10, 11].divide { |x, y| (x - y).abs == 1 }
set.map { |x| x.to_a }.to_a.sort.should == [[1], [3, 4], [6], [9, 10, 11]]
end
it "yields each two Objects to the block" do
ret = []
SortedSet[1, 2].divide { |x, y| ret << [x, y] }
ret.should == [[1, 1], [1, 2], [2, 1], [2, 2]]
end
end

View file

@ -0,0 +1,26 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#each" do
before :each do
@set = SortedSet[1, 2, 3]
end
it "yields each Object in self in sorted order" do
ret = []
SortedSet["one", "two", "three"].each { |x| ret << x }
ret.should == ["one", "two", "three"].sort
end
it "returns self" do
@set.each { |x| x }.should equal(@set)
end
it "returns an Enumerator when not passed a block" do
enum = @set.each
ret = []
enum.each { |x| ret << x }
ret.sort.should == [1, 2, 3]
end
end

View file

@ -0,0 +1,10 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#empty?" do
it "returns true if self is empty" do
SortedSet[].empty?.should be_true
SortedSet[1].empty?.should be_false
SortedSet[1,2,3].empty?.should be_false
end
end

View file

@ -0,0 +1,16 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#eql?" do
it "returns true when the passed argument is a SortedSet and contains the same elements" do
SortedSet[].should eql(SortedSet[])
SortedSet[1, 2, 3].should eql(SortedSet[1, 2, 3])
SortedSet[1, 2, 3].should eql(SortedSet[3, 2, 1])
# SortedSet["a", :b, ?c].should eql(SortedSet[?c, :b, "a"])
SortedSet[1, 2, 3].should_not eql(SortedSet[1.0, 2, 3])
SortedSet[1, 2, 3].should_not eql(SortedSet[2, 3])
SortedSet[1, 2, 3].should_not eql(SortedSet[])
end
end

View file

@ -0,0 +1,13 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#==" do
it "returns true when the passed Object is a SortedSet and self and the Object contain the same elements" do
SortedSet[].should == SortedSet[]
SortedSet[1, 2, 3].should == SortedSet[1, 2, 3]
SortedSet["1", "2", "3"].should == SortedSet["1", "2", "3"]
SortedSet[1, 2, 3].should_not == SortedSet[1.0, 2, 3]
SortedSet[1, 2, 3].should_not == [1, 2, 3]
end
end

View file

@ -0,0 +1,18 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#^" do
before :each do
@set = SortedSet[1, 2, 3, 4]
end
it "returns a new SortedSet containing elements that are not in both self and the passed Enumerable" do
(@set ^ SortedSet[3, 4, 5]).should == SortedSet[1, 2, 5]
(@set ^ [3, 4, 5]).should == SortedSet[1, 2, 5]
end
it "raises an ArgumentError when passed a non-Enumerable" do
-> { @set ^ 3 }.should raise_error(ArgumentError)
-> { @set ^ Object.new }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,9 @@
require_relative '../../../spec_helper'
require_relative 'shared/select'
require 'set'
ruby_version_is "2.6" do
describe "SortedSet#filter!" do
it_behaves_like :sorted_set_select_bang, :filter!
end
end

View file

@ -0,0 +1,8 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#flatten_merge" do
it "is protected" do
SortedSet.should have_protected_instance_method("flatten_merge")
end
end

View file

@ -0,0 +1,44 @@
require_relative '../../../spec_helper'
require 'set'
# Note: Flatten make little sens on sorted sets, because SortedSets are not (by default)
# comparable. For a SortedSet to be both valid and nested, we need to define a comparison operator:
module SortedSet_FlattenSpecs
class ComparableSortedSet < SortedSet
def <=>(other)
return puts "#{other} vs #{self}" unless other.is_a?(ComparableSortedSet)
to_a <=> other.to_a
end
end
end
describe "SortedSet#flatten" do
it "returns a copy of self with each included SortedSet flattened" do
klass = SortedSet_FlattenSpecs::ComparableSortedSet
set = klass[klass[1,2], klass[3,4], klass[5,6,7], klass[8]]
flattened_set = set.flatten
flattened_set.should_not equal(set)
flattened_set.should == klass[1, 2, 3, 4, 5, 6, 7, 8]
end
end
describe "SortedSet#flatten!" do
it "flattens self" do
klass = SortedSet_FlattenSpecs::ComparableSortedSet
set = klass[klass[1,2], klass[3,4], klass[5,6,7], klass[8]]
set.flatten!
set.should == klass[1, 2, 3, 4, 5, 6, 7, 8]
end
it "returns self when self was modified" do
klass = SortedSet_FlattenSpecs::ComparableSortedSet
set = klass[klass[1,2], klass[3,4]]
set.flatten!.should equal(set)
end
it "returns nil when self was not modified" do
set = SortedSet[1, 2, 3, 4]
set.flatten!.should be_nil
end
end

View file

@ -0,0 +1,13 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#hash" do
it "is static" do
SortedSet[].hash.should == SortedSet[].hash
SortedSet[1, 2, 3].hash.should == SortedSet[1, 2, 3].hash
SortedSet["a", "b", "c"].hash.should == SortedSet["c", "b", "a"].hash
SortedSet[].hash.should_not == SortedSet[1, 2, 3].hash
SortedSet[1, 2, 3].hash.should_not == SortedSet["a", "b", "c"].hash
end
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require_relative 'shared/include'
require 'set'
describe "SortedSet#include?" do
it_behaves_like :sorted_set_include, :include?
end

View file

@ -0,0 +1,30 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#initialize" do
it "is private" do
SortedSet.should have_private_instance_method("initialize")
end
it "adds all elements of the passed Enumerable to self" do
s = SortedSet.new([1, 2, 3])
s.size.should eql(3)
s.should include(1)
s.should include(2)
s.should include(3)
end
it "preprocesses all elements by a passed block before adding to self" do
s = SortedSet.new([1, 2, 3]) { |x| x * x }
s.size.should eql(3)
s.should include(1)
s.should include(4)
s.should include(9)
end
it "raises on incompatible <=> comparison" do
# Use #to_a here as elements are sorted only when needed.
# Therefore the <=> incompatibility is only noticed on sorting.
-> { SortedSet.new(['00', nil]).to_a }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,10 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#inspect" do
it "returns a String representation of self" do
SortedSet[].inspect.should be_kind_of(String)
SortedSet[1, 2, 3].inspect.should be_kind_of(String)
SortedSet["1", "2", "3"].inspect.should be_kind_of(String)
end
end

View file

@ -0,0 +1,11 @@
require_relative '../../../spec_helper'
require_relative 'shared/intersection'
require 'set'
describe "SortedSet#intersection" do
it_behaves_like :sorted_set_intersection, :intersection
end
describe "SortedSet#&" do
it_behaves_like :sorted_set_intersection, :&
end

View file

@ -0,0 +1,31 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#keep_if" do
before :each do
@set = SortedSet["one", "two", "three"]
end
it "yields each Object in self in sorted order" do
ret = []
@set.keep_if { |x| ret << x }
ret.should == ["one", "two", "three"].sort
end
it "keeps every element from self for which the passed block returns true" do
@set.keep_if { |x| x.size != 3 }
@set.to_a.should == ["three"]
end
it "returns self" do
@set.keep_if {}.should equal(@set)
end
it "returns an Enumerator when passed no block" do
enum = @set.keep_if
enum.should be_an_instance_of(Enumerator)
enum.each { |x| x.size != 3 }
@set.to_a.should == ["three"]
end
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require_relative 'shared/length'
require 'set'
describe "SortedSet#length" do
it_behaves_like :sorted_set_length, :length
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require 'set'
require_relative 'shared/collect'
describe "SortedSet#map!" do
it_behaves_like :sorted_set_collect_bang, :map!
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require_relative 'shared/include'
require 'set'
describe "SortedSet#member?" do
it_behaves_like :sorted_set_include, :member?
end

View file

@ -0,0 +1,19 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#merge" do
it "adds the elements of the passed Enumerable to self" do
SortedSet["a", "b"].merge(SortedSet["b", "c", "d"]).should == SortedSet["a", "b", "c", "d"]
SortedSet[1, 2].merge([3, 4]).should == SortedSet[1, 2, 3, 4]
end
it "returns self" do
set = SortedSet[1, 2]
set.merge([3, 4]).should equal(set)
end
it "raises an ArgumentError when passed a non-Enumerable" do
-> { SortedSet[1, 2].merge(1) }.should raise_error(ArgumentError)
-> { SortedSet[1, 2].merge(Object.new) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require 'set'
require_relative 'shared/difference'
describe "SortedSet#-" do
it_behaves_like :sorted_set_difference, :-
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require_relative 'shared/union'
require 'set'
describe "SortedSet#+" do
it_behaves_like :sorted_set_union, :+
end

View file

@ -0,0 +1,10 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#pretty_print_cycle" do
it "passes the 'pretty print' representation of a self-referencing SortedSet to the pretty print writer" do
pp = mock("PrettyPrint")
pp.should_receive(:text).with("#<SortedSet: {...}>")
SortedSet[1, 2, 3].pretty_print_cycle(pp)
end
end

View file

@ -0,0 +1,17 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#pretty_print" do
it "passes the 'pretty print' representation of self to the pretty print writer" do
pp = mock("PrettyPrint")
set = SortedSet[1, 2, 3]
pp.should_receive(:text).with("#<SortedSet: {")
pp.should_receive(:text).with("}>")
pp.should_receive(:nest).with(1).and_yield
pp.should_receive(:seplist).with(set)
set.pretty_print(pp)
end
end

View file

@ -0,0 +1,33 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#proper_subset?" do
before :each do
@set = SortedSet[1, 2, 3, 4]
end
it "returns true if passed a SortedSet that self is a proper subset of" do
SortedSet[].proper_subset?(@set).should be_true
SortedSet[].proper_subset?(SortedSet[1, 2, 3]).should be_true
SortedSet[].proper_subset?(SortedSet["a", "b", "c"]).should be_true
SortedSet[1, 2, 3].proper_subset?(@set).should be_true
SortedSet[1, 3].proper_subset?(@set).should be_true
SortedSet[1, 2].proper_subset?(@set).should be_true
SortedSet[1].proper_subset?(@set).should be_true
SortedSet[5].proper_subset?(@set).should be_false
SortedSet[1, 5].proper_subset?(@set).should be_false
SortedSet["test"].proper_subset?(@set).should be_false
@set.proper_subset?(@set).should be_false
SortedSet[].proper_subset?(SortedSet[]).should be_false
end
it "raises an ArgumentError when passed a non-SortedSet" do
-> { SortedSet[].proper_subset?([]) }.should raise_error(ArgumentError)
-> { SortedSet[].proper_subset?(1) }.should raise_error(ArgumentError)
-> { SortedSet[].proper_subset?("test") }.should raise_error(ArgumentError)
-> { SortedSet[].proper_subset?(Object.new) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,33 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#proper_superset?" do
before :each do
@set = SortedSet[1, 2, 3, 4]
end
it "returns true if passed a SortedSet that self is a proper superset of" do
@set.proper_superset?(SortedSet[]).should be_true
SortedSet[1, 2, 3].proper_superset?(SortedSet[]).should be_true
SortedSet["a", "b", "c"].proper_superset?(SortedSet[]).should be_true
@set.proper_superset?(SortedSet[1, 2, 3]).should be_true
@set.proper_superset?(SortedSet[1, 3]).should be_true
@set.proper_superset?(SortedSet[1, 2]).should be_true
@set.proper_superset?(SortedSet[1]).should be_true
@set.proper_superset?(SortedSet[5]).should be_false
@set.proper_superset?(SortedSet[1, 5]).should be_false
@set.proper_superset?(SortedSet["test"]).should be_false
@set.proper_superset?(@set).should be_false
SortedSet[].proper_superset?(SortedSet[]).should be_false
end
it "raises an ArgumentError when passed a non-SortedSet" do
-> { SortedSet[].proper_superset?([]) }.should raise_error(ArgumentError)
-> { SortedSet[].proper_superset?(1) }.should raise_error(ArgumentError)
-> { SortedSet[].proper_superset?("test") }.should raise_error(ArgumentError)
-> { SortedSet[].proper_superset?(Object.new) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,42 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#reject!" do
before :each do
@set = SortedSet["one", "two", "three"]
end
it "yields each Object in self in sorted order" do
res = []
@set.reject! { |x| res << x }
res.should == ["one", "two", "three"].sort
end
it "deletes every element from self for which the passed block returns true" do
@set.reject! { |x| x.size == 3 }
@set.size.should eql(1)
@set.should_not include("one")
@set.should_not include("two")
@set.should include("three")
end
it "returns self when self was modified" do
@set.reject! { |x| true }.should equal(@set)
end
it "returns nil when self was not modified" do
@set.reject! { |x| false }.should be_nil
end
it "returns an Enumerator when passed no block" do
enum = @set.reject!
enum.should be_an_instance_of(Enumerator)
enum.each { |x| x.size == 3 }
@set.should_not include("one")
@set.should_not include("two")
@set.should include("three")
end
end

View file

@ -0,0 +1,17 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#replace" do
before :each do
@set = SortedSet["a", "b", "c"]
end
it "replaces the contents with other and returns self" do
@set.replace(SortedSet[1, 2, 3]).should == @set
@set.should == SortedSet[1, 2, 3]
end
it "accepts any enumerable as other" do
@set.replace([1, 2, 3]).should == SortedSet[1, 2, 3]
end
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require_relative 'shared/select'
require 'set'
describe "SortedSet#select!" do
it_behaves_like :sorted_set_select_bang, :select!
end

View file

@ -0,0 +1,14 @@
describe :sorted_set_add, shared: true do
before :each do
@set = SortedSet.new
end
it "adds the passed Object to self" do
@set.send(@method, "dog")
@set.should include("dog")
end
it "returns self" do
@set.send(@method, "dog").should equal(@set)
end
end

View file

@ -0,0 +1,20 @@
describe :sorted_set_collect_bang, shared: true do
before :each do
@set = SortedSet[1, 2, 3, 4, 5]
end
it "yields each Object in self in sorted order" do
res = []
SortedSet["one", "two", "three"].send(@method) { |x| res << x; x }
res.should == ["one", "two", "three"].sort
end
it "returns self" do
@set.send(@method) { |x| x }.should equal(@set)
end
it "replaces self with the return values of the block" do
@set.send(@method) { |x| x * 2 }
@set.should == SortedSet[2, 4, 6, 8, 10]
end
end

View file

@ -0,0 +1,15 @@
describe :sorted_set_difference, shared: true do
before :each do
@set = SortedSet["a", "b", "c"]
end
it "returns a new SortedSet containing self's elements excluding the elements in the passed Enumerable" do
@set.send(@method, SortedSet["a", "b"]).should == SortedSet["c"]
@set.send(@method, ["b", "c"]).should == SortedSet["a"]
end
it "raises an ArgumentError when passed a non-Enumerable" do
-> { @set.send(@method, 1) }.should raise_error(ArgumentError)
-> { @set.send(@method, Object.new) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,7 @@
describe :sorted_set_include, shared: true do
it "returns true when self contains the passed Object" do
set = SortedSet["a", "b", "c"]
set.send(@method, "a").should be_true
set.send(@method, "e").should be_false
end
end

View file

@ -0,0 +1,15 @@
describe :sorted_set_intersection, shared: true do
before :each do
@set = SortedSet["a", "b", "c"]
end
it "returns a new SortedSet containing only elements shared by self and the passed Enumerable" do
@set.send(@method, SortedSet["b", "c", "d", "e"]).should == SortedSet["b", "c"]
@set.send(@method, ["b", "c", "d"]).should == SortedSet["b", "c"]
end
it "raises an ArgumentError when passed a non-Enumerable" do
-> { @set.send(@method, 1) }.should raise_error(ArgumentError)
-> { @set.send(@method, Object.new) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,6 @@
describe :sorted_set_length, shared: true do
it "returns the number of elements in the set" do
set = SortedSet["a", "b", "c"]
set.send(@method).should == 3
end
end

View file

@ -0,0 +1,35 @@
require_relative '../../../../spec_helper'
require 'set'
describe :sorted_set_select_bang, shared: true do
before :each do
@set = SortedSet["one", "two", "three"]
end
it "yields each Object in self in sorted order" do
res = []
@set.send(@method) { |x| res << x }
res.should == ["one", "two", "three"].sort
end
it "keeps every element from self for which the passed block returns true" do
@set.send(@method) { |x| x.size != 3 }
@set.to_a.should == ["three"]
end
it "returns self when self was modified" do
@set.send(@method) { false }.should equal(@set)
end
it "returns nil when self was not modified" do
@set.send(@method) { true }.should be_nil
end
it "returns an Enumerator when passed no block" do
enum = @set.send(@method)
enum.should be_an_instance_of(Enumerator)
enum.each { |x| x.size != 3 }
@set.to_a.should == ["three"]
end
end

View file

@ -0,0 +1,15 @@
describe :sorted_set_union, shared: true do
before :each do
@set = SortedSet["a", "b", "c"]
end
it "returns a new SortedSet containing all elements of self and the passed Enumerable" do
@set.send(@method, SortedSet["b", "d", "e"]).should == SortedSet["a", "b", "c", "d", "e"]
@set.send(@method, ["b", "e"]).should == SortedSet["a", "b", "c", "e"]
end
it "raises an ArgumentError when passed a non-Enumerable" do
-> { @set.send(@method, 1) }.should raise_error(ArgumentError)
-> { @set.send(@method, Object.new) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,7 @@
require_relative '../../../spec_helper'
require_relative 'shared/length'
require 'set'
describe "SortedSet#size" do
it_behaves_like :sorted_set_length, :size
end

View file

@ -0,0 +1,33 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#subset?" do
before :each do
@set = SortedSet[1, 2, 3, 4]
end
it "returns true if passed a SortedSet that is equal to self or self is a subset of" do
@set.subset?(@set).should be_true
SortedSet[].subset?(SortedSet[]).should be_true
SortedSet[].subset?(@set).should be_true
SortedSet[].subset?(SortedSet[1, 2, 3]).should be_true
SortedSet[].subset?(SortedSet["a", "b", "c"]).should be_true
SortedSet[1, 2, 3].subset?(@set).should be_true
SortedSet[1, 3].subset?(@set).should be_true
SortedSet[1, 2].subset?(@set).should be_true
SortedSet[1].subset?(@set).should be_true
SortedSet[5].subset?(@set).should be_false
SortedSet[1, 5].subset?(@set).should be_false
SortedSet["test"].subset?(@set).should be_false
end
it "raises an ArgumentError when passed a non-SortedSet" do
-> { SortedSet[].subset?([]) }.should raise_error(ArgumentError)
-> { SortedSet[].subset?(1) }.should raise_error(ArgumentError)
-> { SortedSet[].subset?("test") }.should raise_error(ArgumentError)
-> { SortedSet[].subset?(Object.new) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,17 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#subtract" do
before :each do
@set = SortedSet["a", "b", "c"]
end
it "deletes any elements contained in other and returns self" do
@set.subtract(SortedSet["b", "c"]).should == @set
@set.should == SortedSet["a"]
end
it "accepts any enumerable as other" do
@set.subtract(["c"]).should == SortedSet["a", "b"]
end
end

View file

@ -0,0 +1,33 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#superset?" do
before :each do
@set = SortedSet[1, 2, 3, 4]
end
it "returns true if passed a SortedSet that equals self or self is a proper superset of" do
@set.superset?(@set).should be_true
SortedSet[].superset?(SortedSet[]).should be_true
@set.superset?(SortedSet[]).should be_true
SortedSet[1, 2, 3].superset?(SortedSet[]).should be_true
SortedSet["a", "b", "c"].superset?(SortedSet[]).should be_true
@set.superset?(SortedSet[1, 2, 3]).should be_true
@set.superset?(SortedSet[1, 3]).should be_true
@set.superset?(SortedSet[1, 2]).should be_true
@set.superset?(SortedSet[1]).should be_true
@set.superset?(SortedSet[5]).should be_false
@set.superset?(SortedSet[1, 5]).should be_false
@set.superset?(SortedSet["test"]).should be_false
end
it "raises an ArgumentError when passed a non-SortedSet" do
-> { SortedSet[].superset?([]) }.should raise_error(ArgumentError)
-> { SortedSet[].superset?(1) }.should raise_error(ArgumentError)
-> { SortedSet[].superset?("test") }.should raise_error(ArgumentError)
-> { SortedSet[].superset?(Object.new) }.should raise_error(ArgumentError)
end
end

View file

@ -0,0 +1,17 @@
require_relative '../../../spec_helper'
require 'set'
describe "SortedSet#to_a" do
it "returns an array containing elements" do
set = SortedSet.new [1, 2, 3]
set.to_a.should == [1, 2, 3]
end
it "returns a sorted array containing elements" do
set = SortedSet[2, 3, 1]
set.to_a.should == [1, 2, 3]
set = SortedSet.new [5, 6, 4, 4]
set.to_a.should == [4, 5, 6]
end
end

View file

@ -0,0 +1,11 @@
require_relative '../../../spec_helper'
require_relative 'shared/union'
require 'set'
describe "SortedSet#union" do
it_behaves_like :sorted_set_union, :union
end
describe "SortedSet#|" do
it_behaves_like :sorted_set_union, :|
end