require_relative '../../spec_helper'

describe "Set#merge" do
  it "adds the elements of the passed Enumerable to self" do
    Set[:a, :b].merge(Set[:b, :c, :d]).should == Set[:a, :b, :c, :d]
    Set[1, 2].merge([3, 4]).should == Set[1, 2, 3, 4]
  end

  it "returns self" do
    set = Set[1, 2]
    set.merge([3, 4]).should.equal?(set)
  end

  it "raises an ArgumentError when passed a non-Enumerable" do
    -> { Set[1, 2].merge(1) }.should.raise(ArgumentError)
    -> { Set[1, 2].merge(Object.new) }.should.raise(ArgumentError)
  end

  it "raises RuntimeError when called during iteration" do
    set = Set[:a, :b]
    set.each do |_m|
      -> { set.merge([1, 2]) }.should.raise(RuntimeError, /iteration/)
    end
  end

  it "accepts multiple arguments" do
    Set[:a, :b].merge(Set[:b, :c], [:d]).should == Set[:a, :b, :c, :d]
  end

  it "retains compare_by_identity flag" do
    set = Set[1, 2].compare_by_identity
    set.merge([3, 4])
    set.compare_by_identity?.should == true

    set2 = Set[1, 2].compare_by_identity
    set2.merge(Set[3, 4])
    set2.compare_by_identity?.should == true
  end
end
