diff options
| author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-06-14 14:10:03 +0900 |
|---|---|---|
| committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-06-14 15:02:15 +0900 |
| commit | 2e59cf00cc35183fe9b616672cb8d2b461b1cf9b (patch) | |
| tree | ecabd435b1b1a7b8a5f62423574209b83f389c68 /test | |
| parent | 2677ab160742a968276dce7661247f9321470cd3 (diff) | |
[Bug #20578] ripper: Fix dispatching part at invalid escapes
Diffstat (limited to 'test')
| -rw-r--r-- | test/ripper/test_lexer.rb | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/test/ripper/test_lexer.rb b/test/ripper/test_lexer.rb index 64b4336375..e460a7fd13 100644 --- a/test/ripper/test_lexer.rb +++ b/test/ripper/test_lexer.rb @@ -390,6 +390,115 @@ world" assert_lexer(expected, code) end + def test_invalid_escape_string + code = "\"hello\\x world" + expected = [ + [[1, 0], :on_tstring_beg, "\"", state(:EXPR_BEG)], + [[1, 1], :on_tstring_content, "hello", state(:EXPR_BEG)], + [[1, 5], :on_tstring_content, "\\x", state(:EXPR_BEG)], + [[1, 7], :on_tstring_content, " world", state(:EXPR_BEG)], + ] + + code = "\"\nhello\\x world" + expected = [ + [[1, 0], :on_tstring_beg, "\"", state(:EXPR_BEG)], + [[1, 1], :on_tstring_content, "\n" "hello", state(:EXPR_BEG)], + [[2, 5], :on_tstring_content, "\\x", state(:EXPR_BEG)], + [[2, 7], :on_tstring_content, " world", state(:EXPR_BEG)], + ] + assert_lexer(expected, code) + + code = "\"\n\\Cxx\"" + expected = [ + [[1, 0], :on_tstring_beg, "\"", state(:EXPR_BEG)], + [[1, 1], :on_tstring_content, "\n", state(:EXPR_BEG)], + [[2, 0], :on_tstring_content, "\\Cx", state(:EXPR_BEG)], + [[2, 3], :on_tstring_content, "x", state(:EXPR_BEG)], + [[2, 4], :on_tstring_end, "\"", state(:EXPR_END)], + ] + assert_lexer(expected, code) + + code = "\"\n\\Mxx\"" + expected = [ + [[1, 0], :on_tstring_beg, "\"", state(:EXPR_BEG)], + [[1, 1], :on_tstring_content, "\n", state(:EXPR_BEG)], + [[2, 0], :on_tstring_content, "\\Mx", state(:EXPR_BEG)], + [[2, 3], :on_tstring_content, "x", state(:EXPR_BEG)], + [[2, 4], :on_tstring_end, "\"", state(:EXPR_END)], + ] + assert_lexer(expected, code) + + code = "\"\n\\c\\cx\"" + expected = [ + [[1, 0], :on_tstring_beg, "\"", state(:EXPR_BEG)], + [[1, 1], :on_tstring_content, "\n", state(:EXPR_BEG)], + [[2, 0], :on_tstring_content, "\\c\\c", state(:EXPR_BEG)], + [[2, 4], :on_tstring_content, "x", state(:EXPR_BEG)], + [[2, 5], :on_tstring_end, "\"", state(:EXPR_END)], + ] + assert_lexer(expected, code) + + code = "\"\n\\ux\"" + expected = [ + [[1, 0], :on_tstring_beg, "\"", state(:EXPR_BEG)], + [[1, 1], :on_tstring_content, "\n", state(:EXPR_BEG)], + [[2, 0], :on_tstring_content, "\\u", state(:EXPR_BEG)], + [[2, 2], :on_tstring_content, "x", state(:EXPR_BEG)], + [[2, 3], :on_tstring_end, "\"", state(:EXPR_END)], + ] + assert_lexer(expected, code) + + code = "\"\n\\xx\"" + expected = [ + [[1, 0], :on_tstring_beg, "\"", state(:EXPR_BEG)], + [[1, 1], :on_tstring_content, "\n", state(:EXPR_BEG)], + [[2, 0], :on_tstring_content, "\\x", state(:EXPR_BEG)], + [[2, 2], :on_tstring_content, "x", state(:EXPR_BEG)], + [[2, 3], :on_tstring_end, "\"", state(:EXPR_END)], + ] + assert_lexer(expected, code) + + code = "<<A\n\n\\xyz" + expected = [ + [[1, 0], :on_heredoc_beg, "<<A", state(:EXPR_BEG)], + [[1, 3], :on_nl, "\n", state(:EXPR_BEG)], + [[2, 0], :on_tstring_content, "\n", state(:EXPR_BEG)], + [[3, 0], :on_tstring_content, "\\x", state(:EXPR_BEG)], + [[3, 2], :on_tstring_content, "yz", state(:EXPR_BEG)], + ] + assert_lexer(expected, code) + + code = "%(\n\\xyz)" + expected = [ + [[1, 0], :on_tstring_beg, "%(", state(:EXPR_BEG)], + [[1, 2], :on_tstring_content, "\n", state(:EXPR_BEG)], + [[2, 0], :on_tstring_content, "\\x", state(:EXPR_BEG)], + [[2, 2], :on_tstring_content, "yz", state(:EXPR_BEG)], + [[2, 4], :on_tstring_end, ")", state(:EXPR_END)], + ] + assert_lexer(expected, code) + + code = "%Q(\n\\xyz)" + expected = [ + [[1, 0], :on_tstring_beg, "%Q(", state(:EXPR_BEG)], + [[1, 3], :on_tstring_content, "\n", state(:EXPR_BEG)], + [[2, 0], :on_tstring_content, "\\x", state(:EXPR_BEG)], + [[2, 2], :on_tstring_content, "yz", state(:EXPR_BEG)], + [[2, 4], :on_tstring_end, ")", state(:EXPR_END)], + ] + assert_lexer(expected, code) + + code = ":\"\n\\xyz\"" + expected = [ + [[1, 0], :on_symbeg, ":\"", state(:EXPR_FNAME)], + [[1, 2], :on_tstring_content, "\n", state(:EXPR_FNAME)], + [[2, 0], :on_tstring_content, "\\x", state(:EXPR_FNAME)], + [[2, 2], :on_tstring_content, "yz", state(:EXPR_FNAME)], + [[2, 4], :on_tstring_end, "\"", state(:EXPR_END)], + ] + assert_lexer(expected, code) + end + def assert_lexer(expected, code) assert_equal(code, Ripper.tokenize(code).join("")) assert_equal(expected, result = Ripper.lex(code), |
