summaryrefslogtreecommitdiffstats
path: root/third_party/rust/yaml-rust/tests/specs/cpp2rust.rb
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/yaml-rust/tests/specs/cpp2rust.rb')
-rwxr-xr-xthird_party/rust/yaml-rust/tests/specs/cpp2rust.rb78
1 files changed, 78 insertions, 0 deletions
diff --git a/third_party/rust/yaml-rust/tests/specs/cpp2rust.rb b/third_party/rust/yaml-rust/tests/specs/cpp2rust.rb
new file mode 100755
index 0000000000..25813c87a6
--- /dev/null
+++ b/third_party/rust/yaml-rust/tests/specs/cpp2rust.rb
@@ -0,0 +1,78 @@
+#!/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
+