diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-11-06 11:57:02 -0800 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-11-06 11:57:02 -0800 |
commit | 3b35de2a90e26b99e2a6d4f61dc56d6ce7ded748 (patch) | |
tree | f66334a0ad8cf59590dd682d95d6244e8b454853 /test/inlinetest.rb | |
download | ruby-3b35de2a90e26b99e2a6d4f61dc56d6ce7ded748.tar.gz ruby-3b35de2a90e26b99e2a6d4f61dc56d6ce7ded748.tar.bz2 ruby-3b35de2a90e26b99e2a6d4f61dc56d6ce7ded748.zip |
Imported Upstream version 1.9.3.p194upstream/1.9.3.p194
Diffstat (limited to 'test/inlinetest.rb')
-rw-r--r-- | test/inlinetest.rb | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/test/inlinetest.rb b/test/inlinetest.rb new file mode 100644 index 0000000..4628736 --- /dev/null +++ b/test/inlinetest.rb @@ -0,0 +1,55 @@ +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 '#{path}'") + 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__\r?$/, '__END__') + end + module_function :loadtest__END__part + + @mutex = Mutex.new + + def self.in_critical(&block) + @mutex.synchronize(&block) + end + + def self.in_progname(progname) + $program_name = progname + alias $0 $program_name + begin + yield + ensure + alias $0 $PROGRAM_NAME + 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 |