Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi DUnitX und Arrays (https://www.delphipraxis.net/193866-dunitx-und-arrays.html)

Ghostwalker 18. Sep 2017 09:35

DUnitX und Arrays
 
moinmoin,

da ich recht neu bin in Sachen Unittests, hab ich einfach mal ein wenig rumgespielt damit. Dabei bin ich auf folgendes Problem gestoßen:

Delphi-Quellcode:
Type
  TCalcUnits = (cuHl,cuLiter,cuDez,cMil);
  TResultArray = array[TCalcUnit] of Int64;

function CalcUnits(avalue:int64):TResultArray;
Das is der zu testende Code. Soweit nix komplexes.

Delphi-Quellcode:
   :
   [Test]
   [TestCase('Test 1','1234;[1,2,3,4]',';')]
   [TestCase('Test 1','7832;[7,8,3,2]',';')]
   Procedure TestCalcUnits(const avalue:int64;expected:TResultArray);
   :
   Procedure TestClass.TestCalcUnits(const avalue:int64;expected:TResultArray);
   var
     realResult : TResultArray;

   begin
     realResult := CalcUnits(avalue);
     Assert.AreEqual(expected,realResult,'passed');
   end;
Der Testcode dazu, wie ich dachte, das es funktionieren sollte. Was es aber nicht tut.

expected ist immer (0,0,0,0). Ändere ich expected auf const/var schreit er, das die parameter vom gleichen
Type sein müssen.

Wie muss ich das angeben, das er expected korrekt befüllt ?

Der schöne Günther 18. Sep 2017 10:51

AW: DUnitX und Arrays
 
Ein "Workaround" wäre doch zunächst die ganz normal einen eigenen Test für diese exakten Ein- und Ausgaben zu machen, oder? Ich persönlich fände das auch übersichtlicher, vielleicht auch nur weil ich DUnitX nicht gewohnt bin und es weiterhin "klassisch" mit DUnit mache.

Siehe auch:
https://stackoverflow.com/questions/35009927/
und
https://stackoverflow.com/questions/35555128/

Anscheinend müsste man in
Delphi-Quellcode:
DUnitX.Utils
die vorgefertigen Konvertierungen anpassen, denn zumindest das [0,0,0,0] kann ich nachvollziehen, das statische Array scheint er nicht auflösen zu können.

Stevie 18. Sep 2017 10:56

AW: DUnitX und Arrays
 
Wird derzeit nicht unterstützt, kannst du aber einfach einbauen - gehe dazu in die DUnitX.Utils unit und füge diese Routine hinzu:

Delphi-Quellcode:
function ConvStr2Arr(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean;
var
  lValue: string;
  lValues: TStringDynArray;
  lArrayData: TArrayTypeData;
  elType: PTypeInfo;
  tmp: TValue;
  i: Integer;
begin
  lValue := ASource.AsString;
  if Length(lValue) < 2 then
    Exit(False);
  if (lValue[1] <> '[') or (lValue[Length(lValue)] <> ']') then
    Exit(False);
  lValue := Copy(lValue, 2, Length(lValue) - 2);
  lValues := SplitString(lValue, ',');
  // todo: support multi dim arrays - assume one dim for now
  lArrayData := GetTypeData(ATarget).ArrayData;
  elType := lArrayData.ElType^;
  if Length(lValues) <> lArrayData.ElCount then
    Exit(False);
  TValue.Make(nil, ATarget, AResult);
  for i := 0 to lArrayData.ElCount - 1 do
  begin
    if not TValue.From(lValues[i]).TryConvert(elType, tmp) then
      Exit(False);
    AResult.SetArrayElement(i, tmp);
  end;
  Result := True;
end;
Außerdem musst du sie noch in das Conversions Array bei [tkUString,tkArray] eintragen.

P.S. Dann klappt das übrigens auch mit dem const.

Ghostwalker 18. Sep 2017 15:16

AW: DUnitX und Arrays
 
Danke Stevie, hat geklappt :):thumb::thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz