亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? xpinterfacedobjecttests.pas

?? 類似于Java JUnit的單元測(cè)試
?? PAS
字號(hào):
unit XPInterfacedObjectTests;

interface

uses
  XPInterfacedObject,
  TestFrameWork;

type

  IXPCrackedInterface = interface(IInterface)
    ['{2ECEC777-1C1B-4797-8916-4D7139BA4392}']
    function RefCount: integer;
  end;

  TXPInterfacedObjectTests = class(TTestCase)
  private

    FDelegator: IXPCrackedInterface;
    FContained: IInterface;
    FXPContained: IXPCrackedInterface;
    FCleverDelegator: IInterface;

  protected

    procedure SetUp; override;
    procedure TearDown; override;

  published

    // Test methods
    procedure TestQueryInterface;
    procedure Test_AddRef;
    procedure Test_AddRefXP;
    procedure Test_Release;
    procedure TestCreate;
    procedure TestCreateXP;
    procedure TestDestroy;
    procedure TestDelegation;
    procedure TestIntrospective;
  end;


implementation

uses
  SysUtils;

type
  // Access FRefCount

  TCrackedInterface = class(TInterfacedObject, IXPCrackedInterface)
  protected

    function RefCount: integer;

  public

    destructor Destroy; override;
  end;

  TXPCrackedInterface = class(TXPInterfacedObject, IXPCrackedInterface)
  protected

    function RefCount: integer;

  public

    destructor Destroy; override;
  end;

  IA = interface
    ['{CEBA0535-4909-4605-8AFC-844092A36D47}']
    function A: integer;
  end;

  IB = interface
    ['{121BAA8A-A52B-4FA1-9729-3A8E744E1F41}']
    function B: integer;
  end;

  IC = interface
    ['{AA3CCF11-704B-414D-B6F5-514493D09D38}']
    function C: integer;
  end;

  ID = interface
    ['{B028B140-AFB2-49D8-9A71-CE82555080DA}']
    function D: integer;
  end;

  TClever = class(TInterfacedObject, IA, IB)
  protected
    function A: integer;
    function B: integer;
  end;

  TUnOwnedDelegatee = class(TInterfacedObject, IC)
  protected
    function C: integer;
  end;

  TOwnedDelegatee = class(TXPInterfacedObject, ID)
  protected
    function D: integer;
  end;

  TDelegator = class (TCrackedInterface, IC, ID)
  private

    FUnOwned: TUnOwnedDelegatee;
    FOwned: TOwnedDelegatee;

  protected

    property UnOwned: TUnOwnedDelegatee
      read FUnOwned implements IC;
    property Owned: TOwnedDelegatee
      read FOwned implements ID;

  public

    constructor Create;
    destructor Destroy; override;
    procedure SetIntrospective(Value: boolean);
  end;

{ TXPInterfacedObjectTests }

procedure TXPInterfacedObjectTests.SetUp;
begin
  inherited;
  FDelegator := TCrackedInterface.Create;
  FCleverDelegator := TClever.Create;
end;

procedure TXPInterfacedObjectTests.TearDown;
begin
  FXPContained := nil;
  FContained := nil;
  FDelegator := nil;
  FCleverDelegator := nil;
  inherited;
end;

procedure TXPInterfacedObjectTests.Test_AddRef;
begin
  // Memory leak created here, as there is no way to call FContained destructor
  FContained := TXPInterfacedObject.Create(FDelegator);
  CheckEquals(2, FDelegator.RefCount, 'Bad rc after owned construction');
  FContained._AddRef;
  CheckEquals(3, FDelegator.RefCount, 'Bad rc after owned addref');
  FContained._AddRef;
  CheckEquals(4, FDelegator.RefCount, 'Bad rc after second owned addref');
  FContained._Release;
  FContained._Release;
end;

procedure TXPInterfacedObjectTests.Test_Release;
begin
  // Memory leak created here, as there is no way to call FContained destructor
  FContained := TXPInterfacedObject.Create(FDelegator);
  CheckEquals(2, FDelegator.RefCount, 'Bad rc after owned construction');
  FContained._AddRef;
  CheckEquals(3, FDelegator.RefCount, 'Bad rc after owned addref');
  FContained._AddRef;
  CheckEquals(4, FDelegator.RefCount, 'Bad rc after owned second addref');
  FContained._Release;
  CheckEquals(3, FDelegator.RefCount, 'Bad rc after owned release');
  FContained._Release;
  CheckEquals(2, FDelegator.RefCount, 'Bad rc after owned second release');
  FContained := nil;
  CheckEquals(1, FDelegator.RefCount, 'Bad rc after owned nil''d');
end;

procedure TXPInterfacedObjectTests.TestCreate;
begin
  CheckEquals(1, FDelegator.RefCount, 'Initial rc for Delegator');
  FContained := TXPInterfacedObject.Create;
  CheckEquals(1, FDelegator.RefCount, 'Bad rc after default construction');
  FContained := TXPInterfacedObject.Create(nil);
  CheckEquals(1, FDelegator.RefCount, 'Bad rc after nil construction');
  // Memory leak created here, as there is no way to call FContained destructor
  FContained := TXPInterfacedObject.Create(FDelegator);
  CheckEquals(2, FDelegator.RefCount, 'Bad rc after owned construction');
end;

procedure TXPInterfacedObjectTests.TestDestroy;
begin
  // Memory leak created here, as there is no way to call FContained destructor
  FContained := TXPInterfacedObject.Create(FDelegator);
  CheckEquals(2, FDelegator.RefCount, 'Bad rc after owned construction');
  FContained := nil;
  CheckEquals(1, FDelegator.RefCount, 'Bad rc after owned destruction');
end;

procedure TXPInterfacedObjectTests.TestQueryInterface;
var
  A: IA;
  B: IB;

begin
  // Memory leak created here, as there is no way to call FContained destructor
  FContained := TXPInterfacedObject.Create(FCleverDelegator);
  Check(SysUtils.Supports(FContained, IA, A), 'Not finding IA through owned');
  CheckEquals(1, A.A, 'queried IA.A failed');
  CheckEquals(1, (FContained as IA).A, '(FContained as IA).A failed');
  Check(SysUtils.Supports(FContained, IB, B), 'Not finding IB through owned');
  CheckEquals(2, B.B, 'queried IB.B failed');
  CheckEquals(2, (FContained as IB).B, '(FContained as IB).B failed');

  // Drop reference to container and query containers interfaces through
  // contained reference

  A := nil;
  B := nil;
  FCleverDelegator := nil;
  Check(SysUtils.Supports(FContained, IA, A),
    'Not finding IA through owned after container released');
  CheckEquals(1, A.A, 'queried IA.A failed  after container released');
  CheckEquals(1, (FContained as IA).A,
    '(FContained as IA).A failed  after container released');

  Check(SysUtils.Supports(FContained, IB, B),
    'Not finding IB through owned  after container released');
  CheckEquals(2, B.B, 'queried IB.B failed  after container released');
  CheckEquals(2, (FContained as IB).B,
    '(FContained as IB).B failed  after container released');
end;

procedure TXPInterfacedObjectTests.TestCreateXP;
begin
  FXPContained := TXPCrackedInterface.Create;
  CheckEquals(1, FXPContained.RefCount, 'Initial rc for unowned xp');
  FXPContained := nil;
  FXPContained := TXPCrackedInterface.Create(nil);
  CheckEquals(1, FXPContained.RefCount, 'Initial rc for unowned (nil) xp');
  FXPContained := nil;

  FXPContained := TXPCrackedInterface.Create;
  CheckEquals(1, FXPContained.RefCount, 'Initial rc for unowned xp');
  FXPContained := TXPCrackedInterface.Create(nil);
  CheckEquals(1, FXPContained.RefCount,
    'Initial rc for unowned (nil) xp - no intervening nil');
  FXPContained := nil;

  CheckEquals(1, FDelegator.RefCount, 'Initial rc for Delegator');
  // Memory leak created here, as there is no way to call FXPContained
  // destructor
  FXPContained := TXPCrackedInterface.Create(FDelegator);
  CheckEquals(2, FDelegator.RefCount, 'Bad rc after owned xp construction');
  CheckEquals(1, FXPContained.RefCount, 'Initial rc for owned xp');

  // Memory leak created here, as there is no way to call FContained destructor
  FContained := TXPInterfacedObject.Create(FDelegator);
  CheckEquals(3, FDelegator.RefCount,
    'Bad rc after owned construction with xp on board');
  CheckEquals(1, FXPContained.RefCount,
    'Bad rc for owned xp afer owned added to delegator');
  FContained := nil;
  CheckEquals(2, FDelegator.RefCount,
    'Bad rc after owned nil''d with xp on board');
  CheckEquals(1, FXPContained.RefCount,
    'Bad rc for owned xp after owned nil''d with xp on board');
end;

procedure TXPInterfacedObjectTests.Test_AddRefXP;
begin
  // Memory leak created here, as there is no way to call FXPContained
  // destructor
  FXPContained := TXPCrackedInterface.Create(FDelegator);
  CheckEquals(2, FDelegator.RefCount, 'Bad rc after owned construction');
  CheckEquals(1, FXPContained.RefCount, 'Initial rc for owned xp');
  FXPContained._AddRef;
  CheckEquals(3, FDelegator.RefCount, 'Bad rc after owned addref');
  CheckEquals(2, FXPContained.RefCount, 'Bad rc for addref''d xp');
  FXPContained._AddRef;
  CheckEquals(4, FDelegator.RefCount, 'Bad rc after second owned addref');
  CheckEquals(3, FXPContained.RefCount, 'Bad rc for second addref''d xp');
  FXPContained._Release;
  CheckEquals(3, FDelegator.RefCount, 'Bad rc after owned released xp');
  CheckEquals(2, FXPContained.RefCount, 'Bad rc for released xp');
  FXPContained._Release;
  CheckEquals(2, FDelegator.RefCount, 'Bad rc after owned second released xp');
  CheckEquals(1, FXPContained.RefCount, 'Bad rc for second released xp');
end;

procedure TXPInterfacedObjectTests.TestDelegation;
var
  Delegator: IXPCrackedInterface;
  Unowned: IC;
  Owned: ID;

begin
  Delegator := TDelegator.Create;
  CheckEquals(1, Delegator.RefCount, 'Delegator rc after construction');
  Check(SysUtils.Supports(Delegator, IC, Unowned), '1st query for unowned');
  CheckEquals(1, Delegator.RefCount, 'Delegator rc after querying for unowned');
  CheckEquals(3, Unowned.C, 'Called method on IC interface');
  Unowned := nil;
{
  // Uncomment this to see an invalid pointer op, since we have just destroyed
  // the implementing object for IC, and now have a dangling reference within
  // the TDelegator container
  Check(SysUtils.Supports(Delegator, IC, Unowned),
    'query for unowned after reference released');
}
  CheckEquals(1, Delegator.RefCount, 'Delegator rc after unowned released');
  Check(SysUtils.Supports(Delegator, ID, Owned), '1st query for owned');
  CheckEquals(2, Delegator.RefCount, 'Delegator rc after querying for owned');
  CheckEquals(4, Owned.D, 'Called method on ID interface');
  Owned := nil;
  CheckEquals(1, Delegator.RefCount, 'Delegator rc after owned released');
  // Try op that fails for Unowned - fetch owned ref again
  Check(SysUtils.Supports(Delegator, ID, Owned), '2nd query for owned');
  CheckEquals(2, Delegator.RefCount, 'Delegator rc after 2nd query for owned');
  CheckEquals(4, Owned.D, 'Called method on ID interface after 2nd query');
end;

procedure TXPInterfacedObjectTests.TestIntrospective;
var
  Delegator: TDelegator;
  Cracked: IXPCrackedInterface;
  Owned: ID;

begin
  Delegator := TDelegator.Create;
  CheckEquals(0, Delegator.RefCount, 'Delegator rc after construction');
  Check(SysUtils.Supports(TObject(Delegator), ID, Owned), '1st query for owned');
  CheckEquals(1, Delegator.RefCount, 'Delegator rc after querying for owned');
  CheckEquals(4, Owned.D, 'Called method on ID interface');

  // default introspective setting

  Check(SysUtils.Supports(Owned, IXPCrackedInterface, Cracked),
    'query for delegator interface through owned');
  CheckEquals(2, Delegator.RefCount,
    'Delegator rc after query for delegator interface through owned');

  // true introspective setting

  Delegator.SetIntrospective(true);
  Check(not SysUtils.Supports(Owned, IXPCrackedInterface, Cracked),
    'query for delegator interface through owned with introspective true');

  // false introspective setting

  Delegator.SetIntrospective(false);
  Check(SysUtils.Supports(Owned, IXPCrackedInterface, Cracked),
    'query for delegator interface through owned with introspective false');
  CheckEquals(2, Delegator.RefCount,
    'Delegator rc after query for delegator interface through owned (false)');
  Cracked := nil;
  CheckEquals(1, Delegator.RefCount,
    'Delegator rc after Cracked = nil');
  Owned := nil;
end;

{ TCrackedInterface }

destructor TCrackedInterface.Destroy;
begin

  inherited;
end;

function TCrackedInterface.RefCount: integer;
begin
  Result := FRefCount;
end;

{ TXPCrackedInterface }

destructor TXPCrackedInterface.Destroy;
begin

  inherited;
end;

function TXPCrackedInterface.RefCount: integer;
begin
  Result := FRefCount;
end;

{ TClever }

function TClever.A: integer;
begin
  Result := 1;
end;

function TClever.B: integer;
begin
  Result := 2;
end;

{ TDelegator }

constructor TDelegator.Create;
begin
  inherited;
  FUnOwned := TUnOwnedDelegatee.Create;
  FOwned := TOwnedDelegatee.Create(self);
end;

destructor TDelegator.Destroy;
begin
  // We are not knocking off FUnowned as this will be destroyed through
  // releasing a reference in the test
  FOwned.Free;
  inherited;
end;

procedure TDelegator.SetIntrospective(Value: boolean);
begin
  FOwned.Introspective := Value;
end;

{ TUnOwnedDelegatee }

function TUnOwnedDelegatee.C: integer;
begin
  Result := 3;
end;

{ TOwnedDelegatee }

function TOwnedDelegatee.D: integer;
begin
  Result := 4;
end;

initialization

  TestFramework.RegisterTest('XPInterfacedObjectTests Suite',
    TXPInterfacedObjectTests.Suite);

end.

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩不卡一区二区| 一区二区三区四区中文字幕| 国产精品国产精品国产专区不蜜 | 欧美日韩在线播放三区| 日韩免费一区二区| 亚洲五月六月丁香激情| 国产精品一区三区| 日韩天堂在线观看| 亚洲va欧美va人人爽午夜| 97精品国产97久久久久久久久久久久| 欧美大尺度电影在线| 亚洲国产wwwccc36天堂| 99久久精品国产毛片| 欧美国产成人在线| 久久电影网站中文字幕 | 亚洲女女做受ⅹxx高潮| 国产美女在线精品| 日韩免费高清av| 日韩综合一区二区| 欧美天堂一区二区三区| 亚洲欧洲在线观看av| 国产精品一区二区男女羞羞无遮挡| 91精品国产全国免费观看| 亚洲黄一区二区三区| 91免费国产在线| 中文字幕一区二区三区不卡在线| 国产v日产∨综合v精品视频| 欧美电影免费观看高清完整版在线观看 | 伦理电影国产精品| 日韩一区二区三| 另类小说综合欧美亚洲| 日韩欧美在线一区二区三区| 日本亚洲免费观看| 欧美一区午夜视频在线观看| 偷拍自拍另类欧美| 欧美精品久久99| 男人操女人的视频在线观看欧美 | 亚洲第一av色| 色婷婷综合激情| 中文字幕一区二区三区色视频 | 国产成人av一区二区三区在线观看| 精品女同一区二区| 国产成人午夜高潮毛片| 欧美国产视频在线| 91网上在线视频| 一区二区日韩电影| 欧美人伦禁忌dvd放荡欲情| 亚洲国产中文字幕在线视频综合| 欧美精品久久一区| 久久国产福利国产秒拍| 国产亚洲短视频| 在线亚洲+欧美+日本专区| 亚洲一区二区三区免费视频| 欧美一区二区三区婷婷月色 | 日本视频在线一区| 欧美一区二区三区在线观看 | 国产精品伦一区| 2023国产精品视频| 色诱视频网站一区| 日韩专区一卡二卡| 国产亚洲女人久久久久毛片| 91日韩精品一区| 男女性色大片免费观看一区二区| 国产网站一区二区三区| 欧美视频一区二区三区四区 | 日本一区二区视频在线| 91麻豆视频网站| 久久97超碰色| 亚洲免费在线播放| 26uuu久久综合| 日本精品裸体写真集在线观看| 免费在线看一区| 亚洲色图欧美偷拍| 久久久亚洲欧洲日产国码αv| 一本一道久久a久久精品| 久久精品av麻豆的观看方式| 日韩美女久久久| 久久你懂得1024| 69精品人人人人| 9i看片成人免费高清| 开心九九激情九九欧美日韩精美视频电影 | 日韩—二三区免费观看av| 国产精品久久久久久久久搜平片| 91精品蜜臀在线一区尤物| 国产福利精品导航| 蜜桃av一区二区三区| 依依成人综合视频| 国产精品美女久久久久久| 欧美成人免费网站| 欧美精品xxxxbbbb| 欧洲精品在线观看| 成人av在线资源网站| 狠狠色狠狠色综合日日91app| 亚洲国产日韩a在线播放| 中文字幕 久热精品 视频在线| 日韩亚洲欧美高清| 欧美精品久久久久久久多人混战| 色一情一乱一乱一91av| 国产激情视频一区二区在线观看 | 色菇凉天天综合网| 北条麻妃国产九九精品视频| 国产麻豆午夜三级精品| 久久国内精品自在自线400部| 亚洲bt欧美bt精品| 亚洲一区电影777| 一区二区三区在线高清| 国产精品久久午夜| 国产精品无遮挡| 欧美激情一二三区| 亚洲国产精品二十页| 精品欧美黑人一区二区三区| 日韩欧美国产不卡| 欧美一区二区三区电影| 欧美日韩电影在线播放| 欧美日韩中文国产| 欧美老女人在线| 欧美放荡的少妇| 51精品秘密在线观看| 91精品国产乱码| 欧美大白屁股肥臀xxxxxx| 欧美一区二区三区免费视频 | 555夜色666亚洲国产免| 欧美日韩在线观看一区二区| 欧美精品自拍偷拍| 欧美刺激午夜性久久久久久久| 精品国产91乱码一区二区三区| 日韩丝袜情趣美女图片| 欧美精品一区二区三区四区 | 91视频免费看| 欧美在线不卡视频| 欧美电影一区二区| 国产亚洲一区字幕| 国产精品久久久久永久免费观看 | 国产精品狼人久久影院观看方式| 亚洲色图19p| 午夜精品久久久久久久99樱桃| 日本欧美在线观看| 粉嫩aⅴ一区二区三区四区五区 | 国产精品 日产精品 欧美精品| 成人av网站免费观看| 欧美国产综合一区二区| 国产精品乱码妇女bbbb| 一区二区三区加勒比av| 青青草成人在线观看| 国产aⅴ综合色| 欧美自拍偷拍一区| 亚洲精品一区二区三区香蕉| 中文字幕亚洲在| 麻豆精品在线观看| av在线这里只有精品| 欧美夫妻性生活| 国产精品免费av| 天天影视涩香欲综合网| 国产成人精品1024| 99久久99久久精品国产片果冻 | 欧美性大战久久久久久久| 欧美一区二区三区婷婷月色| 国产精品水嫩水嫩| 秋霞av亚洲一区二区三| av成人老司机| 精品久久久久一区| 亚洲电影激情视频网站| 国产成人超碰人人澡人人澡| 欧美美女黄视频| 亚洲视频1区2区| 国模无码大尺度一区二区三区| 欧美午夜精品电影| 国产精品久久看| 国产一区二区三区免费看| 欧美偷拍一区二区| 国产精品久久午夜夜伦鲁鲁| 蜜桃91丨九色丨蝌蚪91桃色| 在线观看成人免费视频| 国产精品妹子av| 国产成人一级电影| 欧美一区二区三区免费| 亚洲第一综合色| 色综合天天综合网天天看片| 久久婷婷一区二区三区| 日本成人中文字幕在线视频 | 久久久不卡影院| 日本三级亚洲精品| 欧美日韩国产精选| 亚洲制服丝袜av| 91美女福利视频| 国产精品免费免费| 丁香六月久久综合狠狠色| 久久综合九色综合欧美98| 免费人成在线不卡| 欧美精品第1页| 日本成人在线网站| 91精品国产麻豆国产自产在线 | 精品久久一区二区| 青青草原综合久久大伊人精品优势| 欧美日韩国产综合一区二区三区| 亚洲精品视频自拍| 91国在线观看| 亚洲午夜精品17c| 欧美日韩高清在线播放| 午夜av区久久|