Browse Source

fcl-js: no brackets in var-comma

git-svn-id: trunk@37578 -
Mattias Gaertner 7 years ago
parent
commit
2a57480fff
2 changed files with 180 additions and 90 deletions
  1. 7 1
      packages/fcl-js/src/jswriter.pp
  2. 173 89
      packages/fcl-js/tests/tcwriter.pp

+ 7 - 1
packages/fcl-js/src/jswriter.pp

@@ -993,7 +993,12 @@ begin
     AllowCompact:=TJSBinaryExpression(El).AllowCompact;
     end;
   If Not (AllowCompact and (woCompact in Options)) then
-    S:=' '+S+' ';
+    begin
+    if El is TJSCommaExpression then
+      S:=S+' '
+    else
+      S:=' '+S+' ';
+    end;
   Write(S);
   WriteJS(El.B);
   Writer.CurElement:=El;
@@ -1449,6 +1454,7 @@ procedure TJSWriter.WriteVariableStatement(El: TJSVariableStatement);
 
 begin
   Write('var ');
+  FSkipRoundBrackets:=true;
   WriteJS(El.A);
 end;
 

+ 173 - 89
packages/fcl-js/tests/tcwriter.pp

@@ -134,6 +134,7 @@ type
     Procedure TestForStatementFull;
     Procedure TestForStatementFull1;
     Procedure TestForStatementCompact;
+    Procedure TestForStatement2loops2inits;
     Procedure TestForInStatement;
     Procedure TestWhileStatement;
     Procedure TestDoWhileStatement;
@@ -751,7 +752,7 @@ end;
   TTestStatementWriter
   ---------------------------------------------------------------------}
 
-Procedure TTestStatementWriter.TestAssignment(Const Msg: String;
+procedure TTestStatementWriter.TestAssignment(const Msg: String;
   AClass: TJSAssignStatementClass; Result: String; ACompact: Boolean);
 Var
   U : TJSAssignStatement;
@@ -762,7 +763,7 @@ begin
   AssertWrite(Msg,Result,U);
 end;
 
-Function TTestStatementWriter.CreateAssignment(AClass: TJSAssignStatementClass
+function TTestStatementWriter.CreateAssignment(AClass: TJSAssignStatementClass
   ): TJSAssignStatement;
 begin
   if AClass=Nil then
@@ -785,37 +786,37 @@ begin
   Result.B:=CreateAssignment(nil);
 end;
 
-Procedure TTestStatementWriter.TestEmptyStatement;
+procedure TTestStatementWriter.TestEmptyStatement;
 
 begin
   AssertWrite('Empty statement','',TJSEmptyStatement.Create(0,0));
 end;
 
-Procedure TTestStatementWriter.TestEmptyStatementComment;
+procedure TTestStatementWriter.TestEmptyStatementComment;
 begin
   Writer.Options:=[woEmptyStatementAsComment,woUseUTF8];
   AssertWrite('Empty statement as comment','/* Empty statement */',TJSEmptyStatement.Create(0,0));
 end;
 
-Procedure TTestStatementWriter.TestEmptyStatementBlock;
+procedure TTestStatementWriter.TestEmptyStatementBlock;
 begin
   AssertWrite('Empty statement block','{'+sLineBreak+'}',TJSEmptyBlockStatement.Create(0,0));
 end;
 
-Procedure TTestStatementWriter.TestEmptyStatementBlockIndent;
+procedure TTestStatementWriter.TestEmptyStatementBlockIndent;
 begin
   Writer.IndentSize:=2;
   Writer.Indent;
   AssertWrite('Empty statement block','  {'+sLineBreak+'  }',TJSEmptyBlockStatement.Create(0,0));
 end;
 
-Procedure TTestStatementWriter.TestEmptyStatementBlockCompact;
+procedure TTestStatementWriter.TestEmptyStatementBlockCompact;
 begin
   Writer.Options:=[woCompact,woUseUTF8];
   AssertWrite('Empty statement block','{}',TJSEmptyBlockStatement.Create(0,0));
 end;
 
-Procedure TTestStatementWriter.TestVarDeclaration;
+procedure TTestStatementWriter.TestVarDeclaration;
 
 Var
   V : TJSVarDeclaration;
@@ -825,7 +826,7 @@ begin
   AssertWrite('simple var','a',V);
 end;
 
-Procedure TTestStatementWriter.TestVarDeclarationInit;
+procedure TTestStatementWriter.TestVarDeclarationInit;
 Var
   V : TJSVarDeclaration;
 begin
@@ -835,7 +836,7 @@ begin
   AssertWrite('simple var, init ','a = 1',V);
 end;
 
-Procedure TTestStatementWriter.TestVarListDeclaration;
+procedure TTestStatementWriter.TestVarListDeclaration;
 Var
   B,L : TJSVariableDeclarationList;
   V : TJSVarDeclaration;
@@ -854,7 +855,7 @@ begin
   AssertWrite('simple var list ','a, b = 1',L);
 end;
 
-Procedure TTestStatementWriter.TestVarListDeclarationInit;
+procedure TTestStatementWriter.TestVarListDeclarationInit;
 Var
   B,L : TJSVariableDeclarationList;
   V : TJSVarDeclaration;
@@ -873,7 +874,7 @@ begin
   AssertWrite('simple var list ','a, b',L);
 end;
 
-Procedure TTestStatementWriter.TestVarDeclarationStatement;
+procedure TTestStatementWriter.TestVarDeclarationStatement;
 
 Var
   S : TJSVariableStatement;
@@ -886,7 +887,7 @@ begin
   AssertWrite('simple var','var a',S);
 end;
 
-Procedure TTestStatementWriter.TestVarListDeclarationStatement;
+procedure TTestStatementWriter.TestVarListDeclarationStatement;
 
 Var
   S : TJSVariableStatement;
@@ -903,7 +904,7 @@ begin
   AssertWrite('simple var','var a',S);
 end;
 
-Procedure TTestStatementWriter.TestVarListDeclarationStatement2Vars;
+procedure TTestStatementWriter.TestVarListDeclarationStatement2Vars;
 Var
   S : TJSVariableStatement;
   V : TJSVarDeclaration;
@@ -924,7 +925,7 @@ begin
   AssertWrite('simple 2 vars','var a, b',S);
 end;
 
-Procedure TTestStatementWriter.TestReturnStatement;
+procedure TTestStatementWriter.TestReturnStatement;
 Var
   S : TJSReturnStatement;
 
@@ -934,7 +935,7 @@ begin
   AssertWrite('simple return','return a',S);
 end;
 
-Procedure TTestStatementWriter.TestLabeledStatement;
+procedure TTestStatementWriter.TestLabeledStatement;
 Var
   LS : TJSLabeledStatement;
   S : TJSReturnStatement;
@@ -949,7 +950,7 @@ begin
   AssertWrite('simple return','loc:'+sLineBreak+'return a',LS);
 end;
 
-Procedure TTestStatementWriter.TestLabeledStatementCompact;
+procedure TTestStatementWriter.TestLabeledStatementCompact;
 Var
   LS : TJSLabeledStatement;
   S : TJSReturnStatement;
@@ -965,7 +966,7 @@ begin
   AssertWrite('simple return','loc: return a',LS);
 end;
 
-Procedure TTestStatementWriter.TestContinueStatement;
+procedure TTestStatementWriter.TestContinueStatement;
 
 Var
   S : TJSContinueStatement;
@@ -975,7 +976,7 @@ begin
   AssertWrite('simple continue','continue',S);
 end;
 
-Procedure TTestStatementWriter.TestContinueTargetStatement;
+procedure TTestStatementWriter.TestContinueTargetStatement;
 
 Var
   S : TJSContinueStatement;
@@ -986,7 +987,7 @@ begin
   AssertWrite('continue a','continue a',S);
 end;
 
-Procedure TTestStatementWriter.TestBreakStatement;
+procedure TTestStatementWriter.TestBreakStatement;
 
 Var
   S : TJSBreakStatement;
@@ -996,7 +997,7 @@ begin
   AssertWrite('simple break','break',S);
 end;
 
-Procedure TTestStatementWriter.TestBreakTargetStatement;
+procedure TTestStatementWriter.TestBreakTargetStatement;
 Var
   S : TJSBreakStatement;
 
@@ -1006,127 +1007,127 @@ begin
   AssertWrite('simple break a','break a',S);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementSimple;
+procedure TTestStatementWriter.TestAssignmentStatementSimple;
 begin
   TestAssignment('Simple assignment',TJSSimpleAssignStatement,'a = b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementSimpleCompact;
+procedure TTestStatementWriter.TestAssignmentStatementSimpleCompact;
 begin
   TestAssignment('Simple assignment',TJSSimpleAssignStatement,'a=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementAdd;
+procedure TTestStatementWriter.TestAssignmentStatementAdd;
 begin
   TestAssignment('Add assignment',TJSAddEqAssignStatement,'a += b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementAddCompact;
+procedure TTestStatementWriter.TestAssignmentStatementAddCompact;
 begin
   TestAssignment('Add assignment',TJSAddEqAssignStatement,'a+=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementSubtract;
+procedure TTestStatementWriter.TestAssignmentStatementSubtract;
 begin
   TestAssignment('Subtract assignment',TJSSubEqAssignStatement,'a -= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementSubtractCompact;
+procedure TTestStatementWriter.TestAssignmentStatementSubtractCompact;
 begin
   TestAssignment('Subtract assignment',TJSSubEqAssignStatement,'a-=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementMultiply;
+procedure TTestStatementWriter.TestAssignmentStatementMultiply;
 begin
   TestAssignment('Multiply assignment',TJSMulEqAssignStatement,'a *= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementMultiplyCompact;
+procedure TTestStatementWriter.TestAssignmentStatementMultiplyCompact;
 begin
   TestAssignment('Multiply assignment',TJSMulEqAssignStatement,'a*=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementDivide;
+procedure TTestStatementWriter.TestAssignmentStatementDivide;
 begin
   TestAssignment('Divide assignment',TJSDivEqAssignStatement,'a /= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementDivideCompact;
+procedure TTestStatementWriter.TestAssignmentStatementDivideCompact;
 begin
   TestAssignment('Divide assignment',TJSDivEqAssignStatement,'a/=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementShift;
+procedure TTestStatementWriter.TestAssignmentStatementShift;
 begin
   TestAssignment('Shift assignment',TJSLShiftEqAssignStatement,'a <<= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementShiftCompact;
+procedure TTestStatementWriter.TestAssignmentStatementShiftCompact;
 begin
   TestAssignment('Shift assignment',TJSLShiftEqAssignStatement,'a<<=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementRShift;
+procedure TTestStatementWriter.TestAssignmentStatementRShift;
 begin
   TestAssignment('RShift assignment',TJSRShiftEqAssignStatement,'a >>= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementRShiftCompact;
+procedure TTestStatementWriter.TestAssignmentStatementRShiftCompact;
 begin
   TestAssignment('RShift assignment',TJSRShiftEqAssignStatement,'a>>=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementURShift;
+procedure TTestStatementWriter.TestAssignmentStatementURShift;
 begin
   TestAssignment('URShift assignment',TJSURShiftEqAssignStatement,'a >>>= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementURShiftCompact;
+procedure TTestStatementWriter.TestAssignmentStatementURShiftCompact;
 begin
   TestAssignment('URShift assignment',TJSURShiftEqAssignStatement,'a>>>=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementMod;
+procedure TTestStatementWriter.TestAssignmentStatementMod;
 begin
   TestAssignment('Mod assignment',TJSModEqAssignStatement,'a %= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementModCompact;
+procedure TTestStatementWriter.TestAssignmentStatementModCompact;
 begin
   TestAssignment('Mod assignment',TJSModEqAssignStatement,'a%=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementBinaryOr;
+procedure TTestStatementWriter.TestAssignmentStatementBinaryOr;
 begin
   TestAssignment('Binary or assignment',TJSOrEqAssignStatement,'a |= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementBinaryOrCompact;
+procedure TTestStatementWriter.TestAssignmentStatementBinaryOrCompact;
 begin
   TestAssignment('Binary or assignment',TJSOrEqAssignStatement,'a |= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementBinaryXOr;
+procedure TTestStatementWriter.TestAssignmentStatementBinaryXOr;
 begin
   TestAssignment('Binary xor assignment',TJSXOrEqAssignStatement,'a ^= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementBinaryXOrCompact;
+procedure TTestStatementWriter.TestAssignmentStatementBinaryXOrCompact;
 begin
   TestAssignment('Binary xor assignment',TJSXOrEqAssignStatement,'a^=b',True);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementBinaryAnd;
+procedure TTestStatementWriter.TestAssignmentStatementBinaryAnd;
 begin
   TestAssignment('Binary and assignment',TJSAndEqAssignStatement,'a &= b',False);
 end;
 
-Procedure TTestStatementWriter.TestAssignmentStatementBinaryAndCompact;
+procedure TTestStatementWriter.TestAssignmentStatementBinaryAndCompact;
 begin
   TestAssignment('Binary and assignment',TJSAndEqAssignStatement,'a&=b',True);
 end;
 
-Procedure TTestStatementWriter.TestForStatementEmpty;
+procedure TTestStatementWriter.TestForStatementEmpty;
 
 Var
   S : TJSForStatement;
@@ -1136,7 +1137,7 @@ begin
   AssertWrite('neverending for','for (; ; ) {'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestForStatementFull;
+procedure TTestStatementWriter.TestForStatementFull;
 
 Var
   S : TJSForStatement;
@@ -1189,7 +1190,7 @@ begin
     +'}',S);
 end;
 
-Procedure TTestStatementWriter.TestForStatementCompact;
+procedure TTestStatementWriter.TestForStatementCompact;
 Var
   S : TJSForStatement;
   UPP : TJSUnaryPostPlusPlusExpression;
@@ -1214,7 +1215,72 @@ begin
   AssertWrite('for i:=0 to 9','for (i=0; i<10; i++) {}',S);
 end;
 
-Procedure TTestStatementWriter.TestForInStatement;
+procedure TTestStatementWriter.TestForStatement2loops2inits;
+var
+  L: TJSStatementList;
+
+  function CreateIdent(aName: string): TJSPrimaryExpressionIdent;
+  begin
+    Result:=TJSPrimaryExpressionIdent.Create(0,0);
+    Result.Name:=TJSString(aName);
+  end;
+
+  function CreateNumber(i: TJSNumber): TJSLiteral;
+  begin
+    Result:=TJSLiteral.Create(0,0);
+    Result.Value.AsNumber:=i;
+  end;
+
+  function CreateAssignSt(LHS, Expr: TJSElement): TJSSimpleAssignStatement;
+  begin
+    Result:=TJSSimpleAssignStatement.Create(0,0);
+    Result.LHS:=LHS;
+    Result.Expr:=Expr;
+  end;
+
+  function CreateFor(LoopVar, LoopEndVar: string; StartExpr, EndExpr: TJSElement;
+    Up: boolean; Target: string): TJSForStatement;
+  var
+    V: TJSVariableStatement;
+    C: TJSCommaExpression;
+  begin
+    Result:=TJSForStatement.Create(0,0);
+    V:=TJSVariableStatement.Create(0,0);
+    Result.Init:=V;
+    C:=TJSCommaExpression.Create(0,0);
+    V.A:=C;
+    C.A:=CreateAssignSt(CreateIdent(LoopVar),StartExpr);
+    C.B:=CreateAssignSt(CreateIdent(LoopEndVar),EndExpr);
+
+    if Up then
+      Result.Cond:=TJSRelationalExpressionLE.Create(0,0)
+    else
+      Result.Cond:=TJSRelationalExpressionGE.Create(0,0);
+    TJSRelationalExpression(Result.Cond).A:=CreateIdent(LoopVar);
+    TJSRelationalExpression(Result.Cond).B:=CreateIdent(LoopEndVar);
+
+    if Up then
+      Result.Incr:=TJSUnaryPostPlusPlusExpression.Create(0,0)
+    else
+      Result.Incr:=TJSUnaryPostMinusMinusExpression.Create(0,0);
+    TJSUnaryExpression(Result.Incr).A:=CreateIdent(LoopVar);
+
+    Result.Body:=CreateAssignSt(CreateIdent(Target),CreateIdent(LoopVar));
+  end;
+
+begin
+  L:=TJSStatementList.Create(0,0);
+  L.A:=CreateFor('$loop1','$loopend2',CreateNumber(3),CreateNumber(5),true,'$mod.i');
+  L.B:=CreateFor('$loop3','$loopend4',CreateNumber(10),CreateNumber(7),false,'$mod.i');
+  AssertWrite('for i:=3 to 5 do ; for i:=10 downto 7 do ;',
+    '{'+LineEnding
+    +'for (var $loop1 = 3, $loopend2 = 5; $loop1 <= $loopend2; $loop1++) $mod.i = $loop1;'+LineEnding
+    +'for (var $loop3 = 10, $loopend4 = 7; $loop3 >= $loopend4; $loop3--) $mod.i = $loop3;'+LineEnding
+    +'}'
+    ,L);
+end;
+
+procedure TTestStatementWriter.TestForInStatement;
 
 Var
   S : TJSForInStatement;
@@ -1227,7 +1293,7 @@ begin
   AssertWrite('for a in b','for (a in b) {'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestWhileStatement;
+procedure TTestStatementWriter.TestWhileStatement;
 Var
   S : TJSWhileStatement;
 
@@ -1238,7 +1304,7 @@ begin
   AssertWrite('while a ','while (a) {'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestDoWhileStatement;
+procedure TTestStatementWriter.TestDoWhileStatement;
 
 Var
   S : TJSDoWhileStatement;
@@ -1250,7 +1316,7 @@ begin
   AssertWrite('do while a ','do {'+sLineBreak+'} while (a)',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementEmpty;
+procedure TTestStatementWriter.TestSwitchStatementEmpty;
 Var
   S : TJSSwitchStatement;
 
@@ -1260,7 +1326,7 @@ begin
   AssertWrite('switch ','switch (a) {'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementEmptyCompact;
+procedure TTestStatementWriter.TestSwitchStatementEmptyCompact;
 
 Var
   S : TJSSwitchStatement;
@@ -1272,7 +1338,7 @@ begin
   AssertWrite('switch ','switch (a) {}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementOneElement;
+procedure TTestStatementWriter.TestSwitchStatementOneElement;
 
 Var
   S : TJSSwitchStatement;
@@ -1287,7 +1353,7 @@ begin
   AssertWrite('switch ','switch (a) {'+sLineBreak+'case c:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementOneElementCompact;
+procedure TTestStatementWriter.TestSwitchStatementOneElementCompact;
 Var
   S : TJSSwitchStatement;
   C : TJSCaseElement;
@@ -1301,7 +1367,7 @@ begin
   AssertWrite('switch ','switch (a) {case c: {}}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementTwoElements;
+procedure TTestStatementWriter.TestSwitchStatementTwoElements;
 Var
   S : TJSSwitchStatement;
   C : TJSCaseElement;
@@ -1318,7 +1384,7 @@ begin
   AssertWrite('switch ','switch (a) {'+sLineBreak+'case c:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'case d:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementTwoElementsCompact;
+procedure TTestStatementWriter.TestSwitchStatementTwoElementsCompact;
 
 Var
   S : TJSSwitchStatement;
@@ -1336,7 +1402,7 @@ begin
   AssertWrite('switch ','switch (a) {case c: {} case d: {}}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementTwoElementsDefault;
+procedure TTestStatementWriter.TestSwitchStatementTwoElementsDefault;
 Var
   S : TJSSwitchStatement;
   C : TJSCaseElement;
@@ -1355,7 +1421,7 @@ begin
   AssertWrite('switch ','switch (a) {'+sLineBreak+'case c:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'case d:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'default:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementTwoElementsDefaultCompact;
+procedure TTestStatementWriter.TestSwitchStatementTwoElementsDefaultCompact;
 Var
   S : TJSSwitchStatement;
   C : TJSCaseElement;
@@ -1375,7 +1441,7 @@ begin
   AssertWrite('switch ','switch (a) {case c: {} case d: {} default: {}}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementTwoElementsOneEmpty;
+procedure TTestStatementWriter.TestSwitchStatementTwoElementsOneEmpty;
 Var
   S : TJSSwitchStatement;
   C : TJSCaseElement;
@@ -1402,7 +1468,7 @@ begin
     +'}',S);
 end;
 
-Procedure TTestStatementWriter.TestSwitchStatementTwoElementsOneEmptyCompact;
+procedure TTestStatementWriter.TestSwitchStatementTwoElementsOneEmptyCompact;
 Var
   S : TJSSwitchStatement;
   C : TJSCaseElement;
@@ -1421,7 +1487,7 @@ begin
   AssertWrite('switch ','switch (a) {case c: case d: {} default: {}}',S);
 end;
 
-Procedure TTestStatementWriter.TestIfThen;
+procedure TTestStatementWriter.TestIfThen;
 Var
   S : TJSIfStatement;
 
@@ -1433,7 +1499,7 @@ begin
   AssertWrite('if then','if (a) {'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestIfThenElse;
+procedure TTestStatementWriter.TestIfThenElse;
 Var
   S : TJSIfStatement;
 
@@ -1449,7 +1515,7 @@ begin
     +'}',S);
 end;
 
-Procedure TTestStatementWriter.TestStatementListEmpty;
+procedure TTestStatementWriter.TestStatementListEmpty;
 Var
   S : TJSStatementList;
 
@@ -1459,7 +1525,7 @@ begin
   AssertWrite('Statement list','{'+sLineBreak+'}',S);
 end;
 
-Procedure TTestStatementWriter.TestStatementListEmptyCompact;
+procedure TTestStatementWriter.TestStatementListEmptyCompact;
 Var
   S : TJSStatementList;
 
@@ -1469,7 +1535,7 @@ begin
   AssertWrite('Statement list','{}',S);
 end;
 
-Procedure TTestStatementWriter.TestStatementListOneStatement;
+procedure TTestStatementWriter.TestStatementListOneStatement;
 Var
   S : TJSStatementList;
 begin
@@ -1482,7 +1548,7 @@ begin
     +'}',S);
 end;
 
-Procedure TTestStatementWriter.TestStatementListOneStatementCompact;
+procedure TTestStatementWriter.TestStatementListOneStatementCompact;
 
 Var
   S : TJSStatementList;
@@ -1494,7 +1560,7 @@ begin
   AssertWrite('Statement list','{a=b}',S);
 end;
 
-Procedure TTestStatementWriter.TestStatementListTwoStatements;
+procedure TTestStatementWriter.TestStatementListTwoStatements;
 Var
   S : TJSStatementList;
 
@@ -1510,7 +1576,7 @@ begin
     +'}',S);
 end;
 
-Procedure TTestStatementWriter.TestStatementListTwoStatementsCompact;
+procedure TTestStatementWriter.TestStatementListTwoStatementsCompact;
 Var
   S : TJSStatementList;
 
@@ -1537,7 +1603,7 @@ begin
     +'}',S);
 end;
 
-Procedure TTestStatementWriter.TestEmptyFunctionDef;
+procedure TTestStatementWriter.TestEmptyFunctionDef;
 
 Var
   FD : TJSFunctionDeclarationStatement;
@@ -1551,7 +1617,7 @@ begin
     +'}',FD);
 end;
 
-Procedure TTestStatementWriter.TestEmptyFunctionDefCompact;
+procedure TTestStatementWriter.TestEmptyFunctionDefCompact;
 
 Var
   FD : TJSFunctionDeclarationStatement;
@@ -1564,7 +1630,7 @@ begin
   AssertWrite('Empty function, compact','function a() {}',FD);
 end;
 
-Procedure TTestStatementWriter.TestFunctionDefParams;
+procedure TTestStatementWriter.TestFunctionDefParams;
 Var
   FD : TJSFunctionDeclarationStatement;
 
@@ -1582,7 +1648,7 @@ begin
     +'}',FD);
 end;
 
-Procedure TTestStatementWriter.TestFunctionDefParamsCompact;
+procedure TTestStatementWriter.TestFunctionDefParamsCompact;
 
 Var
   FD : TJSFunctionDeclarationStatement;
@@ -1598,7 +1664,7 @@ begin
   AssertWrite('Empty function, 3 params, compact','function a(b,c,d) {}',FD);
 end;
 
-Procedure TTestStatementWriter.TestFunctionDefBody1;
+procedure TTestStatementWriter.TestFunctionDefBody1;
 
 Var
   FD : TJSFunctionDeclarationStatement;
@@ -1620,7 +1686,7 @@ begin
     +'}',FD);
 end;
 
-Procedure TTestStatementWriter.TestFunctionDefBody1Compact;
+procedure TTestStatementWriter.TestFunctionDefBody1Compact;
 Var
   FD : TJSFunctionDeclarationStatement;
   R : TJSReturnStatement;
@@ -1638,7 +1704,7 @@ begin
   AssertWrite('1 statement, compact','function a() {return 0; }',FD);
 end;
 
-Procedure TTestStatementWriter.TestFunctionDefBody2;
+procedure TTestStatementWriter.TestFunctionDefBody2;
 Var
   FD : TJSFunctionDeclarationStatement;
   R : TJSReturnStatement;
@@ -1673,7 +1739,7 @@ begin
     +'}',FD);
 end;
 
-Procedure TTestStatementWriter.TestFunctionDefBody2Compact;
+procedure TTestStatementWriter.TestFunctionDefBody2Compact;
 Var
   FD : TJSFunctionDeclarationStatement;
   R : TJSReturnStatement;
@@ -1704,7 +1770,7 @@ begin
   AssertWrite('Function, 2 statements, compact','function a(b) {b=b*10; return b}',FD);
 end;
 
-Procedure TTestStatementWriter.TestTryCatch;
+procedure TTestStatementWriter.TestTryCatch;
 
 Var
   T : TJSTryCatchStatement;
@@ -1734,7 +1800,7 @@ begin
     +'}',T);
 end;
 
-Procedure TTestStatementWriter.TestTryCatchCompact;
+procedure TTestStatementWriter.TestTryCatchCompact;
 Var
   T : TJSTryCatchStatement;
   A : TJSAssignStatement;
@@ -1759,7 +1825,7 @@ begin
   AssertWrite('Try catch compact','try {b=b*10} catch (e) {b=1}',T);
 end;
 
-Procedure TTestStatementWriter.TestTryFinally;
+procedure TTestStatementWriter.TestTryFinally;
 
 Var
   T : TJSTryFinallyStatement;
@@ -1789,7 +1855,7 @@ begin
    +'}',T);
 end;
 
-Procedure TTestStatementWriter.TestTryFinallyCompact;
+procedure TTestStatementWriter.TestTryFinallyCompact;
 
 Var
   T : TJSTryFinallyStatement;
@@ -1815,7 +1881,7 @@ begin
   AssertWrite('Try finally compact','try {b=b*10} finally {b=1}',T);
 end;
 
-Procedure TTestStatementWriter.TestTryCatchFinally;
+procedure TTestStatementWriter.TestTryCatchFinally;
 Var
   T : TJSTryCatchFinallyStatement;
   A : TJSAssignStatement;
@@ -1849,7 +1915,7 @@ begin
     +'  b = 1'+sLineBreak+'}',T);
 end;
 
-Procedure TTestStatementWriter.TestTryCatchFinallyCompact;
+procedure TTestStatementWriter.TestTryCatchFinallyCompact;
 Var
   T : TJSTryCatchFinallyStatement;
   A : TJSAssignStatement;
@@ -1878,7 +1944,7 @@ begin
   AssertWrite('Try finally ','try {b=b*10} catch (e) {b=10} finally {b=1}',T);
 end;
 
-Procedure TTestStatementWriter.TestWith;
+procedure TTestStatementWriter.TestWith;
 Var
   T : TJSWithStatement;
   A : TJSAssignStatement;
@@ -1899,7 +1965,7 @@ begin
   AssertWrite('With statement ','with (e)'+slineBreak+'  b = b * 10',T);
 end;
 
-Procedure TTestStatementWriter.TestWithCompact;
+procedure TTestStatementWriter.TestWithCompact;
 Var
   T : TJSWithStatement;
   A : TJSAssignStatement;
@@ -1920,7 +1986,7 @@ begin
   AssertWrite('With statement ','with (e) b=b*10',T);
 end;
 
-Procedure TTestStatementWriter.TestSourceElements;
+procedure TTestStatementWriter.TestSourceElements;
 Var
   T : TJSSourceElements;
   A : TJSAssignStatement;
@@ -1947,7 +2013,7 @@ begin
   AssertWrite('Statement lists ','b = b * 10;'+sLineBreak+'c = c * 2;'+sLineBreak,T);
 end;
 
-Procedure TTestStatementWriter.TestSourceElementsCompact;
+procedure TTestStatementWriter.TestSourceElementsCompact;
 Var
   T : TJSSourceElements;
   A : TJSAssignStatement;
@@ -2466,18 +2532,36 @@ Procedure TTestJSWriter.AssertResult(Const Msg, Result: String);
 
 Var
   S : AnsiString;
+  p: Integer;
 begin
   S:=FTextWriter.AsAnsistring;
-  AssertEquals(Msg,Result,S);
+  if S=Result then exit;
+  p:=1;
+  while (p<=length(S)) and (p<=length(Result)) and (S[p]=Result[p]) do inc(p);
+  if p>length(S) then
+    AssertEquals(Msg+' (actual too short)',Result,S)
+  else if p>length(Result) then
+    AssertEquals(Msg+' (actual too long)',Result,S)
+  else
+    AssertEquals(Msg+' (diff at '+IntToStr(p)+' "'+S[p]+'")',Result,S);
 end;
 
 Procedure TTestJSWriter.AssertResult(Const Msg: string; Result: UnicodeString);
 
 Var
   S : UnicodeString;
+  p: Integer;
 begin
   S:=FTextWriter.AsUnicodeString;
-  AssertEquals(Msg,String(Result),String(S));
+  if S=Result then exit;
+  p:=1;
+  while (p<=length(S)) and (p<=length(Result)) and (S[p]=Result[p]) do inc(p);
+  if p>length(S) then
+    AssertEquals(Msg+' (actual too short)',String(Result),String(S))
+  else if p>length(Result) then
+    AssertEquals(Msg+' (actual too long)',String(Result),String(S))
+  else
+    AssertEquals(Msg+' (diff at '+IntToStr(p)+' "'+String(S[p])+'")',String(Result),String(S));
 end;
 
 Procedure TTestJSWriter.AssertWrite(Const Msg, Result: String;