blob: b44af5399cb0aa3dd81ad13ed5d9e12fbca56134 [file] [log] [blame]
#!/usr/bin/env ruby
require 'fileutils'
def get_output_filenames
files = Dir.glob('*')
files.delete('Makefile')
files
end
def cleanup
get_output_filenames.each do |fname|
FileUtils.rm_rf fname
end
end
expected_failures = []
unexpected_passes = []
failures = []
passes = []
Dir.glob('test/*.mk').sort.each do |mk|
c = File.read(mk)
expected_failure = c =~ /\A# TODO/
name = mk[/([^\/]+)\.mk$/, 1]
dir = "out/#{name}"
FileUtils.mkdir_p(dir)
Dir.glob("#{dir}/*").each do |fname|
FileUtils.rm_rf(fname)
end
Dir.chdir(dir) do
File.open("Makefile", 'w') do |ofile|
ofile.print(c)
end
expected = ''
output = ''
testcases = c.scan(/^test\d*/).sort
if testcases.empty?
testcases = ['']
end
cleanup
testcases.each do |tc|
expected += "=== #{tc} ===\n" + `make #{tc} 2>&1`
expected_files = get_output_filenames
expected += "\n=== FILES ===\n#{expected_files * "\n"}\n"
end
cleanup
testcases.each do |tc|
output += "=== #{tc} ===\n" + `../../kati #{tc} 2>&1`
output_files = get_output_filenames
output += "\n=== FILES ===\n#{output_files * "\n"}\n"
end
expected.gsub!(/^make\[\d+\]: (Entering|Leaving) directory.*\n/, '')
expected.gsub!(/^make\[\d+\]: /, '')
# Normalizations for old/new GNU make.
expected.gsub!(/[`'"]/, '"')
expected.gsub!(/ (?:commands|recipe) for target /,
' commands for target ')
expected.gsub!(/ (?:commands|recipe) commences /,
' commands commence ')
expected.gsub!(' (did you mean TAB instead of 8 spaces?)', '')
# Not sure if this is useful.
expected.gsub!(/\s+Stop\.$/, '')
# GNU make 4.0 has this output.
expected.gsub!(/Makefile:\d+: commands for target ".*?" failed\n/, '')
# kati specific log messages.
output.gsub!(/^\*kati\*.*\n/, '')
output.gsub!(/[`'"]/, '"')
File.open('out.make', 'w'){|ofile|ofile.print(expected)}
File.open('out.kati', 'w'){|ofile|ofile.print(output)}
if expected != output
if expected_failure
puts "#{name}: FAIL (expected)"
expected_failures << name
else
puts "#{name}: FAIL"
puts `diff -u out.make out.kati`
failures << name
end
else
if expected_failure
puts "#{name}: PASS (unexpected)"
unexpected_passes << name
else
puts "#{name}: PASS"
passes << name
end
end
end
end
puts
if !expected_failures.empty?
puts "=== Expected failures ==="
expected_failures.each do |n|
puts n
end
end
if !unexpected_passes.empty?
puts "=== Unexpected passes ==="
unexpected_passes.each do |n|
puts n
end
end
if !failures.empty?
puts "=== Failures ==="
failures.each do |n|
puts n
end
end
puts
if !unexpected_passes.empty? || !failures.empty?
puts 'FAIL!'
else
puts 'PASS!'
end