+ it "indents by one level" do
+ vim.feedkeys '\<CR>'
+ 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 '\<Esc>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 '\<Esc>o'
+ indent.should == shiftwidth
+ end
+end
+
+describe "Handles far away opening square brackets" do
+ before { vim.feedkeys '\<ESC>ggdGibar = [' }
+
+ it "indents by one level" do
+ vim.feedkeys '\<CR>'
+ 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 '\<Esc>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 '\<Esc>o'
+ indent.should == shiftwidth
+ end
+end
+
+describe "Handles far away opening curly brackets" do
+ before { vim.feedkeys '\<ESC>ggdGijson = {' }
+
+ it "indents by one level" do
+ vim.feedkeys '\<CR>'
+ vim.feedkeys '\<Esc>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 '\<Esc>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 '\<Esc>o'
+ indent.should == shiftwidth
+ end
+end
+
+describe "Compact multiline dict" do
+ before { vim.feedkeys '\<ESC>ggdGid = {"one": 1,' }
+
+ it "gets indented correctly" do
+ vim.feedkeys '\<CR>'
+ proposed_indent.should == 5
+
+ vim.feedkeys '"two": 2}'
+ proposed_indent.should == 5
+
+ vim.feedkeys '\<CR>'
+ proposed_indent.should == 0
+ end
+end
+
+describe "Using O" do
+ before {
+ vim.feedkeys '\<ESC>ggdG'
+ vim.feedkeys 'iif foo:\<CR>'
+ }
+
+ it "respects autoindent" do
+ vim.feedkeys '1\<CR>\<CR>'
+ indent.should == shiftwidth
+ vim.feedkeys '\<Esc>ko'
+ indent.should == shiftwidth
+ vim.feedkeys '\<Esc>kO'
+ indent.should == shiftwidth
+ # Uses/keeps indent from line above
+ vim.feedkeys '\<Esc>i2\<Esc>O'
+ indent.should == shiftwidth
+ # Uses/keeps indent from line above
+ vim.feedkeys '\<Esc>j\<Esc>O'
+ indent.should == 0
+ end
+end
+
+describe "searchpairpos" do
+ before { vim.feedkeys '\<ESC>ggdG' }
+ it "handles nested parenthesis" do
+ vim.feedkeys 'iif foo.startswith("("):\<CR>'
+ indent.should == shiftwidth
+ end
+end
+
+describe "o within TODO" do
+ before {
+ vim.feedkeys '\<ESC>ggdG'
+ vim.feedkeys 'iif 1: # TODO\<Esc>'
+ # Assertion that we have a pythonTodo here.
+ vim.echo('synIDattr(synID(line("."), col("."), 0), "name")').should match 'pythonTodo'
+ }
+
+ it "respects autoindent" do
+ vim.feedkeys 'o'
+ indent.should == shiftwidth
+ end
+end
+
+describe "elif after else" do
+ before {
+ vim.feedkeys '\<ESC>ggdG'
+ }
+
+ it "is indented to the outer if" do
+ vim.feedkeys 'iif 1:\<CR>if 2:\<CR>pass\<CR>else:\<CR>pass\<CR>elif 3:\<Esc>'
+ indent.should == 0
+
+ vim.feedkeys '\<ESC>ggdG'
+ vim.feedkeys 'i if 1:\<CR>if 2:\<CR>pass\<CR>else:\<CR>pass\<CR>elif 3:\<Esc>'
+ indent.should == 4
+ end
+end
+
+describe "elif after two ifs" do
+ before {
+ vim.feedkeys '\<ESC>ggdG'
+ }
+
+ it "keeps its indent to the outer if" do
+ vim.feedkeys 'iif 1:\<CR>if 2:\<CR>pass\<CR>elif 3:\<CR>pass\<CR>'
+ indent.should == 4
+ vim.feedkeys '\<Esc>'
+ indent.should == 0
+ proposed_indent.should == shiftwidth
+ vim.feedkeys 'ielif 4:'
+ indent.should == 0
+ proposed_indent.should == 0
+ vim.feedkeys '\<CR>'
+ indent.should == 4
+ proposed_indent.should == 4
+ end