require 'spec_helper'

describe "Indenting" do
  after :each do
    vim.command 'let g:ruby_indent_block_style = "expression"'
  end

  specify "indented blocks with expression style" do
    vim.command 'let g:ruby_indent_block_style = "expression"'

    assert_correct_indenting <<~EOF
      a.
        b.
        c do |x|
        something
      end

      next_line
    EOF

    assert_correct_indenting <<~EOF
      a.
        b.
        c { |x|
        something
      }

      next_line
    EOF
  end

  specify "indented blocks with do style" do
    vim.command 'let g:ruby_indent_block_style = "do"'

    assert_correct_indenting <<~EOF
      a.
        b.
        c do |x|
          something
        end

      next_line
    EOF

    # Check that "do" style indentation does not mess up indentation
    # following the bock.
    assert_correct_indenting <<~EOF
      a.
        b.
        c do |x|
          something
        end

      next_line
    EOF

    # Check that "do" style indenting works properly for brace blocks.
    assert_correct_indenting <<~EOF
      a.
        b.
        c { |x|
          something
        }

      next_line
    EOF
  end

  specify "'do' indenting" do
    assert_correct_indenting <<~EOF
      do
        something
      end
    EOF

    assert_correct_indenting <<~EOF
      def foo
        a_hash = {:do => 'bar'}
      end
    EOF

    assert_correct_indenting <<~EOF
      def foo(job)
        job.do!
      end
    EOF
  end

  specify "blocks with assignment on the previous line" do
    assert_correct_indenting <<~EOF
      foo =
        something do
          "other"
        end
    EOF

    assert_correct_indenting <<~EOF
      @foo ||=
        something do
          "other"
        end
    EOF
  end

  specify "blocks with multiline parameters" do
    assert_correct_indenting <<~EOF
      def foo
        opts.on('--coordinator host=HOST[,port=PORT]',
                'Specify the HOST and the PORT of the coordinator') do |str|
          h = sub_opts_to_hash(str)
          puts h
        end
      end
    EOF
  end

  specify "case-insensitive matching" do
    vim.set 'ignorecase'
    assert_correct_indenting <<~EOF
      module X
        Class.new do
        end
      end
    EOF
    vim.set 'ignorecase&'
  end

  specify "blocks with tuple arguments" do
    assert_correct_indenting <<~EOF
      proc do |(a, b)|
        puts a
        puts b
      end
    EOF

    assert_correct_indenting <<~EOF
      proc do |foo, (a, b), bar|
        puts a
        puts b
      end
    EOF

    assert_correct_indenting <<~EOF
      proc do |(a, (b, c)), d|
        puts a, b
        puts c, d
      end
    EOF
  end

  specify "blocks with default arguments" do
    assert_correct_indenting <<~EOF
      proc do |a = 1|
        puts a
      end
    EOF

    # See https://github.com/vim-ruby/vim-ruby/issues/304
    assert_correct_indenting <<~EOF
      proc do |a: "asdf", b:|
        proc do
          puts a, b
        end
      end
    EOF
  end
end
