lazarus/components/fpdebug/test/testmemmanager.pas
2021-06-14 07:30:45 +00:00

462 lines
21 KiB
ObjectPascal

unit TestMemManager;
{$mode objfpc}{$H+}
interface
uses
FpDbgDwarf, FpDbgUtil, FpdMemoryTools, FpDbgInfo, TestHelperClasses,
{$ifdef FORCE_LAZLOGGER_DUMMY} LazLoggerDummy {$else} LazLoggerBase {$endif}, LazUTF8, LazClasses, DbgIntfBaseTypes, sysutils, fpcunit,
testregistry;
type
{ TTestMemManager }
TTestMemManager = class(TTestCase)
protected
FCurrentTestName: String;
FMemReader: TTestMemReader;
FMemConvTarget: TFpDbgMemConvertorLittleEndian;
FMemConvSelf: TFpDbgMemConvertorLittleEndian;
FMemManager: TFpDbgMemManager;
FDummyContext: TFpDbgSimpleLocationContext;
procedure InitMemMgr;
procedure SetUp; override;
procedure TearDown; override;
published
procedure TestMemMgr;
procedure TestAddrAndSizeOperations;
end;
implementation
procedure TTestMemManager.InitMemMgr;
begin
FMemReader := TTestMemReader.Create;
FMemConvTarget := TFpDbgMemConvertorLittleEndian.Create;
FMemConvSelf := TFpDbgMemConvertorLittleEndian.Create;
FMemManager := TFpDbgMemManager.Create(FMemReader, FMemConvTarget, FMemConvSelf);
FDummyContext := TFpDbgSimpleLocationContext.Create(FMemManager, 0, 4, 0, 0);
end;
procedure TTestMemManager.SetUp;
begin
inherited SetUp;
FMemReader := nil;
FMemConvTarget := nil;
FMemConvSelf := nil;
FMemManager := nil;
end;
procedure TTestMemManager.TearDown;
begin
inherited TearDown;
ReleaseRefAndNil(FDummyContext);
FreeAndNil(FMemReader);
FreeAndNil(FMemConvTarget);
FreeAndNil(FMemConvSelf);
FreeAndNil(FMemManager);
end;
procedure TTestMemManager.TestMemMgr;
var
i, j: Integer;
TestBaseName: String;
Data: QWord;
DataExt: Extended;
DataDouble: Double;
DataSingle: Single;
MemValue: QWord;
GotRes: Boolean;
GotInt: Int64;
GotUInt: QWord;
GotAddr: TFpDbgMemLocation;
GotExt: Extended;
procedure SetData(Aval: QWord);
begin
Data := Aval;
FMemReader.RegisterValues[2] := Aval;
FCurrentTestName := TestBaseName + ' ' + IntToHex(Aval, 16) + ': ';
end;
procedure CheckIntRes(AName: String; AExp: int64);
begin
AssertTrue(FCurrentTestName + AName + 'Read OK', GotRes);
AssertEquals(FCurrentTestName + AName + 'Val', AExp, GotInt);
end;
procedure CheckUIntRes(AName: String; AExp: int64);
begin
AssertTrue(FCurrentTestName + AName + 'Read OK', GotRes);
AssertEquals(FCurrentTestName + AName + 'Val', AExp, GotUInt);
end;
procedure CheckAddrRes(AName: String; AExp: int64);
begin
AssertTrue(FCurrentTestName + AName + 'Read OK', GotRes);
AssertTrue(FCurrentTestName + AName + 'Valid', IsValidLoc(GotAddr));
AssertEquals(FCurrentTestName + AName + 'Val', AExp, GotAddr.Address);
end;
Procedure DoSignedIntTests(ReadSize: Cardinal; ExpIntVal: Int64);
var
a: Cardinal;
begin
GotRes := FDummyContext.ReadSignedInt(TargetLoc(TDbgPtr(@Data)), SizeVal(ReadSize), GotInt);
CheckIntRes('signed target', ExpIntVal);
GotRes := FDummyContext.ReadSignedInt(SelfLoc(@Data), SizeVal(ReadSize), GotInt);
CheckIntRes('signed self', ExpIntVal);
FMemReader.RegisterSizes[2] := ReadSize;
GotRes := FDummyContext.ReadSignedInt(RegisterLoc(2), SizeVal(ReadSize), GotInt);
CheckIntRes('signed Reg ', ExpIntVal);
for a := ReadSize+1 to 8 do begin
// expanded
FMemReader.RegisterSizes[2] := ReadSize;
GotRes := FDummyContext.ReadSignedInt(RegisterLoc(2), SizeVal(a), GotInt);
CheckIntRes('signed Reg readsize='+IntToStr(a), ExpIntVal);
FMemReader.RegisterSizes[2] := a;
GotRes := FDummyContext.ReadSignedInt(RegisterLoc(2), SizeVal(ReadSize), GotInt);
CheckIntRes('signed Reg regsize'+IntToStr(a), ExpIntVal);
end;
GotRes := FDummyContext.ReadSignedInt(ConstLoc(QWord(ExpIntVal)), SizeVal(ReadSize), GotInt);
CheckIntRes('signed const (pre-expanded)', ExpIntVal);
end;
Procedure DoUnsignedIntTests(ReadSize: Cardinal; ExpIntVal: QWord);
var
a: Cardinal;
begin
GotRes := FDummyContext.ReadUnsignedInt(TargetLoc(TDbgPtr(@Data)), SizeVal(ReadSize), GotUInt);
CheckUIntRes('unsigned target', ExpIntVal);
GotRes := FDummyContext.ReadUnsignedInt(SelfLoc(@Data), SizeVal(ReadSize), GotUInt);
CheckUIntRes('unsigned self', ExpIntVal);
FMemReader.RegisterSizes[2] := ReadSize;
GotRes := FDummyContext.ReadUnsignedInt(RegisterLoc(2), SizeVal(ReadSize), GotUInt);
CheckUIntRes('unsigned Reg ', ExpIntVal);
for a := ReadSize+1 to 8 do begin
// expanded
FMemReader.RegisterSizes[2] := ReadSize;
GotRes := FDummyContext.ReadUnsignedInt(RegisterLoc(2), SizeVal(a), GotUInt);
CheckUIntRes('unsigned Reg readsize='+IntToStr(a), ExpIntVal);
FMemReader.RegisterSizes[2] := a;
GotRes := FDummyContext.ReadUnsignedInt(RegisterLoc(2), SizeVal(ReadSize), GotUInt);
CheckUIntRes('unsigned Reg regsize'+IntToStr(a), ExpIntVal);
end;
GotRes := FDummyContext.ReadUnsignedInt(ConstLoc(QWord(ExpIntVal)), SizeVal(ReadSize), GotUInt);
CheckUIntRes('unsigned const (pre-expanded)', ExpIntVal);
//////
// Address
GotRes := FDummyContext.ReadAddress(TargetLoc(TDbgPtr(@Data)), SizeVal(ReadSize), GotAddr);
CheckAddrRes('addr target', ExpIntVal);
GotRes := FDummyContext.ReadAddress(SelfLoc(@Data), SizeVal(ReadSize), GotAddr);
CheckAddrRes('addr self', ExpIntVal);
FMemReader.RegisterSizes[2] := ReadSize;
GotRes := FDummyContext.ReadAddress(RegisterLoc(2), SizeVal(ReadSize), GotAddr);
CheckAddrRes('addr Reg ', ExpIntVal);
for a := ReadSize+1 to 8 do begin
// expanded
FMemReader.RegisterSizes[2] := ReadSize;
GotRes := FDummyContext.ReadAddress(RegisterLoc(2), SizeVal(a), GotAddr);
CheckAddrRes('addr Reg readsize='+IntToStr(a), ExpIntVal);
FMemReader.RegisterSizes[2] := a;
GotRes := FDummyContext.ReadAddress(RegisterLoc(2), SizeVal(ReadSize), GotAddr);
CheckAddrRes('addr Reg regsize'+IntToStr(a), ExpIntVal);
end;
GotRes := FDummyContext.ReadAddress(ConstLoc(QWord(ExpIntVal)), SizeVal(ReadSize), GotAddr);
CheckAddrRes('addr const (pre-expanded)', ExpIntVal);
//////
// Address
GotAddr := FDummyContext.ReadAddress(TargetLoc(TDbgPtr(@Data)), SizeVal(ReadSize));
GotRes := isValidLoc(GotAddr);
CheckAddrRes('addr target', ExpIntVal);
GotAddr := FDummyContext.ReadAddress(SelfLoc(@Data), SizeVal(ReadSize));
GotRes := isValidLoc(GotAddr);
CheckAddrRes('addr self', ExpIntVal);
FMemReader.RegisterSizes[2] := ReadSize;
GotAddr := FDummyContext.ReadAddress(RegisterLoc(2), SizeVal(ReadSize));
GotRes := isValidLoc(GotAddr);
CheckAddrRes('addr Reg ', ExpIntVal);
for a := ReadSize+1 to 8 do begin
// expanded
FMemReader.RegisterSizes[2] := ReadSize;
GotAddr := FDummyContext.ReadAddress(RegisterLoc(2), SizeVal(a));
GotRes := isValidLoc(GotAddr);
CheckAddrRes('addr Reg readsize='+IntToStr(a), ExpIntVal);
FMemReader.RegisterSizes[2] := a;
GotAddr := FDummyContext.ReadAddress(RegisterLoc(2), SizeVal(ReadSize));
GotRes := isValidLoc(GotAddr);
CheckAddrRes('addr Reg regsize'+IntToStr(a), ExpIntVal);
end;
GotAddr := FDummyContext.ReadAddress(ConstLoc(QWord(ExpIntVal)), SizeVal(ReadSize));
GotRes := isValidLoc(GotAddr);
CheckAddrRes('addr const (pre-expanded)', ExpIntVal);
end;
begin
InitMemMgr;
TestBaseName := 'size 1';
SetData($00); DoSignedIntTests(1, 0);
SetData($08); DoSignedIntTests(1, 8);
SetData($7f); DoSignedIntTests(1, 127);
SetData($FB); DoSignedIntTests(1, -5);
SetData($80); DoSignedIntTests(1,-128);
SetData($FF); DoSignedIntTests(1, -1);
SetData($0108); DoSignedIntTests(1, 8);
TestBaseName := 'size 2';
SetData($0000); DoSignedIntTests(2, 0);
SetData($0108); DoSignedIntTests(2, 264);
SetData($00FB); DoSignedIntTests(2, 251);
SetData($FFFB); DoSignedIntTests(2, -5);
SetData($010208); DoSignedIntTests(2, 520);
TestBaseName := 'size 8';
SetData($7FAAFFBBFFCCFFDD); DoSignedIntTests(8, $7FAAFFBBFFCCFFDD);
SetData(QWord(-3)); DoSignedIntTests(8, -3);
TestBaseName := 'size 1';
SetData($00); DoUnsignedIntTests(1, 0);
SetData($08); DoUnsignedIntTests(1, 8);
SetData($7f); DoUnsignedIntTests(1, 127);
SetData($FB); DoUnsignedIntTests(1, 251);
SetData($80); DoUnsignedIntTests(1, 128);
SetData($FF); DoUnsignedIntTests(1, 255);
SetData($0108); DoSignedIntTests(1, 8);
FCurrentTestName := 'Extended';
DataExt := 1.7722;
GotRes := FDummyContext.ReadFloat(TargetLoc(TDbgPtr(@DataExt)), SizeVal(SizeOf(Extended)), GotExt);
AssertTrue(FCurrentTestName + 'Read OK', GotRes);
AssertEquals(FCurrentTestName + 'target not changed', 1.7722, DataExt);
AssertEquals(FCurrentTestName + 'Val', DataExt, GotExt);
FCurrentTestName := 'Double';
DataDouble := 1.7722;
GotRes := FDummyContext.ReadFloat(TargetLoc(TDbgPtr(@DataDouble)), SizeVal(SizeOf(Double)), GotExt);
AssertTrue(FCurrentTestName + 'Read OK', GotRes);
AssertEquals(FCurrentTestName + 'target not changed', 1.7722, DataDouble);
AssertEquals(FCurrentTestName + 'Val', DataDouble, GotExt);
FCurrentTestName := 'Single';
DataSingle := 1.7722;
GotRes := FDummyContext.ReadFloat(TargetLoc(TDbgPtr(@DataSingle)), SizeVal(SizeOf(Single)), GotExt);
AssertTrue(FCurrentTestName + 'Read OK', GotRes);
AssertEquals(FCurrentTestName + 'target not changed', 1.7722, DataSingle);
AssertEquals(FCurrentTestName + 'Val', DataSingle, GotExt);
end;
procedure TTestMemManager.TestAddrAndSizeOperations;
procedure CheckSize(AName: String; ASize: TFpDbgValueSize; ExpBytes, ExpBits: Int64);
begin
AssertEquals(AName + ' Byte: ', ExpBytes, ASize.Size);
AssertEquals(AName + ' Bits: ', ExpBits, ASize.BitSize);
end;
procedure CheckLoc(AName: String; ALoc: TFpDbgMemLocation; ExpAddr, ExpBits: Int64);
begin
AssertEquals(AName + ' Byte: ', ExpAddr, ALoc.Address);
AssertEquals(AName + ' Bits: ', ExpBits, ALoc.BitOffset);
end;
var
s1: TFpDbgValueSize;
a, b: Integer;
begin
s1 := SizeVal( 1); CheckSize('SizeVal( 1)', s1, 1,0);
s1 := SizeVal( 9); CheckSize('SizeVal( 9)', s1, 9,0);
s1 := SizeVal( 0); CheckSize('SizeVal( 0)', s1, 0,0);
s1 := SizeVal( -1); CheckSize('SizeVal( -1)', s1, -1,0);
s1 := SizeVal(-11); CheckSize('SizeVal(-11)', s1, -11,0);
s1 := ZeroSize; CheckSize('ZeroSize', s1, 0,0);
s1 := SizeFromBits( 1); CheckSize('SizeFromBits( 1)', s1, 0, 1);
s1 := SizeFromBits( 7); CheckSize('SizeFromBits( 7)', s1, 0, 7);
s1 := SizeFromBits( 8); CheckSize('SizeFromBits( 8)', s1, 1, 0);
s1 := SizeFromBits( 9); CheckSize('SizeFromBits( 9)', s1, 1, 1);
s1 := SizeFromBits( 128); CheckSize('SizeFromBits( 128)', s1, 16, 0);
s1 := SizeFromBits( 129); CheckSize('SizeFromBits( 129)', s1, 16, 1);
s1 := SizeFromBits( 0); CheckSize('SizeFromBits( 0)', s1, 0, 0);
s1 := SizeFromBits( -1); CheckSize('SizeFromBits( -1)', s1, 0,-1);
s1 := SizeFromBits( -7); CheckSize('SizeFromBits( -7)', s1, 0,-7);
s1 := SizeFromBits( -8); CheckSize('SizeFromBits( -8)', s1, -1,-0);
s1 := SizeFromBits( -9); CheckSize('SizeFromBits( -9)', s1, -1,-1);
s1 := SizeFromBits(-128); CheckSize('SizeFromBits(-128)', s1,-16,-0);
s1 := SizeFromBits(-129); CheckSize('SizeFromBits(-129)', s1,-16,-1);
// =
for a := -50 to 50 do
for b := -50 to 50 do
if a = b then
AssertTrue('True: SizeFromBits('+inttostr(a)+')=SizeFromBits('+inttostr(b)+')', SizeFromBits(a)=SizeFromBits(b))
else
AssertFalse('False: SizeFromBits('+inttostr(a)+')=SizeFromBits('+inttostr(b)+')', SizeFromBits(a)=SizeFromBits(b));
// =
for a := -50 to 50 do
for b := -7 to 7 do
if a = b*8 then
AssertTrue('True: SizeFromBits('+inttostr(a)+')=('+inttostr(b)+')', SizeFromBits(a)=(b))
else
AssertFalse('False: SizeFromBits('+inttostr(a)+')=('+inttostr(b)+')', SizeFromBits(a)=(b));
// >
for a := -50 to 50 do
for b := -7 to 7 do
if a > b*8 then
AssertTrue('True: SizeFromBits('+inttostr(a)+')>('+inttostr(b)+')', SizeFromBits(a)>(b))
else
AssertFalse('False: SizeFromBits('+inttostr(a)+')>('+inttostr(b)+')', SizeFromBits(a)>(b));
// >=
for a := -50 to 50 do
for b := -7 to 7 do
if a >= b*8 then
AssertTrue('True: SizeFromBits('+inttostr(a)+')>=('+inttostr(b)+')', SizeFromBits(a)>=(b))
else
AssertFalse('False: SizeFromBits('+inttostr(a)+')>=('+inttostr(b)+')', SizeFromBits(a)>=(b));
// <
for a := -50 to 50 do
for b := -7 to 7 do
if a < b*8 then
AssertTrue('True: SizeFromBits('+inttostr(a)+')<('+inttostr(b)+')', SizeFromBits(a)<(b))
else
AssertFalse('False: SizeFromBits('+inttostr(a)+')<('+inttostr(b)+')', SizeFromBits(a)<(b));
// <=
for a := -50 to 50 do
for b := -7 to 7 do
if a <= b*8 then
AssertTrue('True: SizeFromBits('+inttostr(a)+')<=('+inttostr(b)+')', SizeFromBits(a)<=(b))
else
AssertFalse('False: SizeFromBits('+inttostr(a)+')<=('+inttostr(b)+')', SizeFromBits(a)<=(b));
a:=-50;
b:=-50;
AssertTrue('=: SizeFromBits('+inttostr(a)+')+ SizeFromBits('+inttostr(b)+' = SizeFromBits('+inttostr(a+b)+'))',
SizeFromBits(a)+ SizeFromBits(b) = SizeFromBits(a+b));
AssertTrue('=: SizeFromBits('+inttostr(a)+')- SizeFromBits('+inttostr(b)+' = SizeFromBits('+inttostr(a-b)+'))',
SizeFromBits(a)- SizeFromBits(b) = SizeFromBits(a-b));
// +
for a := -50 to 50 do
for b := -50 to 50 do
AssertTrue('=: SizeFromBits('+inttostr(a)+')+ SizeFromBits('+inttostr(b)+' = SizeFromBits('+inttostr(a+b)+'))',
SizeFromBits(a)+ SizeFromBits(b) = SizeFromBits(a+b));
// -
for a := -50 to 50 do
for b := -50 to 50 do
AssertTrue('=: SizeFromBits('+inttostr(a)+')- SizeFromBits('+inttostr(b)+' = SizeFromBits('+inttostr(a-b)+'))',
SizeFromBits(a)- SizeFromBits(b) = SizeFromBits(a-b));
// *
for a := -50 to 50 do
for b := -30 to 30 do
AssertTrue('=: SizeFromBits('+inttostr(a)+')* ('+inttostr(b)+' = SizeFromBits('+inttostr(a-b)+'))',
SizeFromBits(a)* (b) = SizeFromBits(a*b));
//// X
//for a := -50 to 50 do
//for b := -7 to 7 do
//if a X b*8 then
// AssertTrue('True: SizeFromBits('+inttostr(a)+')X('+inttostr(b)+')', SizeFromBits(a)X(b));
//else
// AssertFalse('False: SizeFromBits('+inttostr(a)+')X('+inttostr(b)+')', SizeFromBits(a)X(b));
CheckLoc('TargetLoc(500)', TargetLoc(500), 500, 0);
CheckLoc('TargetLoc(501)', TargetLoc(501), 501, 0);
CheckLoc('AddBitOffset(TargetLoc(500), 0)', AddBitOffset(TargetLoc(500), 0), 500, 0);
CheckLoc('AddBitOffset(TargetLoc(500), 1)', AddBitOffset(TargetLoc(500), 1), 500, 1);
CheckLoc('AddBitOffset(TargetLoc(500), 7)', AddBitOffset(TargetLoc(500), 7), 500, 7);
CheckLoc('AddBitOffset(TargetLoc(500), 8)', AddBitOffset(TargetLoc(500), 8), 501, 0);
CheckLoc('AddBitOffset(TargetLoc(500), 9)', AddBitOffset(TargetLoc(500), 9), 501, 1);
CheckLoc('AddBitOffset(TargetLoc(500), 16)', AddBitOffset(TargetLoc(500), 16), 502, 0);
CheckLoc('AddBitOffset(TargetLoc(500), 33)', AddBitOffset(TargetLoc(500), 33), 504, 1);
CheckLoc('AddBitOffset(TargetLoc(500), -1)', AddBitOffset(TargetLoc(500), -1), 499, 7);
CheckLoc('AddBitOffset(TargetLoc(500), -2)', AddBitOffset(TargetLoc(500), -2), 499, 6);
CheckLoc('AddBitOffset(TargetLoc(500), -7)', AddBitOffset(TargetLoc(500), -7), 499, 1);
CheckLoc('AddBitOffset(TargetLoc(500), -8)', AddBitOffset(TargetLoc(500), -8), 499, 0);
CheckLoc('AddBitOffset(TargetLoc(500), -9)', AddBitOffset(TargetLoc(500), -9), 498, 7);
CheckLoc('AddBitOffset(TargetLoc(500),-16)', AddBitOffset(TargetLoc(500), -16), 498, 0);
CheckLoc('AddBitOffset(TargetLoc(500),-33)', AddBitOffset(TargetLoc(500), -33), 495, 7);
CheckLoc('TargetLoc(500) + SizeFromBits( 0)', TargetLoc(500) + SizeFromBits( 0), 500, 0);
CheckLoc('TargetLoc(500) + SizeFromBits( 1)', TargetLoc(500) + SizeFromBits( 1), 500, 1);
CheckLoc('TargetLoc(500) + SizeFromBits( 7)', TargetLoc(500) + SizeFromBits( 7), 500, 7);
CheckLoc('TargetLoc(500) + SizeFromBits( 8)', TargetLoc(500) + SizeFromBits( 8), 501, 0);
CheckLoc('TargetLoc(500) + SizeFromBits( 9)', TargetLoc(500) + SizeFromBits( 9), 501, 1);
CheckLoc('TargetLoc(500) + SizeFromBits( 16)', TargetLoc(500) + SizeFromBits( 16), 502, 0);
CheckLoc('TargetLoc(500) + SizeFromBits( 33)', TargetLoc(500) + SizeFromBits( 33), 504, 1);
CheckLoc('TargetLoc(500) + SizeFromBits( -1)', TargetLoc(500) + SizeFromBits( -1), 499, 7);
CheckLoc('TargetLoc(500) + SizeFromBits( -2)', TargetLoc(500) + SizeFromBits( -2), 499, 6);
CheckLoc('TargetLoc(500) + SizeFromBits( -7)', TargetLoc(500) + SizeFromBits( -7), 499, 1);
CheckLoc('TargetLoc(500) + SizeFromBits( -8)', TargetLoc(500) + SizeFromBits( -8), 499, 0);
CheckLoc('TargetLoc(500) + SizeFromBits( -9)', TargetLoc(500) + SizeFromBits( -9), 498, 7);
CheckLoc('TargetLoc(500) + SizeFromBits(-16)', TargetLoc(500) + SizeFromBits(-16), 498, 0);
CheckLoc('TargetLoc(500) + SizeFromBits(-33)', TargetLoc(500) + SizeFromBits(-33), 495, 7);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( 0)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( 0), 500, 1);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( 1)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( 1), 500, 2);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( 7)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( 7), 501, 0);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( 8)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( 8), 501, 1);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( 9)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( 9), 501, 2);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( 16)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( 16), 502, 1);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( 33)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( 33), 504, 2);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( -1)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( -1), 500, 0);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( -2)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( -2), 499, 7);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( -7)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( -7), 499, 2);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( -8)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( -8), 499, 1);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits( -9)', AddBitOffset(TargetLoc(500),1) + SizeFromBits( -9), 499, 0);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits(-16)', AddBitOffset(TargetLoc(500),1) + SizeFromBits(-16), 498, 1);
CheckLoc('AddBitOffset(TargetLoc(500),1) + SizeFromBits(-33)', AddBitOffset(TargetLoc(500),1) + SizeFromBits(-33), 496, 0);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( 0)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( 0), 500, 7);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( 1)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( 1), 501, 0);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( 7)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( 7), 501, 6);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( 8)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( 8), 501, 7);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( 9)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( 9), 502, 0);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( 16)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( 16), 502, 7);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( 33)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( 33), 505, 0);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( -1)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( -1), 500, 6);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( -2)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( -2), 500, 5);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( -7)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( -7), 500, 0);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( -8)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( -8), 499, 7);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits( -9)', AddBitOffset(TargetLoc(500),7) + SizeFromBits( -9), 499, 6);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits(-16)', AddBitOffset(TargetLoc(500),7) + SizeFromBits(-16), 498, 7);
CheckLoc('AddBitOffset(TargetLoc(500),7) + SizeFromBits(-33)', AddBitOffset(TargetLoc(500),7) + SizeFromBits(-33), 496, 6);
end;
initialization
RegisterTest(TTestMemManager);
end.