123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264 |
- unit utcFPHashObjectList;
- {$mode objfpc}{$H+}
- interface
- uses
- Classes, SysUtils, contnrs, punit;
- procedure RegisterTests;
- implementation
- type
- TMyObject = class(TObject)
- IsFreed: ^Boolean;
- destructor Destroy; override;
- end;
- destructor TMyObject.Destroy;
- begin
- if Assigned(IsFreed) then
- IsFreed^ := True;
- inherited Destroy;
- end;
- Function TFPHashObjectList_TestCreate : TTestString;
- var
- L: TFPHashObjectList;
- begin
- Result:='';
- L := TFPHashObjectList.Create;
- try
- AssertNotNull('List should be created', L);
- AssertEquals('Count should be 0 on creation', 0, L.Count);
- AssertTrue('OwnsObjects should be true by default', L.OwnsObjects);
- finally
- L.Free;
- end;
- end;
- Function TFPHashObjectList_TestAdd : TTestString;
- var
- L: TFPHashObjectList;
- O1, O2: TObject;
- begin
- Result:='';
- L := TFPHashObjectList.Create(False);
- try
- O1 := TObject.Create;
- O2 := TObject.Create;
- L.Add('O1', O1);
- AssertEquals('Count should be 1 after adding one object', 1, L.Count);
- AssertSame('First item should be O1', O1, L.Items[0]);
- L.Add('O2', O2);
- AssertEquals('Count should be 2 after adding a second object', 2, L.Count);
- AssertSame('Second item should be O2', O2, L.Items[1]);
- finally
- L.Free;
- O1.Free;
- O2.Free;
- end;
- end;
- Function TFPHashObjectList_TestDelete : TTestString;
- var
- L: TFPHashObjectList;
- O1, O2: TObject;
- begin
- Result:='';
- L := TFPHashObjectList.Create(False);
- try
- O1 := TObject.Create;
- O2 := TObject.Create;
- L.Add('O1', O1);
- L.Add('O2', O2);
- L.Delete(0);
- AssertEquals('Count should be 1 after deleting an object', 1, L.Count);
- AssertSame('First item should now be O2', O2, L.Items[0]);
- finally
- L.Free;
- O1.Free;
- O2.Free;
- end;
- end;
- Function TFPHashObjectList_TestClear : TTestString;
- var
- L: TFPHashObjectList;
- O1, O2: TObject;
- begin
- Result:='';
- L := TFPHashObjectList.Create(False);
- try
- O1 := TObject.Create;
- O2 := TObject.Create;
- L.Add('O1', O1);
- L.Add('O2', O2);
- L.Clear;
- AssertEquals('Count should be 0 after clearing the list', 0, L.Count);
- finally
- L.Free;
- O1.Free;
- O2.Free;
- end;
- end;
- Function TFPHashObjectList_TestIndexOf : TTestString;
- var
- L: TFPHashObjectList;
- O1, O2, O3: TObject;
- begin
- Result:='';
- L := TFPHashObjectList.Create(False);
- O3 := TObject.Create;
- try
- O1 := TObject.Create;
- O2 := TObject.Create;
- L.Add('O1', O1);
- L.Add('O2', O2);
- AssertEquals('Index of O1 should be 0', 0, L.IndexOf(O1));
- AssertEquals('Index of O2 should be 1', 1, L.IndexOf(O2));
- AssertEquals('Index of a non-existent object should be -1', -1, L.IndexOf(O3));
- finally
- L.Free;
- O1.Free;
- O2.Free;
- O3.Free;
- end;
- end;
- Function TFPHashObjectList_TestRemove : TTestString;
- var
- L: TFPHashObjectList;
- O1, O2: TObject;
- begin
- Result:='';
- L := TFPHashObjectList.Create(False);
- try
- O1 := TObject.Create;
- O2 := TObject.Create;
- L.Add('O1', O1);
- L.Add('O2', O2);
- L.Remove(O1);
- AssertEquals('Count should be 1 after removing an object', 1, L.Count);
- AssertSame('First item should now be O2', O2, L.Items[0]);
- finally
- L.Free;
- O1.Free;
- O2.Free;
- end;
- end;
- Function TFPHashObjectList_TestOwnsObjects : TTestString;
- var
- L: TFPHashObjectList;
- O1: TMyObject;
- Freed: Boolean;
- begin
- Result:='';
- L := TFPHashObjectList.Create(True);
- Freed := False;
- O1 := TMyObject.Create;
- O1.IsFreed := @Freed;
- L.Add('O1', O1);
- L.Free; // This should free O1 as well
- AssertTrue('Object should be freed when OwnsObjects is true and list is freed', Freed);
- end;
- Function TFPHashObjectList_TestFind : TTestString;
- var
- L: TFPHashObjectList;
- O1, O2: TObject;
- begin
- Result:='';
- L := TFPHashObjectList.Create(False);
- try
- O1 := TObject.Create;
- O2 := TObject.Create;
- L.Add('O1', O1);
- L.Add('O2', O2);
- AssertSame('Find should return O1', O1, L.Find('O1'));
- AssertSame('Find should return O2', O2, L.Find('O2'));
- AssertEquals('Find for a non-existent object should return nil', nil, L.Find('O3'));
- finally
- L.Free;
- O1.Free;
- O2.Free;
- end;
- end;
- Function TFPHashObjectList_TestFindLong : TTestString;
- var
- L: TFPHashObjectList;
- O0, O1, O2: TObject;
- S : String;
- begin
- Result:='';
- O0:=Nil;
- O1:=Nil;
- O2:=Nil;
- L := TFPHashObjectList.Create(False);
- try
- O0 := TObject.Create;
- O1 := TObject.Create;
- O2 := TObject.Create;
- S:=StringOfChar('A',333);
- L.Add('x', O0);
- L.Add(S, O1);
- L.Add(S+'2', O2);
- AssertSame('Find should return O1', O1, L.Find(S));
- AssertSame('Find should return O2', O2, L.Find(S+'2'));
- AssertEquals('Find for a non-existent object should return nil', nil, L.Find('O3'));
- finally
- L.Free;
- O0.Free;
- O1.Free;
- O2.Free;
- end;
- end;
- Function TFPHashObjectList_TestFindIndexOf : TTestString;
- var
- L: TFPHashObjectList;
- O0, O1, O2: TObject;
- begin
- Result:='';
- O0:=Nil;
- O1:=Nil;
- O2:=Nil;
- L := TFPHashObjectList.Create(False);
- try
- O0 := TObject.Create;
- O1 := TObject.Create;
- O2 := TObject.Create;
- L.Add('O1', O1);
- L.Add('O2', O2);
- AssertEquals('FindIndexOf for O1 should be 0', 0, L.FindIndexOf('O1'));
- AssertEquals('FindIndexOf for O2 should be 1', 1, L.FindIndexOf('O2'));
- AssertEquals('FindIndexOf for a non-existent object should be -1', -1, L.FindIndexOf('O3'));
- finally
- L.Free;
- O0.Free;
- O1.Free;
- O2.Free;
- end;
- end;
- procedure RegisterTests;
- begin
- AddSuite('TFPHashObjectListTests');
- AddTest('TestCreate', @TFPHashObjectList_TestCreate, 'TFPHashObjectListTests');
- AddTest('TestAdd', @TFPHashObjectList_TestAdd, 'TFPHashObjectListTests');
- AddTest('TestDelete', @TFPHashObjectList_TestDelete, 'TFPHashObjectListTests');
- AddTest('TestClear', @TFPHashObjectList_TestClear, 'TFPHashObjectListTests');
- AddTest('TestIndexOf', @TFPHashObjectList_TestIndexOf, 'TFPHashObjectListTests');
- AddTest('TestRemove', @TFPHashObjectList_TestRemove, 'TFPHashObjectListTests');
- AddTest('TestOwnsObjects', @TFPHashObjectList_TestOwnsObjects, 'TFPHashObjectListTests');
- AddTest('TestFind', @TFPHashObjectList_TestFind, 'TFPHashObjectListTests');
- AddTest('TestFindLong', @TFPHashObjectList_TestFindLong, 'TFPHashObjectListTests');
- AddTest('TestFindIndexOf', @TFPHashObjectList_TestFindIndexOf, 'TFPHashObjectListTests');
- end;
- end.
|