diff options
Diffstat (limited to 'spec/ruby/core/symbol/to_proc_spec.rb')
| -rw-r--r-- | spec/ruby/core/symbol/to_proc_spec.rb | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/spec/ruby/core/symbol/to_proc_spec.rb b/spec/ruby/core/symbol/to_proc_spec.rb new file mode 100644 index 0000000000..93ed1e9e9b --- /dev/null +++ b/spec/ruby/core/symbol/to_proc_spec.rb @@ -0,0 +1,78 @@ +require_relative '../../spec_helper' + +describe "Symbol#to_proc" do + it "returns a new Proc" do + proc = :to_s.to_proc + proc.should.is_a?(Proc) + end + + it "sends self to arguments passed when calling #call on the Proc" do + obj = mock("Receiving #to_s") + obj.should_receive(:to_s).and_return("Received #to_s") + :to_s.to_proc.call(obj).should == "Received #to_s" + end + + it "returns a Proc with #lambda? true" do + pr = :to_s.to_proc + pr.should.lambda? + end + + it "produces a Proc with arity -2" do + pr = :to_s.to_proc + pr.arity.should == -2 + end + + it "produces a Proc that always returns [[:req], [:rest]] for #parameters" do + pr = :to_s.to_proc + pr.parameters.should == [[:req], [:rest]] + end + + it "only calls public methods" do + body = proc do + public def pub; @a << :pub end + protected def pro; @a << :pro end + private def pri; @a << :pri end + attr_reader :a + end + + @a = [] + singleton_class.class_eval(&body) + tap(&:pub) + proc{tap(&:pro)}.should.raise(NoMethodError, /protected method [`']pro' called/) + proc{tap(&:pri)}.should.raise(NoMethodError, /private method [`']pri' called/) + @a.should == [:pub] + + @a = [] + c = Class.new(&body) + o = c.new + o.instance_variable_set(:@a, []) + o.tap(&:pub) + proc{tap(&:pro)}.should.raise(NoMethodError, /protected method [`']pro' called/) + proc{o.tap(&:pri)}.should.raise(NoMethodError, /private method [`']pri' called/) + o.a.should == [:pub] + end + + it "raises an ArgumentError when calling #call on the Proc without receiver" do + -> { + :object_id.to_proc.call + }.should.raise(ArgumentError, /no receiver given|wrong number of arguments \(given 0, expected 1\+\)/) + end + + it "passes along the block passed to Proc#call" do + klass = Class.new do + def m + yield + end + + def to_proc + :m.to_proc.call(self) { :value } + end + end + klass.new.to_proc.should == :value + end + + it "produces a proc with source location nil" do + pr = :to_s.to_proc + pr.source_location.should == nil + end +end |
