169a76fedSBram Moolenaar" Tests for smartindent
253f1673cSBram Moolenaar
353f1673cSBram Moolenaar" Tests for not doing smart indenting when it isn't set.
41e115360SBram Moolenaarfunc Test_nosmartindent()
553f1673cSBram Moolenaar  new
653f1673cSBram Moolenaar  call append(0, ["		some test text",
753f1673cSBram Moolenaar	\ "		test text",
853f1673cSBram Moolenaar	\ "test text",
953f1673cSBram Moolenaar	\ "		test text"])
1053f1673cSBram Moolenaar  set nocindent nosmartindent autoindent
1153f1673cSBram Moolenaar  exe "normal! gg/some\<CR>"
1253f1673cSBram Moolenaar  exe "normal! 2cc#test\<Esc>"
1353f1673cSBram Moolenaar  call assert_equal("		#test", getline(1))
1453f1673cSBram Moolenaar  enew! | close
151e115360SBram Moolenaarendfunc
1669a76fedSBram Moolenaar
171e115360SBram Moolenaarfunc MyIndent()
181e115360SBram Moolenaarendfunc
1969a76fedSBram Moolenaar
2069a76fedSBram Moolenaar" When 'indentexpr' is set, setting 'si' has no effect.
211e115360SBram Moolenaarfunc Test_smartindent_has_no_effect()
2269a76fedSBram Moolenaar  new
2369a76fedSBram Moolenaar  exe "normal! i\<Tab>one\<Esc>"
24ca68ae13SBram Moolenaar  setlocal noautoindent smartindent indentexpr=
2569a76fedSBram Moolenaar  exe "normal! Gotwo\<Esc>"
2669a76fedSBram Moolenaar  call assert_equal("\ttwo", getline("$"))
2769a76fedSBram Moolenaar
2869a76fedSBram Moolenaar  set indentexpr=MyIndent
2969a76fedSBram Moolenaar  exe "normal! Gothree\<Esc>"
3069a76fedSBram Moolenaar  call assert_equal("three", getline("$"))
3169a76fedSBram Moolenaar
3269a76fedSBram Moolenaar  delfunction! MyIndent
3369a76fedSBram Moolenaar  bwipe!
341e115360SBram Moolenaarendfunc
3569a76fedSBram Moolenaar
36bd7206e0SBram Moolenaar" Test for inserting '{' and '} with smartindent
37bd7206e0SBram Moolenaarfunc Test_smartindent_braces()
38bd7206e0SBram Moolenaar  new
39ca68ae13SBram Moolenaar  setlocal smartindent shiftwidth=4
40bd7206e0SBram Moolenaar  call setline(1, ['    if (a)', "\tif (b)", "\t    return 1"])
41bd7206e0SBram Moolenaar  normal 2ggO{
42bd7206e0SBram Moolenaar  normal 3ggA {
43bd7206e0SBram Moolenaar  normal 4ggo}
44bd7206e0SBram Moolenaar  normal o}
45bd7206e0SBram Moolenaar  normal 4ggO#define FOO 1
46bd7206e0SBram Moolenaar  call assert_equal([
47bd7206e0SBram Moolenaar        \ '    if (a)',
48bd7206e0SBram Moolenaar        \ '    {',
49bd7206e0SBram Moolenaar        \ "\tif (b) {",
50bd7206e0SBram Moolenaar        \ '#define FOO 1',
51bd7206e0SBram Moolenaar        \ "\t    return 1",
52bd7206e0SBram Moolenaar        \ "\t}",
53bd7206e0SBram Moolenaar        \ '    }'
54bd7206e0SBram Moolenaar        \ ], getline(1, '$'))
55ca68ae13SBram Moolenaar  close!
56ca68ae13SBram Moolenaarendfunc
57ca68ae13SBram Moolenaar
58ca68ae13SBram Moolenaar" Test for adding a new line before and after comments with smartindent
59ca68ae13SBram Moolenaarfunc Test_si_add_line_around_comment()
60ca68ae13SBram Moolenaar  new
61ca68ae13SBram Moolenaar  setlocal smartindent shiftwidth=4
62ca68ae13SBram Moolenaar  call setline(1, ['    A', '# comment1', '# comment2'])
63ca68ae13SBram Moolenaar  exe "normal GoC\<Esc>2GOB"
64ca68ae13SBram Moolenaar  call assert_equal(['    A', '    B', '# comment1', '# comment2', '    C'],
65ca68ae13SBram Moolenaar        \ getline(1, '$'))
66ca68ae13SBram Moolenaar  close!
67ca68ae13SBram Moolenaarendfunc
68ca68ae13SBram Moolenaar
69ca68ae13SBram Moolenaar" After a C style comment, indent for a following line should line up with the
70ca68ae13SBram Moolenaar" line containing the start of the comment.
71ca68ae13SBram Moolenaarfunc Test_si_indent_after_c_comment()
72ca68ae13SBram Moolenaar  new
73ca68ae13SBram Moolenaar  setlocal smartindent shiftwidth=4 fo+=ro
74ca68ae13SBram Moolenaar  exe "normal i\<C-t>/*\ncomment\n/\n#define FOOBAR\n75\<Esc>ggOabc"
75ca68ae13SBram Moolenaar  normal 3jOcont
76ca68ae13SBram Moolenaar  call assert_equal(['    abc', '    /*', '     * comment', '     * cont',
77ca68ae13SBram Moolenaar        \ '     */', '#define FOOBAR', '    75'], getline(1, '$'))
78ca68ae13SBram Moolenaar  close!
79ca68ae13SBram Moolenaarendfunc
80ca68ae13SBram Moolenaar
81ca68ae13SBram Moolenaar" Test for indenting a statement after a if condition split across lines
82ca68ae13SBram Moolenaarfunc Test_si_if_cond_split_across_lines()
83ca68ae13SBram Moolenaar  new
84ca68ae13SBram Moolenaar  setlocal smartindent shiftwidth=4
85ca68ae13SBram Moolenaar  exe "normal i\<C-t>if (cond1 &&\n\<C-t>cond2) {\ni = 10;\n}"
86ca68ae13SBram Moolenaar  call assert_equal(['    if (cond1 &&', "\t    cond2) {", "\ti = 10;",
87ca68ae13SBram Moolenaar        \ '    }'], getline(1, '$'))
88ca68ae13SBram Moolenaar  close!
89ca68ae13SBram Moolenaarendfunc
90ca68ae13SBram Moolenaar
91ca68ae13SBram Moolenaar" Test for inserting lines before and after a one line comment
92ca68ae13SBram Moolenaarfunc Test_si_one_line_comment()
93ca68ae13SBram Moolenaar  new
94ca68ae13SBram Moolenaar  setlocal smartindent shiftwidth=4
95ca68ae13SBram Moolenaar  exe "normal i\<C-t>abc;\n\<C-t>/* comment */"
96ca68ae13SBram Moolenaar  normal oi = 10;
97ca68ae13SBram Moolenaar  normal kOj = 1;
98ca68ae13SBram Moolenaar  call assert_equal(['    abc;', "\tj = 1;", "\t/* comment */", "\ti = 10;"],
99ca68ae13SBram Moolenaar        \ getline(1, '$'))
100ca68ae13SBram Moolenaar  close!
101ca68ae13SBram Moolenaarendfunc
102ca68ae13SBram Moolenaar
103ca68ae13SBram Moolenaar" Test for smartindent with a comment continued across multiple lines
104ca68ae13SBram Moolenaarfunc Test_si_comment_line_continuation()
105ca68ae13SBram Moolenaar  new
106ca68ae13SBram Moolenaar  setlocal smartindent shiftwidth=4
107ca68ae13SBram Moolenaar  call setline(1, ['# com1', '# com2 \', '    contd', '# com3', '  xyz'])
108ca68ae13SBram Moolenaar  normal ggOabc
109ca68ae13SBram Moolenaar  call assert_equal(['  abc', '# com1', '# com2 \', '    contd', '# com3',
110ca68ae13SBram Moolenaar        \ '  xyz'], getline(1, '$'))
111bd7206e0SBram Moolenaar  close!
112bd7206e0SBram Moolenaarendfunc
113bd7206e0SBram Moolenaar
114*41a7f82dSYegappan Lakshmanan" When 'paste' is set, 'smartindent' should not take effect.
115*41a7f82dSYegappan Lakshmananfunc Test_si_with_paste()
116*41a7f82dSYegappan Lakshmanan  new
117*41a7f82dSYegappan Lakshmanan  setlocal smartindent autoindent
118*41a7f82dSYegappan Lakshmanan  set paste
119*41a7f82dSYegappan Lakshmanan  " insert text that will trigger smartindent
120*41a7f82dSYegappan Lakshmanan  exe "norm! i    {\nif (x)\ni = 1;\n#define FOO 1\nj = 2;\n}"
121*41a7f82dSYegappan Lakshmanan  exe "norm! Ok = 3;"
122*41a7f82dSYegappan Lakshmanan  exe "norm! 4G>>"
123*41a7f82dSYegappan Lakshmanan  call assert_equal(['    {', 'if (x)', 'i = 1;', '#define FOO 1',
124*41a7f82dSYegappan Lakshmanan        \ 'j = 2;', 'k = 3;', '}'], getline(1, '$'))
125*41a7f82dSYegappan Lakshmanan  call assert_true(&smartindent)
126*41a7f82dSYegappan Lakshmanan  set nopaste
127*41a7f82dSYegappan Lakshmanan  %d _
128*41a7f82dSYegappan Lakshmanan  exe "norm! i    {\nif (x)\ni = 1;\n#define FOO 1\nj = 2;\n}"
129*41a7f82dSYegappan Lakshmanan  exe "norm! Ok = 3;"
130*41a7f82dSYegappan Lakshmanan  exe "norm! 4G>>"
131*41a7f82dSYegappan Lakshmanan  call assert_equal(['    {', "\t    if (x)", "\t\t    i = 1;",
132*41a7f82dSYegappan Lakshmanan        \ '#define FOO 1', "\t\t    j = 2;", "\t    k = 3;", '    }'],
133*41a7f82dSYegappan Lakshmanan        \ getline(1, '$'))
134*41a7f82dSYegappan Lakshmanan  bw!
135*41a7f82dSYegappan Lakshmananendfunc
136*41a7f82dSYegappan Lakshmanan
13769a76fedSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
138