X-Git-Url: https://git.madduck.net/etc/vim.git/blobdiff_plain/31a2fd4cf80abba74dc3ef9fb0ceed8b540d2a1c..eb527d01d53257088da8c215b5d909623d543fad:/spec/indent/indent_spec.rb?ds=sidebyside diff --git a/spec/indent/indent_spec.rb b/spec/indent/indent_spec.rb index 21d14b7..e43e799 100644 --- a/spec/indent/indent_spec.rb +++ b/spec/indent/indent_spec.rb @@ -1,8 +1,17 @@ require "spec_helper" -describe "vim" do +shared_examples_for "vim" do - before(:each) { vim.normal 'gg"_dG' } # clear buffer + 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\<CR>\<CR>\<ESC>' + } describe "when using the indent plugin" do it "sets the indentexpr and indentkeys options" do @@ -17,7 +26,7 @@ describe "vim" do end describe "when entering the first line" do - before { vim.feedkeys 'ipass' } + before { vim.feedkeys '0ggipass' } it "does not indent" do proposed_indent.should == 0 @@ -67,6 +76,41 @@ describe "vim" do end end + describe "when after an '{' that is followed by a comment" do + before { vim.feedkeys 'imydict = { # comment\<CR>' } + + it "indent by one level" do + indent.should == shiftwidth + vim.feedkeys '1: 1,\<CR>' + indent.should == shiftwidth + end + + it "lines up the closing parenthesis" do + vim.feedkeys '}' + indent.should == 0 + end + end + + describe "when using gq to reindent a '(' that is" do + before { vim.feedkeys 'itest(' } + it "something and has a string without spaces at the end" do + vim.feedkeys 'something_very_long_blaaaaaaaaa, "some_very_long_string_blaaaaaaaaaaaaaaaaaaaa"\<esc>gqq' + indent.should == 5 + end + end + + describe "when after multiple parens of different types" do + it "indents by one level" do + vim.feedkeys 'if({\<CR>' + indent.should == shiftwidth + end + + it "lines up with the last paren" do + vim.feedkeys 'ifff({123: 456,\<CR>' + indent.should == 5 + end + end + describe "when '#' is contained in a string that is followed by a colon" do it "indents by one level" do vim.feedkeys 'iif "some#thing" == "test":#test\<CR>pass' @@ -81,6 +125,104 @@ describe "vim" do end end + describe "when inside an unfinished string" do + it "does not indent" do + vim.feedkeys 'i"test:\<ESC>' + vim.echo('synIDattr(synID(line("."), col("."), 0), "name")' + ).downcase.should include 'string' + vim.feedkeys 'a\<CR>' + proposed_indent.should == 0 + indent.should == 0 + end + + it "does not dedent" do + vim.feedkeys 'iif True:\<CR>"test:\<ESC>' + vim.echo('synIDattr(synID(line("."), col("."), 0), "name")' + ).downcase.should include 'string' + proposed_indent.should == shiftwidth + indent.should == shiftwidth + end + end + + describe "when the previous line has a colon in a string" do + before { vim.feedkeys 'itest(":".join(["1","2"]))\<CR>' } + it "does not indent" do + vim.feedkeys 'if True:' + indent.should == 0 + proposed_indent.should == 0 + end + end + + describe "when the previous line has a list slice" do + it "does not indent" do + vim.feedkeys 'ib = a[2:]\<CR>' + indent.should == 0 + proposed_indent.should == 0 + 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 '\<CR>' + proposed_indent.should == 0 + indent.should == 0 + end + + it "with contents it does not indent the next line" do + vim.feedkeys 'string_contents\<CR>' + proposed_indent.should == 0 + indent.should == 0 + 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 '\<CR>' + proposed_indent.should == 0 + indent.should == 0 + end + end + + describe "when after assigning an unfinished string" do + before { vim.feedkeys 'i test = """' } + + it "it does not indent the next line" do + vim.feedkeys '\<CR>' + proposed_indent.should == 0 + indent.should == 0 + 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 '\<CR>' + proposed_indent.should == 4 + indent.should == 4 + end + + it "and writing a new string, it does indent the next line" do + vim.feedkeys '\<CR>""' + proposed_indent.should == 4 + indent.should == 4 + end + end + + describe "when after a docstring" do + before { vim.feedkeys 'i """' } + + it "it does indent the next line" do + vim.feedkeys '\<CR>' + proposed_indent.should == 4 + indent.should == 4 + end + end + describe "when using simple control structures" do it "indents shiftwidth spaces" do vim.feedkeys 'iwhile True:\<CR>pass' @@ -88,6 +230,73 @@ describe "vim" do end end + describe "when using a function definition" do + it "indents shiftwidth spaces" do + vim.feedkeys 'idef long_function_name(\<CR>arg' + indent.should == shiftwidth * 2 + end + end + + describe "when using a class definition" do + it "indents shiftwidth spaces" do + vim.feedkeys 'iclass Foo(\<CR>' + indent.should == shiftwidth * 2 + end + end + + describe "when writing an 'else' block" do + it "aligns to the preceeding 'for' block" do + vim.feedkeys 'ifor x in "abc":\<CR>pass\<CR>else:' + indent.should == 0 + end + + it "aligns to the preceeding 'if' block" do + vim.feedkeys 'ifor x in "abc":\<CR>if True:\<CR>pass\<CR>else:' + indent.should == shiftwidth + end + end + + describe "when using parens and control statements" do + it "avoids ambiguity by using extra indentation" do + vim.feedkeys 'iif (111 and\<CR>' + if shiftwidth == 4 + indent.should == shiftwidth * 2 + else + indent.should == 4 + end + vim.feedkeys '222):\<CR>' + indent.should == shiftwidth + vim.feedkeys 'pass\<CR>' + indent.should == 0 + end + + it "still aligns parens properly if not ambiguous" do + vim.feedkeys 'iwhile (111 and\<CR>' + indent.should == 7 + vim.feedkeys '222):\<CR>' + indent.should == shiftwidth + vim.feedkeys 'pass\<CR>' + indent.should == 0 + end + + it "still handles multiple parens correctly" do + vim.feedkeys 'iif (111 and (222 and 333\<CR>' + indent.should == 13 + vim.feedkeys 'and 444\<CR>' + indent.should == 13 + vim.feedkeys ')\<CR>' + if shiftwidth == 4 + indent.should == shiftwidth * 2 + else + indent.should == 4 + end + vim.feedkeys 'and 555):\<CR>' + indent.should == shiftwidth + vim.feedkeys 'pass\<CR>' + indent.should == 0 + end + end + describe "when a line breaks with a manual '\\'" do it "indents shiftwidth spaces on normal line" do vim.feedkeys 'ivalue = test + \\\\\<CR>' @@ -100,13 +309,13 @@ describe "vim" do end it "indents relative to line above" do - vim.feedkeys 'i\tvalue = test + \\\\\<CR>' + vim.feedkeys 'i\<TAB>value = test + \\\\\<CR>' indent.should == shiftwidth * 2 end end describe "when current line is dedented compared to previous line" do - before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>return True\<CR>\<ESC>' } + before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>y = True\<CR>\<ESC>' } it "and current line has a valid indentation (Part 1)" do vim.feedkeys '0i\<TAB>if y:' proposed_indent.should == -1 @@ -123,6 +332,94 @@ describe "vim" do end end + describe "when current line is dedented compared to the last non-empty line" do + before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>y = True\<CR>\<CR>\<ESC>' } + it "and current line has a valid indentation" do + vim.feedkeys '0i\<TAB>if y:' + proposed_indent.should == -1 + end + end + + describe "when an 'if' is followed by" do + before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>' } + it "an elif, it lines up with the 'if'" do + vim.feedkeys 'elif y:' + indent.should == shiftwidth * 2 + end + + it "an 'else', it lines up with the 'if'" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + end + + describe "when a 'for' is followed by" do + before { vim.feedkeys 'i\<TAB>\<TAB>for x in y:\<CR>' } + it "an 'else', it lines up with the 'for'" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + end + + describe "when an 'else' is followed by" do + before { vim.feedkeys 'i\<TAB>\<TAB>else:\<CR>XXX\<CR>' } + it "a 'finally', it lines up with the 'else'" do + vim.feedkeys 'finally:' + indent.should == shiftwidth * 2 + end + end + + + describe "when a 'try' is followed by" do + before { vim.feedkeys 'i\<TAB>\<TAB>try:\<CR>' } + it "an 'except', it lines up with the 'try'" do + vim.feedkeys 'except:' + indent.should == shiftwidth * 2 + end + + it "an 'else', it lines up with the 'try'" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + + it "a 'finally', it lines up with the 'try'" do + vim.feedkeys 'finally:' + indent.should == shiftwidth * 2 + end + end + + describe "when an 'except' is followed by" do + before { vim.feedkeys 'i\<TAB>\<TAB>except:\<CR>' } + it "an 'else', it lines up with the 'except'" do + vim.feedkeys 'else:' + indent.should == shiftwidth * 2 + end + + it "another 'except', it lines up with the previous 'except'" do + vim.feedkeys 'except:' + indent.should == shiftwidth * 2 + end + + it "a 'finally', it lines up with the 'except'" do + vim.feedkeys 'finally:' + 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' } + + it "ignores the call signature after a colon" do + vim.feedkeys 'iif True: JEDI_CALL_SIGNATURE\<CR>' + indent.should == shiftwidth + end + + it "ignores the call signature after a function" do + vim.feedkeys 'idef f( JEDI_CALL_SIGNATURE\<CR>' + indent.should == shiftwidth * 2 + end + end + def shiftwidth @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i end @@ -145,3 +442,50 @@ describe "vim" do 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" +end + +describe "vim when using width of 8" do + before { + vim.command("set sw=8 ts=8 sts=8 et") + } + + it_behaves_like "vim" +end + +describe "vim for cython" do + before { + 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 + + describe "when using a cdef function definition" do + it "indents shiftwidth spaces" do + vim.feedkeys 'icdef long_function_name(\<CR>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(\<CR>arg' + indent.should == shiftwidth * 2 + end + end +end