lazarus/components/lazdebuggers/lazdebugtestbase/testapps/WatchesScopePrg.pas
martin 82671b823c FpDebug: test cases
git-svn-id: trunk@59781 -
2018-12-10 21:17:09 +00:00

270 lines
6.3 KiB
ObjectPascal

// TEST_USES=WatchesScopeUnit1.pas,WatchesScopeUnit2.pas
(* Test Purpose
- Access to variables/tyes in current and all outer scopes
(each scope has a variable with a different name)
- Choose variable of correct (most inner visible) scope
(all scopes have a variable of the same name)
- Global vars according to the unit of the current selected stackframe
- Missing: Global vars of other units, according to order in "uses"
*)
(* Calling order / Do not change / Insertation allowed
// Nested functions
>> function FuncFoo: integer;
>> function FuncFooNested: AnsiString;
>> function FuncFooNestedTwice: AnsiString;
* TEST_BREAKPOINT//=FuncFooNestedTwice
<<
>> function FuncFooNestedTwice2(Int_Hide_Foo: Integer): AnsiString;
* TEST_BREAKPOINT//=FuncFooNestedTwice2
<<
* TEST_BREAKPOINT//=FuncFooNested
<< function FuncFooNested: AnsiString;
* TEST_BREAKPOINT//=FuncFoo
<< function FuncFoo: integer;
// Class vs Base Class + Nested Function in method (nested function access to self)
TClassMainBaseBase = class() // In Unit2 // private section should not be visible
TClassMainBase = class(TClassMainBaseBase) // In Unit1 // private section should not be visible
TClassMain = class(TClassMainBase)
TClassMainChild = class(TClassMain)
>> procedure TClassMainBaseBase.MethodMainBaseBase;
>> procedure TClassMainBase.MethodMainBase;
>> procedure TClassMain.MethodMain;
>>>> class TClassMainChild
>> procedure TClassMainChild.MethodMainChild;
>> procedure MethodMainChildNested;
>> procedure MethodMainChildNestedTwice;
* TEST_BREAKPOINT//=MethodMainChildNestedTwice
<<
* TEST_BREAKPOINT//=MethodMainChildNested
<< procedure MethodMainChildNested;
* TEST_BREAKPOINT//=MethodMainChild
<< procedure TClassMainChild.MethodMainChild;
<<<< class TClassMainChild
* TEST_BREAKPOINT//=MethodMain
<< procedure TClassMain.MethodMain;
* TEST_BREAKPOINT//=MethodMainBase
<< procedure TClassMainBase.MethodMainBase;
* TEST_BREAKPOINT//=MethodMainBaseBase
<< procedure TClassMainBaseBase.MethodMainBaseBase;
*)
program WatchesScopePrg;
{$H-}
uses sysutils, Classes, WatchesScopeUnit1, WatchesScopeUnit2;
type
{ TClassMain }
TClassMain = class(TClassMainBase)
private
Int_TClassMain_Priv: Integer;
protected
Int_TClassMain_Prot: Integer;
public
Int_TClassMain: Integer;
procedure MethodMain; override;
procedure MethodMainChild; virtual;
public
type
TMainEnum = (mm1, mm2);
end;
{ TClassMainChild }
TClassMainChild = class(TClassMain)
private
Int_TClassMainChild_Priv: Integer;
protected
Int_TClassMainChild_Prot: Integer;
public
Int_TClassMainChild: Integer;
Int_HideTest_Class: Integer; // Hide same name var in other scope
procedure MethodMainChild; override;
end;
type
TMainGlobEnum = (mmG1, mmG2);
THideMainEnum = (hmG1, hmG2);
var
BreakDummy: Integer;
Int_GlobalPrg: Integer;
Int_HideTest_Class: Integer;
Int_HideTest_Unit: Integer;
TestClassMainChild: TClassMainChild;
Int_Hide_Foo: Integer;
e1: TMainGlobEnum;
e2: THideMainEnum;
{ TClassMain }
procedure TClassMain.MethodMain;
var
e1: TMainEnum;
begin
e1 := mm1;
MethodMainChild; // call inherited class
BreakDummy := 1; // TEST_BREAKPOINT=MethodMain
end;
procedure TClassMain.MethodMainChild;
begin
//
end;
{ TClassMainChild }
procedure TClassMainChild.MethodMainChild;
type
TMethodMainChildEnum = (mmC1, mmC2);
THideMainEnum = (hmC1, hmC2);
var
Int_MethodMainChild: Integer;
procedure MethodMainChildNested;
type
TMethodMainChildNestedEnum = (mmCN1, mmCN2);
THideMainEnum = (hmCN1, hmCN2);
var
Int_MethodMainChildNested: Integer;
e1: TMethodMainChildNestedEnum;
e2: THideMainEnum;
procedure MethodMainChildNestedTwice;
type
TMethodMainChildNestedTwiceEnum = (mmCNT1, mmCNT2);
THideMainEnum = (hmCNT1, hmCNT2);
var
Int_MethodMainChildNestedTwice: integer;
e1: TMethodMainChildNestedTwiceEnum;
e2: THideMainEnum;
begin
e1 := mmCNT1;
e2 := hmCNT1;
Int_MethodMainChildNestedTwice := 30;
BreakDummy := 1; // TEST_BREAKPOINT=MethodMainChildNestedTwice
end;
begin
e1 := mmCN1;
e2 := hmCN1;
Int_MethodMainChildNested := 40;
MethodMainChildNestedTwice;
BreakDummy := 1; // TEST_BREAKPOINT=MethodMainChildNested
end;
var
Int_MethodMainChild_Late: integer;
e1: TMethodMainChildEnum;
e2: THideMainEnum;
begin
e1 := mmC1;
e2 := hmC1;
Int_MethodMainChild := 50;
Int_MethodMainChild_Late := 52;
Int_TClassMainChild := 70;
Int_TClassMainChild_Prot := 71;
Int_TClassMainChild_Priv := 72;
Int_TClassMain := 80;
Int_TClassMain_Prot := 81;
Int_TClassMain_Priv := 82;
Int_HideTest_Class := 3001;
MethodMainChildNested;
BreakDummy := 1; // TEST_BREAKPOINT=MethodMainChild
end;
function FuncFoo: integer;
type
TTestEnum = (te1, te2, te3);
var
Int_Hide_Foo: Integer;
TestEnum: TTestEnum;
function FuncFooNested: AnsiString;
var
Int_Hide_Foo: Integer;
function FuncFooNestedTwice: AnsiString;
var
Int_Hide_Foo: Integer;
begin
Result := 'abc';
Int_Hide_Foo := 4;
BreakDummy := 1; // TEST_BREAKPOINT=FuncFooNestedTwice
end;
function FuncFooNestedTwice2(Int_Hide_Foo: Integer): AnsiString;
begin
Result := 'abc2';
Int_Hide_Foo := 5;
BreakDummy := 1; // TEST_BREAKPOINT=FuncFooNestedTwice2
end;
begin
Result := 'bar';
Int_Hide_Foo := 3;
TestEnum := te3;
FuncFooNestedTwice;
FuncFooNestedTwice2(-1);
BreakDummy := 1; // TEST_BREAKPOINT=FuncFooNested
end;
begin
Result := 99;
Int_Hide_Foo := 2;
FuncFooNested;
BreakDummy := 1; // TEST_BREAKPOINT=FuncFoo
end;
begin
Unit1Init;
Unit2Init;
e1 := mmG1;
e2 := hmG1;
Int_GlobalUnit1 := 201;
Int_GlobalUnit2 := 202;
Int_GlobalPrg := 101;
Int_HideTest_Class := 3000;
Int_HideTest_Unit := 3010;
Int_Hide_Foo := 1;
FuncFoo;
TestClassMainChild := TClassMainChild.Create;
// Call the deepest class first, and make the way up to each inherited class
TestClassMainChild.MethodMainBaseBase();
BreakDummy := 1; // TEST_BREAKPOINT=Prg
end.