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

511 lines
12 KiB
ObjectPascal

{$INCLUDE wst_global.inc}
unit test_wst_cursors;
interface
uses
Classes, SysUtils,
{$IFDEF FPC}
fpcunit, testutils, testregistry,
{$ELSE}
TestFrameWork,
{$ENDIF}
cursor_intf, wst_cursors, rtti_filters, base_service_intf;
{$INCLUDE wst.inc}
{$INCLUDE wst_delphi.inc}
type
{ TClass_A }
TClass_A = class(TBaseRemotable)
private
FIntProp: Integer;
public
constructor Create(AIntProp : Integer);
published
property IntProp : Integer read FIntProp;
end;
{ TTClass_A_ArrayRemotable }
TTClass_A_ArrayRemotable = class(TBaseObjectArrayRemotable)
public
class function GetItemClass():TBaseRemotableClass;override;
end;
{ TTClass_A_CollectionRemotable }
TTClass_A_CollectionRemotable = class(TObjectCollectionRemotable)
public
class function GetItemClass():TBaseRemotableClass;override;
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;
{ TTClass_B_ArrayRemotable }
TTClass_B_ArrayRemotable = class(TBaseObjectArrayRemotable)
public
class function GetItemClass():TBaseRemotableClass;override;
end;
{ TBaseObjectArrayRemotableCursor_Test }
TBaseObjectArrayRemotableCursor_Test = class(TTestCase)
published
procedure All();
end;
{ TBaseObjectArrayRemotableFilterableCursor_Test }
TBaseObjectArrayRemotableFilterableCursor_Test = class(TTestCase)
published
procedure All();
end;
{ TObjectCollectionRemotableCursor_Test }
TObjectCollectionRemotableCursor_Test = class(TTestCase)
published
procedure All();
end;
{ TUtilsProcs_Test }
TUtilsProcs_Test = class(TTestCase)
published
procedure test_Find_array();
procedure test_Find_collection();
procedure test_Filter_array();
procedure test_Filter_collection();
end;
implementation
{ TClass_A }
constructor TClass_A.Create(AIntProp: Integer);
begin
FIntProp := AIntProp;
end;
{ TBaseObjectArrayRemotableCursor_Test }
procedure TBaseObjectArrayRemotableCursor_Test.All();
const O_COUNT = 100;
var
x : IObjectCursor;
ls : TBaseObjectArrayRemotable;
i : Integer;
begin
ls := TTClass_A_ArrayRemotable.Create();
try
x := TBaseObjectArrayRemotableCursor.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.SetLength(1);
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.SetLength(O_COUNT);
for i := 0 to Pred(O_COUNT) do
TClass_A(ls[i]).FIntProp := 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;
{ 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;
{ TBaseObjectArrayRemotableFilterableCursor_Test }
procedure TBaseObjectArrayRemotableFilterableCursor_Test.All();
const O_COUNT = 100;
var
x : IFilterableObjectCursor;
ls : TBaseObjectArrayRemotable;
i : Integer;
f : IObjectFilter;
fcr : TRttiFilterCreator;
begin
fcr := nil;
ls := TTClass_A_ArrayRemotable.Create();
try
x := TBaseObjectArrayRemotableFilterableCursor.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.SetLength(1);
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.SetLength(O_COUNT);
for i := 0 to Pred(O_COUNT) do
TClass_A(ls[i]).FIntProp := 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;
FreeAndNil(ls);
ls := TTClass_B_ArrayRemotable.Create();
x := TBaseObjectArrayRemotableFilterableCursor.Create(ls);
ls.SetLength(O_COUNT);
for i := 0 to Pred(O_COUNT) do begin
TClass_B(ls[i]).FIntProp := i;
TClass_B(ls[i]).FIntProp_A := ( i mod 10 );
TClass_B(ls[i]).FIntProp_B := ( i mod ( ( i + 1 ) * 2 ) ) ;
end;
fcr := TRttiFilterCreator.Create(TClass_B);
fcr.AddCondition('IntProp',nfoEqual,-1,fcOr);//
f := TRttiObjectFilter.Create(fcr.Root,clrFreeObjects) as IObjectFilter;
//fcr.Clear(clrNone);
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;
{ TTClass_A_ArrayRemotable }
class function TTClass_A_ArrayRemotable.GetItemClass() : TBaseRemotableClass;
begin
Result := TClass_A;
end;
{ TTClass_B_ArrayRemotable }
class function TTClass_B_ArrayRemotable.GetItemClass() : TBaseRemotableClass;
begin
Result := TClass_B;
end;
{ TUtilsProcs_Test }
procedure TUtilsProcs_Test.test_Find_array();
const O_COUNT : PtrInt = 10;
var
ls : TTClass_A_ArrayRemotable;
i : PtrInt;
begin
ls := TTClass_A_ArrayRemotable.Create();
try
CheckNull(Find(ls,''));
CheckNull(Find(ls,'IntProp = 12'));
ls.SetLength(1);
CheckSame(ls[0], Find(ls,''));
CheckSame(ls[0], Find(ls,'IntProp = 0'));
CheckNull(Find(ls,'IntProp = 12'));
ls.SetLength(O_COUNT);
for i := 0 to ( O_COUNT - 1 ) do
TClass_A(ls[i]).FIntProp := i;
CheckSame(ls[0], Find(ls,''));
CheckSame(ls[0], Find(ls,'IntProp = 0'));
CheckNull(Find(ls,Format('IntProp = %d',[2*O_COUNT])));
for i := 0 to ( O_COUNT - 1 ) do
CheckSame(ls[i],Find(ls,Format('IntProp = %d',[i])));
finally
ls.Free();
end;
end;
procedure TUtilsProcs_Test.test_Find_collection();
const O_COUNT : PtrInt = 10;
var
ls : TTClass_A_CollectionRemotable;
i : PtrInt;
begin
ls := TTClass_A_CollectionRemotable.Create();
try
CheckNull(Find(ls,''));
CheckNull(Find(ls,'IntProp = 12'));
ls.Add();
CheckSame(ls[0], Find(ls,''));
CheckSame(ls[0], Find(ls,'IntProp = 0'));
CheckNull(Find(ls,'IntProp = 12'));
ls.Clear();
for i := 0 to ( O_COUNT - 1 ) do
TClass_A(ls.Add()).FIntProp := i;
CheckSame(ls[0], Find(ls,''));
CheckSame(ls[0], Find(ls,'IntProp = 0'));
CheckNull(Find(ls,Format('IntProp = %d',[2*O_COUNT])));
for i := 0 to ( O_COUNT - 1 ) do
CheckSame(ls[i],Find(ls,Format('IntProp = %d',[i])));
finally
ls.Free();
end;
end;
procedure TUtilsProcs_Test.test_Filter_array();
const O_COUNT : PtrInt = 10;
var
ls : TTClass_A_ArrayRemotable;
i : PtrInt;
crs : IObjectCursor;
begin
CheckNull(Filter(TTClass_A_ArrayRemotable(nil),''), 'filter(nil) = nil');
ls := TTClass_A_ArrayRemotable.Create();
try
crs := Filter(ls,'');
Check( ( crs <> nil ) );
crs.Reset();
Check(not crs.MoveNext());
ls.SetLength(O_COUNT);
for i := 0 to ( O_COUNT - 1 ) do
TClass_A(ls[i]).FIntProp := i;
crs := Filter(ls,'');
Check( ( crs <> nil ) );
crs.Reset();
for i := 0 to ( O_COUNT - 1 ) do begin
Check(crs.MoveNext());
CheckSame(ls[i], crs.GetCurrent());
end;
Check(not crs.MoveNext());
for i := 0 to ( O_COUNT - 1 ) do begin
crs := Filter(ls,Format('IntProp = %d',[i]));
Check( ( crs <> nil ) );
crs.Reset();
Check(crs.MoveNext());
CheckSame(ls[i], crs.GetCurrent());
Check(not crs.MoveNext());
end;
finally
ls.Free();
end;
end;
procedure TUtilsProcs_Test.test_Filter_collection();
const O_COUNT : PtrInt = 10;
var
ls : TTClass_A_CollectionRemotable;
i : PtrInt;
crs : IObjectCursor;
begin
CheckNull(Filter(TTClass_A_CollectionRemotable(nil),''), 'filter(nil) = nil');
ls := TTClass_A_CollectionRemotable.Create();
try
crs := Filter(ls,'');
Check( ( crs <> nil ) );
crs.Reset();
Check(not crs.MoveNext());
ls.Clear();
for i := 0 to ( O_COUNT - 1 ) do
TClass_A(ls.Add()).FIntProp := i;
crs := Filter(ls,'');
Check( ( crs <> nil ) );
crs.Reset();
for i := 0 to ( O_COUNT - 1 ) do begin
Check(crs.MoveNext());
CheckSame(ls[i], crs.GetCurrent());
end;
Check(not crs.MoveNext());
for i := 0 to ( O_COUNT - 1 ) do begin
crs := Filter(ls,Format('IntProp = %d',[i]));
Check( ( crs <> nil ) );
crs.Reset();
Check(crs.MoveNext());
CheckSame(ls[i], crs.GetCurrent());
Check(not crs.MoveNext());
end;
finally
ls.Free();
end;
end;
{ TTClass_A_CollectionRemotable }
class function TTClass_A_CollectionRemotable.GetItemClass() : TBaseRemotableClass;
begin
Result := TClass_A;
end;
{ TObjectCollectionRemotableCursor_Test }
procedure TObjectCollectionRemotableCursor_Test.All();
const O_COUNT = 100;
var
x : IObjectCursor;
ls : TObjectCollectionRemotable;
i : PtrInt;
begin
ls := TTClass_A_CollectionRemotable.Create();
try
x := TObjectCollectionRemotableCursor.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();
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
TClass_A(ls.Add()).FIntProp := 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;
initialization
RegisterTest('Cursors',TBaseObjectArrayRemotableCursor_Test.Suite);
RegisterTest('Cursors',TBaseObjectArrayRemotableFilterableCursor_Test.Suite);
RegisterTest('Cursors',TObjectCollectionRemotableCursor_Test.Suite);
RegisterTest('Cursors',TUtilsProcs_Test.Suite);
end.