2016-02-22 2 views
2

Мой вопрос похож на this one, но вместо набора я хотел бы передать массив целых чисел.DUnitX Преобразование из строки в массив целых чисел

Per Например:

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

Изменение DUnitX.Utils кажется, чистейшей подход, но я не уверен, как идти о выполнении преобразования. Мой главный вопрос: как он узнает, что мне нужен конкретный массив из целых чисел? Есть ли что-то в PTypeInfo, которое я могу использовать?

ответ

4

Вы не можете использовать открытый массив, потому что RTTI не хватает кода для вызова методов с такими аргументами (которые реализуются фактически двумя аргументами под капотом). Поэтому вам нужно изменить подпись, чтобы использовать TArray<T> или любой другой тип динамического массива.

Тогда модификация DUnitX.Utils очень легко - просто добавить эту функцию в массив Конверсии для tkUString-> tkDynArray (любая возможная оптимизация остается в качестве упражнения для читателя):

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; 
+0

я добавил (и добавила его в матрицу преобразования) и изменила мой тест на использование TArray , но массивы не инициализированы, что приводит к AV в моем тесте. Есть что-то еще, что мне не хватает? – ColinM

+0

Убедитесь, что ваш проект использует ваши модификации DUnitX (а не устройства, которые поставляются в Сиэтле). –

+0

Я изменил установленный в Program Files. Нужно ли мне что-то делать, чтобы заставить его перестроить или что-то еще? – ColinM

Смежные вопросы