From ebad35e4d99340af1bad3702063f029a21e188bc Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Mon, 21 Sep 2020 15:41:43 +0200 Subject: ; Fix more trivial typos --- test/manual/indent/ruby.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/manual/indent/ruby.rb') diff --git a/test/manual/indent/ruby.rb b/test/manual/indent/ruby.rb index b038512b114..6b7d10dea38 100644 --- a/test/manual/indent/ruby.rb +++ b/test/manual/indent/ruby.rb @@ -34,7 +34,7 @@ x = # "tot %q/to"; = # Regexp after whitelisted method. "abc".sub /b/, 'd' -# Don't mis-match "sub" at the end of words. +# Don't mismatch "sub" at the end of words. a = asub / aslb + bsub / bslb; # Highlight the regexp after "if". -- cgit v1.2.3 From b63c3535b0cd45544b5af854f88984af5125dd0b Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Mon, 21 Sep 2020 17:41:45 +0200 Subject: Convert manual indent test for ruby-mode into unit test * test/manual/indent/ruby.rb: Move from here... * test/lisp/progmodes/ruby-mode-resources/ruby.rb: ...to here. * test/lisp/progmodes/ruby-mode-tests.el (ruby-mode-tests-data-dir): New variable. (ruby--indent/converted-from-manual-test): New test. --- test/lisp/progmodes/ruby-mode-resources/ruby.rb | 477 ++++++++++++++++++++++++ test/lisp/progmodes/ruby-mode-tests.el | 19 + test/manual/indent/ruby.rb | 477 ------------------------ 3 files changed, 496 insertions(+), 477 deletions(-) create mode 100644 test/lisp/progmodes/ruby-mode-resources/ruby.rb delete mode 100644 test/manual/indent/ruby.rb (limited to 'test/manual/indent/ruby.rb') diff --git a/test/lisp/progmodes/ruby-mode-resources/ruby.rb b/test/lisp/progmodes/ruby-mode-resources/ruby.rb new file mode 100644 index 00000000000..6b7d10dea38 --- /dev/null +++ b/test/lisp/progmodes/ruby-mode-resources/ruby.rb @@ -0,0 +1,477 @@ +if something_wrong? # ruby-move-to-block-skips-heredoc + ActiveSupport::Deprecation.warn(<<-eowarn) + boo hoo + end + eowarn + foo + + foo(<<~squiggly) + end + squiggly +end + +def foo + %^bar^ +end + +# Percent literals. +b = %Q{This is a "string"} +c = %w!foo + bar + baz! +d = %(hello (nested) world) + +# Don't propertize percent literals inside strings. +"(%s, %s)" % [123, 456] + +"abc/#{ddf}ghi" +"abc\#{ddf}ghi" + +# Or inside comments. +x = # "tot %q/to"; = + y = 2 / 3 + +# Regexp after whitelisted method. +"abc".sub /b/, 'd' + +# Don't mismatch "sub" at the end of words. +a = asub / aslb + bsub / bslb; + +# Highlight the regexp after "if". +x = toto / foo if /do bar/ =~ "dobar" + +# Regexp options are highlighted. + +/foo/xi != %r{bar}mo.tee + +foo { /"tee/ + bar { |qux| /'fee"/ } # bug#20026 +} + +bar(class: XXX) do # ruby-indent-keyword-label + foo +end +bar + +foo = [1, # ruby-deep-indent + 2] + +foo = { # ruby-deep-indent-disabled + a: b +} + +foo = { a: b, + a1: b1 + } + +foo({ # bug#16118 + a: b, + c: d + }) + +bar = foo( + a, [ + 1, + ], + :qux => [ + 3 + ]) + +foo( + [ + { + a: b + }, + ], + { + c: d + } +) + +foo([{ + a: 2 + }, + { + b: 3 + }, + 4 + ]) + +foo = [ # ruby-deep-indent-disabled + 1 +] + +foo( # ruby-deep-indent-disabled + a +) + +# Multiline regexp. +/bars + tees # toots + nfoos/ + +def test1(arg) + puts "hello" +end + +def test2 (arg) + a = "apple" + + if a == 2 + puts "hello" + else + puts "there" + end + + if a == 2 then + puts "hello" + elsif a == 3 + puts "hello3" + elsif a == 3 then + puts "hello3" + else + puts "there" + end + + b = case a + when "a" + 6 + # Support for this syntax was removed in Ruby 1.9, so we + # probably don't need to handle it either. + # when "b" : + # 7 + # when "c" : 2 + when "d" then 4 + else 5 + end +end + +# Some Cucumber code: +Given /toto/ do + print "hello" +end + +# Bug#15208 +if something == :== + do_something + + return false unless method == :+ + x = y + z # Bug#16609 + + a = 1 ? 2 :( + 2 + 3 + ) +end + +# Bug#17097 +if x == :!= + something +end + +qux :+, + bar, + :[]=, + bar, + :a + +b = $: +c = ?? + +# Example from http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html +d = 4 + 5 + # no '\' needed + 6 + 7 + +# Example from http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html +e = 8 + 9 \ + + 10 # '\' needed + +foo = obj.bar { |m| tee(m) } + + obj.qux { |m| hum(m) } + +begin + foo +ensure + bar +end + +# Bug#15369 +MSG = 'Separate every 3 digits in the integer portion of a number' \ + 'with underscores(_).' + +class C + def foo + self.end + D.new.class + end + + def begin + end +end + +a = foo(j, k) - + bar_tee + +while a < b do # "do" is optional + foo +end + +desc "foo foo" \ + "bar bar" + +foo. + bar + +# https://github.com/rails/rails/blob/17f5d8e062909f1fcae25351834d8e89967b645e/activesupport/lib/active_support/time_with_zone.rb#L206 +foo # comment intended to confuse the tokenizer + .bar + +z = { + foo: { + a: "aaa", + b: "bbb" + } +} + +foo if + bar + +fail "stuff" \ + unless all_fine? + +if foo? + bar +end + +method arg1, # bug#15594 + method2 arg2, + arg3 + +method? arg1, + arg2 + +method! arg1, + arg2 + +method !arg1, + arg2 + +method [], + arg2 + +method :foo, + :bar + +method (a + b), + c, :d => :e, + f: g + +desc "abc", + defg + +it "is a method call with block" do |asd| + foo +end + +it("is too!") { + bar + .qux +} + +and_this_one(has) { |block, parameters| + tee +} + +if foo && + bar +end + +foo + + bar + +foo and + bar + +foo > bar && + tee < qux + +zux do + foo == bar && + tee == qux + + a = 3 and + b = 4 +end + +foo + bar == + tee + qux + +1 .. 2 && + 3 + +3 < 4 + + 5 + +10 << 4 ^ + 20 + +100 + 2 >> + 3 + +2 ** 10 / + 2 + +foo ^ + bar + +foo_bar_tee(1, 2, 3) + .qux&.bar + .tee.bar + &.tee + +foo do + bar + .tee +end + +def bar + foo + .baz +end + +abc(foo + .bar, + tee + .qux) + +# http://stackoverflow.com/questions/17786563/emacs-ruby-mode-if-expressions-indentation +tee = if foo + bar + else + tee + end + +a = b { + c +} + +aa = bb do + cc +end + +foo :bar do + qux +end + +foo do |*args| + tee +end + +bar do |&block| + tee +end + +foo = [1, 2, 3].map do |i| + i + 1 +end + +bar.foo do + bar +end + +bar.foo(tee) do + bar +end + +bar.foo(tee) { + bar +} + +bar 1 do + foo 2 do + tee + end +end + +foo | + bar + +def qux + foo ||= begin + bar + tee + rescue + oomph + end +end + +private def foo + bar +end + +%^abc^ +ddd + +qux = foo.fee ? + bar : + tee + +zoo.keep.bar!( + {x: y, + z: t}) + +zoo + .lose( + q, p) + +a.records().map(&:b).zip( + foo) + +foo1 = + subject.update( + 1 + ) + +foo2 = + subject. + update( + 2 + ) + +# FIXME: This is not consistent with the example below it, but this +# offset only happens if the colon is at eol, which wouldn't be often. +# Tokenizing `bar:' as `:bar =>' would be better, but it's hard to +# distinguish from a variable reference inside a ternary operator. +foo(bar: + tee) + +foo(:bar => + tee) + +regions = foo( + OpenStruct.new(id: 0, name: "foo") => [ + 10 + ] +) + +{'a' => { + 'b' => 'c', + 'd' => %w(e f) + } +} + +# Bug#17050 + +return render json: { + errors: { base: [message] }, + copying: copying + }, + status: 400 + +top test( + some, + top, + test) + +foo bar, { + tee: qux + } diff --git a/test/lisp/progmodes/ruby-mode-tests.el b/test/lisp/progmodes/ruby-mode-tests.el index 9d677a2c27a..fb3b42b30df 100644 --- a/test/lisp/progmodes/ruby-mode-tests.el +++ b/test/lisp/progmodes/ruby-mode-tests.el @@ -24,6 +24,12 @@ (require 'ert) (require 'ruby-mode) +(defvar ruby-mode-tests-data-dir + (file-truename + (expand-file-name "ruby-mode-resources/" + (file-name-directory (or load-file-name + buffer-file-name))))) + (defmacro ruby-with-temp-buffer (contents &rest body) (declare (indent 1) (debug t)) `(with-temp-buffer @@ -842,6 +848,19 @@ VALUES-PLIST is a list with alternating index and value elements." (ruby--insert-coding-comment "utf-8") (should (string= "# encoding: utf-8\n\n" (buffer-string)))))) +;; TODO: Convert these into unit proper tests instead of using an +;; external file. +(ert-deftest ruby--indent/converted-from-manual-test () + :tags '(:expensive-test) + ;; Converted from manual test. + (let ((buf (find-file-noselect (expand-file-name "ruby.rb" + ruby-mode-tests-data-dir)))) + (unwind-protect + (with-current-buffer buf + (let ((orig (buffer-string))) + (indent-region (point-min) (point-max)) + (should (equal (buffer-string) orig)))) + (kill-buffer buf)))) (provide 'ruby-mode-tests) diff --git a/test/manual/indent/ruby.rb b/test/manual/indent/ruby.rb deleted file mode 100644 index 6b7d10dea38..00000000000 --- a/test/manual/indent/ruby.rb +++ /dev/null @@ -1,477 +0,0 @@ -if something_wrong? # ruby-move-to-block-skips-heredoc - ActiveSupport::Deprecation.warn(<<-eowarn) - boo hoo - end - eowarn - foo - - foo(<<~squiggly) - end - squiggly -end - -def foo - %^bar^ -end - -# Percent literals. -b = %Q{This is a "string"} -c = %w!foo - bar - baz! -d = %(hello (nested) world) - -# Don't propertize percent literals inside strings. -"(%s, %s)" % [123, 456] - -"abc/#{ddf}ghi" -"abc\#{ddf}ghi" - -# Or inside comments. -x = # "tot %q/to"; = - y = 2 / 3 - -# Regexp after whitelisted method. -"abc".sub /b/, 'd' - -# Don't mismatch "sub" at the end of words. -a = asub / aslb + bsub / bslb; - -# Highlight the regexp after "if". -x = toto / foo if /do bar/ =~ "dobar" - -# Regexp options are highlighted. - -/foo/xi != %r{bar}mo.tee - -foo { /"tee/ - bar { |qux| /'fee"/ } # bug#20026 -} - -bar(class: XXX) do # ruby-indent-keyword-label - foo -end -bar - -foo = [1, # ruby-deep-indent - 2] - -foo = { # ruby-deep-indent-disabled - a: b -} - -foo = { a: b, - a1: b1 - } - -foo({ # bug#16118 - a: b, - c: d - }) - -bar = foo( - a, [ - 1, - ], - :qux => [ - 3 - ]) - -foo( - [ - { - a: b - }, - ], - { - c: d - } -) - -foo([{ - a: 2 - }, - { - b: 3 - }, - 4 - ]) - -foo = [ # ruby-deep-indent-disabled - 1 -] - -foo( # ruby-deep-indent-disabled - a -) - -# Multiline regexp. -/bars - tees # toots - nfoos/ - -def test1(arg) - puts "hello" -end - -def test2 (arg) - a = "apple" - - if a == 2 - puts "hello" - else - puts "there" - end - - if a == 2 then - puts "hello" - elsif a == 3 - puts "hello3" - elsif a == 3 then - puts "hello3" - else - puts "there" - end - - b = case a - when "a" - 6 - # Support for this syntax was removed in Ruby 1.9, so we - # probably don't need to handle it either. - # when "b" : - # 7 - # when "c" : 2 - when "d" then 4 - else 5 - end -end - -# Some Cucumber code: -Given /toto/ do - print "hello" -end - -# Bug#15208 -if something == :== - do_something - - return false unless method == :+ - x = y + z # Bug#16609 - - a = 1 ? 2 :( - 2 + 3 - ) -end - -# Bug#17097 -if x == :!= - something -end - -qux :+, - bar, - :[]=, - bar, - :a - -b = $: -c = ?? - -# Example from http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html -d = 4 + 5 + # no '\' needed - 6 + 7 - -# Example from http://www.ruby-doc.org/docs/ProgrammingRuby/html/language.html -e = 8 + 9 \ - + 10 # '\' needed - -foo = obj.bar { |m| tee(m) } + - obj.qux { |m| hum(m) } - -begin - foo -ensure - bar -end - -# Bug#15369 -MSG = 'Separate every 3 digits in the integer portion of a number' \ - 'with underscores(_).' - -class C - def foo - self.end - D.new.class - end - - def begin - end -end - -a = foo(j, k) - - bar_tee - -while a < b do # "do" is optional - foo -end - -desc "foo foo" \ - "bar bar" - -foo. - bar - -# https://github.com/rails/rails/blob/17f5d8e062909f1fcae25351834d8e89967b645e/activesupport/lib/active_support/time_with_zone.rb#L206 -foo # comment intended to confuse the tokenizer - .bar - -z = { - foo: { - a: "aaa", - b: "bbb" - } -} - -foo if - bar - -fail "stuff" \ - unless all_fine? - -if foo? - bar -end - -method arg1, # bug#15594 - method2 arg2, - arg3 - -method? arg1, - arg2 - -method! arg1, - arg2 - -method !arg1, - arg2 - -method [], - arg2 - -method :foo, - :bar - -method (a + b), - c, :d => :e, - f: g - -desc "abc", - defg - -it "is a method call with block" do |asd| - foo -end - -it("is too!") { - bar - .qux -} - -and_this_one(has) { |block, parameters| - tee -} - -if foo && - bar -end - -foo + - bar - -foo and - bar - -foo > bar && - tee < qux - -zux do - foo == bar && - tee == qux - - a = 3 and - b = 4 -end - -foo + bar == - tee + qux - -1 .. 2 && - 3 - -3 < 4 + - 5 - -10 << 4 ^ - 20 - -100 + 2 >> - 3 - -2 ** 10 / - 2 - -foo ^ - bar - -foo_bar_tee(1, 2, 3) - .qux&.bar - .tee.bar - &.tee - -foo do - bar - .tee -end - -def bar - foo - .baz -end - -abc(foo - .bar, - tee - .qux) - -# http://stackoverflow.com/questions/17786563/emacs-ruby-mode-if-expressions-indentation -tee = if foo - bar - else - tee - end - -a = b { - c -} - -aa = bb do - cc -end - -foo :bar do - qux -end - -foo do |*args| - tee -end - -bar do |&block| - tee -end - -foo = [1, 2, 3].map do |i| - i + 1 -end - -bar.foo do - bar -end - -bar.foo(tee) do - bar -end - -bar.foo(tee) { - bar -} - -bar 1 do - foo 2 do - tee - end -end - -foo | - bar - -def qux - foo ||= begin - bar - tee - rescue - oomph - end -end - -private def foo - bar -end - -%^abc^ -ddd - -qux = foo.fee ? - bar : - tee - -zoo.keep.bar!( - {x: y, - z: t}) - -zoo - .lose( - q, p) - -a.records().map(&:b).zip( - foo) - -foo1 = - subject.update( - 1 - ) - -foo2 = - subject. - update( - 2 - ) - -# FIXME: This is not consistent with the example below it, but this -# offset only happens if the colon is at eol, which wouldn't be often. -# Tokenizing `bar:' as `:bar =>' would be better, but it's hard to -# distinguish from a variable reference inside a ternary operator. -foo(bar: - tee) - -foo(:bar => - tee) - -regions = foo( - OpenStruct.new(id: 0, name: "foo") => [ - 10 - ] -) - -{'a' => { - 'b' => 'c', - 'd' => %w(e f) - } -} - -# Bug#17050 - -return render json: { - errors: { base: [message] }, - copying: copying - }, - status: 400 - -top test( - some, - top, - test) - -foo bar, { - tee: qux - } -- cgit v1.2.3