From a8017895a1726608e1560203a81b32ad4c825096 Mon Sep 17 00:00:00 2001 From: inglorion Date: Thu, 26 Jan 2012 00:58:46 -0800 Subject: [PATCH] Restructured tests so that tests for validator and language version can be run independently --- test/test | 344 +++++++++++------------------------------- test/{test => test.rb} | 110 ++------------ test/test_language_version.rb | 16 +- test/test_validator.rb | 13 ++ 4 files changed, 125 insertions(+), 358 deletions(-) rewrite test/test (76%) copy test/{test => test.rb} (71%) mode change 100755 => 100644 mode change 100644 => 100755 test/test_language_version.rb diff --git a/test/test b/test/test dissimilarity index 76% index d74a46d..be8edf5 100755 --- a/test/test +++ b/test/test @@ -1,259 +1,85 @@ -#! /usr/bin/env ruby - -require 'test_language_version' -require 'test_validator' -require 'thread' - -$errors = 0 -$errors_mutex = Mutex.new -$tests = Queue.new - -# Atomically increment $errors -def increment_errors - $errors_mutex.synchronize { $errors = $errors + 1 } -end - -# Runs block and verifies that it returns the given value. -# If it doesn't, prints an error message and increments $errors. -def expect name, value, &block - begin - print "#{name}..." - result = yield - if result == value - puts "pass" - true - else - puts "FAIL: expected #{value.inspect}, but got #{result.inspect}" - increment_errors - end - rescue Exception => e - puts "FAIL: Unexpected #{e.class}\n#{e.message}" - increment_errors - end -end - -# Runs block and verifies that it returns true. -# If it doesn't, prints an error message and increments $errors. -def expect_true name, &block - expect name, true, &block -end - -# Runs block and verifies that it throws an exception of type -# +exception_type+. If the block doesn't throw such an exception, -# prints an error message and increments $errors. -def expect_exception name, exception_type, &block - begin - message = "#{name}..." - yield - message << "FAIL: Expected exception of type #{exception_type}," + - " but no exception was raised" - increment_errors - rescue Exception => e - if e.kind_of? exception_type - message << "pass" - true - else - message << "FAIL: Expected #{exception_type}, but got #{e.class}" - increment_errors - end - end - puts message -end - -# Runs block and verifies that it throws a ValidationError. -# If the block doesn't throw such an exception, -# prints an error message and increments $errors. -def expect_ValidationError name, &block - expect_exception name, ValidationError, &block -end - -$RUBY = ENV['RUBY'] || 'ruby' -$VOODOOC = 'env RUBYLIB=../lib ../bin/voodooc' - -# Runs a command with exec. -# With no block given, returns -# [status, stdin, stdout, stderr] -# With block given, passes -# status, stdin, stdout, stderr to block -def popen4 *command - pw = IO::pipe # pipe[0] for read, pipe[1] for write - pr = IO::pipe - pe = IO::pipe - - pid = fork do - # child - pw[1].close - STDIN.reopen(pw[0]) - pw[0].close - - pr[0].close - STDOUT.reopen(pr[1]) - pr[1].close - - pe[0].close - STDERR.reopen(pe[1]) - pe[1].close - - exec *command - end - - # parent - pw[0].close - pr[1].close - pe[1].close - dummy, status = Process.wait2 pid - result = [status, pw[1], pr[0], pe[0]] - pw[1].sync = true - if block_given? - begin - return yield(*result) - ensure - [pw[1], pr[0], pe[0]].each { |p| p.close unless p.closed? } - end - end - result -end - -def add_test program, command, expected_output = '', params = {} - $tests << [program, command, expected_output, params] -end - -def run_test program, command, expected_output = '', params = {} - input = params.has_key?(:input) ? params[:input] : nil - expected_status = params.has_key?(:expected_status) ? - params[:expected_status] : 0 - expected_errors = params.has_key?(:expected_errors) ? - params[:expected_errors] : '' - - message = "#{program}..." - status, stdin, stdout, stderr = popen4 command - if input - stdin.write input - end - exitstatus = status.exitstatus - output = stdout.read - err_output = stderr.read - if exitstatus != expected_status - message << "FAIL: exit status is #{exitstatus}, expected #{expected_status}" - increment_errors - elsif output != expected_output - message << "FAIL: wrong output" - increment_errors - elsif err_output != expected_errors - message << "FAIL: wrong error output" - $stderr.puts "--- ERRORS ---\n#{err_output}\n--- EXPECTED ---\n#{expected_errors}\n--- END ERRORS ---" - increment_errors - else - message << 'pass' - end - puts message -end - -def add_test2 program, expected_output - add_test program, "./#{program}", expected_output -end - -def add_test1 program - add_test2 program, `cat #{program}.out` -end - -# Runs all tests in the given queue. -# Each test is described by a list -# [name, command, expected_output, params]. -# Those parameters are passed to run_test. -def run_tests queue, nthreads = 1 - threads = [] - nthreads.times do - threads << Thread.new do - until queue.empty? - name, command, output, params = queue.pop - run_test name, command, output, params - end - end - end - threads.each { |t| t.join } -end - -test_validator - -test_language_version - -add_test 'architectures', '../bin/voodooc --architecture help', - `cat architectures.out` - -add_test 'features', '../bin/voodooc -a i386 --features', `cat features.out` - -add_test 'help', '../bin/voodooc --help', `cat help.out` - -add_test('no-input-files', - '../bin/voodooc', - '', - :expected_status => 128, - :expected_errors => `cat no-input-files.err`) - -add_test 'version', '../bin/voodooc --version', - "Voodoo Compiler version #{`cat ../VERSION`}" - -add_test2 'hello', "Hello, world!\n" - -add_test2 'tail-calls', '' - -add_test1 'bytes' - -add_test1 'call' - -add_test1 'at' - -add_test1 'block' - -add_test1 'else-if' - -add_test1 'if' - -add_test1 'goto' - -add_test2 'fact', "479001600\n" - -add_test1 'bitwise' - -add_test1 'plusminus' - -add_test1 'many-vars' - -add_test1 'mul' - -add_test1 'div' - -add_test1 'mod' - -add_test1 'raw' - -add_test1 'rotate' - -add_test1 'set-byte' - -add_test1 'set-word' - -add_test1 'shift' - -add_test1 'vtable' - -add_test1 'gcd' - -printf 'test_output_name...' -increment_errors unless system("$RUBY test_output_name.rb") - -add_test 'errors', - "#{$VOODOOC} -o errors.o errors.voo", - '', - :expected_status => 1, - :expected_errors => `cat errors.err` - -run_tests $tests, 4 - -if $errors == 0 - puts "All tests passed" -else - puts "#{$errors} tests failed" - exit 1 -end +#! /usr/bin/env ruby + +require File.dirname(__FILE__) + '/test' +require 'test_language_version' +require 'test_validator' +require 'thread' + +test_validator + +test_language_version + +add_test 'architectures', '../bin/voodooc --architecture help', + `cat architectures.out` + +add_test 'features', '../bin/voodooc -a i386 --features', `cat features.out` + +add_test 'help', '../bin/voodooc --help', `cat help.out` + +add_test('no-input-files', + '../bin/voodooc', + '', + :expected_status => 128, + :expected_errors => `cat no-input-files.err`) + +add_test 'version', '../bin/voodooc --version', + "Voodoo Compiler version #{`cat ../VERSION`}" + +add_test2 'hello', "Hello, world!\n" + +add_test2 'tail-calls', '' + +add_test1 'bytes' + +add_test1 'call' + +add_test1 'at' + +add_test1 'block' + +add_test1 'else-if' + +add_test1 'if' + +add_test1 'goto' + +add_test2 'fact', "479001600\n" + +add_test1 'bitwise' + +add_test1 'plusminus' + +add_test1 'many-vars' + +add_test1 'mul' + +add_test1 'div' + +add_test1 'mod' + +add_test1 'raw' + +add_test1 'rotate' + +add_test1 'set-byte' + +add_test1 'set-word' + +add_test1 'shift' + +add_test1 'vtable' + +add_test1 'gcd' + +printf 'test_output_name...' +increment_errors unless system("$RUBY test_output_name.rb") + +add_test 'errors', + "#{$VOODOOC} -o errors.o errors.voo", + '', + :expected_status => 1, + :expected_errors => `cat errors.err` + +run_tests $tests, 4 + +exit report_test_results diff --git a/test/test b/test/test.rb old mode 100755 new mode 100644 similarity index 71% copy from test/test copy to test/test.rb index d74a46d..ef76605 --- a/test/test +++ b/test/test.rb @@ -1,7 +1,8 @@ -#! /usr/bin/env ruby +#### Common functionality for running tests. + +# Make sure that the lib directory is in $LOAD_PATH +$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib') -require 'test_language_version' -require 'test_validator' require 'thread' $errors = 0 @@ -60,13 +61,6 @@ def expect_exception name, exception_type, &block puts message end -# Runs block and verifies that it throws a ValidationError. -# If the block doesn't throw such an exception, -# prints an error message and increments $errors. -def expect_ValidationError name, &block - expect_exception name, ValidationError, &block -end - $RUBY = ENV['RUBY'] || 'ruby' $VOODOOC = 'env RUBYLIB=../lib ../bin/voodooc' @@ -157,6 +151,18 @@ def add_test1 program add_test2 program, `cat #{program}.out` end +# Reports tests results. +# Returns 0 if all tests passed, 1 if some failed. +def report_test_results + if $errors == 0 + puts "All tests passed" + return 0 + else + puts "#{$errors} tests failed" + return 1 + end +end + # Runs all tests in the given queue. # Each test is described by a list # [name, command, expected_output, params]. @@ -173,87 +179,3 @@ def run_tests queue, nthreads = 1 end threads.each { |t| t.join } end - -test_validator - -test_language_version - -add_test 'architectures', '../bin/voodooc --architecture help', - `cat architectures.out` - -add_test 'features', '../bin/voodooc -a i386 --features', `cat features.out` - -add_test 'help', '../bin/voodooc --help', `cat help.out` - -add_test('no-input-files', - '../bin/voodooc', - '', - :expected_status => 128, - :expected_errors => `cat no-input-files.err`) - -add_test 'version', '../bin/voodooc --version', - "Voodoo Compiler version #{`cat ../VERSION`}" - -add_test2 'hello', "Hello, world!\n" - -add_test2 'tail-calls', '' - -add_test1 'bytes' - -add_test1 'call' - -add_test1 'at' - -add_test1 'block' - -add_test1 'else-if' - -add_test1 'if' - -add_test1 'goto' - -add_test2 'fact', "479001600\n" - -add_test1 'bitwise' - -add_test1 'plusminus' - -add_test1 'many-vars' - -add_test1 'mul' - -add_test1 'div' - -add_test1 'mod' - -add_test1 'raw' - -add_test1 'rotate' - -add_test1 'set-byte' - -add_test1 'set-word' - -add_test1 'shift' - -add_test1 'vtable' - -add_test1 'gcd' - -printf 'test_output_name...' -increment_errors unless system("$RUBY test_output_name.rb") - -add_test 'errors', - "#{$VOODOOC} -o errors.o errors.voo", - '', - :expected_status => 1, - :expected_errors => `cat errors.err` - -run_tests $tests, 4 - -if $errors == 0 - puts "All tests passed" -else - puts "#{$errors} tests failed" - exit 1 -end diff --git a/test/test_language_version.rb b/test/test_language_version.rb old mode 100644 new mode 100755 index e613c47..88e5617 --- a/test/test_language_version.rb +++ b/test/test_language_version.rb @@ -1,10 +1,11 @@ #! /usr/bin/env ruby -# Tests that all code generators support the expected version -# of the Voodoo language. +#### Tests that all code generators support the expected version +#### of the Voodoo language. -VERSION = "1.0" +VOODOO_VERSION = "1.0" +require File.dirname(__FILE__) + '/test' require 'voodoo' def test_language_version @@ -17,10 +18,15 @@ def test_language_version generator.has_feature? :voodoo end - expect_true "#{generator.class} supports voodoo #{VERSION}" do + expect_true "#{generator.class} supports voodoo #{VOODOO_VERSION}" do version = generator.features[:voodoo] - version == VERSION + version == VOODOO_VERSION end end end end + +if $0 == __FILE__ + test_language_version + exit report_test_results +end diff --git a/test/test_validator.rb b/test/test_validator.rb index f94723a..bf9cd7d 100755 --- a/test/test_validator.rb +++ b/test/test_validator.rb @@ -1,9 +1,17 @@ #! /usr/bin/env ruby +require File.dirname(__FILE__) + '/test' require 'voodoo/validator' include Voodoo::Validator +# Runs block and verifies that it throws a ValidationError. +# If the block doesn't throw such an exception, +# prints an error message and increments $errors. +def expect_ValidationError name, &block + expect_exception name, ValidationError, &block +end + def test_validator [:add, :and, :asr, :bsr, :div, :mod, :mul, :or, :rol, :ror, :shl, :shr, :sub, :xor].each do |binop| @@ -350,3 +358,8 @@ def test_validator validate_top_level [:word, "wrong"] } end + +if $0 == __FILE__ + test_validator + exit report_test_results +end -- 2.11.4.GIT