blob: 57f77f82c1b55ed4c70acd549b81eb8136fcf32b [file] [log] [blame]
Fumitoshi Ukai119dc912015-03-30 16:52:41 +09001#!/usr/bin/env ruby
2
3require 'fileutils'
4
5def get_output_filenames
6 files = Dir.glob('*')
7 files.delete('Makefile')
8 files
9end
10
11def cleanup
12 get_output_filenames.each do |fname|
Shinichiro Hamajic6713602015-04-01 01:03:34 +090013 FileUtils.rm_rf fname
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090014 end
15end
16
Shinichiro Hamajic6713602015-04-01 01:03:34 +090017expected_failures = []
18unexpected_passes = []
19failures = []
20passes = []
21
Shinichiro Hamajieb798f72015-04-06 13:41:13 +090022Dir.glob('testcase/*.mk').sort.each do |mk|
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090023 c = File.read(mk)
24
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +090025 expected_failure = c =~ /\A# TODO/
26
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090027 name = mk[/([^\/]+)\.mk$/, 1]
28 dir = "out/#{name}"
Shinichiro Hamaji52e42032015-03-31 23:20:13 +090029
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090030 FileUtils.mkdir_p(dir)
Shinichiro Hamaji52e42032015-03-31 23:20:13 +090031 Dir.glob("#{dir}/*").each do |fname|
32 FileUtils.rm_rf(fname)
33 end
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090034
35 Dir.chdir(dir) do
36 File.open("Makefile", 'w') do |ofile|
37 ofile.print(c)
38 end
39
40 expected = ''
41 output = ''
42
Shinichiro Hamajie5be0142015-03-30 19:26:01 +090043 testcases = c.scan(/^test\d*/).sort
Shinichiro Hamaji497754d2015-03-31 02:02:11 +090044 if testcases.empty?
45 testcases = ['']
46 end
Shinichiro Hamajie5be0142015-03-30 19:26:01 +090047
48 cleanup
49 testcases.each do |tc|
50 expected += "=== #{tc} ===\n" + `make #{tc} 2>&1`
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090051 expected_files = get_output_filenames
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090052 expected += "\n=== FILES ===\n#{expected_files * "\n"}\n"
Shinichiro Hamajie5be0142015-03-30 19:26:01 +090053 end
54
55 cleanup
56 testcases.each do |tc|
57 output += "=== #{tc} ===\n" + `../../kati #{tc} 2>&1`
58 output_files = get_output_filenames
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090059 output += "\n=== FILES ===\n#{output_files * "\n"}\n"
60 end
61
Shinichiro Hamajib2fd38d2015-04-01 01:12:19 +090062 expected.gsub!(/^make\[\d+\]: (Entering|Leaving) directory.*\n/, '')
63 expected.gsub!(/^make\[\d+\]: /, '')
Shinichiro Hamaji5971b4b2015-03-31 00:37:11 +090064 # Normalizations for old/new GNU make.
65 expected.gsub!(/[`'"]/, '"')
66 expected.gsub!(/ (?:commands|recipe) for target /,
67 ' commands for target ')
Shinichiro Hamajifed074e2015-03-31 21:51:43 +090068 expected.gsub!(/ (?:commands|recipe) commences /,
69 ' commands commence ')
Shinichiro Hamaji0ec07702015-03-31 00:50:32 +090070 expected.gsub!(' (did you mean TAB instead of 8 spaces?)', '')
Shinichiro Hamaji940278a2015-04-02 02:59:59 +090071 # Not sure if this is useful.
Shinichiro Hamaji0ec07702015-03-31 00:50:32 +090072 expected.gsub!(/\s+Stop\.$/, '')
Shinichiro Hamaji940278a2015-04-02 02:59:59 +090073 # GNU make 4.0 has this output.
74 expected.gsub!(/Makefile:\d+: commands for target ".*?" failed\n/, '')
75
76 # kati specific log messages.
Shinichiro Hamajie5be0142015-03-30 19:26:01 +090077 output.gsub!(/^\*kati\*.*\n/, '')
Fumitoshi Ukaid8904252015-04-02 11:34:31 +090078 output.gsub!(/[`'"]/, '"')
Shinichiro Hamajie5be0142015-03-30 19:26:01 +090079
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090080 File.open('out.make', 'w'){|ofile|ofile.print(expected)}
81 File.open('out.kati', 'w'){|ofile|ofile.print(output)}
82
83 if expected != output
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +090084 if expected_failure
85 puts "#{name}: FAIL (expected)"
Shinichiro Hamajic6713602015-04-01 01:03:34 +090086 expected_failures << name
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +090087 else
88 puts "#{name}: FAIL"
89 puts `diff -u out.make out.kati`
Shinichiro Hamajic6713602015-04-01 01:03:34 +090090 failures << name
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +090091 end
Fumitoshi Ukai119dc912015-03-30 16:52:41 +090092 else
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +090093 if expected_failure
94 puts "#{name}: PASS (unexpected)"
Shinichiro Hamajic6713602015-04-01 01:03:34 +090095 unexpected_passes << name
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +090096 else
97 puts "#{name}: PASS"
Shinichiro Hamajic6713602015-04-01 01:03:34 +090098 passes << name
Shinichiro Hamaji91b105c2015-03-30 18:39:05 +090099 end
Fumitoshi Ukai119dc912015-03-30 16:52:41 +0900100 end
101 end
102end
Shinichiro Hamajic6713602015-04-01 01:03:34 +0900103
104puts
105
106if !expected_failures.empty?
107 puts "=== Expected failures ==="
108 expected_failures.each do |n|
109 puts n
110 end
111end
112
113if !unexpected_passes.empty?
114 puts "=== Unexpected passes ==="
115 unexpected_passes.each do |n|
116 puts n
117 end
118end
119
120if !failures.empty?
121 puts "=== Failures ==="
122 failures.each do |n|
123 puts n
124 end
125end
126
127puts
128
129if !unexpected_passes.empty? || !failures.empty?
130 puts 'FAIL!'
131else
132 puts 'PASS!'
133end