mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-23 00:59:31 +02:00
IdeDebugger: tests and some fixes
This commit is contained in:
parent
1df670703a
commit
f1adf1893b
@ -453,6 +453,7 @@ type
|
||||
function GetFieldCount: Integer; inline;
|
||||
function GetFieldInfo(AnIndex: Integer): PWatchResultTypeStructFieldInfo; inline;
|
||||
procedure AfterAssign(ATypeOnly: Boolean = False);
|
||||
procedure CopyFieldsProtoFrom(const ASource: TWatchResultTypeStruct); inline;
|
||||
procedure DoFree;
|
||||
end;
|
||||
|
||||
@ -1945,7 +1946,8 @@ begin
|
||||
FFieldData[i].FieldName := AConfig.GetValue(p + 'F-Name', '');
|
||||
AConfig.GetValue(p + 'F-Vis', int64(ord(dfvUnknown)), FFieldData[i].FieldVisibility, TypeInfo(TLzDbgFieldVisibility));
|
||||
AConfig.GetValue(p + 'F-Flg', Zero, FFieldData[i].FieldFlags, TypeInfo(TLzDbgFieldFlags));
|
||||
FFieldData[i].Field := TWatchResultData.CreateFromXMLConfig(AConfig, p);
|
||||
if AConfig.GetValue(p+'Empty', 0) = 0 then
|
||||
FFieldData[i].Field := TWatchResultData.CreateFromXMLConfig(AConfig, p);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1965,7 +1967,12 @@ begin
|
||||
AConfig.SetDeleteValue(p + 'F-Name', FFieldData[i].FieldName, '');
|
||||
AConfig.SetDeleteValue(p + 'F-Vis', FFieldData[i].FieldVisibility, ord(dfvUnknown), TypeInfo(TLzDbgFieldVisibility));
|
||||
AConfig.SetDeleteValue(p + 'F-Flg', FFieldData[i].FieldFlags, 0, TypeInfo(TLzDbgFieldFlags));
|
||||
FFieldData[i].Field.SaveDataToXMLConfig(AConfig, p, AnAsProto);
|
||||
if FFieldData[i].Field <> nil then begin
|
||||
FFieldData[i].Field.SaveDataToXMLConfig(AConfig, p, AnAsProto);
|
||||
AConfig.DeleteValue(p+'Empty');
|
||||
end
|
||||
else
|
||||
AConfig.SetValue(p+'Empty',1);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1990,6 +1997,17 @@ begin
|
||||
FFieldData[i].Field := FFieldData[i].Field.CreateCopy(ATypeOnly);
|
||||
end;
|
||||
|
||||
procedure TWatchResultTypeStruct.CopyFieldsProtoFrom(
|
||||
const ASource: TWatchResultTypeStruct);
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
FFieldData := ASource.FFieldData;
|
||||
SetLength(FFieldData, Length(FFieldData));
|
||||
for i := 0 to Length(FFieldData) - 1 do
|
||||
FFieldData[i].Field := ASource.FFieldData[i].Field.CreateCopy(True);
|
||||
end;
|
||||
|
||||
procedure TWatchResultTypeStruct.DoFree;
|
||||
var
|
||||
i: Integer;
|
||||
@ -3660,6 +3678,9 @@ procedure TGenericWatchResultDataStruct.TNestedFieldsWatchResultStorage.SetStore
|
||||
var
|
||||
i: Integer;
|
||||
begin
|
||||
if AValue = Length(FFieldsStorage) then
|
||||
exit;
|
||||
|
||||
for i := AValue to Length(FFieldsStorage) - 1 do
|
||||
FreeAndNil(FFieldsStorage[i]);
|
||||
SetLength(FFieldsStorage, AValue);
|
||||
@ -3725,10 +3746,14 @@ end;
|
||||
procedure TGenericWatchResultDataStruct.TNestedFieldsWatchResultStorage.SetNestedStorage
|
||||
(AnIndex: Integer; AValue: TWatchResultStorage);
|
||||
begin
|
||||
if AnIndex < 0 then
|
||||
FAnchestorStorage := AValue
|
||||
else
|
||||
if AnIndex < 0 then begin
|
||||
assert((FAnchestorStorage=nil) or (AValue=nil), 'TGenericWatchResultDataStruct.TNestedFieldsWatchResultStorage.SetNestedStorage: (FAnchestorStorage=nil) or (AValue=nil)');
|
||||
FAnchestorStorage := AValue;
|
||||
end
|
||||
else begin
|
||||
assert((FFieldsStorage[AnIndex]=nil) or (AValue=nil), 'TGenericWatchResultDataStruct.TNestedFieldsWatchResultStorage.SetNestedStorage: (FFieldsStorage[AnIndex]=nil) or (AValue=nil)');
|
||||
FFieldsStorage[AnIndex] := AValue;
|
||||
end;
|
||||
|
||||
if AValue <> nil then
|
||||
AValue.Count := Count;
|
||||
@ -3824,6 +3849,18 @@ begin
|
||||
if Result or not ARecurse then
|
||||
exit;
|
||||
|
||||
if (Length(AStructProtoData.FType.FFieldData) = 0) and
|
||||
(Length(FType.FFieldData) > 0)
|
||||
then
|
||||
AStructProtoData.FType.CopyFieldsProtoFrom(FType);
|
||||
assert((Length(FType.FFieldData)=0) or (Length(FType.FFieldData)=Length(AStructProtoData.FType.FFieldData)), 'TGenericWatchResultDataStruct.MaybeUpdateProto: (Length(FType.FFieldData)=0) or (Length(FType.FFieldData)=Length(AStructProtoData.FType.FFieldData))');
|
||||
|
||||
if (AStructProtoData.FType.FAnchestor = nil) and
|
||||
(FType.FAnchestor <> nil)
|
||||
then
|
||||
AStructProtoData.FType.FAnchestor := FType.FAnchestor.CreateCopy(True);
|
||||
|
||||
|
||||
assert((AStorage=nil) or (AStorage^=nil) or (AStorage^ is TNestedFieldsWatchResultStorage), 'TGenericWatchResultDataStruct.MaybeUpdateProto: (AStorage=nil) or (AStorage^=nil) or (AStorage^ is TNestedFieldsWatchResultStorage)');
|
||||
if (AStorage = nil) or (AStorage^ = nil)
|
||||
then begin
|
||||
@ -3843,20 +3880,24 @@ begin
|
||||
assert(dummy = nil, 'TGenericWatchResultDataStruct.MaybeUpdateProto: dummy = nil');
|
||||
end;
|
||||
end;
|
||||
end
|
||||
|
||||
exit;
|
||||
end;
|
||||
else begin
|
||||
if (FieldStore^.StoredFieldCount = 0) then
|
||||
FieldStore^.StoredFieldCount := Length(FType.FFieldData);
|
||||
assert((length(FType.FFieldData)=0) or (FieldStore^.StoredFieldCount = Length(FType.FFieldData)), 'TGenericWatchResultDataStruct.MaybeUpdateProto: (length(FType.FFieldData)=0) or (FieldStore^.StoredFieldCount = Length(FType.FFieldData))');
|
||||
|
||||
for i := 0 to Length(FType.FFieldData) - 1 do begin
|
||||
if FType.FFieldData[i].Field <> nil then begin
|
||||
FType.FFieldData[i].Field.MaybeUpdateProto(AStructProtoData.FType.FFieldData[i].Field,
|
||||
FieldStore^.FOverrideTempl[i], FieldStore^.NestedStoragePtr[i], ARecurse, ASkipStorage);
|
||||
for i := 0 to Length(FType.FFieldData) - 1 do begin
|
||||
if FType.FFieldData[i].Field <> nil then begin
|
||||
FType.FFieldData[i].Field.MaybeUpdateProto(AStructProtoData.FType.FFieldData[i].Field,
|
||||
FieldStore^.FOverrideTempl[i], FieldStore^.NestedStoragePtr[i], ARecurse, ASkipStorage);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
if FType.FAnchestor <> nil then begin
|
||||
FType.FAnchestor.MaybeUpdateProto(AStructProtoData.FType.FAnchestor, AnOverrideTemplate,
|
||||
FieldStore^.NestedStoragePtr[-1], ARecurse, ASkipStorage);
|
||||
if FType.FAnchestor <> nil then begin
|
||||
FType.FAnchestor.MaybeUpdateProto(AStructProtoData.FType.FAnchestor, AnOverrideTemplate,
|
||||
FieldStore^.NestedStoragePtr[-1], ARecurse, ASkipStorage);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -3933,11 +3974,23 @@ begin
|
||||
AStore.NestedStorage[-1].LoadFromIndex(AnIndex, FCurrentAnchestor, FType.FAnchestor, AnOverrideTemplate);
|
||||
end;
|
||||
|
||||
SetLength(FCurrentFields, Length(FType.FFieldData));
|
||||
for i := 0 to Length(FType.FFieldData) - 1 do begin
|
||||
if (AStore.NestedStorage[i] <> nil) then begin
|
||||
AStore.NestedStorage[i].LoadFromIndex(AnIndex, FCurrentFields[i], FType.FFieldData[i].Field, AStore.FOverrideTempl[i]);
|
||||
if AStore.StoredFieldCount = 0 then begin
|
||||
SetLength(FCurrentFields, 0);
|
||||
end
|
||||
else begin
|
||||
assert(AStore.StoredFieldCount = Length(FType.FFieldData), 'TGenericWatchResultDataStruct.AfterLoadFromIndex: AStore.StoredFieldCount = Length(FType.FFieldData)');
|
||||
SetLength(FCurrentFields, Length(FType.FFieldData));
|
||||
if AStore.NestedStorage[0].Count = 0 then begin
|
||||
for i := 0 to Length(FCurrentFields) - 1 do
|
||||
FCurrentFields[i] := nil;
|
||||
end
|
||||
else begin
|
||||
for i := 0 to Length(FType.FFieldData) - 1 do begin
|
||||
if (AStore.NestedStorage[i] <> nil) then begin
|
||||
AStore.NestedStorage[i].LoadFromIndex(AnIndex, FCurrentFields[i], FType.FFieldData[i].Field, AStore.FOverrideTempl[i]);
|
||||
end
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -11,7 +11,39 @@
|
||||
<Icon Value="0"/>
|
||||
</General>
|
||||
<BuildModes>
|
||||
<Item Name="Default" Default="True"/>
|
||||
<Item Name="O1 Criot Sa gh gt" Default="True"/>
|
||||
<Item Name="O1 Criot Sa gh gtttt<nil>">
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
<PathDelim Value="\"/>
|
||||
<Target>
|
||||
<Filename Value="TestIdeDebugger"/>
|
||||
</Target>
|
||||
<SearchPaths>
|
||||
<IncludeFiles Value="$(ProjOutDir)"/>
|
||||
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
|
||||
</SearchPaths>
|
||||
<Parsing>
|
||||
<SyntaxOptions>
|
||||
<IncludeAssertionCode Value="True"/>
|
||||
</SyntaxOptions>
|
||||
</Parsing>
|
||||
<CodeGeneration>
|
||||
<Checks>
|
||||
<IOChecks Value="True"/>
|
||||
<RangeChecks Value="True"/>
|
||||
<OverflowChecks Value="True"/>
|
||||
<StackChecks Value="True"/>
|
||||
</Checks>
|
||||
</CodeGeneration>
|
||||
<Linking>
|
||||
<Debugging>
|
||||
<DebugInfoType Value="dsDwarf3"/>
|
||||
<UseHeaptrc Value="True"/>
|
||||
</Debugging>
|
||||
</Linking>
|
||||
</CompilerOptions>
|
||||
</Item>
|
||||
<Item Name="full test -O3">
|
||||
<CompilerOptions>
|
||||
<Version Value="11"/>
|
||||
@ -71,14 +103,19 @@
|
||||
</Linking>
|
||||
</CompilerOptions>
|
||||
</Item>
|
||||
<SharedMatrixOptions Count="7">
|
||||
<Item1 ID="512719448339" Targets="IdeDebugger" Modes="Default,full test -O3" Value="-Sa"/>
|
||||
<Item2 ID="026959990514" Targets="IdeDebugger" Modes="Default,full test -O3" Value="-Criot"/>
|
||||
<Item3 ID="149801562947" Targets="IdeDebugger" Modes="Default,full test -O3" Value="-gt"/>
|
||||
<Item4 ID="337989334087" Targets="IdeDebugger" Modes="Default,full test -O3" Value="-O-1"/>
|
||||
<Item5 ID="351599647225" Targets="IdeDebugger" Modes="no assert/check -O3 -gh,full test -O3" Value="-O3"/>
|
||||
<Item6 ID="654923802929" Targets="IdeDebugger" Modes="no assert/check -O3 -gh" Value="-Sa- -Cr- -Ci- -Co- -Ct-"/>
|
||||
<Item7 ID="342603141025" Targets="IdeDebugger" Modes="no assert/check -O3 -gh" Value="-Si"/>
|
||||
<SharedMatrixOptions Count="12">
|
||||
<Item1 ID="354904912079" Targets="LazUtils" Modes="full test -O3,no assert/check -O3 -gh" Value="-O-4 -Sa- -Si -Cr- -Ci- -Co- -Ct- -gt-"/>
|
||||
<Item2 ID="337989334087" Targets="IdeDebugger" Modes="full test -O3,O1 Criot Sa gh gt,O1 Criot Sa gh gtttt<nil>" Value="-O-1"/>
|
||||
<Item3 ID="351599647225" Targets="IdeDebugger" Modes="no assert/check -O3 -gh,full test -O3" Value="-O-3"/>
|
||||
<Item4 ID="703841857666" Targets="IdeDebugger" Modes="no assert/check -O3 -gh" Value="-gt-"/>
|
||||
<Item5 ID="149801562947" Targets="IdeDebugger" Modes="full test -O3,O1 Criot Sa gh gt" Value="-gt- -gt"/>
|
||||
<Item6 ID="565851929886" Targets="IdeDebugger" Modes="O1 Criot Sa gh gtttt<nil>" Value="-gt- -gtttt"/>
|
||||
<Item7 ID="538318268753" Targets="IdeDebugger" Modes="O1 Criot Sa gh gt,O1 Criot Sa gh gtttt<nil>,full test -O3" Value="-gh"/>
|
||||
<Item8 ID="512719448339" Targets="IdeDebugger" Modes="full test -O3,O1 Criot Sa gh gt,O1 Criot Sa gh gtttt<nil>" Value="-Sa"/>
|
||||
<Item9 ID="026959990514" Targets="IdeDebugger" Modes="full test -O3,O1 Criot Sa gh gt,O1 Criot Sa gh gtttt<nil>" Value="-Criot"/>
|
||||
<Item10 ID="654923802929" Targets="IdeDebugger" Modes="no assert/check -O3 -gh" Value="-Sa- -Cr- -Ci- -Co- -Ct- -gh-"/>
|
||||
<Item11 ID="874538370462" Targets="IdeDebugger" Modes="O1 Criot Sa gh gt,O1 Criot Sa gh gtttt<nil>" Value="-Si-"/>
|
||||
<Item12 ID="342603141025" Targets="IdeDebugger" Modes="no assert/check -O3 -gh,full test -O3" Value="-Si"/>
|
||||
</SharedMatrixOptions>
|
||||
</BuildModes>
|
||||
<PublishOptions>
|
||||
|
@ -43,10 +43,12 @@ type
|
||||
cdErrPre,
|
||||
cdPtr_ErrNum, cdErrPtr_Num,
|
||||
cdPtr_Ptr_ErrNum, cdPtr_ErrPtr_Num, cdErrPtr_Ptr_Num,
|
||||
cdErrArr_Num, cdArr_EmptyNum,
|
||||
cdErrArr_Num, cdArr_EmptyNum, cdArr_ErrNum,
|
||||
cdPtr_ErrArr_Num,
|
||||
// cdErrStruct,
|
||||
cdStruct_ErrField
|
||||
cdErrStruct, cdStruct_ErrField,
|
||||
cdStruct_Nil, // Instead of error, create struct, but no fields / no field-data
|
||||
cdStruct_ErrEmptyFields
|
||||
//cdStruct_EmptyFields // Add fields, but instead of error, do not create data for the fields
|
||||
);
|
||||
const
|
||||
SecondType: array [TTestCreateDataKind] of array [0..1] of TTestCreateDataKind = (
|
||||
@ -57,10 +59,15 @@ type
|
||||
(cdPtr_Ptr_ErrNum, cdErrPtr_Ptr_Num), // cdPtr_Ptr_ErrNum,
|
||||
(cdPtr_Ptr_ErrNum, cdErrPtr_Ptr_Num), // cdPtr_ErrPtr_Num,
|
||||
(cdPtr_Ptr_ErrNum, cdErrPtr_Ptr_Num), // cdErrPtr_Ptr_Num
|
||||
(cdErrArr_Num, cdArr_EmptyNum), // cdErrArr_Num
|
||||
(cdErrArr_Num, cdArr_EmptyNum), // cdArr_EmptyNum
|
||||
(cdErrArr_Num, cdArr_ErrNum), // cdErrArr_Num
|
||||
(cdErrArr_Num, cdArr_ErrNum), // cdArr_EmptyNum
|
||||
(cdErrArr_Num, cdArr_ErrNum), // cdArr_ErrNum
|
||||
(cdPtr_ErrArr_Num, cdPtr_ErrArr_Num), // cdPtr_ErrArr_Num
|
||||
(cdStruct_ErrField,cdStruct_ErrField)
|
||||
(cdErrStruct, cdStruct_Nil), // cdErrStruct
|
||||
(cdErrStruct, cdStruct_Nil), // cdStruct_ErrField
|
||||
(cdErrStruct, cdStruct_Nil), // cdStruct_Nil
|
||||
(cdStruct_ErrEmptyFields,cdStruct_ErrEmptyFields) //cdStruct_ErrEmptyFields
|
||||
//(cdStruct_EmptyFields, cdStruct_EmptyFields) // cdStruct_EmptyFields
|
||||
);
|
||||
protected
|
||||
class procedure AssertEquals(const AMessage: string; Expected, Actual: TWatchResultDataKind); overload;
|
||||
@ -139,6 +146,10 @@ type
|
||||
ExpTypeName: String = #1;
|
||||
ASaveLoad: Boolean = True; ACreateCopy: Boolean = True
|
||||
);
|
||||
procedure AssertArrayOfErrData(const AMessage: string; IdeRes: TWatchResultData;
|
||||
ExpAnErr: String;
|
||||
ASaveLoad: Boolean = True; ACreateCopy: Boolean = True
|
||||
);
|
||||
procedure AssertEmptyArrayOfNumData(const AMessage: string; IdeRes: TWatchResultData;
|
||||
ExpNum: Int64;
|
||||
ExpTypeName: String = #1;
|
||||
@ -167,7 +178,8 @@ type
|
||||
ExpAnchTypeName: String = #1;
|
||||
ExpTypeName: String = #1;
|
||||
ExpKind: TWatchResultDataKind = rdkUnknown;
|
||||
ASaveLoad: Boolean = True; ACreateCopy: Boolean = True
|
||||
ASaveLoad: Boolean = True; ACreateCopy: Boolean = True;
|
||||
aOnlyFieldData: Boolean = False
|
||||
);
|
||||
|
||||
procedure AssertStructData(const AMessage: string; IdeRes: TWatchResultData;
|
||||
@ -192,7 +204,8 @@ type
|
||||
aEntryType1, aEntryType2: TTestCreateDataKind;
|
||||
aErr1, aErr2: Boolean;
|
||||
aNil: Boolean = False;
|
||||
ExpTypeName: String = ''
|
||||
ExpTypeName: String = '';
|
||||
aOnlyFieldData: Boolean = False
|
||||
);
|
||||
|
||||
function SaveLoad(ARes: TWatchResultData): TWatchResultData;
|
||||
@ -205,6 +218,7 @@ type
|
||||
function CreatePtrPtrNum(ResIntf: TLzDbgWatchDataIntf; AnAddr: QWord; ANum: Int64; AByteSize: integer = 2): TTwoResRecord;
|
||||
function CreatePtrPtrErr(ResIntf: TLzDbgWatchDataIntf; AnAddr: QWord; AnErr: String): TTwoResRecord;
|
||||
function CreateArrayOfNum(ResIntf: TLzDbgWatchDataIntf; ANum: Int64; AByteSize: integer = 2): TTwoResRecord;
|
||||
function CreateArrayOfErr(ResIntf: TLzDbgWatchDataIntf; AnErr: String): TTwoResRecord;
|
||||
function CreateEmptyArrayOfNum(ResIntf: TLzDbgWatchDataIntf; ANum: Int64; AByteSize: integer = 2): TTwoResRecord;
|
||||
function CreatePtrArrayOfNum(ResIntf: TLzDbgWatchDataIntf; ANum: Int64; AByteSize: integer = 2): TTwoResRecord;
|
||||
procedure CreateStruct(ResIntf: TLzDbgWatchDataIntf;
|
||||
@ -214,7 +228,8 @@ type
|
||||
WithAnch1Fld, WithAnch2Fld: Boolean;
|
||||
aEntryType1, aEntryType2: TTestCreateDataKind;
|
||||
aErr1, aErr2: Boolean;
|
||||
aNil: Boolean = False
|
||||
aNil: Boolean = False;
|
||||
aOnlyFieldData: Boolean = False
|
||||
);
|
||||
|
||||
function CreateData(ResIntf: TLzDbgWatchDataIntf;
|
||||
@ -581,6 +596,28 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestIdeDebuggerWatchResult.AssertArrayOfErrData(
|
||||
const AMessage: string; IdeRes: TWatchResultData; ExpAnErr: String;
|
||||
ASaveLoad: Boolean; ACreateCopy: Boolean);
|
||||
var
|
||||
t: TWatchResultData;
|
||||
begin
|
||||
AssertArrayData(AMessage, IdeRes, datDynArray, 1, 0);
|
||||
IdeRes.SetSelectedIndex(0);
|
||||
AssertErrData(AMessage, IdeRes.SelectedEntry, ExpAnErr);
|
||||
|
||||
if ASaveLoad and not SkipSubTestSave then begin
|
||||
t := SaveLoad(IdeRes);
|
||||
AssertArrayOfErrData(AMessage, IdeRes, ExpAnErr, False, False);
|
||||
t.Free;
|
||||
end;
|
||||
if ACreateCopy and not SkipSubTestCopy then begin
|
||||
t := IdeRes.CreateCopy;
|
||||
AssertArrayOfErrData(AMessage, IdeRes, ExpAnErr, False, False);
|
||||
t.Free;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTestIdeDebuggerWatchResult.AssertEmptyArrayOfNumData(
|
||||
const AMessage: string; IdeRes: TWatchResultData; ExpNum: Int64;
|
||||
ExpTypeName: String; ASaveLoad: Boolean; ACreateCopy: Boolean);
|
||||
@ -668,7 +705,7 @@ procedure TTestIdeDebuggerWatchResult.AssertStructField(const AMessage: string;
|
||||
IdeRes: TWatchResultData; TestFieldNum: Integer; ExpName: String;
|
||||
ExpVisibilty: TLzDbgFieldVisibility; ExpFlags: TLzDbgFieldFlags;
|
||||
ExpAnchTypeName: String; ExpTypeName: String; ExpKind: TWatchResultDataKind;
|
||||
ASaveLoad: Boolean; ACreateCopy: Boolean);
|
||||
ASaveLoad: Boolean; ACreateCopy: Boolean; aOnlyFieldData: Boolean);
|
||||
var
|
||||
t: TWatchResultData;
|
||||
FldData: TWatchResultDataFieldInfo;
|
||||
@ -677,18 +714,23 @@ begin
|
||||
AssertTrue(AMessage+': in range', IdeRes.FieldCount > TestFieldNum);
|
||||
|
||||
FldData := IdeRes.Fields[TestFieldNum];
|
||||
AssertTrue(AMessage+': Field not nil', FldData.Field <> nil);
|
||||
if not aOnlyFieldData then
|
||||
AssertTrue(AMessage+': Field not nil', FldData.Field <> nil);
|
||||
AssertTrue(AMessage+': Owner not nil', FldData.Owner <> nil);
|
||||
|
||||
AssertEquals(AMessage+': Field Name', ExpName, FldData.FieldName);
|
||||
AssertEquals(AMessage+': Field Visibility', ord(ExpVisibilty), ord(FldData.FieldVisibility));
|
||||
AssertTrue (AMessage+': Field Flags', ExpFlags = FldData.FieldFlags);
|
||||
|
||||
if ExpKind <> rdkUnknown then
|
||||
if (ExpKind <> rdkUnknown) and
|
||||
(not aOnlyFieldData)
|
||||
then
|
||||
AssertEquals(AMessage + ': VKind', ExpKind, FldData.Field.ValueKind);
|
||||
|
||||
AssertTypeName(AMessage + ': Anch TypeName', FldData.Owner, ExpAnchTypeName);
|
||||
if FldData.Field.ValueKind <> rdkError then
|
||||
if (not aOnlyFieldData) and
|
||||
(FldData.Field.ValueKind <> rdkError)
|
||||
then
|
||||
AssertTypeName(AMessage + ': Field TypeName', FldData.Field, ExpTypeName);
|
||||
|
||||
|
||||
@ -772,7 +814,7 @@ procedure TTestIdeDebuggerWatchResult.AssertStruct(const AMessage: string;
|
||||
IdeRes: TWatchResultData; StrctTyp: TLzDbgStructType; WithFld: Boolean;
|
||||
WithAnch: Integer; WithAnch1Fld, WithAnch2Fld: Boolean; aEntryType1,
|
||||
aEntryType2: TTestCreateDataKind; aErr1, aErr2: Boolean; aNil: Boolean;
|
||||
ExpTypeName: String);
|
||||
ExpTypeName: String; aOnlyFieldData: Boolean);
|
||||
var
|
||||
ExpCnt, ExpOffs: Integer;
|
||||
begin
|
||||
@ -791,32 +833,46 @@ begin
|
||||
AssertStructData('', IdeRes, StrctTyp, 700, ExpCnt, ExpTypeName);
|
||||
ExpOffs := 0;
|
||||
if WithFld then begin
|
||||
if aErr1 and not aErr2 then
|
||||
AssertErrData('', IdeRes.Fields[ExpOffs+0].Field, 'bad')
|
||||
else
|
||||
AssertStructField('', IdeRes, ExpOffs+0, 'Foo', dfvProtected, [], ExpTypeName, 'TMyFoo');
|
||||
if aErr1 and not aErr2 then begin
|
||||
if not aOnlyFieldData then
|
||||
AssertErrData('', IdeRes.Fields[ExpOffs+0].Field, 'bad');
|
||||
end
|
||||
else begin
|
||||
AssertStructField('', IdeRes, ExpOffs+0, 'Foo', dfvProtected, [], ExpTypeName, 'TMyFoo',
|
||||
rdkUnknown, True, True, aOnlyFieldData);
|
||||
end;
|
||||
|
||||
AssertStructField('', IdeRes, ExpOffs+1, 'Abc', dfvPublic, [], ExpTypeName, #1, rdkError);
|
||||
AssertErrData('', IdeRes.Fields[ExpOffs+1].Field, 'ouch');
|
||||
AssertStructField('', IdeRes, ExpOffs+1, 'Abc', dfvPublic, [], ExpTypeName, #1, rdkError,
|
||||
True, True, aOnlyFieldData);
|
||||
if not aOnlyFieldData then
|
||||
AssertErrData('', IdeRes.Fields[ExpOffs+1].Field, 'ouch');
|
||||
|
||||
AssertStructField('', IdeRes, ExpOffs+2, 'Bar', dfvPublic, [], ExpTypeName, 'TMyBar');
|
||||
AssertData('', IdeRes.Fields[ExpOffs+2].Field, aEntryType2, aErr2, 'TMyBar', 301, 1201);
|
||||
AssertStructField('', IdeRes, ExpOffs+2, 'Bar', dfvPublic, [], ExpTypeName, 'TMyBar',
|
||||
rdkUnknown, True, True, aOnlyFieldData);
|
||||
if not aOnlyFieldData then
|
||||
AssertData('', IdeRes.Fields[ExpOffs+2].Field, aEntryType2, aErr2, 'TMyBar', 301, 1201);
|
||||
|
||||
ExpOffs := ExpOffs + 3;
|
||||
end;
|
||||
|
||||
if WithAnch1Fld and (WithAnch >= 1) then begin
|
||||
AssertStructField('', IdeRes, ExpOffs+0, 'P1Abc', dfvPrivate, [], 'TAnch1', #1, rdkError);
|
||||
AssertErrData('', IdeRes.Fields[ExpOffs+0].Field, 'bad');
|
||||
AssertStructField('', IdeRes, ExpOffs+0, 'P1Abc', dfvPrivate, [], 'TAnch1', #1, rdkError,
|
||||
True, True, aOnlyFieldData);
|
||||
if not aOnlyFieldData then
|
||||
AssertErrData('', IdeRes.Fields[ExpOffs+0].Field, 'bad');
|
||||
|
||||
AssertStructField('', IdeRes, ExpOffs+1, 'P1Foo', dfvProtected, [], 'TAnch1', 'TMyFoo');
|
||||
AssertData('', IdeRes.Fields[ExpOffs+1].Field, aEntryType1, False, 'TMyFoo', 310, 1210);
|
||||
AssertStructField('', IdeRes, ExpOffs+1, 'P1Foo', dfvProtected, [], 'TAnch1', 'TMyFoo',
|
||||
rdkUnknown, True, True, aOnlyFieldData);
|
||||
if not aOnlyFieldData then
|
||||
AssertData('', IdeRes.Fields[ExpOffs+1].Field, aEntryType1, False, 'TMyFoo', 310, 1210);
|
||||
ExpOffs := ExpOffs + 2;
|
||||
end;
|
||||
|
||||
if WithAnch2Fld and (WithAnch >= 2) then begin
|
||||
AssertStructField('', IdeRes, ExpOffs+0, 'P2Foo', dfvProtected, [], 'TAnch2', 'TMyXyz');
|
||||
AssertData('', IdeRes.Fields[ExpOffs+0].Field, aEntryType2, not aErr2, 'TMyXyz', 320, 1220);
|
||||
AssertStructField('', IdeRes, ExpOffs+0, 'P2Foo', dfvProtected, [], 'TAnch2', 'TMyXyz',
|
||||
rdkUnknown, True, True, aOnlyFieldData);
|
||||
if not aOnlyFieldData then
|
||||
AssertData('', IdeRes.Fields[ExpOffs+0].Field, aEntryType2, not aErr2, 'TMyXyz', 320, 1220);
|
||||
ExpOffs := ExpOffs + 1;
|
||||
end;
|
||||
|
||||
@ -937,6 +993,17 @@ begin
|
||||
dat.CreateNumValue(ANum+7, True, 2);
|
||||
end;
|
||||
|
||||
function TTestIdeDebuggerWatchResult.CreateArrayOfErr(
|
||||
ResIntf: TLzDbgWatchDataIntf; AnErr: String): TTwoResRecord;
|
||||
var
|
||||
dat: TLzDbgWatchDataIntf;
|
||||
begin
|
||||
Result.NestPtr := ResIntf.CreateArrayValue(datDynArray, 2);
|
||||
|
||||
Result.NestNum := ResIntf.SetNextArrayData;
|
||||
Result.NestNum.CreateError(AnErr);
|
||||
end;
|
||||
|
||||
function TTestIdeDebuggerWatchResult.CreateEmptyArrayOfNum(
|
||||
ResIntf: TLzDbgWatchDataIntf; ANum: Int64; AByteSize: integer): TTwoResRecord;
|
||||
var
|
||||
@ -958,7 +1025,8 @@ end;
|
||||
procedure TTestIdeDebuggerWatchResult.CreateStruct(
|
||||
ResIntf: TLzDbgWatchDataIntf; StrctTyp: TLzDbgStructType; WithFld: Boolean;
|
||||
WithAnch: Integer; WithAnch1Fld, WithAnch2Fld: Boolean; aEntryType1,
|
||||
aEntryType2: TTestCreateDataKind; aErr1, aErr2: Boolean; aNil: Boolean);
|
||||
aEntryType2: TTestCreateDataKind; aErr1, aErr2: Boolean; aNil: Boolean;
|
||||
aOnlyFieldData: Boolean);
|
||||
var
|
||||
ExpCnt: Integer;
|
||||
FldIntf, Anch1Intf: TLzDbgWatchDataIntf;
|
||||
@ -981,7 +1049,8 @@ begin
|
||||
ExpCnt := 0;
|
||||
if WithFld then begin
|
||||
FldIntf := ResIntf.AddField('Foo', dfvProtected, []);
|
||||
CreateData(FldIntf, aEntryType1, aErr1, 'TMyFoo', 300, 1200);
|
||||
if not aOnlyFieldData then
|
||||
CreateData(FldIntf, aEntryType1, aErr1, 'TMyFoo', 300, 1200);
|
||||
//if aErr3 then
|
||||
if aErr1 and not aErr2 then
|
||||
FldIntf.CreateError('bad');
|
||||
@ -990,7 +1059,8 @@ begin
|
||||
FldIntf.CreateError('ouch');
|
||||
|
||||
FldIntf := ResIntf.AddField('Bar', dfvPublic, []);
|
||||
CreateData(FldIntf, aEntryType2, aErr2, 'TMyBar', 301, 1201);
|
||||
if not aOnlyFieldData then
|
||||
CreateData(FldIntf, aEntryType2, aErr2, 'TMyBar', 301, 1201);
|
||||
ExpCnt := ExpCnt + 3;
|
||||
end;
|
||||
|
||||
@ -1001,7 +1071,8 @@ begin
|
||||
FldIntf.CreateError('bad');
|
||||
|
||||
FldIntf := Anch1Intf.AddField('P1Foo', dfvProtected, []);
|
||||
CreateData(FldIntf, aEntryType1, False, 'TMyFoo', 310, 1210);
|
||||
if not aOnlyFieldData then
|
||||
CreateData(FldIntf, aEntryType1, False, 'TMyFoo', 310, 1210);
|
||||
ExpCnt := ExpCnt + 2;
|
||||
end;
|
||||
|
||||
@ -1010,7 +1081,8 @@ begin
|
||||
|
||||
if WithAnch2Fld then begin
|
||||
FldIntf := Anch1Intf.AddField('P2Foo', dfvProtected, []);
|
||||
CreateData(FldIntf, aEntryType2, not aErr2, 'TMyXyz', 320, 1220);
|
||||
if not aOnlyFieldData then
|
||||
CreateData(FldIntf, aEntryType2, not aErr2, 'TMyXyz', 320, 1220);
|
||||
ExpCnt := ExpCnt + 1;
|
||||
end;
|
||||
end;
|
||||
@ -1040,9 +1112,15 @@ begin
|
||||
cdErrArr_Num: ResIntf.CreateError(AnErrPreFix+'ouch');
|
||||
cdArr_EmptyNum: Result :=
|
||||
CreateEmptyArrayOfNum(ResIntf, ANumVal);
|
||||
cdArr_ErrNum: Result :=
|
||||
CreateArrayOfErr(ResIntf, AnErrPreFix+'no');
|
||||
cdPtr_ErrArr_Num: Result.NestNum :=
|
||||
CreatePtrErr (ResIntf, AnAddr, AnErrPreFix+'argh');
|
||||
cdErrStruct: ResIntf.CreateError(AnErrPreFix+'bad-obj');
|
||||
cdStruct_ErrField:CreateStruct(ResIntf, dstObject, True, 0, False, False, cdErrNum, cdErrNum, True, True);
|
||||
cdStruct_Nil: CreateStruct(ResIntf, dstObject, False, 0, False, False, cdErrNum, cdErrNum, False, False);
|
||||
cdStruct_ErrEmptyFields:ResIntf.CreateError(AnErrPreFix+'f-ouch');
|
||||
//cdStruct_EmptyFields:CreateStruct(ResIntf, dstObject, True, 0, False, False, cdErrNum, cdErrNum, False, False,False, True);
|
||||
end
|
||||
else
|
||||
case AKind of
|
||||
@ -1056,11 +1134,16 @@ begin
|
||||
CreatePtrPtrNum(ResIntf, AnAddr, ANumVal, 2);
|
||||
cdErrArr_Num: Result :=
|
||||
CreateArrayOfNum(ResIntf, ANumVal);
|
||||
cdArr_EmptyNum: Result :=
|
||||
cdArr_EmptyNum,
|
||||
cdArr_ErrNum: Result :=
|
||||
CreateArrayOfNum(ResIntf, ANumVal);
|
||||
cdPtr_ErrArr_Num: Result :=
|
||||
CreatePtrArrayOfNum(ResIntf, ANumVal);
|
||||
cdStruct_ErrField:CreateStruct(ResIntf, dstObject, True, 0, False, False, cdErrNum, cdErrNum, False, False);
|
||||
cdErrStruct,
|
||||
cdStruct_ErrField,
|
||||
cdStruct_Nil,
|
||||
cdStruct_ErrEmptyFields:CreateStruct(ResIntf, dstObject, True, 0, False, False, cdErrNum, cdErrNum, False, False);
|
||||
//cdStruct_EmptyFields:CreateStruct(ResIntf, dstObject, True, 0, False, False, cdErrNum, cdErrNum, False, False);
|
||||
end;
|
||||
|
||||
if ATypeName <> '' then
|
||||
@ -1082,8 +1165,13 @@ begin
|
||||
cdErrPtr_Ptr_Num: AssertErrData (AMessage, IdeRes, AnErrPreFix+'ouch');
|
||||
cdErrArr_Num: AssertErrData (AMessage, IdeRes, AnErrPreFix+'ouch');
|
||||
cdArr_EmptyNum: AssertEmptyArrayOfNumData(AMessage, IdeRes, ANumVal, ATypeName);
|
||||
cdArr_ErrNum: AssertArrayOfErrData (AMessage, IdeRes, AnErrPreFix+'no');
|
||||
cdPtr_ErrArr_Num: AssertPointerToErrData (AMessage, IdeRes, AnAddr, AnErrPreFix+'argh');
|
||||
cdErrStruct: AssertErrData (AMessage, IdeRes, AnErrPreFix+'bad-obj');
|
||||
cdStruct_ErrField:AssertStruct(AMessage, IdeRes, dstObject, True, 0, False, False, cdErrNum, cdErrNum, True, True, False, ATypeName);
|
||||
cdStruct_Nil: AssertStruct(AMessage, IdeRes, dstObject, False, 0, False, False, cdErrNum, cdErrNum, False, False, True, ATypeName);
|
||||
cdStruct_ErrEmptyFields:AssertErrData (AMessage, IdeRes, AnErrPreFix+'f-ouch');
|
||||
//cdStruct_EmptyFields:AssertStruct(AMessage, IdeRes, dstObject, True, 0, False, False, cdErrNum, cdErrNum, False, False, False, ATypeName, True);
|
||||
end
|
||||
else
|
||||
case AKind of
|
||||
@ -1093,10 +1181,15 @@ begin
|
||||
cdErrPtr_Num: AssertPointerToSignedNumData(AMessage, IdeRes, AnAddr, ANumVal, 2, ATypeName, 'TMyNum');
|
||||
cdPtr_Ptr_ErrNum..
|
||||
cdErrPtr_Ptr_Num: AssertPtrPointerToSignedNumData(AMessage, IdeRes, AnAddr, AnAddr+1, ANumVal, 2, ATypeName, 'TFooPtr', 'TFooNum');
|
||||
cdErrArr_Num: AssertArrayOfNumData(AMessage, IdeRes, ANumVal, ATypeName);
|
||||
cdArr_EmptyNum: AssertArrayOfNumData(AMessage, IdeRes, ANumVal, ATypeName);
|
||||
cdErrArr_Num,
|
||||
cdArr_EmptyNum,
|
||||
cdArr_ErrNum: AssertArrayOfNumData(AMessage, IdeRes, ANumVal, ATypeName);
|
||||
cdPtr_ErrArr_Num: AssertPtrArrayOfNumData(AMessage, IdeRes, ANumVal, ATypeName);
|
||||
cdStruct_ErrField:AssertStruct(AMessage, IdeRes, dstObject, True, 0, False, False, cdErrNum, cdErrNum, False, False, False, ATypeName);
|
||||
cdErrStruct,
|
||||
cdStruct_ErrField,
|
||||
cdStruct_Nil,
|
||||
cdStruct_ErrEmptyFields:AssertStruct(AMessage, IdeRes, dstObject, True, 0, False, False, cdErrNum, cdErrNum, False, False, False, ATypeName);
|
||||
//cdStruct_EmptyFields:AssertStruct(AMessage, IdeRes, dstObject, True, 0, False, False, cdErrNum, cdErrNum, False, False, False, ATypeName);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1478,6 +1571,16 @@ var
|
||||
ResIntfStr, ProtoIntf: TLzDbgWatchDataIntf;
|
||||
Res, ResArray: TWatchResultData;
|
||||
begin
|
||||
(*
|
||||
- PCharOrString
|
||||
0: Array[aLen] OR Err (AErrIdx=-2)
|
||||
[0] Data-or-Err (aErrIdx=0)
|
||||
[1] Data-or-Err (aErrIdx=1)
|
||||
1: Array[aLen] OR Err (AErrIdxSecond=-2)
|
||||
[0] Data-or-Err (AErrIdxSecond=0)
|
||||
[1] Data-or-Err (AErrIdxSecond=1)
|
||||
|
||||
*)
|
||||
for x := 0 to 2 do
|
||||
for aEntryType := low(TTestCreateDataKind) to high(TTestCreateDataKind) do
|
||||
for aLen := 0 to 2 do
|
||||
|
Loading…
Reference in New Issue
Block a user