2
0

tcprocfunc.pas 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156
  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. procedure AddDeclaration(const ASource: string; const AHint: String='');
  15. procedure AssertArg(ProcType: TPasProcedureType; AIndex: Integer;
  16. AName: String; AAccess: TArgumentAccess; const TypeName: String;
  17. AValue: String='');
  18. procedure AssertArrayArg(ProcType: TPasProcedureType; AIndex: Integer;
  19. AName: String; AAccess: TArgumentAccess; const ElementTypeName: String);
  20. procedure AssertFunc(Mods: TProcedureModifiers; CC: TCallingConvention; ArgCount: Integer; P: TPasFunction=nil);
  21. procedure AssertProc(Mods: TProcedureModifiers; CC: TCallingConvention; ArgCount: Integer; P: TPasProcedure=nil);
  22. function BaseAssertArg(ProcType: TPasProcedureType; AIndex: Integer;
  23. AName: String; AAccess: TArgumentAccess; AValue: String=''): TPasArgument;
  24. function GetFT: TPasFunctionType;
  25. function GetPT: TPasProcedureType;
  26. Procedure ParseProcedure;
  27. function ParseProcedure(const ASource: string; const AHint: String=''): TPasProcedure;
  28. Procedure ParseFunction;
  29. function ParseFunction(const ASource : String; AResult: string = ''; const AHint: String=''; CC : TCallingConvention = ccDefault): TPasProcedure;
  30. protected
  31. procedure SetUp; override;
  32. procedure TearDown; override;
  33. Procedure AssertComment;
  34. Property AddComment : Boolean Read FAddComment Write FAddComment;
  35. Property Hint : String Read FHint Write FHint;
  36. Property Proc : TPasProcedure Read FProc;
  37. Property ProcType : TPasProcedureType Read GetPT;
  38. Property Func : TPasFunction Read FFunc;
  39. Property FuncType : TPasFunctionType Read GetFT;
  40. published
  41. procedure TestEmptyProcedure;
  42. procedure TestEmptyProcedureComment;
  43. Procedure TestEmptyFunction;
  44. Procedure TestEmptyFunctionComment;
  45. procedure TestEmptyProcedureDeprecated;
  46. Procedure TestEmptyFunctionDeprecated;
  47. procedure TestEmptyProcedurePlatform;
  48. Procedure TestEmptyFunctionPlatform;
  49. procedure TestEmptyProcedureExperimental;
  50. Procedure TestEmptyFunctionExperimental;
  51. procedure TestEmptyProcedureUnimplemented;
  52. Procedure TestEmptyFunctionUnimplemented;
  53. procedure TestProcedureOneArg;
  54. Procedure TestFunctionOneArg;
  55. procedure TestProcedureOneVarArg;
  56. Procedure TestFunctionOneVarArg;
  57. procedure TestProcedureOneConstArg;
  58. Procedure TestFunctionOneConstArg;
  59. procedure TestProcedureOneOutArg;
  60. Procedure TestFunctionOneOutArg;
  61. procedure TestProcedureOneConstRefArg;
  62. Procedure TestFunctionOneConstRefArg;
  63. procedure TestProcedureTwoArgs;
  64. Procedure TestFunctionTwoArgs;
  65. procedure TestProcedureTwoArgsSeparate;
  66. Procedure TestFunctionTwoArgsSeparate;
  67. procedure TestProcedureOneArgDefault;
  68. Procedure TestFunctionOneArgDefault;
  69. procedure TestProcedureOneArgDefaultSet;
  70. Procedure TestFunctionOneArgDefaultSet;
  71. procedure TestProcedureOneArgDefaultExpr;
  72. Procedure TestFunctionOneArgDefaultExpr;
  73. procedure TestProcedureTwoArgsDefault;
  74. Procedure TestFunctionTwoArgsDefault;
  75. procedure TestProcedureOneUntypedVarArg;
  76. Procedure TestFunctionOneUntypedVarArg;
  77. procedure TestProcedureTwoUntypedVarArgs;
  78. Procedure TestFunctionTwoUntypedVarArgs;
  79. procedure TestProcedureOneUntypedConstArg;
  80. Procedure TestFunctionOneUntypedConstArg;
  81. procedure TestProcedureTwoUntypedConstArgs;
  82. Procedure TestFunctionTwoUntypedConstArgs;
  83. procedure TestProcedureOpenArrayArg;
  84. Procedure TestFunctionOpenArrayArg;
  85. procedure TestProcedureTwoOpenArrayArgs;
  86. Procedure TestFunctionTwoOpenArrayArgs;
  87. procedure TestProcedureConstOpenArrayArg;
  88. Procedure TestFunctionConstOpenArrayArg;
  89. procedure TestProcedureVarOpenArrayArg;
  90. Procedure TestFunctionVarOpenArrayArg;
  91. procedure TestProcedureArrayOfConstArg;
  92. Procedure TestFunctionArrayOfConstArg;
  93. procedure TestProcedureConstArrayOfConstArg;
  94. Procedure TestFunctionConstArrayOfConstArg;
  95. Procedure TestProcedureCdecl;
  96. Procedure TestFunctionCdecl;
  97. Procedure TestProcedureCdeclDeprecated;
  98. Procedure TestFunctionCdeclDeprecated;
  99. Procedure TestProcedureSafeCall;
  100. Procedure TestFunctionSafeCall;
  101. //ccDefault,ccRegister,ccPascal,ccCDecl,ccStdCall,ccOldFPCCall,ccSafeCall);
  102. Procedure TestProcedurePascal;
  103. Procedure TestFunctionPascal;
  104. Procedure TestProcedureStdCall;
  105. Procedure TestFunctionStdCall;
  106. Procedure TestProcedureOldFPCCall;
  107. Procedure TestFunctionOldFPCCall;
  108. Procedure TestProcedurePublic;
  109. Procedure TestProcedurePublicIdent;
  110. Procedure TestFunctionPublic;
  111. Procedure TestProcedureCdeclPublic;
  112. Procedure TestFunctionCdeclPublic;
  113. Procedure TestProcedureOverload;
  114. Procedure TestFunctionOverload;
  115. Procedure TestProcedureVarargs;
  116. Procedure TestFunctionVarArgs;
  117. Procedure TestProcedureCDeclVarargs;
  118. Procedure TestFunctionCDeclVarArgs;
  119. Procedure TestProcedureForwardInterface;
  120. Procedure TestFunctionForwardInterface;
  121. Procedure TestProcedureForward;
  122. Procedure TestFunctionForward;
  123. Procedure TestProcedureCdeclForward;
  124. Procedure TestFunctionCDeclForward;
  125. Procedure TestProcedureCompilerProc;
  126. Procedure TestFunctionCompilerProc;
  127. Procedure TestProcedureCDeclCompilerProc;
  128. Procedure TestFunctionCDeclCompilerProc;
  129. Procedure TestProcedureAssembler;
  130. Procedure TestFunctionAssembler;
  131. Procedure TestProcedureCDeclAssembler;
  132. Procedure TestFunctionCDeclAssembler;
  133. Procedure TestProcedureExport;
  134. Procedure TestFunctionExport;
  135. Procedure TestProcedureCDeclExport;
  136. Procedure TestFunctionCDeclExport;
  137. Procedure TestProcedureExternal;
  138. Procedure TestFunctionExternal;
  139. Procedure TestProcedureExternalLibName;
  140. Procedure TestFunctionExternalLibName;
  141. Procedure TestProcedureExternalLibNameName;
  142. Procedure TestFunctionExternalLibNameName;
  143. Procedure TestProcedureExternalName;
  144. Procedure TestFunctionExternalName;
  145. Procedure TestProcedureCdeclExternal;
  146. Procedure TestFunctionCdeclExternal;
  147. Procedure TestProcedureCdeclExternalLibName;
  148. Procedure TestFunctionCdeclExternalLibName;
  149. Procedure TestProcedureCdeclExternalLibNameName;
  150. Procedure TestFunctionCdeclExternalLibNameName;
  151. Procedure TestProcedureCdeclExternalName;
  152. Procedure TestFunctionCdeclExternalName;
  153. end;
  154. implementation
  155. procedure TTestProcedureFunction.AddDeclaration(const ASource: string;
  156. const AHint: String);
  157. Var
  158. D : String;
  159. begin
  160. Hint:=AHint;
  161. D:=ASource;
  162. If Hint<>'' then
  163. D:=D+' '+Hint;
  164. if (D[Length(D)]<>';') then
  165. D:=D+';';
  166. Add(D);
  167. end;
  168. function TTestProcedureFunction.GetPT: TPasProcedureType;
  169. begin
  170. AssertNotNull('have procedure to get type from',Proc);
  171. Result:=Proc.ProcType;
  172. end;
  173. function TTestProcedureFunction.ParseProcedure(const ASource: string;
  174. const AHint: String): TPasProcedure;
  175. begin
  176. If AddComment then
  177. begin
  178. Add('// A comment');
  179. Engine.NeedComments:=True;
  180. end;
  181. AddDeclaration('procedure A '+ASource,AHint);
  182. Self.ParseProcedure;
  183. Result:=Fproc;
  184. If AddComment then
  185. AssertComment;
  186. end;
  187. Procedure TTestProcedureFunction.ParseProcedure;
  188. begin
  189. // Writeln(source.text);
  190. ParseDeclarations;
  191. AssertEquals('One variable definition',1,Declarations.Functions.Count);
  192. AssertEquals('First declaration is procedure declaration.',TPasProcedure,TObject(Declarations.Functions[0]).ClassType);
  193. FProc:=TPasProcedure(Declarations.Functions[0]);
  194. Definition:=FProc;
  195. AssertEquals('First declaration has correct name.','A',FProc.Name);
  196. if (Hint<>'') then
  197. CheckHint(TPasMemberHint(Getenumvalue(typeinfo(TPasMemberHint),'h'+Hint)));
  198. end;
  199. function TTestProcedureFunction.ParseFunction(const ASource : String;AResult: string = ''; const AHint: String = ''; CC : TCallingConvention = ccDefault): TPasProcedure;
  200. Var
  201. D :String;
  202. begin
  203. if (AResult='') then
  204. AResult:='Integer';
  205. D:='Function A '+ASource+' : '+AResult;
  206. If (cc<>ccDefault) then
  207. D:=D+'; '+cCallingConventions[cc]+';';
  208. AddDeclaration(D,AHint);
  209. Self.ParseFunction;
  210. Result:=FFunc;
  211. AssertNotNull('Have function result element',FuncType.ResultEl);
  212. AssertNotNull('Have function result type element',FuncType.ResultEl.ResultType);
  213. AssertEquals('Correct function result type name',AResult,FuncType.ResultEl.ResultType.Name);
  214. end;
  215. Procedure TTestProcedureFunction.ParseFunction;
  216. begin
  217. // Writeln(source.text);
  218. ParseDeclarations;
  219. AssertEquals('One variable definition',1,Declarations.Functions.Count);
  220. AssertEquals('First declaration is function declaration.',TPasFunction,TObject(Declarations.Functions[0]).ClassType);
  221. FFunc:=TPasFunction(Declarations.Functions[0]);
  222. Definition:=FFunc;
  223. AssertEquals('First declaration has correct name.','A',FFunc.Name);
  224. if (Hint<>'') then
  225. CheckHint(TPasMemberHint(Getenumvalue(typeinfo(TPasMemberHint),'h'+Hint)));
  226. end;
  227. procedure TTestProcedureFunction.AssertProc(Mods : TProcedureModifiers; CC : TCallingConvention; ArgCount : Integer; P : TPasProcedure = Nil);
  228. begin
  229. If P=Nil then
  230. P:=Proc;
  231. AssertNotNull('No proc to assert',P);
  232. AssertEquals('Procedure modifiers',Mods,P.Modifiers);
  233. AssertEquals('Procedue calling convention',CC,P.CallingConvention);
  234. AssertEquals('No message name','',p.MessageName);
  235. AssertEquals('No message type',pmtNone,P.MessageType);
  236. AssertNotNull('Have procedure type to assert',P.ProcType);
  237. AssertEquals('Correct number of arguments',ArgCount,P.ProcType.Args.Count);
  238. AssertEquals('Not of object',False,P.ProcType.IsOfObject);
  239. AssertEquals('Not is nested',False,P.ProcType.IsNested);
  240. end;
  241. procedure TTestProcedureFunction.AssertFunc(Mods : TProcedureModifiers; CC : TCallingConvention; ArgCount : Integer; P : TPasFunction = Nil);
  242. begin
  243. If P=Nil then
  244. P:=Func;
  245. AssertNotNull('No func to assert',P);
  246. AssertEquals('Procedure modifiers',Mods,P.Modifiers);
  247. AssertEquals('Procedue calling convention',CC,P.CallingConvention);
  248. AssertEquals('No message name','',p.MessageName);
  249. AssertEquals('No message type',pmtNone,P.MessageType);
  250. AssertNotNull('Have procedure type to assert',P.ProcType);
  251. AssertEquals('Correct number of arguments',ArgCount,P.ProcType.Args.Count);
  252. AssertEquals('Not of object',False,P.ProcType.IsOfObject);
  253. AssertEquals('Not is nested',False,P.ProcType.IsNested);
  254. end;
  255. function TTestProcedureFunction.BaseAssertArg(ProcType: TPasProcedureType;
  256. AIndex: Integer; AName: String; AAccess: TArgumentAccess; AValue: String
  257. ): TPasArgument;
  258. Var
  259. A : TPasArgument;
  260. N : String;
  261. begin
  262. AssertNotNull('Have proctype to test argument',ProcType);
  263. if AIndex>=Proctype.Args.Count then
  264. Fail(Format('Cannot test argument: index %d is larger than the number of arguments (%d).',[AIndex,Proctype.Args.Count]));
  265. AssertNotNull('Have argument at position '+IntToStr(AIndex),Proctype.Args[AIndex]);
  266. AssertEquals('Have argument type at position '+IntToStr(AIndex),TPasArgument,TObject(Proctype.Args[AIndex]).ClassType);
  267. N:='Argument '+IntToStr(AIndex+1)+' : ';
  268. A:=TPasArgument(Proctype.Args[AIndex]);
  269. AssertEquals(N+'Argument name',AName,A.Name);
  270. AssertEquals(N+'Argument access',AAccess,A.Access);
  271. if (AValue='') then
  272. AssertNull(N+' no default value',A.ValueExpr)
  273. else
  274. begin
  275. AssertNotNull(N+' Have default value',A.ValueExpr);
  276. AssertEquals(N+' Default value',AValue,A.Value);
  277. end;
  278. Result:=A;
  279. end;
  280. procedure TTestProcedureFunction.AssertArg(ProcType: TPasProcedureType;
  281. AIndex: Integer; AName: String; AAccess: TArgumentAccess;
  282. const TypeName: String; AValue: String);
  283. Var
  284. A : TPasArgument;
  285. N : String;
  286. begin
  287. A:=BaseAssertArg(ProcType,AIndex,ANAme,AAccess,AValue);
  288. N:='Argument '+IntToStr(AIndex+1)+' : ';
  289. if (TypeName='') then
  290. AssertNull(N+' No argument type',A.ArgType)
  291. else
  292. begin
  293. AssertNotNull(N+' Have argument type',A.ArgType);
  294. AssertEquals(N+' Correct argument type name',TypeName,A.ArgType.Name);
  295. end;
  296. end;
  297. procedure TTestProcedureFunction.AssertArrayArg(ProcType: TPasProcedureType;
  298. AIndex: Integer; AName: String; AAccess: TArgumentAccess;
  299. const ElementTypeName: String);
  300. Var
  301. A : TPasArgument;
  302. AT : TPasArrayType;
  303. N : String;
  304. begin
  305. A:=BaseAssertArg(ProcType,AIndex,ANAme,AAccess,'');
  306. N:='Argument '+IntToStr(AIndex+1)+' : ';
  307. AssertNotNull(N+' Have argument type',A.ArgType);
  308. AssertEquals(N+' is arrayType',TPasArrayType,A.ArgType.ClassType);
  309. AT:=TPasArrayType(A.ArgType);
  310. if (ElementTypeName='') then
  311. AssertNull(N+' No array element type',AT.ElType)
  312. else
  313. begin
  314. AssertNotNull(N+' Have array element type',AT.ElType);
  315. AssertEquals(N+' Correct array element type name',ElementTypeName,AT.ElType.Name);
  316. end;
  317. end;
  318. function TTestProcedureFunction.GetFT: TPasFunctionType;
  319. begin
  320. AssertNotNull('have function to get type from',Func);
  321. AssertEquals('Function type is correct type',TPasFunctionType,Func.ProcType.ClassType);
  322. Result:=Func.FuncType;
  323. end;
  324. //TProcedureMessageType
  325. procedure TTestProcedureFunction.TestEmptyProcedure;
  326. begin
  327. ParseProcedure('');
  328. AssertProc([],ccDefault,0);
  329. end;
  330. procedure TTestProcedureFunction.TestEmptyProcedureComment;
  331. begin
  332. AddComment:=True;
  333. TestEmptyProcedure;
  334. end;
  335. Procedure TTestProcedureFunction.TestEmptyFunction;
  336. begin
  337. ParseFunction('');
  338. AssertFunc([],ccDefault,0);
  339. end;
  340. Procedure TTestProcedureFunction.TestEmptyFunctionComment;
  341. begin
  342. AddComment:=True;
  343. TestEmptyProcedure;
  344. end;
  345. procedure TTestProcedureFunction.TestEmptyProcedureDeprecated;
  346. begin
  347. ParseProcedure('','deprecated');
  348. AssertProc([],ccDefault,0);
  349. end;
  350. Procedure TTestProcedureFunction.TestEmptyFunctionDeprecated;
  351. begin
  352. ParseFunction('','deprecated');
  353. AssertFunc([],ccDefault,0);
  354. end;
  355. procedure TTestProcedureFunction.TestEmptyProcedurePlatform;
  356. begin
  357. ParseProcedure('','platform');
  358. AssertProc([],ccDefault,0);
  359. end;
  360. Procedure TTestProcedureFunction.TestEmptyFunctionPlatform;
  361. begin
  362. ParseFunction('','platform');
  363. AssertFunc([],ccDefault,0);
  364. end;
  365. procedure TTestProcedureFunction.TestEmptyProcedureExperimental;
  366. begin
  367. ParseProcedure('','experimental');
  368. AssertProc([],ccDefault,0);
  369. end;
  370. Procedure TTestProcedureFunction.TestEmptyFunctionExperimental;
  371. begin
  372. ParseFunction('','experimental');
  373. AssertFunc([],ccDefault,0);
  374. end;
  375. procedure TTestProcedureFunction.TestEmptyProcedureUnimplemented;
  376. begin
  377. ParseProcedure('','unimplemented');
  378. AssertProc([],ccDefault,0);
  379. end;
  380. Procedure TTestProcedureFunction.TestEmptyFunctionUnimplemented;
  381. begin
  382. ParseFunction('','unimplemented');
  383. AssertFunc([],ccDefault,0);
  384. end;
  385. procedure TTestProcedureFunction.TestProcedureOneArg;
  386. begin
  387. ParseProcedure('(B : Integer)');
  388. AssertProc([],ccDefault,1);
  389. AssertArg(ProcType,0,'B',argDefault,'Integer','');
  390. end;
  391. Procedure TTestProcedureFunction.TestFunctionOneArg;
  392. begin
  393. ParseFunction('(B : Integer)');
  394. AssertFunc([],ccDefault,1);
  395. AssertArg(FuncType,0,'B',argDefault,'Integer','');
  396. end;
  397. procedure TTestProcedureFunction.TestProcedureOneVarArg;
  398. begin
  399. ParseProcedure('(Var B : Integer)');
  400. AssertProc([],ccDefault,1);
  401. AssertArg(ProcType,0,'B',argVar,'Integer','');
  402. end;
  403. Procedure TTestProcedureFunction.TestFunctionOneVarArg;
  404. begin
  405. ParseFunction('(Var B : Integer)');
  406. AssertFunc([],ccDefault,1);
  407. AssertArg(FuncType,0,'B',argVar,'Integer','');
  408. end;
  409. procedure TTestProcedureFunction.TestProcedureOneConstArg;
  410. begin
  411. ParseProcedure('(Const B : Integer)');
  412. AssertProc([],ccDefault,1);
  413. AssertArg(ProcType,0,'B',argConst,'Integer','');
  414. end;
  415. Procedure TTestProcedureFunction.TestFunctionOneConstArg;
  416. begin
  417. ParseFunction('(Const B : Integer)');
  418. AssertFunc([],ccDefault,1);
  419. AssertArg(FuncType,0,'B',argConst,'Integer','');
  420. end;
  421. procedure TTestProcedureFunction.TestProcedureOneOutArg;
  422. begin
  423. ParseProcedure('(Out B : Integer)');
  424. AssertProc([],ccDefault,1);
  425. AssertArg(ProcType,0,'B',argOut,'Integer','');
  426. end;
  427. Procedure TTestProcedureFunction.TestFunctionOneOutArg;
  428. begin
  429. ParseFunction('(Out B : Integer)');
  430. AssertFunc([],ccDefault,1);
  431. AssertArg(FuncType,0,'B',argOut,'Integer','');
  432. end;
  433. procedure TTestProcedureFunction.TestProcedureOneConstRefArg;
  434. begin
  435. ParseProcedure('(Constref B : Integer)');
  436. AssertProc([],ccDefault,1);
  437. AssertArg(ProcType,0,'B',argConstRef,'Integer','');
  438. end;
  439. Procedure TTestProcedureFunction.TestFunctionOneConstRefArg;
  440. begin
  441. ParseFunction('(ConstRef B : Integer)');
  442. AssertFunc([],ccDefault,1);
  443. AssertArg(FuncType,0,'B',argConstref,'Integer','');
  444. end;
  445. procedure TTestProcedureFunction.TestProcedureTwoArgs;
  446. begin
  447. ParseProcedure('(B,C : Integer)');
  448. AssertProc([],ccDefault,2);
  449. AssertArg(ProcType,0,'B',argDefault,'Integer','');
  450. AssertArg(ProcType,1,'C',argDefault,'Integer','');
  451. end;
  452. Procedure TTestProcedureFunction.TestFunctionTwoArgs;
  453. begin
  454. ParseFunction('(B,C : Integer)');
  455. AssertFunc([],ccDefault,2);
  456. AssertArg(FuncType,0,'B',argDefault,'Integer','');
  457. AssertArg(FuncType,1,'C',argDefault,'Integer','');
  458. end;
  459. procedure TTestProcedureFunction.TestProcedureTwoArgsSeparate;
  460. begin
  461. ParseProcedure('(B : Integer; C : Integer)');
  462. AssertProc([],ccDefault,2);
  463. AssertArg(ProcType,0,'B',argDefault,'Integer','');
  464. AssertArg(ProcType,1,'C',argDefault,'Integer','');
  465. end;
  466. Procedure TTestProcedureFunction.TestFunctionTwoArgsSeparate;
  467. begin
  468. ParseFunction('(B : Integer;C : Integer)');
  469. AssertFunc([],ccDefault,2);
  470. AssertArg(FuncType,0,'B',argDefault,'Integer','');
  471. AssertArg(FuncType,1,'C',argDefault,'Integer','');
  472. end;
  473. procedure TTestProcedureFunction.TestProcedureOneArgDefault;
  474. begin
  475. ParseProcedure('(B : Integer = 1)');
  476. AssertProc([],ccDefault,1);
  477. AssertArg(ProcType,0,'B',argDefault,'Integer','1');
  478. end;
  479. Procedure TTestProcedureFunction.TestFunctionOneArgDefault;
  480. begin
  481. ParseFunction('(B : Integer = 1)');
  482. AssertFunc([],ccDefault,1);
  483. AssertArg(FuncType,0,'B',argDefault,'Integer','1');
  484. end;
  485. procedure TTestProcedureFunction.TestProcedureOneArgDefaultSet;
  486. begin
  487. ParseProcedure('(B : MySet = [1,2])');
  488. AssertProc([],ccDefault,1);
  489. AssertArg(ProcType,0,'B',argDefault,'MySet','[1, 2]');
  490. end;
  491. Procedure TTestProcedureFunction.TestFunctionOneArgDefaultSet;
  492. begin
  493. ParseFunction('(B : MySet = [1,2])');
  494. AssertFunc([],ccDefault,1);
  495. AssertArg(FuncType,0,'B',argDefault,'MySet','[1, 2]');
  496. end;
  497. procedure TTestProcedureFunction.TestProcedureOneArgDefaultExpr;
  498. begin
  499. ParseProcedure('(B : Integer = 1 + 2)');
  500. AssertProc([],ccDefault,1);
  501. AssertArg(ProcType,0,'B',argDefault,'Integer','1 + 2');
  502. end;
  503. Procedure TTestProcedureFunction.TestFunctionOneArgDefaultExpr;
  504. begin
  505. ParseFunction('(B : Integer = 1 + 2)');
  506. AssertFunc([],ccDefault,1);
  507. AssertArg(FuncType,0,'B',argDefault,'Integer','1 + 2');
  508. end;
  509. procedure TTestProcedureFunction.TestProcedureTwoArgsDefault;
  510. begin
  511. ParseProcedure('(B : Integer = 1; C : Integer = 2)');
  512. AssertProc([],ccDefault,2);
  513. AssertArg(ProcType,0,'B',argDefault,'Integer','1');
  514. AssertArg(ProcType,1,'C',argDefault,'Integer','2');
  515. end;
  516. Procedure TTestProcedureFunction.TestFunctionTwoArgsDefault;
  517. begin
  518. ParseFunction('(B : Integer = 1; C : Integer = 2)');
  519. AssertFunc([],ccDefault,2);
  520. AssertArg(FuncType,0,'B',argDefault,'Integer','1');
  521. AssertArg(FuncType,1,'C',argDefault,'Integer','2');
  522. end;
  523. procedure TTestProcedureFunction.TestProcedureOneUntypedVarArg;
  524. begin
  525. ParseProcedure('(Var B)');
  526. AssertProc([],ccDefault,1);
  527. AssertArg(ProcType,0,'B',argVar,'','');
  528. end;
  529. Procedure TTestProcedureFunction.TestFunctionOneUntypedVarArg;
  530. begin
  531. ParseFunction('(Var B)');
  532. AssertFunc([],ccDefault,1);
  533. AssertArg(FuncType,0,'B',argVar,'','');
  534. end;
  535. procedure TTestProcedureFunction.TestProcedureTwoUntypedVarArgs;
  536. begin
  537. ParseProcedure('(Var B; Var C)');
  538. AssertProc([],ccDefault,2);
  539. AssertArg(ProcType,0,'B',argVar,'','');
  540. AssertArg(ProcType,1,'C',argVar,'','');
  541. end;
  542. Procedure TTestProcedureFunction.TestFunctionTwoUntypedVarArgs;
  543. begin
  544. ParseFunction('(Var B; Var C)');
  545. AssertFunc([],ccDefault,2);
  546. AssertArg(FuncType,0,'B',argVar,'','');
  547. AssertArg(FuncType,1,'C',argVar,'','');
  548. end;
  549. procedure TTestProcedureFunction.TestProcedureOneUntypedConstArg;
  550. begin
  551. ParseProcedure('(Const B)');
  552. AssertProc([],ccDefault,1);
  553. AssertArg(ProcType,0,'B',argConst,'','');
  554. end;
  555. Procedure TTestProcedureFunction.TestFunctionOneUntypedConstArg;
  556. begin
  557. ParseFunction('(Const B)');
  558. AssertFunc([],ccDefault,1);
  559. AssertArg(FuncType,0,'B',argConst,'','');
  560. end;
  561. procedure TTestProcedureFunction.TestProcedureTwoUntypedConstArgs;
  562. begin
  563. ParseProcedure('(Const B; Const C)');
  564. AssertProc([],ccDefault,2);
  565. AssertArg(ProcType,0,'B',argConst,'','');
  566. AssertArg(ProcType,1,'C',argConst,'','');
  567. end;
  568. Procedure TTestProcedureFunction.TestFunctionTwoUntypedConstArgs;
  569. begin
  570. ParseFunction('(Const B; Const C)');
  571. AssertFunc([],ccDefault,2);
  572. AssertArg(FuncType,0,'B',argConst,'','');
  573. AssertArg(FuncType,1,'C',argConst,'','');
  574. end;
  575. procedure TTestProcedureFunction.TestProcedureOpenArrayArg;
  576. begin
  577. ParseProcedure('(B : Array of Integer)');
  578. AssertProc([],ccDefault,1);
  579. AssertArrayArg(ProcType,0,'B',argDefault,'Integer');
  580. end;
  581. Procedure TTestProcedureFunction.TestFunctionOpenArrayArg;
  582. begin
  583. ParseFunction('(B : Array of Integer)');
  584. AssertFunc([],ccDefault,1);
  585. AssertArrayArg(FuncType,0,'B',argDefault,'Integer');
  586. end;
  587. procedure TTestProcedureFunction.TestProcedureTwoOpenArrayArgs;
  588. begin
  589. ParseProcedure('(B : Array of Integer;C : Array of Integer)');
  590. AssertProc([],ccDefault,2);
  591. AssertArrayArg(ProcType,0,'B',argDefault,'Integer');
  592. AssertArrayArg(ProcType,1,'C',argDefault,'Integer');
  593. end;
  594. Procedure TTestProcedureFunction.TestFunctionTwoOpenArrayArgs;
  595. begin
  596. ParseFunction('(B : Array of Integer;C : Array of Integer)');
  597. AssertFunc([],ccDefault,2);
  598. AssertArrayArg(FuncType,0,'B',argDefault,'Integer');
  599. AssertArrayArg(FuncType,1,'C',argDefault,'Integer');
  600. end;
  601. procedure TTestProcedureFunction.TestProcedureConstOpenArrayArg;
  602. begin
  603. ParseProcedure('(Const B : Array of Integer)');
  604. AssertProc([],ccDefault,1);
  605. AssertArrayArg(ProcType,0,'B',argConst,'Integer');
  606. end;
  607. Procedure TTestProcedureFunction.TestFunctionConstOpenArrayArg;
  608. begin
  609. ParseFunction('(Const B : Array of Integer)');
  610. AssertFunc([],ccDefault,1);
  611. AssertArrayArg(FuncType,0,'B',argConst,'Integer');
  612. end;
  613. procedure TTestProcedureFunction.TestProcedureVarOpenArrayArg;
  614. begin
  615. ParseProcedure('(Var B : Array of Integer)');
  616. AssertProc([],ccDefault,1);
  617. AssertArrayArg(ProcType,0,'B',argVar,'Integer');
  618. end;
  619. Procedure TTestProcedureFunction.TestFunctionVarOpenArrayArg;
  620. begin
  621. ParseFunction('(Var B : Array of Integer)');
  622. AssertFunc([],ccDefault,1);
  623. AssertArrayArg(FuncType,0,'B',argVar,'Integer');
  624. end;
  625. procedure TTestProcedureFunction.TestProcedureArrayOfConstArg;
  626. begin
  627. ParseProcedure('(B : Array of Const)');
  628. AssertProc([],ccDefault,1);
  629. AssertArrayArg(ProcType,0,'B',argDefault,'');
  630. end;
  631. Procedure TTestProcedureFunction.TestFunctionArrayOfConstArg;
  632. begin
  633. ParseFunction('(B : Array of Const)');
  634. AssertFunc([],ccDefault,1);
  635. AssertArrayArg(FuncType,0,'B',argDefault,'');
  636. end;
  637. procedure TTestProcedureFunction.TestProcedureConstArrayOfConstArg;
  638. begin
  639. ParseProcedure('(Const B : Array of Const)');
  640. AssertProc([],ccDefault,1);
  641. AssertArrayArg(ProcType,0,'B',argConst,'');
  642. end;
  643. Procedure TTestProcedureFunction.TestFunctionConstArrayOfConstArg;
  644. begin
  645. ParseFunction('(Const B : Array of Const)');
  646. AssertFunc([],ccDefault,1);
  647. AssertArrayArg(FuncType,0,'B',argConst,'');
  648. end;
  649. Procedure TTestProcedureFunction.TestProcedureCdecl;
  650. begin
  651. ParseProcedure('; cdecl');
  652. AssertProc([],ccCdecl,0);
  653. end;
  654. Procedure TTestProcedureFunction.TestFunctionCdecl;
  655. begin
  656. ParseFunction('','','',ccCdecl);
  657. AssertFunc([],ccCdecl,0);
  658. end;
  659. Procedure TTestProcedureFunction.TestProcedureCdeclDeprecated;
  660. begin
  661. ParseProcedure('; cdecl;','deprecated');
  662. AssertProc([],ccCdecl,0);
  663. end;
  664. Procedure TTestProcedureFunction.TestFunctionCdeclDeprecated;
  665. begin
  666. ParseFunction('','','deprecated',ccCdecl);
  667. AssertFunc([],ccCdecl,0);
  668. end;
  669. Procedure TTestProcedureFunction.TestProcedureSafeCall;
  670. begin
  671. ParseProcedure('; safecall;','');
  672. AssertProc([],ccSafeCall,0);
  673. end;
  674. Procedure TTestProcedureFunction.TestFunctionSafeCall;
  675. begin
  676. ParseFunction('','','',ccSafecall);
  677. AssertFunc([],ccSafecall,0);
  678. end;
  679. Procedure TTestProcedureFunction.TestProcedurePascal;
  680. begin
  681. ParseProcedure('; pascal;','');
  682. AssertProc([],ccPascal,0);
  683. end;
  684. Procedure TTestProcedureFunction.TestFunctionPascal;
  685. begin
  686. ParseFunction('','','',ccPascal);
  687. AssertFunc([],ccPascal,0);
  688. end;
  689. Procedure TTestProcedureFunction.TestProcedureStdCall;
  690. begin
  691. ParseProcedure('; stdcall;','');
  692. AssertProc([],ccstdcall,0);
  693. end;
  694. Procedure TTestProcedureFunction.TestFunctionStdCall;
  695. begin
  696. ParseFunction('','','',ccStdCall);
  697. AssertFunc([],ccStdCall,0);
  698. end;
  699. Procedure TTestProcedureFunction.TestProcedureOldFPCCall;
  700. begin
  701. ParseProcedure('; oldfpccall;','');
  702. AssertProc([],ccoldfpccall,0);
  703. end;
  704. Procedure TTestProcedureFunction.TestFunctionOldFPCCall;
  705. begin
  706. ParseFunction('','','',ccOldFPCCall);
  707. AssertFunc([],ccOldFPCCall,0);
  708. end;
  709. Procedure TTestProcedureFunction.TestProcedurePublic;
  710. begin
  711. ParseProcedure('; public name ''myfunc'';','');
  712. AssertProc([pmPublic],ccDefault,0);
  713. AssertExpression('Public name',Proc.PublicName,pekString,'''myfunc''');
  714. end;
  715. Procedure TTestProcedureFunction.TestProcedurePublicIdent;
  716. begin
  717. ParseProcedure('; public name exportname;','');
  718. AssertProc([pmPublic],ccDefault,0);
  719. AssertExpression('Public name',Proc.PublicName,pekIdent,'exportname');
  720. end;
  721. Procedure TTestProcedureFunction.TestFunctionPublic;
  722. begin
  723. AddDeclaration('function A : Integer; public name exportname');
  724. ParseFunction;
  725. AssertFunc([pmPublic],ccDefault,0);
  726. AssertExpression('Public name',Func.PublicName,pekIdent,'exportname');
  727. end;
  728. Procedure TTestProcedureFunction.TestProcedureCdeclPublic;
  729. begin
  730. ParseProcedure('; cdecl; public name exportname;','');
  731. AssertProc([pmPublic],ccCDecl,0);
  732. AssertExpression('Public name',Proc.PublicName,pekIdent,'exportname');
  733. end;
  734. Procedure TTestProcedureFunction.TestFunctionCdeclPublic;
  735. begin
  736. AddDeclaration('function A : Integer; cdecl; public name exportname');
  737. ParseFunction;
  738. AssertFunc([pmPublic],ccCDecl,0);
  739. AssertExpression('Public name',Func.PublicName,pekIdent,'exportname');
  740. end;
  741. Procedure TTestProcedureFunction.TestProcedureOverload;
  742. begin
  743. ParseProcedure('; overload;','');
  744. AssertProc([pmOverload],ccDefault,0);
  745. end;
  746. Procedure TTestProcedureFunction.TestFunctionOverload;
  747. begin
  748. AddDeclaration('function A : Integer; overload');
  749. ParseFunction;
  750. AssertFunc([pmOverload],ccDefault,0);
  751. end;
  752. Procedure TTestProcedureFunction.TestProcedureVarargs;
  753. begin
  754. ParseProcedure('; varargs;','');
  755. AssertProc([pmVarArgs],ccDefault,0);
  756. end;
  757. Procedure TTestProcedureFunction.TestFunctionVarArgs;
  758. begin
  759. AddDeclaration('function A : Integer; varargs');
  760. ParseFunction;
  761. AssertFunc([pmVarArgs],ccDefault,0);
  762. end;
  763. Procedure TTestProcedureFunction.TestProcedureCDeclVarargs;
  764. begin
  765. ParseProcedure(';cdecl; varargs;','');
  766. AssertProc([pmVarArgs],ccCDecl,0);
  767. end;
  768. Procedure TTestProcedureFunction.TestFunctionCDeclVarArgs;
  769. begin
  770. AddDeclaration('function A : Integer; cdecl; varargs');
  771. ParseFunction;
  772. AssertFunc([pmVarArgs],ccCdecl,0);
  773. end;
  774. Procedure TTestProcedureFunction.TestProcedureForwardInterface;
  775. begin
  776. AddDeclaration('procedure A; forward;');
  777. AssertException(EParserError,@ParseProcedure);
  778. end;
  779. Procedure TTestProcedureFunction.TestFunctionForwardInterface;
  780. begin
  781. AddDeclaration('function A : integer; forward;');
  782. AssertException(EParserError,@ParseFunction);
  783. end;
  784. Procedure TTestProcedureFunction.TestProcedureForward;
  785. begin
  786. UseImplementation:=True;
  787. AddDeclaration('procedure A; forward;');
  788. ParseProcedure;
  789. AssertProc([pmforward],ccDefault,0);
  790. end;
  791. Procedure TTestProcedureFunction.TestFunctionForward;
  792. begin
  793. UseImplementation:=True;
  794. AddDeclaration('function A : integer; forward;');
  795. ParseFunction;
  796. AssertFunc([pmforward],ccDefault,0);
  797. end;
  798. Procedure TTestProcedureFunction.TestProcedureCdeclForward;
  799. begin
  800. UseImplementation:=True;
  801. AddDeclaration('procedure A; cdecl; forward;');
  802. ParseProcedure;
  803. AssertProc([pmforward],ccCDecl,0);
  804. end;
  805. Procedure TTestProcedureFunction.TestFunctionCDeclForward;
  806. begin
  807. UseImplementation:=True;
  808. AddDeclaration('function A : integer; cdecl; forward;');
  809. ParseFunction;
  810. AssertFunc([pmforward],ccCDecl,0);
  811. end;
  812. Procedure TTestProcedureFunction.TestProcedureCompilerProc;
  813. begin
  814. ParseProcedure(';compilerproc;','');
  815. AssertProc([pmCompilerProc],ccDefault,0);
  816. end;
  817. Procedure TTestProcedureFunction.TestFunctionCompilerProc;
  818. begin
  819. AddDeclaration('function A : Integer; compilerproc');
  820. ParseFunction;
  821. AssertFunc([pmCompilerProc],ccDefault,0);
  822. end;
  823. Procedure TTestProcedureFunction.TestProcedureCDeclCompilerProc;
  824. begin
  825. ParseProcedure(';cdecl;compilerproc;','');
  826. AssertProc([pmCompilerProc],ccCDecl,0);
  827. end;
  828. Procedure TTestProcedureFunction.TestFunctionCDeclCompilerProc;
  829. begin
  830. AddDeclaration('function A : Integer; cdecl; compilerproc');
  831. ParseFunction;
  832. AssertFunc([pmCompilerProc],ccCDecl,0);
  833. end;
  834. Procedure TTestProcedureFunction.TestProcedureAssembler;
  835. begin
  836. ParseProcedure(';assembler;','');
  837. AssertProc([pmAssembler],ccDefault,0);
  838. end;
  839. Procedure TTestProcedureFunction.TestFunctionAssembler;
  840. begin
  841. AddDeclaration('function A : Integer; assembler');
  842. ParseFunction;
  843. AssertFunc([pmAssembler],ccDefault,0);
  844. end;
  845. Procedure TTestProcedureFunction.TestProcedureCDeclAssembler;
  846. begin
  847. ParseProcedure(';cdecl;assembler;','');
  848. AssertProc([pmAssembler],ccCDecl,0);
  849. end;
  850. Procedure TTestProcedureFunction.TestFunctionCDeclAssembler;
  851. begin
  852. AddDeclaration('function A : Integer; cdecl; assembler');
  853. ParseFunction;
  854. AssertFunc([pmAssembler],ccCDecl,0);
  855. end;
  856. Procedure TTestProcedureFunction.TestProcedureExport;
  857. begin
  858. ParseProcedure(';export;','');
  859. AssertProc([pmExport],ccDefault,0);
  860. end;
  861. Procedure TTestProcedureFunction.TestFunctionExport;
  862. begin
  863. AddDeclaration('function A : Integer; export');
  864. ParseFunction;
  865. AssertFunc([pmExport],ccDefault,0);
  866. end;
  867. Procedure TTestProcedureFunction.TestProcedureCDeclExport;
  868. begin
  869. ParseProcedure('cdecl;export;','');
  870. AssertProc([pmExport],ccCDecl,0);
  871. end;
  872. Procedure TTestProcedureFunction.TestFunctionCDeclExport;
  873. begin
  874. AddDeclaration('function A : Integer; cdecl; export');
  875. ParseFunction;
  876. AssertFunc([pmExport],ccCDecl,0);
  877. end;
  878. Procedure TTestProcedureFunction.TestProcedureExternal;
  879. begin
  880. ParseProcedure(';external','');
  881. AssertProc([pmExternal],ccDefault,0);
  882. AssertNull('No Library name expression',Proc.LibraryExpr);
  883. end;
  884. Procedure TTestProcedureFunction.TestFunctionExternal;
  885. begin
  886. AddDeclaration('function A : Integer; external');
  887. ParseFunction;
  888. AssertFunc([pmExternal],ccDefault,0);
  889. AssertNull('No Library name expression',Func.LibraryExpr);
  890. end;
  891. Procedure TTestProcedureFunction.TestProcedureExternalLibName;
  892. begin
  893. ParseProcedure(';external ''libname''','');
  894. AssertProc([pmExternal],ccDefault,0);
  895. AssertExpression('Library name expression',Proc.LibraryExpr,pekString,'''libname''');
  896. end;
  897. Procedure TTestProcedureFunction.TestFunctionExternalLibName;
  898. begin
  899. AddDeclaration('function A : Integer; external ''libname''');
  900. ParseFunction;
  901. AssertFunc([pmExternal],ccDefault,0);
  902. AssertExpression('Library name expression',Func.LibraryExpr,pekString,'''libname''');
  903. end;
  904. Procedure TTestProcedureFunction.TestProcedureExternalLibNameName;
  905. begin
  906. ParseProcedure(';external ''libname'' name ''symbolname''','');
  907. AssertProc([pmExternal],ccDefault,0);
  908. AssertExpression('Library name expression',Proc.LibraryExpr,pekString,'''libname''');
  909. AssertExpression('Library symbol expression',Proc.LibrarySymbolName,pekString,'''symbolname''');
  910. end;
  911. Procedure TTestProcedureFunction.TestFunctionExternalLibNameName;
  912. begin
  913. AddDeclaration('function A : Integer; external ''libname'' name ''symbolname''');
  914. ParseFunction;
  915. AssertFunc([pmExternal],ccDefault,0);
  916. AssertExpression('Library name expression',Func.LibraryExpr,pekString,'''libname''');
  917. AssertExpression('Library symbol expression',Func.LibrarySymbolName,pekString,'''symbolname''');
  918. end;
  919. Procedure TTestProcedureFunction.TestProcedureExternalName;
  920. begin
  921. ParseProcedure(';external name ''symbolname''','');
  922. AssertProc([pmExternal],ccDefault,0);
  923. AssertNull('No Library name expression',Proc.LibraryExpr);
  924. AssertExpression('Library symbol expression',Proc.LibrarySymbolName,pekString,'''symbolname''');
  925. end;
  926. Procedure TTestProcedureFunction.TestFunctionExternalName;
  927. begin
  928. AddDeclaration('function A : Integer; external name ''symbolname''');
  929. ParseFunction;
  930. AssertFunc([pmExternal],ccDefault,0);
  931. AssertNull('No Library name expression',Func.LibraryExpr);
  932. AssertExpression('Library symbol expression',Func.LibrarySymbolName,pekString,'''symbolname''');
  933. end;
  934. Procedure TTestProcedureFunction.TestProcedureCdeclExternal;
  935. begin
  936. ParseProcedure('; cdecl; external','');
  937. AssertProc([pmExternal],ccCdecl,0);
  938. AssertNull('No Library name expression',Proc.LibraryExpr);
  939. end;
  940. Procedure TTestProcedureFunction.TestFunctionCdeclExternal;
  941. begin
  942. AddDeclaration('function A : Integer; cdecl; external');
  943. ParseFunction;
  944. AssertFunc([pmExternal],ccCdecl,0);
  945. AssertNull('No Library name expression',Func.LibraryExpr);
  946. end;
  947. Procedure TTestProcedureFunction.TestProcedureCdeclExternalLibName;
  948. begin
  949. ParseProcedure('; cdecl; external ''libname''','');
  950. AssertProc([pmExternal],ccCdecl,0);
  951. AssertExpression('Library name expression',Proc.LibraryExpr,pekString,'''libname''');
  952. end;
  953. Procedure TTestProcedureFunction.TestFunctionCdeclExternalLibName;
  954. begin
  955. AddDeclaration('function A : Integer; cdecl; external ''libname''');
  956. ParseFunction;
  957. AssertFunc([pmExternal],ccCdecl,0);
  958. AssertExpression('Library name expression',Func.LibraryExpr,pekString,'''libname''');
  959. end;
  960. Procedure TTestProcedureFunction.TestProcedureCdeclExternalLibNameName;
  961. begin
  962. ParseProcedure('; cdecl; external ''libname'' name ''symbolname''','');
  963. AssertProc([pmExternal],ccCdecl,0);
  964. AssertExpression('Library name expression',Proc.LibraryExpr,pekString,'''libname''');
  965. AssertExpression('Library symbol expression',Proc.LibrarySymbolName,pekString,'''symbolname''');
  966. end;
  967. Procedure TTestProcedureFunction.TestFunctionCdeclExternalLibNameName;
  968. begin
  969. AddDeclaration('function A : Integer; cdecl; external ''libname'' name ''symbolname''');
  970. ParseFunction;
  971. AssertFunc([pmExternal],ccCdecl,0);
  972. AssertExpression('Library name expression',Func.LibraryExpr,pekString,'''libname''');
  973. AssertExpression('Library symbol expression',Func.LibrarySymbolName,pekString,'''symbolname''');
  974. end;
  975. Procedure TTestProcedureFunction.TestProcedureCdeclExternalName;
  976. begin
  977. ParseProcedure('; cdecl; external name ''symbolname''','');
  978. AssertProc([pmExternal],ccCdecl,0);
  979. AssertNull('No Library name expression',Proc.LibraryExpr);
  980. AssertExpression('Library symbol expression',Proc.LibrarySymbolName,pekString,'''symbolname''');
  981. end;
  982. Procedure TTestProcedureFunction.TestFunctionCdeclExternalName;
  983. begin
  984. AddDeclaration('function A : Integer; cdecl; external name ''symbolname''');
  985. ParseFunction;
  986. AssertFunc([pmExternal],ccCdecl,0);
  987. AssertNull('No Library name expression',Func.LibraryExpr);
  988. AssertExpression('Library symbol expression',Func.LibrarySymbolName,pekString,'''symbolname''');
  989. end;
  990. procedure TTestProcedureFunction.SetUp;
  991. begin
  992. Inherited;
  993. end;
  994. procedure TTestProcedureFunction.TearDown;
  995. begin
  996. Inherited;
  997. end;
  998. Procedure TTestProcedureFunction.AssertComment;
  999. begin
  1000. AssertEquals('Correct comment',' A comment'+sLineBreak,FProc.DocComment);
  1001. end;
  1002. initialization
  1003. RegisterTest(TTestProcedureFunction);
  1004. end.