X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/2dcdd210d617e6941ec2d025a80ea16652441a2f..71270700cbfe84eb3c8a72a8062bdd755a02312a:/spec/indent/indent_spec.rb?ds=sidebyside diff --git a/spec/indent/indent_spec.rb b/spec/indent/indent_spec.rb index e43e799..79d7f84 100644 --- a/spec/indent/indent_spec.rb +++ b/spec/indent/indent_spec.rb @@ -29,8 +29,8 @@ shared_examples_for "vim" do before { vim.feedkeys '0ggipass' } it "does not indent" do - proposed_indent.should == 0 indent.should == 0 + proposed_indent.should == 0 end it "does not indent when using '=='" do @@ -52,7 +52,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 +87,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 @@ -161,65 +161,38 @@ shared_examples_for "vim" do end end - describe "when after an '(' that is followed by an unfinished string" do - before { vim.feedkeys 'itest("""' } - - it "it does not indent the next line" do - vim.feedkeys '\' - proposed_indent.should == 0 - indent.should == 0 - end - - it "with contents it does not indent the next line" do - vim.feedkeys 'string_contents\' - proposed_indent.should == 0 - indent.should == 0 + 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 after assigning an unfinished string" do - before { vim.feedkeys 'itest = """' } - - it "it does not indent the next line" do - vim.feedkeys '\' - proposed_indent.should == 0 + 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\<' - proposed_indent.should == 0 - indent.should == 0 + describe "when an empty line is after empty line / before non-empty (nested)" do + it "is indented like the next line" do + vim.feedkeys 'idef a():\1\\\\0i\2\kcc' + indent.should == shiftwidth end end - describe "when after assigning a finished string" do - before { vim.feedkeys 'i test = ""' } - - it "it does indent the next line" do - vim.feedkeys '\' - proposed_indent.should == 4 - indent.should == 4 - end - - it "and writing a new string, it does indent the next line" do - vim.feedkeys '\""' - proposed_indent.should == 4 - indent.should == 4 + 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 after a docstring" do - before { vim.feedkeys 'i """' } - - it "it does indent the next line" do - vim.feedkeys '\' - proposed_indent.should == 4 - indent.should == 4 + 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 @@ -353,6 +326,23 @@ shared_examples_for "vim" do end end + describe "when an 'if' contains a try-except" do + before { + vim.feedkeys 'iif x:\try:\pass\except:\pass\' + indent.should == shiftwidth + } + it "an 'else' should be indented to the try" do + vim.feedkeys 'else:' + indent.should == shiftwidth + proposed_indent.should == shiftwidth + end + it "an 'else' should keep the indent of the 'if'" do + vim.feedkeys 'else:\<<' + indent.should == 0 + proposed_indent.should == 0 + end + end + describe "when a 'for' is followed by" do before { vim.feedkeys 'i\\for x in y:\' } it "an 'else', it lines up with the 'for'" do @@ -406,6 +396,14 @@ shared_examples_for "vim" do end 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 + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + end + describe "when jedi-vim call signatures are used" do before { vim.command 'syn match jediFunction "JEDI_CALL_SIGNATURE" keepend extend' } @@ -419,43 +417,160 @@ shared_examples_for "vim" do indent.should == shiftwidth * 2 end end +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("""' } + + it "it indents the next line" do + vim.feedkeys '\' + expected_proposed, expected_indent = multiline_indent(0, shiftwidth) + proposed_indent.should == expected_proposed + indent.should == expected_indent + end + + it "with contents it indents the second line to the parenthesis" do + vim.feedkeys 'second line\' + expected_proposed, expected_indent = multiline_indent(0, 5) + proposed_indent.should == expected_proposed + indent.should == expected_indent + end + end + + describe "when after assigning an unfinished string" do + before { vim.feedkeys 'itest = """' } + + it "it indents the next line" do + vim.feedkeys '\' + expected_proposed, expected_indent = multiline_indent(0, shiftwidth) + proposed_indent.should == expected_proposed + indent.should == expected_indent + end + end + + describe "when after assigning an unfinished string" do + before { vim.feedkeys 'i test = """' } + + it "it indents the next line" do + vim.feedkeys '\' + expected_proposed, expected_indent = multiline_indent(4, shiftwidth + 4) + proposed_indent.should == expected_proposed + indent.should == expected_indent + end + end + + describe "when after assigning a finished string" do + before { vim.feedkeys 'i test = ""' } + + it "it does indent the next line" do + vim.feedkeys '\' + indent.should == 4 + end - def shiftwidth - @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i + it "and writing a new string, it does indent the next line" do + vim.feedkeys '\""' + indent.should == 4 + end end - def tabstop - @tabstop ||= vim.echo("&tabstop").to_i + + describe "when after a docstring" do + before { vim.feedkeys 'i """' } + it "it does indent the next line to the docstring" do + vim.feedkeys '\' + indent.should == 4 + proposed_indent.should == 4 + end end - def indent - vim.echo("indent('.')").to_i + + describe "when after a docstring with contents" do + before { vim.feedkeys 'i """First line' } + it "it does indent the next line to the docstring" do + vim.feedkeys '\' + indent.should == 4 + proposed_indent.should == 4 + end end - def previous_indent - pline = vim.echo("line('.')").to_i - 1 - vim.echo("indent('#{pline}')").to_i + + 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_proposed, expected_indent = multiline_indent(4, 4 + shiftwidth) + indent.should == expected_indent + proposed_indent.should == expected_proposed + end end - def proposed_indent - line = vim.echo("line('.')") - col = vim.echo("col('.')") - indent_value = vim.echo("GetPythonPEPIndent(line('.'))").to_i - vim.command("call cursor(#{line}, #{col})") - return indent_value +end + +SUITE_SHIFTWIDTHS = [4, 3] +SUITE_HANG_CLOSINGS = [nil, 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 using width of 4" do +describe "vim when not using python_pep8_indent_multiline_string" do before { vim.command("set sw=4 ts=4 sts=4 et") + vim.command("unlet! g:python_pep8_indent_multiline_string") } + it_behaves_like "multiline strings" +end - it_behaves_like "vim" +describe "vim when using python_pep8_indent_multiline_first=0" do + before { + vim.command("set sw=4 ts=4 sts=4 et") + vim.command("let g:python_pep8_indent_multiline_string=0") + } + it_behaves_like "multiline strings" end -describe "vim when using width of 8" do +describe "vim when using python_pep8_indent_multiline_string=-1" do before { - vim.command("set sw=8 ts=8 sts=8 et") + vim.command("set sw=4 ts=4 sts=4 et") + vim.command("let g:python_pep8_indent_multiline_string=-1") } + it_behaves_like "multiline strings" +end - it_behaves_like "vim" +describe "vim when using python_pep8_indent_multiline_string=-2" do + before { + vim.command("set sw=4 ts=4 sts=4 et") + vim.command("let g:python_pep8_indent_multiline_string=-2") + } + it_behaves_like "multiline strings" end describe "vim for cython" do @@ -463,17 +578,13 @@ describe "vim for cython" do vim.command "enew" vim.command "set ft=cython" vim.command "runtime indent/python.vim" - } - def shiftwidth - @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i - end - def tabstop - @tabstop ||= vim.echo("&tabstop").to_i - end - def indent - vim.echo("indent('.')").to_i - end + # 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 @@ -489,3 +600,82 @@ describe "vim for cython" do end end end + +describe "Handles far away opening parens" do + before { vim.feedkeys '\ggdGifrom foo import (' } + + 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 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