tcprocfunc.pas 34 KB

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