summaryrefslogtreecommitdiff
path: root/test/inlinetest.rb
blob: cd1ee0c683566d32fa1253cd8b2def6a02999274 (plain)
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
module InlineTest
  def loadtest(libname)
    in_critical do
      in_progname(libpath(libname)) do
	Kernel.load(libname)
      end
    end
  end
  module_function :loadtest

  def loadtest__END__part(libname)
    program = File.open(libpath(libname)) { |f| f.read }
    mainpart, endpart = program.split(/^__END__$/)
    if endpart.nil?
      raise RuntimeError.new("No __END__ part in the library '#{filename}'")
    end
    require(libname)
    eval(endpart)
  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