Files
lazarus-ccr/wst/trunk/tests/test_suite/test_std_cursors.pas

271 lines
5.7 KiB
ObjectPascal
Raw Normal View History

{$INCLUDE wst_global.inc}
unit test_std_cursors;
interface
uses
Classes, SysUtils, Contnrs,
{$IFDEF FPC}
fpcunit, testutils, testregistry,
{$ELSE}
TestFrameWork,
{$ENDIF}
cursor_intf, std_cursors, rtti_filters;
{$INCLUDE wst.inc}
{$INCLUDE wst_delphi.inc}
type
{ TClass_A }
TClass_A = class(TPersistent)
private
FIntProp: Integer;
public
constructor Create(AIntProp : Integer);
published
property IntProp : Integer read FIntProp;
end;
{ TClass_B }
TClass_B = class(TClass_A)
private
FIntProp_A: Integer;
FIntProp_B: Integer;
public
constructor Create(AIntProp,AIntProp_A,AIntProp_B : Integer);
published
property IntProp_A : Integer read FIntProp_A;
property IntProp_B : Integer read FIntProp_B;
end;
{ TObjectListCursor_Test }
TObjectListCursor_Test = class(TTestCase)
published
procedure All();
procedure GetCount();
end;
{ TObjectListFilterableCursor_Test }
TObjectListFilterableCursor_Test = class(TTestCase)
published
procedure All();
end;
implementation
{ TClass_A }
constructor TClass_A.Create(AIntProp: Integer);
begin
FIntProp := AIntProp;
end;
{ TObjectListCursor_Test }
procedure TObjectListCursor_Test.All();
const O_COUNT = 100;
var
x : IObjectCursor;
ls : TObjectList;
i : Integer;
begin
ls := TObjectList.Create(True);
try
x := TObjectListCursor.Create(ls);
x.Reset();
CheckEquals(False,x.MoveNext());
x.Reset();
CheckEquals(False,x.MoveNext());
CheckEquals(False,x.MoveNext());
try
x.GetCurrent();
Check(False);
except
on e : ECursorException do begin
// GOOD
end;
end;
ls.Add(TClass_A.Create(0));
x.Reset();
CheckEquals(True,x.MoveNext());
CheckSame(ls[0],x.GetCurrent());
CheckEquals(False,x.MoveNext());
try
x.GetCurrent();
Check(False);
except
on e : ECursorException do begin
// GOOD
end;
end;
x.Reset();
CheckEquals(True,x.MoveNext());
CheckSame(ls[0],x.GetCurrent());
CheckEquals(False,x.MoveNext());
ls.Clear();
for i := 0 to Pred(O_COUNT) do
ls.Add(TClass_A.Create(i));
x.Reset();
for i := 0 to Pred(O_COUNT) do begin
CheckEquals(True,x.MoveNext());
CheckSame(ls[i],x.GetCurrent());
end;
CheckEquals(False,x.MoveNext());
x.Reset();
for i := 0 to Pred(O_COUNT) do begin
CheckEquals(True,x.MoveNext());
CheckSame(ls[i],x.GetCurrent());
end;
finally
ls.Free();
end;
end;
procedure TObjectListCursor_Test.GetCount();
const O_COUNT = 100;
var
x : IObjectCursor;
ls : TObjectList;
i : Integer;
begin
ls := TObjectList.Create(True);
try
x := TObjectListCursor.Create(ls);
CheckEquals(ls.Count,x.GetCount());
ls.Add(TClass_A.Create(0));
CheckEquals(ls.Count,x.GetCount());
ls.Clear();
CheckEquals(ls.Count,x.GetCount());
for i := 0 to Pred(O_COUNT) do
ls.Add(TClass_A.Create(i));
x.Reset();
CheckEquals(ls.Count,x.GetCount());
for i := 0 to Pred(O_COUNT) do begin
CheckEquals(True,x.MoveNext());
CheckEquals(ls.Count,x.GetCount());
end;
CheckEquals(ls.Count,x.GetCount());
finally
ls.Free();
end;
end;
{ TClass_B }
constructor TClass_B.Create(AIntProp, AIntProp_A, AIntProp_B: Integer);
begin
inherited Create(AIntProp);
FIntProp_A := AIntProp_A;
FIntProp_B := AIntProp_B;
end;
{ TObjectListFilterableCursor_Test }
procedure TObjectListFilterableCursor_Test.All();
const O_COUNT = 100;
var
x : IFilterableObjectCursor;
ls : TObjectList;
i : Integer;
f : IObjectFilter;
fcr : TRttiFilterCreator;
begin
fcr := nil;
ls := TObjectList.Create(True);
try
x := TObjectListFilterableCursor.Create(ls);
CheckNull(x.GetFilter());
x.Reset();
CheckEquals(False,x.MoveNext());
x.Reset();
CheckEquals(False,x.MoveNext());
CheckEquals(False,x.MoveNext());
try
x.GetCurrent();
Check(False);
except
on e : ECursorException do begin
// GOOD
end;
end;
ls.Add(TClass_A.Create(0));
x.Reset();
CheckEquals(True,x.MoveNext());
CheckSame(ls[0],x.GetCurrent());
CheckEquals(False,x.MoveNext());
try
x.GetCurrent();
Check(False);
except
on e : ECursorException do begin
// GOOD
end;
end;
x.Reset();
CheckEquals(True,x.MoveNext());
CheckSame(ls[0],x.GetCurrent());
CheckEquals(False,x.MoveNext());
ls.Clear();
for i := 0 to Pred(O_COUNT) do
ls.Add(TClass_A.Create(i));
x.Reset();
for i := 0 to Pred(O_COUNT) do begin
CheckEquals(True,x.MoveNext());
CheckSame(ls[i],x.GetCurrent());
end;
CheckEquals(False,x.MoveNext());
x.Reset();
for i := 0 to Pred(O_COUNT) do begin
CheckEquals(True,x.MoveNext());
CheckSame(ls[i],x.GetCurrent());
end;
ls.Clear();
for i := 0 to Pred(O_COUNT) do
ls.Add(TClass_B.Create(i,( i mod 10 ), ( i mod ( ( i + 1 ) * 2 ) ) ));
fcr := TRttiFilterCreator.Create(TClass_B);
fcr.AddCondition('IntProp',nfoEqual,-1,fcOr);//
f := TRttiObjectFilter.Create(fcr.Root,clrFreeObjects) as IObjectFilter;
x.SetFilter(f);
Check(x.GetFilter()=f);
x.SetFilter(nil);
CheckNull(x.GetFilter());
x.SetFilter(f);
Check(x.GetFilter()=f);
x.Reset();
CheckEquals(False,x.MoveNext());
fcr.AddCondition('IntProp',nfoGreater,-1,fcOr);
x.Reset();
CheckEquals(True,x.MoveNext());
x.Reset();
for i := 0 to Pred(O_COUNT) do begin
CheckEquals(True,x.MoveNext());
CheckSame(ls[i],x.GetCurrent());
end;
finally
ls.Free();
fcr.Free();
end;
end;
Initialization
RegisterTest('Cursors',TObjectListCursor_Test.Suite);
RegisterTest('Cursors',TObjectListFilterableCursor_Test.Suite);
end.