This test checks text editor enter behaviour.


Running: testEnterInTheLineEnd
function.testFunction()
{
....var.a.=.100;
....|
....var.b.=.200;
....var.c.=.(a.+.b)./.2;
....console.log(a);
....console.log(b);
....console.log(c);
....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterAfterOpenCurlyBrace
function.testFunction()
{
....|
....var.a.=.100;
....var.b.=.200;
....var.c.=.(a.+.b)./.2;
....console.log(a);
....console.log(b);
....console.log(c);
....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterInTheMiddleOfLine
function.testFunction()
{
....var.
....|a.=.100;
....var.b.=.200;
....var.c.=.(a.+.b)./.2;
....console.log(a);
....console.log(b);
....console.log(c);
....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterInTheBeginningOfTheLine
function.testFunction()
{

|....var.a.=.100;
....var.b.=.200;
....var.c.=.(a.+.b)./.2;
....console.log(a);
....console.log(b);
....console.log(c);
....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterWithTheSelection
function.testFunction()
{
..
..|var.a.=.100;
....var.b.=.200;
....var.c.=.(a.+.b)./.2;
....console.log(a);
....console.log(b);
....console.log(c);
....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterWithReversedSelection
function.testFunction()
{
..
..|var.a.=.100;
....var.b.=.200;
....var.c.=.(a.+.b)./.2;
....console.log(a);
....console.log(b);
....console.log(c);
....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterWithTheMultiLineSelection
function.testFunction()
{

|if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterWithFullLineSelection
function.testFunction()
{

|....var.b.=.200;
....var.c.=.(a.+.b)./.2;
....console.log(a);
....console.log(b);
....console.log(c);
....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterBeforeOpenBrace
function.testFunction()
{
....var.a.=.100;
....var.b.=.200;
....var.c.=.(a.+.b)./.2;
....console.log(a);
....console.log(b);
....console.log(c);

|....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

Running: testEnterMultiCursor
function.testFunction()
{
....var.a.=.100;

|....var.b.=.200;
....var.c.=.(a.+.b)./.2;
.
.|...console.log(a);
..
..|..console.log(b);
....console.log(c);
....if.(a.>.b).{
........console.log(a);
....}
....return.c;
}

