X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/19c53ee5f8b6e9054d0ee1c295d876ccb96a21f7..88333bde264a6cb4d81f68a962bfc0d883e7ed39:/spec/indent/indent_spec.rb diff --git a/spec/indent/indent_spec.rb b/spec/indent/indent_spec.rb index 79d7f84..4227b3f 100644 --- a/spec/indent/indent_spec.rb +++ b/spec/indent/indent_spec.rb @@ -1,7 +1,6 @@ require "spec_helper" shared_examples_for "vim" do - before(:each) { # clear buffer vim.normal 'gg"_dG' @@ -131,7 +130,7 @@ shared_examples_for "vim" do vim.echo('synIDattr(synID(line("."), col("."), 0), "name")' ).downcase.should include 'string' vim.feedkeys 'a\' - proposed_indent.should == 0 + proposed_indent.should == -1 indent.should == 0 end @@ -252,6 +251,11 @@ shared_examples_for "vim" do indent.should == 0 end + it "handles nested expressions (Flake8's E127)" do + vim.feedkeys 'i[\x for x in foo\if (\' + indent.should == shiftwidth * 2 + end + it "still handles multiple parens correctly" do vim.feedkeys 'iif (111 and (222 and 333\' indent.should == 13 @@ -397,10 +401,22 @@ shared_examples_for "vim" do end describe "when an else is used inside of a nested if" do - before { vim.feedkeys 'iif foo:\\if bar:\\\pass\' } - it "indents an else to the inner if" do + before { vim.feedkeys 'iif foo:\if bar:\pass\' } + it "indents the else to the inner if" do vim.feedkeys 'else:' - indent.should == shiftwidth * 2 + indent.should == shiftwidth + end + end + + describe "when an else is used outside of a nested if" do + before { vim.feedkeys 'iif True:\if True:\pass\\0' } + it "indents the else to the outer if" do + indent.should == 0 + proposed_indent.should == shiftwidth + + vim.feedkeys 'ielse:' + indent.should == 0 + proposed_indent.should == 0 end end @@ -460,7 +476,7 @@ shared_examples_for "multiline strings" do end end - describe "when after assigning an unfinished string" do + describe "when after assigning an indented unfinished string" do before { vim.feedkeys 'i test = """' } it "it indents the next line" do @@ -471,7 +487,7 @@ shared_examples_for "multiline strings" do end end - describe "when after assigning a finished string" do + describe "when after assigning an indented finished string" do before { vim.feedkeys 'i test = ""' } it "it does indent the next line" do @@ -486,12 +502,27 @@ shared_examples_for "multiline strings" do end describe "when after a docstring" do - before { vim.feedkeys 'i """' } it "it does indent the next line to the docstring" do - vim.feedkeys '\' + vim.feedkeys 'i """\' indent.should == 4 proposed_indent.should == 4 end + + it "indents the closing docstring quotes" do + vim.feedkeys 'i """\\"""' + indent.should == 4 + proposed_indent.should == 4 + vim.echo('getline(3)').should == ' """' + end + + it "indents non-matching docstring quotes" do + vim.feedkeys 'i """\\' + vim.feedkeys "0C'''" + vim.echo('line(".")').should == "4" + vim.echo('getline(".")').should == "'''" + indent.should == 0 + proposed_indent.should == -1 + end end describe "when after a docstring with contents" do @@ -504,18 +535,36 @@ shared_examples_for "multiline strings" do end describe "when breaking a string after opening parenthesis" do - before { vim.feedkeys 'i foo("""bar' } + before { vim.feedkeys 'i foo("""bar\\\' } it "it does indent the next line as after an opening multistring" do vim.feedkeys '\' - expected_proposed, expected_indent = multiline_indent(4, 4 + shiftwidth) + _, expected_indent = multiline_indent(4, 4 + shiftwidth) indent.should == expected_indent - proposed_indent.should == expected_proposed + proposed_indent.should == -1 + + # it keeps the indent after an empty line + vim.feedkeys '\' + proposed_indent, expected_indent = multiline_indent(4, 4 + shiftwidth) + indent.should == expected_indent + proposed_indent.should == proposed_indent + + # it keeps the indent of nonblank above + vim.feedkeys '\\' + proposed_indent, expected_indent = multiline_indent(4, 4 + shiftwidth) + indent.should == expected_indent + proposed_indent.should == proposed_indent + + # it keeps the indent of nonblank above before an empty line + vim.feedkeys '\' + proposed_indent, expected_indent = multiline_indent(4, 4 + shiftwidth) + indent.should == expected_indent + proposed_indent.should == proposed_indent end end end SUITE_SHIFTWIDTHS = [4, 3] -SUITE_HANG_CLOSINGS = [nil, false, true] +SUITE_HANG_CLOSINGS = [false, true] SUITE_SHIFTWIDTHS.each do |sw| describe "vim when using width of #{sw}" do @@ -573,34 +622,6 @@ describe "vim when using python_pep8_indent_multiline_string=-2" do it_behaves_like "multiline strings" end -describe "vim for cython" do - before { - vim.command "enew" - vim.command "set ft=cython" - vim.command "runtime indent/python.vim" - - # Insert two blank lines. - # The first line is a corner case in this plugin that would shadow the - # correct behaviour of other tests. Thus we explicitly jump to the first - # line when we require so. - vim.feedkeys 'i\\\' - } - - describe "when using a cdef function definition" do - it "indents shiftwidth spaces" do - vim.feedkeys 'icdef long_function_name(\arg' - indent.should == shiftwidth * 2 - end - end - - describe "when using a cpdef function definition" do - it "indents shiftwidth spaces" do - vim.feedkeys 'icpdef long_function_name(\arg' - indent.should == shiftwidth * 2 - end - end -end - describe "Handles far away opening parens" do before { vim.feedkeys '\ggdGifrom foo import (' } @@ -679,3 +700,30 @@ describe "Compact multiline dict" do proposed_indent.should == 0 end end + +describe "Using O" do + before { vim.feedkeys 'iif foo:\' } + + it "respects autoindent" do + vim.feedkeys '1\\' + indent.should == shiftwidth + vim.feedkeys '\ko' + indent.should == shiftwidth + vim.feedkeys '\kO' + indent.should == shiftwidth + # Uses/keeps indent from line above + vim.feedkeys '\i2\O' + indent.should == shiftwidth + # Uses/keeps indent from line above + vim.feedkeys '\j\O' + indent.should == 0 + end +end + +describe "searchpairpos" do + before { vim.feedkeys '\ggdG' } + it "handles nested parenthesis" do + vim.feedkeys 'iif foo.startswith("("):\' + indent.should == shiftwidth + end +end