From: Christoph Date: 2002-09-04T06:17:06+09:00 Subject: Set.rb patch This is a multi-part message in MIME format. ------=_NextPart_000_0001_01C2539F.9D3F1DE0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, the included patch set.rb.diff resolves bugs in initialize, flatten(!), eql? and adds sub/super set relations to the newly imported Set class. The patch set.rb.more.diff makes the comparisons ==, eql? more type strict similar to class Array alias __type_weak_comp == def ==(r) return false unless instance_of?(r.type) __type_weak_comp(r) end end (I wrongly assumed that this was the current Ruby ``equal way'') and adds a block option to initialize and contain?. Generally I think that the Set class is so close to the Hash Class that it could(should?) be defined (may be together with a MultiSet class) in Hash.c itself? /Christoph ------=_NextPart_000_0001_01C2539F.9D3F1DE0 Content-Type: application/octet-stream; name="Set.rb.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="Set.rb.diff" --- set.rb.orig 2002-09-02 00:36:49.000000000 +0200=0A= +++ set.rb 2002-09-03 23:05:39.000000000 +0200=0A= @@ -22,14 +22,14 @@=0A= =0A= set1 =3D Set.new ["foo", "bar", "baz"]=0A= =0A= - p set1 #=3D> #=0A= + p set1 #=3D> #=0A= =0A= - p set1.include?("bar") #=3D> true=0A= + p set1.include?("bar") #=3D> true=0A= =0A= set1.add("heh")=0A= set1.delete("foo")=0A= =0A= - p set1 #=3D> #=0A= + p set1 #=3D> #=0A= =0A= =3D=3D Set class=0A= Set implements a collection of unordered values with no duplicates.=0A= @@ -41,11 +41,13 @@=0A= =0A= =3D=3D=3D Included Modules=0A= Enumerable=0A= + Comparable=0A= =0A= =3D=3D=3D Class Methods=0A= --- Set::new(enum =3D nil)=0A= Creates a new set containing the elements of the given enumerable=0A= - object.=0A= + object. If a block is given the elements of enum are preprocessed=0A= + by the given block. =0A= =0A= --- Set[*ary]=0A= Creates a new set containing the given objects.=0A= @@ -135,7 +137,11 @@=0A= =0A= --- =3D=3D set=0A= Returns true if two sets are equal. The equality of each couple=0A= - of elements is defined according to Object#eql?.=0A= + of elements is defined according to Object#=3D=3D.=0A= +=0A= +--- <=3D> set=0A= + Returns -1,1 or 0 if self is a subset, is to equal or is a superset=0A= + of set. If none of latter is true <=3D> returns nil.=0A= =0A= --- classify { |o| ... }=0A= Classifies the set by the return value of the given block and=0A= @@ -180,17 +186,17 @@=0A= =0A= class Set=0A= include Enumerable=0A= + include Comparable=0A= =0A= def self.[](*ary)=0A= new(ary)=0A= end=0A= =0A= def initialize(enum =3D nil)=0A= - @hash =3D {}=0A= -=0A= - if enum=0A= + @hash =3D Hash.new=0A= + unless enum.nil?=0A= enum.is_a?(Enumerable) or raise ArgumentError, "value must be = enumerable"=0A= - enum.each { |o| @hash[o] =3D true } =0A= + enum.each { |o| @hash[o] =3D true }=0A= end=0A= end=0A= =0A= @@ -225,34 +231,33 @@=0A= @hash.keys=0A= end=0A= =0A= - def _flatten(set, ids =3D type.new, result =3D type.new)=0A= - setid =3D set.id=0A= -=0A= - ids.include?(setid) and raise ArgumentError, "tried to flatten = recursive #{type.name}"=0A= -=0A= - ids.add(setid)=0A= -=0A= - set.each { |o|=0A= - if o.is_a?(type)=0A= - _flatten(o, ids, result)=0A= + protected=0A= + def _flatten(set, seen)=0A= + set.each {|e|=0A= + if Set =3D=3D=3D e=0A= + if seen.include?(e_id =3D e.id)=0A= + raise ArgumentError, "tried to flatten recursive Set"=0A= + end=0A= + seen.add e_id=0A= + _flatten(e,seen)=0A= + seen.delete e_id=0A= else=0A= - result.add(o)=0A= + add(e)=0A= end=0A= }=0A= -=0A= - result=0A= + self=0A= end=0A= - private :_flatten=0A= -=0A= + =0A= + public=0A= def flatten=0A= - _flatten(self)=0A= + type.new._flatten(self, Set.new)=0A= end=0A= -=0A= + =0A= def flatten!=0A= - ids =3D type.new=0A= - replace(_flatten(self, ids))=0A= -=0A= - ids.size =3D=3D 1 ? nil : self=0A= + if any? {|e| Set =3D=3D=3D e }=0A= + @hash.replace flatten.instance_eval {@hash }=0A= + self=0A= + end=0A= end=0A= =0A= def include?(o)=0A= @@ -261,9 +266,10 @@=0A= alias member? include?=0A= =0A= def contain?(enum)=0A= - enum.is_a?(Enumerable) or raise ArgumentError, "value must be = enumerable"=0A= - enum.each { |o| include?(o) or return false }=0A= - true=0A= + Enumerable =3D=3D=3D enum or raise ArgumentError, "value must be = enumerable"=0A= + unless block_given?=0A= + enum.all? { |o| include?(o) }=0A= + end=0A= end=0A= =0A= def each=0A= @@ -309,7 +315,7 @@=0A= enum.each { |o| n.add(o) }=0A= n=0A= end=0A= - alias | + ##=0A= + alias | + ##=0A= =0A= def -(enum)=0A= enum.is_a?(Enumerable) or raise ArgumentError, "value must be = enumerable"=0A= @@ -334,20 +340,32 @@=0A= =0A= def =3D=3D(set)=0A= equal?(set) and return true=0A= -=0A= - set.is_a?(type) && size =3D=3D set.size or return false=0A= -=0A= - set.each { |o| include?(o) or return false }=0A= -=0A= - true=0A= + unless Set =3D=3D=3D set and size =3D=3D set.size=0A= + false=0A= + else=0A= + all? { |e| set.include?(e) }=0A= + end=0A= end=0A= =0A= def hash=0A= @hash.hash=0A= end=0A= =0A= - def eql?(o)=0A= - @hash =3D=3D o.hash=0A= + alias eql? =3D=3D=0A= + =0A= + def <=3D>(o)=0A= + Set =3D=3D=3D o or raise ArgumentError, "value #{o} must be a Set"=0A= + equal?(o) and return 0=0A= + if size < o.size=0A= + @hash.each_key {|e| o.include?(e) or return nil }=0A= + -1=0A= + elsif @hash.size =3D=3D o.size=0A= + @hash.each_key {|e| o.include?(e) or return nil }=0A= + 0=0A= + else=0A= + o.each {|e| include?(e) or return nil }=0A= + 1=0A= + end=0A= end=0A= =0A= def classify=0A= @@ -365,23 +383,21 @@=0A= if func.arity =3D=3D 2=0A= require 'tsort'=0A= =0A= - class << dig =3D {}=0A= - include TSort=0A= -=0A= - alias tsort_each_node each_key=0A= - def tsort_each_child(node, &block)=0A= - fetch(node).each(&block)=0A= - end=0A= + class << dig =3D Hash.new.extend(TSort)=0A= + alias tsort_each_node each_key=0A= + def tsort_each_child(node, &block)=0A= + fetch(node).each(&block)=0A= + end=0A= end=0A= =0A= each { |u|=0A= - dig[u] =3D a =3D []=0A= - each{ |v| func.call(u, v) and a << v }=0A= + dig[u] =3D a =3D []=0A= + each { |v| func.call(u, v) and a << v }=0A= }=0A= =0A= - set =3D type.new()=0A= + set =3D type.new=0A= dig.each_strongly_connected_component { |css|=0A= - set.add(Set.new(css))=0A= + set.add(Set.new(css))=0A= }=0A= set=0A= else=0A= @@ -411,13 +427,13 @@=0A= pp.nest(1) {=0A= first =3D true=0A= each { |o|=0A= - if first=0A= - first =3D false=0A= - else=0A= - pp.text ","=0A= - pp.breakable=0A= - end=0A= - pp.pp o=0A= + if first=0A= + first =3D false=0A= + else=0A= + pp.text ","=0A= + pp.breakable=0A= + end=0A= + pp.pp o=0A= }=0A= }=0A= pp.text "}>"=0A= @@ -436,9 +452,9 @@=0A= class TC_Set < Test::Unit::TestCase=0A= def test_aref=0A= assert_nothing_raised {=0A= - Set[]=0A= - Set[nil]=0A= - Set[1,2,3]=0A= + Set[]=0A= + Set[nil]=0A= + Set[1,2,3]=0A= }=0A= =0A= assert_equal(0, Set[].size)=0A= @@ -452,18 +468,18 @@=0A= =0A= def test_s_new=0A= assert_nothing_raised {=0A= - Set.new()=0A= - Set.new(nil)=0A= - Set.new([])=0A= - Set.new([1,2])=0A= - Set.new('a'..'c')=0A= - Set.new('XYZ')=0A= + Set.new()=0A= + Set.new(nil)=0A= + Set.new([])=0A= + Set.new([1,2])=0A= + Set.new('a'..'c')=0A= + Set.new('XYZ')=0A= }=0A= assert_raises(ArgumentError) {=0A= - Set.new(1)=0A= + Set.new(1)=0A= }=0A= assert_raises(ArgumentError) {=0A= - Set.new(1,2)=0A= + Set.new(1,2)=0A= }=0A= =0A= assert_equal(0, Set.new().size)=0A= @@ -527,17 +543,17 @@=0A= =0A= def test_flatten=0A= set1 =3D Set[=0A= - 1,=0A= - Set[=0A= - 5,=0A= - Set[7,=0A= - Set[0]=0A= - ],=0A= - Set[6,2],=0A= - 1=0A= - ],=0A= - 3,=0A= - Set[3,4]=0A= + 1,=0A= + Set[=0A= + 5,=0A= + Set[7,=0A= + Set[0]=0A= + ],=0A= + Set[6,2],=0A= + 1=0A= + ],=0A= + 3,=0A= + Set[3,4]=0A= ]=0A= =0A= set2 =3D set1.flatten=0A= @@ -575,11 +591,11 @@=0A= set =3D Set[1,2,3]=0A= =0A= assert_raises(ArgumentError) {=0A= - set.contain?()=0A= + set.contain?()=0A= }=0A= =0A= assert_raises(ArgumentError) {=0A= - set.contain?(2)=0A= + set.contain?(2)=0A= }=0A= =0A= assert_equal(true, set.contain?([]))=0A= @@ -594,15 +610,15 @@=0A= set =3D Set.new(ary)=0A= =0A= assert_raises(LocalJumpError) {=0A= - set.each=0A= + set.each=0A= }=0A= =0A= assert_nothing_raised {=0A= - set.each { |o|=0A= - ary.delete(o) or raise "unexpected element: #{o}"=0A= - }=0A= + set.each { |o|=0A= + ary.delete(o) or raise "unexpected element: #{o}"=0A= + }=0A= =0A= - ary.empty? or raise "forgotten elements: #{ary.join(', ')}"=0A= + ary.empty? or raise "forgotten elements: #{ary.join(', ')}"=0A= }=0A= end=0A= =0A= @@ -701,13 +717,32 @@=0A= assert_equal(set1, set1)=0A= assert_equal(set1, set2)=0A= assert_not_equal(Set[1], [1])=0A= + aset =3D Class.new(Set)["a","b"]=0A= +=0A= + _a =3D Class.new(Set)["a","b"]=0A= + a =3D Set["a","b",_a]=0A= + _a =3D _a.add(_a.clone)=0A= +=0A= + assert_equal _a, a=0A= + assert_equal a,_a=0A= + assert_equal a, a.clone=0A= + assert_equal _a.clone, _a=0A= end=0A= =0A= # def test_hash=0A= # end=0A= =0A= - # def test_eql?=0A= - # end=0A= + class EqlClass=0A= + def hash=0A= + super % 11=0A= + end=0A= + end=0A= + =0A= + def test_eql?=0A= + a =3D EqlClass.new =0A= + b =3D EqlClass.new until b.hash =3D=3D a.hash=0A= + assert !(Set[a].eql?(Set[b]))=0A= + end=0A= =0A= def test_classify=0A= set =3D Set.new(1..10)=0A= @@ -740,17 +775,17 @@=0A= assert_equal(set.size, n)=0A= assert_equal(set, ret.flatten)=0A= ret.each { |s|=0A= - if s.include?(0)=0A= - assert_equal(Set[0,1], s)=0A= - elsif s.include?(3)=0A= - assert_equal(Set[3,4,5], s)=0A= - elsif s.include?(7)=0A= - assert_equal(Set[7], s)=0A= - elsif s.include?(9)=0A= - assert_equal(Set[9,10,11], s)=0A= - else=0A= - raise "unexpected group: #{s.inspect}"=0A= - end=0A= + if s.include?(0)=0A= + assert_equal(Set[0,1], s)=0A= + elsif s.include?(3)=0A= + assert_equal(Set[3,4,5], s)=0A= + elsif s.include?(7)=0A= + assert_equal(Set[7], s)=0A= + elsif s.include?(9)=0A= + assert_equal(Set[9,10,11], s)=0A= + else=0A= + raise "unexpected group: #{s.inspect}"=0A= + end=0A= }=0A= end=0A= =0A= @@ -771,6 +806,34 @@=0A= =0A= # def test_pretty_print_cycled=0A= # end=0A= + =0A= + def test_fail_false_initialize=0A= + assert_raises(ArgumentError) { =0A= + Set.new (false)=0A= + }=0A= + end=0A= +=0A= + def test_more_flatten=0A= + empty =3D Set[]=0A= + set =3D Set[Set[empty,"a"],Set[empty,"b"]]=0A= + assert_nothing_raised { set.flatten }=0A= + set1 =3D empty.merge Set["no_more",set]=0A= + assert_nil Set.new(0..31).flatten!=0A= + x =3D Set[Set[],Set[1,2]].flatten!=0A= + y =3D Set[1,2]=0A= + assert_equal x,y=0A= + end=0A= + =0A= + def test_compare=0A= + a=3D Set[1,2]=0A= + b =3D Set[1,2,3]=0A= + c =3D Set[1,3]=0A= + =0A= + assert_equal (a <=3D> b), -1=0A= + assert_equal (b <=3D> a), 1=0A= + assert_equal (b <=3D> b.clone), 0=0A= + assert_nil a <=3D> c=0A= + end=0A= end=0A= =0A= Test::Unit::UI::Console::TestRunner.run(TC_Set)=0A= ------=_NextPart_000_0001_01C2539F.9D3F1DE0 Content-Type: application/octet-stream; name="Set.rb.more.diff" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="Set.rb.more.diff" --- set.rb.orig 2002-09-02 00:36:49.000000000 +0200=0A= +++ set.rb 2002-09-03 22:13:13.000000000 +0200=0A= @@ -22,14 +22,14 @@=0A= =0A= set1 =3D Set.new ["foo", "bar", "baz"]=0A= =0A= - p set1 #=3D> #=0A= + p set1 #=3D> #=0A= =0A= - p set1.include?("bar") #=3D> true=0A= + p set1.include?("bar") #=3D> true=0A= =0A= set1.add("heh")=0A= set1.delete("foo")=0A= =0A= - p set1 #=3D> #=0A= + p set1 #=3D> #=0A= =0A= =3D=3D Set class=0A= Set implements a collection of unordered values with no duplicates.=0A= @@ -41,11 +41,13 @@=0A= =0A= =3D=3D=3D Included Modules=0A= Enumerable=0A= + Comparable=0A= =0A= =3D=3D=3D Class Methods=0A= --- Set::new(enum =3D nil)=0A= Creates a new set containing the elements of the given enumerable=0A= - object.=0A= + object. If a block is given the elements of enum are preprocessed=0A= + by the given block. =0A= =0A= --- Set[*ary]=0A= Creates a new set containing the given objects.=0A= @@ -135,7 +137,11 @@=0A= =0A= --- =3D=3D set=0A= Returns true if two sets are equal. The equality of each couple=0A= - of elements is defined according to Object#eql?.=0A= + of elements is defined according to Object#=3D=3D.=0A= +=0A= +--- <=3D> set=0A= + Returns -1,1 or 0 if self is a subset, is to equal or is a superset=0A= + of set. If none of latter is true <=3D> returns nil.=0A= =0A= --- classify { |o| ... }=0A= Classifies the set by the return value of the given block and=0A= @@ -180,17 +186,21 @@=0A= =0A= class Set=0A= include Enumerable=0A= + include Comparable=0A= =0A= def self.[](*ary)=0A= new(ary)=0A= end=0A= =0A= def initialize(enum =3D nil)=0A= - @hash =3D {}=0A= -=0A= - if enum=0A= + @hash =3D Hash.new=0A= + unless enum.nil?=0A= enum.is_a?(Enumerable) or raise ArgumentError, "value must be = enumerable"=0A= - enum.each { |o| @hash[o] =3D true } =0A= + unless block_given?=0A= + enum.each { |o| @hash[o] =3D true }=0A= + else=0A= + enum.each { |o| @hash[yield(o)] =3D true }=0A= + end=0A= end=0A= end=0A= =0A= @@ -225,34 +235,33 @@=0A= @hash.keys=0A= end=0A= =0A= - def _flatten(set, ids =3D type.new, result =3D type.new)=0A= - setid =3D set.id=0A= -=0A= - ids.include?(setid) and raise ArgumentError, "tried to flatten = recursive #{type.name}"=0A= -=0A= - ids.add(setid)=0A= -=0A= - set.each { |o|=0A= - if o.is_a?(type)=0A= - _flatten(o, ids, result)=0A= + protected=0A= + def _flatten(set, seen)=0A= + set.each {|e|=0A= + if Set =3D=3D=3D e=0A= + if seen.include?(e_id =3D e.id)=0A= + raise ArgumentError, "tried to flatten recursive Set"=0A= + end=0A= + seen.add e_id=0A= + _flatten(e,seen)=0A= + seen.delete e_id=0A= else=0A= - result.add(o)=0A= + add(e)=0A= end=0A= }=0A= -=0A= - result=0A= + self=0A= end=0A= - private :_flatten=0A= -=0A= + =0A= + public=0A= def flatten=0A= - _flatten(self)=0A= + type.new._flatten(self, Set.new)=0A= end=0A= -=0A= + =0A= def flatten!=0A= - ids =3D type.new=0A= - replace(_flatten(self, ids))=0A= -=0A= - ids.size =3D=3D 1 ? nil : self=0A= + if any? {|e| Set =3D=3D=3D e }=0A= + @hash.replace flatten.instance_eval {@hash }=0A= + self=0A= + end=0A= end=0A= =0A= def include?(o)=0A= @@ -261,9 +270,12 @@=0A= alias member? include?=0A= =0A= def contain?(enum)=0A= - enum.is_a?(Enumerable) or raise ArgumentError, "value must be = enumerable"=0A= - enum.each { |o| include?(o) or return false }=0A= - true=0A= + Enumerable =3D=3D=3D enum or raise ArgumentError, "value must be = enumerable"=0A= + unless block_given?=0A= + enum.all? { |o| include?(o) }=0A= + else=0A= + enum.all? { |o| include?(yield(o)) }=0A= + end=0A= end=0A= =0A= def each=0A= @@ -309,7 +321,7 @@=0A= enum.each { |o| n.add(o) }=0A= n=0A= end=0A= - alias | + ##=0A= + alias | + ##=0A= =0A= def -(enum)=0A= enum.is_a?(Enumerable) or raise ArgumentError, "value must be = enumerable"=0A= @@ -334,20 +346,32 @@=0A= =0A= def =3D=3D(set)=0A= equal?(set) and return true=0A= -=0A= - set.is_a?(type) && size =3D=3D set.size or return false=0A= -=0A= - set.each { |o| include?(o) or return false }=0A= -=0A= - true=0A= + unless set.instance_of?(type) and size =3D=3D set.size=0A= + false=0A= + else=0A= + all? { |e| set.include?(e) }=0A= + end=0A= end=0A= =0A= def hash=0A= @hash.hash=0A= end=0A= =0A= - def eql?(o)=0A= - @hash =3D=3D o.hash=0A= + alias eql? =3D=3D=0A= + =0A= + def <=3D>(o)=0A= + return or raise ArgumentError, "value #{o} must be a #{type}"=0A= + equal?(o) and return 0=0A= + if size < o.size=0A= + @hash.each_key {|e| o.include?(e) or return nil }=0A= + -1=0A= + elsif @hash.size =3D=3D o.size=0A= + @hash.each_key {|e| o.include?(e) or return nil }=0A= + 0=0A= + else=0A= + o.each {|e| include?(e) or return nil }=0A= + 1=0A= + end=0A= end=0A= =0A= def classify=0A= @@ -365,23 +389,21 @@=0A= if func.arity =3D=3D 2=0A= require 'tsort'=0A= =0A= - class << dig =3D {}=0A= - include TSort=0A= -=0A= - alias tsort_each_node each_key=0A= - def tsort_each_child(node, &block)=0A= - fetch(node).each(&block)=0A= - end=0A= + class << dig =3D Hash.new.extend(TSort)=0A= + alias tsort_each_node each_key=0A= + def tsort_each_child(node, &block)=0A= + fetch(node).each(&block)=0A= + end=0A= end=0A= =0A= each { |u|=0A= - dig[u] =3D a =3D []=0A= - each{ |v| func.call(u, v) and a << v }=0A= + dig[u] =3D a =3D []=0A= + each { |v| func.call(u, v) and a << v }=0A= }=0A= =0A= - set =3D type.new()=0A= + set =3D type.new=0A= dig.each_strongly_connected_component { |css|=0A= - set.add(Set.new(css))=0A= + set.add(Set.new(css))=0A= }=0A= set=0A= else=0A= @@ -411,13 +433,13 @@=0A= pp.nest(1) {=0A= first =3D true=0A= each { |o|=0A= - if first=0A= - first =3D false=0A= - else=0A= - pp.text ","=0A= - pp.breakable=0A= - end=0A= - pp.pp o=0A= + if first=0A= + first =3D false=0A= + else=0A= + pp.text ","=0A= + pp.breakable=0A= + end=0A= + pp.pp o=0A= }=0A= }=0A= pp.text "}>"=0A= @@ -436,9 +458,9 @@=0A= class TC_Set < Test::Unit::TestCase=0A= def test_aref=0A= assert_nothing_raised {=0A= - Set[]=0A= - Set[nil]=0A= - Set[1,2,3]=0A= + Set[]=0A= + Set[nil]=0A= + Set[1,2,3]=0A= }=0A= =0A= assert_equal(0, Set[].size)=0A= @@ -452,18 +474,18 @@=0A= =0A= def test_s_new=0A= assert_nothing_raised {=0A= - Set.new()=0A= - Set.new(nil)=0A= - Set.new([])=0A= - Set.new([1,2])=0A= - Set.new('a'..'c')=0A= - Set.new('XYZ')=0A= + Set.new()=0A= + Set.new(nil)=0A= + Set.new([])=0A= + Set.new([1,2])=0A= + Set.new('a'..'c')=0A= + Set.new('XYZ')=0A= }=0A= assert_raises(ArgumentError) {=0A= - Set.new(1)=0A= + Set.new(1)=0A= }=0A= assert_raises(ArgumentError) {=0A= - Set.new(1,2)=0A= + Set.new(1,2)=0A= }=0A= =0A= assert_equal(0, Set.new().size)=0A= @@ -527,17 +549,17 @@=0A= =0A= def test_flatten=0A= set1 =3D Set[=0A= - 1,=0A= - Set[=0A= - 5,=0A= - Set[7,=0A= - Set[0]=0A= - ],=0A= - Set[6,2],=0A= - 1=0A= - ],=0A= - 3,=0A= - Set[3,4]=0A= + 1,=0A= + Set[=0A= + 5,=0A= + Set[7,=0A= + Set[0]=0A= + ],=0A= + Set[6,2],=0A= + 1=0A= + ],=0A= + 3,=0A= + Set[3,4]=0A= ]=0A= =0A= set2 =3D set1.flatten=0A= @@ -575,11 +597,11 @@=0A= set =3D Set[1,2,3]=0A= =0A= assert_raises(ArgumentError) {=0A= - set.contain?()=0A= + set.contain?()=0A= }=0A= =0A= assert_raises(ArgumentError) {=0A= - set.contain?(2)=0A= + set.contain?(2)=0A= }=0A= =0A= assert_equal(true, set.contain?([]))=0A= @@ -594,15 +616,15 @@=0A= set =3D Set.new(ary)=0A= =0A= assert_raises(LocalJumpError) {=0A= - set.each=0A= + set.each=0A= }=0A= =0A= assert_nothing_raised {=0A= - set.each { |o|=0A= - ary.delete(o) or raise "unexpected element: #{o}"=0A= - }=0A= + set.each { |o|=0A= + ary.delete(o) or raise "unexpected element: #{o}"=0A= + }=0A= =0A= - ary.empty? or raise "forgotten elements: #{ary.join(', ')}"=0A= + ary.empty? or raise "forgotten elements: #{ary.join(', ')}"=0A= }=0A= end=0A= =0A= @@ -694,20 +716,38 @@=0A= assert_equal(Set[2,4], ret)=0A= end=0A= =0A= - def test_eq=0A= + def test_eq_and_eql?=0A= set1 =3D Set[2,3,1]=0A= set2 =3D Set[1,2,3]=0A= =0A= assert_equal(set1, set1)=0A= assert_equal(set1, set2)=0A= assert_not_equal(Set[1], [1])=0A= + aset =3D Class.new(Set)["a","b"]=0A= +=0A= + _a =3D Class.new(Set)["a","b"]=0A= + a =3D Set["a","b",_a]=0A= + _a =3D _a.add(_a.clone)=0A= +=0A= + assert_not_equal _a, a=0A= + assert_not_equal a,_a=0A= + assert_equal a, a.clone=0A= + assert_equal _a.clone, _a=0A= end=0A= =0A= # def test_hash=0A= # end=0A= =0A= - # def test_eql?=0A= - # end=0A= + def test_eql?=0A= + _a =3D Class.new(Set)["a","b"]=0A= + a =3D Set["a","b",[_a]]=0A= + _a =3D _a.add([_a.clone])=0A= + =0A= + assert !(a.eql? _a)=0A= + assert !(_a.eql? a)=0A= + assert (a.clone.eql? a)=0A= + assert (_a.eql? _a.clone)=0A= + end=0A= =0A= def test_classify=0A= set =3D Set.new(1..10)=0A= @@ -740,17 +780,17 @@=0A= assert_equal(set.size, n)=0A= assert_equal(set, ret.flatten)=0A= ret.each { |s|=0A= - if s.include?(0)=0A= - assert_equal(Set[0,1], s)=0A= - elsif s.include?(3)=0A= - assert_equal(Set[3,4,5], s)=0A= - elsif s.include?(7)=0A= - assert_equal(Set[7], s)=0A= - elsif s.include?(9)=0A= - assert_equal(Set[9,10,11], s)=0A= - else=0A= - raise "unexpected group: #{s.inspect}"=0A= - end=0A= + if s.include?(0)=0A= + assert_equal(Set[0,1], s)=0A= + elsif s.include?(3)=0A= + assert_equal(Set[3,4,5], s)=0A= + elsif s.include?(7)=0A= + assert_equal(Set[7], s)=0A= + elsif s.include?(9)=0A= + assert_equal(Set[9,10,11], s)=0A= + else=0A= + raise "unexpected group: #{s.inspect}"=0A= + end=0A= }=0A= end=0A= =0A= @@ -771,6 +811,40 @@=0A= =0A= # def test_pretty_print_cycled=0A= # end=0A= + =0A= + def test_fail_false_initialize=0A= + assert_raises(ArgumentError) { =0A= + Set.new (false)=0A= + }=0A= + end=0A= +=0A= + def test_block_initialize=0A= + a =3D Set[*(-4..0)]=0A= + b =3D Set.new(0..4) {|e| -e }=0A= + assert_equal a, b=0A= + end=0A= +=0A= + def test_more_flatten=0A= + empty =3D Set[]=0A= + set =3D Set[Set[empty,"a"],Set[empty,"b"]]=0A= + assert_nothing_raised { set.flatten }=0A= + set1 =3D empty.merge Set["no_more",set]=0A= + assert_nil Set.new(0..31).flatten!=0A= + x =3D Set[Set[],Set[1,2]].flatten!=0A= + y =3D Set[1,2]=0A= + assert_equal x,y=0A= + end=0A= + =0A= + def test_compare=0A= + a=3D Set[1,2]=0A= + b =3D Set[1,2,3]=0A= + c =3D Set[1,3]=0A= + =0A= + assert_equal (a <=3D> b), -1=0A= + assert_equal (b <=3D> a), 1=0A= + assert_equal (b <=3D> b.clone), 0=0A= + assert_nil a <=3D> c=0A= + end=0A= end=0A= =0A= Test::Unit::UI::Console::TestRunner.run(TC_Set)=0A= ------=_NextPart_000_0001_01C2539F.9D3F1DE0--