tcprocfunc.pas 47 KB

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