mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-01 10:23:40 +02:00
208 lines
5.1 KiB
ObjectPascal
208 lines
5.1 KiB
ObjectPascal
unit TestLineMap;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, Math, FpDbgDwarfDataClasses, FpDbgInfo, DbgIntfBaseTypes, fpcunit, testutils,
|
|
testregistry;
|
|
|
|
type
|
|
|
|
{ TTestLineMap }
|
|
|
|
TTestLineMap = class(TTestCase)
|
|
private const
|
|
MAX_PAGE_LINE = 1000000; // from TDWarfLineMap
|
|
private
|
|
LMap: TDWarfLineMap;
|
|
FTestOffset: integer;
|
|
|
|
procedure InitMap(l: array of integer);
|
|
procedure CheckNotFound(ASearch: Integer; AFindSibling: TGetLineAddrFindSibling; AMaxSiblingDistance: integer = 0);
|
|
procedure CheckFound(ASearch, AExp: Integer; AFindSibling: TGetLineAddrFindSibling; AMaxSiblingDistance: integer = 0);
|
|
published
|
|
procedure TestLineMapFsNone;
|
|
procedure TestLineMapFsBefore;
|
|
procedure TestLineMapFsNext;
|
|
end;
|
|
|
|
implementation
|
|
|
|
procedure TTestLineMap.InitMap(l: array of integer);
|
|
var
|
|
i: Integer;
|
|
begin
|
|
LMap := Default(TDWarfLineMap);
|
|
LMap.Init;
|
|
for i := 0 to Length(l) - 1 do
|
|
LMap.SetAddressForLine(l[i]+FTestOffset, l[i]);
|
|
end;
|
|
|
|
procedure TTestLineMap.CheckNotFound(ASearch: Integer; AFindSibling: TGetLineAddrFindSibling;
|
|
AMaxSiblingDistance: integer);
|
|
var
|
|
a: TDBGPtrArray;
|
|
r: Boolean;
|
|
fl: Integer;
|
|
begin
|
|
fl := -1;
|
|
r := LMap.GetAddressesForLine(ASearch+FTestOffset, a, False, AFindSibling, @fl, AMaxSiblingDistance);
|
|
AssertFalse('not found '+IntToStr(ASearch), r);
|
|
end;
|
|
|
|
procedure TTestLineMap.CheckFound(ASearch, AExp: Integer; AFindSibling: TGetLineAddrFindSibling;
|
|
AMaxSiblingDistance: integer);
|
|
var
|
|
a: TDBGPtrArray;
|
|
r: Boolean;
|
|
fl: Integer;
|
|
begin
|
|
fl := -1;
|
|
r := LMap.GetAddressesForLine(ASearch+FTestOffset, a, False, AFindSibling, @fl, AMaxSiblingDistance);
|
|
AssertTrue('found '+IntToStr(ASearch), r);
|
|
AssertTrue('found (data) for '+IntToStr(ASearch), Length(a) = 1);
|
|
AssertEquals('found '+IntToStr(ASearch), AExp+FTestOffset, fl);
|
|
AssertEquals('found (addr) '+IntToStr(ASearch), AExp, a[0]);
|
|
end;
|
|
|
|
procedure TTestLineMap.TestLineMapFsNone;
|
|
var
|
|
i: Integer;
|
|
begin
|
|
for i := -1 to 30 do begin
|
|
FTestOffset := 0;
|
|
if i >= 0 then FTestOffset := MAX_PAGE_LINE - 21 +i; // -21 start with line 20 before MAX
|
|
|
|
InitMap([10]);
|
|
|
|
CheckFound(10, 10, fsNone);
|
|
CheckNotFound( 9, fsNone);
|
|
CheckNotFound(11, fsNone);
|
|
|
|
InitMap([1000]);
|
|
CheckNotFound(1, fsNone);
|
|
CheckNotFound(99999, fsNone);
|
|
|
|
|
|
InitMap([10, 20]);
|
|
|
|
CheckFound(10, 10, fsNone);
|
|
CheckFound(20, 20, fsNone);
|
|
CheckNotFound( 9, fsNone);
|
|
CheckNotFound(19, fsNone);
|
|
CheckNotFound(21, fsNone);
|
|
|
|
InitMap([10, 2000]);
|
|
|
|
CheckFound(10, 10, fsNone);
|
|
CheckFound(2000, 2000, fsNone);
|
|
CheckNotFound( 9, fsNone);
|
|
CheckNotFound(1999, fsNone);
|
|
CheckNotFound(2001, fsNone);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestLineMap.TestLineMapFsBefore;
|
|
var
|
|
i: Integer;
|
|
begin
|
|
for i := -1 to 30 do begin
|
|
FTestOffset := 0;
|
|
if i >= 0 then FTestOffset := MAX_PAGE_LINE - 21 +i; // -21 start with line 20 before MAX
|
|
|
|
InitMap([10]);
|
|
|
|
CheckFound(10, 10, fsBefore);
|
|
CheckFound(11, 10, fsBefore);
|
|
CheckFound(19, 10, fsBefore);
|
|
CheckFound(19, 10, fsBefore, 9);
|
|
CheckNotFound(19, fsBefore, 8);
|
|
CheckNotFound( 9, fsBefore);
|
|
|
|
if i >= 1 then FTestOffset := MAX_PAGE_LINE - 922 +i; // -21 start with line 20 before MAX
|
|
|
|
InitMap([910, 920]);
|
|
|
|
CheckFound(910, 910, fsBefore);
|
|
CheckFound(911, 910, fsBefore);
|
|
CheckFound(919, 910, fsBefore);
|
|
CheckFound(919, 910, fsBefore, 9);
|
|
CheckNotFound(919, fsBefore, 8);
|
|
|
|
CheckFound(920, 920, fsBefore);
|
|
CheckFound(921, 920, fsBefore);
|
|
CheckFound(929, 920, fsBefore);
|
|
CheckFound(929, 920, fsBefore, 9);
|
|
CheckNotFound(929, fsBefore, 8);
|
|
|
|
CheckFound(2920, 920, fsBefore);
|
|
CheckNotFound(909, fsBefore);
|
|
CheckNotFound(9, fsBefore);
|
|
|
|
InitMap([511]);
|
|
CheckFound(2920, 511, fsBefore);
|
|
InitMap([512]);
|
|
CheckFound(2920, 512, fsBefore);
|
|
end;
|
|
end;
|
|
|
|
procedure TTestLineMap.TestLineMapFsNext;
|
|
var
|
|
i: Integer;
|
|
begin
|
|
for i := -1 to 30 do begin
|
|
FTestOffset := 0;
|
|
if i >= 0 then FTestOffset := MAX_PAGE_LINE - 21 +i; // -21 start with line 20 before MAX
|
|
|
|
InitMap([10]);
|
|
|
|
CheckFound(10, 10, fsNext);
|
|
CheckFound( 9, 10, fsNext);
|
|
CheckFound( 1, 10, fsNext);
|
|
CheckFound( 1, 10, fsNext, 9);
|
|
CheckNotFound(11, fsNext, 8);
|
|
CheckNotFound(11, fsNext);
|
|
|
|
if i >= 1 then FTestOffset := MAX_PAGE_LINE - 922 +i; // -21 start with line 20 before MAX
|
|
|
|
InitMap([910, 920]);
|
|
|
|
CheckFound(910, 910, fsNext);
|
|
CheckFound(909, 910, fsNext);
|
|
CheckFound(901, 910, fsNext);
|
|
CheckFound(901, 910, fsNext, 9);
|
|
CheckNotFound(901, fsNext, 8);
|
|
|
|
CheckFound(920, 920, fsNext);
|
|
CheckFound(919, 920, fsNext);
|
|
CheckFound(911, 920, fsNext);
|
|
CheckFound(911, 920, fsNext, 9);
|
|
CheckNotFound(918, fsNext, 1);
|
|
CheckNotFound(911, fsNext, 8);
|
|
|
|
CheckFound(1, 910, fsNext);
|
|
|
|
CheckNotFound(921, fsNext);
|
|
CheckNotFound(1921, fsNext);
|
|
|
|
InitMap([10, 2000]);
|
|
CheckFound(11, 2000, fsNext);
|
|
CheckFound(311, 2000, fsNext);
|
|
CheckNotFound(11, fsNext, 500);
|
|
|
|
InitMap([255]);
|
|
CheckFound(11, 255, fsNext);
|
|
InitMap([256]);
|
|
CheckFound(11, 256, fsNext);
|
|
end;
|
|
end;
|
|
|
|
|
|
initialization
|
|
|
|
RegisterTest(TTestLineMap);
|
|
end.
|
|
|