| #!/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 |
| |