Original in Russian: http://18delphi.blogspot.ru/2013/03/dunit_9770.html
About containers. Table of contents
The previous series was here:
http://18delphi.blogspot.com/2015/03/a-little-about-using-dunit.html
We’ll develop the idea of testing of TIntStack and TStringStack. But we’ll do it with ONE mixin by removing duplicates of the following kind:
and:
We draw the diagram as follows:
We get the following code:
SandBox.dpr:
StackTest.imp.pas:
IntStackTestViaMixIn.pas:
StringStackTestViaMixIn.pas:
We get tests:
As for me, it is cool :-)
Try it. May be you will like it.
It’s clear that we could to the same with native Generic's.
-- and then, may be, we’ll learn to multiply tests by parameterizing on input data. In a special post. We’ll see…
About containers. Table of contents
The previous series was here:
http://18delphi.blogspot.com/2015/03/a-little-about-using-dunit.html
We’ll develop the idea of testing of TIntStack and TStringStack. But we’ll do it with ONE mixin by removing duplicates of the following kind:
procedure TIntStackTest.DoIt; const cEtalons : array [0..3] of integer = (10, 20, 3, 5); var l_S : TIntStack; l_I : Integer; begin l_S := TIntStack.Create; try for l_I := Low(cEtalons) to High(cEtalons) do l_S.Push(cEtalons[l_I]); for l_I := High(cEtalons) downto Low(cEtalons) do Check(l_S.Pop = cEtalons[l_I]); finally FreeAndNil(l_S); end;//try..finally end;//TIntStackTest.DoIt
and:
procedure TStringStackTest.DoIt;
const
cEtalons : array [0..5] of String = ('The ', 'cat ', 'sat ', 'on ', 'the ','mat'); .
var
l_S : TStringStack;
l_I : Integer;
begin
l_S := TStringStack.Create;
try
for l_I := Low(cEtalons) to High(cEtalons) do
l_S.Push(cEtalons[l_I]);
for l_I := High(cEtalons) downto Low(cEtalons) do
Check(l_S.Pop = cEtalons[l_I]);
finally
FreeAndNil(l_S);
end;//try..finally
end;//TStringStackTest.DoIt
We draw the diagram as follows:
We get the following code:
SandBox.dpr:
program SandBoxTest; uses TestFrameWork GUITestRunner, IntStack, IntStackTest, StringStack, StringStackTest, IntStackTestViaMixIn, StringStackTestViaMixIn ; begin GUITestRunner.RunRegisteredTests; end.
StackTest.imp.pas:
{$IfNDef StackTest_imp}
{$Define StackTest_imp}
TEtalonData = ItemsHolder;
_StackTest_ = {mixin} class(TTestCase)
published
procedure DoIt;
protected
// protected methods
function GetEtalonData: TEtalonData; virtual; abstract;
function ArrayToEtalon(const aData: array of _ItemType_): TEtalonData;
{* Helper function appears since dynamic arrays can be automatically cast to open arrays, but not backwards}
end;//_StackTest_
{$Else StackTest_imp}
procedure _StackTest_.DoIt;
var
l_Etalons : TEtalonData;
l_S : _StackType_;
l_I : Integer;
begin
l_S := _StackType_.Create;
try
l_Etalons := GetEtalonData;
for l_I := Low(l_Etalons) to High(l_Etalons) do
l_S.Push(l_Etalons[l_I]);
for l_I := High(l_Etalons) downto Low(l_Etalons) do
Check(l_S.Pop = l_Etalons[l_I]);
finally
FreeAndNil(l_S);
end;//try..finally
end;
function _StackTest_.ArrayToEtalon(const aData: array of _ItemType_): TEtalonData;
var
l_I : Integer;
begin
SetLength(Result, Length(aData));
for l_I := Low(aData) to High(aData) do
Result[l_I] := aData[l_I];
end;
IntStackTestViaMixIn.pas:
unit IntStackTestViaMixIn;
interface
uses
IntStack,
TestFrameWork
;
type
_StackType_ = TIntStack;
{$Include StackTest.imp.pas}
TIntStackTestViaMixIn = class(_StackTest_)
protected
// realized methods
function GetEtalonData: TEtalonData; override;
end;//TIntStackTestViaMixIn
implementation
uses
SysUtils
;
{$Include StackTest.imp.pas}
function TIntStackTestViaMixIn.GetEtalonData: TEtalonData;
begin
Result := ArrayToEtalon([10, 20, 3, 5, 6, 19, 21]);
end;
initialization
TestFramework.RegisterTest(TIntStackTestViaMixIn.Suite);
end.
StringStackTestViaMixIn.pas:
unit StringStackTestViaMixIn;
interface
uses
StringStack,
TestFrameWork
;
type
_StackType_ = TStringStack;
{$Include StackTest.imp.pas}
TStringStackTestViaMixIn = class(_StackTest_)
protected
// realized methods
function GetEtalonData: TEtalonData; override;
end;//TStringStackTestViaMixIn
implementation
uses
SysUtils
;
{$Include StackTest.imp.pas}
function TStringStackTestViaMixIn.GetEtalonData: TEtalonData;
begin
Result := ArrayToEtalon(['The ', 'cat ', 'sat ', 'on ', 'the ','mat']);
end;
initialization
TestFramework.RegisterTest(TStringStackTestViaMixIn.Suite);
end.
We get tests:
As for me, it is cool :-)
Try it. May be you will like it.
It’s clear that we could to the same with native Generic's.
-- and then, may be, we’ll learn to multiply tests by parameterizing on input data. In a special post. We’ll see…


Комментариев нет:
Отправить комментарий