1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/inlinetest.rb
nobu c504ca6776 * test/inlinetest.rb (InlineTest::loadtest): requiring library with
replaced $0 can make $0 == __FILE__ block be evaluated twice.
  [ruby-dev:23538]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6364 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2004-05-19 09:00:48 +00:00

59 lines
1.4 KiB
Ruby

module InlineTest
def eval_part(libname, sep, part)
path = libpath(libname)
program = File.open(path) { |f| f.read }
mainpart, endpart = program.split(sep)
if endpart.nil?
raise RuntimeError.new("No #{part} part in the library '#{filename}'")
end
eval(endpart, TOPLEVEL_BINDING, path, mainpart.count("\n")+1)
end
module_function :eval_part
def loadtest(libname)
require(libname)
in_critical do
in_progname(libpath(libname)) do
eval_part(libname, /^(?=if\s+(?:\$0\s*==\s*__FILE__|__FILE__\s*==\s*\$0)(?:[\#\s]|$))/, '$0 == __FILE__')
end
end
end
module_function :loadtest
def loadtest__END__part(libname)
require(libname)
eval_part(libname, /^__END__$/, '__END__')
end
module_function :loadtest__END__part
def self.in_critical
th_criticality = Thread.critical
Thread.critical = true
begin
yield
ensure
Thread.critical = th_criticality
end
end
def self.in_progname(progname)
progname_backup = $0.dup
$0.replace(progname)
begin
yield
ensure
$0.replace(progname_backup)
end
end
def self.libpath(libname)
libpath = nil
$:.find do |path|
File.file?(testname = File.join(path, libname)) && libpath = testname
end
if libpath.nil?
raise RuntimeError.new("'#{libname}' not found")
end
libpath
end
end