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

Email服务器

开发平台:

Delphi

  1. unit XPTestedUnitUtils;
  2. {
  3.  $Source: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/XPTestedUnitUtils.pas,v $
  4.  $Revision: 1.3 $
  5.  $Date: 2004/08/22 14:25:40 $
  6.  Last amended by $Author: pvspain $
  7.  $State: Exp $
  8.   ParserTree taxonomy:
  9.    ParserTree
  10.      ParserTree.Children:SectionNode
  11.        SectionNode.Children:ClassNode, FunctionNode
  12.          FunctionNode
  13.          ClassNode.Children:VisibilityNode
  14.            VisibilityNode.Children:MethodNode, PropertyNode
  15.              MethodNode
  16.              PropertyNode
  17.   All these nodes (including ParserTree) are instances or derived from
  18.   IXPParserNode. IXPParserNode derives from IXPFamily which describes and
  19.   implements the lifetime-bound node hierarchy
  20.  Copyright (c) 2003 by The Excellent Programming Company Pty Ltd
  21.  (Australia) (ABN 27 005 394 918).
  22.  Contact Paul Spain via email: paul@xpro.com.au
  23.  This unit is free software; you can redistribute it and/or
  24.  modify it under the terms of the GNU Lesser General Public
  25.  License as published by the Free Software Foundation; either
  26.  version 2.1 of the License, or (at your option) any later version.
  27.  This unit is distributed in the hope that it will be useful,
  28.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  29.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  30.  Lesser General Public License for more details.
  31.  You should have received a copy of the GNU Lesser General Public
  32.  License along with this unit; if not, the license can be viewed at:
  33.  http://www.gnu.org/copyleft/lesser.html
  34.  or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  35.  Boston, MA  02111-1307  USA
  36. }
  37. interface
  38. uses
  39.   XPInterfacedObject,     // IInterface for D5, ..other things
  40.   XPObserver,             // IXPFamily, IXPSubject, IXPObserver
  41.   XPIterator;             // IXPForwardIterator
  42. /////////////////////////////////////////////////////////////////////////////
  43. ///           Base node declarations
  44. /////////////////////////////////////////////////////////////////////////////
  45. type
  46.   IXPParserNode = interface (IXPFamily)
  47.     ['{C1C08303-1571-44EB-9563-B2170B0FC317}']
  48.     function GetEnabled: boolean;
  49.     procedure SetEnabled(const Value: boolean);
  50.     function GetName: string;
  51.     function Parent: IXPParserNode;
  52.     { InsertChild() and AddChild() will return false for duplicate nodes or
  53.       range errors, true otherwise. }
  54.     function InsertChild(const idx: integer;
  55.       const ChildNode: IXPParserNode): boolean;
  56.     function AddChild(const ChildNode: IXPParserNode): boolean;
  57.     { Delete() will return false if the argument node is not found. }
  58.     function DeleteChild(const ChildNode: IXPParserNode): boolean;
  59.     { Number of ChildNodes in the collection }
  60.     function ChildCount: integer;
  61.     { Iterate over ChildNode collection }
  62.     function Children: IXPForwardIterator;
  63.     { Get() will return true for an in-range value of idx
  64.       (0 to Count-1 inclusive), false, otherwise. On success the ChildNode
  65.       (IXPParserNode) is returned in the out parameter }
  66.     function GetChild(const idx: integer;
  67.       out ChildNode: IXPParserNode): boolean;
  68.     { Number of enabled ChildNodes in the collection. }
  69.     function EnabledChildCount: integer;
  70.     { Empty the container contents and reset all state to initial values. }
  71.     procedure Clear;
  72.     property Enabled: boolean
  73.       read GetEnabled write SetEnabled;
  74.     property Name: string
  75.       read GetName;
  76.   end;
  77. /////////////////////////////////////////////////////////////////////////////
  78. ///           ParserTree declaration
  79. /////////////////////////////////////////////////////////////////////////////
  80. type
  81.   IXPParserTree = interface (IXPParserNode)
  82.     ['{D386D34F-AF3A-4E30-AABE-D84D557B0805}']
  83.     procedure SetName(const AName: string);
  84.   end;
  85. function CreateXPParserTree(const UnitName: string = ''): IXPParserTree;
  86. /////////////////////////////////////////////////////////////////////////////
  87. ///           SectionNode declarations
  88. /////////////////////////////////////////////////////////////////////////////
  89. type
  90.   TXPUnitSection = (usNone, usInterface, usImplementation, usInitialization,
  91.     usFinalization);
  92.   IXPSectionNode = interface (IXPParserNode)
  93.     ['{B0376DCB-7C55-416E-9785-E54ECDAAFD72}']
  94.     function GetSection: TXPUnitSection;
  95.   end;
  96. function CreateXPSectionNode(const AParent: IXPParserTree;
  97.   const AUnitSection: TXPUnitSection;
  98.   const IsEnabled: boolean = true): IXPSectionNode;
  99. /////////////////////////////////////////////////////////////////////////////
  100. ///           FunctionNode declarations
  101. /////////////////////////////////////////////////////////////////////////////
  102. type
  103.   IXPFunctionNode = interface (IXPParserNode)
  104.     ['{9970FCD0-44B1-49FE-857D-04590BA2B109}']
  105.   end;
  106. function CreateXPFunctionNode(const AParent: IXPSectionNode;
  107.   const AFunctionName: string; const IsEnabled: boolean = true): IXPFunctionNode;
  108. /////////////////////////////////////////////////////////////////////////////
  109. ///           ClassNode declarations
  110. /////////////////////////////////////////////////////////////////////////////
  111. type
  112.   TXPClassVisibility = (cvNone, cvPrivate, cvProtected, cvPublic,
  113.     cvPublished);
  114.   IXPVisibilityNode = interface (IXPParserNode)
  115.     ['{C97F1CDA-31EF-449C-9C25-69EA47C6FFD0}']
  116.     function GetVisibility: TXPClassVisibility;
  117.   end;
  118.   IXPClassNode = interface (IXPParserNode)
  119.     ['{018BBE6A-6FA6-4E11-871C-7B2CE9F07173}']
  120.     function GetVisibility(const idx: TXPClassVisibility): IXPVisibilityNode;
  121.     // stream positions
  122.     function GetClassBegin: longint;
  123.     procedure SetClassBegin(const APosition: longint);
  124.     function GetClassEnd: longint;
  125.     procedure SetClassEnd(const APosition: longint);
  126.     property Visibilities[const idx: TXPClassVisibility]: IXPVisibilityNode
  127.       read GetVisibility;
  128.     property ClassBegin: longint
  129.       read GetClassBegin write SetClassBegin;
  130.     property ClassEnd: longint
  131.       read GetClassEnd write SetClassEnd;
  132.   end;
  133. function CreateXPClassNode(const AParent: IXPSectionNode;
  134.   const AClassName: string; const IsEnabled: boolean = true): IXPClassNode;
  135. /////////////////////////////////////////////////////////////////////////////
  136. ///           MethodNode declarations
  137. /////////////////////////////////////////////////////////////////////////////
  138. type
  139.   IXPMethodNode = interface (IXPParserNode)
  140.     ['{82C22554-5762-4D9B-9D6E-B8E6EF112857}']
  141.   end;
  142. function CreateXPMethodNode(const AParent: IXPVisibilityNode;
  143.   const AMethodName: string; const IsEnabled: boolean = true): IXPMethodNode;
  144. /////////////////////////////////////////////////////////////////////////////
  145. ///           PropertyNode declarations
  146. /////////////////////////////////////////////////////////////////////////////
  147. type
  148.   IXPPropertyNode = interface (IXPParserNode)
  149.     ['{4B953576-3EE9-4F0F-9EBD-4D651BA9D55F}']
  150.   end;
  151. function CreateXPPropertyNode(const AParent: IXPVisibilityNode;
  152.   const APropertyName: string; const IsEnabled: boolean = true): IXPPropertyNode;
  153. /////////////////////////////////////////////////////////////////////////////
  154. ///           TXPParserNode declaration
  155. /////////////////////////////////////////////////////////////////////////////
  156. type
  157.   TXPParserNode = class (TXPFamily, IXPParserNode, IXPForwardIterator)
  158.   private
  159.     FEnabled: boolean;
  160.     FName: string;
  161.   protected
  162.     FIteratorIndex: integer;
  163.     function SameContent(
  164.       const ObserverA, ObserverB: IXPObserver): boolean; override;
  165.     // IXPParserNode
  166.     function GetEnabled: boolean;
  167.     procedure SetEnabled(const Value: boolean);
  168.     function GetName: string;
  169.     function Parent: IXPParserNode;
  170.     { InsertChild() and AddChild() will return false for duplicate nodes or
  171.       range errors, true otherwise. }
  172.     function InsertChild(const idx: integer;
  173.       const ChildNode: IXPParserNode): boolean;
  174.     function AddChild(const ChildNode: IXPParserNode): boolean;
  175.     { Delete() will return false if the argument node is not found. }
  176.     function DeleteChild(const ChildNode: IXPParserNode): boolean;
  177.     { Number of ChildNodes in the collection }
  178.     function ChildCount: integer;
  179.     { Iterate over ChildNode collection }
  180.     function Children: IXPForwardIterator;
  181.     { Get() will return true for an in-range value of idx
  182.       (0 to Count-1 inclusive), false, otherwise. On success the ChildNode
  183.       (IXPParserNode) is returned in the out parameter }
  184.     function GetChild(const idx: integer;
  185.       out ChildNode: IXPParserNode): boolean;
  186.     { Number of enabled ChildNodes in the collection. }
  187.     function EnabledChildCount: integer;
  188.     { Empty the container contents and reset all state to initial values. }
  189.     procedure Clear;
  190.     // IXPForwardIterator
  191.     procedure Start;
  192.     function Next(out Element): boolean; virtual;
  193.   public
  194.     constructor Create(const AParent: IXPParserNode; const AName: string;
  195.       const IsEnabled: boolean = true; const ADelegator: IInterface = nil);
  196.   end;
  197. /////////////////////////////////////////////////////////////////////////////
  198. //           TXPParserTree declaration
  199. /////////////////////////////////////////////////////////////////////////////
  200. type
  201.   TXPParserTree = class (TXPParserNode, IXPParserTree)
  202.   protected
  203.     procedure SetName(const AName: string);
  204.   end;
  205. implementation
  206. uses
  207.   SysUtils;               // AnsiSameText
  208. // Not required at global scope
  209. function CreateXPVisibilityNode(const AParent: IXPClassNode;
  210.   const AVisibility: TXPClassVisibility;
  211.   const IsEnabled: boolean = true): IXPVisibilityNode; forward;
  212. procedure TXPParserTree.SetName(const AName: string);
  213. begin
  214.   FName := AName;
  215. end;
  216. function CreateXPParserTree(const UnitName: string): IXPParserTree;
  217. const
  218.   AParent = nil;
  219.   IsEnabled = true;
  220. begin
  221.   Result := TXPParserTree.Create(AParent, UnitName, IsEnabled);
  222. end;
  223. type
  224.   TSectionNode = class (TXPParserNode, IXPSectionNode)
  225.   private
  226.     FUnitSection: TXPUnitSection;
  227.   protected
  228.     function GetSection: TXPUnitSection;
  229.   public
  230.     constructor Create(const AParent: IXPParserTree;
  231.       const AUnitSection: TXPUnitSection; const IsEnabled: boolean = true;
  232.       const ADelegator: IInterface = nil);
  233.   end;
  234. function CreateXPSectionNode(const AParent: IXPParserTree;
  235.   const AUnitSection: TXPUnitSection; const IsEnabled: boolean): IXPSectionNode;
  236. begin
  237.   Result :=  TSectionNode.Create(AParent, AUnitSection, IsEnabled);
  238. end;
  239. type
  240.   TFunctionNode = class (TXPParserNode, IXPFunctionNode)
  241.   end;
  242. function CreateXPFunctionNode(const AParent: IXPSectionNode;
  243.   const AFunctionName: string; const IsEnabled: boolean): IXPFunctionNode;
  244. begin
  245.   Result := TFunctionNode.Create(AParent, AFunctionName, IsEnabled);
  246. end;
  247. type
  248.   TClassNode = class(TXPParserNode, IXPClassNode)
  249.   private
  250.     FClassBegin: longint;
  251.     FClassEnd: longint;
  252.   protected
  253.     function GetVisibility(const idx: TXPClassVisibility): IXPVisibilityNode;
  254.     // stream positions
  255.     function GetClassBegin: longint;
  256.     procedure SetClassBegin(const APosition: longint);
  257.     function GetClassEnd: longint;
  258.     procedure SetClassEnd(const APosition: longint);
  259.   public
  260.     constructor Create(const AParent: IXPSectionNode;
  261.       const AClassName: string; const IsEnabled: boolean = true;
  262.       const ADelegator: IInterface = nil);
  263.   end;
  264. function CreateXPClassNode(const AParent: IXPSectionNode;
  265.   const AClassName: string; const IsEnabled: boolean): IXPClassNode;
  266. begin
  267.   Result := TClassNode.Create(AParent, AClassName, IsEnabled);
  268. end;
  269. type
  270.   TVisibilityNode = class (TXPParserNode, IXPVisibilityNode)
  271.   private
  272.     FVisibility: TXPClassVisibility;
  273.   protected
  274.     function GetVisibility: TXPClassVisibility;
  275.   public
  276.     constructor Create(const AParent: IXPClassNode;
  277.       const AVisibility: TXPClassVisibility; const IsEnabled: boolean = true;
  278.       const ADelegator: IInterface = nil);
  279.   end;
  280. function CreateXPVisibilityNode(const AParent: IXPClassNode;
  281.   const AVisibility: TXPClassVisibility;
  282.   const IsEnabled: boolean = true): IXPVisibilityNode;
  283. begin
  284.   Result := TVisibilityNode.Create(AParent, AVisibility, IsEnabled);
  285. end;
  286. type
  287.   TMethodNode = class (TXPParserNode, IXPMethodNode)
  288.   public
  289.     constructor Create(const AParent: IXPVisibilityNode;
  290.       const AMethodName: string; const IsEnabled: boolean = true;
  291.       const ADelegator: IInterface = nil);
  292.   end;
  293. function CreateXPMethodNode(const AParent: IXPVisibilityNode;
  294.   const AMethodName: string; const IsEnabled: boolean = true): IXPMethodNode;
  295. begin
  296.   Result := TMethodNode.Create(AParent, AMethodName, IsEnabled);
  297. end;
  298. type
  299.   TPropertyNode = class (TXPParserNode, IXPPropertyNode)
  300.   public
  301.     constructor Create(const AParent: IXPVisibilityNode;
  302.       const APropertyName: string; const IsEnabled: boolean = true;
  303.       const ADelegator: IInterface = nil);
  304.   end;
  305. function CreateXPPropertyNode(const AParent: IXPVisibilityNode;
  306.   const APropertyName: string; const IsEnabled: boolean = true): IXPPropertyNode;
  307. begin
  308.   Result := TPropertyNode.Create(AParent, APropertyName, IsEnabled);
  309. end;
  310. { TMethodNode }
  311. constructor TMethodNode.Create(const AParent: IXPVisibilityNode;
  312.   const AMethodName: string; const IsEnabled: boolean;
  313.   const ADelegator: IInterface);
  314. begin
  315.   inherited Create(AParent, AMethodName, IsEnabled, ADelegator);
  316. end;
  317. { TXPParserNode }
  318. constructor TXPParserNode.Create(const AParent: IXPParserNode;
  319.   const AName: string; const IsEnabled: boolean; const ADelegator: IInterface);
  320. begin
  321.   inherited Create(AParent, ADelegator);
  322.   FName := AName;
  323.   FEnabled := IsEnabled;
  324.   FIteratorIndex := -1;
  325. end;
  326. function TXPParserNode.AddChild(const ChildNode: IXPParserNode): boolean;
  327. begin
  328.   Result := AddObserver(ChildNode, self);
  329. end;
  330. function TXPParserNode.ChildCount: integer;
  331. begin
  332.   Result := ObserverCount;
  333. end;
  334. function TXPParserNode.Children: IXPForwardIterator;
  335. begin
  336.   Result := self;
  337. end;
  338. procedure TXPParserNode.Clear;
  339. begin
  340.   DeleteObservers;
  341. end;
  342. function TXPParserNode.DeleteChild(
  343.   const ChildNode: IXPParserNode): boolean;
  344. begin
  345.   Result := DeleteObserver(ChildNode);
  346. end;
  347. function TXPParserNode.GetChild(const idx: integer;
  348.   out ChildNode: IXPParserNode): boolean;
  349. begin
  350.   Result := SysUtils.Supports(GetObserver(idx), IXPParserNode, ChildNode);
  351. end;
  352. function TXPParserNode.GetEnabled: boolean;
  353. begin
  354.   Result := FEnabled;
  355. end;
  356. function TXPParserNode.GetName: string;
  357. begin
  358.   Result := FName;
  359. end;
  360. function TXPParserNode.InsertChild(const idx: integer;
  361.   const ChildNode: IXPParserNode): boolean;
  362. begin
  363.   Result := InsertObserver(idx, ChildNode, self);
  364. end;
  365. function TXPParserNode.Next(out Element): boolean;
  366. begin
  367.   System.Inc(FIteratorIndex);
  368.   Result := FIteratorIndex < ObserverCount;
  369.   if Result then
  370.     IXPParserNode(Element) := GetObserver(FIteratorIndex) as IXPParserNode;
  371. end;
  372. function TXPParserNode.Parent: IXPParserNode;
  373. begin
  374.   Result := FParent as IXPParserNode;
  375. end;
  376. procedure TXPParserNode.SetEnabled(const Value: boolean);
  377. begin
  378.   FEnabled := Value;
  379. end;
  380. procedure TXPParserNode.Start;
  381. begin
  382.   FIteratorIndex := -1;
  383. end;
  384. function TXPParserNode.SameContent(const ObserverA,
  385.   ObserverB: IXPObserver): boolean;
  386. begin
  387.   Result := SysUtils.AnsiSameText((ObserverA as IXPParserNode).Name,
  388.     (ObserverB as IXPParserNode).Name);
  389. end;
  390. function TXPParserNode.EnabledChildCount: integer;
  391. var
  392.   SavedIteratorIndex: integer;
  393.   Node: IXPParserNode;
  394. begin
  395.   SavedIteratorIndex := FIteratorIndex;
  396.   Result := 0;
  397.   Start;
  398.   while Next(Node) do
  399.     if Node.Enabled then
  400.       System.Inc(Result);
  401.   FIteratorIndex := SavedIteratorIndex;
  402. end;
  403. { TClassNode }
  404. constructor TClassNode.Create(const AParent: IXPSectionNode;
  405.   const AClassName: string; const IsEnabled: boolean;
  406.   const ADelegator: IInterface);
  407. begin
  408.   inherited Create(AParent, AClassName, IsEnabled, ADelegator);
  409.   CreateXPVisibilityNode(self, cvPrivate);
  410.   CreateXPVisibilityNode(self, cvProtected);
  411.   CreateXPVisibilityNode(self, cvPublic);
  412.   CreateXPVisibilityNode(self, cvPublished);
  413. end;
  414. function TClassNode.GetClassBegin: longint;
  415. begin
  416.   Result := FClassBegin;
  417. end;
  418. function TClassNode.GetClassEnd: longint;
  419. begin
  420.   Result := FClassEnd;
  421. end;
  422. function TClassNode.GetVisibility(
  423.   const idx: TXPClassVisibility): IXPVisibilityNode;
  424. var
  425.   Node: IXPParserNode;
  426.   SavedIteratorIndex: integer;
  427. begin
  428.   SavedIteratorIndex := FIteratorIndex;
  429.   Start;
  430.   // Search till exhausted or we have a match
  431.   while Next(Node) and ((Node as IXPVisibilityNode).GetVisibility <> idx) do ;
  432.   if not (SysUtils.Supports(Node, IXPVisibilityNode, Result)
  433.       and (Result.GetVisibility = idx)) then
  434.     Result := nil;
  435.   FIteratorIndex := SavedIteratorIndex;
  436. end;
  437. procedure TClassNode.SetClassBegin(const APosition: Integer);
  438. begin
  439.   FClassBegin := APosition;
  440. end;
  441. procedure TClassNode.SetClassEnd(const APosition: Integer);
  442. begin
  443.   FClassEnd := APosition;
  444. end;
  445. { TVisibilityNode }
  446. constructor TVisibilityNode.Create(const AParent: IXPClassNode;
  447.   const AVisibility: TXPClassVisibility; const IsEnabled: boolean;
  448.   const ADelegator: IInterface);
  449. const
  450.   VisStrs: array[cvPrivate..cvPublished] of string = ( 'private',
  451.     'protected', 'public', 'published' );
  452. begin
  453.   Assert(AVisibility <> cvNone,
  454.     'TVisibilityNode.Create(): AVisibility = cvNone');
  455.   inherited Create(AParent, VisStrs[AVisibility], IsEnabled, ADelegator);
  456.   FVisibility := AVisibility;
  457. end;
  458. function TVisibilityNode.GetVisibility: TXPClassVisibility;
  459. begin
  460.   Result := FVisibility;
  461. end;
  462. { TSectionNode }
  463. constructor TSectionNode.Create(const AParent: IXPParserTree;
  464.   const AUnitSection: TXPUnitSection; const IsEnabled: boolean;
  465.   const ADelegator: IInterface);
  466. const
  467.   SectionStrs: array[usInterface..usFinalization] of string = ( 'interface',
  468.     'implementation', 'initialization', 'finalization' );
  469. begin
  470.   Assert(AUnitSection <> usNone,
  471.     'TVisibilityNode.Create(): AUnitSection = usNone');
  472.   inherited Create(AParent, SectionStrs[AUnitSection], IsEnabled, ADelegator);
  473.   FUnitSection := AUnitSection;
  474. end;
  475. function TSectionNode.GetSection: TXPUnitSection;
  476. begin
  477.   Result := FUnitSection;
  478. end;
  479. { TPropertyNode }
  480. constructor TPropertyNode.Create(const AParent: IXPVisibilityNode;
  481.   const APropertyName: string; const IsEnabled: boolean;
  482.   const ADelegator: IInterface);
  483. begin
  484.   inherited Create(AParent, APropertyName, IsEnabled, ADelegator);
  485. end;
  486. end.