diff options
author | Yusuke Endoh <mame@ruby-lang.org> | 2021-06-28 13:27:35 +0900 |
---|---|---|
committer | Yusuke Endoh <mame@ruby-lang.org> | 2021-06-29 23:45:49 +0900 |
commit | 9438c99590f5476a81cee8b4cf2de25084a40b42 (patch) | |
tree | c7416588e060d079a082fb62b3a96e40164e4268 /test/error_highlight | |
parent | e94604966572bb43fc887856d54aa54b8e9f7719 (diff) |
Rename error_squiggle to error_highlight
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/4586
Diffstat (limited to 'test/error_highlight')
-rw-r--r-- | test/error_highlight/test_error_highlight.rb | 984 |
1 files changed, 984 insertions, 0 deletions
diff --git a/test/error_highlight/test_error_highlight.rb b/test/error_highlight/test_error_highlight.rb new file mode 100644 index 0000000000..f2a27aa6d5 --- /dev/null +++ b/test/error_highlight/test_error_highlight.rb @@ -0,0 +1,984 @@ +require "test/unit" + +require "error_highlight" + +class ErrorHighlightTest < Test::Unit::TestCase + class DummyFormatter + def message_for(corrections) + "" + end + end + + def setup + if defined?(DidYouMean) + @did_you_mean_old_formatter = DidYouMean.formatter + DidYouMean.formatter = DummyFormatter + end + end + + def teardown + if defined?(DidYouMean) + DidYouMean.formatter = @did_you_mean_old_formatter + end + end + + def assert_error_message(klass, expected_msg, &blk) + err = assert_raise(klass, &blk) + assert_equal(expected_msg.chomp, err.message) + end + + def test_CALL_noarg_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + nil.foo + 1 + ^^^^ + END + + nil.foo + 1 + end + end + + def test_CALL_noarg_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + .foo + 1 + ^^^^ + END + + nil + .foo + 1 + end + end + + def test_CALL_noarg_3 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + foo + 1 + ^^^ + END + + nil. + foo + 1 + end + end + + def test_CALL_arg_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + nil.foo (42) + ^^^^ + END + + nil.foo (42) + end + end + + def test_CALL_arg_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + .foo ( + ^^^^ + END + + nil + .foo ( + 42 + ) + end + end + + def test_CALL_arg_3 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + foo ( + ^^^ + END + + nil. + foo ( + 42 + ) + end + end + + def test_CALL_arg_4 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + nil.foo(42) + ^^^^ + END + + nil.foo(42) + end + end + + def test_CALL_arg_5 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + .foo( + ^^^^ + END + + nil + .foo( + 42 + ) + end + end + + def test_CALL_arg_6 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + foo( + ^^^ + END + + nil. + foo( + 42 + ) + end + end + + def test_QCALL_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for 1:Integer + + 1&.foo + ^^^^^ + END + + 1&.foo + end + end + + def test_QCALL_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for 1:Integer + + 1&.foo(42) + ^^^^^ + END + + 1&.foo(42) + end + end + + def test_CALL_aref_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `[]' for nil:NilClass + + nil [ ] + ^^^ + END + + nil [ ] + end + end + + def test_CALL_aref_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `[]' for nil:NilClass + + nil [0] + ^^^ + END + + nil [0] + end + end + + def test_CALL_aref_3 + assert_error_message(NoMethodError, <<~END) do +undefined method `[]' for nil:NilClass + END + + nil [ + 0 + ] + end + end + + def test_CALL_aref_4 + v = Object.new + assert_error_message(NoMethodError, <<~END) do +undefined method `[]' for #{ v.inspect } + + v &.[](0) + ^^^^ + END + + v &.[](0) + end + end + + def test_CALL_aset + assert_error_message(NoMethodError, <<~END) do +undefined method `[]=' for nil:NilClass + + nil.[]= + ^^^^ + END + + nil.[]= + end + end + + def test_CALL_op_asgn + v = nil + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + v += 42 + ^ + END + + v += 42 + end + end + + def test_CALL_special_call_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `call' for nil:NilClass + END + + nil.() + end + end + + def test_CALL_special_call_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `call' for nil:NilClass + END + + nil.(42) + end + end + + def test_CALL_send + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + nil.send(:foo, 42) + ^^^^^ + END + + nil.send(:foo, 42) + end + end + + def test_ATTRASGN_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `[]=' for nil:NilClass + + nil [ ] = 42 + ^^^^^ + END + + nil [ ] = 42 + end + end + + def test_ATTRASGN_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `[]=' for nil:NilClass + + nil [0] = 42 + ^^^^^ + END + + nil [0] = 42 + end + end + + def test_ATTRASGN_3 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo=' for nil:NilClass + + nil.foo = 42 + ^^^^^^ + END + + nil.foo = 42 + end + end + + def test_OPCALL_binary_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + nil + 42 + ^ + END + + nil + 42 + end + end + + def test_OPCALL_binary_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + nil + # comment + ^ + END + + nil + # comment + 42 + end + end + + def test_OPCALL_unary + assert_error_message(NoMethodError, <<~END) do +undefined method `+@' for nil:NilClass + + + nil + ^ + END + + + nil + end + end + + def test_FCALL_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + nil.instance_eval { foo() } + ^^^ + END + + nil.instance_eval { foo() } + end + end + + def test_FCALL_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + nil.instance_eval { foo(42) } + ^^^ + END + + nil.instance_eval { foo(42) } + end + end + + def test_VCALL_2 + assert_error_message(NameError, <<~END) do +undefined local variable or method `foo' for nil:NilClass + + nil.instance_eval { foo } + ^^^ + END + + nil.instance_eval { foo } + end + end + + def test_OP_ASGN1_aref_1 + v = nil + + assert_error_message(NoMethodError, <<~END) do +undefined method `[]' for nil:NilClass + + v [0] += 42 + ^^^ + END + + v [0] += 42 + end + end + + def test_OP_ASGN1_aref_2 + v = nil + + assert_error_message(NoMethodError, <<~END) do +undefined method `[]' for nil:NilClass + + v [0] += # comment + ^^^ + END + + v [0] += # comment + 42 + end + end + + def test_OP_ASGN1_aref_3 + v = nil + + assert_error_message(NoMethodError, <<~END) do +undefined method `[]' for nil:NilClass + END + + v [ + 0 + ] += # comment + 42 + end + end + + def test_OP_ASGN1_op_1 + v = Object.new + def v.[](x); nil; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + v [0] += 42 + ^ + END + + v [0] += 42 + end + end + + def test_OP_ASGN1_op_2 + v = Object.new + def v.[](x); nil; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + v [0 ] += # comment + ^ + END + + v [0 ] += # comment + 42 + end + end + + def test_OP_ASGN1_op_3 + v = Object.new + def v.[](x); nil; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + END + + v [ + 0 + ] += + 42 + end + end + + def test_OP_ASGN1_aset_1 + v = Object.new + def v.[](x); 1; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `[]=' for #{ v.inspect } + + v [0] += 42 + ^^^^^^ + END + + v [0] += 42 + end + end + + def test_OP_ASGN1_aset_2 + v = Object.new + def v.[](x); 1; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `[]=' for #{ v.inspect } + + v [0] += # comment + ^^^^^^ + END + + v [0] += # comment + 42 + end + end + + def test_OP_ASGN1_aset_3 + v = Object.new + def v.[](x); 1; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `[]=' for #{ v.inspect } + END + + v [ + 0 + ] += + 42 + end + end + + def test_OP_ASGN2_read_1 + v = nil + + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + v.foo += 42 + ^^^^ + END + + v.foo += 42 + end + end + + def test_OP_ASGN2_read_2 + v = nil + + assert_error_message(NoMethodError, <<~END) do +undefined method `foo' for nil:NilClass + + v.foo += # comment + ^^^^ + END + + v.foo += # comment + 42 + end + end + + def test_OP_ASGN2_op_1 + v = Object.new + def v.foo; nil; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + v.foo += 42 + ^ + END + + v.foo += 42 + end + end + + def test_OP_ASGN2_op_2 + v = Object.new + def v.foo; nil; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + v.foo += # comment + ^ + END + + v.foo += # comment + 42 + end + end + + def test_OP_ASGN2_write_1 + v = Object.new + def v.foo; 1; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `foo=' for #{ v.inspect } + + v.foo += 42 + ^^^^^^^ + END + + v.foo += 42 + end + end + + def test_OP_ASGN2_write_2 + v = Object.new + def v.foo; 1; end + + assert_error_message(NoMethodError, <<~END) do +undefined method `foo=' for #{ v.inspect } + + v.foo += # comment + ^^^^^^^ + END + + v.foo += # comment + 42 + end + end + + def test_CONST + assert_error_message(NameError, <<~END) do +uninitialized constant ErrorHighlightTest::NotDefined + + 1 + NotDefined + 1 + ^^^^^^^^^^ + END + + 1 + NotDefined + 1 + end + end + + def test_COLON2_1 + assert_error_message(NameError, <<~END) do +uninitialized constant ErrorHighlightTest::NotDefined + + ErrorHighlightTest::NotDefined + ^^^^^^^^^^^^ + END + + ErrorHighlightTest::NotDefined + end + end + + def test_COLON2_2 + assert_error_message(NameError, <<~END) do +uninitialized constant ErrorHighlightTest::NotDefined + + NotDefined + ^^^^^^^^^^ + END + + ErrorHighlightTest:: + NotDefined + end + end + + def test_COLON3 + assert_error_message(NameError, <<~END) do +uninitialized constant NotDefined + + ::NotDefined + ^^^^^^^^^^^^ + END + + ::NotDefined + end + end + + module OP_CDECL_TEST + Nil = nil + end + + def test_OP_CDECL_read_1 + assert_error_message(NameError, <<~END) do +uninitialized constant ErrorHighlightTest::OP_CDECL_TEST::NotDefined + + OP_CDECL_TEST::NotDefined += 1 + ^^^^^^^^^^^^ + END + + OP_CDECL_TEST::NotDefined += 1 + end + end + + def test_OP_CDECL_read_2 + assert_error_message(NameError, <<~END) do +uninitialized constant ErrorHighlightTest::OP_CDECL_TEST::NotDefined + + OP_CDECL_TEST::NotDefined += # comment + ^^^^^^^^^^^^ + END + + OP_CDECL_TEST::NotDefined += # comment + 1 + end + end + + def test_OP_CDECL_read_3 + assert_error_message(NameError, <<~END) do +uninitialized constant ErrorHighlightTest::OP_CDECL_TEST::NotDefined + END + + OP_CDECL_TEST:: + NotDefined += 1 + end + end + + def test_OP_CDECL_op_1 + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + OP_CDECL_TEST::Nil += 1 + ^ + END + + OP_CDECL_TEST::Nil += 1 + end + end + + def test_OP_CDECL_op_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + OP_CDECL_TEST::Nil += # comment + ^ + END + + OP_CDECL_TEST::Nil += # comment + 1 + end + end + + def test_OP_CDECL_op_3 + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for nil:NilClass + + Nil += 1 + ^ + END + + OP_CDECL_TEST:: + Nil += 1 + end + end + + def test_OP_CDECL_toplevel_1 + assert_error_message(NameError, <<~END) do +uninitialized constant NotDefined + + ::NotDefined += 1 + ^^^^^^^^^^^^ + END + + ::NotDefined += 1 + end + end + + def test_OP_CDECL_toplevel_2 + assert_error_message(NoMethodError, <<~END) do +undefined method `+' for ErrorHighlightTest:Class + + ::ErrorHighlightTest += 1 + ^ + END + + ::ErrorHighlightTest += 1 + end + end + + def test_explicit_raise_name_error + assert_error_message(NameError, <<~END) do +NameError + + raise NameError + ^^^^^ + END + + raise NameError + end + end + + def test_explicit_raise_no_method_error + assert_error_message(NoMethodError, <<~END) do +NoMethodError + + raise NoMethodError + ^^^^^ + END + + raise NoMethodError + end + end + + def test_const_get + assert_error_message(NameError, <<~END) do +uninitialized constant ErrorHighlightTest::NotDefined + + ErrorHighlightTest.const_get(:NotDefined) + ^^^^^^^^^^ + END + + ErrorHighlightTest.const_get(:NotDefined) + end + end + + def test_local_variable_get + b = binding + assert_error_message(NameError, <<~END) do +local variable `foo' is not defined for #{ b.inspect } + + b.local_variable_get(:foo) + ^^^^^^^^^^^^^^^^^^^ + END + + b.local_variable_get(:foo) + end + end + + def test_multibyte + assert_error_message(NoMethodError, <<~END) do +undefined method `あいうえお' for nil:NilClass + + nil.あいうえお + ^^^^^^ + END + + nil.あいうえお + end + end + + if false + + def test_args_CALL_1 + assert_error_message(TypeError, <<~END) do +nil can't be coerced into Integer + + 1.+(nil) + ^^^ + END + + 1.+(nil) + end + end + + def test_args_CALL_2 + v = [] + assert_error_message(TypeError, <<~END) do +no implicit conversion from nil to integer + + v[nil] + ^^^ + END + + v[nil] + end + end + + def test_args_ATTRASGN_1 + v = [] + assert_error_message(ArgumentError, <<~END) do +wrong number of arguments (given 1, expected 2..3) + + v [ ] = 1 + ^^^^^^ + END + + v [ ] = 1 + end + end + + def test_args_ATTRASGN_2 + v = [] + assert_error_message(TypeError, <<~END) do +no implicit conversion from nil to integer + + v [nil] = 1 + ^^^^^^^^ + END + + v [nil] = 1 + end + end + + def test_args_ATTRASGN_3 + assert_error_message(TypeError, <<~END) do +no implicit conversion of String into Integer + + $stdin.lineno = "str" + ^^^^^ + END + + $stdin.lineno = "str" + end + end + + def test_args_OPCALL + assert_error_message(TypeError, <<~END) do +nil can't be coerced into Integer + + 1 + nil + ^^^ + END + + 1 + nil + end + end + + def test_args_FCALL_1 + assert_error_message(TypeError, <<~END) do +no implicit conversion of Symbol into String + + "str".instance_eval { gsub("foo", :sym) } + ^^^^^^^^^^^ + END + + "str".instance_eval { gsub("foo", :sym) } + end + end + + def test_args_FCALL_2 + assert_error_message(TypeError, <<~END) do +no implicit conversion of Symbol into String + + "str".instance_eval { gsub "foo", :sym } + ^^^^^^^^^^^ + END + + "str".instance_eval { gsub "foo", :sym } + end + end + + def test_args_OP_ASGN1_aref_1 + v = [] + + assert_error_message(TypeError, <<~END) do +no implicit conversion from nil to integer + + v [nil] += 42 + ^^^^^^^^^^ + END + + v [nil] += 42 + end + end + + def test_args_OP_ASGN1_aref_2 + v = [] + + assert_error_message(ArgumentError, <<~END) do +wrong number of arguments (given 0, expected 1..2) + + v [ ] += 42 + ^^^^^^^^ + END + + v [ ] += 42 + end + end + + def test_args_OP_ASGN1_op + v = [1] + + assert_error_message(TypeError, <<~END) do +nil can't be coerced into Integer + + v [0] += nil + ^^^^^^^^^ + END + + v [0] += nil + end + end + + def test_args_OP_ASGN2 + v = Object.new + def v.foo; 1; end + + assert_error_message(TypeError, <<~END) do +nil can't be coerced into Integer + + v.foo += nil + ^^^ + END + + v.foo += nil + end + end + + end +end |