2005-07-01 11:43:59 +00:00
|
|
|
unit HashesTest;
|
|
|
|
|
2007-06-13 07:26:50 +00:00
|
|
|
{$I X2UtCompilerVersion.inc}
|
|
|
|
|
2005-07-01 11:43:59 +00:00
|
|
|
interface
|
|
|
|
uses
|
|
|
|
TestFramework,
|
2005-08-26 10:25:39 +00:00
|
|
|
X2UtHashes,
|
|
|
|
X2UtHashesVariants;
|
2005-07-01 11:43:59 +00:00
|
|
|
|
|
|
|
type
|
|
|
|
THashesTest = class(TTestCase)
|
|
|
|
private
|
|
|
|
FHash: TX2CustomHash;
|
|
|
|
protected
|
|
|
|
procedure TearDown(); override;
|
|
|
|
procedure FillTestItems(); virtual; abstract;
|
|
|
|
published
|
|
|
|
procedure testSet(); virtual; abstract;
|
|
|
|
procedure testGet(); virtual; abstract;
|
|
|
|
procedure testClear();
|
|
|
|
procedure testDelete(); virtual; abstract;
|
|
|
|
procedure testIterate(); virtual; abstract;
|
2005-12-28 19:15:17 +00:00
|
|
|
procedure testEnumerator(); virtual; abstract;
|
2005-07-01 11:43:59 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
// Two test cases involving all value managers.
|
|
|
|
// This should be sufficient for a realistic scenario.
|
|
|
|
THashesSITest = class(THashesTest)
|
|
|
|
private
|
|
|
|
function GetHash(): TX2SIHash;
|
|
|
|
|
|
|
|
property Hash: TX2SIHash read GetHash;
|
|
|
|
protected
|
|
|
|
procedure SetUp(); override;
|
|
|
|
procedure FillTestItems(); override;
|
|
|
|
published
|
|
|
|
procedure testSet(); override;
|
|
|
|
procedure testGet(); override;
|
|
|
|
procedure testDelete(); override;
|
|
|
|
procedure testIterate(); override;
|
2005-12-28 19:15:17 +00:00
|
|
|
procedure testEnumerator(); override;
|
2005-07-01 11:43:59 +00:00
|
|
|
end;
|
|
|
|
|
|
|
|
THashesPOTest = class(THashesTest)
|
|
|
|
private
|
|
|
|
function GetHash(): TX2POHash;
|
|
|
|
|
|
|
|
property Hash: TX2POHash read GetHash;
|
|
|
|
protected
|
|
|
|
procedure SetUp(); override;
|
|
|
|
procedure FillTestItems(); override;
|
|
|
|
published
|
|
|
|
procedure testSet(); override;
|
|
|
|
procedure testGet(); override;
|
|
|
|
procedure testDelete(); override;
|
|
|
|
procedure testIterate(); override;
|
2005-12-28 19:15:17 +00:00
|
|
|
procedure testEnumerator(); override;
|
2005-07-01 11:43:59 +00:00
|
|
|
end;
|
|
|
|
|
2005-08-26 10:25:39 +00:00
|
|
|
THashesVariantTest = class(THashesTest)
|
|
|
|
private
|
|
|
|
function GetHash(): TX2SVHash;
|
|
|
|
|
|
|
|
property Hash: TX2SVHash read GetHash;
|
|
|
|
protected
|
|
|
|
procedure SetUp(); override;
|
|
|
|
procedure FillTestItems(); override;
|
|
|
|
published
|
|
|
|
procedure testSet(); override;
|
|
|
|
procedure testGet(); override;
|
|
|
|
procedure testDelete(); override;
|
|
|
|
procedure testIterate(); override;
|
2005-12-28 19:15:17 +00:00
|
|
|
procedure testEnumerator(); override;
|
2005-08-26 10:25:39 +00:00
|
|
|
end;
|
|
|
|
|
2005-07-01 11:43:59 +00:00
|
|
|
implementation
|
|
|
|
uses
|
|
|
|
SysUtils;
|
|
|
|
|
|
|
|
type
|
|
|
|
TObject0 = class(TObject);
|
|
|
|
TObject1 = class(TObject);
|
|
|
|
TObject2 = class(TObject);
|
|
|
|
|
|
|
|
|
|
|
|
{ THashesTest }
|
|
|
|
procedure THashesTest.TearDown;
|
|
|
|
begin
|
|
|
|
FreeAndNil(FHash);
|
|
|
|
|
|
|
|
inherited;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure THashesTest.testClear;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
FHash.Clear();
|
|
|
|
CheckEquals(0, FHash.Count);
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
{ THashesSITest }
|
|
|
|
procedure THashesSITest.SetUp;
|
|
|
|
begin
|
|
|
|
inherited;
|
|
|
|
|
|
|
|
FHash := TX2SIHash.Create();
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesSITest.FillTestItems;
|
|
|
|
begin
|
|
|
|
Hash['Key1'] := 1;
|
|
|
|
Hash['Key2'] := 2;
|
|
|
|
Hash['Key3'] := 3;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesSITest.testSet;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
CheckEquals(3, Hash.Count);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesSITest.testGet;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
CheckEquals(1, Hash['Key1']);
|
|
|
|
CheckEquals(2, Hash['Key2']);
|
|
|
|
CheckEquals(3, Hash['Key3']);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesSITest.testDelete;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
Hash.Delete('Key2');
|
|
|
|
|
|
|
|
CheckEquals(2, Hash.Count);
|
|
|
|
CheckTrue(Hash.Exists('Key1'), 'Key1 does not exist!');
|
|
|
|
CheckFalse(Hash.Exists('Key2'), 'Key2 still exists!');
|
|
|
|
CheckTrue(Hash.Exists('Key3'), 'Key3 does not exist!');
|
|
|
|
end;
|
|
|
|
|
2005-12-28 19:15:17 +00:00
|
|
|
procedure THashesSITest.testEnumerator;
|
|
|
|
var
|
|
|
|
aPresent: array[1..3] of Boolean;
|
|
|
|
sKey: String;
|
|
|
|
|
|
|
|
begin
|
2007-06-13 07:26:50 +00:00
|
|
|
{$IFDEF D2006}
|
2005-12-28 19:15:17 +00:00
|
|
|
FillTestItems();
|
|
|
|
FillChar(aPresent, SizeOf(aPresent), #0);
|
|
|
|
|
|
|
|
for sKey in Hash do
|
|
|
|
begin
|
|
|
|
if sKey = 'Key1' then
|
|
|
|
aPresent[1] := True
|
|
|
|
else if sKey = 'Key2' then
|
|
|
|
aPresent[2] := True
|
|
|
|
else if sKey = 'Key3' then
|
|
|
|
aPresent[3] := True;
|
|
|
|
end;
|
|
|
|
|
|
|
|
CheckTrue(aPresent[1], 'Key1 was not in the enumeration!');
|
|
|
|
CheckTrue(aPresent[2], 'Key2 was not in the enumeration!');
|
|
|
|
CheckTrue(aPresent[3], 'Key3 was not in the enumeration!');
|
2007-06-13 07:26:50 +00:00
|
|
|
{$ENDIF}
|
2005-12-28 19:15:17 +00:00
|
|
|
|
|
|
|
{ Not supported yet, maybe in the future.
|
|
|
|
FillChar(aPresent, SizeOf(aPresent), #0);
|
|
|
|
for iValue in Hash.Values do
|
|
|
|
aPresent[iValue] := True;
|
|
|
|
|
|
|
|
CheckTrue(aPresent[1], 'Value of Key1 was not in the enumeration!');
|
|
|
|
CheckTrue(aPresent[2], 'Value of Key2 was not in the enumeration!');
|
|
|
|
CheckTrue(aPresent[3], 'Value of Key3 was not in the enumeration!');
|
|
|
|
}
|
|
|
|
end;
|
|
|
|
|
2005-07-01 11:43:59 +00:00
|
|
|
procedure THashesSITest.testIterate;
|
|
|
|
var
|
|
|
|
aPresent: array[1..3] of Boolean;
|
|
|
|
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
FillChar(aPresent, SizeOf(aPresent), #0);
|
|
|
|
Hash.First();
|
|
|
|
while Hash.Next() do
|
|
|
|
if ((Hash.CurrentKey = 'Key1') and (Hash.CurrentValue = 1)) or
|
|
|
|
((Hash.CurrentKey = 'Key2') and (Hash.CurrentValue = 2)) or
|
|
|
|
((Hash.CurrentKey = 'Key3') and (Hash.CurrentValue = 3)) then
|
|
|
|
aPresent[Hash.CurrentValue] := True;
|
|
|
|
|
|
|
|
CheckTrue(aPresent[1], 'Key1 was not in the iteration!');
|
|
|
|
CheckTrue(aPresent[2], 'Key2 was not in the iteration!');
|
|
|
|
CheckTrue(aPresent[3], 'Key3 was not in the iteration!');
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function THashesSITest.GetHash(): TX2SIHash;
|
|
|
|
begin
|
|
|
|
Result := TX2SIHash(FHash);
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
{ THashesPOTest }
|
|
|
|
procedure THashesPOTest.SetUp;
|
|
|
|
begin
|
|
|
|
inherited;
|
|
|
|
|
|
|
|
FHash := TX2POHash.Create(True);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesPOTest.FillTestItems;
|
|
|
|
begin
|
|
|
|
Hash[Pointer(0)] := TObject0.Create();
|
|
|
|
Hash[Pointer(1)] := TObject1.Create();
|
|
|
|
Hash[Pointer(2)] := TObject2.Create();
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesPOTest.testSet;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
CheckEquals(3, Hash.Count);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesPOTest.testGet;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
CheckTrue(Hash[Pointer(0)] is TObject0);
|
|
|
|
CheckTrue(Hash[Pointer(1)] is TObject1);
|
|
|
|
CheckTrue(Hash[Pointer(2)] is TObject2);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesPOTest.testDelete;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
Hash.Delete(Pointer(1));
|
|
|
|
|
|
|
|
CheckEquals(2, Hash.Count);
|
|
|
|
CheckTrue(Hash.Exists(Pointer(0)), 'Key1 does not exist!');
|
|
|
|
CheckFalse(Hash.Exists(Pointer(1)), 'Key2 still exists!');
|
|
|
|
CheckTrue(Hash.Exists(Pointer(2)), 'Key3 does not exist!');
|
|
|
|
end;
|
|
|
|
|
2005-12-28 19:15:17 +00:00
|
|
|
procedure THashesPOTest.testEnumerator;
|
|
|
|
var
|
|
|
|
aPresent: array[0..2] of Boolean;
|
|
|
|
pKey: Pointer;
|
|
|
|
|
|
|
|
begin
|
2007-06-13 07:26:50 +00:00
|
|
|
{$IFDEF D2006}
|
2005-12-28 19:15:17 +00:00
|
|
|
FillTestItems();
|
|
|
|
FillChar(aPresent, SizeOf(aPresent), #0);
|
|
|
|
|
|
|
|
for pKey in Hash do
|
|
|
|
aPresent[Integer(pKey)] := True;
|
|
|
|
|
|
|
|
CheckTrue(aPresent[0], 'Key1 was not in the enumeration!');
|
|
|
|
CheckTrue(aPresent[1], 'Key2 was not in the enumeration!');
|
|
|
|
CheckTrue(aPresent[2], 'Key3 was not in the enumeration!');
|
2007-06-13 07:26:50 +00:00
|
|
|
{$ENDIF}
|
2005-12-28 19:15:17 +00:00
|
|
|
end;
|
|
|
|
|
2005-07-01 11:43:59 +00:00
|
|
|
procedure THashesPOTest.testIterate;
|
|
|
|
var
|
|
|
|
aPresent: array[0..2] of Boolean;
|
|
|
|
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
FillChar(aPresent, SizeOf(aPresent), #0);
|
|
|
|
Hash.First();
|
|
|
|
while Hash.Next() do
|
|
|
|
if ((Hash.CurrentKey = Pointer(0)) and (Hash.CurrentValue is TObject0)) or
|
|
|
|
((Hash.CurrentKey = Pointer(1)) and (Hash.CurrentValue is TObject1)) or
|
|
|
|
((Hash.CurrentKey = Pointer(2)) and (Hash.CurrentValue is TObject2)) then
|
|
|
|
aPresent[Integer(Hash.CurrentKey)] := True;
|
|
|
|
|
|
|
|
CheckTrue(aPresent[0], 'Key1 was not in the iteration!');
|
|
|
|
CheckTrue(aPresent[1], 'Key2 was not in the iteration!');
|
|
|
|
CheckTrue(aPresent[2], 'Key3 was not in the iteration!');
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
function THashesPOTest.GetHash(): TX2POHash;
|
|
|
|
begin
|
|
|
|
Result := TX2POHash(FHash);
|
|
|
|
end;
|
|
|
|
|
2005-08-26 10:25:39 +00:00
|
|
|
{ THashesVariantTest }
|
|
|
|
procedure THashesVariantTest.SetUp;
|
|
|
|
begin
|
|
|
|
inherited;
|
|
|
|
|
|
|
|
FHash := TX2SVHash.Create();
|
|
|
|
end;
|
|
|
|
|
|
|
|
function THashesVariantTest.GetHash(): TX2SVHash;
|
|
|
|
begin
|
|
|
|
Result := TX2SVHash(FHash);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesVariantTest.FillTestItems;
|
|
|
|
begin
|
|
|
|
Hash['Key1'] := 'String';
|
|
|
|
Hash['Key2'] := 5;
|
|
|
|
Hash['Key3'] := 40.4;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesVariantTest.testSet;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
CheckEquals(3, Hash.Count);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesVariantTest.testGet;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
CheckTrue(Hash['Key1'] = 'String');
|
|
|
|
CheckTrue(Hash['Key2'] = 5);
|
|
|
|
CheckTrue(Hash['Key3'] = 40.4);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure THashesVariantTest.testDelete;
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
Hash.Delete('Key2');
|
|
|
|
|
|
|
|
CheckEquals(2, Hash.Count);
|
|
|
|
CheckTrue(Hash.Exists('Key1'), 'Key1 does not exist!');
|
|
|
|
CheckFalse(Hash.Exists('Key2'), 'Key2 still exists!');
|
|
|
|
CheckTrue(Hash.Exists('Key3'), 'Key3 does not exist!');
|
|
|
|
end;
|
|
|
|
|
2005-12-28 19:15:17 +00:00
|
|
|
procedure THashesVariantTest.testEnumerator;
|
|
|
|
begin
|
|
|
|
Check(True, 'Not implemented yet.');
|
|
|
|
end;
|
|
|
|
|
2005-08-26 10:25:39 +00:00
|
|
|
procedure THashesVariantTest.testIterate;
|
|
|
|
var
|
|
|
|
aPresent: array[0..2] of Boolean;
|
|
|
|
|
|
|
|
begin
|
|
|
|
FillTestItems();
|
|
|
|
FillChar(aPresent, SizeOf(aPresent), #0);
|
|
|
|
Hash.First();
|
|
|
|
while Hash.Next() do
|
|
|
|
if ((Hash.CurrentKey = 'Key1') and (Hash.CurrentValue = 'String')) then
|
|
|
|
aPresent[0] := True
|
|
|
|
else if ((Hash.CurrentKey = 'Key2') and (Hash.CurrentValue = 5)) then
|
|
|
|
aPresent[1] := True
|
|
|
|
else if ((Hash.CurrentKey = 'Key3') and (Hash.CurrentValue = 40.4)) then
|
|
|
|
aPresent[2] := True;
|
|
|
|
|
|
|
|
CheckTrue(aPresent[0], 'Key1 was not in the iteration!');
|
|
|
|
CheckTrue(aPresent[1], 'Key2 was not in the iteration!');
|
|
|
|
CheckTrue(aPresent[2], 'Key3 was not in the iteration!');
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
2005-07-01 11:43:59 +00:00
|
|
|
initialization
|
|
|
|
RegisterTest('Hashes', THashesSITest.Suite);
|
|
|
|
RegisterTest('Hashes', THashesPOTest.Suite);
|
2005-08-26 10:25:39 +00:00
|
|
|
RegisterTest('Hashes', THashesVariantTest.Suite);
|
2005-07-01 11:43:59 +00:00
|
|
|
|
|
|
|
end.
|