Updated RubySpec submodule to 5f783c7e.
[rbx.git] / spec / frozen / 1.8 / core / hash / reject_spec.rb
blob5651065a7fe5173e86bdefea76c114d4ac3014d6
1 require File.dirname(__FILE__) + '/../../spec_helper'
2 require File.dirname(__FILE__) + '/fixtures/classes'
3 require File.dirname(__FILE__) + '/shared/iteration'
5 describe "Hash#reject" do
6   it "is equivalent to hsh.dup.delete_if" do
7     h = { :a => 'a', :b => 'b', :c => 'd' }
8     h.reject { |k,v| k == 'd' }.should == (h.dup.delete_if { |k, v| k == 'd' })
9     
10     all_args_reject = []
11     all_args_delete_if = []
12     h = {1 => 2, 3 => 4}
13     h.reject { |*args| all_args_reject << args }
14     h.delete_if { |*args| all_args_delete_if << args }
15     all_args_reject.should == all_args_delete_if
16     
17     h = { 1 => 2 }
18     # dup doesn't copy singleton methods
19     def h.to_a() end
20     h.reject { false }.to_a.should == [[1, 2]]
21   end
22   
23   it "returns subclass instance for subclasses" do
24     MyHash[1 => 2, 3 => 4].reject { false }.class.should == MyHash
25     MyHash[1 => 2, 3 => 4].reject { true }.class.should == MyHash
26   end
27   
28   it "processes entries with the same order as reject!" do
29     h = {:a => 1, :b => 2, :c => 3, :d => 4}
31     reject_pairs = []
32     reject_bang_pairs = []
33     h.dup.reject { |*pair| reject_pairs << pair }
34     h.reject! { |*pair| reject_bang_pairs << pair }
36     reject_pairs.should == reject_bang_pairs
37   end
39   it_behaves_like(:hash_iteration_no_block, :reject)
40 end
42 describe "Hash#reject!" do
43   before(:each) do
44     @hsh = {1 => 2, 3 => 4, 5 => 6}
45     @empty = {}
46   end
48   it "is equivalent to delete_if if changes are made" do
49     {:a => 2}.reject! { |k,v| v > 1 }.should == ({:a => 2}.delete_if { |k, v| v > 1 })
51     h = {1 => 2, 3 => 4}
52     all_args_reject = []
53     all_args_delete_if = []
54     h.dup.reject! { |*args| all_args_reject << args }
55     h.dup.delete_if { |*args| all_args_delete_if << args }
56     all_args_reject.should == all_args_delete_if
57   end
58   
59   it "returns nil if no changes were made" do
60     { :a => 1 }.reject! { |k,v| v > 1 }.should == nil
61   end
62   
63   it "processes entries with the same order as delete_if" do
64     h = {:a => 1, :b => 2, :c => 3, :d => 4}
66     reject_bang_pairs = []
67     delete_if_pairs = []
68     h.dup.reject! { |*pair| reject_bang_pairs << pair }
69     h.dup.delete_if { |*pair| delete_if_pairs << pair }
71     reject_bang_pairs.should == delete_if_pairs
72   end  
74   compliant_on :ruby, :jruby do
75     it "raises a TypeError if called on a frozen instance" do
76       lambda { HashSpecs.frozen_hash.reject! { false } }.should raise_error(TypeError)
77       lambda { HashSpecs.empty_frozen_hash.reject! { true } }.should raise_error(TypeError)
78     end
79   end
81   ruby_version_is "" ... "1.8.7" do
82     it "raises a LocalJumpError when called on a non-empty hash without a block" do
83       lambda { @hsh.reject! }.should raise_error(LocalJumpError)
84     end
86     it "does not raise a LocalJumpError when called on an empty hash without a block" do
87       @empty.reject!.should == nil
88     end
89   end
91   ruby_version_is "1.8.7" do
92     it "returns an Enumerator when called on a non-empty hash without a block" do
93       @hsh.reject!.should be_kind_of(Enumerable::Enumerator)
94     end
96     it "returns an Enumerator when called on an empty hash without a block" do
97       @empty.reject!.should be_kind_of(Enumerable::Enumerator)
98     end
99   end
101   it_behaves_like(:hash_iteration_method, :reject!)