blob: c7ce2babe281f753ac844e6f17b1c25b5ea89259 [file] [log] [blame]
Bram Moolenaar6b643942017-03-05 19:44:06 +01001" Test for cinoptions and cindent
Bram Moolenaar6b643942017-03-05 19:44:06 +01002
3func Test_cino_hash()
4 " Test that curbuf->b_ind_hash_comment is correctly reset
5 new
6 setlocal cindent cinoptions=#1
7 setlocal cinoptions=
8 call setline(1, ["#include <iostream>"])
9 call cursor(1, 1)
10 norm! o#include
11 "call feedkeys("o#include\<esc>", 't')
12 call assert_equal(["#include <iostream>", "#include"], getline(1,2))
13 bwipe!
14endfunc
Bram Moolenaar7720ba82017-03-08 22:19:26 +010015
16func Test_cino_extern_c()
17 " Test for cino-E
18
Bram Moolenaarc79745a2019-05-20 22:12:34 +020019 let without_ind =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +020020 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 int func_a(void);
24 #ifdef __cplusplus
25 }
26 #endif
Bram Moolenaarc79745a2019-05-20 22:12:34 +020027 [CODE]
Bram Moolenaar7720ba82017-03-08 22:19:26 +010028
Bram Moolenaarc79745a2019-05-20 22:12:34 +020029 let with_ind =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +020030 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 int func_a(void);
34 #ifdef __cplusplus
35 }
36 #endif
Bram Moolenaarc79745a2019-05-20 22:12:34 +020037 [CODE]
Bram Moolenaar7720ba82017-03-08 22:19:26 +010038 new
39 setlocal cindent cinoptions=E0
40 call setline(1, without_ind)
41 call feedkeys("gg=G", 'tx')
42 call assert_equal(with_ind, getline(1, '$'))
43
44 setlocal cinoptions=E-s
45 call setline(1, with_ind)
46 call feedkeys("gg=G", 'tx')
47 call assert_equal(without_ind, getline(1, '$'))
48
49 setlocal cinoptions=Es
50 let tests = [
51 \ ['recognized', ['extern "C" {'], "\t\t;"],
52 \ ['recognized', ['extern "C++" {'], "\t\t;"],
53 \ ['recognized', ['extern /* com */ "C"{'], "\t\t;"],
54 \ ['recognized', ['extern"C"{'], "\t\t;"],
55 \ ['recognized', ['extern "C"', '{'], "\t\t;"],
56 \ ['not recognized', ['extern {'], "\t;"],
57 \ ['not recognized', ['extern /*"C"*/{'], "\t;"],
58 \ ['not recognized', ['extern "C" //{'], ";"],
59 \ ['not recognized', ['extern "C" /*{*/'], ";"],
60 \ ]
61
62 for pair in tests
63 let lines = pair[1]
64 call setline(1, lines)
65 call feedkeys(len(lines) . "Go;", 'tx')
66 call assert_equal(pair[2], getline(len(lines) + 1), 'Failed for "' . string(lines) . '"')
67 endfor
68
Bram Moolenaar7720ba82017-03-08 22:19:26 +010069 bwipe!
70endfunc
71
Bram Moolenaare2e69e42017-09-02 20:30:35 +020072func Test_cindent_rawstring()
Bram Moolenaardde81312017-08-26 17:49:01 +020073 new
74 setl cindent
75 call feedkeys("i" .
76 \ "int main() {\<CR>" .
77 \ "R\"(\<CR>" .
78 \ ")\";\<CR>" .
79 \ "statement;\<Esc>", "x")
80 call assert_equal("\tstatement;", getline(line('.')))
81 bw!
Bram Moolenaare2e69e42017-09-02 20:30:35 +020082endfunc
83
84func Test_cindent_expr()
85 new
86 func! MyIndentFunction()
87 return v:lnum == 1 ? shiftwidth() : 0
88 endfunc
89 setl expandtab sw=8 indentkeys+=; indentexpr=MyIndentFunction()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020090 let testinput =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +020091 var_a = something()
92 b = something()
Bram Moolenaarc79745a2019-05-20 22:12:34 +020093 [CODE]
94 call setline(1, testinput)
Bram Moolenaare2e69e42017-09-02 20:30:35 +020095 call cursor(1, 1)
96 call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
Bram Moolenaare7eb9272019-06-24 00:58:07 +020097 let expected =<< [CODE]
98 var_a = something();
99b = something();
100[CODE]
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200101 call assert_equal(expected, getline(1, '$'))
Bram Moolenaare2e69e42017-09-02 20:30:35 +0200102
103 %d
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200104 let testinput =<< [CODE]
105 var_a = something()
106 b = something()
107[CODE]
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200108 call setline(1, testinput)
Bram Moolenaare2e69e42017-09-02 20:30:35 +0200109 call cursor(1, 1)
110 call feedkeys("^\<c-v>j$A;\<esc>", 'tnix')
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200111 let expected =<< [CODE]
112 var_a = something();
113 b = something()
114[CODE]
Bram Moolenaarc79745a2019-05-20 22:12:34 +0200115 call assert_equal(expected, getline(1, '$'))
Bram Moolenaare2e69e42017-09-02 20:30:35 +0200116 bw!
117endfunc
118
Bram Moolenaar17aca702019-05-16 22:24:55 +0200119func Test_cindent_func()
120 new
121 setlocal cindent
122 call setline(1, ['int main(void)', '{', 'return 0;', '}'])
Bram Moolenaar1a3a8912019-08-23 22:31:37 +0200123 call assert_equal(-1, cindent(0))
124 call assert_equal(&sw, 3->cindent())
125 call assert_equal(-1, cindent(line('$')+1))
Bram Moolenaar17aca702019-05-16 22:24:55 +0200126 bwipe!
127endfunc
128
Bram Moolenaar1ab74a52019-05-31 20:02:53 +0200129func Test_cindent_1()
130 new
131 setl cindent ts=4 sw=4
132 setl cino& sts&
133
134 let code =<< trim [CODE]
135 /* start of AUTO matically checked vim: set ts=4 : */
136 {
137 if (test)
138 cmd1;
139 cmd2;
140 }
141
142 {
143 if (test)
144 cmd1;
145 else
146 cmd2;
147 }
148
149 {
150 if (test)
151 {
152 cmd1;
153 cmd2;
154 }
155 }
156
157 {
158 if (test)
159 {
160 cmd1;
161 else
162 }
163 }
164
165 {
166 while (this)
167 if (test)
168 cmd1;
169 cmd2;
170 }
171
172 {
173 while (this)
174 if (test)
175 cmd1;
176 else
177 cmd2;
178 }
179
180 {
181 if (test)
182 {
183 cmd;
184 }
185
186 if (test)
187 cmd;
188 }
189
190 {
191 if (test) {
192 cmd;
193 }
194
195 if (test) cmd;
196 }
197
198 {
199 cmd1;
200 for (blah)
201 while (this)
202 if (test)
203 cmd2;
204 cmd3;
205 }
206
207 {
208 cmd1;
209 for (blah)
210 while (this)
211 if (test)
212 cmd2;
213 cmd3;
214
215 if (test)
216 {
217 cmd1;
218 cmd2;
219 cmd3;
220 }
221 }
222
223
224 /* Test for 'cindent' do/while mixed with if/else: */
225
226 {
227 do
228 if (asdf)
229 asdfasd;
230 while (cond);
231
232 do
233 if (asdf)
234 while (asdf)
235 asdf;
236 while (asdf);
237 }
238
239 /* Test for 'cindent' with two ) on a continuation line */
240 {
241 if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
242 aal;sdkjf ( ;asldfkja;sldfk
243 al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
244 line up here;
245 }
246
247
248 /* C++ tests: */
249
250 // foo() these three lines should remain in column 0
251 // {
252 // }
253
254 /* Test for continuation and unterminated lines: */
255 {
256 i = 99 + 14325 +
257 21345 +
258 21345 +
259 21345 + ( 21345 +
260 21345) +
261 2345 +
262 1234;
263 c = 1;
264 }
265
266 /*
267 testje for indent with empty line
268
269 here */
270
271 {
272 if (testing &&
273 not a joke ||
274 line up here)
275 hay;
276 if (testing &&
277 (not a joke || testing
278 )line up here)
279 hay;
280 if (testing &&
281 (not a joke || testing
282 line up here))
283 hay;
284 }
285
286
287 {
288 switch (c)
289 {
290 case xx:
291 do
292 if (asdf)
293 do
294 asdfasdf;
295 while (asdf);
296 else
297 asdfasdf;
298 while (cond);
299 case yy:
300 case xx:
301 case zz:
302 testing;
303 }
304 }
305
306 {
307 if (cond) {
308 foo;
309 }
310 else
311 {
312 bar;
313 }
314 }
315
316 {
317 if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
318 alsdkfj (asldk;fj
319 awith cino=(0 ;lf this one goes to below the paren with ==
320 ;laksjfd ;lsakdjf ;alskdf asd)
321 asdfasdf;)))
322 asdfasdf;
323 }
324
325 int
326 func(a, b)
327 int a;
328 int c;
329 {
330 if (c1 && (c2 ||
331 c3))
332 foo;
333 if (c1 &&
334 (c2 || c3)
335 )
336 }
337
338 {
339 while (asd)
340 {
341 if (asdf)
342 if (test)
343 if (that)
344 {
345 if (asdf)
346 do
347 cdasd;
348 while (as
349 df);
350 }
351 else
352 if (asdf)
353 asdf;
354 else
355 asdf;
356 asdf;
357 }
358 }
359
360 {
361 s = "/*"; b = ';'
362 s = "/*"; b = ';';
363 a = b;
364 }
365
366 {
367 switch (a)
368 {
369 case a:
370 switch (t)
371 {
372 case 1:
373 cmd;
374 break;
375 case 2:
376 cmd;
377 break;
378 }
379 cmd;
380 break;
381 case b:
382 {
383 int i;
384 cmd;
385 }
386 break;
387 case c: {
388 int i;
389 cmd;
390 }
391 case d: if (cond &&
392 test) { /* this line doesn't work right */
393 int i;
394 cmd;
395 }
396 break;
397 }
398 }
399
400 {
401 if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
402 (bp_to->b_p_initialized ||
403 (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
404 return;
405 label :
406 asdf = asdf ?
407 asdf : asdf;
408 asdf = asdf ?
409 asdf: asdf;
410 }
411
412 /* Special Comments : This function has the added complexity (compared */
413 /* : to addtolist) of having to check for a detail */
414 /* : texture and add that to the list first. */
415
416 char *(array[100]) = {
417 "testje",
418 "foo",
419 "bar",
420 }
421
422 enum soppie
423 {
424 yes = 0,
425 no,
426 maybe
427 };
428
429 typedef enum soppie
430 {
431 yes = 0,
432 no,
433 maybe
434 };
435
436 static enum
437 {
438 yes = 0,
439 no,
440 maybe
441 } soppie;
442
443 public static enum
444 {
445 yes = 0,
446 no,
447 maybe
448 } soppie;
449
450 static private enum
451 {
452 yes = 0,
453 no,
454 maybe
455 } soppie;
456
457 {
458 int a,
459 b;
460 }
461
462 {
463 struct Type
464 {
465 int i;
466 char *str;
467 } var[] =
468 {
469 0, "zero",
470 1, "one",
471 2, "two",
472 3, "three"
473 };
474
475 float matrix[3][3] =
476 {
477 {
478 0,
479 1,
480 2
481 },
482 {
483 3,
484 4,
485 5
486 },
487 {
488 6,
489 7,
490 8
491 }
492 };
493 }
494
495 {
496 /* blah ( blah */
497 /* where does this go? */
498
499 /* blah ( blah */
500 cmd;
501
502 func(arg1,
503 /* comment */
504 arg2);
505 a;
506 {
507 b;
508 {
509 c; /* Hey, NOW it indents?! */
510 }
511 }
512
513 {
514 func(arg1,
515 arg2,
516 arg3);
517 /* Hey, what am I doing here? Is this coz of the ","? */
518 }
519 }
520
521 main ()
522 {
523 if (cond)
524 {
525 a = b;
526 }
527 if (cond) {
528 a = c;
529 }
530 if (cond)
531 a = d;
532 return;
533 }
534
535 {
536 case 2: if (asdf &&
537 asdfasdf)
538 aasdf;
539 a = 9;
540 case 3: if (asdf)
541 aasdf;
542 a = 9;
543 case 4: x = 1;
544 y = 2;
545
546 label: if (asdf)
547 here;
548
549 label: if (asdf &&
550 asdfasdf)
551 {
552 }
553
554 label: if (asdf &&
555 asdfasdf) {
556 there;
557 }
558
559 label: if (asdf &&
560 asdfasdf)
561 there;
562 }
563
564 {
565 /*
566 hello with ":set comments= cino=c5"
567 */
568
569 /*
570 hello with ":set comments= cino="
571 */
572 }
573
574
575 {
576 if (a < b) {
577 a = a + 1;
578 } else
579 a = a + 2;
580
581 if (a)
582 do {
583 testing;
584 } while (asdfasdf);
585 a = b + 1;
586 asdfasdf
587 }
588
589 {
590 for ( int i = 0;
591 i < 10; i++ )
592 {
593 }
594 i = 0;
595 }
596
597 class bob
598 {
599 int foo() {return 1;}
600 int bar;
601 }
602
603 main()
604 {
605 while(1)
606 if (foo)
607 {
608 bar;
609 }
610 else {
611 asdf;
612 }
613 misplacedline;
614 }
615
616 {
617 if (clipboard.state == SELECT_DONE
618 && ((row == clipboard.start.lnum
619 && col >= clipboard.start.col)
620 || row > clipboard.start.lnum))
621 }
622
623 {
624 if (1) {i += 4;}
625 where_am_i;
626 return 0;
627 }
628
629 {
630 {
631 } // sdf(asdf
632 if (asdf)
633 asd;
634 }
635
636 {
637 label1:
638 label2:
639 }
640
641 {
642 int fooRet = foo(pBar1, false /*fKB*/,
643 true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
644 f() {
645 for ( i = 0;
646 i < m;
647 /* c */ i++ ) {
648 a = b;
649 }
650 }
651 }
652
653 {
654 f1(/*comment*/);
655 f2();
656 }
657
658 {
659 do {
660 if (foo) {
661 } else
662 ;
663 } while (foo);
664 foo(); // was wrong
665 }
666
667 int x; // no extra indent because of the ;
668 void func()
669 {
670 }
671
672 char *tab[] = {"aaa",
673 "};", /* }; */ NULL}
674 int indented;
675 {}
676
677 char *a[] = {"aaa", "bbb",
678 "ccc", NULL};
679 // here
680
681 char *tab[] = {"aaa",
682 "xx", /* xx */}; /* asdf */
683 int not_indented;
684
685 {
686 do {
687 switch (bla)
688 {
689 case 1: if (foo)
690 bar;
691 }
692 } while (boo);
693 wrong;
694 }
695
696 int foo,
697 bar;
698 int foo;
699
700 #if defined(foo) \
701 && defined(bar)
702 char * xx = "asdf\
703 foo\
704 bor";
705 int x;
706
707 char *foo = "asdf\
708 asdf\
709 asdf",
710 *bar;
711
712 void f()
713 {
714 #if defined(foo) \
715 && defined(bar)
716 char *foo = "asdf\
717 asdf\
718 asdf",
719 *bar;
720 {
721 int i;
722 char *foo = "asdf\
723 asdf\
724 asdf",
725 *bar;
726 }
727 #endif
728 }
729 #endif
730
731 int y; // comment
732 // comment
733
734 // comment
735
736 {
737 Constructor(int a,
738 int b ) : BaseClass(a)
739 {
740 }
741 }
742
743 void foo()
744 {
745 char one,
746 two;
747 struct bla piet,
748 jan;
749 enum foo kees,
750 jannie;
751 static unsigned sdf,
752 krap;
753 unsigned int piet,
754 jan;
755 int
756 kees,
757 jan;
758 }
759
760 {
761 t(int f,
762 int d); // )
763 d();
764 }
765
766 Constructor::Constructor(int a,
767 int b
768 ) :
769 BaseClass(a,
770 b,
771 c),
772 mMember(b),
773 {
774 }
775
776 Constructor::Constructor(int a,
777 int b ) :
778 BaseClass(a)
779 {
780 }
781
782 Constructor::Constructor(int a,
783 int b ) /*x*/ : /*x*/ BaseClass(a),
784 member(b)
785 {
786 }
787
788 A::A(int a, int b)
789 : aa(a),
790 bb(b),
791 cc(c)
792 {
793 }
794
795 class CAbc :
796 public BaseClass1,
797 protected BaseClass2
798 {
799 int Test() { return FALSE; }
800 int Test1() { return TRUE; }
801
802 CAbc(int a, int b ) :
803 BaseClass(a)
804 {
805 switch(xxx)
806 {
807 case abc:
808 asdf();
809 break;
810
811 case 999:
812 baer();
813 break;
814 }
815 }
816
Bram Moolenaar4b96df52020-01-26 22:00:26 +0100817 public: // <-- this was incorrectly indented before!!
Bram Moolenaar1ab74a52019-05-31 20:02:53 +0200818 void testfall();
819 protected:
820 void testfall();
821 };
822
823 class CAbc : public BaseClass1,
824 protected BaseClass2
825 {
826 };
827
828 static struct
829 {
830 int a;
831 int b;
832 } variable[COUNT] =
833 {
834 {
835 123,
836 456
837 },
838 {
839 123,
840 456
841 }
842 };
843
844 static struct
845 {
846 int a;
847 int b;
848 } variable[COUNT] =
849 {
850 { 123, 456 },
851 { 123, 456 }
852 };
853
854 void asdf() /* ind_maxparen may cause trouble here */
855 {
856 if ((0
857 && 1
858 && 1
859 && 1
860 && 1
861 && 1
862 && 1
863 && 1
864 && 1
865 && 1
866 && 1
867 && 1
868 && 1
869 && 1
870 && 1
871 && 1
872 && 1
873 && 1
874 && 1
875 && 1
876 && 1
877 && 1
878 && 1
879 && 1
880 && 1
881 && 1)) break;
882 }
883
884 foo()
885 {
886 a = cond ? foo() : asdf
887 + asdf;
888
889 a = cond ?
890 foo() : asdf
891 + asdf;
892 }
893
894 int main(void)
895 {
896 if (a)
897 if (b)
898 2;
899 else 3;
900 next_line_of_code();
901 }
902
903 barry()
904 {
905 Foo::Foo (int one,
906 int two)
907 : something(4)
908 {}
909 }
910
911 barry()
912 {
913 Foo::Foo (int one, int two)
914 : something(4)
915 {}
916 }
917
918 Constructor::Constructor(int a,
919 int b
920 ) :
921 BaseClass(a,
922 b,
923 c),
924 mMember(b)
925 {
926 }
927 int main ()
928 {
929 if (lala)
930 do
931 ++(*lolo);
932 while (lili
933 && lele);
934 lulu;
935 }
936
937 int main ()
938 {
939 switch (c)
940 {
941 case 'c': if (cond)
942 {
943 }
944 }
945 }
946
947 main()
948 {
949 (void) MyFancyFuasdfadsfnction(
950 argument);
951 }
952
953 main()
954 {
955 char foo[] = "/*";
956 /* as
957 df */
958 hello
959 }
960
961 /* valid namespaces with normal indent */
962 namespace
963 {
964 {
965 111111111111;
966 }
967 }
968 namespace /* test */
969 {
970 11111111111111111;
971 }
972 namespace // test
973 {
974 111111111111111111;
975 }
976 namespace
977 {
978 111111111111111111;
979 }
980 namespace test
981 {
982 111111111111111111;
983 }
984 namespace{
985 111111111111111111;
986 }
987 namespace test{
988 111111111111111111;
989 }
990 namespace {
991 111111111111111111;
992 }
993 namespace test {
994 111111111111111111;
995 namespace test2 {
996 22222222222222222;
997 }
998 }
999
1000 /* invalid namespaces use block indent */
1001 namespace test test2 {
1002 111111111111111111111;
1003 }
1004 namespace11111111111 {
1005 111111111111;
1006 }
1007 namespace() {
1008 1111111111111;
1009 }
1010 namespace()
1011 {
1012 111111111111111111;
1013 }
1014 namespace test test2
1015 {
1016 1111111111111111111;
1017 }
1018 namespace111111111
1019 {
1020 111111111111111111;
1021 }
1022
1023 void getstring() {
1024 /* Raw strings */
1025 const char* s = R"(
1026 test {
1027 # comment
1028 field: 123
1029 }
1030 )";
1031 }
1032
1033 void getstring() {
1034 const char* s = R"foo(
1035 test {
1036 # comment
1037 field: 123
1038 }
1039 )foo";
1040 }
1041
1042 {
1043 int a[4] = {
1044 [0] = 0,
1045 [1] = 1,
1046 [2] = 2,
1047 [3] = 3,
1048 };
1049 }
1050
1051 {
1052 a = b[2]
1053 + 3;
1054 }
1055
1056 {
1057 if (1)
1058 /* aaaaa
1059 * bbbbb
1060 */
1061 a = 1;
1062 }
1063
1064 void func()
1065 {
1066 switch (foo)
1067 {
1068 case (bar):
1069 if (baz())
1070 quux();
1071 break;
1072 case (shmoo):
1073 if (!bar)
1074 {
1075 }
1076 case (foo1):
1077 switch (bar)
1078 {
1079 case baz:
1080 baz_f();
1081 break;
1082 }
1083 break;
1084 default:
1085 baz();
1086 baz();
1087 break;
1088 }
1089 }
1090
1091 /* end of AUTO */
1092 [CODE]
1093
1094 call append(0, code)
1095 normal gg
1096 call search('start of AUTO')
1097 exe "normal =/end of AUTO\<CR>"
1098
1099 let expected =<< trim [CODE]
1100 /* start of AUTO matically checked vim: set ts=4 : */
1101 {
1102 if (test)
1103 cmd1;
1104 cmd2;
1105 }
1106
1107 {
1108 if (test)
1109 cmd1;
1110 else
1111 cmd2;
1112 }
1113
1114 {
1115 if (test)
1116 {
1117 cmd1;
1118 cmd2;
1119 }
1120 }
1121
1122 {
1123 if (test)
1124 {
1125 cmd1;
1126 else
1127 }
1128 }
1129
1130 {
1131 while (this)
1132 if (test)
1133 cmd1;
1134 cmd2;
1135 }
1136
1137 {
1138 while (this)
1139 if (test)
1140 cmd1;
1141 else
1142 cmd2;
1143 }
1144
1145 {
1146 if (test)
1147 {
1148 cmd;
1149 }
1150
1151 if (test)
1152 cmd;
1153 }
1154
1155 {
1156 if (test) {
1157 cmd;
1158 }
1159
1160 if (test) cmd;
1161 }
1162
1163 {
1164 cmd1;
1165 for (blah)
1166 while (this)
1167 if (test)
1168 cmd2;
1169 cmd3;
1170 }
1171
1172 {
1173 cmd1;
1174 for (blah)
1175 while (this)
1176 if (test)
1177 cmd2;
1178 cmd3;
1179
1180 if (test)
1181 {
1182 cmd1;
1183 cmd2;
1184 cmd3;
1185 }
1186 }
1187
1188
1189 /* Test for 'cindent' do/while mixed with if/else: */
1190
1191 {
1192 do
1193 if (asdf)
1194 asdfasd;
1195 while (cond);
1196
1197 do
1198 if (asdf)
1199 while (asdf)
1200 asdf;
1201 while (asdf);
1202 }
1203
1204 /* Test for 'cindent' with two ) on a continuation line */
1205 {
1206 if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
1207 aal;sdkjf ( ;asldfkja;sldfk
1208 al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
1209 line up here;
1210 }
1211
1212
1213 /* C++ tests: */
1214
1215 // foo() these three lines should remain in column 0
1216 // {
1217 // }
1218
1219 /* Test for continuation and unterminated lines: */
1220 {
1221 i = 99 + 14325 +
1222 21345 +
1223 21345 +
1224 21345 + ( 21345 +
1225 21345) +
1226 2345 +
1227 1234;
1228 c = 1;
1229 }
1230
1231 /*
1232 testje for indent with empty line
1233
1234 here */
1235
1236 {
1237 if (testing &&
1238 not a joke ||
1239 line up here)
1240 hay;
1241 if (testing &&
1242 (not a joke || testing
1243 )line up here)
1244 hay;
1245 if (testing &&
1246 (not a joke || testing
1247 line up here))
1248 hay;
1249 }
1250
1251
1252 {
1253 switch (c)
1254 {
1255 case xx:
1256 do
1257 if (asdf)
1258 do
1259 asdfasdf;
1260 while (asdf);
1261 else
1262 asdfasdf;
1263 while (cond);
1264 case yy:
1265 case xx:
1266 case zz:
1267 testing;
1268 }
1269 }
1270
1271 {
1272 if (cond) {
1273 foo;
1274 }
1275 else
1276 {
1277 bar;
1278 }
1279 }
1280
1281 {
1282 if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
1283 alsdkfj (asldk;fj
1284 awith cino=(0 ;lf this one goes to below the paren with ==
1285 ;laksjfd ;lsakdjf ;alskdf asd)
1286 asdfasdf;)))
1287 asdfasdf;
1288 }
1289
1290 int
1291 func(a, b)
1292 int a;
1293 int c;
1294 {
1295 if (c1 && (c2 ||
1296 c3))
1297 foo;
1298 if (c1 &&
1299 (c2 || c3)
1300 )
1301 }
1302
1303 {
1304 while (asd)
1305 {
1306 if (asdf)
1307 if (test)
1308 if (that)
1309 {
1310 if (asdf)
1311 do
1312 cdasd;
1313 while (as
1314 df);
1315 }
1316 else
1317 if (asdf)
1318 asdf;
1319 else
1320 asdf;
1321 asdf;
1322 }
1323 }
1324
1325 {
1326 s = "/*"; b = ';'
1327 s = "/*"; b = ';';
1328 a = b;
1329 }
1330
1331 {
1332 switch (a)
1333 {
1334 case a:
1335 switch (t)
1336 {
1337 case 1:
1338 cmd;
1339 break;
1340 case 2:
1341 cmd;
1342 break;
1343 }
1344 cmd;
1345 break;
1346 case b:
1347 {
1348 int i;
1349 cmd;
1350 }
1351 break;
1352 case c: {
1353 int i;
1354 cmd;
1355 }
1356 case d: if (cond &&
1357 test) { /* this line doesn't work right */
1358 int i;
1359 cmd;
1360 }
1361 break;
1362 }
1363 }
1364
1365 {
1366 if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
1367 (bp_to->b_p_initialized ||
1368 (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
1369 return;
1370 label :
1371 asdf = asdf ?
1372 asdf : asdf;
1373 asdf = asdf ?
1374 asdf: asdf;
1375 }
1376
1377 /* Special Comments : This function has the added complexity (compared */
1378 /* : to addtolist) of having to check for a detail */
1379 /* : texture and add that to the list first. */
1380
1381 char *(array[100]) = {
1382 "testje",
1383 "foo",
1384 "bar",
1385 }
1386
1387 enum soppie
1388 {
1389 yes = 0,
1390 no,
1391 maybe
1392 };
1393
1394 typedef enum soppie
1395 {
1396 yes = 0,
1397 no,
1398 maybe
1399 };
1400
1401 static enum
1402 {
1403 yes = 0,
1404 no,
1405 maybe
1406 } soppie;
1407
1408 public static enum
1409 {
1410 yes = 0,
1411 no,
1412 maybe
1413 } soppie;
1414
1415 static private enum
1416 {
1417 yes = 0,
1418 no,
1419 maybe
1420 } soppie;
1421
1422 {
1423 int a,
1424 b;
1425 }
1426
1427 {
1428 struct Type
1429 {
1430 int i;
1431 char *str;
1432 } var[] =
1433 {
1434 0, "zero",
1435 1, "one",
1436 2, "two",
1437 3, "three"
1438 };
1439
1440 float matrix[3][3] =
1441 {
1442 {
1443 0,
1444 1,
1445 2
1446 },
1447 {
1448 3,
1449 4,
1450 5
1451 },
1452 {
1453 6,
1454 7,
1455 8
1456 }
1457 };
1458 }
1459
1460 {
1461 /* blah ( blah */
1462 /* where does this go? */
1463
1464 /* blah ( blah */
1465 cmd;
1466
1467 func(arg1,
1468 /* comment */
1469 arg2);
1470 a;
1471 {
1472 b;
1473 {
1474 c; /* Hey, NOW it indents?! */
1475 }
1476 }
1477
1478 {
1479 func(arg1,
1480 arg2,
1481 arg3);
1482 /* Hey, what am I doing here? Is this coz of the ","? */
1483 }
1484 }
1485
1486 main ()
1487 {
1488 if (cond)
1489 {
1490 a = b;
1491 }
1492 if (cond) {
1493 a = c;
1494 }
1495 if (cond)
1496 a = d;
1497 return;
1498 }
1499
1500 {
1501 case 2: if (asdf &&
1502 asdfasdf)
1503 aasdf;
1504 a = 9;
1505 case 3: if (asdf)
1506 aasdf;
1507 a = 9;
1508 case 4: x = 1;
1509 y = 2;
1510
1511 label: if (asdf)
1512 here;
1513
1514 label: if (asdf &&
1515 asdfasdf)
1516 {
1517 }
1518
1519 label: if (asdf &&
1520 asdfasdf) {
1521 there;
1522 }
1523
1524 label: if (asdf &&
1525 asdfasdf)
1526 there;
1527 }
1528
1529 {
1530 /*
1531 hello with ":set comments= cino=c5"
1532 */
1533
1534 /*
1535 hello with ":set comments= cino="
1536 */
1537 }
1538
1539
1540 {
1541 if (a < b) {
1542 a = a + 1;
1543 } else
1544 a = a + 2;
1545
1546 if (a)
1547 do {
1548 testing;
1549 } while (asdfasdf);
1550 a = b + 1;
1551 asdfasdf
1552 }
1553
1554 {
1555 for ( int i = 0;
1556 i < 10; i++ )
1557 {
1558 }
1559 i = 0;
1560 }
1561
1562 class bob
1563 {
1564 int foo() {return 1;}
1565 int bar;
1566 }
1567
1568 main()
1569 {
1570 while(1)
1571 if (foo)
1572 {
1573 bar;
1574 }
1575 else {
1576 asdf;
1577 }
1578 misplacedline;
1579 }
1580
1581 {
1582 if (clipboard.state == SELECT_DONE
1583 && ((row == clipboard.start.lnum
1584 && col >= clipboard.start.col)
1585 || row > clipboard.start.lnum))
1586 }
1587
1588 {
1589 if (1) {i += 4;}
1590 where_am_i;
1591 return 0;
1592 }
1593
1594 {
1595 {
1596 } // sdf(asdf
1597 if (asdf)
1598 asd;
1599 }
1600
1601 {
1602 label1:
1603 label2:
1604 }
1605
1606 {
1607 int fooRet = foo(pBar1, false /*fKB*/,
1608 true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
1609 f() {
1610 for ( i = 0;
1611 i < m;
1612 /* c */ i++ ) {
1613 a = b;
1614 }
1615 }
1616 }
1617
1618 {
1619 f1(/*comment*/);
1620 f2();
1621 }
1622
1623 {
1624 do {
1625 if (foo) {
1626 } else
1627 ;
1628 } while (foo);
1629 foo(); // was wrong
1630 }
1631
1632 int x; // no extra indent because of the ;
1633 void func()
1634 {
1635 }
1636
1637 char *tab[] = {"aaa",
1638 "};", /* }; */ NULL}
1639 int indented;
1640 {}
1641
1642 char *a[] = {"aaa", "bbb",
1643 "ccc", NULL};
1644 // here
1645
1646 char *tab[] = {"aaa",
1647 "xx", /* xx */}; /* asdf */
1648 int not_indented;
1649
1650 {
1651 do {
1652 switch (bla)
1653 {
1654 case 1: if (foo)
1655 bar;
1656 }
1657 } while (boo);
1658 wrong;
1659 }
1660
1661 int foo,
1662 bar;
1663 int foo;
1664
1665 #if defined(foo) \
1666 && defined(bar)
1667 char * xx = "asdf\
1668 foo\
1669 bor";
1670 int x;
1671
1672 char *foo = "asdf\
1673 asdf\
1674 asdf",
1675 *bar;
1676
1677 void f()
1678 {
1679 #if defined(foo) \
1680 && defined(bar)
1681 char *foo = "asdf\
1682 asdf\
1683 asdf",
1684 *bar;
1685 {
1686 int i;
1687 char *foo = "asdf\
1688 asdf\
1689 asdf",
1690 *bar;
1691 }
1692 #endif
1693 }
1694 #endif
1695
1696 int y; // comment
Bram Moolenaar6e371ec2021-12-12 14:16:39 +00001697 // comment
Bram Moolenaar1ab74a52019-05-31 20:02:53 +02001698
Bram Moolenaar6e371ec2021-12-12 14:16:39 +00001699 // comment
Bram Moolenaar1ab74a52019-05-31 20:02:53 +02001700
1701 {
1702 Constructor(int a,
1703 int b ) : BaseClass(a)
1704 {
1705 }
1706 }
1707
1708 void foo()
1709 {
1710 char one,
1711 two;
1712 struct bla piet,
1713 jan;
1714 enum foo kees,
1715 jannie;
1716 static unsigned sdf,
1717 krap;
1718 unsigned int piet,
1719 jan;
1720 int
1721 kees,
1722 jan;
1723 }
1724
1725 {
1726 t(int f,
1727 int d); // )
1728 d();
1729 }
1730
1731 Constructor::Constructor(int a,
1732 int b
1733 ) :
1734 BaseClass(a,
1735 b,
1736 c),
1737 mMember(b),
1738 {
1739 }
1740
1741 Constructor::Constructor(int a,
1742 int b ) :
1743 BaseClass(a)
1744 {
1745 }
1746
1747 Constructor::Constructor(int a,
1748 int b ) /*x*/ : /*x*/ BaseClass(a),
1749 member(b)
1750 {
1751 }
1752
1753 A::A(int a, int b)
1754 : aa(a),
1755 bb(b),
1756 cc(c)
1757 {
1758 }
1759
1760 class CAbc :
1761 public BaseClass1,
1762 protected BaseClass2
1763 {
1764 int Test() { return FALSE; }
1765 int Test1() { return TRUE; }
1766
1767 CAbc(int a, int b ) :
1768 BaseClass(a)
1769 {
1770 switch(xxx)
1771 {
1772 case abc:
1773 asdf();
1774 break;
1775
1776 case 999:
1777 baer();
1778 break;
1779 }
1780 }
1781
Bram Moolenaar4b96df52020-01-26 22:00:26 +01001782 public: // <-- this was incorrectly indented before!!
Bram Moolenaar1ab74a52019-05-31 20:02:53 +02001783 void testfall();
1784 protected:
1785 void testfall();
1786 };
1787
1788 class CAbc : public BaseClass1,
1789 protected BaseClass2
1790 {
1791 };
1792
1793 static struct
1794 {
1795 int a;
1796 int b;
1797 } variable[COUNT] =
1798 {
1799 {
1800 123,
1801 456
1802 },
1803 {
1804 123,
1805 456
1806 }
1807 };
1808
1809 static struct
1810 {
1811 int a;
1812 int b;
1813 } variable[COUNT] =
1814 {
1815 { 123, 456 },
1816 { 123, 456 }
1817 };
1818
1819 void asdf() /* ind_maxparen may cause trouble here */
1820 {
1821 if ((0
1822 && 1
1823 && 1
1824 && 1
1825 && 1
1826 && 1
1827 && 1
1828 && 1
1829 && 1
1830 && 1
1831 && 1
1832 && 1
1833 && 1
1834 && 1
1835 && 1
1836 && 1
1837 && 1
1838 && 1
1839 && 1
1840 && 1
1841 && 1
1842 && 1
1843 && 1
1844 && 1
1845 && 1
1846 && 1)) break;
1847 }
1848
1849 foo()
1850 {
1851 a = cond ? foo() : asdf
1852 + asdf;
1853
1854 a = cond ?
1855 foo() : asdf
1856 + asdf;
1857 }
1858
1859 int main(void)
1860 {
1861 if (a)
1862 if (b)
1863 2;
1864 else 3;
1865 next_line_of_code();
1866 }
1867
1868 barry()
1869 {
1870 Foo::Foo (int one,
1871 int two)
1872 : something(4)
1873 {}
1874 }
1875
1876 barry()
1877 {
1878 Foo::Foo (int one, int two)
1879 : something(4)
1880 {}
1881 }
1882
1883 Constructor::Constructor(int a,
1884 int b
1885 ) :
1886 BaseClass(a,
1887 b,
1888 c),
1889 mMember(b)
1890 {
1891 }
1892 int main ()
1893 {
1894 if (lala)
1895 do
1896 ++(*lolo);
1897 while (lili
1898 && lele);
1899 lulu;
1900 }
1901
1902 int main ()
1903 {
1904 switch (c)
1905 {
1906 case 'c': if (cond)
1907 {
1908 }
1909 }
1910 }
1911
1912 main()
1913 {
1914 (void) MyFancyFuasdfadsfnction(
1915 argument);
1916 }
1917
1918 main()
1919 {
1920 char foo[] = "/*";
1921 /* as
1922 df */
1923 hello
1924 }
1925
1926 /* valid namespaces with normal indent */
1927 namespace
1928 {
1929 {
1930 111111111111;
1931 }
1932 }
1933 namespace /* test */
1934 {
1935 11111111111111111;
1936 }
1937 namespace // test
1938 {
1939 111111111111111111;
1940 }
1941 namespace
1942 {
1943 111111111111111111;
1944 }
1945 namespace test
1946 {
1947 111111111111111111;
1948 }
1949 namespace{
1950 111111111111111111;
1951 }
1952 namespace test{
1953 111111111111111111;
1954 }
1955 namespace {
1956 111111111111111111;
1957 }
1958 namespace test {
1959 111111111111111111;
1960 namespace test2 {
1961 22222222222222222;
1962 }
1963 }
1964
1965 /* invalid namespaces use block indent */
1966 namespace test test2 {
1967 111111111111111111111;
1968 }
1969 namespace11111111111 {
1970 111111111111;
1971 }
1972 namespace() {
1973 1111111111111;
1974 }
1975 namespace()
1976 {
1977 111111111111111111;
1978 }
1979 namespace test test2
1980 {
1981 1111111111111111111;
1982 }
1983 namespace111111111
1984 {
1985 111111111111111111;
1986 }
1987
1988 void getstring() {
1989 /* Raw strings */
1990 const char* s = R"(
1991 test {
1992 # comment
1993 field: 123
1994 }
1995 )";
1996 }
1997
1998 void getstring() {
1999 const char* s = R"foo(
2000 test {
2001 # comment
2002 field: 123
2003 }
2004 )foo";
2005 }
2006
2007 {
2008 int a[4] = {
2009 [0] = 0,
2010 [1] = 1,
2011 [2] = 2,
2012 [3] = 3,
2013 };
2014 }
2015
2016 {
2017 a = b[2]
2018 + 3;
2019 }
2020
2021 {
2022 if (1)
2023 /* aaaaa
2024 * bbbbb
2025 */
2026 a = 1;
2027 }
2028
2029 void func()
2030 {
2031 switch (foo)
2032 {
2033 case (bar):
2034 if (baz())
2035 quux();
2036 break;
2037 case (shmoo):
2038 if (!bar)
2039 {
2040 }
2041 case (foo1):
2042 switch (bar)
2043 {
2044 case baz:
2045 baz_f();
2046 break;
2047 }
2048 break;
2049 default:
2050 baz();
2051 baz();
2052 break;
2053 }
2054 }
2055
2056 /* end of AUTO */
2057
2058 [CODE]
2059
2060 call assert_equal(expected, getline(1, '$'))
2061 enew! | close
2062endfunc
2063
2064func Test_cindent_2()
2065 new
2066 setl cindent ts=4 sw=4
2067 setl tw=0 noai fo=croq
2068 let &wm = &columns - 20
2069
2070 let code =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02002071 {
2072
2073 /* this is
2074 * a real serious important big
2075 * comment
2076 */
2077 /* insert " about life, the universe, and the rest" after "serious" */
2078 }
Bram Moolenaar1ab74a52019-05-31 20:02:53 +02002079 [CODE]
2080
2081 call append(0, code)
2082 normal gg
2083 call search('serious', 'e')
2084 normal a about life, the universe, and the rest
2085
2086 let expected =<< trim [CODE]
2087 {
2088
2089 /* this is
2090 * a real serious
2091 * about life, the
2092 * universe, and the
2093 * rest important big
2094 * comment
2095 */
2096 /* insert " about life, the universe, and the rest" after "serious" */
2097 }
2098
2099 [CODE]
2100
2101 call assert_equal(expected, getline(1, '$'))
2102 set wm&
2103 enew! | close
2104endfunc
2105
2106func Test_cindent_3()
2107 new
2108 setl nocindent ts=4 sw=4
2109
2110 let code =<< trim [CODE]
2111 {
2112 /*
2113 * Testing for comments, without 'cin' set
2114 */
2115
2116 /*
2117 * what happens here?
2118 */
2119
2120 /*
2121 the end of the comment, try inserting a line below */
2122
2123 /* how about
2124 this one */
2125 }
2126 [CODE]
2127
2128 call append(0, code)
2129 normal gg
2130 call search('comments')
2131 normal joabout life
2132 call search('happens')
2133 normal jothere
2134 call search('below')
2135 normal oline
2136 call search('this')
2137 normal Ohello
2138
2139 let expected =<< trim [CODE]
2140 {
2141 /*
2142 * Testing for comments, without 'cin' set
2143 */
2144 about life
2145
2146 /*
2147 * what happens here?
2148 */
2149 there
2150
2151 /*
2152 the end of the comment, try inserting a line below */
2153 line
2154
2155 /* how about
2156 hello
2157 this one */
2158 }
2159
2160 [CODE]
2161
2162 call assert_equal(expected, getline(1, '$'))
2163 enew! | close
2164endfunc
2165
2166func Test_cindent_4()
2167 new
2168 setl cindent ts=4 sw=4
2169
2170 let code =<< trim [CODE]
2171 {
2172 var = this + that + vec[0] * vec[0]
2173 + vec[1] * vec[1]
2174 + vec2[2] * vec[2];
2175 }
2176 [CODE]
2177
2178 call append(0, code)
2179 normal gg
2180 call search('vec2')
2181 normal ==
2182
2183 let expected =<< trim [CODE]
2184 {
2185 var = this + that + vec[0] * vec[0]
2186 + vec[1] * vec[1]
2187 + vec2[2] * vec[2];
2188 }
2189
2190 [CODE]
2191
2192 call assert_equal(expected, getline(1, '$'))
2193 enew! | close
2194endfunc
2195
2196func Test_cindent_5()
2197 new
2198 setl cindent ts=4 sw=4
2199 setl cino=}4
2200
2201 let code =<< trim [CODE]
2202 {
2203 asdf asdflkajds f;
2204 if (tes & ting) {
2205 asdf asdf asdf ;
2206 asdfa sdf asdf;
2207 }
2208 testing1;
2209 if (tes & ting)
2210 {
2211 asdf asdf asdf ;
2212 asdfa sdf asdf;
2213 }
2214 testing2;
2215 }
2216 [CODE]
2217
2218 call append(0, code)
2219 normal gg
2220 call search('testing1')
2221 exe "normal k2==/testing2\<CR>"
2222 normal k2==
2223
2224 let expected =<< trim [CODE]
2225 {
2226 asdf asdflkajds f;
2227 if (tes & ting) {
2228 asdf asdf asdf ;
2229 asdfa sdf asdf;
2230 }
2231 testing1;
2232 if (tes & ting)
2233 {
2234 asdf asdf asdf ;
2235 asdfa sdf asdf;
2236 }
2237 testing2;
2238 }
2239
2240 [CODE]
2241
2242 call assert_equal(expected, getline(1, '$'))
2243 enew! | close
2244endfunc
2245
2246func Test_cindent_6()
2247 new
2248 setl cindent ts=4 sw=4
2249 setl cino=(0,)20
2250
2251 let code =<< trim [CODE]
2252 main ( int first_par, /*
2253 * Comment for
2254 * first par
2255 */
2256 int second_par /*
2257 * Comment for
2258 * second par
2259 */
2260 )
2261 {
2262 func( first_par, /*
2263 * Comment for
2264 * first par
2265 */
2266 second_par /*
2267 * Comment for
2268 * second par
2269 */
2270 );
2271
2272 }
2273 [CODE]
2274
2275 call append(0, code)
2276 normal gg
2277 call search('main')
2278 normal =][
2279
2280 let expected =<< trim [CODE]
2281 main ( int first_par, /*
2282 * Comment for
2283 * first par
2284 */
2285 int second_par /*
2286 * Comment for
2287 * second par
2288 */
2289 )
2290 {
2291 func( first_par, /*
2292 * Comment for
2293 * first par
2294 */
2295 second_par /*
2296 * Comment for
2297 * second par
2298 */
2299 );
2300
2301 }
2302
2303 [CODE]
2304
2305 call assert_equal(expected, getline(1, '$'))
2306 enew! | close
2307endfunc
2308
2309func Test_cindent_7()
2310 new
2311 setl cindent ts=4 sw=4
2312 setl cino=es,n0s
2313
2314 let code =<< trim [CODE]
2315 main(void)
2316 {
2317 /* Make sure that cino=X0s is not parsed like cino=Xs. */
2318 if (cond)
2319 foo();
2320 else
2321 {
2322 bar();
2323 }
2324 }
2325 [CODE]
2326
2327 call append(0, code)
2328 normal gg
2329 call search('main')
2330 normal =][
2331
2332 let expected =<< trim [CODE]
2333 main(void)
2334 {
2335 /* Make sure that cino=X0s is not parsed like cino=Xs. */
2336 if (cond)
2337 foo();
2338 else
2339 {
2340 bar();
2341 }
2342 }
2343
2344 [CODE]
2345
2346 call assert_equal(expected, getline(1, '$'))
2347 enew! | close
2348endfunc
2349
2350func Test_cindent_8()
2351 new
2352 setl cindent ts=4 sw=4
2353 setl cino=
2354
2355 let code =<< trim [CODE]
2356
2357 {
2358 do
2359 {
2360 if ()
2361 {
2362 if ()
2363 asdf;
2364 else
2365 asdf;
2366 }
2367 } while ();
2368 cmd; /* this should go under the } */
2369 }
2370 [CODE]
2371
2372 call append(0, code)
2373 normal gg
2374 normal ]]=][
2375
2376 let expected =<< trim [CODE]
2377
2378 {
2379 do
2380 {
2381 if ()
2382 {
2383 if ()
2384 asdf;
2385 else
2386 asdf;
2387 }
2388 } while ();
2389 cmd; /* this should go under the } */
2390 }
2391
2392 [CODE]
2393
2394 call assert_equal(expected, getline(1, '$'))
2395 enew! | close
2396endfunc
2397
2398func Test_cindent_9()
2399 new
2400 setl cindent ts=4 sw=4
2401
2402 let code =<< trim [CODE]
2403
2404 void f()
2405 {
2406 if ( k() ) {
2407 l();
2408
2409 } else { /* Start (two words) end */
2410 m();
2411 }
2412
2413 n();
2414 }
2415 [CODE]
2416
2417 call append(0, code)
2418 normal gg
2419 normal ]]=][
2420
2421 let expected =<< trim [CODE]
2422
2423 void f()
2424 {
2425 if ( k() ) {
2426 l();
2427
2428 } else { /* Start (two words) end */
2429 m();
2430 }
2431
2432 n();
2433 }
2434
2435 [CODE]
2436
2437 call assert_equal(expected, getline(1, '$'))
2438 enew! | close
2439endfunc
2440
2441func Test_cindent_10()
2442 new
2443 setl cindent ts=4 sw=4
2444 setl cino={s,e-s
2445
2446 let code =<< trim [CODE]
2447
2448 void f()
2449 {
2450 if ( k() )
2451 {
2452 l();
2453 } else { /* Start (two words) end */
2454 m();
2455 }
2456 n(); /* should be under the if () */
2457 }
2458 [CODE]
2459
2460 call append(0, code)
2461 normal gg
2462 normal ]]=][
2463
2464 let expected =<< trim [CODE]
2465
2466 void f()
2467 {
2468 if ( k() )
2469 {
2470 l();
2471 } else { /* Start (two words) end */
2472 m();
2473 }
2474 n(); /* should be under the if () */
2475 }
2476
2477 [CODE]
2478
2479 call assert_equal(expected, getline(1, '$'))
2480 enew! | close
2481endfunc
2482
2483func Test_cindent_11()
2484 new
2485 setl cindent ts=4 sw=4
2486 setl cino={s,fs
2487
2488 let code =<< trim [CODE]
2489 void bar(void)
2490 {
2491 static array[2][2] =
2492 {
2493 { 1, 2 },
2494 { 3, 4 },
2495 }
2496
2497 while (a)
2498 {
2499 foo(&a);
2500 }
2501
2502 {
2503 int a;
2504 {
2505 a = a + 1;
2506 }
2507 }
2508 b = a;
2509 }
2510
2511 void func(void)
2512 {
2513 a = 1;
2514 {
2515 b = 2;
2516 }
2517 c = 3;
2518 d = 4;
2519 }
2520 /* foo */
2521 [CODE]
2522
2523 call append(0, code)
2524 normal gg
2525 exe "normal ]]=/ foo\<CR>"
2526
2527 let expected =<< trim [CODE]
2528 void bar(void)
2529 {
2530 static array[2][2] =
2531 {
2532 { 1, 2 },
2533 { 3, 4 },
2534 }
2535
2536 while (a)
2537 {
2538 foo(&a);
2539 }
2540
2541 {
2542 int a;
2543 {
2544 a = a + 1;
2545 }
2546 }
2547 b = a;
2548 }
2549
2550 void func(void)
2551 {
2552 a = 1;
2553 {
2554 b = 2;
2555 }
2556 c = 3;
2557 d = 4;
2558 }
2559 /* foo */
2560
2561 [CODE]
2562
2563 call assert_equal(expected, getline(1, '$'))
2564 enew! | close
2565endfunc
2566
2567func Test_cindent_12()
2568 new
2569 setl cindent ts=4 sw=4
2570 setl cino=
2571
2572 let code =<< trim [CODE]
2573 a()
2574 {
2575 do {
2576 a = a +
2577 a;
2578 } while ( a ); /* add text under this line */
2579 if ( a )
2580 a;
2581 }
2582 [CODE]
2583
2584 call append(0, code)
2585 normal gg
2586 call search('while')
2587 normal ohere
2588
2589 let expected =<< trim [CODE]
2590 a()
2591 {
2592 do {
2593 a = a +
2594 a;
2595 } while ( a ); /* add text under this line */
2596 here
2597 if ( a )
2598 a;
2599 }
2600
2601 [CODE]
2602
2603 call assert_equal(expected, getline(1, '$'))
2604 enew! | close
2605endfunc
2606
2607func Test_cindent_13()
2608 new
2609 setl cindent ts=4 sw=4
2610 setl cino= com=
2611
2612 let code =<< trim [CODE]
2613 a()
2614 {
2615 label1:
2616 /* hmm */
2617 // comment
2618 }
2619 [CODE]
2620
2621 call append(0, code)
2622 normal gg
2623 call search('comment')
2624 exe "normal olabel2: b();\rlabel3 /* post */:\r/* pre */ label4:\r" .
2625 \ "f(/*com*/);\rif (/*com*/)\rcmd();"
2626
2627 let expected =<< trim [CODE]
2628 a()
2629 {
2630 label1:
2631 /* hmm */
2632 // comment
2633 label2: b();
2634 label3 /* post */:
2635 /* pre */ label4:
2636 f(/*com*/);
2637 if (/*com*/)
2638 cmd();
2639 }
2640
2641 [CODE]
2642
2643 call assert_equal(expected, getline(1, '$'))
2644 enew! | close
2645endfunc
2646
2647func Test_cindent_14()
2648 new
2649 setl cindent ts=4 sw=4
2650 setl comments& comments^=s:/*,m:**,ex:*/
2651
2652 let code =<< trim [CODE]
2653 /*
2654 * A simple comment
2655 */
2656
2657 /*
2658 ** A different comment
2659 */
2660 [CODE]
2661
2662 call append(0, code)
2663 normal gg
2664 call search('simple')
2665 normal =5j
2666
2667 let expected =<< trim [CODE]
2668 /*
2669 * A simple comment
2670 */
2671
2672 /*
2673 ** A different comment
2674 */
2675
2676 [CODE]
2677
2678 call assert_equal(expected, getline(1, '$'))
2679 enew! | close
2680endfunc
2681
2682func Test_cindent_15()
2683 new
2684 setl cindent ts=4 sw=4
2685 setl cino=c0
2686 setl comments& comments-=s1:/* comments^=s0:/*
2687
2688 let code =<< trim [CODE]
2689 void f()
2690 {
2691
2692 /*********
2693 A comment.
2694 *********/
2695 }
2696 [CODE]
2697
2698 call append(0, code)
2699 normal gg
2700 normal ]]=][
2701
2702 let expected =<< trim [CODE]
2703 void f()
2704 {
2705
2706 /*********
2707 A comment.
2708 *********/
2709 }
2710
2711 [CODE]
2712
2713 call assert_equal(expected, getline(1, '$'))
2714 enew! | close
2715endfunc
2716
2717func Test_cindent_16()
2718 new
2719 setl cindent ts=4 sw=4
2720 setl cino=c0,C1
2721 setl comments& comments-=s1:/* comments^=s0:/*
2722
2723 let code =<< trim [CODE]
2724 void f()
2725 {
2726
2727 /*********
2728 A comment.
2729 *********/
2730 }
2731 [CODE]
2732
2733 call append(0, code)
2734 normal gg
2735 normal ]]=][
2736
2737 let expected =<< trim [CODE]
2738 void f()
2739 {
2740
2741 /*********
2742 A comment.
2743 *********/
2744 }
2745
2746 [CODE]
2747
2748 call assert_equal(expected, getline(1, '$'))
2749 enew! | close
2750endfunc
2751
2752func Test_cindent_17()
2753 new
2754 setl cindent ts=4 sw=4
2755 setl cino=
2756
2757 let code =<< trim [CODE]
2758 void f()
2759 {
2760 c = c1 &&
2761 (
2762 c2 ||
2763 c3
2764 ) && c4;
2765 }
2766 [CODE]
2767
2768 call append(0, code)
2769 normal gg
2770 normal ]]=][
2771
2772 let expected =<< trim [CODE]
2773 void f()
2774 {
2775 c = c1 &&
2776 (
2777 c2 ||
2778 c3
2779 ) && c4;
2780 }
2781
2782 [CODE]
2783
2784 call assert_equal(expected, getline(1, '$'))
2785 enew! | close
2786endfunc
2787
2788func Test_cindent_18()
2789 new
2790 setl cindent ts=4 sw=4
2791 setl cino=(s
2792
2793 let code =<< trim [CODE]
2794 void f()
2795 {
2796 c = c1 &&
2797 (
2798 c2 ||
2799 c3
2800 ) && c4;
2801 }
2802 [CODE]
2803
2804 call append(0, code)
2805 normal gg
2806 normal ]]=][
2807
2808 let expected =<< trim [CODE]
2809 void f()
2810 {
2811 c = c1 &&
2812 (
2813 c2 ||
2814 c3
2815 ) && c4;
2816 }
2817
2818 [CODE]
2819
2820 call assert_equal(expected, getline(1, '$'))
2821 enew! | close
2822endfunc
2823
2824func Test_cindent_19()
2825 new
2826 setl cindent ts=4 sw=4
2827 set cino=(s,U1
2828
2829 let code =<< trim [CODE]
2830 void f()
2831 {
2832 c = c1 &&
2833 (
2834 c2 ||
2835 c3
2836 ) && c4;
2837 }
2838 [CODE]
2839
2840 call append(0, code)
2841 normal gg
2842 normal ]]=][
2843
2844 let expected =<< trim [CODE]
2845 void f()
2846 {
2847 c = c1 &&
2848 (
2849 c2 ||
2850 c3
2851 ) && c4;
2852 }
2853
2854 [CODE]
2855
2856 call assert_equal(expected, getline(1, '$'))
2857 enew! | close
2858endfunc
2859
2860func Test_cindent_20()
2861 new
2862 setl cindent ts=4 sw=4
2863 setl cino=(0
2864
2865 let code =<< trim [CODE]
2866 void f()
2867 {
2868 if ( c1
2869 && ( c2
2870 || c3))
2871 foo;
2872 }
2873 [CODE]
2874
2875 call append(0, code)
2876 normal gg
2877 normal ]]=][
2878
2879 let expected =<< trim [CODE]
2880 void f()
2881 {
2882 if ( c1
2883 && ( c2
2884 || c3))
2885 foo;
2886 }
2887
2888 [CODE]
2889
2890 call assert_equal(expected, getline(1, '$'))
2891 enew! | close
2892endfunc
2893
2894func Test_cindent_21()
2895 new
2896 setl cindent ts=4 sw=4
2897 setl cino=(0,w1
2898
2899 let code =<< trim [CODE]
2900 void f()
2901 {
2902 if ( c1
2903 && ( c2
2904 || c3))
2905 foo;
2906 }
2907 [CODE]
2908
2909 call append(0, code)
2910 normal gg
2911 normal ]]=][
2912
2913 let expected =<< trim [CODE]
2914 void f()
2915 {
2916 if ( c1
2917 && ( c2
2918 || c3))
2919 foo;
2920 }
2921
2922 [CODE]
2923
2924 call assert_equal(expected, getline(1, '$'))
2925 enew! | close
2926endfunc
2927
2928func Test_cindent_22()
2929 new
2930 setl cindent ts=4 sw=4
2931 setl cino=(s
2932
2933 let code =<< trim [CODE]
2934 void f()
2935 {
2936 c = c1 && (
2937 c2 ||
2938 c3
2939 ) && c4;
2940 if (
2941 c1 && c2
2942 )
2943 foo;
2944 }
2945 [CODE]
2946
2947 call append(0, code)
2948 normal gg
2949 normal ]]=][
2950
2951 let expected =<< trim [CODE]
2952 void f()
2953 {
2954 c = c1 && (
2955 c2 ||
2956 c3
2957 ) && c4;
2958 if (
2959 c1 && c2
2960 )
2961 foo;
2962 }
2963
2964 [CODE]
2965
2966 call assert_equal(expected, getline(1, '$'))
2967 enew! | close
2968endfunc
2969
2970func Test_cindent_23()
2971 new
2972 setl cindent ts=4 sw=4
2973 setl cino=(s,m1
2974
2975 let code =<< trim [CODE]
2976 void f()
2977 {
2978 c = c1 && (
2979 c2 ||
2980 c3
2981 ) && c4;
2982 if (
2983 c1 && c2
2984 )
2985 foo;
2986 }
2987 [CODE]
2988
2989 call append(0, code)
2990 normal gg
2991 normal ]]=][
2992
2993 let expected =<< trim [CODE]
2994 void f()
2995 {
2996 c = c1 && (
2997 c2 ||
2998 c3
2999 ) && c4;
3000 if (
3001 c1 && c2
3002 )
3003 foo;
3004 }
3005
3006 [CODE]
3007
3008 call assert_equal(expected, getline(1, '$'))
3009 enew! | close
3010endfunc
3011
3012func Test_cindent_24()
3013 new
3014 setl cindent ts=4 sw=4
3015 setl cino=b1
3016
3017 let code =<< trim [CODE]
3018 void f()
3019 {
3020 switch (x)
3021 {
3022 case 1:
3023 a = b;
3024 break;
3025 default:
3026 a = 0;
3027 break;
3028 }
3029 }
3030 [CODE]
3031
3032 call append(0, code)
3033 normal gg
3034 normal ]]=][
3035
3036 let expected =<< trim [CODE]
3037 void f()
3038 {
3039 switch (x)
3040 {
3041 case 1:
3042 a = b;
3043 break;
3044 default:
3045 a = 0;
3046 break;
3047 }
3048 }
3049
3050 [CODE]
3051
3052 call assert_equal(expected, getline(1, '$'))
3053 enew! | close
3054endfunc
3055
3056func Test_cindent_25()
3057 new
3058 setl cindent ts=4 sw=4
3059 setl cino=(0,W5
3060
3061 let code =<< trim [CODE]
3062 void f()
3063 {
3064 invokeme(
3065 argu,
3066 ment);
3067 invokeme(
3068 argu,
3069 ment
3070 );
3071 invokeme(argu,
3072 ment
3073 );
3074 }
3075 [CODE]
3076
3077 call append(0, code)
3078 normal gg
3079 normal ]]=][
3080
3081 let expected =<< trim [CODE]
3082 void f()
3083 {
3084 invokeme(
3085 argu,
3086 ment);
3087 invokeme(
3088 argu,
3089 ment
3090 );
3091 invokeme(argu,
3092 ment
3093 );
3094 }
3095
3096 [CODE]
3097
3098 call assert_equal(expected, getline(1, '$'))
3099 enew! | close
3100endfunc
3101
3102func Test_cindent_26()
3103 new
3104 setl cindent ts=4 sw=4
3105 setl cino=/6
3106
3107 let code =<< trim [CODE]
3108 void f()
3109 {
3110 statement;
3111 // comment 1
3112 // comment 2
3113 }
3114 [CODE]
3115
3116 call append(0, code)
3117 normal gg
3118 normal ]]=][
3119
3120 let expected =<< trim [CODE]
3121 void f()
3122 {
3123 statement;
3124 // comment 1
3125 // comment 2
3126 }
3127
3128 [CODE]
3129
3130 call assert_equal(expected, getline(1, '$'))
3131 enew! | close
3132endfunc
3133
3134func Test_cindent_27()
3135 new
3136 setl cindent ts=4 sw=4
3137 setl cino=
3138
3139 let code =<< trim [CODE]
3140 void f()
3141 {
3142 statement;
3143 // comment 1
3144 // comment 2
3145 }
3146 [CODE]
3147
3148 call append(0, code)
3149 normal gg
3150 exe "normal ]]/comment 1/+1\<CR>=="
3151
3152 let expected =<< trim [CODE]
3153 void f()
3154 {
3155 statement;
3156 // comment 1
3157 // comment 2
3158 }
3159
3160 [CODE]
3161
3162 call assert_equal(expected, getline(1, '$'))
3163 enew! | close
3164endfunc
3165
3166func Test_cindent_28()
3167 new
3168 setl cindent ts=4 sw=4
3169 setl cino=g0
3170
3171 let code =<< trim [CODE]
3172 class CAbc
3173 {
3174 int Test() { return FALSE; }
3175
3176 public: // comment
3177 void testfall();
3178 protected:
3179 void testfall();
3180 };
3181 [CODE]
3182
3183 call append(0, code)
3184 normal gg
3185 normal ]]=][
3186
3187 let expected =<< trim [CODE]
3188 class CAbc
3189 {
3190 int Test() { return FALSE; }
3191
3192 public: // comment
3193 void testfall();
3194 protected:
3195 void testfall();
3196 };
3197
3198 [CODE]
3199
3200 call assert_equal(expected, getline(1, '$'))
3201 enew! | close
3202endfunc
3203
3204func Test_cindent_29()
3205 new
3206 setl cindent ts=4 sw=4
3207 setl cino=(0,gs,hs
3208
3209 let code =<< trim [CODE]
3210 class Foo : public Bar
3211 {
3212 public:
3213 virtual void method1(void) = 0;
3214 virtual void method2(int arg1,
3215 int arg2,
3216 int arg3) = 0;
3217 };
3218 [CODE]
3219
3220 call append(0, code)
3221 normal gg
3222 normal ]]=][
3223
3224 let expected =<< trim [CODE]
3225 class Foo : public Bar
3226 {
3227 public:
3228 virtual void method1(void) = 0;
3229 virtual void method2(int arg1,
3230 int arg2,
3231 int arg3) = 0;
3232 };
3233
3234 [CODE]
3235
3236 call assert_equal(expected, getline(1, '$'))
3237 enew! | close
3238endfunc
3239
3240func Test_cindent_30()
3241 new
3242 setl cindent ts=4 sw=4
3243 setl cino=+20
3244
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003245 let code =<< [CODE]
3246 void
3247foo()
3248{
3249 if (a)
3250 {
3251 } else
3252 asdf;
3253}
3254[CODE]
Bram Moolenaar1ab74a52019-05-31 20:02:53 +02003255
3256 call append(0, code)
3257 normal gg
3258 normal ]]=][
3259
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003260 let expected =<< [CODE]
3261 void
3262foo()
3263{
3264 if (a)
3265 {
3266 } else
3267 asdf;
3268}
Bram Moolenaar1ab74a52019-05-31 20:02:53 +02003269
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003270[CODE]
Bram Moolenaar1ab74a52019-05-31 20:02:53 +02003271
3272 call assert_equal(expected, getline(1, '$'))
3273 enew! | close
3274endfunc
3275
3276func Test_cindent_31()
3277 new
3278 setl cindent ts=4 sw=4
3279 setl cino=(0,W2s
3280
3281 let code =<< trim [CODE]
3282
3283 {
3284 averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
3285 asdasdf,
3286 func(asdf,
3287 asdfadsf),
3288 asdfasdf
3289 );
3290
3291 /* those are ugly, but consequent */
3292
3293 func()->asd(asdasdf,
3294 averylongfunctionname(
3295 abc,
3296 dec)->averylongfunctionname(
3297 asdfadsf,
3298 asdfasdf,
3299 asdfasdf,
3300 ),
3301 func(asdfadf,
3302 asdfasdf
3303 ),
3304 asdasdf
3305 );
3306
3307 averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
3308 abc,
3309 dec)->asdfasdfasdf(
3310 asdfadsf,
3311 asdfasdf,
3312 asdfasdf,
3313 ),
3314 func(asdfadf,
3315 asdfasdf),
3316 asdasdf
3317 );
3318 }
3319 [CODE]
3320
3321 call append(0, code)
3322 normal gg
3323 normal ]]=][
3324
3325 let expected =<< trim [CODE]
3326
3327 {
3328 averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
3329 asdasdf,
3330 func(asdf,
3331 asdfadsf),
3332 asdfasdf
3333 );
3334
3335 /* those are ugly, but consequent */
3336
3337 func()->asd(asdasdf,
3338 averylongfunctionname(
3339 abc,
3340 dec)->averylongfunctionname(
3341 asdfadsf,
3342 asdfasdf,
3343 asdfasdf,
3344 ),
3345 func(asdfadf,
3346 asdfasdf
3347 ),
3348 asdasdf
3349 );
3350
3351 averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
3352 abc,
3353 dec)->asdfasdfasdf(
3354 asdfadsf,
3355 asdfasdf,
3356 asdfasdf,
3357 ),
3358 func(asdfadf,
3359 asdfasdf),
3360 asdasdf
3361 );
3362 }
3363
3364 [CODE]
3365
3366 call assert_equal(expected, getline(1, '$'))
3367 enew! | close
3368endfunc
3369
3370func Test_cindent_32()
3371 new
3372 setl cindent ts=4 sw=4
3373 setl cino=M1
3374
3375 let code =<< trim [CODE]
3376 int main ()
3377 {
3378 if (cond1 &&
3379 cond2
3380 )
3381 foo;
3382 }
3383 [CODE]
3384
3385 call append(0, code)
3386 normal gg
3387 normal ]]=][
3388
3389 let expected =<< trim [CODE]
3390 int main ()
3391 {
3392 if (cond1 &&
3393 cond2
3394 )
3395 foo;
3396 }
3397
3398 [CODE]
3399
3400 call assert_equal(expected, getline(1, '$'))
3401 enew! | close
3402endfunc
3403
3404func Test_cindent_33()
3405 new
3406 setl cindent ts=4 sw=4
3407 setl cino=(0,ts
3408
3409 let code =<< trim [CODE]
3410 void func(int a
3411 #if defined(FOO)
3412 , int b
3413 , int c
3414 #endif
3415 )
3416 {
3417 }
3418 [CODE]
3419
3420 call append(0, code)
3421 normal gg
3422 normal 2j=][
3423
3424 let expected =<< trim [CODE]
3425 void func(int a
3426 #if defined(FOO)
3427 , int b
3428 , int c
3429 #endif
3430 )
3431 {
3432 }
3433
3434 [CODE]
3435
3436 call assert_equal(expected, getline(1, '$'))
3437 enew! | close
3438endfunc
3439
3440func Test_cindent_34()
3441 new
3442 setl cindent ts=4 sw=4
3443 setl cino=(0
3444
3445 let code =<< trim [CODE]
3446
3447 void
3448 func(int a
3449 #if defined(FOO)
3450 , int b
3451 , int c
3452 #endif
3453 )
3454 {
3455 }
3456 [CODE]
3457
3458 call append(0, code)
3459 normal gg
3460 normal =][
3461
3462 let expected =<< trim [CODE]
Bram Moolenaare7eb9272019-06-24 00:58:07 +02003463
Bram Moolenaar1ab74a52019-05-31 20:02:53 +02003464 void
3465 func(int a
3466 #if defined(FOO)
3467 , int b
3468 , int c
3469 #endif
3470 )
3471 {
3472 }
3473
3474 [CODE]
3475
3476 call assert_equal(expected, getline(1, '$'))
3477 enew! | close
3478endfunc
3479
3480func Test_cindent_35()
3481 new
3482 setl cindent ts=4 sw=4
3483 setl cino&
3484
3485 let code =<< trim [CODE]
3486 void func(void)
3487 {
3488 if(x==y)
3489 if(y==z)
3490 foo=1;
3491 else { bar=1;
3492 baz=2;
3493 }
3494 printf("Foo!\n");
3495 }
3496
3497 void func1(void)
3498 {
3499 char* tab[] = {"foo", "bar",
3500 "baz", "quux",
3501 "this line used", "to be indented incorrectly"};
3502 foo();
3503 }
3504
3505 void func2(void)
3506 {
3507 int tab[] =
3508 {1, 2,
3509 3, 4,
3510 5, 6};
3511
3512 printf("This line used to be indented incorrectly.\n");
3513 }
3514
3515 int foo[]
3516 #ifdef BAR
3517
3518 = { 1, 2, 3,
3519 4, 5, 6 }
3520
3521 #endif
3522 ;
3523 int baz;
3524
3525 void func3(void)
3526 {
3527 int tab[] = {
3528 1, 2,
3529 3, 4,
3530 5, 6};
3531
3532 printf("Don't you dare indent this line incorrectly!\n");
3533 }
3534
3535 void
3536 func4(a, b,
3537 c)
3538 int a;
3539 int b;
3540 int c;
3541 {
3542 }
3543
3544 void
3545 func5(
3546 int a,
3547 int b)
3548 {
3549 }
3550
3551 void
3552 func6(
3553 int a)
3554 {
3555 }
3556 [CODE]
3557
3558 call append(0, code)
3559 normal gg
3560 normal ]]=7][
3561
3562 let expected =<< trim [CODE]
3563 void func(void)
3564 {
3565 if(x==y)
3566 if(y==z)
3567 foo=1;
3568 else { bar=1;
3569 baz=2;
3570 }
3571 printf("Foo!\n");
3572 }
3573
3574 void func1(void)
3575 {
3576 char* tab[] = {"foo", "bar",
3577 "baz", "quux",
3578 "this line used", "to be indented incorrectly"};
3579 foo();
3580 }
3581
3582 void func2(void)
3583 {
3584 int tab[] =
3585 {1, 2,
3586 3, 4,
3587 5, 6};
3588
3589 printf("This line used to be indented incorrectly.\n");
3590 }
3591
3592 int foo[]
3593 #ifdef BAR
3594
3595 = { 1, 2, 3,
3596 4, 5, 6 }
3597
3598 #endif
3599 ;
3600 int baz;
3601
3602 void func3(void)
3603 {
3604 int tab[] = {
3605 1, 2,
3606 3, 4,
3607 5, 6};
3608
3609 printf("Don't you dare indent this line incorrectly!\n");
3610 }
3611
3612 void
3613 func4(a, b,
3614 c)
3615 int a;
3616 int b;
3617 int c;
3618 {
3619 }
3620
3621 void
3622 func5(
3623 int a,
3624 int b)
3625 {
3626 }
3627
3628 void
3629 func6(
3630 int a)
3631 {
3632 }
3633
3634 [CODE]
3635
3636 call assert_equal(expected, getline(1, '$'))
3637 enew! | close
3638endfunc
3639
3640func Test_cindent_36()
3641 new
3642 setl cindent ts=4 sw=4
3643 setl cino&
3644 setl cino+=l1
3645
3646 let code =<< trim [CODE]
3647 void func(void)
3648 {
3649 int tab[] =
3650 {
3651 1, 2, 3,
3652 4, 5, 6};
3653
3654 printf("Indent this line correctly!\n");
3655
3656 switch (foo)
3657 {
3658 case bar:
3659 printf("bar");
3660 break;
3661 case baz: {
3662 printf("baz");
3663 break;
3664 }
3665 case quux:
3666 printf("But don't break the indentation of this instruction\n");
3667 break;
3668 }
3669 }
3670 [CODE]
3671
3672 call append(0, code)
3673 normal gg
3674 normal ]]=][
3675
3676 let expected =<< trim [CODE]
3677 void func(void)
3678 {
3679 int tab[] =
3680 {
3681 1, 2, 3,
3682 4, 5, 6};
3683
3684 printf("Indent this line correctly!\n");
3685
3686 switch (foo)
3687 {
3688 case bar:
3689 printf("bar");
3690 break;
3691 case baz: {
3692 printf("baz");
3693 break;
3694 }
3695 case quux:
3696 printf("But don't break the indentation of this instruction\n");
3697 break;
3698 }
3699 }
3700
3701 [CODE]
3702
3703 call assert_equal(expected, getline(1, '$'))
3704 enew! | close
3705endfunc
3706
3707func Test_cindent_37()
3708 new
3709 setl cindent ts=4 sw=4
3710 setl cino&
3711
3712 let code =<< trim [CODE]
3713 void func(void)
3714 {
3715 cout << "a"
3716 << "b"
3717 << ") :"
3718 << "c";
3719 }
3720 [CODE]
3721
3722 call append(0, code)
3723 normal gg
3724 normal ]]=][
3725
3726 let expected =<< trim [CODE]
3727 void func(void)
3728 {
3729 cout << "a"
3730 << "b"
3731 << ") :"
3732 << "c";
3733 }
3734
3735 [CODE]
3736
3737 call assert_equal(expected, getline(1, '$'))
3738 enew! | close
3739endfunc
3740
3741func Test_cindent_38()
3742 new
3743 setl cindent ts=4 sw=4
3744 setl com=s1:/*,m:*,ex:*/
3745
3746 let code =<< trim [CODE]
3747 void func(void)
3748 {
3749 /*
3750 * This is a comment.
3751 */
3752 }
3753 [CODE]
3754
3755 call append(0, code)
3756 normal gg
3757 normal ]]3jofoo();
3758
3759 let expected =<< trim [CODE]
3760 void func(void)
3761 {
3762 /*
3763 * This is a comment.
3764 */
3765 foo();
3766 }
3767
3768 [CODE]
3769
3770 call assert_equal(expected, getline(1, '$'))
3771 enew! | close
3772endfunc
3773
3774func Test_cindent_39()
3775 new
3776 setl cindent ts=4 sw=4
3777 setl cino&
3778
3779 let code =<< trim [CODE]
3780 void func(void)
3781 {
3782 for (int i = 0; i < 10; ++i)
3783 if (i & 1) {
3784 foo(1);
3785 } else
3786 foo(0);
3787 baz();
3788 }
3789 [CODE]
3790
3791 call append(0, code)
3792 normal gg
3793 normal ]]=][
3794
3795 let expected =<< trim [CODE]
3796 void func(void)
3797 {
3798 for (int i = 0; i < 10; ++i)
3799 if (i & 1) {
3800 foo(1);
3801 } else
3802 foo(0);
3803 baz();
3804 }
3805
3806 [CODE]
3807
3808 call assert_equal(expected, getline(1, '$'))
3809 enew! | close
3810endfunc
3811
3812func Test_cindent_40()
3813 new
3814 setl cindent ts=4 sw=4
3815 setl cino=k2s,(0
3816
3817 let code =<< trim [CODE]
3818 void func(void)
3819 {
3820 if (condition1
3821 && condition2)
3822 action();
3823 function(argument1
3824 && argument2);
3825
3826 if (c1 && (c2 ||
3827 c3))
3828 foo;
3829 if (c1 &&
3830 (c2 || c3))
3831 {
3832 }
3833
3834 if ( c1
3835 && ( c2
3836 || c3))
3837 foo;
3838 func( c1
3839 && ( c2
3840 || c3))
3841 foo;
3842 }
3843 [CODE]
3844
3845 call append(0, code)
3846 normal gg
3847 normal ]]=][
3848
3849 let expected =<< trim [CODE]
3850 void func(void)
3851 {
3852 if (condition1
3853 && condition2)
3854 action();
3855 function(argument1
3856 && argument2);
3857
3858 if (c1 && (c2 ||
3859 c3))
3860 foo;
3861 if (c1 &&
3862 (c2 || c3))
3863 {
3864 }
3865
3866 if ( c1
3867 && ( c2
3868 || c3))
3869 foo;
3870 func( c1
3871 && ( c2
3872 || c3))
3873 foo;
3874 }
3875
3876 [CODE]
3877
3878 call assert_equal(expected, getline(1, '$'))
3879 enew! | close
3880endfunc
3881
3882func Test_cindent_41()
3883 new
3884 setl cindent ts=4 sw=4
3885 setl cino=k2s,(s
3886
3887 let code =<< trim [CODE]
3888 void func(void)
3889 {
3890 if (condition1
3891 && condition2)
3892 action();
3893 function(argument1
3894 && argument2);
3895
3896 if (c1 && (c2 ||
3897 c3))
3898 foo;
3899 if (c1 &&
3900 (c2 || c3))
3901 {
3902 }
3903
3904 if ( c1
3905 && ( c2
3906 || c3))
3907 foo;
3908 func( c1
3909 && ( c2
3910 || c3))
3911 foo;
3912 }
3913 [CODE]
3914
3915 call append(0, code)
3916 normal gg
3917 normal ]]=][
3918
3919 let expected =<< trim [CODE]
3920 void func(void)
3921 {
3922 if (condition1
3923 && condition2)
3924 action();
3925 function(argument1
3926 && argument2);
3927
3928 if (c1 && (c2 ||
3929 c3))
3930 foo;
3931 if (c1 &&
3932 (c2 || c3))
3933 {
3934 }
3935
3936 if ( c1
3937 && ( c2
3938 || c3))
3939 foo;
3940 func( c1
3941 && ( c2
3942 || c3))
3943 foo;
3944 }
3945
3946 [CODE]
3947
3948 call assert_equal(expected, getline(1, '$'))
3949 enew! | close
3950endfunc
3951
3952func Test_cindent_42()
3953 new
3954 setl cindent ts=4 sw=4
3955 setl cino=k2s,(s,U1
3956
3957 let code =<< trim [CODE]
3958 void func(void)
3959 {
3960 if (condition1
3961 && condition2)
3962 action();
3963 function(argument1
3964 && argument2);
3965
3966 if (c1 && (c2 ||
3967 c3))
3968 foo;
3969 if (c1 &&
3970 (c2 || c3))
3971 {
3972 }
3973 if (c123456789
3974 && (c22345
3975 || c3))
3976 printf("foo\n");
3977
3978 c = c1 &&
3979 (
3980 c2 ||
3981 c3
3982 ) && c4;
3983 }
3984 [CODE]
3985
3986 call append(0, code)
3987 normal gg
3988 normal ]]=][
3989
3990 let expected =<< trim [CODE]
3991 void func(void)
3992 {
3993 if (condition1
3994 && condition2)
3995 action();
3996 function(argument1
3997 && argument2);
3998
3999 if (c1 && (c2 ||
4000 c3))
4001 foo;
4002 if (c1 &&
4003 (c2 || c3))
4004 {
4005 }
4006 if (c123456789
4007 && (c22345
4008 || c3))
4009 printf("foo\n");
4010
4011 c = c1 &&
4012 (
4013 c2 ||
4014 c3
4015 ) && c4;
4016 }
4017
4018 [CODE]
4019
4020 call assert_equal(expected, getline(1, '$'))
4021 enew! | close
4022endfunc
4023
4024func Test_cindent_43()
4025 new
4026 setl cindent ts=4 sw=4
4027 setl cino=k2s,(0,W4
4028
4029 let code =<< trim [CODE]
4030 void func(void)
4031 {
4032 if (condition1
4033 && condition2)
4034 action();
4035 function(argument1
4036 && argument2);
4037
4038 if (c1 && (c2 ||
4039 c3))
4040 foo;
4041 if (c1 &&
4042 (c2 || c3))
4043 {
4044 }
4045 if (c123456789
4046 && (c22345
4047 || c3))
4048 printf("foo\n");
4049
4050 if ( c1
4051 && ( c2
4052 || c3))
4053 foo;
4054
4055 a_long_line(
4056 argument,
4057 argument);
4058 a_short_line(argument,
4059 argument);
4060 }
4061 [CODE]
4062
4063 call append(0, code)
4064 normal gg
4065 normal ]]=][
4066
4067 let expected =<< trim [CODE]
4068 void func(void)
4069 {
4070 if (condition1
4071 && condition2)
4072 action();
4073 function(argument1
4074 && argument2);
4075
4076 if (c1 && (c2 ||
4077 c3))
4078 foo;
4079 if (c1 &&
4080 (c2 || c3))
4081 {
4082 }
4083 if (c123456789
4084 && (c22345
4085 || c3))
4086 printf("foo\n");
4087
4088 if ( c1
4089 && ( c2
4090 || c3))
4091 foo;
4092
4093 a_long_line(
4094 argument,
4095 argument);
4096 a_short_line(argument,
4097 argument);
4098 }
4099
4100 [CODE]
4101
4102 call assert_equal(expected, getline(1, '$'))
4103 enew! | close
4104endfunc
4105
4106func Test_cindent_44()
4107 new
4108 setl cindent ts=4 sw=4
4109 setl cino=k2s,u2
4110
4111 let code =<< trim [CODE]
4112 void func(void)
4113 {
4114 if (condition1
4115 && condition2)
4116 action();
4117 function(argument1
4118 && argument2);
4119
4120 if (c1 && (c2 ||
4121 c3))
4122 foo;
4123 if (c1 &&
4124 (c2 || c3))
4125 {
4126 }
4127 if (c123456789
4128 && (c22345
4129 || c3))
4130 printf("foo\n");
4131 }
4132 [CODE]
4133
4134 call append(0, code)
4135 normal gg
4136 normal ]]=][
4137
4138 let expected =<< trim [CODE]
4139 void func(void)
4140 {
4141 if (condition1
4142 && condition2)
4143 action();
4144 function(argument1
4145 && argument2);
4146
4147 if (c1 && (c2 ||
4148 c3))
4149 foo;
4150 if (c1 &&
4151 (c2 || c3))
4152 {
4153 }
4154 if (c123456789
4155 && (c22345
4156 || c3))
4157 printf("foo\n");
4158 }
4159
4160 [CODE]
4161
4162 call assert_equal(expected, getline(1, '$'))
4163 enew! | close
4164endfunc
4165
4166func Test_cindent_45()
4167 new
4168 setl cindent ts=4 sw=4
4169 setl cino=k2s,(0,w1
4170
4171 let code =<< trim [CODE]
4172 void func(void)
4173 {
4174 if (condition1
4175 && condition2)
4176 action();
4177 function(argument1
4178 && argument2);
4179
4180 if (c1 && (c2 ||
4181 c3))
4182 foo;
4183 if (c1 &&
4184 (c2 || c3))
4185 {
4186 }
4187 if (c123456789
4188 && (c22345
4189 || c3))
4190 printf("foo\n");
4191
4192 if ( c1
4193 && ( c2
4194 || c3))
4195 foo;
4196 func( c1
4197 && ( c2
4198 || c3))
4199 foo;
4200 }
4201 [CODE]
4202
4203 call append(0, code)
4204 normal gg
4205 normal ]]=][
4206
4207 let expected =<< trim [CODE]
4208 void func(void)
4209 {
4210 if (condition1
4211 && condition2)
4212 action();
4213 function(argument1
4214 && argument2);
4215
4216 if (c1 && (c2 ||
4217 c3))
4218 foo;
4219 if (c1 &&
4220 (c2 || c3))
4221 {
4222 }
4223 if (c123456789
4224 && (c22345
4225 || c3))
4226 printf("foo\n");
4227
4228 if ( c1
4229 && ( c2
4230 || c3))
4231 foo;
4232 func( c1
4233 && ( c2
4234 || c3))
4235 foo;
4236 }
4237
4238 [CODE]
4239
4240 call assert_equal(expected, getline(1, '$'))
4241 enew! | close
4242endfunc
4243
4244func Test_cindent_46()
4245 new
4246 setl cindent ts=4 sw=4
4247 setl cino=k2,(s
4248
4249 let code =<< trim [CODE]
4250 void func(void)
4251 {
4252 if (condition1
4253 && condition2)
4254 action();
4255 function(argument1
4256 && argument2);
4257
4258 if (c1 && (c2 ||
4259 c3))
4260 foo;
4261 if (c1 &&
4262 (c2 || c3))
4263 {
4264 }
4265 }
4266 [CODE]
4267
4268 call append(0, code)
4269 normal gg
4270 normal ]]=][
4271
4272 let expected =<< trim [CODE]
4273 void func(void)
4274 {
4275 if (condition1
4276 && condition2)
4277 action();
4278 function(argument1
4279 && argument2);
4280
4281 if (c1 && (c2 ||
4282 c3))
4283 foo;
4284 if (c1 &&
4285 (c2 || c3))
4286 {
4287 }
4288 }
4289
4290 [CODE]
4291
4292 call assert_equal(expected, getline(1, '$'))
4293 enew! | close
4294endfunc
4295
4296func Test_cindent_47()
4297 new
4298 setl cindent ts=4 sw=4
4299 setl cino=N-s
4300
4301 let code =<< trim [CODE]
4302 NAMESPACESTART
4303 /* valid namespaces with normal indent */
4304 namespace
4305 {
4306 {
4307 111111111111;
4308 }
4309 }
4310 namespace /* test */
4311 {
4312 11111111111111111;
4313 }
4314 namespace // test
4315 {
4316 111111111111111111;
4317 }
4318 namespace
4319 {
4320 111111111111111111;
4321 }
4322 namespace test
4323 {
4324 111111111111111111;
4325 }
4326 namespace test::cpp17
4327 {
4328 111111111111111111;
4329 }
4330 namespace ::incorrectcpp17
4331 {
4332 111111111111111111;
4333 }
4334 namespace test::incorrectcpp17::
4335 {
4336 111111111111111111;
4337 }
4338 namespace test:incorrectcpp17
4339 {
4340 111111111111111111;
4341 }
4342 namespace test:::incorrectcpp17
4343 {
4344 111111111111111111;
4345 }
4346 namespace{
4347 111111111111111111;
4348 }
4349 namespace test{
4350 111111111111111111;
4351 }
4352 namespace {
4353 111111111111111111;
4354 }
4355 namespace test {
4356 111111111111111111;
4357 namespace test2 {
4358 22222222222222222;
4359 }
4360 }
4361
4362 /* invalid namespaces use block indent */
4363 namespace test test2 {
4364 111111111111111111111;
4365 }
4366 namespace11111111111 {
4367 111111111111;
4368 }
4369 namespace() {
4370 1111111111111;
4371 }
4372 namespace()
4373 {
4374 111111111111111111;
4375 }
4376 namespace test test2
4377 {
4378 1111111111111111111;
4379 }
4380 namespace111111111
4381 {
4382 111111111111111111;
4383 }
4384 NAMESPACEEND
4385 [CODE]
4386
4387 call append(0, code)
4388 normal gg
4389 call search('^NAMESPACESTART')
4390 exe "normal =/^NAMESPACEEND\n"
4391
4392 let expected =<< trim [CODE]
4393 NAMESPACESTART
4394 /* valid namespaces with normal indent */
4395 namespace
4396 {
4397 {
4398 111111111111;
4399 }
4400 }
4401 namespace /* test */
4402 {
4403 11111111111111111;
4404 }
4405 namespace // test
4406 {
4407 111111111111111111;
4408 }
4409 namespace
4410 {
4411 111111111111111111;
4412 }
4413 namespace test
4414 {
4415 111111111111111111;
4416 }
4417 namespace test::cpp17
4418 {
4419 111111111111111111;
4420 }
4421 namespace ::incorrectcpp17
4422 {
4423 111111111111111111;
4424 }
4425 namespace test::incorrectcpp17::
4426 {
4427 111111111111111111;
4428 }
4429 namespace test:incorrectcpp17
4430 {
4431 111111111111111111;
4432 }
4433 namespace test:::incorrectcpp17
4434 {
4435 111111111111111111;
4436 }
4437 namespace{
4438 111111111111111111;
4439 }
4440 namespace test{
4441 111111111111111111;
4442 }
4443 namespace {
4444 111111111111111111;
4445 }
4446 namespace test {
4447 111111111111111111;
4448 namespace test2 {
4449 22222222222222222;
4450 }
4451 }
4452
4453 /* invalid namespaces use block indent */
4454 namespace test test2 {
4455 111111111111111111111;
4456 }
4457 namespace11111111111 {
4458 111111111111;
4459 }
4460 namespace() {
4461 1111111111111;
4462 }
4463 namespace()
4464 {
4465 111111111111111111;
4466 }
4467 namespace test test2
4468 {
4469 1111111111111111111;
4470 }
4471 namespace111111111
4472 {
4473 111111111111111111;
4474 }
4475 NAMESPACEEND
4476
4477 [CODE]
4478
4479 call assert_equal(expected, getline(1, '$'))
4480 enew! | close
4481endfunc
4482
4483func Test_cindent_48()
4484 new
4485 setl cindent ts=4 sw=4
4486 setl cino=j1,J1
4487
4488 let code =<< trim [CODE]
4489 JSSTART
4490 var bar = {
4491 foo: {
4492 that: this,
4493 some: ok,
4494 },
4495 "bar":{
4496 a : 2,
4497 b: "123abc",
4498 x: 4,
4499 "y": 5
4500 }
4501 }
4502 JSEND
4503 [CODE]
4504
4505 call append(0, code)
4506 normal gg
4507 call search('^JSSTART')
4508 exe "normal =/^JSEND\n"
4509
4510 let expected =<< trim [CODE]
4511 JSSTART
4512 var bar = {
4513 foo: {
4514 that: this,
4515 some: ok,
4516 },
4517 "bar":{
4518 a : 2,
4519 b: "123abc",
4520 x: 4,
4521 "y": 5
4522 }
4523 }
4524 JSEND
4525
4526 [CODE]
4527
4528 call assert_equal(expected, getline(1, '$'))
4529 enew! | close
4530endfunc
4531
4532func Test_cindent_49()
4533 new
4534 setl cindent ts=4 sw=4
4535 setl cino=j1,J1
4536
4537 let code =<< trim [CODE]
4538 JSSTART
4539 var foo = [
4540 1,
4541 2,
4542 3
4543 ];
4544 JSEND
4545 [CODE]
4546
4547 call append(0, code)
4548 normal gg
4549 call search('^JSSTART')
4550 exe "normal =/^JSEND\n"
4551
4552 let expected =<< trim [CODE]
4553 JSSTART
4554 var foo = [
4555 1,
4556 2,
4557 3
4558 ];
4559 JSEND
4560
4561 [CODE]
4562
4563 call assert_equal(expected, getline(1, '$'))
4564 enew! | close
4565endfunc
4566
4567func Test_cindent_50()
4568 new
4569 setl cindent ts=4 sw=4
4570 setl cino=j1,J1
4571
4572 let code =<< trim [CODE]
4573 JSSTART
4574 function bar() {
4575 var foo = [
4576 1,
4577 2,
4578 3
4579 ];
4580 }
4581 JSEND
4582 [CODE]
4583
4584 call append(0, code)
4585 normal gg
4586 call search('^JSSTART')
4587 exe "normal =/^JSEND\n"
4588
4589 let expected =<< trim [CODE]
4590 JSSTART
4591 function bar() {
4592 var foo = [
4593 1,
4594 2,
4595 3
4596 ];
4597 }
4598 JSEND
4599
4600 [CODE]
4601
4602 call assert_equal(expected, getline(1, '$'))
4603 enew! | close
4604endfunc
4605
4606func Test_cindent_51()
4607 new
4608 setl cindent ts=4 sw=4
4609 setl cino=j1,J1
4610
4611 let code =<< trim [CODE]
4612 JSSTART
4613 (function($){
4614
4615 if (cond &&
4616 cond) {
4617 stmt;
4618 }
4619 window.something.left =
4620 (width - 50 + offset) + "px";
4621 var class_name='myclass';
4622
4623 function private_method() {
4624 }
4625
4626 var public_method={
4627 method: function(options,args){
4628 private_method();
4629 }
4630 }
4631
4632 function init(options) {
4633
4634 $(this).data(class_name+'_public',$.extend({},{
4635 foo: 'bar',
4636 bar: 2,
4637 foobar: [
4638 1,
4639 2,
4640 3
4641 ],
4642 callback: function(){
4643 return true;
4644 }
4645 }, options||{}));
4646 }
4647
4648 $.fn[class_name]=function() {
4649
4650 var _arguments=arguments;
4651 return this.each(function(){
4652
4653 var options=$(this).data(class_name+'_public');
4654 if (!options) {
4655 init.apply(this,_arguments);
4656
4657 } else {
4658 var method=public_method[_arguments[0]];
4659
4660 if (typeof(method)!='function') {
4661 console.log(class_name+' has no method "'+_arguments[0]+'"');
4662 return false;
4663 }
4664 _arguments[0]=options;
4665 method.apply(this,_arguments);
4666 }
4667 });
4668 }
4669
4670 })(jQuery);
4671 JSEND
4672 [CODE]
4673
4674 call append(0, code)
4675 normal gg
4676 call search('^JSSTART')
4677 exe "normal =/^JSEND\n"
4678
4679 let expected =<< trim [CODE]
4680 JSSTART
4681 (function($){
4682
4683 if (cond &&
4684 cond) {
4685 stmt;
4686 }
4687 window.something.left =
4688 (width - 50 + offset) + "px";
4689 var class_name='myclass';
4690
4691 function private_method() {
4692 }
4693
4694 var public_method={
4695 method: function(options,args){
4696 private_method();
4697 }
4698 }
4699
4700 function init(options) {
4701
4702 $(this).data(class_name+'_public',$.extend({},{
4703 foo: 'bar',
4704 bar: 2,
4705 foobar: [
4706 1,
4707 2,
4708 3
4709 ],
4710 callback: function(){
4711 return true;
4712 }
4713 }, options||{}));
4714 }
4715
4716 $.fn[class_name]=function() {
4717
4718 var _arguments=arguments;
4719 return this.each(function(){
4720
4721 var options=$(this).data(class_name+'_public');
4722 if (!options) {
4723 init.apply(this,_arguments);
4724
4725 } else {
4726 var method=public_method[_arguments[0]];
4727
4728 if (typeof(method)!='function') {
4729 console.log(class_name+' has no method "'+_arguments[0]+'"');
4730 return false;
4731 }
4732 _arguments[0]=options;
4733 method.apply(this,_arguments);
4734 }
4735 });
4736 }
4737
4738 })(jQuery);
4739 JSEND
4740
4741 [CODE]
4742
4743 call assert_equal(expected, getline(1, '$'))
4744 enew! | close
4745endfunc
4746
4747func Test_cindent_52()
4748 new
4749 setl cindent ts=4 sw=4
4750 setl cino=j1,J1
4751
4752 let code =<< trim [CODE]
4753 JSSTART
4754 function init(options) {
4755 $(this).data(class_name+'_public',$.extend({},{
4756 foo: 'bar',
4757 bar: 2,
4758 foobar: [
4759 1,
4760 2,
4761 3
4762 ],
4763 callback: function(){
4764 return true;
4765 }
4766 }, options||{}));
4767 }
4768 JSEND
4769 [CODE]
4770
4771 call append(0, code)
4772 normal gg
4773 call search('^JSSTART')
4774 exe "normal =/^JSEND\n"
4775
4776 let expected =<< trim [CODE]
4777 JSSTART
4778 function init(options) {
4779 $(this).data(class_name+'_public',$.extend({},{
4780 foo: 'bar',
4781 bar: 2,
4782 foobar: [
4783 1,
4784 2,
4785 3
4786 ],
4787 callback: function(){
4788 return true;
4789 }
4790 }, options||{}));
4791 }
4792 JSEND
4793
4794 [CODE]
4795
4796 call assert_equal(expected, getline(1, '$'))
4797 enew! | close
4798endfunc
4799
4800func Test_cindent_53()
4801 new
4802 setl cindent ts=4 sw=4
4803 setl cino=j1,J1
4804
4805 let code =<< trim [CODE]
4806 JSSTART
4807 (function($){
4808 function init(options) {
4809 $(this).data(class_name+'_public',$.extend({},{
4810 foo: 'bar',
4811 bar: 2,
4812 foobar: [
4813 1,
4814 2,
4815 3
4816 ],
4817 callback: function(){
4818 return true;
4819 }
4820 }, options||{}));
4821 }
4822 })(jQuery);
4823 JSEND
4824 [CODE]
4825
4826 call append(0, code)
4827 normal gg
4828 call search('^JSSTART')
4829 exe "normal =/^JSEND\n"
4830
4831 let expected =<< trim [CODE]
4832 JSSTART
4833 (function($){
4834 function init(options) {
4835 $(this).data(class_name+'_public',$.extend({},{
4836 foo: 'bar',
4837 bar: 2,
4838 foobar: [
4839 1,
4840 2,
4841 3
4842 ],
4843 callback: function(){
4844 return true;
4845 }
4846 }, options||{}));
4847 }
4848 })(jQuery);
4849 JSEND
4850
4851 [CODE]
4852
4853 call assert_equal(expected, getline(1, '$'))
4854 enew! | close
4855endfunc
4856
4857func Test_cindent_54()
4858 new
4859 setl cindent ts=4 sw=4
4860 setl cino=j1,J1,+2
4861
4862 let code =<< trim [CODE]
4863 JSSTART
4864 // Results of JavaScript indent
4865 // 1
4866 (function(){
4867 var a = [
4868 'a',
4869 'b',
4870 'c',
4871 'd',
4872 'e',
4873 'f',
4874 'g',
4875 'h',
4876 'i'
4877 ];
4878 }())
4879
4880 // 2
4881 (function(){
4882 var a = [
4883 0 +
4884 5 *
4885 9 *
4886 'a',
4887 'b',
4888 0 +
4889 5 *
4890 9 *
4891 'c',
4892 'd',
4893 'e',
4894 'f',
4895 'g',
4896 'h',
4897 'i'
4898 ];
4899 }())
4900
4901 // 3
4902 (function(){
4903 var a = [
4904 0 +
4905 // comment 1
4906 5 *
4907 /* comment 2 */
4908 9 *
4909 'a',
4910 'b',
4911 0 +
4912 5 *
4913 9 *
4914 'c',
4915 'd',
4916 'e',
4917 'f',
4918 'g',
4919 'h',
4920 'i'
4921 ];
4922 }())
4923
4924 // 4
4925 {
4926 var a = [
4927 0,
4928 1
4929 ];
4930 var b;
4931 var c;
4932 }
4933
4934 // 5
4935 {
4936 var a = [
4937 [
4938 0
4939 ],
4940 2,
4941 3
4942 ];
4943 }
4944
4945 // 6
4946 {
4947 var a = [
4948 [
4949 0,
4950 1
4951 ],
4952 2,
4953 3
4954 ];
4955 }
4956
4957 // 7
4958 {
4959 var a = [
4960 // [
4961 0,
4962 // 1
4963 // ],
4964 2,
4965 3
4966 ];
4967 }
4968
4969 // 8
4970 var x = [
4971 (function(){
4972 var a,
4973 b,
4974 c,
4975 d,
4976 e,
4977 f,
4978 g,
4979 h,
4980 i;
4981 })
4982 ];
4983
4984 // 9
4985 var a = [
4986 0 +
4987 5 *
4988 9 *
4989 'a',
4990 'b',
4991 0 +
4992 5 *
4993 9 *
4994 'c',
4995 'd',
4996 'e',
4997 'f',
4998 'g',
4999 'h',
5000 'i'
5001 ];
5002
5003 // 10
5004 var a,
5005 b,
5006 c,
5007 d,
5008 e,
5009 f,
5010 g,
5011 h,
5012 i;
5013 JSEND
5014 [CODE]
5015
5016 call append(0, code)
5017 normal gg
5018 call search('^JSSTART')
5019 exe "normal =/^JSEND\n"
5020
5021 let expected =<< trim [CODE]
5022 JSSTART
5023 // Results of JavaScript indent
5024 // 1
5025 (function(){
5026 var a = [
5027 'a',
5028 'b',
5029 'c',
5030 'd',
5031 'e',
5032 'f',
5033 'g',
5034 'h',
5035 'i'
5036 ];
5037 }())
5038
5039 // 2
5040 (function(){
5041 var a = [
5042 0 +
5043 5 *
5044 9 *
5045 'a',
5046 'b',
5047 0 +
5048 5 *
5049 9 *
5050 'c',
5051 'd',
5052 'e',
5053 'f',
5054 'g',
5055 'h',
5056 'i'
5057 ];
5058 }())
5059
5060 // 3
5061 (function(){
5062 var a = [
5063 0 +
5064 // comment 1
5065 5 *
5066 /* comment 2 */
5067 9 *
5068 'a',
5069 'b',
5070 0 +
5071 5 *
5072 9 *
5073 'c',
5074 'd',
5075 'e',
5076 'f',
5077 'g',
5078 'h',
5079 'i'
5080 ];
5081 }())
5082
5083 // 4
5084 {
5085 var a = [
5086 0,
5087 1
5088 ];
5089 var b;
5090 var c;
5091 }
5092
5093 // 5
5094 {
5095 var a = [
5096 [
5097 0
5098 ],
5099 2,
5100 3
5101 ];
5102 }
5103
5104 // 6
5105 {
5106 var a = [
5107 [
5108 0,
5109 1
5110 ],
5111 2,
5112 3
5113 ];
5114 }
5115
5116 // 7
5117 {
5118 var a = [
5119 // [
5120 0,
5121 // 1
5122 // ],
5123 2,
5124 3
5125 ];
5126 }
5127
5128 // 8
5129 var x = [
5130 (function(){
5131 var a,
5132 b,
5133 c,
5134 d,
5135 e,
5136 f,
5137 g,
5138 h,
5139 i;
5140 })
5141 ];
5142
5143 // 9
5144 var a = [
5145 0 +
5146 5 *
5147 9 *
5148 'a',
5149 'b',
5150 0 +
5151 5 *
5152 9 *
5153 'c',
5154 'd',
5155 'e',
5156 'f',
5157 'g',
5158 'h',
5159 'i'
5160 ];
5161
5162 // 10
5163 var a,
5164 b,
5165 c,
5166 d,
5167 e,
5168 f,
5169 g,
5170 h,
5171 i;
5172 JSEND
5173
5174 [CODE]
5175
5176 call assert_equal(expected, getline(1, '$'))
5177 enew! | close
5178endfunc
5179
5180func Test_cindent_55()
5181 new
5182 setl cindent ts=4 sw=4
5183 setl cino&
5184
5185 let code =<< trim [CODE]
5186 /* start of define */
5187 {
5188 }
5189 #define AAA \
5190 BBB\
5191 CCC
5192
5193 #define CNT \
5194 1 + \
5195 2 + \
5196 4
5197 /* end of define */
5198 [CODE]
5199
5200 call append(0, code)
5201 normal gg
5202 call search('start of define')
5203 exe "normal =/end of define\n"
5204
5205 let expected =<< trim [CODE]
5206 /* start of define */
5207 {
5208 }
5209 #define AAA \
5210 BBB\
5211 CCC
5212
5213 #define CNT \
5214 1 + \
5215 2 + \
5216 4
5217 /* end of define */
5218
5219 [CODE]
5220
5221 call assert_equal(expected, getline(1, '$'))
5222 enew! | close
5223endfunc
5224
5225func Test_cindent_56()
5226 new
5227 setl cindent ts=4 sw=4
5228 setl cino&
5229
5230 let code =<< trim [CODE]
5231 {
5232 a = second/*bug*/*line;
5233 }
5234 [CODE]
5235
5236 call append(0, code)
5237 normal gg
5238 call search('a = second')
5239 normal ox
5240
5241 let expected =<< trim [CODE]
5242 {
5243 a = second/*bug*/*line;
5244 x
5245 }
5246
5247 [CODE]
5248
5249 call assert_equal(expected, getline(1, '$'))
5250 enew! | close
5251endfunc
5252
Bram Moolenaar02ad4632020-01-12 13:48:18 +01005253" this was going beyond the end of the line.
5254func Test_cindent_case()
5255 new
Bram Moolenaar4b96df52020-01-26 22:00:26 +01005256 call setline(1, 'case x: // x')
Bram Moolenaar02ad4632020-01-12 13:48:18 +01005257 set cindent
5258 norm! f:a:
Bram Moolenaar4b96df52020-01-26 22:00:26 +01005259 call assert_equal('case x:: // x', getline(1))
Bram Moolenaar4b96df52020-01-26 22:00:26 +01005260 set cindent&
Bram Moolenaar02ad4632020-01-12 13:48:18 +01005261 bwipe!
5262endfunc
5263
Bram Moolenaarf5f1e102020-03-08 05:13:15 +01005264" Test for changing multiple lines (using c) with cindent
5265func Test_cindent_change_multline()
5266 new
5267 setlocal cindent
5268 call setline(1, ['if (a)', '{', ' i = 1;', '}'])
5269 normal! jc3jm = 2;
5270 call assert_equal("\tm = 2;", getline(2))
5271 close!
5272endfunc
5273
Bram Moolenaard881b512020-05-31 17:49:30 +02005274func Test_cindent_pragma()
5275 new
5276 setl cindent ts=4 sw=4
5277 setl cino=Ps
5278
5279 let code =<< trim [CODE]
5280 {
5281 #pragma omp parallel
5282 {
5283 #pragma omp task
5284 foo();
5285 # pragma omp taskwait
5286 }
5287 }
5288 [CODE]
5289
5290 call append(0, code)
5291 normal gg
5292 normal =G
5293
5294 let expected =<< trim [CODE]
5295 {
5296 #pragma omp parallel
5297 {
5298 #pragma omp task
5299 foo();
5300 # pragma omp taskwait
5301 }
5302 }
5303
5304 [CODE]
5305
5306 call assert_equal(expected, getline(1, '$'))
5307 enew! | close
5308endfunc
5309
Bram Moolenaar78e0fa42021-10-05 21:58:53 +01005310func Test_backslash_at_end_of_line()
5311 new
5312 exe "norm v>O'\\\<C-m>-"
5313 exe "norm \<C-q>="
5314 bwipe!
5315endfunc
5316
Bram Moolenaar2de9b7c2021-11-19 19:41:13 +00005317func Test_find_brace_backwards()
5318 " this was looking beyond the end of the line
5319 new
5320 norm R/*
5321 norm o0{
5322 norm o//
5323 norm V{=
5324 call assert_equal(['/*', ' 0{', '//'], getline(1, 3))
5325 bwipe!
5326endfunc
5327
5328
Bram Moolenaar7720ba82017-03-08 22:19:26 +01005329" vim: shiftwidth=2 sts=2 expandtab