XPTempReleaseTests.pas
上传用户:yjb1804
上传日期:2021-01-30
资源大小:3105k
文件大小:4k
源码类别:

Email服务器

开发平台:

Delphi

  1. unit XPTempReleaseTests;
  2. interface
  3. uses
  4.   TestFrameWork;
  5. type
  6.   ICrackedInterface = interface
  7.     ['{6E3BE71F-B368-4DFD-A6BA-0659813365DD}']
  8.     function RefCount: integer;
  9.   end;
  10.   TXPTempReleaseTests = class(TTestCase)
  11.   private
  12.     FSource: ICrackedInterface;
  13.   protected
  14.     procedure SetUp; override;
  15.     procedure TearDown; override;
  16.   published
  17.     procedure TestNoTemps;
  18.     procedure TestFactoryClassTemp;
  19.     procedure TestFactoryFuncTemp;
  20.     procedure TestLeftRightTemps;
  21.   end;
  22. implementation
  23. {$IFDEF VER130}
  24. uses
  25.   XPInterfacedObject;
  26. {$ENDIF}
  27. type
  28.   TCracked = class (TInterfacedObject, ICrackedInterface, IInterface)
  29.   protected
  30.     function RefCount: integer;
  31.     function _Release: integer; stdcall;
  32.   public
  33.     destructor Destroy; override;
  34.   end;
  35.   TFactory = class(TInterfacedObject, ICrackedInterface)
  36.   private
  37.     FCracked: ICrackedInterface;
  38.   protected
  39.     property Cracked: ICrackedInterface
  40.       read  FCracked implements ICrackedInterface;
  41.   public
  42.     constructor Create(const ACracked: ICrackedInterface);
  43.     destructor Destroy; override;
  44.   end;
  45. function CreateCracked(const ACracked: ICrackedInterface): ICrackedInterface;
  46. begin
  47.   Result := TFactory.Create(ACracked);
  48. end;
  49. { TXPTempReleaseTests }
  50. procedure TXPTempReleaseTests.SetUp;
  51. begin
  52.   inherited;
  53.   FSource := TCracked.Create;
  54. end;
  55. procedure TXPTempReleaseTests.TearDown;
  56. begin
  57.   FSource := nil;
  58.   inherited;
  59. end;
  60. procedure TXPTempReleaseTests.TestNoTemps;
  61. var
  62.   Cracked: ICrackedInterface;
  63.   Factory: IInterface;
  64. begin
  65.   CheckEquals(1, FSource.RefCount, 'fsource rc after construction');
  66.   Factory := TFactory.Create(FSource);
  67.   CheckEquals(2, FSource.RefCount, 'fsource rc after factory construction');
  68.   Cracked := Factory as ICrackedInterface;
  69.   CheckEquals(3, FSource.RefCount, 'fsource rc after cracked assigned');
  70.   Cracked := nil;
  71.   CheckEquals(2, FSource.RefCount, 'fsource rc after cracked released');
  72.   Factory := nil;
  73.   CheckEquals(1, FSource.RefCount, 'fsource rc after factory released');
  74. end;
  75. procedure TXPTempReleaseTests.TestFactoryClassTemp;
  76. var
  77.   Cracked: ICrackedInterface;
  78. begin
  79.   CheckEquals(1, FSource.RefCount, 'fsource rc after construction');
  80.   Cracked := TFactory.Create(FSource);
  81.   CheckEquals(3, FSource.RefCount, 'fsource rc after cracked assigned');
  82.   Cracked := nil;
  83.   // instance of TFactory has not been destroyed
  84.   CheckEquals(2, FSource.RefCount, 'fsource rc after cracked released');
  85. end;
  86. procedure TXPTempReleaseTests.TestFactoryFuncTemp;
  87. var
  88.   Cracked: ICrackedInterface;
  89. begin
  90.   CheckEquals(1, FSource.RefCount, 'fsource rc after construction');
  91.   Cracked := CreateCracked(FSource);
  92.   CheckEquals(3, FSource.RefCount, 'fsource rc after cracked assigned');
  93.   Cracked := nil;
  94.   // instance of TFactory has not been destroyed but temp inc in rc due to
  95.   // assignment to result has been recovered
  96.   CheckEquals(2, FSource.RefCount, 'fsource rc after cracked released');
  97. end;
  98. procedure TXPTempReleaseTests.TestLeftRightTemps;
  99. var
  100.   Factory: IInterface;
  101. begin
  102.   CheckEquals(1, FSource.RefCount, 'fsource rc after construction');
  103.   Factory := TFactory.Create(FSource);
  104.   CheckEquals(2, FSource.RefCount, 'fsource rc after factory construction');
  105.   Check(Factory as ICrackedInterface = Factory as ICrackedInterface,
  106.     'equality check failure');
  107.   CheckEquals(4, FSource.RefCount, 'fsource rc after cast equality check');
  108.   Check(Factory as ICrackedInterface <> nil, 'cast inequality to nil');
  109.   CheckEquals(5, FSource.RefCount, 'fsource rc after cast inequality to nil');
  110.   Factory := nil;
  111.   CheckEquals(4, FSource.RefCount, 'fsource rc after factory released');
  112. end;
  113. { TCracked }
  114. destructor TCracked.Destroy;
  115. begin
  116.   inherited;
  117. end;
  118. function TCracked.RefCount: integer;
  119. begin
  120.   Result := FRefCount;
  121. end;
  122. function TCracked._Release: integer;
  123. begin
  124.   Result := inherited _Release;
  125. end;
  126. { TFactory }
  127. constructor TFactory.Create(const ACracked: ICrackedInterface);
  128. begin
  129.   inherited Create;
  130.   FCracked := ACracked;
  131. end;
  132. destructor TFactory.Destroy;
  133. begin
  134.   inherited;
  135. end;
  136. initialization
  137.   TestFramework.RegisterTest('TXPTempReleaseTests Suite',
  138.     TXPTempReleaseTests.Suite);
  139. end.