/* vim: set cin ts=4 sw=4 : */

Test for 'cindent'.
For new tests, consider putting them in test_cindent.vim.

STARTTEST
:so small.vim
:set nocompatible viminfo+=nviminfo modeline
:edit                " read modeline
/start of AUTO
=/end of AUTO
ENDTEST

/* start of AUTO matically checked vim: set ts=4 : */
{
	if (test)
		cmd1;
	cmd2;
}

{
	if (test)
		cmd1;
	else
		cmd2;
}

{
	if (test)
	{
		cmd1;
		cmd2;
	}
}

{
	if (test)
	{
		cmd1;
		else
	}
}

{
	while (this)
		if (test)
			cmd1;
	cmd2;
}

{
	while (this)
		if (test)
			cmd1;
		else
			cmd2;
}

{
	if (test)
	{
		cmd;
	}

	if (test)
		cmd;
}

{
	if (test) {
		cmd;
	}

	if (test) cmd;
}

{
	cmd1;
	for (blah)
		while (this)
			if (test)
				cmd2;
	cmd3;
}

{
	cmd1;
	for (blah)
		while (this)
			if (test)
				cmd2;
	cmd3;

	if (test)
	{
		cmd1;
		cmd2;
		cmd3;
	}
}


/* Test for 'cindent' do/while mixed with if/else: */

{
	do
		if (asdf)
			asdfasd;
	while (cond);

	do
		if (asdf)
			while (asdf)
				asdf;
	while (asdf);
}

/* Test for 'cindent' with two ) on a continuation line */
{
	if (asdfasdf;asldkfj asdlkfj as;ldkfj sal;d
			aal;sdkjf  ( ;asldfkja;sldfk
					al;sdjfka ;slkdf ) sa;ldkjfsa dlk;)
		line up here;
}


/* C++ tests: */

// foo()		these three lines should remain in column 0
// {
// }

/* Test for continuation and unterminated lines: */
{
	i = 99 + 14325 +
		21345 +
		21345 +
		21345 + ( 21345 +
				21345) +
		2345 +
		1234;
	c = 1;
}

/*
   testje for indent with empty line

   here */

{
	if (testing &&
			not a joke ||
			line up here)
		hay;
	if (testing &&
			(not a joke || testing
			)line up here)
		hay;
	if (testing &&
			(not a joke || testing
			 line up here))
		hay;
}


{
	switch (c)
	{
		case xx:
			do
				if (asdf)
					do
						asdfasdf;
					while (asdf);
				else
					asdfasdf;
			while (cond);
		case yy:
		case xx:
		case zz:
			testing;
	}
}

{
	if (cond) {
		foo;
	}
	else
	{
		bar;
	}
}

{
	if (alskdfj ;alsdkfjal;skdjf (;sadlkfsa ;dlkf j;alksdfj ;alskdjf
			alsdkfj (asldk;fj
					awith cino=(0 ;lf this one goes to below the paren with ==
							;laksjfd ;lsakdjf ;alskdf asd)
					asdfasdf;)))
		asdfasdf;
}

	int
func(a, b)
	int a;
	int c;
{
	if (c1 && (c2 ||
			c3))
		foo;
	if (c1 &&
			(c2 || c3)
	   )
}

{
	while (asd)
	{
		if (asdf)
			if (test)
				if (that)
				{
					if (asdf)
						do
							cdasd;
						while (as
								df);
				}
				else
					if (asdf)
						asdf;
					else
						asdf;
		asdf;
	}
}

{
	s = "/*"; b = ';'
		s = "/*"; b = ';';
	a = b;
}

{
	switch (a)
	{
		case a:
			switch (t)
			{
				case 1:
					cmd;
					break;
				case 2:
					cmd;
					break;
			}
			cmd;
			break;
		case b:
			{
				int i;
				cmd;
			}
			break;
		case c: {
					int i;
					cmd;
				}
		case d: if (cond &&
						test) {		/* this line doesn't work right */
					int i;
					cmd;
				}
				break;
	}
}

{
	if (!(vim_strchr(p_cpo, CPO_BUFOPTGLOB) != NULL && entering) &&
			(bp_to->b_p_initialized ||
			 (!entering && vim_strchr(p_cpo, CPO_BUFOPT) != NULL)))
		return;
label :
	asdf = asdf ?
		asdf : asdf;
	asdf = asdf ?
		asdf: asdf;
}

/* Special Comments	: This function has the added complexity (compared  */
/*					: to addtolist) of having to check for a detail     */
/*					: texture and add that to the list first.	 	    */

char *(array[100]) = {
	"testje",
	"foo",
	"bar",
}

enum soppie
{
yes = 0,
no,
maybe
};

typedef enum soppie
{
yes = 0,
no,
maybe
};

static enum
{
yes = 0,
no,
maybe
} soppie;

public static enum
{
yes = 0,
no,
maybe
} soppie;

static private enum
{
yes = 0,
no,
maybe
} soppie;

{
	int a,
		b;
}

{
	struct Type
	{
		int i;
		char *str;
	} var[] =
	{
		0, "zero",
		1, "one",
		2, "two",
		3, "three"
	};

	float matrix[3][3] =
	{
		{
			0,
			1,
			2
		},
		{
			3,
			4,
			5
		},
		{
			6,
			7,
			8
		}
	};
}

{
	/* blah ( blah */
	/* where does this go? */

	/* blah ( blah */
	cmd;

	func(arg1,
			/* comment */
			arg2);
	a;
	{
		b;
		{
			c; /* Hey, NOW it indents?! */
		}
	}

	{
		func(arg1,
				arg2,
				arg3);
		/* Hey, what am I doing here?  Is this coz of the ","? */
	}
}

main ()
{
	if (cond)
	{
		a = b;
	}
	if (cond) {
		a = c;
	}
	if (cond)
		a = d;
	return;
}

{
	case 2: if (asdf &&
					asdfasdf)
				aasdf;
			a = 9;
	case 3: if (asdf)
				aasdf;
			a = 9;
	case 4:    x = 1;
			   y = 2;

label:	if (asdf)
			here;

label:  if (asdf &&
				asdfasdf)
		{
		}

label:  if (asdf &&
				asdfasdf) {
			there;
		}

label:  if (asdf &&
				asdfasdf)
			there;
}

{
	/*
	   hello with ":set comments= cino=c5"
	 */

	/*
	   hello with ":set comments= cino="
	 */
}


{
	if (a < b) {
		a = a + 1;
	} else
		a = a + 2;

	if (a)
		do {
			testing;
		} while (asdfasdf);
	a = b + 1;
	asdfasdf
}

{
for ( int i = 0;
	i < 10; i++ )
{
}
	i = 0;
}

class bob
{
	int foo() {return 1;}
		int bar;
}

main()
{
while(1)
if (foo)
{
bar;
}
else {
asdf;
}
misplacedline;
}

{
	if (clipboard.state == SELECT_DONE
	&& ((row == clipboard.start.lnum
	&& col >= clipboard.start.col)
	|| row > clipboard.start.lnum))
}

{
if (1) {i += 4;}
where_am_i;
return 0;
}

{
{
} // sdf(asdf
if (asdf)
asd;
}

{
label1:
label2:
}

{
int fooRet = foo(pBar1, false /*fKB*/,
	true /*fPTB*/, 3 /*nT*/, false /*fDF*/);
f() {
for ( i = 0;
	i < m;
	/* c */ i++ ) {
a = b;
}
}
}

{
	f1(/*comment*/);
	f2();
}

{
do {
if (foo) {
} else
;
} while (foo);
foo();	// was wrong
}

int x;	    // no extra indent because of the ;
void func()
{
}

char *tab[] = {"aaa",
	"};", /* }; */ NULL}
	int indented;
{}

char *a[] = {"aaa", "bbb",
	"ccc", NULL};
// here

char *tab[] = {"aaa",
	"xx", /* xx */};    /* asdf */
int not_indented;

{
	do {
		switch (bla)
		{
			case 1: if (foo)
						bar;
		}
	} while (boo);
					wrong;
}

int	foo,
	bar;
int foo;

#if defined(foo) \
	&& defined(bar)
char * xx = "asdf\
	foo\
	bor";
int x;

char    *foo = "asdf\
	asdf\
	asdf",
	*bar;

void f()
{
#if defined(foo) \
	&& defined(bar)
char    *foo = "asdf\
	asdf\
	asdf",
	*bar;
	{
	int i;
char    *foo = "asdf\
	asdf\
	asdf",
	*bar;
	}
#endif
}
#endif

int y;		// comment
		// comment

	// comment

{
	Constructor(int a,
			int b )  : BaseClass(a)
	{
	}
}

void foo()
{
	char one,
	two;
	struct bla piet,
	jan;
	enum foo kees,
	jannie;
	static unsigned sdf,
	krap;
	unsigned int piet,
	jan;
	int
	kees,
	jan;
}

{
	t(int f,
			int d);		// )
	d();
}

Constructor::Constructor(int a,
                         int b 
                        )  : 
   BaseClass(a,
             b,
             c),
   mMember(b),
{
}

Constructor::Constructor(int a,
                         int b )  : 
   BaseClass(a)
{
}

Constructor::Constructor(int a,
                         int b ) /*x*/ : /*x*/ BaseClass(a),
                                               member(b)
{
}

A::A(int a, int b)
: aa(a),
bb(b),
cc(c)
{
}

class CAbc :
   public BaseClass1,
   protected BaseClass2
{
   int Test() { return FALSE; }
   int Test1() { return TRUE; }

   CAbc(int a, int b )  : 
      BaseClass(a)
   { 
      switch(xxx)
      {
         case abc:
            asdf();
            break;

         case 999:
            baer();
            break;
      }
   }

public: // <-- this was incoreectly indented before!!
   void testfall();
protected:
   void testfall();
};

class CAbc : public BaseClass1,
             protected BaseClass2
{
};

static struct
{
    int a;
    int b;
} variable[COUNT] =
{
    {
        123,
        456
    },
	{
        123,
        456
    }
};

static struct
{
    int a;
    int b;
} variable[COUNT] =
{
    { 123, 456 },
	{ 123, 456 }
};

void asdf()		/* ind_maxparen may cause trouble here */
{
	if ((0
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1
				&& 1)) break;
}

foo()
{
	a = cond ? foo() : asdf
					   + asdf;

	a = cond ?
		foo() : asdf
				+ asdf;
}

int  main(void)
{
	if (a)
		if (b)
			2;
		else 3;
	next_line_of_code();
}

barry()
{
	Foo::Foo (int one,
			int two)
		: something(4)
	{}
}

barry()
{
	Foo::Foo (int one, int two)
		: something(4)
	{}
}

Constructor::Constructor(int a,
		int b 
		)  : 
	BaseClass(a,
			b,
			c),
	mMember(b)
{
}
       int main ()
       {
	 if (lala)
	   do
	     ++(*lolo);
	   while (lili
		  && lele);
	   lulu;
       }

int main ()
{
switch (c)
{
case 'c': if (cond)
{
}
}
}

main()
{
	(void) MyFancyFuasdfadsfnction(
			argument);
}

main()
{
	char	foo[] = "/*";
	/* as
	df */
		hello
}

/* valid namespaces with normal indent */
namespace
{
{
  111111111111;
}
}
namespace /* test */
{
  11111111111111111;
}
namespace // test
{
  111111111111111111;
}
namespace
{
  111111111111111111;
}
namespace test
{
  111111111111111111;
}
namespace{
  111111111111111111;
}
namespace test{
  111111111111111111;
}
namespace {
  111111111111111111;
}
namespace test {
  111111111111111111;
namespace test2 {
  22222222222222222;
}
}

/* invalid namespaces use block indent */
namespace test test2 {
  111111111111111111111;
}
namespace11111111111 {
  111111111111;
}
namespace() {
  1111111111111;
}
namespace()
{
  111111111111111111;
}
namespace test test2
{
  1111111111111111111;
}
namespace111111111
{
  111111111111111111;
}

void getstring() {
/* Raw strings */
const char* s = R"(
  test {
    # comment
    field: 123
  }
 )";
     }

void getstring() {
const char* s = R"foo(
  test {
    # comment
    field: 123
  }
    )foo";
     }

{
int a[4] = {
[0] = 0,
[1] = 1,
[2] = 2,
[3] = 3,
};
}

{
a = b[2]
+ 3;
}

{
if (1)
/* aaaaa
* bbbbb
*/
a = 1;
}

void func()
{
switch (foo)
{
case (bar):
if (baz())
quux();
break;
case (shmoo):
if (!bar)
{
}
case (foo1):
switch (bar)
{
case baz:
baz_f();
break;
}
break;
default:
baz();
baz();
break;
}
}

/* end of AUTO */

STARTTEST
:set tw=0 noai fo=croq
:let &wm = &columns - 20
/serious/e
a about life, the universe, and the rest
ENDTEST

{

/* this is
 * a real serious important big
 * comment
 */
	/* insert " about life, the universe, and the rest" after "serious" */
}

STARTTEST
:set nocin
/comments
joabout life/happens
jothere/below
oline/this
Ohello
ENDTEST

{
	/*
	 * Testing for comments, without 'cin' set
	 */

/*
* what happens here?
*/

	/*
	   the end of the comment, try inserting a line below */

		/* how about
		                this one */
}

STARTTEST
:set cin
/vec2
==
ENDTEST

{
    var = this + that + vec[0] * vec[0]
				      + vec[1] * vec[1]
					  + vec2[2] * vec[2];
}

STARTTEST
:set cin
:set cino=}4
/testing1
k2==/testing2
k2==
ENDTEST

{
		asdf asdflkajds f;
	if (tes & ting) {
		asdf asdf asdf ;
		asdfa sdf asdf;
		}
	testing1;
	if (tes & ting)
	{
		asdf asdf asdf ;
		asdfa sdf asdf;
		}
	testing2;
}

STARTTEST
:set cin
:set cino=(0,)20
/main
=][
ENDTEST

main ( int first_par, /*
                       * Comment for
                       * first par
                       */
          int second_par /*
                       * Comment for
                       * second par
                       */
     )
{
	func( first_par, /*
                      * Comment for
                      * first par
                      */
    second_par /*
                      * Comment for
                      * second par
                      */
        );

}

STARTTEST
:set cin
:set cino=es,n0s
/main
=][
ENDTEST

main(void)
{
	/* Make sure that cino=X0s is not parsed like cino=Xs. */
	if (cond)
		foo();
	else
	{
		bar();
	}
}

STARTTEST
:set cin
:set cino=
]]=][
ENDTEST

{
	do
	{
		if ()
		{
			if ()
				asdf;
			else
				asdf;
		}
	} while ();
			cmd;		/* this should go under the } */
}

STARTTEST
]]=][
ENDTEST

void f()
{
    if ( k() ) {
        l();

    } else { /* Start (two words) end */
        m();
    }

    n();
}

STARTTEST
:set cino={s,e-s
]]=][
ENDTEST

void f()
{
    if ( k() )
	{
        l();
    } else { /* Start (two words) end */
        m();
    }
		n();	/* should be under the if () */
}

STARTTEST
:set cino={s,fs
]]=/ foo
ENDTEST

void bar(void)
{
	static array[2][2] =
	{
		{ 1, 2 },
		{ 3, 4 },
	}

	while (a)
	{
		foo(&a);
	}

	{
		int a;
		{
			a = a + 1;
		}
	}
	b = a;
	}

void func(void)
	{
	a = 1;
	{
		b = 2;
	}
	c = 3;
	d = 4;
	}
/* foo */

STARTTEST
:set cino=
/while
ohere
ENDTEST

a()
{
  do {
    a = a +
      a;
  } while ( a );		/* add text under this line */
    if ( a )
      a;
}

STARTTEST
:set cino= com=
/comment
olabel2: b();
label3 /* post */:
/* pre */ label4:
f(/*com*/);
if (/*com*/)
cmd();
ENDTEST

a()
{
label1:
            /* hmm */
            // comment
}

STARTTEST
:set comments& comments^=s:/*,m:**,ex:*/
/simple
=5j
ENDTEST

/*
  * A simple comment
   */

/*
  ** A different comment
   */

STARTTEST
:set cino=c0
:set comments& comments-=s1:/* comments^=s0:/*
2kdd]]=][
ENDTEST

void f()
{

	/*********
  A comment.
*********/
}

STARTTEST
:set cino=c0,C1
:set comments& comments-=s1:/* comments^=s0:/*
2kdd]]=][
ENDTEST

void f()
{

	/*********
  A comment.
*********/
}

STARTTEST
:set cino=
]]=][
ENDTEST

void f()
{
	c = c1 &&
	(
	c2 ||
	c3
	) && c4;
}

STARTTEST
:set cino=(s
2kdd]]=][
ENDTEST

void f()
{
	c = c1 &&
	(
	c2 ||
	c3
	) && c4;
}

STARTTEST
:set cino=(s,U1  
2kdd]]=][
ENDTEST

void f()
{
	c = c1 &&
	(
	c2 ||
	c3
	) && c4;
}

STARTTEST
:set cino=(0
2kdd]]=][
ENDTEST

void f()
{
	if (   c1
	&& (   c2
	|| c3))
	foo;
}

STARTTEST
:set cino=(0,w1  
2kdd]]=][
ENDTEST

void f()
{
	if (   c1
	&& (   c2
	|| c3))
	foo;
}

STARTTEST
:set cino=(s
2kdd]]=][
ENDTEST

void f()
{
	c = c1 && (
	c2 ||
	c3
	) && c4;
	if (
	c1 && c2
	)
	foo;
}

STARTTEST
:set cino=(s,m1  
2kdd]]=][
ENDTEST

void f()
{
	c = c1 && (
	c2 ||
	c3
	) && c4;
	if (
	c1 && c2
	)
	foo;
}

STARTTEST
:set cino=b1
2kdd]]=][
ENDTEST

void f()
{
	switch (x)
	{
		case 1:
			a = b;
			break;
		default:
			a = 0;
			break;
	}
}

STARTTEST
:set cino=(0,W5
2kdd]]=][
ENDTEST

void f()
{
	invokeme(
	argu,
	ment);
	invokeme(
	argu,
	ment
	);
	invokeme(argu,
	ment
	);
}

STARTTEST
:set cino=/6
2kdd]]=][
ENDTEST

void f()
{
	statement;
		// comment 1
	// comment 2
}

STARTTEST
:set cino=
2kdd]]/comment 1/+1
==
ENDTEST

void f()
{
	statement;
	   // comment 1
	// comment 2
}

STARTTEST
:set cino=g0
2kdd]]=][
ENDTEST

class CAbc
{
   int Test() { return FALSE; }

public: // comment
   void testfall();
protected:
   void testfall();
};

STARTTEST
:set cino=(0,gs,hs
2kdd]]=][
ENDTEST

class Foo : public Bar
{
public:
virtual void method1(void) = 0;
virtual void method2(int arg1,
int arg2,
int arg3) = 0;
};

STARTTEST
:set cino=+20
2kdd]]=][
ENDTEST

	void
foo()
{
	if (a)
	{
	} else
		asdf;
}

STARTTEST
:set cino=(0,W2s
2kdd]]=][
ENDTEST

{
   averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
         asdasdf,
         func(asdf,
              asdfadsf),
         asdfasdf
         );

   /* those are ugly, but consequent */

   func()->asd(asdasdf,
               averylongfunctionname(
                     abc,
                     dec)->averylongfunctionname(
                           asdfadsf,
                           asdfasdf,
                           asdfasdf,
                           ),
               func(asdfadf,
                    asdfasdf
                   ),
               asdasdf
              );

   averylongfunctionnameaverylongfunctionnameavery()->asd(fasdf(
               abc,
               dec)->asdfasdfasdf(
                     asdfadsf,
                     asdfasdf,
                     asdfasdf,
                     ),
         func(asdfadf,
              asdfasdf),
         asdasdf
         );
}

STARTTEST
:set cino=M1
2kdd]]=][
ENDTEST

int main ()
{
	if (cond1 &&
			cond2
			)
		foo;
}

STARTTEST
:set cino=(0,ts
2kdd2j=][
ENDTEST

void func(int a
#if defined(FOO)
		  , int b
		  , int c
#endif
		 )
{
}

STARTTEST
:set cino=(0
2kdd2j=][
ENDTEST

void
func(int a
#if defined(FOO)
		  , int b
		  , int c
#endif
		 )
{
}

STARTTEST
:set cino&
2kdd2j=7][
ENDTEST

void func(void)
{
	if(x==y)
		if(y==z)
			foo=1;
		else { bar=1;
			baz=2;
		}
	printf("Foo!\n");
}

void func1(void)
{
	char* tab[] = {"foo", "bar",
		"baz", "quux",
			"this line used", "to be indented incorrectly"};
	foo();
}

void func2(void)
{
	int tab[] =
	{1, 2,
		3, 4,
		5, 6};

		printf("This line used to be indented incorrectly.\n");
}

int foo[]
#ifdef BAR

= { 1, 2, 3,
	4, 5, 6 }

#endif
;
	int baz;

void func3(void)
{
	int tab[] = {
	1, 2,
	3, 4,
	5, 6};

printf("Don't you dare indent this line incorrectly!\n");
}

void
func4(a, b,
		c)
int a;
int b;
int c;
{
}

void
func5(
		int a,
		int b)
{
}

void
func6(
		int a)
{
}

STARTTEST
:set cino&
:set cino+=l1
2kdd2j=][
ENDTEST

void func(void)
{
	int tab[] =
	{
		1, 2, 3,
		4, 5, 6};

	printf("Indent this line correctly!\n");

	switch (foo)
	{
		case bar:
			printf("bar");
			break;
		case baz: {
			printf("baz");
			break;
		}
		case quux:
printf("But don't break the indentation of this instruction\n");
break;
	}
}

STARTTEST
:set cino&
2kdd2j=][
ENDTEST

void func(void)
{
	cout << "a"
	<< "b"
	<< ") :"
	<< "c";
}

STARTTEST
:set com=s1:/*,m:*,ex:*/
]]3jofoo();
ENDTEST

void func(void)
{
	/*
	 * This is a comment.
	 */
}

STARTTEST
:set cino&
2kdd2j=][
ENDTEST

void func(void)
{
	for (int i = 0; i < 10; ++i)
		if (i & 1) {
			foo(1);
		} else
			foo(0);
baz();
}

STARTTEST
:set cino=k2s,(0
2kdd3j=][
ENDTEST

void func(void)
{
	if (condition1
	&& condition2)
	action();
	function(argument1
	&& argument2);

	if (c1 && (c2 ||
	c3))
	foo;
	if (c1 &&
	(c2 || c3))
	{
	}

	if (   c1
	&& (      c2
	|| c3))
	foo;
	func( c1
	&& (     c2
	|| c3))
	foo;
}

STARTTEST
:set cino=k2s,(s
2kdd3j=][
ENDTEST

void func(void)
{
	if (condition1
	&& condition2)
	action();
	function(argument1
	&& argument2);

	if (c1 && (c2 ||
	c3))
	foo;
	if (c1 &&
	(c2 || c3))
	{
	}

	if (   c1
	&& (      c2
	|| c3))
	foo;
	func(   c1
	&& (      c2
	|| c3))
	foo;
}

STARTTEST
:set cino=k2s,(s,U1
2kdd3j=][
ENDTEST

void func(void)
{
	if (condition1
	&& condition2)
	action();
	function(argument1
	&& argument2);

	if (c1 && (c2 ||
	c3))
	foo;
	if (c1 &&
	(c2 || c3))
	{
	}
	if (c123456789
	&& (c22345
	|| c3))
	printf("foo\n");

	c = c1 &&
	(
	c2 ||
	c3
	) && c4;
}

STARTTEST
:set cino=k2s,(0,W4
2kdd3j=][
ENDTEST

void func(void)
{
	if (condition1
	&& condition2)
	action();
	function(argument1
	&& argument2);

	if (c1 && (c2 ||
	c3))
	foo;
	if (c1 &&
	(c2 || c3))
	{
	}
	if (c123456789
	&& (c22345
	|| c3))
	printf("foo\n");

	if (   c1
	&& (   c2
	|| c3))
	foo;

	a_long_line(
	argument,
	argument);
	a_short_line(argument,
	argument);
}

STARTTEST
:set cino=k2s,u2
2kdd3j=][
ENDTEST

void func(void)
{
	if (condition1
	&& condition2)
	action();
	function(argument1
	&& argument2);

	if (c1 && (c2 ||
	c3))
	foo;
	if (c1 &&
	(c2 || c3))
	{
	}
	if (c123456789
	&& (c22345
	|| c3))
	printf("foo\n");
}

STARTTEST
:set cino=k2s,(0,w1
2kdd3j=][
ENDTEST

void func(void)
{
	if (condition1
	&& condition2)
	action();
	function(argument1
	&& argument2);

	if (c1 && (c2 ||
	c3))
	foo;
	if (c1 &&
	(c2 || c3))
	{
	}
	if (c123456789
	&& (c22345
	|| c3))
	printf("foo\n");

	if (   c1
	&& (      c2
	|| c3))
	foo;
	func(   c1
	&& (      c2
	|| c3))
	foo;
}

STARTTEST
:set cino=k2,(s
2kdd3j=][
ENDTEST

void func(void)
{
	if (condition1
	  && condition2)
		action();
	function(argument1
		&& argument2);

	if (c1 && (c2 ||
		  c3))
		foo;
	if (c1 &&
	  (c2 || c3))
	{
	}
}

STARTTEST
:set cino=N-s
/^NAMESPACESTART
=/^NAMESPACEEND
ENDTEST

NAMESPACESTART
/* valid namespaces with normal indent */
namespace
{
   {
	111111111111;
}
}
namespace /* test */
{
  11111111111111111;
}
namespace // test
{
  111111111111111111;
}
namespace
{
  111111111111111111;
}
namespace test
{
  111111111111111111;
}
namespace test::cpp17
{
  111111111111111111;
}
namespace ::incorrectcpp17
{
  111111111111111111;
}
namespace test::incorrectcpp17::
{
  111111111111111111;
}
namespace test:incorrectcpp17
{
  111111111111111111;
}
namespace test:::incorrectcpp17
{
  111111111111111111;
}
namespace{
  111111111111111111;
}
namespace test{
  111111111111111111;
}
namespace {
  111111111111111111;
}
namespace test {
  111111111111111111;
namespace test2 {
  22222222222222222;
}
}

/* invalid namespaces use block indent */
namespace test test2 {
  111111111111111111111;
}
namespace11111111111 {
  111111111111;
}
namespace() {
  1111111111111;
}
namespace()
{
  111111111111111111;
}
namespace test test2
{
  1111111111111111111;
}
namespace111111111
{
  111111111111111111;
}
NAMESPACEEND


STARTTEST
:set cino=j1,J1
/^JSSTART
=/^JSEND
ENDTEST

JSSTART
var bar = {
foo: {
that: this,
some: ok,
},
"bar":{
a : 2,
b: "123abc",
x: 4,
"y": 5
}
}
JSEND

STARTTEST
:set cino=j1,J1
/^JSSTART
=/^JSEND
ENDTEST

JSSTART
var foo = [
1,
2,
3
];
JSEND

STARTTEST
:set cino=j1,J1
/^JSSTART
=/^JSEND
ENDTEST

JSSTART
function bar() {
var foo = [
1,
2,
3
];
}
JSEND

STARTTEST
:set cino=j1,J1
/^JSSTART
=/^JSEND
ENDTEST

JSSTART
(function($){

if (cond &&
cond) {
stmt;
}
window.something.left =
(width - 50 + offset) + "px";
var class_name='myclass';

function private_method() {
}

var public_method={
method: function(options,args){
private_method();
}
}

function init(options) {

$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
bar: 2,
foobar: [
1,
2,
3
],
callback: function(){
return true;
}
}, options||{}));
}

$.fn[class_name]=function() {

var _arguments=arguments;
return this.each(function(){

var options=$(this).data(class_name+'_public');
if (!options) {
init.apply(this,_arguments);

} else {
var method=public_method[_arguments[0]];

if (typeof(method)!='function') {
console.log(class_name+' has no method "'+_arguments[0]+'"');
return false;
}
_arguments[0]=options;
method.apply(this,_arguments);
}
});
}

})(jQuery);
JSEND

STARTTEST
:set cino=j1,J1
/^JSSTART
=/^JSEND
ENDTEST

JSSTART
function init(options) {
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
bar: 2,
foobar: [
1,
2,
3
],
callback: function(){
return true;
}
}, options||{}));
}
JSEND

STARTTEST
:set cino=j1,J1
/^JSSTART
=/^JSEND
ENDTEST

JSSTART
(function($){
function init(options) {
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
bar: 2,
foobar: [
1,
2,
3
],
callback: function(){
return true;
}
}, options||{}));
}
})(jQuery);
JSEND

STARTTEST
:set cino=j1,J1,+2
/^JSSTART
=/^JSEND
ENDTEST

JSSTART
// Results of JavaScript indent
// 1
(function(){
var a = [
'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i'
];
}())

// 2
(function(){
var a = [
0 +
5 *
9 *
'a',
'b',
0 +
5 *
9 *
'c',
'd',
'e',
'f',
'g',
'h',
'i'
];
}())

// 3
(function(){
var a = [
0 +
// comment 1
5 *
/* comment 2 */
9 *
'a',
'b',
0 +
5 *
9 *
'c',
'd',
'e',
'f',
'g',
'h',
'i'
];
}())

// 4
{
var a = [
0,
1
];
var b;
var c;
}

// 5
{
var a = [
[
0
],
2,
3
];
}

// 6
{
var a = [
[
0,
1
],
2,
3
];
}

// 7
{
var a = [
// [
0,
// 1
// ],
2,
3
];
}

// 8
var x = [
(function(){
var a,
b,
c,
d,
e,
f,
g,
h,
i;
})
];

// 9
var a = [
0 +
5 *
9 *
'a',
'b',
0 +
5 *
9 *
'c',
'd',
'e',
'f',
'g',
'h',
'i'
];

// 10
var a,
b,
c,
d,
e,
f,
g,
h,
i;
JSEND

STARTTEST
:set cin cino&
/start of define
=/end of define
ENDTEST

/* start of define */
{
}
#define AAA \
BBB\
CCC

#define CNT \
1 + \
2 + \
4
/* end of define */

STARTTEST
:set cin cino&
/a = second
ox
ENDTEST

{
	a = second/*bug*/*line;
}

STARTTEST
:g/^STARTTEST/.,/^ENDTEST/d
:1;/start of AUTO/,$wq! test.out
ENDTEST
