All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@git.madduck.net.
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
3 shared_examples_for "vim" do
9 # Insert two blank lines.
10 # The first line is a corner case in this plugin that would shadow the
11 # correct behaviour of other tests. Thus we explicitly jump to the first
12 # line when we require so.
13 vim.feedkeys 'i\<CR>\<CR>\<ESC>'
16 describe "when using the indent plugin" do
17 it "sets the indentexpr and indentkeys options" do
18 vim.command("set indentexpr?").should include "GetPythonPEPIndent("
19 vim.command("set indentkeys?").should include "=elif"
22 it "sets autoindent and expandtab" do
23 vim.command("set autoindent?").should match(/\s*autoindent/)
24 vim.command("set expandtab?").should match(/\s*expandtab/)
28 describe "when entering the first line" do
29 before { vim.feedkeys '0ggipass' }
31 it "does not indent" do
32 proposed_indent.should == 0
36 it "does not indent when using '=='" do
42 describe "when after a '(' that is at the end of its line" do
43 before { vim.feedkeys 'itest(\<CR>' }
45 it "indents by one level" do
46 proposed_indent.should == shiftwidth
47 vim.feedkeys 'something'
48 indent.should == shiftwidth
50 indent.should == shiftwidth
53 it "puts the closing parenthesis at the same level" do
59 describe "when after an '(' that is followed by something" do
60 before { vim.feedkeys 'itest(something,\<CR>' }
62 it "lines up on following lines" do
64 vim.feedkeys 'more,\<CR>'
68 it "lines up the closing parenthesis" do
73 it "does not touch the closing parenthesis if it is already indented further" do
79 describe "when after multiple parens of different types" do
80 it "indents by one level" do
81 vim.feedkeys 'if({\<CR>'
82 indent.should == shiftwidth
85 it "lines up with the last paren" do
86 vim.feedkeys 'ifff({123: 456,\<CR>'
91 describe "when '#' is contained in a string that is followed by a colon" do
92 it "indents by one level" do
93 vim.feedkeys 'iif "some#thing" == "test":#test\<CR>pass'
94 indent.should == shiftwidth
98 describe "when '#' is not contained in a string and is followed by a colon" do
99 it "does not indent" do
100 vim.feedkeys 'iif "some#thing" == "test"#:test\<CR>'
105 describe "when using simple control structures" do
106 it "indents shiftwidth spaces" do
107 vim.feedkeys 'iwhile True:\<CR>pass'
108 indent.should == shiftwidth
112 describe "when writing an 'else' block" do
113 it "aligns to the preceeding 'for' block" do
114 vim.feedkeys 'ifor x in "abc":\<CR>pass\<CR>else:'
118 it "aligns to the preceeding 'if' block" do
119 vim.feedkeys 'ifor x in "abc":\<CR>if True:\<CR>pass\<CR>else:'
120 indent.should == shiftwidth
124 describe "when using parens and control statements" do
125 it "avoids ambiguity by using extra indentation" do
126 vim.feedkeys 'iif (111 and\<CR>'
128 indent.should == shiftwidth * 2
132 vim.feedkeys '222):\<CR>'
133 indent.should == shiftwidth
134 vim.feedkeys 'pass\<CR>'
138 it "still aligns parens properly if not ambiguous" do
139 vim.feedkeys 'iwhile (111 and\<CR>'
141 vim.feedkeys '222):\<CR>'
142 indent.should == shiftwidth
143 vim.feedkeys 'pass\<CR>'
147 it "still handles multiple parens correctly" do
148 vim.feedkeys 'iif (111 and (222 and 333\<CR>'
150 vim.feedkeys 'and 444\<CR>'
152 vim.feedkeys ')\<CR>'
154 indent.should == shiftwidth * 2
158 vim.feedkeys 'and 555):\<CR>'
159 indent.should == shiftwidth
160 vim.feedkeys 'pass\<CR>'
165 describe "when a line breaks with a manual '\\'" do
166 it "indents shiftwidth spaces on normal line" do
167 vim.feedkeys 'ivalue = test + \\\\\<CR>'
168 indent.should == shiftwidth
171 it "indents 2x shiftwidth spaces for control structures" do
172 vim.feedkeys 'iif somevalue == xyz and \\\\\<CR>'
173 indent.should == shiftwidth * 2
176 it "indents relative to line above" do
177 vim.feedkeys 'i\<TAB>value = test + \\\\\<CR>'
178 indent.should == shiftwidth * 2
182 describe "when current line is dedented compared to previous line" do
183 before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>return True\<CR>\<ESC>' }
184 it "and current line has a valid indentation (Part 1)" do
185 vim.feedkeys '0i\<TAB>if y:'
186 proposed_indent.should == -1
189 it "and current line has a valid indentation (Part 2)" do
190 vim.feedkeys '0i\<TAB>\<TAB>if y:'
191 proposed_indent.should == -1
194 it "and current line has an invalid indentation" do
195 vim.feedkeys 'i while True:\<CR>'
196 indent.should == previous_indent + shiftwidth
200 describe "when an 'if' is followed by" do
201 before { vim.feedkeys 'i\<TAB>\<TAB>if x:\<CR>' }
202 it "an elif, it lines up with the 'if'" do
203 vim.feedkeys 'elif y:'
204 indent.should == shiftwidth * 2
207 it "an 'else', it lines up with the 'if'" do
209 indent.should == shiftwidth * 2
213 describe "when a 'for' is followed by" do
214 before { vim.feedkeys 'i\<TAB>\<TAB>for x in y:\<CR>' }
215 it "an 'else', it lines up with the 'for'" do
217 indent.should == shiftwidth * 2
221 describe "when an 'else' is followed by" do
222 before { vim.feedkeys 'i\<TAB>\<TAB>else:\<CR>XXX\<CR>' }
223 it "a 'finally', it lines up with the 'else'" do
224 vim.feedkeys 'finally:'
225 indent.should == shiftwidth * 2
230 describe "when a 'try' is followed by" do
231 before { vim.feedkeys 'i\<TAB>\<TAB>try:\<CR>' }
232 it "an 'except', it lines up with the 'try'" do
233 vim.feedkeys 'except:'
234 indent.should == shiftwidth * 2
237 it "an 'else', it lines up with the 'try'" do
239 indent.should == shiftwidth * 2
242 it "a 'finally', it lines up with the 'try'" do
243 vim.feedkeys 'finally:'
244 indent.should == shiftwidth * 2
248 describe "when an 'except' is followed by" do
249 before { vim.feedkeys 'i\<TAB>\<TAB>except:\<CR>' }
250 it "an 'else', it lines up with the 'except'" do
252 indent.should == shiftwidth * 2
255 it "another 'except', it lines up with the previous 'except'" do
256 vim.feedkeys 'except:'
257 indent.should == shiftwidth * 2
260 it "a 'finally', it lines up with the 'except'" do
261 vim.feedkeys 'finally:'
262 indent.should == shiftwidth * 2
267 @shiftwidth ||= vim.echo("exists('*shiftwidth') ? shiftwidth() : &sw").to_i
270 @tabstop ||= vim.echo("&tabstop").to_i
273 vim.echo("indent('.')").to_i
276 pline = vim.echo("line('.')").to_i - 1
277 vim.echo("indent('#{pline}')").to_i
280 line = vim.echo("line('.')")
281 col = vim.echo("col('.')")
282 indent_value = vim.echo("GetPythonPEPIndent(line('.'))").to_i
283 vim.command("call cursor(#{line}, #{col})")
288 describe "vim when using width of 4" do
290 vim.command("set sw=4 ts=4 sts=4 et")
293 it_behaves_like "vim"
296 describe "vim when using width of 8" do
298 vim.command("set sw=8 ts=8 sts=8 et")
301 it_behaves_like "vim"