summaryrefslogtreecommitdiff
path: root/trunk/test/inlinetest.rb
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/test/inlinetest.rb')
-rw-r--r--trunk/test/inlinetest.rb55
1 files changed, 55 insertions, 0 deletions
diff --git a/trunk/test/inlinetest.rb b/trunk/test/inlinetest.rb
new file mode 100644
index 0000000000..46287364a9
--- /dev/null
+++ b/trunk/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