tcprocfunc.pas 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539
  1. unit tcprocfunc;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, typinfo, fpcunit, pastree, pscanner, pparser, tcbaseparser,testregistry;
  6. type
  7. { TTestProcedureFunction }
  8. TTestProcedureFunction= class(TTestParser)
  9. private
  10. FAddComment: Boolean;
  11. FFunc: TPasFunction;
  12. FHint: String;
  13. FProc: TPasProcedure;
  14. FOperator:TPasOperator;
  15. procedure AddDeclaration(const ASource: string; const AHint: String='');
  16. procedure AssertArg(ProcType: TPasProcedureType; AIndex: Integer;
  17. AName: String; AAccess: TArgumentAccess; const TypeName: String;
  18. AValue: String='');
  19. procedure AssertArrayArg(ProcType: TPasProcedureType; AIndex: Integer;
  20. AName: String; AAccess: TArgumentAccess; const ElementTypeName: String);
  21. procedure AssertFunc(const Mods: TProcedureModifiers; const TypeMods: TProcTypeModifiers; CC: TCallingConvention; ArgCount: Integer; P: TPasFunction=nil);
  22. procedure AssertProc(const Mods: TProcedureModifiers; const TypeMods: TProcTypeModifiers; CC: TCallingConvention; ArgCount: Integer; P: TPasProcedure=nil);
  23. function BaseAssertArg(ProcType: TPasProcedureType; AIndex: Integer;
  24. AName: String; AAccess: TArgumentAccess; AValue: String=''): TPasArgument;
  25. procedure CreateForwardTest;
  26. function GetFT: TPasFunctionType;
  27. function GetPT: TPasProcedureType;
  28. Procedure ParseProcedure;
  29. function ParseProcedure(const ASource: string; const AHint: String=''): TPasProcedure;
  30. Procedure ParseFunction;
  31. function ParseFunction(const ASource : String; AResult: string = ''; const AHint: String=''; CC : TCallingConvention = ccDefault): TPasProcedure;
  32. Procedure ParseOperator;
  33. protected
  34. procedure SetUp; override;
  35. procedure TearDown; override;
  36. Procedure AssertComment;
  37. Property AddComment : Boolean Read FAddComment Write FAddComment;
  38. Property Hint : String Read FHint Write FHint;
  39. Property Proc : TPasProcedure Read FProc;
  40. Property ProcType : TPasProcedureType Read GetPT;
  41. Property Func : TPasFunction Read FFunc;
  42. Property FuncType : TPasFunctionType Read GetFT;
  43. published
  44. procedure TestEmptyProcedure;
  45. procedure TestEmptyProcedureComment;
  46. Procedure TestEmptyFunction;
  47. Procedure TestEmptyFunctionComment;
  48. procedure TestEmptyProcedureDeprecated;
  49. Procedure TestEmptyFunctionDeprecated;
  50. procedure TestEmptyProcedurePlatform;
  51. Procedure TestEmptyFunctionPlatform;
  52. procedure TestEmptyProcedureExperimental;
  53. Procedure TestEmptyFunctionExperimental;
  54. procedure TestEmptyProcedureUnimplemented;
  55. Procedure TestEmptyFunctionUnimplemented;
  56. procedure TestProcedureOneArg;
  57. Procedure TestFunctionOneArg;
  58. procedure TestProcedureOneVarArg;
  59. Procedure TestFunctionOneVarArg;
  60. procedure TestProcedureOneConstArg;
  61. Procedure TestFunctionOneConstArg;
  62. procedure TestProcedureOneOutArg;
  63. Procedure TestFunctionOneOutArg;
  64. procedure TestProcedureOneConstRefArg;
  65. Procedure TestFunctionOneConstRefArg;
  66. procedure TestFunctionOneConstRefAttributeArg;
  67. procedure TestFunctionOneConstRefAttributeArgReversed;
  68. procedure TestProcedureTwoArgs;
  69. Procedure TestFunctionTwoArgs;
  70. procedure TestProcedureTwoArgsSeparate;
  71. Procedure TestFunctionTwoArgsSeparate;
  72. procedure TestProcedureOneArgDefault;
  73. Procedure TestFunctionOneArgDefault;
  74. procedure TestProcedureOneArgDefaultSet;
  75. Procedure TestFunctionOneArgDefaultSet;
  76. procedure TestProcedureOneArgDefaultExpr;
  77. Procedure TestFunctionOneArgDefaultExpr;
  78. procedure TestProcedureTwoArgsDefault;
  79. Procedure TestFunctionTwoArgsDefault;
  80. procedure TestFunctionOneArgEnumeratedExplicit;
  81. procedure TestProcedureOneUntypedVarArg;
  82. Procedure TestFunctionOneUntypedVarArg;
  83. procedure TestProcedureTwoUntypedVarArgs;
  84. Procedure TestFunctionTwoUntypedVarArgs;
  85. procedure TestProcedureOneUntypedConstArg;
  86. Procedure TestFunctionOneUntypedConstArg;
  87. procedure TestProcedureTwoUntypedConstArgs;
  88. Procedure TestFunctionTwoUntypedConstArgs;
  89. procedure TestProcedureOpenArrayArg;
  90. Procedure TestFunctionOpenArrayArg;
  91. procedure TestProcedureTwoOpenArrayArgs;
  92. Procedure TestFunctionTwoOpenArrayArgs;
  93. procedure TestProcedureConstOpenArrayArg;
  94. Procedure TestFunctionConstOpenArrayArg;
  95. procedure TestProcedureVarOpenArrayArg;
  96. Procedure TestFunctionVarOpenArrayArg;
  97. procedure TestProcedureArrayOfConstArg;
  98. Procedure TestFunctionArrayOfConstArg;
  99. procedure TestProcedureConstArrayOfConstArg;
  100. Procedure TestFunctionConstArrayOfConstArg;
  101. Procedure TestProcedureArgFile;
  102. Procedure TestProcedureCdecl;
  103. Procedure TestFunctionCdecl;
  104. Procedure TestProcedureCdeclDeprecated;
  105. Procedure TestFunctionCdeclDeprecated;
  106. Procedure TestProcedureSafeCall;
  107. Procedure TestFunctionSafeCall;
  108. //ccDefault,ccRegister,ccPascal,ccCDecl,ccStdCall,ccOldFPCCall,ccSafeCall);
  109. Procedure TestProcedurePascal;
  110. Procedure TestFunctionPascal;
  111. Procedure TestProcedureStdCall;
  112. Procedure TestFunctionStdCall;
  113. Procedure TestProcedureOldFPCCall;
  114. Procedure TestFunctionOldFPCCall;
  115. procedure TestCallingConventionHardFloat;
  116. procedure TestCallingConventionMS_ABI_CDecl;
  117. procedure TestCallingConventionMS_ABI_Default;
  118. procedure TestCallingConventionMWPascal;
  119. procedure TestCallingConventionSysV_ABI_CDec;
  120. procedure TestCallingConventionSysV_ABI_Default;
  121. procedure TestCallingConventionVectorCall;
  122. procedure TestCallingConventionSysCall;
  123. procedure TestCallingConventionSysCallExecbase;
  124. procedure TestCallingConventionSysCallUtilitybase;
  125. procedure TestCallingConventionSysCallConsoleDevice;
  126. Procedure TestProcedurePublic;
  127. Procedure TestProcedurePublicIdent;
  128. Procedure TestFunctionPublic;
  129. Procedure TestProcedureCdeclPublic;
  130. Procedure TestFunctionCdeclPublic;
  131. Procedure TestProcedureOverload;
  132. Procedure TestFunctionOverload;
  133. Procedure TestProcedureVarargs;
  134. Procedure TestFunctionVarArgs;
  135. Procedure TestProcedureCDeclVarargs;
  136. Procedure TestFunctionCDeclVarArgs;
  137. procedure TestFunctionDiscardResult;
  138. Procedure TestProcedureForwardInterface;
  139. Procedure TestFunctionForwardInterface;
  140. Procedure TestProcedureForward;
  141. Procedure TestFunctionForward;
  142. Procedure TestProcedureFar;
  143. Procedure TestFunctionFar;
  144. Procedure TestProcedureCdeclForward;
  145. Procedure TestFunctionCDeclForward;
  146. Procedure TestProcedureCompilerProc;
  147. Procedure TestProcedureNoReturn;
  148. Procedure TestFunctionCompilerProc;
  149. Procedure TestProcedureCDeclCompilerProc;
  150. Procedure TestFunctionCDeclCompilerProc;
  151. Procedure TestProcedureAssembler;
  152. Procedure TestFunctionAssembler;
  153. Procedure TestProcedureCDeclAssembler;
  154. Procedure TestFunctionCDeclAssembler;
  155. Procedure TestProcedureExport;
  156. Procedure TestFunctionExport;
  157. Procedure TestProcedureCDeclExport;
  158. Procedure TestFunctionCDeclExport;
  159. Procedure TestProcedureExternal;
  160. Procedure TestFunctionExternal;
  161. Procedure TestFunctionForwardNoReturnDelphi;
  162. procedure TestFunctionForwardNoReturnNoDelphi;
  163. Procedure TestProcedureExternalLibName;
  164. Procedure TestFunctionExternalLibName;
  165. Procedure TestProcedureExternalLibNameName;
  166. Procedure TestFunctionExternalLibNameName;
  167. Procedure TestProcedureExternalName;
  168. Procedure TestFunctionExternalName;
  169. Procedure TestProcedureCdeclExternal;
  170. Procedure TestProcedureAlias;
  171. Procedure TestFunctionCdeclExternal;
  172. Procedure TestProcedureCdeclExternalLibName;
  173. Procedure TestFunctionCdeclExternalLibName;
  174. Procedure TestProcedureCdeclExternalLibNameName;
  175. Procedure TestFunctionCdeclExternalLibNameName;
  176. Procedure TestProcedureCdeclExternalName;
  177. Procedure TestFunctionCdeclExternalName;
  178. Procedure TestFunctionAlias;
  179. Procedure TestOperatorNamedResult;
  180. Procedure TestOperatorTokens;
  181. procedure TestOperatorNames;
  182. Procedure TestAssignOperatorAfterObject;
  183. Procedure TestFunctionNoResult;
  184. Procedure TestFunctionSyscallSingleNumber;
  185. Procedure TestFunctionSyscallDoubleNumber;
  186. Procedure TestFunctionSysCallSysTrapIdentifier;
  187. end;
  188. implementation
  189. procedure TTestProcedureFunction.AddDeclaration(const ASource: string;
  190. const AHint: String);
  191. Var
  192. D : String;
  193. begin
  194. Hint:=AHint;
  195. D:=ASource;
  196. If Hint<>'' then
  197. D:=D+' '+Hint;
  198. if (D[Length(D)]<>';') then
  199. D:=D+';';
  200. Add(D);
  201. end;
  202. function TTestProcedureFunction.GetPT: TPasProcedureType;
  203. begin
  204. AssertNotNull('have procedure to get type from',Proc);
  205. Result:=Proc.ProcType;
  206. end;
  207. function TTestProcedureFunction.ParseProcedure(const ASource: string;
  208. const AHint: String): TPasProcedure;
  209. begin
  210. If AddComment then
  211. begin
  212. Add('// A comment');
  213. Engine.NeedComments:=True;
  214. end;
  215. AddDeclaration('procedure A '+ASource,AHint);
  216. Self.ParseProcedure;
  217. Result:=Fproc;
  218. If AddComment then
  219. AssertComment;
  220. end;
  221. procedure TTestProcedureFunction.ParseProcedure;
  222. begin
  223. // Writeln(source.text);
  224. ParseDeclarations;
  225. AssertEquals('One variable definition',1,Declarations.Functions.Count);
  226. AssertEquals('First declaration is procedure declaration.',TPasProcedure,TObject(Declarations.Functions[0]).ClassType);
  227. FProc:=TPasProcedure(Declarations.Functions[0]);
  228. Definition:=FProc;
  229. AssertEquals('First declaration has correct name.','A',FProc.Name);
  230. if (Hint<>'') then
  231. CheckHint(TPasMemberHint(Getenumvalue(typeinfo(TPasMemberHint),'h'+Hint)));
  232. end;
  233. function TTestProcedureFunction.ParseFunction(const ASource : String;AResult: string = ''; const AHint: String = ''; CC : TCallingConvention = ccDefault): TPasProcedure;
  234. Var
  235. D :String;
  236. aType : TPasType;
  237. begin
  238. if (AResult='') then
  239. AResult:='Integer';
  240. D:='Function A '+ASource+' : '+AResult;
  241. If (cc<>ccDefault) then
  242. D:=D+'; '+cCallingConventions[cc]+';';
  243. AddDeclaration(D,AHint);
  244. Self.ParseFunction;
  245. Result:=FFunc;
  246. AssertNotNull('Have function result element',FuncType.ResultEl);
  247. aType:=FuncType.ResultEl.ResultType;
  248. AssertNotNull('Have function result type element',aType);
  249. if aResult[1]='^' then
  250. begin
  251. Delete(aResult,1,1);
  252. AssertEquals('Result is pointer type',TPasPointerType,aType.ClassType);
  253. aType:=TPasPointerType(aType).DestType;
  254. AssertNotNull('Result pointer type has destination type',aType);
  255. end;
  256. AssertEquals('Correct function result type name',AResult,aType.Name);
  257. end;
  258. procedure TTestProcedureFunction.ParseOperator;
  259. begin
  260. // Writeln(source.text);
  261. ParseDeclarations;
  262. AssertEquals('One operator definition',1,Declarations.Functions.Count);
  263. AssertEquals('First declaration is function declaration.',TPasOperator,TObject(Declarations.Functions[0]).ClassType);
  264. FOperator:=TPasOperator(Declarations.Functions[0]);
  265. Definition:=FOperator;
  266. if (Hint<>'') then
  267. CheckHint(TPasMemberHint(Getenumvalue(typeinfo(TPasMemberHint),'h'+Hint)));
  268. end;
  269. procedure TTestProcedureFunction.ParseFunction;
  270. begin
  271. // Writeln(source.text);
  272. ParseDeclarations;
  273. AssertEquals('One variable definition',1,Declarations.Functions.Count);
  274. AssertEquals('First declaration is function declaration.',TPasFunction,TObject(Declarations.Functions[0]).ClassType);
  275. FFunc:=TPasFunction(Declarations.Functions[0]);
  276. Definition:=FFunc;
  277. AssertEquals('First declaration has correct name.','A',FFunc.Name);
  278. if (Hint<>'') then
  279. CheckHint(TPasMemberHint(Getenumvalue(typeinfo(TPasMemberHint),'h'+Hint)));
  280. end;
  281. procedure TTestProcedureFunction.AssertProc(const Mods: TProcedureModifiers;
  282. const TypeMods: TProcTypeModifiers; CC: TCallingConvention; ArgCount: Integer;
  283. P: TPasProcedure);
  284. begin
  285. If P=Nil then
  286. P:=Proc;
  287. AssertNotNull('No proc to assert',P);
  288. AssertEquals('Procedure modifiers',Mods,P.Modifiers);
  289. AssertEquals('Procedure type modifiers',TypeMods,P.ProcType.Modifiers);
  290. AssertEquals('Procedue calling convention',CC,P.CallingConvention);
  291. AssertEquals('No message name','',p.MessageName);
  292. AssertEquals('No message type',pmtNone,P.MessageType);
  293. AssertNotNull('Have procedure type to assert',P.ProcType);
  294. AssertEquals('Correct number of arguments',ArgCount,P.ProcType.Args.Count);
  295. AssertEquals('Not of object',False,P.ProcType.IsOfObject);
  296. AssertEquals('Not is nested',False,P.ProcType.IsNested);
  297. end;
  298. procedure TTestProcedureFunction.AssertFunc(const Mods: TProcedureModifiers;
  299. const TypeMods: TProcTypeModifiers; CC: TCallingConvention; ArgCount: Integer;
  300. P: TPasFunction);
  301. begin
  302. If P=Nil then
  303. P:=Func;
  304. AssertNotNull('No func to assert',P);
  305. AssertEquals('Procedure modifiers',Mods,P.Modifiers);
  306. AssertEquals('Procedure type modifiers',TypeMods,P.ProcType.Modifiers);
  307. AssertEquals('Procedue calling convention',CC,P.CallingConvention);
  308. AssertEquals('No message name','',p.MessageName);
  309. AssertEquals('No message type',pmtNone,P.MessageType);
  310. AssertNotNull('Have procedure type to assert',P.ProcType);
  311. AssertEquals('Correct number of arguments',ArgCount,P.ProcType.Args.Count);
  312. AssertEquals('Not of object',False,P.ProcType.IsOfObject);
  313. AssertEquals('Not is nested',False,P.ProcType.IsNested);
  314. end;
  315. function TTestProcedureFunction.BaseAssertArg(ProcType: TPasProcedureType;
  316. AIndex: Integer; AName: String; AAccess: TArgumentAccess; AValue: String
  317. ): TPasArgument;
  318. Var
  319. A : TPasArgument;
  320. N : String;
  321. begin
  322. AssertNotNull('Have proctype to test argument',ProcType);
  323. if AIndex>=Proctype.Args.Count then
  324. Fail(Format('Cannot test argument: index %d is larger than the number of arguments (%d).',[AIndex,Proctype.Args.Count]));
  325. AssertNotNull('Have argument at position '+IntToStr(AIndex),Proctype.Args[AIndex]);
  326. AssertEquals('Have argument type at position '+IntToStr(AIndex),TPasArgument,TObject(Proctype.Args[AIndex]).ClassType);
  327. N:='Argument '+IntToStr(AIndex+1)+' : ';
  328. A:=TPasArgument(Proctype.Args[AIndex]);
  329. AssertEquals(N+'Argument name',AName,A.Name);
  330. AssertEquals(N+'Argument access',AAccess,A.Access);
  331. if (AValue='') then
  332. AssertNull(N+' no default value',A.ValueExpr)
  333. else
  334. begin
  335. AssertNotNull(N+' Have default value',A.ValueExpr);
  336. AssertEquals(N+' Default value',AValue,A.Value);
  337. end;
  338. Result:=A;
  339. end;
  340. procedure TTestProcedureFunction.AssertArg(ProcType: TPasProcedureType;
  341. AIndex: Integer; AName: String; AAccess: TArgumentAccess;
  342. const TypeName: String; AValue: String);
  343. Var
  344. A : TPasArgument;
  345. T : TPasType;
  346. N : String;
  347. begin
  348. A:=BaseAssertArg(ProcType,AIndex,ANAme,AAccess,AValue);
  349. N:='Argument '+IntToStr(AIndex+1)+' : ';
  350. if (TypeName='') then
  351. AssertNull(N+' No argument type',A.ArgType)
  352. else if TypeName[1]<>'^' then
  353. begin
  354. AssertNotNull(N+' Have argument type',A.ArgType);
  355. AssertEquals(N+' Correct argument type name',TypeName,A.ArgType.Name);
  356. end
  357. else
  358. begin
  359. AssertNotNull(N+' Have argument type',A.ArgType);
  360. T:=A.ArgType;
  361. AssertEquals(N+' type Is pointer type',TPasPointerType,T.CLassType);
  362. T:=TPasPointerType(T).DestType;
  363. AssertNotNull(N+'Have dest type',T);
  364. AssertEquals(N+' Correct argument dest type name',Copy(TypeName,2,MaxInt),T.Name);
  365. end;
  366. end;
  367. procedure TTestProcedureFunction.AssertArrayArg(ProcType: TPasProcedureType;
  368. AIndex: Integer; AName: String; AAccess: TArgumentAccess;
  369. const ElementTypeName: String);
  370. Var
  371. A : TPasArgument;
  372. AT : TPasArrayType;
  373. N : String;
  374. begin
  375. A:=BaseAssertArg(ProcType,AIndex,ANAme,AAccess,'');
  376. N:='Argument '+IntToStr(AIndex+1)+' : ';
  377. AssertNotNull(N+' Have argument type',A.ArgType);
  378. AssertEquals(N+' is arrayType',TPasArrayType,A.ArgType.ClassType);
  379. AT:=TPasArrayType(A.ArgType);
  380. if (ElementTypeName='') then
  381. AssertNull(N+' No array element type',AT.ElType)
  382. else
  383. begin
  384. AssertNotNull(N+' Have array element type',AT.ElType);
  385. AssertEquals(N+' Correct array element type name',ElementTypeName,AT.ElType.Name);
  386. end;
  387. end;
  388. function TTestProcedureFunction.GetFT: TPasFunctionType;
  389. begin
  390. AssertNotNull('have function to get type from',Func);
  391. AssertEquals('Function type is correct type',TPasFunctionType,Func.ProcType.ClassType);
  392. Result:=Func.FuncType;
  393. end;
  394. //TProcedureMessageType
  395. procedure TTestProcedureFunction.TestEmptyProcedure;
  396. begin
  397. ParseProcedure('');
  398. AssertProc([],[],ccDefault,0);
  399. end;
  400. procedure TTestProcedureFunction.TestEmptyProcedureComment;
  401. begin
  402. AddComment:=True;
  403. TestEmptyProcedure;
  404. end;
  405. procedure TTestProcedureFunction.TestEmptyFunction;
  406. begin
  407. ParseFunction('');
  408. AssertFunc([],[],ccDefault,0);
  409. end;
  410. procedure TTestProcedureFunction.TestEmptyFunctionComment;
  411. begin
  412. AddComment:=True;
  413. TestEmptyProcedure;
  414. end;
  415. procedure TTestProcedureFunction.TestEmptyProcedureDeprecated;
  416. begin
  417. ParseProcedure('','deprecated');
  418. AssertProc([],[],ccDefault,0);
  419. end;
  420. procedure TTestProcedureFunction.TestEmptyFunctionDeprecated;
  421. begin
  422. ParseFunction('','deprecated');
  423. AssertFunc([],[],ccDefault,0);
  424. end;
  425. procedure TTestProcedureFunction.TestEmptyProcedurePlatform;
  426. begin
  427. ParseProcedure('','platform');
  428. AssertProc([],[],ccDefault,0);
  429. end;
  430. procedure TTestProcedureFunction.TestEmptyFunctionPlatform;
  431. begin
  432. ParseFunction('','platform');
  433. AssertFunc([],[],ccDefault,0);
  434. end;
  435. procedure TTestProcedureFunction.TestEmptyProcedureExperimental;
  436. begin
  437. ParseProcedure('','experimental');
  438. AssertProc([],[],ccDefault,0);
  439. end;
  440. procedure TTestProcedureFunction.TestEmptyFunctionExperimental;
  441. begin
  442. ParseFunction('','experimental');
  443. AssertFunc([],[],ccDefault,0);
  444. end;
  445. procedure TTestProcedureFunction.TestEmptyProcedureUnimplemented;
  446. begin
  447. ParseProcedure('','unimplemented');
  448. AssertProc([],[],ccDefault,0);
  449. end;
  450. procedure TTestProcedureFunction.TestEmptyFunctionUnimplemented;
  451. begin
  452. ParseFunction('','unimplemented');
  453. AssertFunc([],[],ccDefault,0);
  454. end;
  455. procedure TTestProcedureFunction.TestProcedureOneArg;
  456. begin
  457. ParseProcedure('(B : Integer)');
  458. AssertProc([],[],ccDefault,1);
  459. AssertArg(ProcType,0,'B',argDefault,'Integer','');
  460. end;
  461. procedure TTestProcedureFunction.TestFunctionOneArg;
  462. begin
  463. ParseFunction('(B : Integer)');
  464. AssertFunc([],[],ccDefault,1);
  465. AssertArg(FuncType,0,'B',argDefault,'Integer','');
  466. end;
  467. procedure TTestProcedureFunction.TestProcedureOneVarArg;
  468. begin
  469. ParseProcedure('(Var B : Integer)');
  470. AssertProc([],[],ccDefault,1);
  471. AssertArg(ProcType,0,'B',argVar,'Integer','');
  472. end;
  473. procedure TTestProcedureFunction.TestFunctionOneVarArg;
  474. begin
  475. ParseFunction('(Var B : Integer)');
  476. AssertFunc([],[],ccDefault,1);
  477. AssertArg(FuncType,0,'B',argVar,'Integer','');
  478. end;
  479. procedure TTestProcedureFunction.TestProcedureOneConstArg;
  480. begin
  481. ParseProcedure('(Const B : Integer)');
  482. AssertProc([],[],ccDefault,1);
  483. AssertArg(ProcType,0,'B',argConst,'Integer','');
  484. end;
  485. procedure TTestProcedureFunction.TestFunctionOneConstArg;
  486. begin
  487. ParseFunction('(Const B : Integer)');
  488. AssertFunc([],[],ccDefault,1);
  489. AssertArg(FuncType,0,'B',argConst,'Integer','');
  490. end;
  491. procedure TTestProcedureFunction.TestFunctionOneConstRefAttributeArg;
  492. begin
  493. Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msPrefixedAttributes];
  494. ParseFunction('([ref] Const B : Integer)');
  495. AssertFunc([],[],ccDefault,1);
  496. AssertArg(FuncType,0,'B',argConstRef,'Integer','');
  497. end;
  498. procedure TTestProcedureFunction.TestFunctionOneConstRefAttributeArgReversed;
  499. begin
  500. Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msPrefixedAttributes];
  501. ParseFunction('(Const [ref] B : Integer)');
  502. AssertFunc([],[],ccDefault,1);
  503. AssertArg(FuncType,0,'B',argConstRef,'Integer','');
  504. end;
  505. procedure TTestProcedureFunction.TestProcedureOneOutArg;
  506. begin
  507. Parser.CurrentModeswitches:=[msObjfpc];
  508. ParseProcedure('(Out B : Integer)');
  509. AssertProc([],[],ccDefault,1);
  510. AssertArg(ProcType,0,'B',argOut,'Integer','');
  511. end;
  512. procedure TTestProcedureFunction.TestFunctionOneOutArg;
  513. begin
  514. Parser.CurrentModeswitches:=[msObjfpc];
  515. ParseFunction('(Out B : Integer)');
  516. AssertFunc([],[],ccDefault,1);
  517. AssertArg(FuncType,0,'B',argOut,'Integer','');
  518. end;
  519. procedure TTestProcedureFunction.TestProcedureOneConstRefArg;
  520. begin
  521. ParseProcedure('(Constref B : Integer)');
  522. AssertProc([],[],ccDefault,1);
  523. AssertArg(ProcType,0,'B',argConstRef,'Integer','');
  524. end;
  525. procedure TTestProcedureFunction.TestFunctionOneConstRefArg;
  526. begin
  527. ParseFunction('(ConstRef B : Integer)');
  528. AssertFunc([],[],ccDefault,1);
  529. AssertArg(FuncType,0,'B',argConstref,'Integer','');
  530. end;
  531. procedure TTestProcedureFunction.TestProcedureTwoArgs;
  532. begin
  533. ParseProcedure('(B,C : Integer)');
  534. AssertProc([],[],ccDefault,2);
  535. AssertArg(ProcType,0,'B',argDefault,'Integer','');
  536. AssertArg(ProcType,1,'C',argDefault,'Integer','');
  537. end;
  538. procedure TTestProcedureFunction.TestFunctionTwoArgs;
  539. begin
  540. ParseFunction('(B,C : Integer)');
  541. AssertFunc([],[],ccDefault,2);
  542. AssertArg(FuncType,0,'B',argDefault,'Integer','');
  543. AssertArg(FuncType,1,'C',argDefault,'Integer','');
  544. end;
  545. procedure TTestProcedureFunction.TestProcedureTwoArgsSeparate;
  546. begin
  547. ParseProcedure('(B : Integer; C : Integer)');
  548. AssertProc([],[],ccDefault,2);
  549. AssertArg(ProcType,0,'B',argDefault,'Integer','');
  550. AssertArg(ProcType,1,'C',argDefault,'Integer','');
  551. end;
  552. procedure TTestProcedureFunction.TestFunctionTwoArgsSeparate;
  553. begin
  554. ParseFunction('(B : Integer;C : Integer)');
  555. AssertFunc([],[],ccDefault,2);
  556. AssertArg(FuncType,0,'B',argDefault,'Integer','');
  557. AssertArg(FuncType,1,'C',argDefault,'Integer','');
  558. end;
  559. procedure TTestProcedureFunction.TestProcedureOneArgDefault;
  560. begin
  561. ParseProcedure('(B : Integer = 1)');
  562. AssertProc([],[],ccDefault,1);
  563. AssertArg(ProcType,0,'B',argDefault,'Integer','1');
  564. end;
  565. procedure TTestProcedureFunction.TestFunctionOneArgDefault;
  566. begin
  567. ParseFunction('(B : Integer = 1)');
  568. AssertFunc([],[],ccDefault,1);
  569. AssertArg(FuncType,0,'B',argDefault,'Integer','1');
  570. end;
  571. procedure TTestProcedureFunction.TestFunctionOneArgEnumeratedExplicit;
  572. begin
  573. ParseFunction('(B : TSomeEnum = TSomeEnum.False)');
  574. AssertFunc([],[],ccDefault,1);
  575. AssertArg(FuncType,0,'B',argDefault,'TSomeEnum','TSomeEnum.False');
  576. end;
  577. procedure TTestProcedureFunction.TestProcedureOneArgDefaultSet;
  578. begin
  579. ParseProcedure('(B : MySet = [1,2])');
  580. AssertProc([],[],ccDefault,1);
  581. AssertArg(ProcType,0,'B',argDefault,'MySet','[1, 2]');
  582. end;
  583. procedure TTestProcedureFunction.TestFunctionOneArgDefaultSet;
  584. begin
  585. ParseFunction('(B : MySet = [1,2])');
  586. AssertFunc([],[],ccDefault,1);
  587. AssertArg(FuncType,0,'B',argDefault,'MySet','[1, 2]');
  588. end;
  589. procedure TTestProcedureFunction.TestProcedureOneArgDefaultExpr;
  590. begin
  591. ParseProcedure('(B : Integer = 1 + 2)');
  592. AssertProc([],[],ccDefault,1);
  593. AssertArg(ProcType,0,'B',argDefault,'Integer','1 + 2');
  594. end;
  595. procedure TTestProcedureFunction.TestFunctionOneArgDefaultExpr;
  596. begin
  597. ParseFunction('(B : Integer = 1 + 2)');
  598. AssertFunc([],[],ccDefault,1);
  599. AssertArg(FuncType,0,'B',argDefault,'Integer','1 + 2');
  600. end;
  601. procedure TTestProcedureFunction.TestProcedureTwoArgsDefault;
  602. begin
  603. ParseProcedure('(B : Integer = 1; C : Integer = 2)');
  604. AssertProc([],[],ccDefault,2);
  605. AssertArg(ProcType,0,'B',argDefault,'Integer','1');
  606. AssertArg(ProcType,1,'C',argDefault,'Integer','2');
  607. end;
  608. procedure TTestProcedureFunction.TestFunctionTwoArgsDefault;
  609. begin
  610. ParseFunction('(B : Integer = 1; C : Integer = 2)');
  611. AssertFunc([],[],ccDefault,2);
  612. AssertArg(FuncType,0,'B',argDefault,'Integer','1');
  613. AssertArg(FuncType,1,'C',argDefault,'Integer','2');
  614. end;
  615. procedure TTestProcedureFunction.TestProcedureOneUntypedVarArg;
  616. begin
  617. ParseProcedure('(Var B)');
  618. AssertProc([],[],ccDefault,1);
  619. AssertArg(ProcType,0,'B',argVar,'','');
  620. end;
  621. procedure TTestProcedureFunction.TestFunctionOneUntypedVarArg;
  622. begin
  623. ParseFunction('(Var B)');
  624. AssertFunc([],[],ccDefault,1);
  625. AssertArg(FuncType,0,'B',argVar,'','');
  626. end;
  627. procedure TTestProcedureFunction.TestProcedureTwoUntypedVarArgs;
  628. begin
  629. ParseProcedure('(Var B; Var C)');
  630. AssertProc([],[],ccDefault,2);
  631. AssertArg(ProcType,0,'B',argVar,'','');
  632. AssertArg(ProcType,1,'C',argVar,'','');
  633. end;
  634. procedure TTestProcedureFunction.TestFunctionTwoUntypedVarArgs;
  635. begin
  636. ParseFunction('(Var B; Var C)');
  637. AssertFunc([],[],ccDefault,2);
  638. AssertArg(FuncType,0,'B',argVar,'','');
  639. AssertArg(FuncType,1,'C',argVar,'','');
  640. end;
  641. procedure TTestProcedureFunction.TestProcedureOneUntypedConstArg;
  642. begin
  643. ParseProcedure('(Const B)');
  644. AssertProc([],[],ccDefault,1);
  645. AssertArg(ProcType,0,'B',argConst,'','');
  646. end;
  647. procedure TTestProcedureFunction.TestFunctionOneUntypedConstArg;
  648. begin
  649. ParseFunction('(Const B)');
  650. AssertFunc([],[],ccDefault,1);
  651. AssertArg(FuncType,0,'B',argConst,'','');
  652. end;
  653. procedure TTestProcedureFunction.TestProcedureTwoUntypedConstArgs;
  654. begin
  655. ParseProcedure('(Const B; Const C)');
  656. AssertProc([],[],ccDefault,2);
  657. AssertArg(ProcType,0,'B',argConst,'','');
  658. AssertArg(ProcType,1,'C',argConst,'','');
  659. end;
  660. procedure TTestProcedureFunction.TestFunctionTwoUntypedConstArgs;
  661. begin
  662. ParseFunction('(Const B; Const C)');
  663. AssertFunc([],[],ccDefault,2);
  664. AssertArg(FuncType,0,'B',argConst,'','');
  665. AssertArg(FuncType,1,'C',argConst,'','');
  666. end;
  667. procedure TTestProcedureFunction.TestProcedureOpenArrayArg;
  668. begin
  669. ParseProcedure('(B : Array of Integer)');
  670. AssertProc([],[],ccDefault,1);
  671. AssertArrayArg(ProcType,0,'B',argDefault,'Integer');
  672. end;
  673. procedure TTestProcedureFunction.TestFunctionOpenArrayArg;
  674. begin
  675. ParseFunction('(B : Array of Integer)');
  676. AssertFunc([],[],ccDefault,1);
  677. AssertArrayArg(FuncType,0,'B',argDefault,'Integer');
  678. end;
  679. procedure TTestProcedureFunction.TestProcedureTwoOpenArrayArgs;
  680. begin
  681. ParseProcedure('(B : Array of Integer;C : Array of Integer)');
  682. AssertProc([],[],ccDefault,2);
  683. AssertArrayArg(ProcType,0,'B',argDefault,'Integer');
  684. AssertArrayArg(ProcType,1,'C',argDefault,'Integer');
  685. end;
  686. procedure TTestProcedureFunction.TestFunctionTwoOpenArrayArgs;
  687. begin
  688. ParseFunction('(B : Array of Integer;C : Array of Integer)');
  689. AssertFunc([],[],ccDefault,2);
  690. AssertArrayArg(FuncType,0,'B',argDefault,'Integer');
  691. AssertArrayArg(FuncType,1,'C',argDefault,'Integer');
  692. end;
  693. procedure TTestProcedureFunction.TestProcedureConstOpenArrayArg;
  694. begin
  695. ParseProcedure('(Const B : Array of Integer)');
  696. AssertProc([],[],ccDefault,1);
  697. AssertArrayArg(ProcType,0,'B',argConst,'Integer');
  698. end;
  699. procedure TTestProcedureFunction.TestFunctionConstOpenArrayArg;
  700. begin
  701. ParseFunction('(Const B : Array of Integer)');
  702. AssertFunc([],[],ccDefault,1);
  703. AssertArrayArg(FuncType,0,'B',argConst,'Integer');
  704. end;
  705. procedure TTestProcedureFunction.TestProcedureVarOpenArrayArg;
  706. begin
  707. ParseProcedure('(Var B : Array of Integer)');
  708. AssertProc([],[],ccDefault,1);
  709. AssertArrayArg(ProcType,0,'B',argVar,'Integer');
  710. end;
  711. procedure TTestProcedureFunction.TestFunctionVarOpenArrayArg;
  712. begin
  713. ParseFunction('(Var B : Array of Integer)');
  714. AssertFunc([],[],ccDefault,1);
  715. AssertArrayArg(FuncType,0,'B',argVar,'Integer');
  716. end;
  717. procedure TTestProcedureFunction.TestProcedureArrayOfConstArg;
  718. begin
  719. ParseProcedure('(B : Array of Const)');
  720. AssertProc([],[],ccDefault,1);
  721. AssertArrayArg(ProcType,0,'B',argDefault,'');
  722. end;
  723. procedure TTestProcedureFunction.TestFunctionArrayOfConstArg;
  724. begin
  725. ParseFunction('(B : Array of Const)');
  726. AssertFunc([],[],ccDefault,1);
  727. AssertArrayArg(FuncType,0,'B',argDefault,'');
  728. end;
  729. procedure TTestProcedureFunction.TestProcedureConstArrayOfConstArg;
  730. begin
  731. ParseProcedure('(Const B : Array of Const)');
  732. AssertProc([],[],ccDefault,1);
  733. AssertArrayArg(ProcType,0,'B',argConst,'');
  734. end;
  735. procedure TTestProcedureFunction.TestFunctionConstArrayOfConstArg;
  736. begin
  737. ParseFunction('(Const B : Array of Const)');
  738. AssertFunc([],[],ccDefault,1);
  739. AssertArrayArg(FuncType,0,'B',argConst,'');
  740. end;
  741. procedure TTestProcedureFunction.TestProcedureArgFile;
  742. begin
  743. ParseProcedure('(Const B : File)');
  744. AssertProc([],[],ccDefault,1);
  745. end;
  746. procedure TTestProcedureFunction.TestCallingConventionSysV_ABI_Default;
  747. begin
  748. ParseProcedure('; SysV_ABI_Default');
  749. AssertProc([],[],ccSysV_ABI_Default,0);
  750. end;
  751. procedure TTestProcedureFunction.TestCallingConventionSysV_ABI_CDec;
  752. begin
  753. ParseProcedure('; SysV_ABI_CDecl');
  754. AssertProc([],[],ccSysV_ABI_CDecl,0);
  755. end;
  756. procedure TTestProcedureFunction.TestCallingConventionMS_ABI_Default;
  757. begin
  758. ParseProcedure('; MS_ABI_Default');
  759. AssertProc([],[],ccMS_ABI_Default,0);
  760. end;
  761. procedure TTestProcedureFunction.TestCallingConventionMS_ABI_CDecl;
  762. begin
  763. ParseProcedure('; MS_ABI_CDecl');
  764. AssertProc([],[],ccMS_ABI_CDecl,0);
  765. end;
  766. procedure TTestProcedureFunction.TestCallingConventionVectorCall;
  767. begin
  768. ParseProcedure('; VectorCall');
  769. AssertProc([],[],ccVectorCall,0);
  770. end;
  771. procedure TTestProcedureFunction.TestCallingConventionSysCall;
  772. begin
  773. ParseProcedure('; syscall abc');
  774. AssertProc([],[],ccSysCall,0);
  775. end;
  776. procedure TTestProcedureFunction.TestCallingConventionSysCallExecbase;
  777. begin
  778. ParseProcedure('; syscall _execBase 123');
  779. AssertProc([pmExternal],[],ccSysCall,0);
  780. end;
  781. procedure TTestProcedureFunction.TestCallingConventionSysCallUtilitybase;
  782. begin
  783. ParseProcedure('; syscall _utilityBase 123');
  784. AssertProc([pmExternal],[],ccSysCall,0);
  785. end;
  786. procedure TTestProcedureFunction.TestCallingConventionSysCallConsoleDevice;
  787. begin
  788. ParseProcedure('; syscall ConsoleDevice 123');
  789. AssertProc([pmExternal],[],ccSysCall,0);
  790. end;
  791. procedure TTestProcedureFunction.TestFunctionDiscardResult;
  792. begin
  793. AddDeclaration('function A : Integer; discardresult');
  794. ParseFunction;
  795. AssertFunc([pmDiscardResult],[],ccDefault,0);
  796. end;
  797. procedure TTestProcedureFunction.TestCallingConventionHardFloat;
  798. begin
  799. ParseProcedure('; HardFloat');
  800. AssertProc([],[],ccHardFloat,0);
  801. end;
  802. procedure TTestProcedureFunction.TestCallingConventionMWPascal;
  803. begin
  804. ParseProcedure('; mwpascal');
  805. AssertProc([],[],ccMWPascal,0);
  806. end;
  807. procedure TTestProcedureFunction.TestProcedureCdecl;
  808. begin
  809. ParseProcedure('; cdecl');
  810. AssertProc([],[],ccCdecl,0);
  811. end;
  812. procedure TTestProcedureFunction.TestFunctionCdecl;
  813. begin
  814. ParseFunction('','','',ccCdecl);
  815. AssertFunc([],[],ccCdecl,0);
  816. end;
  817. procedure TTestProcedureFunction.TestProcedureCdeclDeprecated;
  818. begin
  819. ParseProcedure('; cdecl;','deprecated');
  820. AssertProc([],[],ccCdecl,0);
  821. end;
  822. procedure TTestProcedureFunction.TestFunctionCdeclDeprecated;
  823. begin
  824. ParseFunction('','','deprecated',ccCdecl);
  825. AssertFunc([],[],ccCdecl,0);
  826. end;
  827. procedure TTestProcedureFunction.TestProcedureSafeCall;
  828. begin
  829. ParseProcedure('; safecall;','');
  830. AssertProc([],[],ccSafeCall,0);
  831. end;
  832. procedure TTestProcedureFunction.TestFunctionSafeCall;
  833. begin
  834. ParseFunction('','','',ccSafecall);
  835. AssertFunc([],[],ccSafecall,0);
  836. end;
  837. procedure TTestProcedureFunction.TestProcedurePascal;
  838. begin
  839. ParseProcedure('; pascal;','');
  840. AssertProc([],[],ccPascal,0);
  841. end;
  842. procedure TTestProcedureFunction.TestFunctionPascal;
  843. begin
  844. ParseFunction('','','',ccPascal);
  845. AssertFunc([],[],ccPascal,0);
  846. end;
  847. procedure TTestProcedureFunction.TestProcedureStdCall;
  848. begin
  849. ParseProcedure('; stdcall;','');
  850. AssertProc([],[],ccstdcall,0);
  851. end;
  852. procedure TTestProcedureFunction.TestFunctionStdCall;
  853. begin
  854. ParseFunction('','','',ccStdCall);
  855. AssertFunc([],[],ccStdCall,0);
  856. end;
  857. procedure TTestProcedureFunction.TestProcedureOldFPCCall;
  858. begin
  859. ParseProcedure('; oldfpccall;','');
  860. AssertProc([],[],ccoldfpccall,0);
  861. end;
  862. procedure TTestProcedureFunction.TestFunctionOldFPCCall;
  863. begin
  864. ParseFunction('','','',ccOldFPCCall);
  865. AssertFunc([],[],ccOldFPCCall,0);
  866. end;
  867. procedure TTestProcedureFunction.TestProcedurePublic;
  868. begin
  869. ParseProcedure('; public name ''myfunc'';','');
  870. AssertProc([pmPublic],[],ccDefault,0);
  871. AssertExpression('Public name',Proc.PublicName,pekString,'''myfunc''');
  872. end;
  873. procedure TTestProcedureFunction.TestProcedurePublicIdent;
  874. begin
  875. ParseProcedure('; public name exportname;','');
  876. AssertProc([pmPublic],[],ccDefault,0);
  877. AssertExpression('Public name',Proc.PublicName,pekIdent,'exportname');
  878. end;
  879. procedure TTestProcedureFunction.TestFunctionPublic;
  880. begin
  881. AddDeclaration('function A : Integer; public name exportname');
  882. ParseFunction;
  883. AssertFunc([pmPublic],[],ccDefault,0);
  884. AssertExpression('Public name',Func.PublicName,pekIdent,'exportname');
  885. end;
  886. procedure TTestProcedureFunction.TestProcedureCdeclPublic;
  887. begin
  888. ParseProcedure('; cdecl; public name exportname;','');
  889. AssertProc([pmPublic],[],ccCDecl,0);
  890. AssertExpression('Public name',Proc.PublicName,pekIdent,'exportname');
  891. end;
  892. procedure TTestProcedureFunction.TestFunctionCdeclPublic;
  893. begin
  894. AddDeclaration('function A : Integer; cdecl; public name exportname');
  895. ParseFunction;
  896. AssertFunc([pmPublic],[],ccCDecl,0);
  897. AssertExpression('Public name',Func.PublicName,pekIdent,'exportname');
  898. end;
  899. procedure TTestProcedureFunction.TestProcedureOverload;
  900. begin
  901. ParseProcedure('; overload;','');
  902. AssertProc([pmOverload],[],ccDefault,0);
  903. end;
  904. procedure TTestProcedureFunction.TestFunctionOverload;
  905. begin
  906. AddDeclaration('function A : Integer; overload');
  907. ParseFunction;
  908. AssertFunc([pmOverload],[],ccDefault,0);
  909. end;
  910. procedure TTestProcedureFunction.TestProcedureVarargs;
  911. begin
  912. ParseProcedure('; varargs;','');
  913. AssertProc([],[ptmVarArgs],ccDefault,0);
  914. end;
  915. procedure TTestProcedureFunction.TestFunctionVarArgs;
  916. begin
  917. AddDeclaration('function A : Integer; varargs');
  918. ParseFunction;
  919. AssertFunc([],[ptmVarArgs],ccDefault,0);
  920. end;
  921. procedure TTestProcedureFunction.TestProcedureCDeclVarargs;
  922. begin
  923. ParseProcedure(';cdecl; varargs;','');
  924. AssertProc([],[ptmVarArgs],ccCDecl,0);
  925. end;
  926. procedure TTestProcedureFunction.TestFunctionCDeclVarArgs;
  927. begin
  928. AddDeclaration('function A : Integer; cdecl; varargs');
  929. ParseFunction;
  930. AssertFunc([],[ptmVarArgs],ccCdecl,0);
  931. end;
  932. procedure TTestProcedureFunction.TestProcedureForwardInterface;
  933. begin
  934. AddDeclaration('procedure A; forward;');
  935. AssertException(EParserError,@ParseProcedure);
  936. end;
  937. procedure TTestProcedureFunction.TestFunctionForwardInterface;
  938. begin
  939. AddDeclaration('function A : integer; forward;');
  940. AssertException(EParserError,@ParseFunction);
  941. end;
  942. procedure TTestProcedureFunction.TestProcedureForward;
  943. begin
  944. UseImplementation:=True;
  945. AddDeclaration('procedure A; forward;');
  946. ParseProcedure;
  947. AssertProc([pmforward],[],ccDefault,0);
  948. end;
  949. procedure TTestProcedureFunction.TestFunctionForward;
  950. begin
  951. UseImplementation:=True;
  952. AddDeclaration('function A : integer; forward;');
  953. ParseFunction;
  954. AssertFunc([pmforward],[],ccDefault,0);
  955. end;
  956. procedure TTestProcedureFunction.TestProcedureFar;
  957. begin
  958. AddDeclaration('procedure A; far;');
  959. ParseProcedure;
  960. AssertProc([pmfar],[ptmfar],ccDefault,0);
  961. end;
  962. procedure TTestProcedureFunction.TestFunctionFar;
  963. begin
  964. AddDeclaration('function A : integer; far;');
  965. ParseFunction;
  966. AssertFunc([pmfar],[ptmfar],ccDefault,0);
  967. end;
  968. procedure TTestProcedureFunction.TestProcedureCdeclForward;
  969. begin
  970. UseImplementation:=True;
  971. AddDeclaration('procedure A; cdecl; forward;');
  972. ParseProcedure;
  973. AssertProc([pmforward],[],ccCDecl,0);
  974. end;
  975. procedure TTestProcedureFunction.TestFunctionCDeclForward;
  976. begin
  977. UseImplementation:=True;
  978. AddDeclaration('function A : integer; cdecl; forward;');
  979. ParseFunction;
  980. AssertFunc([pmforward],[],ccCDecl,0);
  981. end;
  982. procedure TTestProcedureFunction.TestProcedureCompilerProc;
  983. begin
  984. ParseProcedure(';compilerproc;','');
  985. AssertProc([pmCompilerProc],[],ccDefault,0);
  986. end;
  987. procedure TTestProcedureFunction.TestProcedureNoReturn;
  988. begin
  989. ParseProcedure(';noreturn;','');
  990. AssertProc([pmnoreturn],[],ccDefault,0);
  991. end;
  992. procedure TTestProcedureFunction.TestFunctionCompilerProc;
  993. begin
  994. AddDeclaration('function A : Integer; compilerproc');
  995. ParseFunction;
  996. AssertFunc([pmCompilerProc],[],ccDefault,0);
  997. end;
  998. procedure TTestProcedureFunction.TestProcedureCDeclCompilerProc;
  999. begin
  1000. ParseProcedure(';cdecl;compilerproc;','');
  1001. AssertProc([pmCompilerProc],[],ccCDecl,0);
  1002. end;
  1003. procedure TTestProcedureFunction.TestFunctionCDeclCompilerProc;
  1004. begin
  1005. AddDeclaration('function A : Integer; cdecl; compilerproc');
  1006. ParseFunction;
  1007. AssertFunc([pmCompilerProc],[],ccCDecl,0);
  1008. end;
  1009. procedure TTestProcedureFunction.TestProcedureAssembler;
  1010. begin
  1011. ParseProcedure(';assembler;','');
  1012. AssertProc([pmAssembler],[],ccDefault,0);
  1013. end;
  1014. procedure TTestProcedureFunction.TestFunctionAssembler;
  1015. begin
  1016. AddDeclaration('function A : Integer; assembler');
  1017. ParseFunction;
  1018. AssertFunc([pmAssembler],[],ccDefault,0);
  1019. end;
  1020. procedure TTestProcedureFunction.TestProcedureCDeclAssembler;
  1021. begin
  1022. ParseProcedure(';cdecl;assembler;','');
  1023. AssertProc([pmAssembler],[],ccCDecl,0);
  1024. end;
  1025. procedure TTestProcedureFunction.TestFunctionCDeclAssembler;
  1026. begin
  1027. AddDeclaration('function A : Integer; cdecl; assembler');
  1028. ParseFunction;
  1029. AssertFunc([pmAssembler],[],ccCDecl,0);
  1030. end;
  1031. procedure TTestProcedureFunction.TestProcedureExport;
  1032. begin
  1033. ParseProcedure(';export;','');
  1034. AssertProc([pmExport],[],ccDefault,0);
  1035. end;
  1036. procedure TTestProcedureFunction.TestFunctionExport;
  1037. begin
  1038. AddDeclaration('function A : Integer; export');
  1039. ParseFunction;
  1040. AssertFunc([pmExport],[],ccDefault,0);
  1041. end;
  1042. procedure TTestProcedureFunction.TestProcedureCDeclExport;
  1043. begin
  1044. ParseProcedure('cdecl;export;','');
  1045. AssertProc([pmExport],[],ccCDecl,0);
  1046. end;
  1047. procedure TTestProcedureFunction.TestFunctionCDeclExport;
  1048. begin
  1049. AddDeclaration('function A : Integer; cdecl; export');
  1050. ParseFunction;
  1051. AssertFunc([pmExport],[],ccCDecl,0);
  1052. end;
  1053. procedure TTestProcedureFunction.TestProcedureExternal;
  1054. begin
  1055. ParseProcedure(';external','');
  1056. AssertProc([pmExternal],[],ccDefault,0);
  1057. AssertNull('No Library name expression',Proc.LibraryExpr);
  1058. end;
  1059. procedure TTestProcedureFunction.TestFunctionExternal;
  1060. begin
  1061. AddDeclaration('function A : Integer; external');
  1062. ParseFunction;
  1063. AssertFunc([pmExternal],[],ccDefault,0);
  1064. AssertNull('No Library name expression',Func.LibraryExpr);
  1065. end;
  1066. procedure TTestProcedureFunction.CreateForwardTest;
  1067. begin
  1068. With Source do
  1069. begin
  1070. Add('type');
  1071. Add('');
  1072. Add('Entity=object');
  1073. Add(' function test:Boolean;');
  1074. Add('end;');
  1075. Add('');
  1076. Add('Function Entity.test;');
  1077. Add('begin');
  1078. Add('end;');
  1079. Add('');
  1080. Add('begin');
  1081. // End is added by ParseModule
  1082. end;
  1083. end;
  1084. procedure TTestProcedureFunction.TestFunctionForwardNoReturnDelphi;
  1085. begin
  1086. Source.Add('{$MODE DELPHI}');
  1087. CreateForwardTest;
  1088. ParseModule;
  1089. end;
  1090. procedure TTestProcedureFunction.TestFunctionForwardNoReturnNoDelphi;
  1091. begin
  1092. CreateForwardTest;
  1093. AssertException('Only in delphi mode can result be omitted',EParserError,@ParseModule);
  1094. end;
  1095. procedure TTestProcedureFunction.TestProcedureExternalLibName;
  1096. begin
  1097. ParseProcedure(';external ''libname''','');
  1098. AssertProc([pmExternal],[],ccDefault,0);
  1099. AssertExpression('Library name expression',Proc.LibraryExpr,pekString,'''libname''');
  1100. end;
  1101. procedure TTestProcedureFunction.TestFunctionExternalLibName;
  1102. begin
  1103. AddDeclaration('function A : Integer; external ''libname''');
  1104. ParseFunction;
  1105. AssertFunc([pmExternal],[],ccDefault,0);
  1106. AssertExpression('Library name expression',Func.LibraryExpr,pekString,'''libname''');
  1107. end;
  1108. procedure TTestProcedureFunction.TestProcedureExternalLibNameName;
  1109. begin
  1110. ParseProcedure(';external ''libname'' name ''symbolname''','');
  1111. AssertProc([pmExternal],[],ccDefault,0);
  1112. AssertExpression('Library name expression',Proc.LibraryExpr,pekString,'''libname''');
  1113. AssertExpression('Library symbol expression',Proc.LibrarySymbolName,pekString,'''symbolname''');
  1114. end;
  1115. procedure TTestProcedureFunction.TestFunctionExternalLibNameName;
  1116. begin
  1117. AddDeclaration('function A : Integer; external ''libname'' name ''symbolname''');
  1118. ParseFunction;
  1119. AssertFunc([pmExternal],[],ccDefault,0);
  1120. AssertExpression('Library name expression',Func.LibraryExpr,pekString,'''libname''');
  1121. AssertExpression('Library symbol expression',Func.LibrarySymbolName,pekString,'''symbolname''');
  1122. end;
  1123. procedure TTestProcedureFunction.TestProcedureExternalName;
  1124. begin
  1125. ParseProcedure(';external name ''symbolname''','');
  1126. AssertProc([pmExternal],[],ccDefault,0);
  1127. AssertNull('No Library name expression',Proc.LibraryExpr);
  1128. AssertExpression('Library symbol expression',Proc.LibrarySymbolName,pekString,'''symbolname''');
  1129. end;
  1130. procedure TTestProcedureFunction.TestFunctionExternalName;
  1131. begin
  1132. AddDeclaration('function A : Integer; external name ''symbolname''');
  1133. ParseFunction;
  1134. AssertFunc([pmExternal],[],ccDefault,0);
  1135. AssertNull('No Library name expression',Func.LibraryExpr);
  1136. AssertExpression('Library symbol expression',Func.LibrarySymbolName,pekString,'''symbolname''');
  1137. end;
  1138. procedure TTestProcedureFunction.TestProcedureCdeclExternal;
  1139. begin
  1140. ParseProcedure('; cdecl; external','');
  1141. AssertProc([pmExternal],[],ccCdecl,0);
  1142. AssertNull('No Library name expression',Proc.LibraryExpr);
  1143. end;
  1144. procedure TTestProcedureFunction.TestFunctionCdeclExternal;
  1145. begin
  1146. AddDeclaration('function A : Integer; cdecl; external');
  1147. ParseFunction;
  1148. AssertFunc([pmExternal],[],ccCdecl,0);
  1149. AssertNull('No Library name expression',Func.LibraryExpr);
  1150. end;
  1151. procedure TTestProcedureFunction.TestProcedureCdeclExternalLibName;
  1152. begin
  1153. ParseProcedure('; cdecl; external ''libname''','');
  1154. AssertProc([pmExternal],[],ccCdecl,0);
  1155. AssertExpression('Library name expression',Proc.LibraryExpr,pekString,'''libname''');
  1156. end;
  1157. procedure TTestProcedureFunction.TestFunctionCdeclExternalLibName;
  1158. begin
  1159. AddDeclaration('function A : Integer; cdecl; external ''libname''');
  1160. ParseFunction;
  1161. AssertFunc([pmExternal],[],ccCdecl,0);
  1162. AssertExpression('Library name expression',Func.LibraryExpr,pekString,'''libname''');
  1163. end;
  1164. procedure TTestProcedureFunction.TestProcedureCdeclExternalLibNameName;
  1165. begin
  1166. ParseProcedure('; cdecl; external ''libname'' name ''symbolname''','');
  1167. AssertProc([pmExternal],[],ccCdecl,0);
  1168. AssertExpression('Library name expression',Proc.LibraryExpr,pekString,'''libname''');
  1169. AssertExpression('Library symbol expression',Proc.LibrarySymbolName,pekString,'''symbolname''');
  1170. end;
  1171. procedure TTestProcedureFunction.TestFunctionCdeclExternalLibNameName;
  1172. begin
  1173. AddDeclaration('function A : Integer; cdecl; external ''libname'' name ''symbolname''');
  1174. ParseFunction;
  1175. AssertFunc([pmExternal],[],ccCdecl,0);
  1176. AssertExpression('Library name expression',Func.LibraryExpr,pekString,'''libname''');
  1177. AssertExpression('Library symbol expression',Func.LibrarySymbolName,pekString,'''symbolname''');
  1178. end;
  1179. procedure TTestProcedureFunction.TestProcedureCdeclExternalName;
  1180. begin
  1181. ParseProcedure('; cdecl; external name ''symbolname''','');
  1182. AssertProc([pmExternal],[],ccCdecl,0);
  1183. AssertNull('No Library name expression',Proc.LibraryExpr);
  1184. AssertExpression('Library symbol expression',Proc.LibrarySymbolName,pekString,'''symbolname''');
  1185. end;
  1186. procedure TTestProcedureFunction.TestFunctionCdeclExternalName;
  1187. begin
  1188. AddDeclaration('function A : Integer; cdecl; external name ''symbolname''');
  1189. ParseFunction;
  1190. AssertFunc([pmExternal],[],ccCdecl,0);
  1191. AssertNull('No Library name expression',Func.LibraryExpr);
  1192. AssertExpression('Library symbol expression',Func.LibrarySymbolName,pekString,'''symbolname''');
  1193. end;
  1194. procedure TTestProcedureFunction.TestFunctionAlias;
  1195. begin
  1196. AddDeclaration('function A : Integer; alias: ''myalias''');
  1197. ParseFunction;
  1198. AssertFunc([],[],ccDefault,0);
  1199. AssertEquals('Alias name','''myalias''',Func.AliasName);
  1200. end;
  1201. procedure TTestProcedureFunction.TestOperatorNamedResult;
  1202. begin
  1203. AddDeclaration('operator = (a,b : T) z : Integer;');
  1204. ParseOperator;
  1205. AssertEquals('Correct operator type',otEqual,FOperator.OperatorType);
  1206. end;
  1207. procedure TTestProcedureFunction.TestProcedureAlias;
  1208. begin
  1209. AddDeclaration('Procedure A; Alias : ''myalias''');
  1210. ParseProcedure;
  1211. AssertProc([],[],ccDefault,0);
  1212. AssertEquals('Alias name','''myalias''',Proc.AliasName);
  1213. end;
  1214. procedure TTestProcedureFunction.TestOperatorTokens;
  1215. Var
  1216. t : TOperatorType;
  1217. s : string;
  1218. begin
  1219. For t:=otMul to High(TOperatorType) do
  1220. begin
  1221. if OperatorTokens[t]='' then continue;
  1222. // No way to distinguish between logical/bitwise or/and/Xor
  1223. if t in [otBitWiseOr,otBitwiseAnd,otbitwiseXor] then continue;
  1224. S:=GetEnumName(TypeInfo(TOperatorType),Ord(T));
  1225. ResetParser;
  1226. if t in UnaryOperators then
  1227. AddDeclaration(Format('operator %s (a: Integer) : te',[OperatorTokens[t]]))
  1228. else
  1229. AddDeclaration(Format('operator %s (a: Integer; b: integer) : te',[OperatorTokens[t]]));
  1230. ParseOperator;
  1231. AssertEquals(S+': Token based ',Not (T in [otInc,otDec,otEnumerator]),FOperator.TokenBased);
  1232. AssertEquals(S+': Correct operator type',T,FOperator.OperatorType);
  1233. if t in UnaryOperators then
  1234. AssertEquals(S+': Correct operator name',format('%s(Integer):te',[OperatorNames[t]]),FOperator.Name)
  1235. else
  1236. AssertEquals(S+': Correct operator name',format('%s(Integer,Integer):te',[OperatorNames[t]]),FOperator.Name);
  1237. end;
  1238. end;
  1239. procedure TTestProcedureFunction.TestOperatorNames;
  1240. Var
  1241. t : TOperatorType;
  1242. S: String;
  1243. begin
  1244. For t:=Succ(otUnknown) to High(TOperatorType) do
  1245. begin
  1246. if OperatorNames[t]='' then continue;
  1247. // otInitialize has no result
  1248. S:=GetEnumName(TypeInfo(TOperatorType),Ord(T));
  1249. ResetParser;
  1250. if t in [otCopy] then
  1251. AddDeclaration(Format('operator %s (constref Src: Integer; var Dest : Integer)',[OperatorNames[t]]))
  1252. else if t in [otInitialize,otFinalize,otAddRef] then
  1253. AddDeclaration(Format('operator %s (var a: Integer)',[OperatorNames[t]]))
  1254. else if t in UnaryOperators then
  1255. AddDeclaration(Format('operator %s (a: Integer) : te',[OperatorNames[t]]))
  1256. else
  1257. AddDeclaration(Format('operator %s (a: Integer; b: integer) : te',[OperatorNames[t]]));
  1258. ParseOperator;
  1259. AssertEquals(S+': Token based',t in [otIn],FOperator.TokenBased);
  1260. AssertEquals(S+': Correct operator type',T,FOperator.OperatorType);
  1261. if t in [otCopy] then
  1262. AssertEquals('Correct operator name',format('%s(Integer,Integer)',[OperatorNames[t]]),FOperator.Name)
  1263. else if t in [otInitialize,otFinalize,otAddRef] then
  1264. AssertEquals('Correct operator name',format('%s(Integer)',[OperatorNames[t]]),FOperator.Name)
  1265. else if t in UnaryOperators then
  1266. AssertEquals('Correct operator name',format('%s(Integer):te',[OperatorNames[t]]),FOperator.Name)
  1267. else
  1268. AssertEquals('Correct operator name',format('%s(Integer,Integer):te',[OperatorNames[t]]),FOperator.Name);
  1269. end;
  1270. end;
  1271. procedure TTestProcedureFunction.TestAssignOperatorAfterObject;
  1272. begin
  1273. Add('unit afile;');
  1274. Add('{$mode delphi}');
  1275. Add('interface');
  1276. Add('type');
  1277. Add(' TA =object');
  1278. Add(' data:integer;');
  1279. Add(' function transpose:integer;');
  1280. Add(' end;');
  1281. Add('');
  1282. Add('operator := (const v:Tvector2_single) result:Tvector2_double;');
  1283. Add('implementation');
  1284. EndSource;
  1285. Parser.Options:=[po_delphi];
  1286. ParseModule;
  1287. end;
  1288. procedure TTestProcedureFunction.TestFunctionNoResult;
  1289. begin
  1290. Add('unit afile;');
  1291. Add('{$mode delphi}');
  1292. Add('interface');
  1293. Add('function TestDelphiModeFuncs(d:double):string;');
  1294. Add('implementation');
  1295. Add('function TestDelphiModeFuncs;');
  1296. Add('begin');
  1297. Add('end;');
  1298. EndSource;
  1299. Parser.Options:=[po_delphi];
  1300. ParseModule;
  1301. end;
  1302. procedure TTestProcedureFunction.SetUp;
  1303. begin
  1304. Inherited;
  1305. end;
  1306. procedure TTestProcedureFunction.TearDown;
  1307. begin
  1308. Inherited;
  1309. end;
  1310. procedure TTestProcedureFunction.AssertComment;
  1311. begin
  1312. AssertEquals('Correct comment',' A comment'+sLineBreak,FProc.DocComment);
  1313. end;
  1314. procedure TTestProcedureFunction.TestFunctionSyscallSingleNumber;
  1315. begin
  1316. // function Something : Someresult; syscall 12
  1317. AddDeclaration('function A : Integer; syscall 12');
  1318. ParseFunction;
  1319. AssertFunc([pmExternal],[],ccSysCall,0);
  1320. end;
  1321. procedure TTestProcedureFunction.TestFunctionSyscallDoubleNumber;
  1322. begin
  1323. // function Something : Someresult; syscall 12 13
  1324. AddDeclaration('function A : Integer; syscall 12 13');
  1325. ParseFunction;
  1326. AssertFunc([pmExternal],[],ccSysCall,0);
  1327. end;
  1328. procedure TTestProcedureFunction.TestFunctionSysCallSysTrapIdentifier;
  1329. begin
  1330. // function Something : Someresult; syscall systrapNNN
  1331. // Fail('To be implemented');
  1332. AddDeclaration('function A : Integer; syscall systrap12');
  1333. ParseFunction;
  1334. AssertFunc([pmExternal],[],ccSysCall,0);
  1335. end;
  1336. initialization
  1337. RegisterTest(TTestProcedureFunction);
  1338. end.