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

Email服务器

开发平台:

Delphi

  1. unit XPDUnitParameters;
  2. {
  3.  $Source: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/XPDUnitParameters.pas,v $
  4.  $Revision: 1.2 $
  5.  $Date: 2004/05/03 15:07:16 $
  6.  Last amended by $Author: pvspain $
  7.  $State: Exp $
  8.  XPDUnitParser:
  9.  Copyright (c) 2003 by The Excellent Programming Company Pty Ltd
  10.  (Australia) (ABN 27 005 394 918). All rights reserved.
  11.  Contact Paul Spain via email: paul@xpro.com.au
  12.  This unit is free software; you can redistribute it and/or
  13.  modify it under the terms of the GNU Lesser General Public
  14.  License as published by the Free Software Foundation; either
  15.  version 2.1 of the License, or (at your option) any later version.
  16.  This unit is distributed in the hope that it will be useful,
  17.  but WITHOUT ANY WARRANTY; without even the implied warranty of
  18.  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19.  Lesser General Public License for more details.
  20.  You should have received a copy of the GNU Lesser General Public
  21.  License along with this unit; if not, the license can be viewed at:
  22.  http://www.gnu.org/copyleft/lesser.html
  23.  or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  24.  Boston, MA  02111-1307  USA
  25.  }
  26. interface
  27. uses
  28.   XPDUnitCommon;
  29. ///////////////////////////////////////////////////////////////////////////////
  30. // Unit entry point
  31. ///////////////////////////////////////////////////////////////////////////////
  32. function CreateXPDUnitParameters: IXPDUnitParameters;
  33. implementation
  34. uses
  35.   SysUtils,
  36.   IniFiles,
  37.   XPTemplateParser,
  38.   XPDUnitMacros,
  39.   XP_OTAUtils;
  40. const
  41.   CVSID: string = '$Header: /cvsroot/dunit/dunit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/XPDUnitParameters.pas,v 1.2 2004/05/03 15:07:16 pvspain Exp $';
  42. resourcestring
  43.   sTestedUnitName = 'Name of unit under test. Uses selected IDE Editor file.';
  44.   sTestedUnitPath = 'Path of unit under test. Uses selected IDE Editor file.';
  45.   sUnitName = 'TestModule unit name.';
  46.   sUnitPath = 'Path of TestModule unit file. Include the trailing directory delimiter.';
  47.   sClassName = 'TestCase class name.';
  48.   sMethodName = 'TestCase class method name.';
  49.   sProjectName = 'Name of TestProject.';
  50.   sProjectPath = 'Path of TestProject. Include the trailing directory delimiter.';
  51. const
  52.   ParameterDescriptions: array[TXPDUnitParameter] of string = (
  53.     sTestedUnitName, sTestedUnitPath, sUnitName, sUnitPath,
  54.     sClassName, sMethodName, sProjectName, sProjectPath);
  55.   TemplateDefaults: array[TXPDUnitParameter] of string = (
  56.     '$FILESTEM($CURRENTUNIT)',          // current unit name
  57.     '$FILEPATH($CURRENTUNIT)',          // current unit path
  58.     '$FILESTEM($CURRENTUNIT)Tests',     // suffix of 'Tests' to current unit
  59.     '$FILEPATH($CURRENTUNIT)dunit',    // subdir 'dunit' below current unit
  60.     '$TESTEDCLASSNAMETests',            // tested class name with 'Tests' suffix
  61.     'Test$TESTEDMETHODNAME',            // tested method name with 'Test' prefix
  62.     '$FILESTEM($CURRENTPROJECT)Tests',  // suffix of 'Tests' to current project
  63.     '$FILEPATH($CURRENTPROJECT)dunit'  // subdir 'dunit' below current project
  64.     );
  65.   ParameterIdentifiers: array[TXPDUnitParameter] of string = (
  66.     'TESTEDUNITNAME', 'TESTEDUNITPATH', 'UNITNAME', 'UNITPATH', 'CLASSNAME',
  67.     'METHODNAME', 'PROJECTNAME', 'PROJECTPATH');
  68. ///////////////////////////////////////////////////////////////////////////////
  69. //  Interface implementation class
  70. ///////////////////////////////////////////////////////////////////////////////
  71. type
  72.   TParameters = class (TInterfacedObject, IXPDUnitParameters)
  73.   private
  74.     FMethods: array[TXPDUnitMethodMacro] of TXPTemplateMethodMap;
  75.     FVariables: array[TXPDUnitValueMacro] of TXPTemplateVariableMap;
  76.     FMacros: IXPDUnitMacros;
  77.     FParser: IXPTemplateParser;
  78.     FValues: array[TXPDUnitParameter] of string;
  79.     FPersistedValues: TIniFile;
  80.     FEvaluated: boolean;
  81.    protected
  82.     function Identifiers(const Parameter: TXPDUnitParameter): string;
  83.     function Descriptions(const Parameter: TXPDUnitParameter): string;
  84.     function Templates(const Parameter: TXPDUnitParameter): string;
  85.     procedure ClearValues;
  86.     function EvaluateValues(const TestedClassName: string = '';
  87.       const TestedMethodName: string = ''): boolean;
  88.     function GetValue(const Parameter: TXPDUnitParameter): string;
  89.     procedure SetValue(const Parameter: TXPDUnitParameter;
  90.       const Value: string);
  91.     function TestMethodName(const TestedMethodName: string): string;
  92.     function TestClassName(const TestedClassName: string): string;
  93.   public
  94.     constructor Create;
  95.     destructor Destroy; override;
  96.   end;
  97. ///////////////////////////////////////////////////////////////////////////////
  98. // Unit entry point
  99. ///////////////////////////////////////////////////////////////////////////////
  100. function CreateXPDUnitParameters: IXPDUnitParameters;
  101. begin
  102.   Result := TParameters.Create;
  103. end;
  104. ///////////////////////////////////////////////////////////////////////////////
  105. //  Interface implementation
  106. ///////////////////////////////////////////////////////////////////////////////
  107. constructor TParameters.Create;
  108. var
  109.   idx: TXPDUnitMacro;
  110. begin
  111.   inherited;
  112.   FMacros := XPDUnitMacros.CreateXPDUnitMacros;
  113.   FParser := XPTemplateParser.CreateXPTemplateParser;
  114.   FPersistedValues := TIniFile.Create(XPDUnitSetupFile);
  115.   // We don't assign FVariables[idx].Value as this is dynamic and must be done
  116.   // for each call on EvaluateValues()
  117.   for idx := System.Low(TXPDUnitValueMacro)
  118.     to System.High(TXPDUnitValueMacro) do
  119.     FVariables[idx].Name := FMacros.Identifiers(idx);
  120.   for idx := System.Low(TXPDUnitMethodMacro)
  121.     to System.High(TXPDUnitMethodMacro) do
  122.   begin
  123.     FMethods[idx].Name := FMacros.Identifiers(idx);
  124.     FMethods[idx].Value := FMacros.Methods(idx);
  125.   end;
  126.   FParser.SetMethods(FMethods);
  127. end;
  128. destructor TParameters.Destroy;
  129. begin
  130.   FPersistedValues.Free;
  131.   inherited;
  132. end;
  133. function TParameters.Identifiers(
  134.   const Parameter: TXPDUnitParameter): string;
  135. begin
  136.   Result := ParameterIdentifiers[Parameter];
  137. end;
  138. function TParameters.Templates(const Parameter: TXPDUnitParameter): string;
  139. begin
  140.   if Parameter >= System.Low(TXPDUnitVarParameter) then
  141.     Result := FPersistedValues.ReadString('Templates', Identifiers(Parameter),
  142.       TemplateDefaults[Parameter])
  143.   else
  144.     Result := TemplateDefaults[Parameter];
  145. end;
  146. function TParameters.Descriptions(const Parameter: TXPDUnitParameter): string;
  147. begin
  148.   Result := ParameterDescriptions[Parameter];
  149. end;
  150. function TParameters.GetValue(const Parameter: TXPDUnitParameter): string;
  151. begin
  152.   if not FEvaluated then
  153.     EvaluateValues;
  154.     
  155.   Result := FValues[Parameter];
  156. end;
  157. procedure TParameters.SetValue(const Parameter: TXPDUnitParameter;
  158.   const Value: string);
  159. begin
  160.   FValues[Parameter] := Value;
  161. end;
  162. function TParameters.EvaluateValues(const TestedClassName: string;
  163.   const TestedMethodName: string): boolean;
  164. var
  165.   idx: TXPDUnitMacro;
  166.   jdx: TXPDUnitParameter;
  167.   ErrorIndex: integer;
  168.   ErrorString: string;
  169. begin
  170.   Result := true;
  171.   FEvaluated := true;
  172.   // Recalculate variable values for each invocation
  173.   FMacros.SetContextValue(dmTestedClassName, TestedClassName);
  174.   FMacros.SetContextValue(dmTestedMethodName, TestedMethodName);
  175.   for idx := System.Low(TXPDUnitValueMacro)
  176.     to System.High(TXPDUnitValueMacro) do
  177.     FVariables[idx].Value := FMacros.Values(idx);
  178.   // Finish parser setup
  179.   FParser.SetVariables(FVariables);
  180.   for jdx := System.Low(TXPDUnitParameter) to System.High(TXPDUnitParameter) do
  181.   begin
  182.     // Parse parameter templates using current evaluated values of macros. Skip
  183.     // parameters that have already been allocated values. *Always* evaluate
  184.     // method and class names.
  185.     if ((jdx in [dpClassName, dpMethodName]) or (System.Length(FValues[jdx]) = 0)
  186.         or (System.Pos(XPDUnitMacroPrefix, FValues[jdx]) > 0))
  187.       and not FParser.Parse(Templates(jdx), FValues[jdx]) then
  188.     begin
  189.       Result := false;
  190.       FParser.GetErrorIndex(ErrorIndex);
  191.       ErrorString := Templates(jdx);
  192.       System.Insert('#', ErrorString, ErrorIndex);
  193.       // Add message to IDE's MessageView
  194.       XP_OTAUtils.MessageViewAddFmt(
  195.         '[DUnitWizard] Syntax error in parameter template. Name: %s, Value: <%s>, (Error preceded by #)',
  196.         [Identifiers(jdx), ErrorString, ErrorIndex]);
  197.       // Leave parameter unevaluated with error tag suffix.
  198.       FValues[jdx] := SysUtils.Format('%s%s:ParameterSyntaxError!',
  199.         [XPDUnitParameterPrefix, Identifiers(jdx)]);
  200.     end;
  201.   end;
  202. end;
  203. function TParameters.TestMethodName(const TestedMethodName: string): string;
  204. begin
  205.   Result := SysUtils.StringReplace(FValues[dpMethodName],
  206.     FMacros.Text(dmTestedMethodName), TestedMethodName,
  207.     [rfReplaceAll, rfIgnoreCase]);
  208. end;
  209. function TParameters.TestClassName(const TestedClassName: string): string;
  210. begin
  211.   Result := SysUtils.StringReplace(FValues[dpClassName],
  212.     FMacros.Text(dmTestedClassName), TestedClassName,
  213.     [rfReplaceAll, rfIgnoreCase]);
  214. end;
  215. procedure TParameters.ClearValues;
  216. var
  217.   idx: TXPDUnitParameter;
  218. begin
  219.   for idx := System.Low(TXPDUnitParameter) to System.High(TXPDUnitParameter) do
  220.     FValues[idx] := '';
  221. end;
  222. end.