X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/2a7f8fd51e5cd7f5f8e2d6f8e1fb48a6b178098f..85bbe4706aa1666a90fc89684ad0787521d9df6e:/spec/indent/indent_spec.rb diff --git a/spec/indent/indent_spec.rb b/spec/indent/indent_spec.rb index ebfd103..400ec11 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' @@ -52,7 +51,7 @@ shared_examples_for "vim" do it "puts the closing parenthesis at the same level" do vim.feedkeys ')' - indent.should == 0 + indent.should == (hang_closing ? shiftwidth : 0) end end @@ -87,7 +86,7 @@ shared_examples_for "vim" do it "lines up the closing parenthesis" do vim.feedkeys '}' - indent.should == 0 + indent.should == (hang_closing ? shiftwidth : 0) end end @@ -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 @@ -161,6 +160,41 @@ shared_examples_for "vim" do end end + describe "when line is empty inside a block" do + it "is indented like the previous line" do + vim.feedkeys 'idef a():\1\\2\kcc' + indent.should == shiftwidth + end + end + + describe "when an empty line is after empty line / before non-empty" do + it "is indented like the next line" do + vim.feedkeys 'idef a():\1\\\2\<1\\\\0i\2\kcc' + indent.should == shiftwidth + end + end + + describe "when line is empty inside a block following multi-line statement" do + it "is indented like the previous line" do + vim.feedkeys 'idef a():\x = (1 +\2)\\y\kcc' + indent.should == shiftwidth + end + end + + describe "when line is empty inside a block following stop statement" do + it "is indented like the previous line minus shiftwidth" do + vim.feedkeys 'iif x:\if y:\pass\\z\kcc' + indent.should == shiftwidth + end + end + describe "when using simple control structures" do it "indents shiftwidth spaces" do vim.feedkeys 'iwhile True:\pass' @@ -217,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 @@ -362,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 @@ -385,6 +436,17 @@ shared_examples_for "vim" do end shared_examples_for "multiline strings" do + before(:each) { + # clear buffer + vim.normal 'gg"_dG' + + # 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 after an '(' that is followed by an unfinished string" do before { vim.feedkeys 'itest("""' } @@ -414,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 @@ -425,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 @@ -456,20 +518,61 @@ shared_examples_for "multiline strings" do proposed_indent.should == 4 end end -end -describe "vim when using width of 4" do - before { - vim.command("set sw=4 ts=4 sts=4 et") - } - it_behaves_like "vim" + describe "when breaking a string after opening parenthesis" do + before { vim.feedkeys 'i foo("""bar\\\' } + it "it does indent the next line as after an opening multistring" do + vim.feedkeys '\' + _, expected_indent = multiline_indent(4, 4 + shiftwidth) + indent.should == expected_indent + 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 -describe "vim when using width of 3" do - before { - vim.command("set sw=3 ts=3 sts=3 et") - } - it_behaves_like "vim" +SUITE_SHIFTWIDTHS = [4, 3] +SUITE_HANG_CLOSINGS = [false, true] + +SUITE_SHIFTWIDTHS.each do |sw| + describe "vim when using width of #{sw}" do + before { + vim.command("set sw=#{sw} ts=#{sw} sts=#{sw} et") + } + it "sets shiftwidth to #{sw}" do + shiftwidth.should == sw + end + + SUITE_HANG_CLOSINGS.each do |hc| + describe "vim when hang_closing is set to #{hc}" do + before { + set_hang_closing hc + } + it "sets hang_closing to #{hc}" do + hang_closing.should == !!hc + end + + it_behaves_like "vim" + end + end + end end describe "vim when not using python_pep8_indent_multiline_string" do @@ -504,24 +607,81 @@ 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" - } +describe "Handles far away opening parens" do + before { vim.feedkeys '\ggdGifrom foo import (' } - 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 + it "indents by one level" do + vim.feedkeys '\' + proposed_indent.should == shiftwidth 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 + it "indents by one level for 10 lines" do + vim.command('set paste | exe "norm 9o" | set nopaste') + vim.feedkeys '\o' + indent.should == shiftwidth + end + + it "indents by one level for 50 lines" do + vim.command('set paste | exe "norm 49o" | set nopaste') + vim.feedkeys '\o' + indent.should == shiftwidth + end +end + +describe "Handles far away opening square brackets" do + before { vim.feedkeys '\ggdGibar = [' } + + it "indents by one level" do + vim.feedkeys '\' + proposed_indent.should == shiftwidth + end + + it "indents by one level for 10 lines" do + vim.command('set paste | exe "norm 9o" | set nopaste') + vim.feedkeys '\o' + indent.should == shiftwidth + end + + it "indents by one level for 100 lines" do + vim.command('set paste | exe "norm 99o" | set nopaste') + vim.feedkeys '\o' + indent.should == shiftwidth + end +end + +describe "Handles far away opening curly brackets" do + before { vim.feedkeys '\ggdGijson = {' } + + it "indents by one level" do + vim.feedkeys '\' + vim.feedkeys '\o' + proposed_indent.should == shiftwidth + end + + it "indents by one level for 10 lines" do + vim.command('set paste | exe "norm 9o" | set nopaste') + vim.feedkeys '\o' + indent.should == shiftwidth + end + + it "indents by one level for 1000 lines" do + vim.command('set paste | exe "norm 999o" | set nopaste') + vim.feedkeys '\o' + indent.should == shiftwidth + end +end + +describe "Compact multiline dict" do + before { vim.feedkeys '\ggdGid = {"one": 1,' } + + it "gets indented correctly" do + vim.feedkeys '\' + proposed_indent.should == 5 + + vim.feedkeys '"two": 2}' + proposed_indent.should == 5 + + vim.feedkeys '\' + proposed_indent.should == 0 end end