1 #### Common functionality for running tests.
3 # Make sure that the lib directory is in $LOAD_PATH
4 $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
9 $errors_mutex = Mutex.new
12 # Atomically increment $errors
14 $errors_mutex.synchronize { $errors = $errors + 1 }
17 # Runs block and verifies that it returns the given value.
18 # If it doesn't, prints an error message and increments $errors.
19 def expect name, value, &block
27 puts "FAIL: expected #{value.inspect}, but got #{result.inspect}"
31 puts "FAIL: Unexpected #{e.class}\n#{e.message}"
36 # Runs block and verifies that it returns true.
37 # If it doesn't, prints an error message and increments $errors.
38 def expect_true name, &block
39 expect name, true, &block
42 # Runs block and verifies that it throws an exception of type
43 # +exception_type+. If the block doesn't throw such an exception,
44 # prints an error message and increments $errors.
45 def expect_exception name, exception_type, &block
47 message = "#{name}..."
49 message << "FAIL: Expected exception of type #{exception_type}," +
50 " but no exception was raised"
53 if e.kind_of? exception_type
57 message << "FAIL: Expected #{exception_type}, but got #{e.class}"
64 $RUBY = ENV['RUBY'] || 'ruby'
65 $VOODOOC = 'env RUBYLIB=../lib ../bin/voodooc'
67 # Runs a command with exec.
68 # With no block given, returns
69 # [status, stdin, stdout, stderr]
70 # With block given, passes
71 # status, stdin, stdout, stderr to block
73 pw = IO::pipe # pipe[0] for read, pipe[1] for write
98 dummy, status = Process.wait2 pid
99 result = [status, pw[1], pr[0], pe[0]]
103 return yield(*result)
105 [pw[1], pr[0], pe[0]].each { |p| p.close unless p.closed? }
111 def add_test program, command, expected_output = '', params = {}
112 $tests << [program, command, expected_output, params]
115 def run_test program, command, expected_output = '', params = {}
116 input = params.has_key?(:input) ? params[:input] : nil
117 expected_status = params.has_key?(:expected_status) ?
118 params[:expected_status] : 0
119 expected_errors = params.has_key?(:expected_errors) ?
120 params[:expected_errors] : ''
122 message = "#{program}..."
123 status, stdin, stdout, stderr = popen4 command
127 exitstatus = status.exitstatus
129 err_output = stderr.read
130 if exitstatus != expected_status
131 message << "FAIL: exit status is #{exitstatus}, expected #{expected_status}"
133 elsif output != expected_output
134 message << "FAIL: wrong output"
136 elsif err_output != expected_errors
137 message << "FAIL: wrong error output"
138 $stderr.puts "--- ERRORS ---\n#{err_output}\n--- EXPECTED ---\n#{expected_errors}\n--- END ERRORS ---"
146 def add_test2 program, expected_output
147 add_test program, "./#{program}", expected_output
150 def add_test1 program
151 add_test2 program, `cat #{program}.out`
154 # Reports tests results.
155 # Returns 0 if all tests passed, 1 if some failed.
156 def report_test_results
158 puts "All tests passed"
161 puts "#{$errors} tests failed"
166 # Runs all tests in the given queue.
167 # Each test is described by a list
168 # [name, command, expected_output, params].
169 # Those parameters are passed to run_test.
170 def run_tests queue, nthreads = 1
173 threads << Thread.new do
175 name, command, output, params = queue.pop
176 run_test name, command, output, params
180 threads.each { |t| t.join }