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…
Комментариев нет:
Отправить комментарий