summaryrefslogtreecommitdiff
path: root/test/ripper/test_sexp.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/ripper/test_sexp.rb')
-rw-r--r--test/ripper/test_sexp.rb54
1 files changed, 53 insertions, 1 deletions
diff --git a/test/ripper/test_sexp.rb b/test/ripper/test_sexp.rb
index 9faeaba782..3ebcf3062e 100644
--- a/test/ripper/test_sexp.rb
+++ b/test/ripper/test_sexp.rb
@@ -18,6 +18,11 @@ class TestRipper::Sexp < Test::Unit::TestCase
assert_nil Ripper.sexp("/*")
assert_nil Ripper.sexp("/*/")
assert_nil Ripper.sexp("/+/")
+ assert_nil Ripper.sexp("m(&nil) {}"), '[Bug #10436]'
+ assert_nil Ripper.sexp("/(?<a>)/ =~ ''; x = a **a, **a if false"), '[Bug #18988]'
+ assert_nil Ripper.sexp("return + return"), '[Bug #20055]'
+ assert_nil Ripper.sexp("1 in [a, a]"), '[Bug #20055]'
+ assert_nil Ripper.sexp("1 + (1 => [a, a])"), '[Bug #20055]'
end
def test_regexp_content
@@ -34,6 +39,14 @@ class TestRipper::Sexp < Test::Unit::TestCase
assert_equal '(?<n>a(b|\g<n>))', search_sexp(:@tstring_content, search_sexp(:regexp_literal, sexp))[1]
end
+ def test_regexp_named_capture
+ sexp = Ripper.sexp("/(?<a>)/ =~ ''; x = a **a, a if false")
+ assert_not_nil sexp, '[Bug #18988]'
+
+ sexp = Ripper.sexp("/(?<a>)/ =~ ''; a %(exit)")
+ assert_equal 'exit', search_sexp(:@ident, search_sexp(:paren, sexp))[1], '[Bug #18988]'
+ end
+
def test_heredoc_content
sexp = Ripper.sexp("<<E\nfoo\nE")
assert_equal "foo\n", search_sexp(:@tstring_content, sexp)[1]
@@ -110,6 +123,21 @@ eot
assert_equal(exp, named)
end
+ def test_command
+ sexp = Ripper.sexp("a::C {}")
+ assert_equal(
+ [:program,
+ [
+ [:method_add_block,
+ [:command_call,
+ [:vcall, [:@ident, "a", [1, 0]]],
+ [:@op, "::", [1, 1]],
+ [:@const, "C", [1, 3]],
+ nil],
+ [:brace_block, nil, [[:void_stmt]]]]]],
+ sexp)
+ end
+
def search_sexp(sym, sexp)
return sexp if !sexp or sexp[0] == sym
sexp.find do |e|
@@ -175,7 +203,7 @@ eot
[:aryptn,
nil,
[[:var_field, [:@ident, "a", [1, 11]]]],
- [:var_field, nil],
+ nil,
nil],
[[:void_stmt]],
nil]],
@@ -407,6 +435,14 @@ eot
[[:void_stmt]],
nil]],
+ [__LINE__, %q{ case 0; in [a,]; end }] =>
+ [:case,
+ [:@int, "0", [1, 5]],
+ [:in,
+ [:aryptn, nil, [[:var_field, [:@ident, "a", [1, 12]]]], nil, nil],
+ [[:void_stmt]],
+ nil]],
+
[__LINE__, %q{ case 0; in []; end }] =>
[:case,
[:@int, "0", [1, 5]],
@@ -486,6 +522,22 @@ eot
[:begin, [:binary, [:@int, "0", [1, 13]], :+, [:@int, "0", [1, 15]]]],
[[:void_stmt]],
nil]],
+
+ [__LINE__, %q{ case 0; in [*a]; a; end } ] =>
+ [:case,
+ [:@int, "0", [1, 5]],
+ [:in,
+ [:aryptn, nil, nil, [:var_field, [:@ident, "a", [1, 13]]], nil],
+ [[:var_ref, [:@ident, "a", [1, 17]]]],
+ nil]],
+
+ [__LINE__, %q{ case 0; in {a:}; a; end } ] =>
+ [:case,
+ [:@int, "0", [1, 5]],
+ [:in,
+ [:hshptn, nil, [[[:@label, "a:", [1, 12]], nil]], nil],
+ [[:var_ref, [:@ident, "a", [1, 17]]]],
+ nil]],
}
pattern_matching_data.each do |(i, src), expected|
define_method(:"test_pattern_matching_#{i}") do