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

965 lines
24 KiB
ObjectPascal
Raw Normal View History

{ This file is part of the Web Service Toolkit
Copyright (c) 2006, 2007 by Inoussa OUEDRAOGO
This file is provide under modified LGPL licence
( the files COPYING.modifiedLGPL and COPYING.LGPL).
This program 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.
}
{$INCLUDE wst_global.inc}
unit test_utilities;
interface
uses
Classes, SysUtils,
{$IFDEF FPC}
fpcunit, testutils, testregistry,
{$ELSE}
TestFrameWork,
{$ENDIF}
TypInfo,
base_service_intf, server_service_intf,
library_imp_utils, parserutils, imp_utils;
type
ITest = interface
['{61442DCF-0F6B-490F-AA33-FF856C07A757}']
procedure SayHello();
procedure DontPool();
end;
{ TTestClass }
TTestClass = class(TActivableServiceImplementation,IObjectControl,ITest)
private
FPooled : Boolean;
protected
procedure SayHello();
function CanBePooled() : Boolean;override;
procedure DontPool();
public
constructor Create();override;
end;
ISimple_A = interface
['{D015AD95-6062-4650-9B00-CF3004E9CA1A}']//['{4793180A-DAA4-4E50-9194-5EEEE851EBE3}']
end;
ISimple_B = interface
['{4793180A-DAA4-4E50-9194-5EEEE851EBE3}']
end;
TSimpleFactoryItem_A = class(TSimpleFactoryItem,IInterface,ISimple_A)
end;
TSimpleFactoryItem_B = class(TSimpleFactoryItem,IInterface,ISimple_B)
end;
{ TTest_TIntfPoolItem }
TTest_TIntfPoolItem = class(TTestCase)
published
procedure All();
end;
{ TTest_TSimpleItemFactory }
TTest_TSimpleItemFactory = class(TTestCase)
published
procedure CreateProc();
procedure CreateInstance();
end;
{ TTest_TIntfPool }
TTest_TIntfPool= class(TTestCase)
published
procedure Create_ZEROS();
procedure Create_NON_ZERO_MIN();
procedure Release();
{$IFDEF WST_SEMAPHORE_TIMEOUT}
procedure Release_NON();
{$ENDIF WST_SEMAPHORE_TIMEOUT}
procedure Discard();
end;
{ TTest_TSimpleItemFactoryEx }
TTest_TSimpleItemFactoryEx = class(TTestCase)
published
procedure NOT_Pooled();
procedure POOLED_Create_ZEROS();
procedure POOLED_Release();
{$IFDEF WST_SEMAPHORE_TIMEOUT}
procedure POOLED_Release_NON();
{$ENDIF WST_SEMAPHORE_TIMEOUT}
procedure POOLED_Discard();
end;
{ TTest_TImplementationFactory }
TTest_TImplementationFactory = class(TTestCase)
published
procedure POOLED_Discard();
procedure extension_empty();
procedure extension_simple();
procedure extension_array_empty();
procedure extension_array_simple();
procedure extension_duplicate();
end;
{ TwstModuleNotLoad }
TwstModuleNotLoad = class(TwstModule,IInterface,IwstModule)
protected
procedure Load(const ADoLoad : Boolean);override;
end;
{ TTest_TwstModuleManager }
TTest_TwstModuleManager = class(TTestCase)
published
procedure Get(const AFileName : string);
procedure Clear();
procedure GetCount();
procedure GetItem(const AIndex : PtrInt);
end;
{ TTest_Procs }
TTest_Procs = class(TTestCase)
published
procedure test_GetToken();
{$IFNDEF WST_HAS_STRICT_DELIMITER}
procedure test_SetListData();
{$ENDIF WST_HAS_STRICT_DELIMITER}
end;
implementation
var
ListToRelease : IInterfaceList;
procedure Finalize_ListToRelease();
var
i : Integer;
begin
if ( ListToRelease <> nil ) and ( ListToRelease.Count > 0 ) then begin
for i := 0 to Pred(ListToRelease.Count) do
ListToRelease[i]._Release();
ListToRelease := nil;
end;
end;
{ TTestClass }
procedure TTestClass.SayHello();
begin
end;
function TTestClass.CanBePooled() : Boolean;
begin
Result := FPooled;
end;
procedure TTestClass.DontPool();
begin
FPooled := False;
end;
constructor TTestClass.Create();
begin
inherited Create();
FPooled := True;
_AddRef(); // not to allow the rtl to reuse the same memory for another instance of the same class!!
ListToRelease.Add(Self as IInterface);
end;
{ TTest_TIntfPool }
procedure TTest_TIntfPool.Create_ZEROS();
var
ok : Boolean;
obj : TIntfPool;
begin
ok := False;
try
obj := TIntfPool.Create(0,0,TSimpleItemFactory.Create(TTestClass));
except
ok := True;
end;
Check(ok);
end;
procedure TTest_TIntfPool.Create_NON_ZERO_MIN();
const MIN_A = Integer(1); MAX_A = Integer(5);
var
obj : TIntfPool;
begin
obj := TIntfPool.Create(MIN_A,MAX_A,TSimpleItemFactory.Create(TTestClass));
CheckEquals(MIN_A,obj.Min);
CheckEquals(MAX_A,obj.Max);
CheckEquals(MIN_A,obj.GetInstancesCount());
obj.Free();
end;
procedure TTest_TIntfPool.Release();
const MIN_A = Integer(1); MAX_A = Integer(5); MIN_B = Integer(0);
var
obj : TIntfPool;
elt : ITest;
i : Integer;
begin
obj := TIntfPool.Create(MIN_A,MAX_A,TSimpleItemFactory.Create(TTestClass));
for i := 0 to 300 do begin
elt := obj.Get(0) as ITest;
elt.SayHello();
obj.Release(elt);
end;
FreeAndNil(obj);
obj := TIntfPool.Create(MIN_B,MAX_A,TSimpleItemFactory.Create(TTestClass));
for i := 0 to 300 do begin
elt := obj.Get(0) as ITest;
elt.SayHello();
obj.Release(elt);
end;
FreeAndNil(obj);
obj := TIntfPool.Create(MAX_A,MAX_A,TSimpleItemFactory.Create(TTestClass));
for i := 0 to 300 do begin
elt := obj.Get(0) as ITest;
elt.SayHello();
obj.Release(elt);
end;
FreeAndNil(obj);
end;
{$IFDEF WST_SEMAPHORE_TIMEOUT}
procedure TTest_TIntfPool.Release_NON();
const MIN_A = Integer(1); MAX_A = Integer(5);
var
obj : TIntfPool;
elt : ITest;
i : Integer;
ok : Boolean;
il : IInterfaceList;
begin
il := TInterfaceList.Create();
obj := TIntfPool.Create(MIN_A,MAX_A,TSimpleItemFactory.Create(TTestClass));
for i := 1 to MAX_A do begin
elt := obj.Get(100) as ITest;
elt.SayHello();
il.Add(elt);
//obj.Release(elt); do not release
end;
ok := False;
try
elt := obj.Get(100) as ITest;
except
ok := True;
end;
Check(ok);
CheckEquals(MAX_A,obj.GetInstancesCount());
for i := 0 to Pred(MAX_A) do begin
obj.Release(il[0]);
il.Delete(0);
end;
for i := 1 to 100 do begin
elt := obj.Get(100) as ITest;
elt.SayHello();
il.Add(elt);
obj.Release(elt);
end;
FreeAndNil(obj);
end;
{$ENDIF WST_SEMAPHORE_TIMEOUT}
procedure TTest_TIntfPool.Discard();
const MIN_A = Integer(1); MAX_A = Integer(5); MIN_B = Integer(0);
var
obj : TIntfPool;
oldElt, elt : ITest;
begin
obj := TIntfPool.Create(MIN_A,MIN_A,TSimpleItemFactory.Create(TTestClass));
elt := obj.Get(10) as ITest;
oldElt := elt;
obj.Release(elt);
elt := obj.Get(10) as ITest;
Check(oldElt = elt);
obj.Discard(elt);
elt := obj.Get(10) as ITest;
Check(oldElt <> elt );
FreeAndNil(obj);oldElt := nil; elt := nil;
obj := TIntfPool.Create(MIN_A,MAX_A,TSimpleItemFactory.Create(TTestClass));
elt := obj.Get(10) as ITest;
oldElt := elt;
obj.Release(elt);
elt := obj.Get(10) as ITest;
Check(oldElt = elt);
obj.Discard(elt);
elt := obj.Get(10) as ITest;
Check(oldElt <> elt );
FreeAndNil(obj);oldElt := nil; elt := nil;
obj := TIntfPool.Create(MIN_B,MIN_A,TSimpleItemFactory.Create(TTestClass));
elt := obj.Get(10) as ITest;
oldElt := elt;
obj.Release(elt);
elt := obj.Get(10) as ITest;
Check(oldElt = elt);
obj.Discard(elt);
elt := obj.Get(10) as ITest;
Check(oldElt <> elt );
FreeAndNil(obj);oldElt := nil; elt := nil;
obj := TIntfPool.Create(MIN_B,MAX_A,TSimpleItemFactory.Create(TTestClass));
elt := obj.Get(10) as ITest;
oldElt := elt;
obj.Release(elt);
elt := obj.Get(10) as ITest;
Check(oldElt = elt);
obj.Discard(elt);
elt := obj.Get(10) as ITest;
Check(oldElt <> elt );
FreeAndNil(obj);
end;
{ TTest_TSimpleItemFactoryEx }
procedure TTest_TSimpleItemFactoryEx.NOT_Pooled();
var
obj : IItemFactoryEx;
elt : ITest;
i : Integer;
begin
obj := TSimpleItemFactoryEx.Create(TTestClass);
for i := 0 to 300 do begin
elt := obj.CreateInstance() as ITest;
elt.SayHello();
end;
obj := TSimpleItemFactoryEx.Create(TTestClass,'');
for i := 0 to 300 do begin
elt := obj.CreateInstance() as ITest;
elt.SayHello();
end;
end;
procedure TTest_TSimpleItemFactoryEx.POOLED_Create_ZEROS();
var
ok : Boolean;
obj : IItemFactoryEx;
begin
ok := False;
try
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;Pooled=True',[0,0]));
except
ok := True;
end;
Check(ok);
end;
procedure TTest_TSimpleItemFactoryEx.POOLED_Release();
const MIN_A = Integer(1); MAX_A = Integer(5); MIN_B = Integer(0);
var
obj : IItemFactoryEx;
elt : ITest;
i : Integer;
begin
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;Pooled=True',[MIN_A,MAX_A]));
for i := 0 to 300 do begin
elt := obj.CreateInstance() as ITest;
elt.SayHello();
obj.ReleaseInstance(elt);
end;
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;Pooled=True',[MIN_B,MAX_A]));
for i := 0 to 300 do begin
elt := obj.CreateInstance() as ITest;
elt.SayHello();
obj.ReleaseInstance(elt);
end;
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;Pooled=True',[MAX_A,MAX_A]));
for i := 0 to 300 do begin
elt := obj.CreateInstance() as ITest;
elt.SayHello();
obj.ReleaseInstance(elt);
end;
end;
{$IFDEF WST_SEMAPHORE_TIMEOUT}
procedure TTest_TSimpleItemFactoryEx.POOLED_Release_NON();
const MIN_A = Integer(1); MAX_A = Integer(5);
var
obj : IItemFactoryEx;
elt : ITest;
i : Integer;
ok : Boolean;
il : IInterfaceList;
begin
il := TInterfaceList.Create();
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_A,MAX_A]));
for i := 1 to MAX_A do begin
elt := obj.CreateInstance() as ITest;
elt.SayHello();
il.Add(elt);
//obj.Release(elt); do not release
end;
ok := False;
try
elt := obj.CreateInstance() as ITest;
except
ok := True;
end;
Check(ok);
for i := 0 to Pred(MAX_A) do begin
obj.ReleaseInstance(il[0]);
il.Delete(0);
end;
for i := 1 to 100 do begin
elt := obj.CreateInstance() as ITest;
elt.SayHello();
il.Add(elt);
obj.ReleaseInstance(elt);
end;
end;
{$ENDIF WST_SEMAPHORE_TIMEOUT}
procedure TTest_TSimpleItemFactoryEx.POOLED_Discard();
const MIN_A = Integer(1); MAX_A = Integer(5); MIN_B = Integer(0);
var
obj : IItemFactoryEx;
oldElt, elt : ITest;
begin
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_A,MIN_A]));
elt := obj.CreateInstance() as ITest;
oldElt := elt;
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt = elt,'1.1');
obj.DiscardInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt <> elt, '1.2' );
oldElt := nil; elt := nil;
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_A,MAX_A]));
elt := obj.CreateInstance() as ITest;
oldElt := elt;
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt = elt,'2.1');
obj.DiscardInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt <> elt ,'2.2');
oldElt := nil; elt := nil;
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_B,MIN_A]));
elt := obj.CreateInstance() as ITest;
oldElt := elt;
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt = elt,'3.1');
obj.DiscardInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt <> elt ,'3.2');
oldElt := nil; elt := nil;
obj := TSimpleItemFactoryEx.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_B,MAX_A]));
elt := obj.CreateInstance() as ITest;
oldElt := elt;
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt = elt,'4.1');
obj.DiscardInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt <> elt,'4.2');
end;
{ TTest_TImplementationFactory }
procedure TTest_TImplementationFactory.POOLED_Discard();
const MIN_A = Integer(1); MAX_A = Integer(5); MIN_B = Integer(0);
var
obj : IItemFactoryEx;
oldElt, elt : ITest;
begin
obj := TImplementationFactory.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_A,MIN_A]));
elt := obj.CreateInstance() as ITest;
oldElt := elt;
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt = elt,'1.1');
elt.DontPool();
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt <> elt, '1.2' );
oldElt := nil; elt := nil;
obj := TImplementationFactory.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_A,MAX_A]));
elt := obj.CreateInstance() as ITest;
oldElt := elt;
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt = elt,'2.1');
elt.DontPool();
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt <> elt ,'2.2');
oldElt := nil; elt := nil;
obj := TImplementationFactory.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_B,MIN_A]));
elt := obj.CreateInstance() as ITest;
oldElt := elt;
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt = elt,'3.1');
elt.DontPool();
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt <> elt ,'3.2');
oldElt := nil; elt := nil;
obj := TImplementationFactory.Create(TTestClass,Format('PoolMin=%d;PoolMax=%d;TimeOut=100;Pooled=True',[MIN_B,MAX_A]));
elt := obj.CreateInstance() as ITest;
oldElt := elt;
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt = elt,'4.1');
elt.DontPool();
obj.ReleaseInstance(elt);
elt := obj.CreateInstance() as ITest;
Check(oldElt <> elt,'4.2');
end;
procedure TTest_TImplementationFactory.extension_empty();
var
obj : IServiceImplementationFactory;
s : string;
begin
obj := TImplementationFactory.Create(TTestClass);
CheckEquals(False,obj.GetExtension(s));
CheckEquals('',s)
end;
procedure TTest_TImplementationFactory.extension_simple();
var
obj : IServiceImplementationFactory;
s : string;
pm : IPropertyManager;
begin
obj := TImplementationFactory.Create(TTestClass);
obj.RegisterExtension('a','');
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a',s);
obj := TImplementationFactory.Create(TTestClass);
obj.RegisterExtension('a','a.val');
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a',s);
pm := obj.GetPropertyManager(sSERVICES_EXTENSIONS,False);
Check((pm <> nil),'GetPropertyManager(sSERVICES_EXTENSIONS,False)');
CheckEquals('a.val',pm.GetProperty('a'));
obj.RegisterExtension('b','');
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a;b',s);
CheckEquals('a.val',pm.GetProperty('a'));
CheckEquals('',pm.GetProperty('b'));
obj.RegisterExtension('c','123');
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a;b;c',s);
CheckEquals('a.val',pm.GetProperty('a'));
CheckEquals('',pm.GetProperty('b'));
CheckEquals('123',pm.GetProperty('c'));
end;
procedure TTest_TImplementationFactory.extension_array_empty();
var
obj : IServiceImplementationFactory;
s : string;
begin
obj := TImplementationFactory.Create(TTestClass);
obj.RegisterExtension([]);
CheckEquals(False,obj.GetExtension(s));
CheckEquals('',s);
obj := TImplementationFactory.Create(TTestClass);
obj.RegisterExtension(['']);
CheckEquals(False,obj.GetExtension(s));
CheckEquals('',s);
obj.RegisterExtension(['','']);
CheckEquals(False,obj.GetExtension(s));
CheckEquals('',s);
end;
procedure TTest_TImplementationFactory.extension_array_simple();
var
obj : IServiceImplementationFactory;
s : string;
pm : IPropertyManager;
begin
obj := TImplementationFactory.Create(TTestClass);
obj.RegisterExtension(['a']);
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a',s);
obj := TImplementationFactory.Create(TTestClass);
obj.RegisterExtension(['a']);
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a',s);
pm := obj.GetPropertyManager(sSERVICES_EXTENSIONS,False);
Check((pm <> nil),'GetPropertyManager(sSERVICES_EXTENSIONS,False)');
CheckEquals('',pm.GetProperty('a'));
obj.RegisterExtension(['b']);
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a;b',s);
CheckEquals('',pm.GetProperty('a'));
CheckEquals('',pm.GetProperty('b'));
obj.RegisterExtension(['c','123']);
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a;b;c;123',s);
CheckEquals('',pm.GetProperty('a'));
CheckEquals('',pm.GetProperty('b'));
CheckEquals('',pm.GetProperty('c'));
CheckEquals('',pm.GetProperty('123'));
end;
procedure TTest_TImplementationFactory.extension_duplicate();
var
obj : IServiceImplementationFactory;
s : string;
begin
obj := TImplementationFactory.Create(TTestClass);
obj.RegisterExtension('a','');
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a',s);
// Should not duplicate
obj.RegisterExtension('a','');
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a',s);
obj.RegisterExtension('b','');
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a;b',s);
obj.RegisterExtension('a','a.val');
CheckEquals(True,obj.GetExtension(s));
CheckEquals('a;b',s);
end;
{ TTest_TIntfPoolItem }
procedure TTest_TIntfPoolItem.All();
var
i : IInterface;
b : Boolean;
a : TIntfPoolItem;
begin
i := nil;
b := False;
a := TIntfPoolItem.Create(i,b);
try
Check(( i = a.Intf ),'Create() > Intf');
CheckEquals(b,a.Used,'Create() > Used');
b := not b;
a.Used := b;
CheckEquals(b,a.Used,'Used');
finally
FreeAndNil(a);
end;
a := nil;
i := nil;
b := True;
a := TIntfPoolItem.Create(i,b);
try
Check(( i = a.Intf ),'Create() > Intf');
CheckEquals(b,a.Used,'Create() > Used');
b := not b;
a.Used := b;
CheckEquals(b,a.Used,'Used');
finally
FreeAndNil(a);
end;
end;
{ TTest_TSimpleItemFactory }
procedure TTest_TSimpleItemFactory.CreateInstance();
var
b, a : IItemFactory;
itm : IInterface;
begin
a := TSimpleItemFactory.Create(TSimpleFactoryItem_A);
itm := a.CreateInstance();
CheckEquals(True,Assigned(itm));
CheckEquals(True,Supports(itm,ISimple_A));
itm := a.CreateInstance();
CheckEquals(True,Assigned(itm));
CheckEquals(True,Supports(itm,ISimple_A));
b := TSimpleItemFactory.Create(TSimpleFactoryItem_B);
itm := b.CreateInstance();
CheckEquals(True,Assigned(itm));
CheckEquals(True,Supports(itm,ISimple_B));
itm := b.CreateInstance();
CheckEquals(True,Assigned(itm));
CheckEquals(True,Supports(itm,ISimple_B));
end;
type
{ TSimpleItemFactoryCrack }
TSimpleItemFactoryCrack = class(TSimpleItemFactory)
public
function GetItemClass() : TSimpleFactoryItemClass;
end;
{ TSimpleItemFactoryCrack }
function TSimpleItemFactoryCrack.GetItemClass() : TSimpleFactoryItemClass;
begin
Result := inherited GetItemClass();
end;
procedure TTest_TSimpleItemFactory.CreateProc();
var
b : TSimpleItemFactoryCrack;
ok : Boolean;
begin
ok := False;
try
TSimpleItemFactory.Create(nil);
except
on e : EServiceConfigException do begin
ok := True;
end;
end;
CheckEquals(True,ok,'Create(nil)');
b := TSimpleItemFactoryCrack.Create(TSimpleFactoryItem_A);
CheckEquals(TSimpleFactoryItem_A,b.GetItemClass());
FreeAndNil(b);
b := TSimpleItemFactoryCrack.Create(TSimpleFactoryItem_B);
CheckEquals(TSimpleFactoryItem_B,b.GetItemClass());
end;
{ TwstModuleNotLoad }
procedure TwstModuleNotLoad.Load(const ADoLoad: Boolean);
begin
//;
end;
{ TTest_TwstModuleManager }
procedure TTest_TwstModuleManager.Get(const AFileName: string);
const C = 10;
var
locObj : IwstModuleManager;
locModule : IwstModule;
i, j, k: Integer;
ok : Boolean;
locName : string;
begin
locObj := TwstModuleManager.Create(TwstModuleNotLoad);
for i := 0 to Pred(C) do begin
locObj.Get(Format('lib_%d',[i]));
end;
for i := 0 to Pred(C) do begin
ok := False;
locName := Format('lib_%d',[i]);
for j := 0 to Pred(locObj.GetCount()) do begin
locModule := locObj.GetItem(j);
if AnsiSameText(locName, locModule.GetFileName()) then begin
ok := True;
k := j + 1;
Break;
end;
end;
Check(ok);
for j := k to Pred(locObj.GetCount()) do begin
locModule := locObj.GetItem(j);
if AnsiSameText(locName, locModule.GetFileName()) then begin
Check(False,'Duplicated items : ' + locName);
end;
end;
end;
end;
procedure TTest_TwstModuleManager.Clear();
const C = 12;
var
locObj : IwstModuleManager;
i : Integer;
begin
locObj := TwstModuleManager.Create(TwstModuleNotLoad);
locObj.Clear();
CheckEquals(0,locObj.GetCount());
for i := 0 to Pred(C) do begin
locObj.Get(Format('lib_%d',[i]));
end;
CheckEquals(C,locObj.GetCount());
locObj.Clear();
CheckEquals(0,locObj.GetCount());
end;
procedure TTest_TwstModuleManager.GetCount();
const C = 10;
var
locObj : IwstModuleManager;
i : Integer;
begin
locObj := TwstModuleManager.Create(TwstModuleNotLoad);
CheckEquals(0,locObj.GetCount());
CheckEquals(0,locObj.GetCount());
for i := 0 to Pred(C) do begin
CheckEquals(i,locObj.GetCount(),'before Add');
locObj.Get(Format('lib_%d',[i]));
CheckEquals(i + 1,locObj.GetCount(),'after Add');
end;
CheckEquals(C,locObj.GetCount());
end;
procedure TTest_TwstModuleManager.GetItem(const AIndex: PtrInt);
const C = 10;
var
locObj : IwstModuleManager;
locModule : IwstModule;
i : Integer;
ok : Boolean;
begin
locObj := TwstModuleManager.Create(TwstModuleNotLoad);
ok := False;
try
locObj.GetItem(0);
except
on e : Exception do begin
ok := True;
end;
end;
Check(ok);
ok := False;
try
locObj.GetItem(1);
except
on e : Exception do begin
ok := True;
end;
end;
Check(ok);
for i := 0 to Pred(C) do begin
locObj.Get(Format('lib_%d',[i]));
end;
for i := 0 to Pred(C) do begin
locModule := locObj.GetItem(i);
CheckEquals(Format('lib_%d',[i]), locModule.GetFileName());
end;
ok := False;
try
locObj.GetItem(C + 1);
except
on e : Exception do begin
ok := True;
end;
end;
Check(ok);
end;
{ TTest_Procs }
procedure TTest_Procs.test_GetToken();
procedure do_tests(const ADelimiter : string);
var
strBuffer : string;
begin
strBuffer := '';
CheckEquals('', GetToken(strBuffer,ADelimiter));
CheckEquals('',strBuffer);
strBuffer := ADelimiter;
CheckEquals('', GetToken(strBuffer,ADelimiter));
CheckEquals('',strBuffer);
strBuffer := Format('%s123',[ADelimiter]);
CheckEquals('', GetToken(strBuffer,ADelimiter));
CheckEquals('123',strBuffer);
strBuffer := Format('%s123%s45',[ADelimiter,ADelimiter]);
CheckEquals('', GetToken(strBuffer,ADelimiter));
CheckEquals(Format('123%s45',[ADelimiter]),strBuffer);
CheckEquals('123', GetToken(strBuffer,ADelimiter));
CheckEquals('45',strBuffer);
CheckEquals('45', GetToken(strBuffer,ADelimiter));
CheckEquals('',strBuffer);
strBuffer := Format('123',[ADelimiter,ADelimiter]);
CheckEquals('123', GetToken(strBuffer,ADelimiter));
CheckEquals('',strBuffer);
strBuffer := Format('123%s45',[ADelimiter,ADelimiter]);
CheckEquals('123', GetToken(strBuffer,ADelimiter));
CheckEquals(Format('45',[ADelimiter]),strBuffer);
CheckEquals('45', GetToken(strBuffer,ADelimiter));
CheckEquals('',strBuffer);
end;
begin
do_tests(';');
do_tests('##');
do_tests('#<#');
end;
{$IFNDEF WST_HAS_STRICT_DELIMITER}
procedure TTest_Procs.test_SetListData();
var
ls : TStringList;
begin
ls := TStringList.Create();
try
SetListData(ls,'item1=azerty;item2=http: 123;item3=a b c');
CheckEquals(3,ls.Count,'Items count');
CheckEquals('item1',ls.Names[0]);
CheckEquals('azerty',ls.ValueFromIndex[0]);
CheckEquals('item2',ls.Names[1]);
CheckEquals('http: 123',ls.ValueFromIndex[1]);
CheckEquals('item3',ls.Names[2]);
CheckEquals('a b c',ls.ValueFromIndex[2]);
finally
ls.Free();
end;
end;
{$ENDIF WST_HAS_STRICT_DELIMITER}
initialization
ListToRelease := TInterfaceList.Create();
RegisterTest('Utilities',TTest_TIntfPool.Suite);
RegisterTest('Utilities',TTest_TSimpleItemFactoryEx.Suite);
RegisterTest('Utilities',TTest_TImplementationFactory.Suite);
RegisterTest('Utilities',TTest_TIntfPoolItem.Suite);
RegisterTest('Utilities',TTest_TImplementationFactory.Suite);
RegisterTest('Utilities',TTest_TwstModuleManager.Suite);
RegisterTest('Utilities',TTest_Procs.Suite);
finalization
Finalize_ListToRelease();
end.