tcprocfunc.pas 44 KB

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