78 lines
1.4 KiB
Ruby
Executable file
78 lines
1.4 KiB
Ruby
Executable file
#!/usr/bin/env ruby
|
|
|
|
TEST_REGEX = /TEST_F\([a-zA-Z0-9_]+,\s+([a-zA-Z0-9_]+)\)/
|
|
|
|
DISABLED_TESTS = %w(
|
|
test_ex7_10_plain_characters
|
|
test_ex7_17_flow_mapping_separate_values
|
|
test_ex7_21_single_pair_implicit_entries
|
|
test_ex7_2_empty_nodes
|
|
test_ex8_2_block_indentation_header
|
|
)
|
|
|
|
class Context
|
|
attr_accessor :name, :ev, :src
|
|
def initialize
|
|
@name = ""
|
|
@src = ""
|
|
@ev = []
|
|
end
|
|
end
|
|
|
|
class String
|
|
def snakecase
|
|
self
|
|
.gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
|
.gsub(/([a-z\d])([A-Z])/, '\1_\2')
|
|
.tr('-', '_')
|
|
.gsub(/\s/, '_')
|
|
.gsub(/__+/, '_')
|
|
.downcase
|
|
end
|
|
end
|
|
|
|
ctx = nil
|
|
|
|
tests = []
|
|
IO.foreach(ARGV[0]) do |line|
|
|
line.strip!
|
|
if ctx
|
|
fail "unexpected TEST_F" if line =~ TEST_REGEX
|
|
if line =~ /^}/
|
|
tests << ctx
|
|
ctx = nil
|
|
end
|
|
if line =~ /^EXPECT_CALL/
|
|
fail 'not end with ;' unless line[-1] == ';'
|
|
v = line.gsub('(', ' ').gsub(')', ' ').split
|
|
ctx.ev << v[2]
|
|
end
|
|
else
|
|
next unless line =~ TEST_REGEX
|
|
name = $1
|
|
next unless name =~ /^(Ex\d+_\d+)/
|
|
str = $1.upcase
|
|
$stderr.puts "found #{name}"
|
|
ctx = Context.new
|
|
ctx.name = "test_#{name.snakecase}"
|
|
ctx.src = str
|
|
end
|
|
end
|
|
|
|
# code gen
|
|
tests.each do |t|
|
|
next if t.ev.size == 0
|
|
if DISABLED_TESTS.include? t.name
|
|
puts "#[allow(dead_code)]"
|
|
else
|
|
puts "#[test]"
|
|
end
|
|
puts "fn #{t.name}() {"
|
|
puts " let mut v = str_to_test_events(#{t.src}).into_iter();"
|
|
t.ev.each do |e|
|
|
puts " assert_next!(v, TestEvent::#{e});"
|
|
end
|
|
puts "}"
|
|
puts
|
|
end
|
|
|