1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
require 'spec_helper'
describe MethodSource do
describe "source_location (testing 1.8 implementation)" do
it 'should return correct source_location for a method' do
expect(method(:hello).source_location.first).to match(/spec_helper/)
end
it 'should not raise for immediate instance methods' do
[Symbol, Integer, TrueClass, FalseClass, NilClass].each do |immediate_class|
expect do
immediate_class.instance_method(:to_s).source_location
end.not_to raise_error
end
end
it 'should not raise for immediate methods' do
[:a, 1, true, false, nil].each do |immediate|
expect do
immediate.method(:to_s).source_location
end.not_to raise_error
end
end
end
before do
@hello_module_source = " def hello; :hello_module; end\n"
@hello_singleton_source = "def $o.hello; :hello_singleton; end\n"
@hello_source = "def hello; :hello; end\n"
@hello_comment = "# A comment for hello\n# It spans two lines and is indented by 2 spaces\n"
@lambda_comment = "# This is a comment for MyLambda\n"
@module_comment = "# This is a comment for module\n"
@class_comment = "# This is a comment for class\n"
@lambda_source = "MyLambda = lambda { :lambda }\n"
@proc_source = "MyProc = Proc.new { :proc }\n"
@hello_instance_evaled_source = " def hello_\#{name}(*args)\n send_mesg(:\#{name}, *args)\n end\n"
@hello_instance_evaled_source_2 = " def \#{name}_two()\n if 40 + 4\n 45\n end\n end\n"
@hello_class_evaled_source = " def hello_\#{name}(*args)\n send_mesg(:\#{name}, *args)\n end\n"
@hi_module_evaled_source = " def hi_\#{name}\n @var = \#{name}\n end\n"
end
it 'should define methods on Method and UnboundMethod and Proc' do
expect(Method.method_defined?(:source)).to be_truthy
expect(UnboundMethod.method_defined?(:source)).to be_truthy
expect(Proc.method_defined?(:source)).to be_truthy
end
describe "Methods" do
it 'should return source for method' do
expect(method(:hello).source).to eq(@hello_source)
end
it 'should return source for a method defined in a module' do
expect(M.instance_method(:hello).source).to eq(@hello_module_source)
end
it 'should return source for a singleton method as an instance method' do
expect(class << $o
self
end.instance_method(:hello).source).to eq(@hello_singleton_source)
end
it 'should return source for a singleton method' do
expect($o.method(:hello).source).to eq(@hello_singleton_source)
end
it 'should return a comment for method' do
expect(method(:hello).comment).to eq(@hello_comment)
end
# These tests fail because of http://jira.codehaus.org/browse/JRUBY-4576
unless defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
it 'should return source for an *_evaled method' do
expect(M.method(:hello_name).source).to eq(@hello_instance_evaled_source)
expect(M.method(:name_two).source).to eq(@hello_instance_evaled_source_2)
expect(M.instance_method(:hello_name).source).to eq(@hello_class_evaled_source)
expect(M.instance_method(:hi_name).source).to eq(@hi_module_evaled_source)
end
end
it "should raise error for evaled methods that do not pass __FILE__ and __LINE__ + 1 as its arguments" do
expect do
M.instance_method(:name_three).source
end.to raise_error(MethodSource::SourceNotFoundError)
end
if !is_rbx?
it 'should raise for C methods' do
expect do
method(:puts).source
end.to raise_error(MethodSource::SourceNotFoundError)
end
end
end
# if RUBY_VERSION =~ /1.9/ || is_rbx?
describe "Lambdas and Procs" do
it 'should return source for proc' do
expect(MyProc.source).to eq(@proc_source)
end
it 'should return an empty string if there is no comment' do
expect(MyProc.comment).to eq('')
end
it 'should return source for lambda' do
expect(MyLambda.source).to eq(@lambda_source)
end
it 'should return comment for lambda' do
expect(MyLambda.comment).to eq(@lambda_comment)
end
it 'should return comment for module' do
expect(M.instance_method(:hello).module_comment).to eq(@module_comment)
end
it 'should return comment for class' do
expect(C.method(:hello).class_comment).to eq(@class_comment)
end
it 'should return comment for class instance' do
expect(C.new.method(:hello).class_comment).to eq(@class_comment)
end
end
# end
describe "Comment tests" do
before do
@comment1 = "# a\n# b\n"
@comment2 = "# a\n# b\n"
@comment3 = "# a\n#\n# b\n"
@comment4 = "# a\n# b\n"
@comment5 = "# a\n# b\n# c\n# d\n"
end
it "should correctly extract multi-line comments" do
expect(method(:comment_test1).comment).to eq(@comment1)
end
it "should correctly strip leading whitespace before comments" do
expect(method(:comment_test2).comment).to eq(@comment2)
end
it "should keep empty comment lines" do
expect(method(:comment_test3).comment).to eq(@comment3)
end
it "should ignore blank lines between comments" do
expect(method(:comment_test4).comment).to eq(@comment4)
end
it "should align all comments to same indent level" do
expect(method(:comment_test5).comment).to eq(@comment5)
end
end
end
|