DUnitX从字符串转换为整数

时间:2016-02-22 13:37:53

标签: unit-testing delphi delphi-10-seattle dunitx

我的问题类似于this one,但我想传递一个整数数组,而不是一个集合。

每个例子:

[TestCase('TestAdd','[1,2,3,4];[1,2,3,4]',';')]
procedure TestAdd(aValue, aResult: array of integer);

修改DUnitX.Utils似乎是最干净的方法,但我不知道如何进行转换。我的主要问题是,它将如何知道我需要特定的整数数组?我可以利用PTypeInfo中的某些东西吗?

1 个答案:

答案 0 :(得分:4)

你不能使用开放数组,因为RTTI缺少代码来调用带有这些参数的方法(实际上由两个参数实现)。因此,您需要更改签名以使用TArray<T>或任何其他动态数组类型。

然后对DUnitX.Utils的修改非常简单 - 只需将此函数添加到tkUString-&gt; tkDynArray的Conversions数组中(任何可能的优化都留给读者练习):

function ConvStr2DynArray(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean;
var
  s: string;
  values: TStringDynArray;
  i: Integer;
  p: Pointer;
  v1, v2: TValue;
  elType: PTypeInfo;
begin
  s := ASource.AsString;
  if StartsStr('[', s) and EndsStr(']', s) then
    s := Copy(s, 2, Length(s) - 2);
  values := SplitString(s, ',');
  i := Length(values);
  p := nil;
  DynArraySetLength(p, ATarget, 1, @i);
  TValue.MakeWithoutCopy(@p, ATarget, AResult);
  elType := ATarget.TypeData.DynArrElType^;
  for i := 0 to High(values) do
  begin
    v1 := TValue.FromString(values[i]);
    if not v1.TryConvert(elType, v2) then
      Exit(False);
    AResult.SetArrayElement(i, v2);
  end;
  Result := True;
end;