summaryrefslogtreecommitdiff
path: root/test/prism/errors_test.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/prism/errors_test.rb')
-rw-r--r--test/prism/errors_test.rb101
1 files changed, 101 insertions, 0 deletions
diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb
new file mode 100644
index 0000000000..f46cb942a2
--- /dev/null
+++ b/test/prism/errors_test.rb
@@ -0,0 +1,101 @@
+# frozen_string_literal: true
+
+require_relative "test_helper"
+
+module Prism
+ class ErrorsTest < TestCase
+ base = File.expand_path("errors", __dir__)
+ filepaths = Dir["*.txt", base: base]
+
+ if RUBY_VERSION < "3.0"
+ filepaths -= [
+ "cannot_assign_to_a_reserved_numbered_parameter.txt",
+ "writing_numbered_parameter.txt",
+ "targeting_numbered_parameter.txt",
+ "defining_numbered_parameter.txt",
+ "defining_numbered_parameter_2.txt",
+ "numbered_parameters_in_block_arguments.txt"
+ ]
+ end
+
+ if RUBY_VERSION < "3.4"
+ filepaths -= ["it_with_ordinary_parameter.txt"]
+ end
+
+ if RUBY_VERSION < "3.4" || RUBY_RELEASE_DATE < "2024-07-24"
+ filepaths -= ["dont_allow_return_inside_sclass_body.txt"]
+ end
+
+ filepaths.each do |filepath|
+ define_method(:"test_#{File.basename(filepath, ".txt")}") do
+ assert_errors(File.join(base, filepath))
+ end
+ end
+
+ def test_embdoc_ending
+ source = <<~RUBY
+ =begin\n=end
+ =begin\n=end\0
+ =begin\n=end\C-d
+ =begin\n=end\C-z
+ RUBY
+
+ source.each_line do |line|
+ assert_valid_syntax(source)
+ assert_predicate Prism.parse(source), :success?
+ end
+ end
+
+ def test_unterminated_string_closing
+ statement = Prism.parse_statement("'hello")
+ assert_equal statement.unescaped, "hello"
+ assert_empty statement.closing
+ end
+
+ def test_unterminated_interpolated_string_closing
+ statement = Prism.parse_statement('"hello')
+ assert_equal statement.unescaped, "hello"
+ assert_empty statement.closing
+ end
+
+ def test_unterminated_empty_string_closing
+ statement = Prism.parse_statement('"')
+ assert_empty statement.unescaped
+ assert_empty statement.closing
+ end
+
+ def test_invalid_message_name
+ assert_equal :"", Prism.parse_statement("+.@foo,+=foo").write_name
+ end
+
+ def test_circular_parameters
+ source = <<~RUBY
+ def foo(bar = bar) = 42
+ def foo(bar: bar) = 42
+ proc { |foo = foo| }
+ proc { |foo: foo| }
+ RUBY
+
+ source.each_line do |line|
+ assert_predicate Prism.parse(line, version: "3.3.0"), :failure?
+ assert_predicate Prism.parse(line), :success?
+ end
+ end
+
+ private
+
+ def assert_errors(filepath)
+ expected = File.read(filepath, binmode: true, external_encoding: Encoding::UTF_8)
+
+ source = expected.lines.grep_v(/^\s*\^/).join.gsub(/\n*\z/, "")
+ refute_valid_syntax(source)
+
+ result = Prism.parse(source)
+ errors = result.errors
+ refute_empty errors, "Expected errors in #{filepath}"
+
+ actual = result.errors_format
+ assert_equal expected, actual, "Expected errors to match for #{filepath}"
+ end
+ end
+end