r18455 reverted.
[ruby-svn.git] / test / inlinetest.rb
blob46287364a953a4a1acf6d6883e79c718df9dd361
1 module InlineTest
2   def eval_part(libname, sep, part)
3     path = libpath(libname)
4     program = File.open(path) { |f| f.read }
5     mainpart, endpart = program.split(sep)
6     if endpart.nil?
7       raise RuntimeError.new("No #{part} part in the library '#{path}'")
8     end
9     eval(endpart, TOPLEVEL_BINDING, path, mainpart.count("\n")+1)
10   end
11   module_function :eval_part
13   def loadtest(libname)
14     require(libname)
15     in_critical do
16       in_progname(libpath(libname)) do
17         eval_part(libname, /^(?=if\s+(?:\$0\s*==\s*__FILE__|__FILE__\s*==\s*\$0)(?:[\#\s]|$))/, '$0 == __FILE__')
18       end
19     end
20   end
21   module_function :loadtest
23   def loadtest__END__part(libname)
24     require(libname)
25     eval_part(libname, /^__END__\r?$/, '__END__')
26   end
27   module_function :loadtest__END__part
29   @mutex = Mutex.new
31   def self.in_critical(&block)
32     @mutex.synchronize(&block)
33   end
35   def self.in_progname(progname)
36     $program_name = progname
37     alias $0 $program_name
38     begin
39       yield
40     ensure
41       alias $0 $PROGRAM_NAME
42     end
43   end
45   def self.libpath(libname)
46     libpath = nil
47     $:.find do |path|
48       File.file?(testname = File.join(path, libname)) && libpath = testname
49     end
50     if libpath.nil?
51       raise RuntimeError.new("'#{libname}' not found")
52     end
53     libpath
54   end
55 end