home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2007 September / PCWSEP07.iso / Software / Linux / Linux Mint 3.0 Light / LinuxMint-3.0-Light.iso / casper / filesystem.squashfs / usr / lib / ruby / 1.8 / set.rb < prev    next >
Encoding:
Ruby Source  |  2007-03-07  |  26.0 KB  |  1,227 lines

  1. #--
  2. # set.rb - defines the Set class
  3. #++
  4. # Copyright (c) 2002 Akinori MUSHA <knu@iDaemons.org>
  5. #
  6. # Documentation by Akinori MUSHA and Gavin Sinclair. 
  7. #
  8. # All rights reserved.  You can redistribute and/or modify it under the same
  9. # terms as Ruby.
  10. #
  11. #   $Id: set.rb,v 1.20.2.7 2005/06/30 06:16:13 matz Exp $
  12. #
  13. # == Overview 
  14. # This library provides the Set class, which deals with a collection
  15. # of unordered values with no duplicates.  It is a hybrid of Array's
  16. # intuitive inter-operation facilities and Hash's fast lookup.  If you
  17. # need to keep values ordered, use the SortedSet class.
  18. #
  19. # The method +to_set+ is added to Enumerable for convenience.
  20. #
  21. # See the Set class for an example of usage.
  22.  
  23.  
  24. #
  25. # Set implements a collection of unordered values with no duplicates.
  26. # This is a hybrid of Array's intuitive inter-operation facilities and
  27. # Hash's fast lookup.
  28. #
  29. # Several methods accept any Enumerable object (implementing +each+)
  30. # for greater flexibility: new, replace, merge, subtract, |, &, -, ^.
  31. #
  32. # The equality of each couple of elements is determined according to
  33. # Object#eql? and Object#hash, since Set uses Hash as storage.
  34. #
  35. # Finally, if you are using class Set, you can also use Enumerable#to_set
  36. # for convenience.
  37. #
  38. # == Example
  39. #
  40. #   require 'set'
  41. #   s1 = Set.new [1, 2]                   # -> #<Set: {1, 2}>
  42. #   s2 = [1, 2].to_set                    # -> #<Set: {1, 2}>
  43. #   s1 == s2                              # -> true
  44. #   s1.add("foo")                         # -> #<Set: {1, 2, "foo"}>
  45. #   s1.merge([2, 6])                      # -> #<Set: {6, 1, 2, "foo"}>
  46. #   s1.subset? s2                         # -> false
  47. #   s2.subset? s1                         # -> true
  48. #
  49. class Set
  50.   include Enumerable
  51.  
  52.   # Creates a new set containing the given objects.
  53.   def self.[](*ary)
  54.     new(ary)
  55.   end
  56.  
  57.   # Creates a new set containing the elements of the given enumerable
  58.   # object.
  59.   #
  60.   # If a block is given, the elements of enum are preprocessed by the
  61.   # given block.
  62.   def initialize(enum = nil, &block) # :yields: o
  63.     @hash ||= Hash.new
  64.  
  65.     enum.nil? and return
  66.  
  67.     if block
  68.       enum.each { |o| add(block[o]) }
  69.     else
  70.       merge(enum)
  71.     end
  72.   end
  73.  
  74.   # Copy internal hash.
  75.   def initialize_copy(orig)
  76.     @hash = orig.instance_eval{@hash}.dup
  77.   end
  78.  
  79.   # Returns the number of elements.
  80.   def size
  81.     @hash.size
  82.   end
  83.   alias length size
  84.  
  85.   # Returns true if the set contains no elements.
  86.   def empty?
  87.     @hash.empty?
  88.   end
  89.  
  90.   # Removes all elements and returns self.
  91.   def clear
  92.     @hash.clear
  93.     self
  94.   end
  95.  
  96.   # Replaces the contents of the set with the contents of the given
  97.   # enumerable object and returns self.
  98.   def replace(enum)
  99.     if enum.class == self.class
  100.       @hash.replace(enum.instance_eval { @hash })
  101.     else
  102.       enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  103.       clear
  104.       enum.each { |o| add(o) }
  105.     end
  106.  
  107.     self
  108.   end
  109.  
  110.   # Converts the set to an array.  The order of elements is uncertain.
  111.   def to_a
  112.     @hash.keys
  113.   end
  114.  
  115.   def flatten_merge(set, seen = Set.new)
  116.     set.each { |e|
  117.       if e.is_a?(Set)
  118.     if seen.include?(e_id = e.object_id)
  119.       raise ArgumentError, "tried to flatten recursive Set"
  120.     end
  121.  
  122.     seen.add(e_id)
  123.     flatten_merge(e, seen)
  124.     seen.delete(e_id)
  125.       else
  126.     add(e)
  127.       end
  128.     }
  129.  
  130.     self
  131.   end
  132.   protected :flatten_merge
  133.  
  134.   # Returns a new set that is a copy of the set, flattening each
  135.   # containing set recursively.
  136.   def flatten
  137.     self.class.new.flatten_merge(self)
  138.   end
  139.  
  140.   # Equivalent to Set#flatten, but replaces the receiver with the
  141.   # result in place.  Returns nil if no modifications were made.
  142.   def flatten!
  143.     if detect { |e| e.is_a?(Set) }
  144.       replace(flatten())
  145.     else
  146.       nil
  147.     end
  148.   end
  149.  
  150.   # Returns true if the set contains the given object.
  151.   def include?(o)
  152.     @hash.include?(o)
  153.   end
  154.   alias member? include?
  155.  
  156.   # Returns true if the set is a superset of the given set.
  157.   def superset?(set)
  158.     set.is_a?(Set) or raise ArgumentError, "value must be a set"
  159.     return false if size < set.size
  160.     set.all? { |o| include?(o) }
  161.   end
  162.  
  163.   # Returns true if the set is a proper superset of the given set.
  164.   def proper_superset?(set)
  165.     set.is_a?(Set) or raise ArgumentError, "value must be a set"
  166.     return false if size <= set.size
  167.     set.all? { |o| include?(o) }
  168.   end
  169.  
  170.   # Returns true if the set is a subset of the given set.
  171.   def subset?(set)
  172.     set.is_a?(Set) or raise ArgumentError, "value must be a set"
  173.     return false if set.size < size
  174.     all? { |o| set.include?(o) }
  175.   end
  176.  
  177.   # Returns true if the set is a proper subset of the given set.
  178.   def proper_subset?(set)
  179.     set.is_a?(Set) or raise ArgumentError, "value must be a set"
  180.     return false if set.size <= size
  181.     all? { |o| set.include?(o) }
  182.   end
  183.  
  184.   # Calls the given block once for each element in the set, passing
  185.   # the element as parameter.
  186.   def each
  187.     @hash.each_key { |o| yield(o) }
  188.     self
  189.   end
  190.  
  191.   # Adds the given object to the set and returns self.  Use +merge+ to
  192.   # add several elements at once.
  193.   def add(o)
  194.     @hash[o] = true
  195.     self
  196.   end
  197.   alias << add
  198.  
  199.   # Adds the given object to the set and returns self.  If the
  200.   # object is already in the set, returns nil.
  201.   def add?(o)
  202.     if include?(o)
  203.       nil
  204.     else
  205.       add(o)
  206.     end
  207.   end
  208.  
  209.   # Deletes the given object from the set and returns self.  Use +subtract+ to
  210.   # delete several items at once.
  211.   def delete(o)
  212.     @hash.delete(o)
  213.     self
  214.   end
  215.  
  216.   # Deletes the given object from the set and returns self.  If the
  217.   # object is not in the set, returns nil.
  218.   def delete?(o)
  219.     if include?(o)
  220.       delete(o)
  221.     else
  222.       nil
  223.     end
  224.   end
  225.  
  226.   # Deletes every element of the set for which block evaluates to
  227.   # true, and returns self.
  228.   def delete_if
  229.     @hash.delete_if { |o,| yield(o) }
  230.     self
  231.   end
  232.  
  233.   # Do collect() destructively.
  234.   def collect!
  235.     set = self.class.new
  236.     each { |o| set << yield(o) }
  237.     replace(set)
  238.   end
  239.   alias map! collect!
  240.  
  241.   # Equivalent to Set#delete_if, but returns nil if no changes were
  242.   # made.
  243.   def reject!
  244.     n = size
  245.     delete_if { |o| yield(o) }
  246.     size == n ? nil : self
  247.   end
  248.  
  249.   # Merges the elements of the given enumerable object to the set and
  250.   # returns self.
  251.   def merge(enum)
  252.     if enum.is_a?(Set)
  253.       @hash.update(enum.instance_eval { @hash })
  254.     else
  255.       enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  256.       enum.each { |o| add(o) }
  257.     end
  258.  
  259.     self
  260.   end
  261.  
  262.   # Deletes every element that appears in the given enumerable object
  263.   # and returns self.
  264.   def subtract(enum)
  265.     enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  266.     enum.each { |o| delete(o) }
  267.     self
  268.   end
  269.  
  270.   # Returns a new set built by merging the set and the elements of the
  271.   # given enumerable object.
  272.   def |(enum)
  273.     enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  274.     dup.merge(enum)
  275.   end
  276.   alias + |        ##
  277.   alias union |        ##
  278.  
  279.   # Returns a new set built by duplicating the set, removing every
  280.   # element that appears in the given enumerable object.
  281.   def -(enum)
  282.     enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  283.     dup.subtract(enum)
  284.   end
  285.   alias difference -    ##
  286.  
  287.   # Returns a new array containing elements common to the set and the
  288.   # given enumerable object.
  289.   def &(enum)
  290.     enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  291.     n = self.class.new
  292.     enum.each { |o| n.add(o) if include?(o) }
  293.     n
  294.   end
  295.   alias intersection &    ##
  296.  
  297.   # Returns a new array containing elements exclusive between the set
  298.   # and the given enumerable object.  (set ^ enum) is equivalent to
  299.   # ((set | enum) - (set & enum)).
  300.   def ^(enum)
  301.     enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  302.     n = Set.new(enum)
  303.     each { |o| if n.include?(o) then n.delete(o) else n.add(o) end }
  304.     n
  305.   end
  306.  
  307.   # Returns true if two sets are equal.  The equality of each couple
  308.   # of elements is defined according to Object#eql?.
  309.   def ==(set)
  310.     equal?(set) and return true
  311.  
  312.     set.is_a?(Set) && size == set.size or return false
  313.  
  314.     hash = @hash.dup
  315.     set.all? { |o| hash.include?(o) }
  316.   end
  317.  
  318.   def hash    # :nodoc:
  319.     @hash.hash
  320.   end
  321.  
  322.   def eql?(o)    # :nodoc:
  323.     return false unless o.is_a?(Set)
  324.     @hash.eql?(o.instance_eval{@hash})
  325.   end
  326.  
  327.   # Classifies the set by the return value of the given block and
  328.   # returns a hash of {value => set of elements} pairs.  The block is
  329.   # called once for each element of the set, passing the element as
  330.   # parameter.
  331.   #
  332.   # e.g.:
  333.   #
  334.   #   require 'set'
  335.   #   files = Set.new(Dir.glob("*.rb"))
  336.   #   hash = files.classify { |f| File.mtime(f).year }
  337.   #   p hash    # => {2000=>#<Set: {"a.rb", "b.rb"}>,
  338.   #             #     2001=>#<Set: {"c.rb", "d.rb", "e.rb"}>,
  339.   #             #     2002=>#<Set: {"f.rb"}>}
  340.   def classify # :yields: o
  341.     h = {}
  342.  
  343.     each { |i|
  344.       x = yield(i)
  345.       (h[x] ||= self.class.new).add(i)
  346.     }
  347.  
  348.     h
  349.   end
  350.  
  351.   # Divides the set into a set of subsets according to the commonality
  352.   # defined by the given block.
  353.   #
  354.   # If the arity of the block is 2, elements o1 and o2 are in common
  355.   # if block.call(o1, o2) is true.  Otherwise, elements o1 and o2 are
  356.   # in common if block.call(o1) == block.call(o2).
  357.   #
  358.   # e.g.:
  359.   #
  360.   #   require 'set'
  361.   #   numbers = Set[1, 3, 4, 6, 9, 10, 11]
  362.   #   set = numbers.divide { |i,j| (i - j).abs == 1 }
  363.   #   p set     # => #<Set: {#<Set: {1}>,
  364.   #             #            #<Set: {11, 9, 10}>,
  365.   #             #            #<Set: {3, 4}>,
  366.   #             #            #<Set: {6}>}>
  367.   def divide(&func)
  368.     if func.arity == 2
  369.       require 'tsort'
  370.  
  371.       class << dig = {}        # :nodoc:
  372.     include TSort
  373.  
  374.     alias tsort_each_node each_key
  375.     def tsort_each_child(node, &block)
  376.       fetch(node).each(&block)
  377.     end
  378.       end
  379.  
  380.       each { |u|
  381.     dig[u] = a = []
  382.     each{ |v| func.call(u, v) and a << v }
  383.       }
  384.  
  385.       set = Set.new()
  386.       dig.each_strongly_connected_component { |css|
  387.     set.add(self.class.new(css))
  388.       }
  389.       set
  390.     else
  391.       Set.new(classify(&func).values)
  392.     end
  393.   end
  394.  
  395.   InspectKey = :__inspect_key__         # :nodoc:
  396.  
  397.   # Returns a string containing a human-readable representation of the
  398.   # set. ("#<Set: {element1, element2, ...}>")
  399.   def inspect
  400.     ids = (Thread.current[InspectKey] ||= [])
  401.  
  402.     if ids.include?(object_id)
  403.       return sprintf('#<%s: {...}>', self.class.name)
  404.     end
  405.  
  406.     begin
  407.       ids << object_id
  408.       return sprintf('#<%s: {%s}>', self.class, to_a.inspect[1..-2])
  409.     ensure
  410.       ids.pop
  411.     end
  412.   end
  413.  
  414.   def pretty_print(pp)    # :nodoc:
  415.     pp.text sprintf('#<%s: {', self.class.name)
  416.     pp.nest(1) {
  417.       pp.seplist(self) { |o|
  418.     pp.pp o
  419.       }
  420.     }
  421.     pp.text "}>"
  422.   end
  423.  
  424.   def pretty_print_cycle(pp)    # :nodoc:
  425.     pp.text sprintf('#<%s: {%s}>', self.class.name, empty? ? '' : '...')
  426.   end
  427. end
  428.  
  429. # SortedSet implements a set which elements are sorted in order.  See Set.
  430. class SortedSet < Set
  431.   @@setup = false
  432.  
  433.   class << self
  434.     def [](*ary)    # :nodoc:
  435.       new(ary)
  436.     end
  437.  
  438.     def setup    # :nodoc:
  439.       @@setup and return
  440.  
  441.       module_eval {
  442.         # a hack to shut up warning
  443.         alias old_init initialize
  444.         remove_method :old_init
  445.       }
  446.       begin
  447.     require 'rbtree'
  448.  
  449.     module_eval %{
  450.       def initialize(*args, &block)
  451.         @hash = RBTree.new
  452.         super
  453.       end
  454.     }
  455.       rescue LoadError
  456.     module_eval %{
  457.       def initialize(*args, &block)
  458.         @keys = nil
  459.         super
  460.       end
  461.  
  462.       def clear
  463.         @keys = nil
  464.         super
  465.       end
  466.  
  467.       def replace(enum)
  468.         @keys = nil
  469.         super
  470.       end
  471.  
  472.       def add(o)
  473.         @keys = nil
  474.         @hash[o] = true
  475.         self
  476.       end
  477.       alias << add
  478.  
  479.       def delete(o)
  480.         @keys = nil
  481.         @hash.delete(o)
  482.         self
  483.       end
  484.  
  485.       def delete_if
  486.         n = @hash.size
  487.         @hash.delete_if { |o,| yield(o) }
  488.         @keys = nil if @hash.size != n
  489.         self
  490.       end
  491.  
  492.       def merge(enum)
  493.         @keys = nil
  494.         super
  495.       end
  496.  
  497.       def each
  498.         to_a.each { |o| yield(o) }
  499.       end
  500.  
  501.       def to_a
  502.         (@keys = @hash.keys).sort! unless @keys
  503.         @keys
  504.       end
  505.     }
  506.       end
  507.  
  508.       @@setup = true
  509.     end
  510.   end
  511.  
  512.   def initialize(*args, &block)    # :nodoc:
  513.     SortedSet.setup
  514.     initialize(*args, &block)
  515.   end
  516. end
  517.  
  518. module Enumerable
  519.   # Makes a set from the enumerable object with given arguments.
  520.   # Needs to +require "set"+ to use this method.
  521.   def to_set(klass = Set, *args, &block)
  522.     klass.new(self, *args, &block)
  523.   end
  524. end
  525.  
  526. # =begin
  527. # == RestricedSet class
  528. # RestricedSet implements a set with restrictions defined by a given
  529. # block.
  530. # === Super class
  531. #     Set
  532. # === Class Methods
  533. # --- RestricedSet::new(enum = nil) { |o| ... }
  534. # --- RestricedSet::new(enum = nil) { |rset, o| ... }
  535. #     Creates a new restricted set containing the elements of the given
  536. #     enumerable object.  Restrictions are defined by the given block.
  537. #     If the block's arity is 2, it is called with the RestrictedSet
  538. #     itself and an object to see if the object is allowed to be put in
  539. #     the set.
  540. #     Otherwise, the block is called with an object to see if the object
  541. #     is allowed to be put in the set.
  542. # === Instance Methods
  543. # --- restriction_proc
  544. #     Returns the restriction procedure of the set.
  545. # =end
  546. # class RestricedSet < Set
  547. #   def initialize(*args, &block)
  548. #     @proc = block or raise ArgumentError, "missing a block"
  549. #     if @proc.arity == 2
  550. #       instance_eval %{
  551. #     def add(o)
  552. #       @hash[o] = true if @proc.call(self, o)
  553. #       self
  554. #     end
  555. #     alias << add
  556. #     def add?(o)
  557. #       if include?(o) || !@proc.call(self, o)
  558. #         nil
  559. #       else
  560. #         @hash[o] = true
  561. #         self
  562. #       end
  563. #     end
  564. #     def replace(enum)
  565. #       enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  566. #       clear
  567. #       enum.each { |o| add(o) }
  568. #       self
  569. #     end
  570. #     def merge(enum)
  571. #       enum.is_a?(Enumerable) or raise ArgumentError, "value must be enumerable"
  572. #       enum.each { |o| add(o) }
  573. #       self
  574. #     end
  575. #       }
  576. #     else
  577. #       instance_eval %{
  578. #     def add(o)
  579. #         if @proc.call(o)
  580. #         @hash[o] = true 
  581. #         end
  582. #       self
  583. #     end
  584. #     alias << add
  585. #     def add?(o)
  586. #       if include?(o) || !@proc.call(o)
  587. #         nil
  588. #       else
  589. #         @hash[o] = true
  590. #         self
  591. #       end
  592. #     end
  593. #       }
  594. #     end
  595. #     super(*args)
  596. #   end
  597. #   def restriction_proc
  598. #     @proc
  599. #   end
  600. # end
  601.  
  602. if $0 == __FILE__
  603.   eval DATA.read, nil, $0, __LINE__+4
  604. end
  605.  
  606. __END__
  607.  
  608. require 'test/unit'
  609.  
  610. class TC_Set < Test::Unit::TestCase
  611.   def test_aref
  612.     assert_nothing_raised {
  613.       Set[]
  614.       Set[nil]
  615.       Set[1,2,3]
  616.     }
  617.  
  618.     assert_equal(0, Set[].size)
  619.     assert_equal(1, Set[nil].size)
  620.     assert_equal(1, Set[[]].size)
  621.     assert_equal(1, Set[[nil]].size)
  622.  
  623.     set = Set[2,4,6,4]
  624.     assert_equal(Set.new([2,4,6]), set)
  625.   end
  626.  
  627.   def test_s_new
  628.     assert_nothing_raised {
  629.       Set.new()
  630.       Set.new(nil)
  631.       Set.new([])
  632.       Set.new([1,2])
  633.       Set.new('a'..'c')
  634.       Set.new('XYZ')
  635.     }
  636.     assert_raises(ArgumentError) {
  637.       Set.new(false)
  638.     }
  639.     assert_raises(ArgumentError) {
  640.       Set.new(1)
  641.     }
  642.     assert_raises(ArgumentError) {
  643.       Set.new(1,2)
  644.     }
  645.  
  646.     assert_equal(0, Set.new().size)
  647.     assert_equal(0, Set.new(nil).size)
  648.     assert_equal(0, Set.new([]).size)
  649.     assert_equal(1, Set.new([nil]).size)
  650.  
  651.     ary = [2,4,6,4]
  652.     set = Set.new(ary)
  653.     ary.clear
  654.     assert_equal(false, set.empty?)
  655.     assert_equal(3, set.size)
  656.  
  657.     ary = [1,2,3]
  658.  
  659.     s = Set.new(ary) { |o| o * 2 }
  660.     assert_equal([2,4,6], s.sort)
  661.   end
  662.  
  663.   def test_clone
  664.     set1 = Set.new
  665.     set2 = set1.clone
  666.     set1 << 'abc'
  667.     assert_equal(Set.new, set2)
  668.   end
  669.  
  670.   def test_dup
  671.     set1 = Set[1,2]
  672.     set2 = set1.dup
  673.  
  674.     assert_not_same(set1, set2)
  675.  
  676.     assert_equal(set1, set2)
  677.  
  678.     set1.add(3)
  679.  
  680.     assert_not_equal(set1, set2)
  681.   end
  682.  
  683.   def test_size
  684.     assert_equal(0, Set[].size)
  685.     assert_equal(2, Set[1,2].size)
  686.     assert_equal(2, Set[1,2,1].size)
  687.   end
  688.  
  689.   def test_empty?
  690.     assert_equal(true, Set[].empty?)
  691.     assert_equal(false, Set[1, 2].empty?)
  692.   end
  693.  
  694.   def test_clear
  695.     set = Set[1,2]
  696.     ret = set.clear
  697.  
  698.     assert_same(set, ret)
  699.     assert_equal(true, set.empty?)
  700.   end
  701.  
  702.   def test_replace
  703.     set = Set[1,2]
  704.     ret = set.replace('a'..'c')
  705.  
  706.     assert_same(set, ret)
  707.     assert_equal(Set['a','b','c'], set)
  708.   end
  709.  
  710.   def test_to_a
  711.     set = Set[1,2,3,2]
  712.     ary = set.to_a
  713.  
  714.     assert_equal([1,2,3], ary.sort)
  715.   end
  716.  
  717.   def test_flatten
  718.     # test1
  719.     set1 = Set[
  720.       1,
  721.       Set[
  722.     5,
  723.     Set[7,
  724.       Set[0]
  725.     ],
  726.     Set[6,2],
  727.     1
  728.       ],
  729.       3,
  730.       Set[3,4]
  731.     ]
  732.  
  733.     set2 = set1.flatten
  734.     set3 = Set.new(0..7)
  735.  
  736.     assert_not_same(set2, set1)
  737.     assert_equal(set3, set2)
  738.  
  739.     # test2; destructive
  740.     orig_set1 = set1
  741.     set1.flatten!
  742.  
  743.     assert_same(orig_set1, set1)
  744.     assert_equal(set3, set1)
  745.  
  746.     # test3; multiple occurrences of a set in an set
  747.     set1 = Set[1, 2]
  748.     set2 = Set[set1, Set[set1, 4], 3]
  749.  
  750.     assert_nothing_raised {
  751.       set2.flatten!
  752.     }
  753.  
  754.     assert_equal(Set.new(1..4), set2)
  755.  
  756.     # test4; recursion
  757.     set2 = Set[]
  758.     set1 = Set[1, set2]
  759.     set2.add(set1)
  760.  
  761.     assert_raises(ArgumentError) {
  762.       set1.flatten!
  763.     }
  764.  
  765.     # test5; miscellaneous
  766.     empty = Set[]
  767.     set =  Set[Set[empty, "a"],Set[empty, "b"]]
  768.  
  769.     assert_nothing_raised {
  770.       set.flatten
  771.     }
  772.  
  773.     set1 = empty.merge(Set["no_more", set])
  774.  
  775.     assert_nil(Set.new(0..31).flatten!)
  776.  
  777.     x = Set[Set[],Set[1,2]].flatten!
  778.     y = Set[1,2]
  779.  
  780.     assert_equal(x, y)
  781.   end
  782.  
  783.   def test_include?
  784.     set = Set[1,2,3]
  785.  
  786.     assert_equal(true, set.include?(1))
  787.     assert_equal(true, set.include?(2))
  788.     assert_equal(true, set.include?(3))
  789.     assert_equal(false, set.include?(0))
  790.     assert_equal(false, set.include?(nil))
  791.  
  792.     set = Set["1",nil,"2",nil,"0","1",false]
  793.     assert_equal(true, set.include?(nil))
  794.     assert_equal(true, set.include?(false))
  795.     assert_equal(true, set.include?("1"))
  796.     assert_equal(false, set.include?(0))
  797.     assert_equal(false, set.include?(true))
  798.   end
  799.  
  800.   def test_superset?
  801.     set = Set[1,2,3]
  802.  
  803.     assert_raises(ArgumentError) {
  804.       set.superset?()
  805.     }
  806.  
  807.     assert_raises(ArgumentError) {
  808.       set.superset?(2)
  809.     }
  810.  
  811.     assert_raises(ArgumentError) {
  812.       set.superset?([2])
  813.     }
  814.  
  815.     assert_equal(true, set.superset?(Set[]))
  816.     assert_equal(true, set.superset?(Set[1,2]))
  817.     assert_equal(true, set.superset?(Set[1,2,3]))
  818.     assert_equal(false, set.superset?(Set[1,2,3,4]))
  819.     assert_equal(false, set.superset?(Set[1,4]))
  820.  
  821.     assert_equal(true, Set[].superset?(Set[]))
  822.   end
  823.  
  824.   def test_proper_superset?
  825.     set = Set[1,2,3]
  826.  
  827.     assert_raises(ArgumentError) {
  828.       set.proper_superset?()
  829.     }
  830.  
  831.     assert_raises(ArgumentError) {
  832.       set.proper_superset?(2)
  833.     }
  834.  
  835.     assert_raises(ArgumentError) {
  836.       set.proper_superset?([2])
  837.     }
  838.  
  839.     assert_equal(true, set.proper_superset?(Set[]))
  840.     assert_equal(true, set.proper_superset?(Set[1,2]))
  841.     assert_equal(false, set.proper_superset?(Set[1,2,3]))
  842.     assert_equal(false, set.proper_superset?(Set[1,2,3,4]))
  843.     assert_equal(false, set.proper_superset?(Set[1,4]))
  844.  
  845.     assert_equal(false, Set[].proper_superset?(Set[]))
  846.   end
  847.  
  848.   def test_subset?
  849.     set = Set[1,2,3]
  850.  
  851.     assert_raises(ArgumentError) {
  852.       set.subset?()
  853.     }
  854.  
  855.     assert_raises(ArgumentError) {
  856.       set.subset?(2)
  857.     }
  858.  
  859.     assert_raises(ArgumentError) {
  860.       set.subset?([2])
  861.     }
  862.  
  863.     assert_equal(true, set.subset?(Set[1,2,3,4]))
  864.     assert_equal(true, set.subset?(Set[1,2,3]))
  865.     assert_equal(false, set.subset?(Set[1,2]))
  866.     assert_equal(false, set.subset?(Set[]))
  867.  
  868.     assert_equal(true, Set[].subset?(Set[1]))
  869.     assert_equal(true, Set[].subset?(Set[]))
  870.   end
  871.  
  872.   def test_proper_subset?
  873.     set = Set[1,2,3]
  874.  
  875.     assert_raises(ArgumentError) {
  876.       set.proper_subset?()
  877.     }
  878.  
  879.     assert_raises(ArgumentError) {
  880.       set.proper_subset?(2)
  881.     }
  882.  
  883.     assert_raises(ArgumentError) {
  884.       set.proper_subset?([2])
  885.     }
  886.  
  887.     assert_equal(true, set.proper_subset?(Set[1,2,3,4]))
  888.     assert_equal(false, set.proper_subset?(Set[1,2,3]))
  889.     assert_equal(false, set.proper_subset?(Set[1,2]))
  890.     assert_equal(false, set.proper_subset?(Set[]))
  891.  
  892.     assert_equal(false, Set[].proper_subset?(Set[]))
  893.   end
  894.  
  895.   def test_each
  896.     ary = [1,3,5,7,10,20]
  897.     set = Set.new(ary)
  898.  
  899.     assert_raises(LocalJumpError) {
  900.       set.each
  901.     }
  902.  
  903.     assert_nothing_raised {
  904.       set.each { |o|
  905.     ary.delete(o) or raise "unexpected element: #{o}"
  906.       }
  907.  
  908.       ary.empty? or raise "forgotten elements: #{ary.join(', ')}"
  909.     }
  910.   end
  911.  
  912.   def test_add
  913.     set = Set[1,2,3]
  914.  
  915.     ret = set.add(2)
  916.     assert_same(set, ret)
  917.     assert_equal(Set[1,2,3], set)
  918.  
  919.     ret = set.add?(2)
  920.     assert_nil(ret)
  921.     assert_equal(Set[1,2,3], set)
  922.  
  923.     ret = set.add(4)
  924.     assert_same(set, ret)
  925.     assert_equal(Set[1,2,3,4], set)
  926.  
  927.     ret = set.add?(5)
  928.     assert_same(set, ret)
  929.     assert_equal(Set[1,2,3,4,5], set)
  930.   end
  931.  
  932.   def test_delete
  933.     set = Set[1,2,3]
  934.  
  935.     ret = set.delete(4)
  936.     assert_same(set, ret)
  937.     assert_equal(Set[1,2,3], set)
  938.  
  939.     ret = set.delete?(4)
  940.     assert_nil(ret)
  941.     assert_equal(Set[1,2,3], set)
  942.  
  943.     ret = set.delete(2)
  944.     assert_equal(set, ret)
  945.     assert_equal(Set[1,3], set)
  946.  
  947.     ret = set.delete?(1)
  948.     assert_equal(set, ret)
  949.     assert_equal(Set[3], set)
  950.   end
  951.  
  952.   def test_delete_if
  953.     set = Set.new(1..10)
  954.     ret = set.delete_if { |i| i > 10 }
  955.     assert_same(set, ret)
  956.     assert_equal(Set.new(1..10), set)
  957.  
  958.     set = Set.new(1..10)
  959.     ret = set.delete_if { |i| i % 3 == 0 }
  960.     assert_same(set, ret)
  961.     assert_equal(Set[1,2,4,5,7,8,10], set)
  962.   end
  963.  
  964.   def test_collect!
  965.     set = Set[1,2,3,'a','b','c',-1..1,2..4]
  966.  
  967.     ret = set.collect! { |i|
  968.       case i
  969.       when Numeric
  970.     i * 2
  971.       when String
  972.     i.upcase
  973.       else
  974.     nil
  975.       end
  976.     }
  977.  
  978.     assert_same(set, ret)
  979.     assert_equal(Set[2,4,6,'A','B','C',nil], set)
  980.   end
  981.  
  982.   def test_reject!
  983.     set = Set.new(1..10)
  984.  
  985.     ret = set.reject! { |i| i > 10 }
  986.     assert_nil(ret)
  987.     assert_equal(Set.new(1..10), set)
  988.  
  989.     ret = set.reject! { |i| i % 3 == 0 }
  990.     assert_same(set, ret)
  991.     assert_equal(Set[1,2,4,5,7,8,10], set)
  992.   end
  993.  
  994.   def test_merge
  995.     set = Set[1,2,3]
  996.  
  997.     ret = set.merge([2,4,6])
  998.     assert_same(set, ret)
  999.     assert_equal(Set[1,2,3,4,6], set)
  1000.   end
  1001.  
  1002.   def test_subtract
  1003.     set = Set[1,2,3]
  1004.  
  1005.     ret = set.subtract([2,4,6])
  1006.     assert_same(set, ret)
  1007.     assert_equal(Set[1,3], set)
  1008.   end
  1009.  
  1010.   def test_plus
  1011.     set = Set[1,2,3]
  1012.  
  1013.     ret = set + [2,4,6]
  1014.     assert_not_same(set, ret)
  1015.     assert_equal(Set[1,2,3,4,6], ret)
  1016.   end
  1017.  
  1018.   def test_minus
  1019.     set = Set[1,2,3]
  1020.  
  1021.     ret = set - [2,4,6]
  1022.     assert_not_same(set, ret)
  1023.     assert_equal(Set[1,3], ret)
  1024.   end
  1025.  
  1026.   def test_and
  1027.     set = Set[1,2,3,4]
  1028.  
  1029.     ret = set & [2,4,6]
  1030.     assert_not_same(set, ret)
  1031.     assert_equal(Set[2,4], ret)
  1032.   end
  1033.  
  1034.   def test_xor
  1035.     set = Set[1,2,3,4]
  1036.     ret = set ^ [2,4,5,5]
  1037.     assert_not_same(set, ret)
  1038.     assert_equal(Set[1,3,5], ret)
  1039.   end
  1040.  
  1041.   def test_eq
  1042.     set1 = Set[2,3,1]
  1043.     set2 = Set[1,2,3]
  1044.  
  1045.     assert_equal(set1, set1)
  1046.     assert_equal(set1, set2)
  1047.     assert_not_equal(Set[1], [1])
  1048.  
  1049.     set1 = Class.new(Set)["a", "b"]
  1050.     set2 = Set["a", "b", set1]
  1051.     set1 = set1.add(set1.clone)
  1052.  
  1053. #    assert_equal(set1, set2)
  1054. #    assert_equal(set2, set1)
  1055.     assert_equal(set2, set2.clone)
  1056.     assert_equal(set1.clone, set1)
  1057.  
  1058.     assert_not_equal(Set[Exception.new,nil], Set[Exception.new,Exception.new], "[ruby-dev:26127]")
  1059.   end
  1060.  
  1061.   # def test_hash
  1062.   # end
  1063.  
  1064.   # def test_eql?
  1065.   # end
  1066.  
  1067.   def test_classify
  1068.     set = Set.new(1..10)
  1069.     ret = set.classify { |i| i % 3 }
  1070.  
  1071.     assert_equal(3, ret.size)
  1072.     assert_instance_of(Hash, ret)
  1073.     ret.each_value { |value| assert_instance_of(Set, value) }
  1074.     assert_equal(Set[3,6,9], ret[0])
  1075.     assert_equal(Set[1,4,7,10], ret[1])
  1076.     assert_equal(Set[2,5,8], ret[2])
  1077.   end
  1078.  
  1079.   def test_divide
  1080.     set = Set.new(1..10)
  1081.     ret = set.divide { |i| i % 3 }
  1082.  
  1083.     assert_equal(3, ret.size)
  1084.     n = 0
  1085.     ret.each { |s| n += s.size }
  1086.     assert_equal(set.size, n)
  1087.     assert_equal(set, ret.flatten)
  1088.  
  1089.     set = Set[7,10,5,11,1,3,4,9,0]
  1090.     ret = set.divide { |a,b| (a - b).abs == 1 }
  1091.  
  1092.     assert_equal(4, ret.size)
  1093.     n = 0
  1094.     ret.each { |s| n += s.size }
  1095.     assert_equal(set.size, n)
  1096.     assert_equal(set, ret.flatten)
  1097.     ret.each { |s|
  1098.       if s.include?(0)
  1099.     assert_equal(Set[0,1], s)
  1100.       elsif s.include?(3)
  1101.     assert_equal(Set[3,4,5], s)
  1102.       elsif s.include?(7)
  1103.     assert_equal(Set[7], s)
  1104.       elsif s.include?(9)
  1105.     assert_equal(Set[9,10,11], s)
  1106.       else
  1107.     raise "unexpected group: #{s.inspect}"
  1108.       end
  1109.     }
  1110.   end
  1111.  
  1112.   def test_inspect
  1113.     set1 = Set[1]
  1114.  
  1115.     assert_equal('#<Set: {1}>', set1.inspect)
  1116.  
  1117.     set2 = Set[Set[0], 1, 2, set1]
  1118.     assert_equal(false, set2.inspect.include?('#<Set: {...}>'))
  1119.  
  1120.     set1.add(set2)
  1121.     assert_equal(true, set1.inspect.include?('#<Set: {...}>'))
  1122.   end
  1123.  
  1124.   # def test_pretty_print
  1125.   # end
  1126.  
  1127.   # def test_pretty_print_cycle
  1128.   # end
  1129. end
  1130.  
  1131. class TC_SortedSet < Test::Unit::TestCase
  1132.   def test_sortedset
  1133.     s = SortedSet[4,5,3,1,2]
  1134.  
  1135.     assert_equal([1,2,3,4,5], s.to_a)
  1136.  
  1137.     prev = nil
  1138.     s.each { |o| assert(prev < o) if prev; prev = o }
  1139.     assert_not_nil(prev)
  1140.  
  1141.     s.map! { |o| -2 * o }
  1142.  
  1143.     assert_equal([-10,-8,-6,-4,-2], s.to_a)
  1144.  
  1145.     prev = nil
  1146.     s.each { |o| assert(prev < o) if prev; prev = o }
  1147.     assert_not_nil(prev)
  1148.  
  1149.     s = SortedSet.new([2,1,3]) { |o| o * -2 }
  1150.     assert_equal([-6,-4,-2], s.to_a)
  1151.   end
  1152. end
  1153.  
  1154. class TC_Enumerable < Test::Unit::TestCase
  1155.   def test_to_set
  1156.     ary = [2,5,4,3,2,1,3]
  1157.  
  1158.     set = ary.to_set
  1159.     assert_instance_of(Set, set)
  1160.     assert_equal([1,2,3,4,5], set.sort)
  1161.  
  1162.     set = ary.to_set { |o| o * -2 }
  1163.     assert_instance_of(Set, set)
  1164.     assert_equal([-10,-8,-6,-4,-2], set.sort)
  1165.  
  1166.     set = ary.to_set(SortedSet)
  1167.     assert_instance_of(SortedSet, set)
  1168.     assert_equal([1,2,3,4,5], set.to_a)
  1169.  
  1170.     set = ary.to_set(SortedSet) { |o| o * -2 }
  1171.     assert_instance_of(SortedSet, set)
  1172.     assert_equal([-10,-8,-6,-4,-2], set.sort)
  1173.   end
  1174. end
  1175.  
  1176. # class TC_RestricedSet < Test::Unit::TestCase
  1177. #   def test_s_new
  1178. #     assert_raises(ArgumentError) { RestricedSet.new }
  1179. #     s = RestricedSet.new([-1,2,3]) { |o| o > 0 }
  1180. #     assert_equal([2,3], s.sort)
  1181. #   end
  1182. #   def test_restriction_proc
  1183. #     s = RestricedSet.new([-1,2,3]) { |o| o > 0 }
  1184. #     f = s.restriction_proc
  1185. #     assert_instance_of(Proc, f)
  1186. #     assert(f[1])
  1187. #     assert(!f[0])
  1188. #   end
  1189. #   def test_replace
  1190. #     s = RestricedSet.new(-3..3) { |o| o > 0 }
  1191. #     assert_equal([1,2,3], s.sort)
  1192. #     s.replace([-2,0,3,4,5])
  1193. #     assert_equal([3,4,5], s.sort)
  1194. #   end
  1195. #   def test_merge
  1196. #     s = RestricedSet.new { |o| o > 0 }
  1197. #     s.merge(-5..5)
  1198. #     assert_equal([1,2,3,4,5], s.sort)
  1199. #     s.merge([10,-10,-8,8])
  1200. #     assert_equal([1,2,3,4,5,8,10], s.sort)
  1201. #   end
  1202. # end
  1203.