1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
{
Copyright 2011-2017 Michalis Kamburelis.
This file is part of "Castle Game Engine".
"Castle Game Engine" is free software; see the file COPYING.txt,
included in this distribution, for details about the copyright.
"Castle Game Engine" is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
----------------------------------------------------------------------------
}
unit TestCastleGenericLists;
interface
uses fpcunit, testutils, testregistry;
type
TTestGenericLists = class(TTestCase)
published
procedure TestList;
procedure TestMap;
end;
implementation
uses SysUtils, Classes,
CastleGenericLists;
{ Do not put these as local types inside TestList, it makes FPC 2.6.4
fail with Access Violation. (Works OK with FPC 3.0.2.) }
type
TMyRecord = record S: string; Int: Integer; end;
TMyRecordList = specialize TGenericStructList<TMyRecord>;
procedure TTestGenericLists.TestList;
var
L: TMyRecordList;
R: TMyRecord;
begin
L := TMyRecordList.Create;
try
R.S := 'blah';
R.Int := 234;
L.Add(R);
R.S := 'foo';
R.Int := 666;
L.Add(R);
AssertEquals(2, L.Count);
AssertEquals('foo', L[1].S);
AssertEquals(666, L[1].Int);
AssertEquals('blah', L[0].S);
AssertEquals(234, L[0].Int);
// This should not even compile
// L[1].Int := 44;
L.List^[1].Int := 44;
AssertEquals(44, L[1].Int);
AssertEquals('foo', L[1].S); // L[1].S unchaned
L.L[1].Int := 789;
AssertEquals(789, L[1].Int);
AssertEquals('foo', L[1].S); // L[1].S unchaned
finally FreeAndNil(L) end;
end;
type
TObjectToStringMap = specialize TGenericStructMap<TObject, string>;
procedure TTestGenericLists.TestMap;
var
Map: TObjectToStringMap;
O1, O2: TObject;
begin
O1 := nil;
O2 := nil;
Map := nil;
try
Map := TObjectToStringMap.Create;
O1 := TObject.Create;
O2 := TObject.Create;
AssertTrue(Map.IndexOf(O1) = -1);
AssertTrue(Map.IndexOf(O2) = -1);
Map.Add(O1, 'blah 1');
AssertTrue(Map.IndexOf(O1) = 0);
AssertTrue(Map.IndexOf(O2) = -1);
AssertTrue(Map[O1] = 'blah 1');
Map[O2] := 'blah 2';
Map[O1] := 'new blah 1';
AssertTrue(Map.IndexOf(O1) <> -1);
AssertTrue(Map.IndexOf(O2) <> -1);
AssertTrue(Map[O1] = 'new blah 1');
AssertTrue(Map[O2] = 'blah 2');
finally
FreeAndNil(Map);
FreeAndNil(O1);
FreeAndNil(O2);
end;
end;
initialization
RegisterTest(TTestGenericLists);
end.
|