Browse Source

* Hopefully fix bug #29722 (wrong handling of TTestItem list)

git-svn-id: trunk@33206 -
michael 9 years ago
parent
commit
caec08e795

+ 6 - 6
packages/fcl-fpcunit/src/consoletestrunner.pas

@@ -295,8 +295,8 @@ Var
   I : Integer;
   I : Integer;
 begin
 begin
   If (T is TTestSuite) then
   If (T is TTestSuite) then
-    for I:=0 to TTestSuite(t).Tests.Count-1 do
-      FreeDecorators(TTest(TTestSuite(t).Tests[i]));
+    for I:=0 to TTestSuite(t).ChildTestCount-1 do
+      FreeDecorators(TTest(TTestSuite(t).Test[i]));
   if (T is TTestDecorator) and (TTestDecorator(T).Test is TDecoratorTestSuite) then
   if (T is TTestDecorator) and (TTestDecorator(T).Test is TDecoratorTestSuite) then
     T.free;
     T.free;
 end;
 end;
@@ -339,7 +339,7 @@ procedure TTestRunner.DoRun;
         begin
         begin
         if (test is ttestsuite) then
         if (test is ttestsuite) then
           begin
           begin
-          for I := 0 to TTestSuite(test).Tests.Count - 1 do
+          for I := 0 to TTestSuite(test).ChildTestCount - 1 do
              CheckTestRegistry ((test as TTestSuite).Test[I], c, res)
              CheckTestRegistry ((test as TTestSuite).Test[I], c, res)
           end
           end
         else if (test is TTestDecorator) then
         else if (test is TTestDecorator) then
@@ -391,7 +391,7 @@ begin
     S := '';
     S := '';
     S := GetOptionValue('suite');
     S := GetOptionValue('suite');
     if S = '' then
     if S = '' then
-      for I := 0 to GetTestRegistry.Tests.Count - 1 do
+      for I := 0 to GetTestRegistry.ChildTestCount - 1 do
         writeln(GetTestRegistry[i].TestName)
         writeln(GetTestRegistry[i].TestName)
     else
     else
       begin
       begin
@@ -402,13 +402,13 @@ begin
             P:=Pos(',',S);
             P:=Pos(',',S);
             if P = 0 Then
             if P = 0 Then
               begin
               begin
-                for I := 0 to GetTestRegistry.Tests.count-1 do
+                for I := 0 to GetTestRegistry.ChildTestCount-1 do
                   CheckTestRegistry (GetTestregistry[I], S, TS);
                   CheckTestRegistry (GetTestregistry[I], S, TS);
                 S := '';
                 S := '';
               end
               end
             else
             else
               begin
               begin
-                for I := 0 to GetTestRegistry.Tests.count-1 do
+                for I := 0 to GetTestRegistry.ChildTestCount-1 do
                   CheckTestRegistry (GetTestregistry[I],Copy(S, 1,P - 1), TS);
                   CheckTestRegistry (GetTestregistry[I],Copy(S, 1,P - 1), TS);
                 Delete(S, 1, P);
                 Delete(S, 1, P);
               end;
               end;

+ 9 - 1
packages/fcl-fpcunit/src/fpcunit.pp

@@ -241,6 +241,7 @@ type
     FTestSuiteName: string;
     FTestSuiteName: string;
     FEnableIgnores: boolean;
     FEnableIgnores: boolean;
     function GetTest(Index: integer): TTest;
     function GetTest(Index: integer): TTest;
+    function GetTestCount: Integer;
   protected
   protected
     Function DoAddTest(ATest : TTest) : Integer;
     Function DoAddTest(ATest : TTest) : Integer;
     function GetTestName: string; override;
     function GetTestName: string; override;
@@ -263,9 +264,11 @@ type
     procedure AddTestSuiteFromClass(ATestClass: TClass); virtual;
     procedure AddTestSuiteFromClass(ATestClass: TClass); virtual;
     class function Warning(const aMessage: string): TTestCase;
     class function Warning(const aMessage: string): TTestCase;
     property Test[Index: integer]: TTest read GetTest; default;
     property Test[Index: integer]: TTest read GetTest; default;
+    Property ChildTestCount : Integer Read GetTestCount;
     property TestSuiteName: string read GetTestSuiteName write SetTestSuiteName;
     property TestSuiteName: string read GetTestSuiteName write SetTestSuiteName;
     property TestName: string read GetTestName write SetTestName;
     property TestName: string read GetTestName write SetTestName;
-    property Tests: TFPList read FTests;
+    // Only for backwards compatibility. Use Test and ChildTestCount.
+    property Tests: TFPList read FTests; deprecated;
   end;
   end;
   
   
   TProtect = procedure(aTest: TTest; aResult: TTestResult);
   TProtect = procedure(aTest: TTest; aResult: TTestResult);
@@ -1199,6 +1202,11 @@ begin
   Result := TTestItem(FTests[Index]).Test;
   Result := TTestItem(FTests[Index]).Test;
 end;
 end;
 
 
+function TTestSuite.GetTestCount: Integer;
+begin
+  Result:=FTests.Count;
+end;
+
 function TTestSuite.DoAddTest(ATest: TTest): Integer;
 function TTestSuite.DoAddTest(ATest: TTest): Integer;
 begin
 begin
   Result:=FTests.Add(TTestItem.Create(ATest));
   Result:=FTests.Add(TTestItem.Create(ATest));

+ 1 - 1
packages/fcl-fpcunit/src/latextestreport.pp

@@ -257,7 +257,7 @@ var
 begin
 begin
   Result := TLatexResultsWriter.EscapeText(aSuite.TestSuiteName) + System.sLineBreak;
   Result := TLatexResultsWriter.EscapeText(aSuite.TestSuiteName) + System.sLineBreak;
   Result := Result + '\begin{itemize}'+ System.sLineBreak;
   Result := Result + '\begin{itemize}'+ System.sLineBreak;
-  for i := 0 to aSuite.CountTestCases - 1 do
+  for i := 0 to aSuite.ChildTestCount - 1 do
     if ASuite.Test[i] is TTestSuite then
     if ASuite.Test[i] is TTestSuite then
       begin
       begin
       Result:=Result + '\item[-] ';
       Result:=Result + '\item[-] ';

+ 1 - 1
packages/fcl-fpcunit/src/plaintestreport.pp

@@ -214,7 +214,7 @@ var
   p : string;
   p : string;
 begin
 begin
   Result := Prefix+ASuite.TestName+System.sLineBreak;
   Result := Prefix+ASuite.TestName+System.sLineBreak;
-  for i := 0 to aSuite.CountTestCases - 1 do
+  for i := 0 to aSuite.ChildTestCount - 1 do
     if aSuite.Test[i] is TTestSuite then
     if aSuite.Test[i] is TTestSuite then
       begin
       begin
       P:=Prefix;
       P:=Prefix;

+ 6 - 10
packages/fcl-fpcunit/src/testregistry.pp

@@ -63,7 +63,7 @@ var
   lSuiteName: String;
   lSuiteName: String;
   lPathRemainder: String;
   lPathRemainder: String;
   lDotPos: Integer;
   lDotPos: Integer;
-  lTests: TFPList;
+
 begin
 begin
   if APath = '' then
   if APath = '' then
   begin
   begin
@@ -89,19 +89,15 @@ begin
 
 
     // Check to see if the path already exists
     // Check to see if the path already exists
     lTargetSuite := nil;
     lTargetSuite := nil;
-    lTests := ARootSuite.Tests;
-    for i := 0 to lTests.Count -1 do
-    begin
-      lCurrentTest := TTest(lTests[i]);
-      if lCurrentTest is TTestSuite then
+    I:=0;
+    While (lTargetSuite=Nil) and (I<ARootSuite.ChildTestCount) do
       begin
       begin
+      lCurrentTest:= ARootSuite.Test[i];
+      if lCurrentTest is TTestSuite then
         if (lCurrentTest.TestName = lSuiteName) then
         if (lCurrentTest.TestName = lSuiteName) then
-        begin
           lTargetSuite := TTestSuite(lCurrentTest);
           lTargetSuite := TTestSuite(lCurrentTest);
-          break;
-        end;
+      Inc(I);
       end;  { if }
       end;  { if }
-    end;  { for }
 
 
     if not Assigned(lTargetSuite) then
     if not Assigned(lTargetSuite) then
     begin
     begin

+ 47 - 21
packages/fcl-fpcunit/src/testreport.pp

@@ -186,33 +186,59 @@ var
 begin
 begin
   Result := StringOfChar(' ',Indent) + '<TestSuite name="' + ASuite.TestName + '">' + System.sLineBreak;
   Result := StringOfChar(' ',Indent) + '<TestSuite name="' + ASuite.TestName + '">' + System.sLineBreak;
   Inc(Indent, 2);
   Inc(Indent, 2);
-  for i := 0 to aSuite.Tests.Count - 1 do
-    if TTest(aSuite.Tests.Items[i]) is TTestSuite then
-      Result := Result + TestSuiteAsXML(TTestSuite(aSuite.Tests.Items[i]),Indent)
+  for i := 0 to aSuite.ChildTestCount - 1 do
+    if TTest(aSuite.Test[i]) is TTestSuite then
+      Result := Result + TestSuiteAsXML(TTestSuite(aSuite.Test[i]),Indent)
     else
     else
-      if TTest(aSuite.Tests.Items[i]) is TTestCase then
-        Result := Result + StringOfChar(' ',Indent) + '<test>' + TTestcase(aSuite.Tests.Items[i]).TestName + '</test>' + System.sLineBreak;
+      if TTest(aSuite.Test[i]) is TTestCase then
+        Result := Result + StringOfChar(' ',Indent) + '<test>' + TTestcase(aSuite.Test[i]).TestName + '</test>' + System.sLineBreak;
   Dec(Indent, 2);
   Dec(Indent, 2);
   Result := Result + StringOfChar(' ',Indent) + '</TestSuite>' + System.sLineBreak;
   Result := Result + StringOfChar(' ',Indent) + '</TestSuite>' + System.sLineBreak;
 end;
 end;
 
 
+function EscapeText(const S: string): String;
+var
+  i: integer;
+begin
+  SetLength(Result, 0);
+    for i := 1 to Length(S) do
+      case S[i] of
+        '&','{','}','#','_','$','%':     // Escape these characters
+          Result := Result + '\' + S[i];
+        '~','^':
+          Result := Result + '\'+S[i]+' ';
+        '\':
+          Result := Result + '$\backslash$';
+        '<':
+          Result := Result + '$<$';
+        '>':
+          Result := Result + '$>$'
+        else
+          Result := Result + S[i];
+      end;
+end;
 
 
 function TestSuiteAsLatex(aSuite:TTestSuite): string;
 function TestSuiteAsLatex(aSuite:TTestSuite): string;
 var
 var
   i,j: integer;
   i,j: integer;
   s: TTestSuite;
   s: TTestSuite;
 begin
 begin
-  Result := '\flushleft' + System.sLineBreak;
-  for i := 0 to aSuite.Tests.Count - 1 do
-  begin
-    s := TTestSuite(ASuite.Tests.Items[i]);
-    Result := Result + s.TestSuiteName + System.sLineBreak;
-    Result := Result + '\begin{itemize}'+ System.sLineBreak;
-    for j := 0 to s.Tests.Count - 1 do
-      if TTest(s.Tests.Items[j]) is TTestCase then
-        Result := Result + '\item[-] ' + TTestcase(s.Tests.Items[j]).TestName  + System.sLineBreak;
-    Result := Result +'\end{itemize}' + System.sLineBreak;
-  end;
+  Result := EscapeText(aSuite.TestSuiteName) + System.sLineBreak;
+  Result := Result + '\begin{itemize}'+ System.sLineBreak;
+  for i := 0 to aSuite.ChildTestCount - 1 do
+    if ASuite.Test[i] is TTestSuite then
+      begin
+      Result:=Result + '\item[-] ';
+      Result := Result + '\flushleft' + System.sLineBreak;
+      Result:=Result+TestSuiteAsLatex(TTestSuite(ASuite.Test[i]))+System.sLineBreak;
+      end
+    else   
+      begin
+      Result := Result + '\item[-] ' + 
+               EscapeText(TTestcase(aSuite.Test[i]).TestName)
+               + System.sLineBreak;
+      end;    
+  Result := Result +'\end{itemize}' + System.sLineBreak;
 end;
 end;
 
 
 function TestSuiteAsPlain(aSuite:TTestSuite): string;
 function TestSuiteAsPlain(aSuite:TTestSuite): string;
@@ -220,12 +246,12 @@ var
   i,j: integer;
   i,j: integer;
   s: TTestSuite;
   s: TTestSuite;
 begin
 begin
-  for i := 0 to aSuite.Tests.Count - 1 do
-    if TTest(aSuite.Tests.Items[i]) is TTestSuite then
-      Result := Result + TestSuiteAsPlain(TTestSuite(aSuite.Tests.Items[i]))
+  for i := 0 to aSuite.ChildTestCount - 1 do
+    if TTest(aSuite.Test[i]) is TTestSuite then
+      Result := Result + TestSuiteAsPlain(TTestSuite(aSuite.Test[i]))
     else
     else
-      if TTest(aSuite.Tests.Items[i]) is TTestCase then
-        Result := Result + '  ' + ASuite.TestName+'.' + TTestcase(aSuite.Tests.Items[i]).TestName + System.sLineBreak;
+      if TTest(aSuite.Test[i]) is TTestCase then
+        Result := Result + '  ' + ASuite.TestName+'.' + TTestcase(aSuite.Test[i]).TestName + System.sLineBreak;
 end;
 end;
 
 
 function GetSuiteAsXML(aSuite: TTestSuite): string;
 function GetSuiteAsXML(aSuite: TTestSuite): string;

+ 1 - 1
packages/fcl-fpcunit/src/xmltestreport.pp

@@ -112,7 +112,7 @@ begin
     end
     end
   else
   else
     E:=N;
     E:=N;
-  for i:=0 to Pred(aSuite.CountTestCases) do
+  for i:=0 to Pred(aSuite.ChildTestCount) do
     if TTest(aSuite.Test[i]) is TTestSuite then
     if TTest(aSuite.Test[i]) is TTestSuite then
       TestSuiteAsXML(E, FDoc, TTestSuite(aSuite.Test[i]))
       TestSuiteAsXML(E, FDoc, TTestSuite(aSuite.Test[i]))
     else
     else