tcclasstype.pas 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029
  1. unit tcclasstype;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, pscanner,pparser, pastree, testregistry, tctypeparser;
  6. type
  7. { TTestClassType }
  8. TTestClassType = Class(TBaseTestTypeParser)
  9. Private
  10. FDecl : TStrings;
  11. FClass : TPasClassType;
  12. FMember1: TPasElement;
  13. FParent : String;
  14. FEnded,
  15. FStarted: Boolean;
  16. procedure AssertGenericClass(C: TPasClassType);
  17. procedure AssertSpecializedClass(C: TPasSpecializeType);
  18. function GetC(AIndex: Integer): TPasConst;
  19. function GetF1: TPasVariable;
  20. function GetM(AIndex : Integer): TPasElement;
  21. function GetMM(AIndex : Integer): TPasProcedure;
  22. function GetMF1: TPasFunction;
  23. function GetP1: TPasProperty;
  24. function GetP2: TPasProperty;
  25. function GetT(AIndex : Integer) : TPasType;
  26. protected
  27. Procedure StartClass (AncestorName : String = 'TObject'; InterfaceList : String = '');
  28. Procedure StartExternalClass (AParent : String; AExternalName,AExternalNameSpace : String );
  29. Procedure StartClassHelper (ForType : String = 'TOriginal'; AParent : String = 'TObject');
  30. Procedure StartInterface (AParent : String = 'IInterface'; UUID : String = ''; Disp : Boolean = False);
  31. Procedure StartRecordHelper (ForType : String = 'TOriginal'; AParent : String = 'TObject');
  32. Procedure StartVisibility(A : TPasMemberVisibility);
  33. Procedure EndClass(AEnd : String = 'end');
  34. Procedure AddMember(S : String);
  35. Procedure ParseClass;
  36. Procedure ParseClassFail(Msg: string; MsgNumber: integer);
  37. Procedure DoParseClass(FromSpecial : Boolean = False);
  38. procedure SetUp; override;
  39. procedure TearDown; override;
  40. procedure DefaultMethod;
  41. Procedure AssertParserError(Const Msg : String);
  42. Procedure AssertVisibility(V : TPasMemberVisibility = visDefault; Member : TPasElement = Nil);
  43. procedure AssertMemberType(AType : TClass; Member : TPaselement = Nil);
  44. procedure AssertMemberName(AName : string; Member : TPaselement = Nil);
  45. Procedure AssertProperty(P : TPasProperty; AVisibility : TPasMemberVisibility;AName,ARead,AWrite,AStored,AImplements : String; AArgCount : Integer; ADefault,ANodefault : Boolean);
  46. Property TheClass : TPasClassType Read FClass;
  47. Property Members[AIndex : Integer] : TPasElement Read GetM;
  48. Property Member1 : TPasElement Read FMember1;
  49. Property Field1 : TPasVariable Read GetF1;
  50. Property Method1 : TPasProcedure Index 0 Read GetMM;
  51. Property Method2 : TPasProcedure Index 1 Read GetMM;
  52. Property Method3 : TPasProcedure index 2 Read GetMM;
  53. Property FunctionMethod1 : TPasFunction Read GetMF1;
  54. Property Property1 : TPasProperty Read GetP1;
  55. Property Property2 : TPasProperty Read GetP2;
  56. Property Type1 : TPasType Index 0 Read GetT;
  57. Property Type2 : TPasType Index 1 Read GetT;
  58. Property Const1 : TPasConst Index 0 Read GetC;
  59. Property Const2 : TPasConst Index 1 Read GetC;
  60. published
  61. procedure TestEmpty;
  62. procedure TestEmptyComment;
  63. procedure TestEmptyDeprecated;
  64. procedure TestEmptyEnd;
  65. procedure TestEmptyEndNoParent;
  66. Procedure TestOneInterface;
  67. Procedure TestTwoInterfaces;
  68. procedure TestOneSpecializedClass;
  69. procedure TestOneSpecializedClassInterface;
  70. Procedure TestOneField;
  71. Procedure TestOneFieldComment;
  72. procedure TestOneFieldStatic;
  73. Procedure TestOneHelperField;
  74. Procedure TestOneVarField;
  75. Procedure TestOneClassField;
  76. Procedure TestOneFieldVisibility;
  77. Procedure TestOneFieldDeprecated;
  78. Procedure TestTwoFields;
  79. Procedure TestTwoFieldsB;
  80. Procedure TestTwoVarFieldsB;
  81. procedure TestNoVarFields;
  82. procedure TestVarClassFunction;
  83. procedure TestClassVarClassFunction;
  84. Procedure TestTwoFieldsVisibility;
  85. Procedure TestConstProtectedEnd;
  86. Procedure TestTypeProtectedEnd;
  87. Procedure TestVarProtectedEnd;
  88. procedure TestHintFieldDeprecated;
  89. procedure TestHintFieldPlatform;
  90. procedure TestHintFieldExperimental;
  91. procedure TestHintFieldLibraryError;
  92. procedure TestHintFieldUninmplemented;
  93. Procedure TestOneVarFieldExternalName;
  94. procedure TestOneVarFieldExternalNameSemicolon;
  95. Procedure TestMethodSimple;
  96. Procedure TestMethodSimpleComment;
  97. Procedure TestMethodWithDotFails;
  98. Procedure TestClassMethodSimple;
  99. Procedure TestClassMethodSimpleComment;
  100. Procedure TestConstructor;
  101. Procedure TestClassConstructor;
  102. Procedure TestDestructor;
  103. Procedure TestClassDestructor;
  104. Procedure TestFunctionMethodSimple;
  105. Procedure TestClassFunctionMethodSimple;
  106. Procedure TestMethodOneArg;
  107. Procedure TestMethodVirtual;
  108. Procedure TestMethodVirtualSemicolon;
  109. Procedure TestMethodVirtualAbstract;
  110. procedure TestMethodVirtualAbstractFinal;
  111. Procedure TestMethodOverride;
  112. procedure TestMethodDynamic;
  113. procedure TestMethodReintroduce;
  114. procedure TestMethodInline;
  115. Procedure TestMethodVisibility;
  116. Procedure TestMethodSVisibility;
  117. Procedure TestMethodOverloadVisibility;
  118. Procedure TestMethodHint;
  119. Procedure TestMethodVirtualHint;
  120. Procedure TestIntegerMessageMethod;
  121. Procedure TestStringMessageMethod;
  122. Procedure Test2Methods;
  123. Procedure Test2MethodsDifferentVisibility;
  124. Procedure TestPropertyRedeclare;
  125. Procedure TestPropertyRedeclareComment;
  126. Procedure TestPropertyRedeclareDefault;
  127. Procedure TestPropertyReadOnly;
  128. Procedure TestPropertyReadWrite;
  129. Procedure TestPropertyWriteOnly;
  130. Procedure TestPropertyDefault;
  131. Procedure TestPropertyNoDefault;
  132. Procedure TestPropertyIndex;
  133. Procedure TestPropertyStored;
  134. Procedure TestPropertyStoredFalse;
  135. Procedure TestPropertyFullyQualifiedType;
  136. Procedure TestPropertyArrayReadOnly;
  137. Procedure TestPropertyArrayReadWrite;
  138. Procedure TestPropertyArrayReadOnlyDefault;
  139. Procedure TestPropertyArrayReadWriteDefault;
  140. Procedure TestPropertyArrayMultiDimReadOnly;
  141. Procedure TestPropertyImplements;
  142. Procedure TestPropertyImplementsFullyQualifiedName;
  143. Procedure TestPropertyReadFromRecordField;
  144. procedure TestPropertyReadFromArrayField;
  145. procedure TestPropertyReadWriteFromRecordField;
  146. procedure TestPropertyDeprecated;
  147. procedure TestPropertyDeprecatedMessage;
  148. Procedure TestExternalClass;
  149. Procedure TestExternalClassNoNameSpace;
  150. Procedure TestExternalClassNoNameKeyWord;
  151. Procedure TestExternalClassNoName;
  152. Procedure TestLocalSimpleType;
  153. Procedure TestLocalSimpleTypes;
  154. Procedure TestLocalSimpleConst;
  155. Procedure TestLocalSimpleConsts;
  156. procedure TestClassHelperEmpty;
  157. procedure TestClassHelperParentedEmpty;
  158. procedure TestClassHelperOneMethod;
  159. procedure TestInterfaceEmpty;
  160. procedure TestInterfaceDisp;
  161. procedure TestInterfaceParentedEmpty;
  162. procedure TestInterfaceOneMethod;
  163. procedure TestInterfaceDispIDMethod;
  164. procedure TestInterfaceDispIDMethod2;
  165. procedure TestInterfaceProperty;
  166. procedure TestInterfaceDispProperty;
  167. procedure TestInterfaceDispPropertyReadOnly;
  168. procedure TestInterfaceNoConstructor;
  169. procedure TestInterfaceNoDestructor;
  170. procedure TestInterfaceNoFields;
  171. procedure TestInterfaceUUID;
  172. procedure TestInterfaceUUIDParentedEmpty;
  173. procedure TestInterfaceUUIDOneMethod;
  174. procedure TestRecordHelperEmpty;
  175. procedure TestRecordHelperParentedEmpty;
  176. procedure TestRecordHelperOneMethod;
  177. end;
  178. implementation
  179. { TTestClassType }
  180. function TTestClassType.GetM(AIndex : Integer): TPasElement;
  181. begin
  182. AssertNotNull('Have class',TheClass);
  183. if (AIndex>=TheClass.Members.Count) then
  184. Fail('No member '+IntToStr(AIndex));
  185. AssertNotNull('Have member'+IntToStr(AIndex),TheClass.Members[AIndex]);
  186. If Not (TObject(TheClass.Members[AIndex]) is TPasElement) then
  187. Fail('Member '+IntTostr(AIndex)+' is not a Tpaselement');
  188. Result:=TPasElement(TheClass.Members[AIndex])
  189. end;
  190. function TTestClassType.GetMM(AIndex: Integer): TPasProcedure;
  191. begin
  192. AssertNotNull('Have member '+IntToStr(AIndex),Members[AIndex]);
  193. AssertEquals('Member is method '+IntToStr(AIndex),TPasProcedure,Members[Aindex].ClassType);
  194. Result:=TPasProcedure(Members[Aindex]);
  195. end;
  196. function TTestClassType.GetMF1: TPasFunction;
  197. begin
  198. AssertNotNull('Have 1 member',Member1);
  199. AssertEquals('Member 1 is function method',TPasFunction,Member1.ClassType);
  200. Result:=TPasFunction(Member1);
  201. end;
  202. function TTestClassType.GetP1: TPasProperty;
  203. begin
  204. AssertNotNull('Have 1 member',Member1);
  205. AssertEquals('Member 1 is property',TPasProperty,Member1.ClassType);
  206. Result:=TPasProperty(Member1);
  207. end;
  208. function TTestClassType.GetP2: TPasProperty;
  209. begin
  210. AssertNotNull('Have 2 members',Members[1]);
  211. AssertEquals('Member 1 is property',TPasProperty,Members[1].ClassType);
  212. Result:=TPasProperty(Members[1]);
  213. end;
  214. function TTestClassType.GetT(AIndex: Integer): TPasType;
  215. begin
  216. AssertNotNull('Have member '+IntToStr(AIndex),Members[AIndex]);
  217. if not (Members[AIndex] is TPasType) then
  218. Fail('Member '+IntToStr(AIndex)+' is not a type');
  219. Result:=TPasType(Members[AIndex]);
  220. end;
  221. function TTestClassType.GetF1: TPasVariable;
  222. begin
  223. AssertNotNull('Have 1 member',Member1);
  224. AssertEquals('Member 1 is field',TPasVariable,Member1.ClassType);
  225. Result:=TPasVariable(Member1);
  226. end;
  227. function TTestClassType.GetC(AIndex: Integer): TPasConst;
  228. begin
  229. AssertNotNull('Have member '+IntToStr(AIndex),Members[AIndex]);
  230. if not (Members[AIndex] is TPasConst) then
  231. Fail('Member '+IntToStr(AIndex)+' is not a const');
  232. Result:=TPasConst(Members[AIndex]);
  233. end;
  234. procedure TTestClassType.StartClass(AncestorName: String; InterfaceList: String);
  235. Var
  236. S : String;
  237. begin
  238. if FStarted then
  239. Fail('TTestClassType.StartClass already started');
  240. FStarted:=True;
  241. S:='TMyClass = Class';
  242. if (AncestorName<>'') then
  243. begin
  244. S:=S+'('+AncestorName;
  245. if (InterfaceList<>'') then
  246. S:=S+','+InterfaceList;
  247. S:=S+')';
  248. end;
  249. FDecl.Add(S);
  250. FParent:=AncestorName;
  251. end;
  252. procedure TTestClassType.StartExternalClass(AParent: String; AExternalName,
  253. AExternalNameSpace: String);
  254. Var
  255. S : String;
  256. begin
  257. FStarted:=True;
  258. S:=Format('TMyClass = Class external ''%s'' name ''%s'' ',[AExternalNameSpace,AExternalName]);
  259. if (AParent<>'') then
  260. S:=S+'('+AParent+')';
  261. FDecl.Add(S);
  262. FParent:=AParent;
  263. end;
  264. procedure TTestClassType.StartClassHelper(ForType: String; AParent: String);
  265. Var
  266. S : String;
  267. begin
  268. FStarted:=True;
  269. S:='TMyClass = Class Helper';
  270. if (AParent<>'') then
  271. begin
  272. S:=S+'('+AParent;
  273. S:=S+')';
  274. end;
  275. S:=S+' for '+ForType;
  276. FDecl.Add(S);
  277. FParent:=AParent;
  278. end;
  279. procedure TTestClassType.StartInterface(AParent: String; UUID: String;
  280. Disp: Boolean = False);
  281. Var
  282. S : String;
  283. begin
  284. FStarted:=True;
  285. if Disp then
  286. S:='TMyClass = DispInterface'
  287. else
  288. S:='TMyClass = Interface';
  289. if (AParent<>'') then
  290. S:=S+' ('+AParent+')';
  291. if (UUID<>'') then
  292. S:=S+' ['''+UUID+''']';
  293. FDecl.Add(S);
  294. FParent:=AParent;
  295. end;
  296. procedure TTestClassType.StartRecordHelper(ForType: String; AParent: String);
  297. Var
  298. S : String;
  299. begin
  300. FStarted:=True;
  301. S:='TMyClass = Record Helper';
  302. if (AParent<>'') then
  303. begin
  304. S:=S+'('+AParent;
  305. S:=S+')';
  306. end;
  307. S:=S+' for '+ForType;
  308. FDecl.Add(S);
  309. FParent:=AParent;
  310. end;
  311. procedure TTestClassType.StartVisibility(A: TPasMemberVisibility);
  312. begin
  313. if not FStarted then
  314. StartClass;
  315. FDecl.Add(' '+VisibilityNames[A]);
  316. end;
  317. procedure TTestClassType.EndClass(AEnd: String);
  318. begin
  319. if FEnded then exit;
  320. if not FStarted then
  321. StartClass;
  322. FEnded:=True;
  323. if (AEnd<>'') then
  324. FDecl.Add(' '+AEnd);
  325. end;
  326. procedure TTestClassType.AddMember(S: String);
  327. begin
  328. if Not FStarted then
  329. StartClass;
  330. FDecl.Add(' '+S+';');
  331. end;
  332. procedure TTestClassType.ParseClass;
  333. begin
  334. DoParseClass(False);
  335. end;
  336. procedure TTestClassType.ParseClassFail(Msg: string; MsgNumber: integer);
  337. var
  338. ok: Boolean;
  339. begin
  340. ok:=false;
  341. try
  342. ParseClass;
  343. except
  344. on E: EParserError do
  345. begin
  346. AssertEquals('Expected {'+Msg+'}, but got msg {'+Parser.LastMsg+'}',MsgNumber,Parser.LastMsgNumber);
  347. ok:=true;
  348. end;
  349. end;
  350. AssertEquals('Missing parser error {'+Msg+'} ('+IntToStr(MsgNumber)+')',true,ok);
  351. end;
  352. procedure TTestClassType.DoParseClass(FromSpecial: Boolean);
  353. var
  354. AncestorType: TPasType;
  355. begin
  356. EndClass;
  357. Add('Type');
  358. if AddComment then
  359. begin
  360. Add('// A comment');
  361. Engine.NeedComments:=True;
  362. end;
  363. Add(' '+TrimRight(FDecl.Text)+';');
  364. ParseDeclarations;
  365. AssertEquals('One class type definition',1,Declarations.Classes.Count);
  366. AssertEquals('First declaration is type definition.',TPasClassType,TObject(Declarations.Classes[0]).ClassType);
  367. FClass:=TObject(Declarations.Classes[0]) as TPasClassType;
  368. TheType:=FClass; // So assertcomment can get to it
  369. if (FParent<>'') then
  370. begin
  371. AssertNotNull('Have parent class',TheClass.AncestorType);
  372. if FromSpecial then
  373. begin
  374. AncestorType:=TheClass.AncestorType;
  375. if AncestorType is TPasSpecializeType then
  376. begin
  377. AncestorType:=TPasSpecializeType(AncestorType).DestType;
  378. AssertEquals('Parent class',TPasUnresolvedTypeRef,AncestorType.ClassType);
  379. end
  380. else
  381. AssertEquals('Parent class',TPasClassType,AncestorType.ClassType);
  382. end
  383. else
  384. begin
  385. AssertEquals('Parent class',TPasUnresolvedTypeRef,TheClass.AncestorType.ClassType);
  386. AssertEquals('Parent class name',FParent,TPasUnresolvedTypeRef(TheClass.AncestorType).Name);
  387. end;
  388. end;
  389. if (TheClass.ObjKind<>okInterface) then
  390. AssertNull('No interface, No GUID',TheClass.GUIDExpr);
  391. if (Not (TheClass.ObjKind in [okClassHelper,okRecordHelper])) then
  392. AssertNull('No helperfortype if not helper',TheClass.HelperForType);
  393. if TheClass.Members.Count>0 then
  394. FMember1:=TObject(TheClass.Members[0]) as TPaselement;
  395. end;
  396. procedure TTestClassType.SetUp;
  397. begin
  398. inherited SetUp;
  399. FDecl:=TStringList.Create;
  400. FClass:=Nil;
  401. FParent:='';
  402. FStarted:=False;
  403. end;
  404. procedure TTestClassType.TearDown;
  405. begin
  406. FClass:=Nil;
  407. FreeAndNil(FDecl);
  408. inherited TearDown;
  409. end;
  410. procedure TTestClassType.AssertVisibility(V: TPasMemberVisibility;
  411. Member: TPasElement);
  412. begin
  413. If Member=Nil then
  414. Member:=Member1;
  415. AssertNotNull('Cannot get visibility of null member',Member);
  416. AssertEquals('Visibility of '+Member.Name,V,Member.Visibility);
  417. end;
  418. procedure TTestClassType.AssertMemberType(AType: TClass; Member: TPaselement);
  419. begin
  420. If Member=Nil then
  421. Member:=Member1;
  422. AssertEquals('Member '+Member.Name+' type',AType,Member.ClassType);
  423. end;
  424. procedure TTestClassType.AssertMemberName(AName: string; Member: TPaselement);
  425. begin
  426. If Member=Nil then
  427. Member:=Member1;
  428. AssertEquals('Member name ',AName,Member.Name)
  429. end;
  430. procedure TTestClassType.AssertProperty(P: TPasProperty;
  431. AVisibility: TPasMemberVisibility; AName, ARead, AWrite, AStored,
  432. AImplements: String; AArgCount: Integer; ADefault, ANodefault: Boolean);
  433. begin
  434. AssertEquals('Property Name',AName,P.Name);
  435. AssertEquals(P.Name+': Visibility',AVisibility,P.Visibility);
  436. Assertequals(P.Name+': No args',AArgCount,P.Args.Count);
  437. Assertequals(P.Name+': Read accessor',ARead,P.ReadAccessorName);
  438. Assertequals(P.Name+': Write accessor',AWrite,P.WriteAccessorName);
  439. Assertequals(P.Name+': implements name',AImplements,P.ImplementsName);
  440. Assertequals(P.Name+': stored accessor name',AStored,P.StoredAccessorName);
  441. Assertequals(P.Name+': default',ADefault,P.IsDefault);
  442. Assertequals(P.Name+': nodefault',ANodefault,P.IsNoDefault);
  443. end;
  444. procedure TTestClassType.TestEmpty;
  445. begin
  446. EndClass('');
  447. ParseClass;
  448. AssertEquals('No members',0,TheClass.Members.Count);
  449. end;
  450. procedure TTestClassType.TestEmptyComment;
  451. begin
  452. AddComment:=True;
  453. TestEmpty;
  454. AssertComment;
  455. end;
  456. procedure TTestClassType.TestEmptyDeprecated;
  457. begin
  458. EndClass('end deprecated');
  459. ParseClass;
  460. AssertEquals('No members',0,TheClass.Members.Count);
  461. HaveHint(hDeprecated,Theclass.Hints);
  462. end;
  463. procedure TTestClassType.TestEmptyEnd;
  464. begin
  465. ParseClass;
  466. AssertEquals('No members',0,TheClass.Members.Count);
  467. end;
  468. procedure TTestClassType.TestEmptyEndNoParent;
  469. begin
  470. StartClass('','');
  471. ParseClass;
  472. AssertEquals('No members',0,TheClass.Members.Count);
  473. end;
  474. procedure TTestClassType.TestOneInterface;
  475. begin
  476. StartClass('TObject','ISomething');
  477. ParseClass;
  478. AssertEquals('Have 1 interface',1,TheClass.Interfaces.Count);
  479. AssertNotNull('Correct class',TheClass.Interfaces[0]);
  480. AssertEquals('Correct class',TPasUnresolvedTypeRef,TObject(TheClass.Interfaces[0]).ClassType);
  481. AssertEquals('Interface name','ISomething',TPasUnresolvedTypeRef(TheClass.Interfaces[0]).Name);
  482. end;
  483. procedure TTestClassType.TestTwoInterfaces;
  484. begin
  485. StartClass('TObject','ISomething, ISomethingElse');
  486. ParseClass;
  487. AssertEquals('Have 2 interface',2,TheClass.Interfaces.Count);
  488. AssertNotNull('Correct class',TheClass.Interfaces[0]);
  489. AssertEquals('Correct class',TPasUnresolvedTypeRef,TObject(TheClass.Interfaces[0]).ClassType);
  490. AssertEquals('Interface name','ISomething',TPasUnresolvedTypeRef(TheClass.Interfaces[0]).Name);
  491. AssertNotNull('Correct class',TheClass.Interfaces[1]);
  492. AssertEquals('Correct class',TPasUnresolvedTypeRef,TObject(TheClass.Interfaces[1]).ClassType);
  493. AssertEquals('Interface name','ISomethingElse',TPasUnresolvedTypeRef(TheClass.Interfaces[1]).Name);
  494. end;
  495. procedure TTestClassType.AssertGenericClass(C : TPasClassType);
  496. begin
  497. AssertEquals('Parent class name is empty','',C.Name);
  498. AssertNotNull('Have ancestor type',C.AncestorType);
  499. AssertEquals('Have ancestor type name','TMyList',C.AncestorType.Name);
  500. AssertNotNull('Have generic template types',C.GenericTemplateTypes);
  501. AssertEquals('Have generic template types',1,C.GenericTemplateTypes.Count);
  502. AssertEquals('Class name ',TPasGenericTemplateType,TObject(C.GenericTemplateTypes[0]).ClassType);
  503. AssertEquals('Have generic template types','Integer',TPasElement(C.GenericTemplateTypes[0]).Name);
  504. end;
  505. procedure TTestClassType.AssertSpecializedClass(C: TPasSpecializeType);
  506. begin
  507. AssertEquals('Parent class name is empty','',C.Name);
  508. AssertNotNull('Have dest type',C.DestType);
  509. AssertEquals('Have dest type name','TMyList',C.DestType.Name);
  510. AssertNotNull('Have param types',C.Params);
  511. AssertEquals('Have one param type',1,C.Params.Count);
  512. AssertNotNull('First Param ',C.Params[0]);
  513. AssertEquals('First Param expr',TPrimitiveExpr,TObject(C.Params[0]).ClassType);
  514. AssertEquals('Has specialize param integer','Integer',TPrimitiveExpr(C.Params[0]).Value);
  515. end;
  516. procedure TTestClassType.TestOneSpecializedClass;
  517. Var
  518. C : TPasSpecializeType;
  519. begin
  520. StartClass('Specialize TMyList<Integer>','');
  521. DoParseClass(True);
  522. C:=TPasSpecializeType(TheClass.AncestorType);
  523. AssertSpecializedClass(C);
  524. end;
  525. procedure TTestClassType.TestOneSpecializedClassInterface;
  526. Var
  527. C : TPasSpecializeType;
  528. begin
  529. StartClass('Specialize TMyList<Integer>','ISomething');
  530. DoParseClass(True);
  531. C:=TPasSpecializeType(TheClass.AncestorType);
  532. AssertSpecializedClass(C);
  533. AssertEquals('Have 1 interface',1,TheClass.Interfaces.Count);
  534. AssertNotNull('Correct class',TheClass.Interfaces[0]);
  535. AssertEquals('Correct class',TPasUnresolvedTypeRef,TObject(TheClass.Interfaces[0]).ClassType);
  536. AssertEquals('Interface name','ISomething',TPasUnresolvedTypeRef(TheClass.Interfaces[0]).Name);
  537. end;
  538. procedure TTestClassType.TestOneField;
  539. begin
  540. AddMember('a : integer');
  541. ParseClass;
  542. AssertNotNull('Have 1 field',Field1);
  543. AssertMemberName('a');
  544. AssertVisibility;
  545. end;
  546. procedure TTestClassType.TestOneFieldStatic;
  547. begin
  548. AddMember('a : integer; static');
  549. ParseClass;
  550. AssertNotNull('Have 1 field',Field1);
  551. AssertMemberName('a');
  552. AssertVisibility;
  553. AssertTrue('Have static field',vmStatic in TPasVariable(Field1).VarModifiers);
  554. end;
  555. procedure TTestClassType.TestOneHelperField;
  556. begin
  557. AddMember('helper : integer');
  558. ParseClass;
  559. AssertNotNull('Have 1 field',Field1);
  560. AssertMemberName('helper');
  561. AssertVisibility;
  562. end;
  563. procedure TTestClassType.TestOneFieldComment;
  564. begin
  565. AddComment:=true;
  566. AddMember('{c}a : integer');
  567. ParseClass;
  568. AssertNotNull('Have 1 field',Field1);
  569. AssertEquals('field comment','c'+sLineBreak,Field1.DocComment);
  570. AssertVisibility;
  571. end;
  572. procedure TTestClassType.TestOneVarField;
  573. begin
  574. StartVisibility(visPublished);
  575. FDecl.Add('var');
  576. AddMember('a : integer');
  577. ParseClass;
  578. AssertNotNull('Have 1 field',Field1);
  579. AssertMemberName('a');
  580. AssertVisibility(visPublished);
  581. end;
  582. procedure TTestClassType.TestOneClassField;
  583. begin
  584. StartVisibility(visPublished);
  585. FDecl.Add('class var');
  586. AddMember('a : integer');
  587. ParseClass;
  588. AssertNotNull('Have 1 field',Field1);
  589. AssertMemberName('a');
  590. AssertVisibility(visPublished);
  591. if not (vmClass in Field1.VarModifiers) then
  592. Fail('Field is not a class field');
  593. end;
  594. procedure TTestClassType.TestOneFieldVisibility;
  595. begin
  596. StartVisibility(visPublished);
  597. AddMember('a : integer');
  598. ParseClass;
  599. AssertNotNull('Have 1 field',Field1);
  600. AssertMemberName('a');
  601. AssertVisibility(visPublished);
  602. end;
  603. procedure TTestClassType.TestOneFieldDeprecated;
  604. begin
  605. AddMember('a : integer deprecated');
  606. ParseClass;
  607. AssertNotNull('Have 1 field',Field1);
  608. AssertMemberName('a');
  609. HaveHint(hDeprecated,Member1.Hints);
  610. AssertVisibility;
  611. end;
  612. procedure TTestClassType.TestTwoFields;
  613. begin
  614. AddMember('a : integer');
  615. AddMember('b : integer');
  616. ParseClass;
  617. AssertEquals('2 members',2,TheClass.members.Count);
  618. AssertNotNull('Have field',Field1);
  619. AssertMemberName('a');
  620. AssertVisibility;
  621. AssertNotNull('Have field',Members[1]);
  622. AssertMemberName('b',Members[1]);
  623. AssertMemberType(TPasVariable,Members[1]);
  624. AssertVisibility(visDefault,Members[1]);
  625. end;
  626. procedure TTestClassType.TestTwoFieldsB;
  627. begin
  628. AddMember('a,b : integer');
  629. ParseClass;
  630. AssertEquals('2 members',2,TheClass.members.Count);
  631. AssertNotNull('Have field',Field1);
  632. AssertMemberName('a');
  633. AssertVisibility;
  634. AssertNotNull('Have field',Members[1]);
  635. AssertMemberName('b',Members[1]);
  636. AssertMemberType(TPasVariable,Members[1]);
  637. AssertVisibility(visDefault,Members[1]);
  638. end;
  639. procedure TTestClassType.TestTwoVarFieldsB;
  640. begin
  641. StartVisibility(visPublic);
  642. FDecl.Add('var');
  643. AddMember('a,b : integer');
  644. ParseClass;
  645. AssertEquals('2 members',2,TheClass.members.Count);
  646. AssertNotNull('Have field',Field1);
  647. AssertMemberName('a');
  648. AssertVisibility(vispublic);
  649. AssertNotNull('Have field',Members[1]);
  650. AssertMemberName('b',Members[1]);
  651. AssertMemberType(TPasVariable,Members[1]);
  652. AssertVisibility(visPublic,Members[1]);
  653. end;
  654. procedure TTestClassType.TestNoVarFields;
  655. begin
  656. StartVisibility(visPublic);
  657. FDecl.Add('var');
  658. AddMember('Function b : integer');
  659. ParseClass;
  660. AssertEquals('member count',1,TheClass.members.Count);
  661. AssertNotNull('Have function',Members[0]);
  662. AssertMemberName('b',Members[0]);
  663. AssertMemberType(TPasFunction,Members[0]);
  664. AssertVisibility(visPublic,Members[0]);
  665. end;
  666. procedure TTestClassType.TestVarClassFunction;
  667. begin
  668. StartVisibility(visPublic);
  669. FDecl.Add('var');
  670. AddMember('class Function b : integer');
  671. ParseClass;
  672. AssertEquals('member count',1,TheClass.members.Count);
  673. AssertNotNull('Have function',Members[0]);
  674. AssertMemberName('b',Members[0]);
  675. AssertMemberType(TPasClassFunction,Members[0]);
  676. AssertVisibility(visPublic,Members[0]);
  677. end;
  678. procedure TTestClassType.TestClassVarClassFunction;
  679. begin
  680. StartVisibility(visPublic);
  681. FDecl.Add('class var');
  682. AddMember('class Function b : integer');
  683. ParseClass;
  684. AssertEquals('member count',1,TheClass.members.Count);
  685. AssertNotNull('Have function',Members[0]);
  686. AssertMemberName('b',Members[0]);
  687. AssertMemberType(TPasClassFunction,Members[0]);
  688. AssertVisibility(visPublic,Members[0]);
  689. end;
  690. procedure TTestClassType.TestTwoFieldsVisibility;
  691. begin
  692. StartVisibility(visPublic);
  693. AddMember('a,b : integer');
  694. ParseClass;
  695. AssertEquals('2 members',2,TheClass.members.Count);
  696. AssertNotNull('Have field',Field1);
  697. AssertMemberName('a');
  698. AssertVisibility(vispublic);
  699. AssertNotNull('Have field',Members[1]);
  700. AssertMemberName('b',Members[1]);
  701. AssertMemberType(TPasVariable,Members[1]);
  702. AssertVisibility(visPublic,Members[1]);
  703. end;
  704. procedure TTestClassType.TestConstProtectedEnd;
  705. begin
  706. // After bug report 25720
  707. StartVisibility(visPrivate);
  708. AddMember('fmy : Integer');
  709. StartVisibility(visProtected);
  710. AddMember('fmy : Integer');
  711. FDecl.Add('protected const');
  712. FDecl.Add('cconst = 10;');
  713. StartVisibility(visProtected);
  714. AddMember('I : Integer');
  715. ParseClass;
  716. end;
  717. procedure TTestClassType.TestTypeProtectedEnd;
  718. begin
  719. // After bug report 25720
  720. StartVisibility(visPrivate);
  721. AddMember('fmy : Integer');
  722. StartVisibility(visProtected);
  723. AddMember('fmy : Integer');
  724. FDecl.Add('protected type');
  725. FDecl.Add('mytype = integer;');
  726. StartVisibility(visProtected);
  727. AddMember('I : Integer');
  728. ParseClass;
  729. end;
  730. procedure TTestClassType.TestVarProtectedEnd;
  731. begin
  732. // After bug report 25720
  733. StartVisibility(visPrivate);
  734. AddMember('fmy : Integer');
  735. StartVisibility(visProtected);
  736. AddMember('fmy : Integer');
  737. FDecl.Add('protected var');
  738. FDecl.Add('mytype : integer;');
  739. StartVisibility(visProtected);
  740. AddMember('I : Integer');
  741. ParseClass;
  742. end;
  743. procedure TTestClassType.TestHintFieldDeprecated;
  744. begin
  745. AddMember('deprecated : integer');
  746. ParseClass;
  747. AssertEquals('1 members',1,TheClass.members.Count);
  748. AssertNotNull('Have field',Field1);
  749. AssertMemberName('deprecated');
  750. end;
  751. procedure TTestClassType.TestHintFieldPlatform;
  752. begin
  753. AddMember('platform : integer');
  754. ParseClass;
  755. AssertEquals('1 members',1,TheClass.members.Count);
  756. AssertNotNull('Have field',Field1);
  757. AssertMemberName('platform');
  758. end;
  759. procedure TTestClassType.TestHintFieldLibraryError;
  760. begin
  761. AddMember('library: integer');
  762. AssertException(EParserError,@ParseClass);
  763. end;
  764. procedure TTestClassType.TestHintFieldExperimental;
  765. begin
  766. AddMember('experimental: integer');
  767. ParseClass;
  768. AssertEquals('1 members',1,TheClass.members.Count);
  769. AssertNotNull('Have field',Field1);
  770. AssertMemberName('experimental');
  771. end;
  772. procedure TTestClassType.TestHintFieldUninmplemented;
  773. begin
  774. AddMember('unimplemented: integer');
  775. ParseClass;
  776. AssertEquals('1 members',1,TheClass.members.Count);
  777. AssertNotNull('Have field',Field1);
  778. AssertMemberName('unimplemented');
  779. end;
  780. procedure TTestClassType.TestOneVarFieldExternalName;
  781. begin
  782. Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msExternalClass];
  783. StartExternalClass('','myname','');
  784. AddMember('unimplemented: integer external name ''uni''');
  785. ParseClass;
  786. AssertEquals('1 members',1,TheClass.members.Count);
  787. AssertNotNull('Have field',Field1);
  788. AssertMemberName('unimplemented');
  789. end;
  790. procedure TTestClassType.TestOneVarFieldExternalNameSemicolon;
  791. begin
  792. Parser.CurrentModeswitches:=Parser.CurrentModeswitches+[msExternalClass];
  793. StartExternalClass('','myname','');
  794. AddMember('unimplemented: integer; external name ''uni''');
  795. ParseClass;
  796. AssertEquals('1 members',1,TheClass.members.Count);
  797. AssertNotNull('Have field',Field1);
  798. AssertMemberName('unimplemented');
  799. end;
  800. procedure TTestClassType.TestMethodSimple;
  801. begin
  802. AddMember('Procedure DoSomething');
  803. ParseClass;
  804. AssertEquals('1 members',1,TheClass.members.Count);
  805. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  806. AssertNotNull('Have method',Method1);
  807. AssertMemberName('DoSomething');
  808. AssertEquals('No modifiers',[],Method1.Modifiers);
  809. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  810. AssertNotNull('Method proc type',Method1.ProcType);
  811. AssertEquals('No arguments',0,Method1.ProcType.Args.Count)
  812. end;
  813. procedure TTestClassType.TestMethodSimpleComment;
  814. begin
  815. AddComment:=True;
  816. AddMember('{c} Procedure DoSomething');
  817. ParseClass;
  818. AssertEquals('1 members',1,TheClass.members.Count);
  819. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  820. AssertNotNull('Have method',Method1);
  821. AssertMemberName('DoSomething');
  822. AssertEquals('Comment','c'+sLineBreak,Method1.DocComment);
  823. end;
  824. procedure TTestClassType.TestMethodWithDotFails;
  825. begin
  826. AddMember('Procedure DoSomething.Stupid');
  827. ParseClassFail('Expected ";"',nParserExpectTokenError);
  828. end;
  829. procedure TTestClassType.TestClassMethodSimple;
  830. begin
  831. AddMember('Class Procedure DoSomething');
  832. ParseClass;
  833. AssertEquals('1 members',1,TheClass.members.Count);
  834. AssertEquals('1 class procedure',TPasClassProcedure,members[0].ClassType);
  835. AssertEquals('Default visibility',visDefault,Members[0].Visibility);
  836. AssertMemberName('DoSomething');
  837. AssertEquals('No modifiers',[],TPasClassProcedure(Members[0]).Modifiers);
  838. AssertEquals('Default calling convention',ccDefault, TPasClassProcedure(Members[0]).ProcType.CallingConvention);
  839. AssertNotNull('Method proc type',TPasClassProcedure(Members[0]).ProcType);
  840. AssertEquals('No arguments',0,TPasClassProcedure(Members[0]).ProcType.Args.Count)
  841. end;
  842. procedure TTestClassType.TestClassMethodSimpleComment;
  843. begin
  844. AddComment:=True;
  845. AddMember('{c} Class Procedure DoSomething');
  846. ParseClass;
  847. AssertEquals('Comment','c'+sLineBreak,Members[0].DocComment);
  848. end;
  849. procedure TTestClassType.TestConstructor;
  850. begin
  851. AddMember('Constructor Create');
  852. ParseClass;
  853. AssertEquals('1 members',1,TheClass.Members.Count);
  854. AssertEquals('1 class procedure',TPasConstructor,Members[0].ClassType);
  855. AssertEquals('Default visibility',visDefault,Members[0].Visibility);
  856. AssertMemberName('Create');
  857. AssertEquals('No modifiers',[],TPasConstructor(Members[0]).Modifiers);
  858. AssertEquals('Default calling convention',ccDefault, TPasConstructor(Members[0]).ProcType.CallingConvention);
  859. AssertNotNull('Method proc type',TPasConstructor(Members[0]).ProcType);
  860. AssertEquals('No arguments',0,TPasConstructor(Members[0]).ProcType.Args.Count)
  861. end;
  862. procedure TTestClassType.TestClassConstructor;
  863. begin
  864. AddMember('Class Constructor Create');
  865. ParseClass;
  866. AssertEquals('1 members',1,TheClass.Members.Count);
  867. AssertEquals('1 class procedure',TPasClassConstructor,Members[0].ClassType);
  868. AssertEquals('Default visibility',visDefault,Members[0].Visibility);
  869. AssertMemberName('Create');
  870. AssertEquals('No modifiers',[],TPasClassConstructor(Members[0]).Modifiers);
  871. AssertEquals('Default calling convention',ccDefault, TPasClassConstructor(Members[0]).ProcType.CallingConvention);
  872. AssertNotNull('Method proc type',TPasClassConstructor(Members[0]).ProcType);
  873. AssertEquals('No arguments',0,TPasClassConstructor(Members[0]).ProcType.Args.Count)
  874. end;
  875. procedure TTestClassType.TestDestructor;
  876. begin
  877. AddMember('Destructor Destroy');
  878. ParseClass;
  879. AssertEquals('1 members',1,TheClass.members.Count);
  880. AssertEquals('1 class procedure',TPasDestructor,members[0].ClassType);
  881. AssertEquals('Default visibility',visDefault,Members[0].Visibility);
  882. AssertMemberName('Destroy');
  883. AssertEquals('No modifiers',[],TPasDestructor(Members[0]).Modifiers);
  884. AssertEquals('Default calling convention',ccDefault, TPasDestructor(Members[0]).ProcType.CallingConvention);
  885. AssertNotNull('Method proc type',TPasDestructor(Members[0]).ProcType);
  886. AssertEquals('No arguments',0,TPasDestructor(Members[0]).ProcType.Args.Count)
  887. end;
  888. procedure TTestClassType.TestClassDestructor;
  889. begin
  890. AddMember('Class Destructor Destroy');
  891. ParseClass;
  892. AssertEquals('1 members',1,TheClass.Members.Count);
  893. AssertEquals('1 class procedure',TPasClassDestructor,Members[0].ClassType);
  894. AssertEquals('Default visibility',visDefault,Members[0].Visibility);
  895. AssertMemberName('Destroy');
  896. AssertEquals('No modifiers',[],TPasClassDestructor(Members[0]).Modifiers);
  897. AssertEquals('Default calling convention',ccDefault, TPasClassDestructor(Members[0]).ProcType.CallingConvention);
  898. AssertNotNull('Method proc type',TPasClassDestructor(Members[0]).ProcType);
  899. AssertEquals('No arguments',0,TPasClassDestructor(Members[0]).ProcType.Args.Count)
  900. end;
  901. procedure TTestClassType.TestFunctionMethodSimple;
  902. begin
  903. AddMember('Function DoSomething : integer');
  904. ParseClass;
  905. AssertEquals('1 members',1,TheClass.members.Count);
  906. AssertEquals('Default visibility',visDefault,FunctionMethod1.Visibility);
  907. AssertNotNull('Have method',Member1);
  908. AssertMemberName('DoSomething');
  909. AssertEquals('No modifiers',[],functionMethod1.Modifiers);
  910. AssertEquals('Default calling convention',ccDefault, functionMethod1.ProcType.CallingConvention);
  911. AssertNotNull('Method proc type',functionMethod1.ProcType);
  912. AssertEquals('No arguments',0,functionMethod1.ProcType.Args.Count)
  913. end;
  914. procedure TTestClassType.TestClassFunctionMethodSimple;
  915. begin
  916. AddMember('Class Function DoSomething : integer');
  917. ParseClass;
  918. AssertEquals('1 members',1,TheClass.members.Count);
  919. AssertEquals('1 class procedure',TPasClassFunction,members[0].ClassType);
  920. AssertEquals('Default visibility',visDefault,Members[0].Visibility);
  921. AssertMemberName('DoSomething');
  922. AssertEquals('No modifiers',[],TPasClassFunction(members[0]).Modifiers);
  923. AssertEquals('Default calling convention',ccDefault, TPasClassFunction(members[0]).ProcType.CallingConvention);
  924. AssertNotNull('Method proc type',TPasClassFunction(members[0]).ProcType);
  925. AssertEquals('No arguments',0,TPasClassFunction(members[0]).ProcType.Args.Count)
  926. end;
  927. procedure TTestClassType.DefaultMethod;
  928. begin
  929. if TheClass.members.Count<1 then
  930. Fail('No members for method');
  931. AssertNotNull('Have method',Method1);
  932. AssertNotNull('Method proc type',Method1.ProcType);
  933. AssertMemberName('DoSomething');
  934. AssertEquals('1 argument',1,Method1.ProcType.Args.Count) ;
  935. AssertEquals('Argument name','A',TPasVariable(Method1.ProcType.Args[0]).Name);
  936. end;
  937. procedure TTestClassType.AssertParserError(const Msg: String);
  938. begin
  939. AssertException(Msg,EParserError,@ParseClass)
  940. end;
  941. procedure TTestClassType.TestMethodOneArg;
  942. begin
  943. AddMember('Procedure DoSomething(A : Integer)');
  944. ParseClass;
  945. DefaultMethod;
  946. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  947. AssertEquals('No modifiers',[],Method1.Modifiers);
  948. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  949. end;
  950. procedure TTestClassType.TestMethodVirtual;
  951. begin
  952. AddMember('Procedure DoSomething(A : Integer) virtual');
  953. ParseClass;
  954. DefaultMethod;
  955. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  956. AssertEquals('Virtual modifiers',[pmVirtual],Method1.Modifiers);
  957. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  958. end;
  959. procedure TTestClassType.TestMethodVirtualSemicolon;
  960. begin
  961. AddMember('Procedure DoSomething(A : Integer); virtual');
  962. ParseClass;
  963. DefaultMethod;
  964. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  965. AssertEquals('Virtual modifiers',[pmVirtual],Method1.Modifiers);
  966. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  967. end;
  968. procedure TTestClassType.TestMethodVirtualAbstract;
  969. begin
  970. AddMember('Procedure DoSomething(A : Integer) virtual abstract');
  971. ParseClass;
  972. DefaultMethod;
  973. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  974. AssertEquals('Virtual, abstract modifiers',[pmVirtual,pmAbstract],Method1.Modifiers);
  975. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  976. end;
  977. procedure TTestClassType.TestMethodVirtualAbstractFinal;
  978. begin
  979. AddMember('Procedure DoSomething(A : Integer) virtual; abstract; final');
  980. ParseClass;
  981. DefaultMethod;
  982. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  983. AssertEquals('Virtual, abstract modifiers',[pmVirtual,pmAbstract,pmFinal],Method1.Modifiers);
  984. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  985. end;
  986. procedure TTestClassType.TestMethodOverride;
  987. begin
  988. AddMember('Procedure DoSomething(A : Integer) override');
  989. ParseClass;
  990. DefaultMethod;
  991. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  992. AssertEquals('Override modifiers',[pmoverride],Method1.Modifiers);
  993. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  994. end;
  995. procedure TTestClassType.TestMethodReintroduce;
  996. begin
  997. AddMember('Procedure DoSomething(A : Integer) ReIntroduce');
  998. ParseClass;
  999. DefaultMethod;
  1000. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1001. AssertEquals('Reintroduce modifiers',[pmReintroduce],Method1.Modifiers);
  1002. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1003. end;
  1004. procedure TTestClassType.TestMethodDynamic;
  1005. begin
  1006. AddMember('Procedure DoSomething(A : Integer) dynamic');
  1007. ParseClass;
  1008. DefaultMethod;
  1009. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1010. AssertEquals('Dynamic modifiers',[pmDynamic],Method1.Modifiers);
  1011. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1012. end;
  1013. procedure TTestClassType.TestMethodInline;
  1014. begin
  1015. AddMember('Procedure DoSomething(A : Integer) inline');
  1016. ParseClass;
  1017. DefaultMethod;
  1018. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1019. AssertEquals('Inline modifiers',[pmInline],Method1.Modifiers);
  1020. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1021. end;
  1022. procedure TTestClassType.TestMethodVisibility;
  1023. begin
  1024. StartVisibility(visPublic);
  1025. AddMember('Procedure DoSomething(A : Integer)');
  1026. ParseClass;
  1027. DefaultMethod;
  1028. AssertEquals('Public visibility',visPublic,Method1.Visibility);
  1029. AssertEquals('No modifiers',[],Method1.Modifiers);
  1030. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1031. end;
  1032. procedure TTestClassType.TestMethodSVisibility;
  1033. begin
  1034. AddMember('Procedure DoSomething(A : Integer)');
  1035. StartVisibility(visPublic);
  1036. AddMember('Procedure DoSomethingB(A : Integer)');
  1037. ParseClass;
  1038. DefaultMethod;
  1039. AssertEquals('First Default visibility',visDefault,Method1.Visibility);
  1040. AssertEquals('No modifiers',[],Method1.Modifiers);
  1041. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1042. AssertNotNull('Have method 2',Method2);
  1043. AssertEquals('Second Default visibility',visPublic,Method2.Visibility);
  1044. AssertNotNull('Method proc type',Method2.ProcType);
  1045. AssertMemberName('DoSomethingB',Method2);
  1046. AssertEquals('1 argument',1,Method2.ProcType.Args.Count) ;
  1047. AssertEquals('Argument name','A',TPasVariable(Method2.ProcType.Args[0]).Name);
  1048. end;
  1049. procedure TTestClassType.TestMethodOverloadVisibility;
  1050. begin
  1051. AddMember('Procedure DoSomething(A : Integer)');
  1052. StartVisibility(visPublic);
  1053. AddMember('Procedure DoSomething(A : String)');
  1054. ParseClass;
  1055. AssertNotNull('Have member 1',Member1);
  1056. AssertEquals('Overload',TPasOverloadedProc,Member1.ClassType);
  1057. AssertEquals('Default visibility',visDefault,Member1.Visibility);
  1058. end;
  1059. procedure TTestClassType.TestMethodHint;
  1060. begin
  1061. AddMember('Procedure DoSomething(A : Integer) deprecated');
  1062. ParseClass;
  1063. DefaultMethod;
  1064. HaveHint(hDeprecated,Member1.Hints);
  1065. HaveHint(hDeprecated,Method1.ProcType.Hints);
  1066. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1067. AssertEquals('No modifiers',[],Method1.Modifiers);
  1068. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1069. end;
  1070. procedure TTestClassType.TestMethodVirtualHint;
  1071. begin
  1072. AddMember('Procedure DoSomething(A : Integer) virtual; deprecated');
  1073. ParseClass;
  1074. DefaultMethod;
  1075. HaveHint(hDeprecated,Member1.Hints);
  1076. HaveHint(hDeprecated,Method1.ProcType.Hints);
  1077. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1078. AssertEquals('virtual modifiers',[pmVirtual],Method1.Modifiers);
  1079. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1080. end;
  1081. procedure TTestClassType.TestIntegerMessageMethod;
  1082. begin
  1083. AddMember('Procedure DoSomething(A : Integer) message 123');
  1084. ParseClass;
  1085. DefaultMethod;
  1086. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1087. AssertEquals('message modifier',[pmMessage],Method1.Modifiers);
  1088. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1089. AssertEquals('Message name','123',Method1.MessageName);
  1090. end;
  1091. procedure TTestClassType.TestStringMessageMethod;
  1092. begin
  1093. AddMember('Procedure DoSomething(A : Integer) message ''aha''');
  1094. ParseClass;
  1095. DefaultMethod;
  1096. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1097. AssertEquals('message modifiers',[pmMessage],Method1.Modifiers);
  1098. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1099. AssertEquals('Message name','''aha''',Method1.MessageName);
  1100. end;
  1101. procedure TTestClassType.Test2Methods;
  1102. begin
  1103. AddMember('Procedure DoSomething(A : Integer) virtual');
  1104. AddMember('Procedure DoSomethingElse');
  1105. ParseClass;
  1106. DefaultMethod;
  1107. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1108. AssertEquals('Virtual modifiers',[pmVirtual],Method1.Modifiers);
  1109. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1110. AssertEquals('Default visibility',visDefault,Members[1].Visibility);
  1111. AssertEquals('Default visibility',TPasProcedure,Members[1].ClassType);
  1112. AssertEquals('Virtual modifiers',[],TPasProcedure(Members[1]).Modifiers);
  1113. AssertEquals('Default calling convention',ccDefault, TPasProcedure(Members[1]).ProcType.CallingConvention);
  1114. end;
  1115. procedure TTestClassType.Test2MethodsDifferentVisibility;
  1116. begin
  1117. AddMember('Procedure DoSomething(A : Integer) virtual');
  1118. StartVisibility(visPublic);
  1119. AddMember('Procedure DoSomethingElse');
  1120. ParseClass;
  1121. DefaultMethod;
  1122. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1123. AssertEquals('Virtual modifiers',[pmVirtual],Method1.Modifiers);
  1124. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1125. AssertEquals('2 Public visibility',visPublic,Members[1].Visibility);
  1126. AssertEquals('2 Default visibility',TPasProcedure,Members[1].ClassType);
  1127. AssertEquals('2 No modifiers',[],TPasProcedure(Members[1]).Modifiers);
  1128. AssertEquals('2 Default calling convention',ccDefault, TPasProcedure(Members[1]).ProcType.CallingConvention);
  1129. end;
  1130. procedure TTestClassType.TestPropertyRedeclare;
  1131. begin
  1132. StartVisibility(visPublished);
  1133. AddMember('Property Something');
  1134. ParseClass;
  1135. AssertProperty(Property1,visPublished,'Something','','','','',0,False,False);
  1136. AssertNull('No type',Property1.VarType);
  1137. Assertequals('No index','',Property1.IndexValue);
  1138. AssertNull('No Index expression',Property1.IndexExpr);
  1139. AssertNull('No Default expression',Property1.DefaultExpr);
  1140. Assertequals('No default value','',Property1.DefaultValue);
  1141. end;
  1142. procedure TTestClassType.TestPropertyRedeclareComment;
  1143. begin
  1144. StartVisibility(visPublished);
  1145. AddComment:=True;
  1146. AddMember('{p} Property Something');
  1147. ParseClass;
  1148. AssertProperty(Property1,visPublished,'Something','','','','',0,False,False);
  1149. AssertEquals('comment','p'+sLineBreak,Property1.DocComment);
  1150. end;
  1151. procedure TTestClassType.TestPropertyRedeclareDefault;
  1152. begin
  1153. StartVisibility(visPublic);
  1154. AddMember('Property Something; default');
  1155. ParseClass;
  1156. AssertProperty(Property1,visPublic,'Something','','','','',0,True,False);
  1157. AssertNull('No type',Property1.VarType);
  1158. Assertequals('No index','',Property1.IndexValue);
  1159. AssertNull('No Index expression',Property1.IndexExpr);
  1160. AssertNull('No Default expression',Property1.DefaultExpr);
  1161. Assertequals('No default value','',Property1.DefaultValue);
  1162. // Actually, already tested in AssertProperty
  1163. AssertEquals('Is default property',True, Property1.IsDefault);
  1164. end;
  1165. procedure TTestClassType.TestPropertyReadOnly;
  1166. begin
  1167. StartVisibility(visPublished);
  1168. AddMember('Property Something : integer Read FSomething');
  1169. ParseClass;
  1170. AssertProperty(Property1,visPublished,'Something','FSomething','','','',0,False,False);
  1171. AssertNotNull('Have type',Property1.VarType);
  1172. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1173. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1174. Assertequals('No index','',Property1.IndexValue);
  1175. AssertNull('No Index expression',Property1.IndexExpr);
  1176. AssertNull('No Default expression',Property1.DefaultExpr);
  1177. Assertequals('No default value','',Property1.DefaultValue);
  1178. end;
  1179. procedure TTestClassType.TestPropertyReadWrite;
  1180. begin
  1181. StartVisibility(visPublished);
  1182. AddMember('Property Something : integer Read FSomething Write FSomething');
  1183. ParseClass;
  1184. AssertProperty(Property1,visPublished,'Something','FSomething','FSomething','','',0,False,False);
  1185. AssertNotNull('Have type',Property1.VarType);
  1186. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1187. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1188. Assertequals('No index','',Property1.IndexValue);
  1189. AssertNull('No Index expression',Property1.IndexExpr);
  1190. AssertNull('No Default expression',Property1.DefaultExpr);
  1191. Assertequals('No default value','',Property1.DefaultValue);
  1192. end;
  1193. procedure TTestClassType.TestPropertyWriteOnly;
  1194. begin
  1195. StartVisibility(visPublished);
  1196. AddMember('Property Something : integer Write FSomething');
  1197. ParseClass;
  1198. AssertProperty(Property1,visPublished,'Something','','FSomething','','',0,False,False);
  1199. AssertNotNull('Have type',Property1.VarType);
  1200. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1201. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1202. Assertequals('No index','',Property1.IndexValue);
  1203. AssertNull('No Index expression',Property1.IndexExpr);
  1204. AssertNull('No Default expression',Property1.DefaultExpr);
  1205. Assertequals('No default value','',Property1.DefaultValue);
  1206. end;
  1207. procedure TTestClassType.TestPropertyDefault;
  1208. begin
  1209. StartVisibility(visPublished);
  1210. AddMember('Property Something : integer Read FSomething Write FSomething default 1');
  1211. ParseClass;
  1212. AssertProperty(Property1,visPublished,'Something','FSomething','FSomething','','',0,False,False);
  1213. AssertNotNull('Have type',Property1.VarType);
  1214. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1215. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1216. Assertequals('No index','',Property1.IndexValue);
  1217. AssertNull('No Index expression',Property1.IndexExpr);
  1218. AssertExpression('Default expression',Property1.DefaultExpr,pekNumber,'1');
  1219. Assertequals('Default value','1',Property1.DefaultValue);
  1220. end;
  1221. procedure TTestClassType.TestPropertyNoDefault;
  1222. begin
  1223. StartVisibility(visPublished);
  1224. AddMember('Property Something : integer Read FSomething Write FSomething nodefault');
  1225. ParseClass;
  1226. AssertProperty(Property1,visPublished,'Something','FSomething','FSomething','','',0,False,True);
  1227. AssertNotNull('Have type',Property1.VarType);
  1228. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1229. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1230. Assertequals('No index','',Property1.IndexValue);
  1231. AssertNull('No Index expression',Property1.IndexExpr);
  1232. AssertNull('No Default expression',Property1.DefaultExpr);
  1233. Assertequals('No Default value','',Property1.DefaultValue);
  1234. end;
  1235. procedure TTestClassType.TestPropertyIndex;
  1236. begin
  1237. StartVisibility(visPublished);
  1238. AddMember('Property Something : integer Index 2 Read GetF Write SetF');
  1239. ParseClass;
  1240. AssertProperty(Property1,visPublished,'Something','GetF','SetF','','',0,False,False);
  1241. AssertNotNull('Have type',Property1.VarType);
  1242. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1243. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1244. AssertExpression('Index expression',Property1.IndexExpr,pekNumber,'2');
  1245. Assertequals('index','2',Property1.IndexValue);
  1246. AssertNull('No Default expression',Property1.DefaultExpr);
  1247. Assertequals('No Default value','',Property1.DefaultValue);
  1248. end;
  1249. procedure TTestClassType.TestPropertyStored;
  1250. begin
  1251. StartVisibility(visPublished);
  1252. AddMember('Property Something : integer Read GetF Write SetF Stored CheckStored');
  1253. ParseClass;
  1254. AssertProperty(Property1,visPublished,'Something','GetF','SetF','CheckStored','',0,False,False);
  1255. AssertNotNull('Have type',Property1.VarType);
  1256. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1257. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1258. AssertNull('No Index expression',Property1.IndexExpr);
  1259. Assertequals('No index','',Property1.IndexValue);
  1260. AssertNull('No Default expression',Property1.DefaultExpr);
  1261. Assertequals('No Default value','',Property1.DefaultValue);
  1262. end;
  1263. procedure TTestClassType.TestPropertyStoredFalse;
  1264. begin
  1265. StartVisibility(visPublished);
  1266. AddMember('Property Something : integer Read GetF Write SetF Stored False');
  1267. ParseClass;
  1268. AssertProperty(Property1,visPublished,'Something','GetF','SetF','False','',0,False,False);
  1269. AssertNotNull('Have type',Property1.VarType);
  1270. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1271. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1272. AssertNull('No Index expression',Property1.IndexExpr);
  1273. Assertequals('No index','',Property1.IndexValue);
  1274. AssertNull('No Default expression',Property1.DefaultExpr);
  1275. Assertequals('No Default value','',Property1.DefaultValue);
  1276. end;
  1277. procedure TTestClassType.TestPropertyFullyQualifiedType;
  1278. begin
  1279. StartVisibility(visPublished);
  1280. AddMember('Property Something : unita.typeb Read FSomething');
  1281. ParseClass;
  1282. AssertProperty(Property1,visPublished,'Something','FSomething','','','',0,False,False);
  1283. AssertNotNull('Have type',Property1.VarType);
  1284. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1285. AssertEquals('Property type name','unita.typeb',Property1.vartype.name);
  1286. Assertequals('No index','',Property1.IndexValue);
  1287. AssertNull('No Index expression',Property1.IndexExpr);
  1288. AssertNull('No Default expression',Property1.DefaultExpr);
  1289. Assertequals('No default value','',Property1.DefaultValue);
  1290. end;
  1291. procedure TTestClassType.TestPropertyArrayReadOnly;
  1292. Var
  1293. A : TPasArgument;
  1294. begin
  1295. StartVisibility(visPublished);
  1296. AddMember('Property Somethings[AIndex : Integer] : integer Read GetF');
  1297. ParseClass;
  1298. AssertProperty(Property1,visPublished,'Somethings','GetF','','','',1,False,False);
  1299. AssertNotNull('Have type',Property1.VarType);
  1300. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1301. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1302. AssertEquals('Argument class',TPasArgument,TObject(Property1.Args[0]).ClassType);
  1303. AssertNull('No Index expression',Property1.IndexExpr);
  1304. Assertequals('No index','',Property1.IndexValue);
  1305. AssertNull('No Default expression',Property1.DefaultExpr);
  1306. Assertequals('No Default value','',Property1.DefaultValue);
  1307. // Argument
  1308. A:=TPasArgument(Property1.Args[0]);
  1309. AssertEquals('Argument name','AIndex',A.Name);
  1310. AssertNotNull('Argument class', A.ArgType);
  1311. AssertEquals('Argument class type',TPasUnresolvedTypeRef,A.ArgType.ClassType);
  1312. AssertEquals('Argument class type name','Integer',A.ArgType.Name);
  1313. end;
  1314. procedure TTestClassType.TestPropertyArrayReadWrite;
  1315. Var
  1316. A : TPasArgument;
  1317. begin
  1318. StartVisibility(visPublished);
  1319. AddMember('Property Somethings[AIndex : Integer] : integer Read GetF Write SetF');
  1320. ParseClass;
  1321. AssertProperty(Property1,visPublished,'Somethings','GetF','SetF','','',1,False,False);
  1322. AssertNotNull('Have type',Property1.VarType);
  1323. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1324. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1325. AssertNull('No Index expression',Property1.IndexExpr);
  1326. Assertequals('No index','',Property1.IndexValue);
  1327. AssertNull('No Default expression',Property1.DefaultExpr);
  1328. Assertequals('No Default value','',Property1.DefaultValue);
  1329. // Argument
  1330. AssertEquals('Argument class',TPasArgument,TObject(Property1.Args[0]).ClassType);
  1331. A:=TPasArgument(Property1.Args[0]);
  1332. AssertEquals('Argument name','AIndex',A.Name);
  1333. AssertNotNull('Argument class', A.ArgType);
  1334. AssertEquals('Argument class type',TPasUnresolvedTypeRef,A.ArgType.ClassType);
  1335. AssertEquals('Argument class type name','Integer',A.ArgType.Name);
  1336. end;
  1337. procedure TTestClassType.TestPropertyArrayReadOnlyDefault;
  1338. Var
  1339. A : TPasArgument;
  1340. begin
  1341. StartVisibility(visPublished);
  1342. AddMember('Property Somethings[AIndex : Integer] : integer Read GetF; default');
  1343. ParseClass;
  1344. AssertProperty(Property1,visPublished,'Somethings','GetF','','','',1,True,False);
  1345. AssertNotNull('Have type',Property1.VarType);
  1346. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1347. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1348. AssertNull('No Index expression',Property1.IndexExpr);
  1349. Assertequals('No index','',Property1.IndexValue);
  1350. AssertNull('No Default expression',Property1.DefaultExpr);
  1351. Assertequals('No Default value','',Property1.DefaultValue);
  1352. // Argument
  1353. AssertEquals('Argument class',TPasArgument,TObject(Property1.Args[0]).ClassType);
  1354. A:=TPasArgument(Property1.Args[0]);
  1355. AssertEquals('Argument name','AIndex',A.Name);
  1356. AssertNotNull('Argument class', A.ArgType);
  1357. AssertEquals('Argument class type',TPasUnresolvedTypeRef,A.ArgType.ClassType);
  1358. AssertEquals('Argument class type name','Integer',A.ArgType.Name);
  1359. end;
  1360. procedure TTestClassType.TestPropertyArrayReadWriteDefault;
  1361. Var
  1362. A : TPasArgument;
  1363. begin
  1364. StartVisibility(visPublished);
  1365. AddMember('Property Somethings[AIndex : Integer] : integer Read GetF Write SetF; default');
  1366. ParseClass;
  1367. AssertProperty(Property1,visPublished,'Somethings','GetF','SetF','','',1,True,False);
  1368. AssertNotNull('Have type',Property1.VarType);
  1369. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1370. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1371. AssertNull('No Index expression',Property1.IndexExpr);
  1372. Assertequals('No index','',Property1.IndexValue);
  1373. AssertNull('No Default expression',Property1.DefaultExpr);
  1374. Assertequals('No Default value','',Property1.DefaultValue);
  1375. // Argument
  1376. AssertEquals('Argument class',TPasArgument,TObject(Property1.Args[0]).ClassType);
  1377. A:=TPasArgument(Property1.Args[0]);
  1378. AssertEquals('Argument name','AIndex',A.Name);
  1379. AssertNotNull('Argument class', A.ArgType);
  1380. AssertEquals('Argument class type',TPasUnresolvedTypeRef,A.ArgType.ClassType);
  1381. AssertEquals('Argument class type name','Integer',A.ArgType.Name);
  1382. end;
  1383. procedure TTestClassType.TestPropertyArrayMultiDimReadOnly;
  1384. Var
  1385. A : TPasArgument;
  1386. begin
  1387. StartVisibility(visPublished);
  1388. AddMember('Property Somethings[ACol : Integer; ARow : Integer] : integer Read GetF; default');
  1389. ParseClass;
  1390. AssertProperty(Property1,visPublished,'Somethings','GetF','','','',2,True,False);
  1391. AssertEquals('Published property',vispublished,Property1.Visibility);
  1392. AssertNotNull('Have type',Property1.VarType);
  1393. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1394. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1395. AssertNull('No Index expression',Property1.IndexExpr);
  1396. Assertequals('No index','',Property1.IndexValue);
  1397. AssertNull('No Default expression',Property1.DefaultExpr);
  1398. Assertequals('No Default value','',Property1.DefaultValue);
  1399. // Argument 1
  1400. AssertEquals('Argument 1 class',TPasArgument,TObject(Property1.Args[0]).ClassType);
  1401. A:=TPasArgument(Property1.Args[0]);
  1402. AssertEquals('Argument 1name','ACol',A.Name);
  1403. AssertNotNull('Argument 1class', A.ArgType);
  1404. AssertEquals('Argument 1 class type',TPasUnresolvedTypeRef,A.ArgType.ClassType);
  1405. AssertEquals('Argument 1 class type name','Integer',A.ArgType.Name);
  1406. // Argument 2
  1407. AssertEquals('Argument 2 class',TPasArgument,TObject(Property1.Args[1]).ClassType);
  1408. A:=TPasArgument(Property1.Args[1]);
  1409. AssertEquals('Argument 2 name','ARow',A.Name);
  1410. AssertNotNull('Argument 2 class', A.ArgType);
  1411. AssertEquals('Argument 2 class type',TPasUnresolvedTypeRef,A.ArgType.ClassType);
  1412. AssertEquals('Argument 2 class type name','Integer',A.ArgType.Name);
  1413. end;
  1414. procedure TTestClassType.TestPropertyImplements;
  1415. begin
  1416. StartVisibility(visPublished);
  1417. AddMember('Property Something : AInterface Read FSomething Implements ISomeInterface');
  1418. ParseClass;
  1419. AssertProperty(Property1,visPublished,'Something','FSomething','','','ISomeInterface',0,False,False);
  1420. AssertNotNull('Have type',Property1.VarType);
  1421. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1422. AssertEquals('Property type name','AInterface',Property1.vartype.name);
  1423. Assertequals('No index','',Property1.IndexValue);
  1424. AssertNull('No Index expression',Property1.IndexExpr);
  1425. AssertNull('No default expression',Property1.DefaultExpr);
  1426. Assertequals('Default value','',Property1.DefaultValue);
  1427. end;
  1428. procedure TTestClassType.TestPropertyDeprecated;
  1429. begin
  1430. StartVisibility(visPublished);
  1431. AddMember('Property Something : AInterface Read FSomething; deprecated');
  1432. ParseClass;
  1433. AssertProperty(Property1,visPublished,'Something','FSomething','','','',0,False,False);
  1434. AssertNotNull('Have type',Property1.VarType);
  1435. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1436. AssertEquals('Property type name','AInterface',Property1.vartype.name);
  1437. Assertequals('No index','',Property1.IndexValue);
  1438. AssertNull('No Index expression',Property1.IndexExpr);
  1439. AssertNull('No default expression',Property1.DefaultExpr);
  1440. Assertequals('Default value','',Property1.DefaultValue);
  1441. AssertTrue('Deprecated',[hDeprecated]=Property1.Hints);
  1442. end;
  1443. procedure TTestClassType.TestPropertyDeprecatedMessage;
  1444. begin
  1445. StartVisibility(visPublished);
  1446. AddMember('Property Something : AInterface Read FSomething; deprecated ''this is no longer used'' ');
  1447. ParseClass;
  1448. AssertProperty(Property1,visPublished,'Something','FSomething','','','',0,False,False);
  1449. AssertNotNull('Have type',Property1.VarType);
  1450. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1451. AssertEquals('Property type name','AInterface',Property1.vartype.name);
  1452. Assertequals('No index','',Property1.IndexValue);
  1453. AssertNull('No Index expression',Property1.IndexExpr);
  1454. AssertNull('No default expression',Property1.DefaultExpr);
  1455. Assertequals('Default value','',Property1.DefaultValue);
  1456. AssertTrue('Deprecated',[hDeprecated]=Property1.Hints);
  1457. end;
  1458. procedure TTestClassType.TestPropertyImplementsFullyQualifiedName;
  1459. begin
  1460. StartVisibility(visPublished);
  1461. AddMember('Property Something : AInterface Read FSomething Implements UnitB.ISomeInterface');
  1462. ParseClass;
  1463. AssertProperty(Property1,visPublished,'Something','FSomething','','','UnitB.ISomeInterface',0,False,False);
  1464. AssertNotNull('Have type',Property1.VarType);
  1465. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1466. AssertEquals('Property type name','AInterface',Property1.vartype.name);
  1467. Assertequals('No index','',Property1.IndexValue);
  1468. AssertNull('No Index expression',Property1.IndexExpr);
  1469. AssertNull('No default expression',Property1.DefaultExpr);
  1470. Assertequals('Default value','',Property1.DefaultValue);
  1471. end;
  1472. procedure TTestClassType.TestPropertyReadFromRecordField;
  1473. begin
  1474. StartVisibility(visPublished);
  1475. AddMember('Property Something : Integer Read FPoint.X');
  1476. ParseClass;
  1477. AssertProperty(Property1,visPublished,'Something','FPoint.X','','','',0,False,False);
  1478. AssertNotNull('Have type',Property1.VarType);
  1479. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1480. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1481. Assertequals('No index','',Property1.IndexValue);
  1482. AssertNull('No Index expression',Property1.IndexExpr);
  1483. AssertNull('No default expression',Property1.DefaultExpr);
  1484. Assertequals('Default value','',Property1.DefaultValue);
  1485. end;
  1486. procedure TTestClassType.TestPropertyReadFromArrayField;
  1487. begin
  1488. StartVisibility(visPublished);
  1489. AddMember('Property Something : Integer Read FPoint.W[x].y.Z');
  1490. ParseClass;
  1491. AssertProperty(Property1,visPublished,'Something','FPoint.W[x].y.Z','','','',0,False,False);
  1492. AssertNotNull('Have type',Property1.VarType);
  1493. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1494. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1495. Assertequals('No index','',Property1.IndexValue);
  1496. AssertNull('No Index expression',Property1.IndexExpr);
  1497. AssertNull('No default expression',Property1.DefaultExpr);
  1498. Assertequals('Default value','',Property1.DefaultValue);
  1499. end;
  1500. procedure TTestClassType.TestPropertyReadWriteFromRecordField;
  1501. begin
  1502. StartVisibility(visPublished);
  1503. AddMember('Property Something : Integer Read FPoint.X Write FPoint.X');
  1504. ParseClass;
  1505. AssertProperty(Property1,visPublished,'Something','FPoint.X','FPoint.X','','',0,False,False);
  1506. AssertNotNull('Have type',Property1.VarType);
  1507. AssertEquals('Property type class type',TPasUnresolvedTypeRef,Property1.vartype.ClassType);
  1508. AssertEquals('Property type name','Integer',Property1.vartype.name);
  1509. Assertequals('No index','',Property1.IndexValue);
  1510. AssertNull('No Index expression',Property1.IndexExpr);
  1511. AssertNull('No default expression',Property1.DefaultExpr);
  1512. Assertequals('Default value','',Property1.DefaultValue);
  1513. end;
  1514. procedure TTestClassType.TestExternalClass;
  1515. begin
  1516. StartExternalClass('','myname','mynamespace');
  1517. Parser.CurrentModeswitches:=[msObjfpc,msexternalClass];
  1518. ParseClass;
  1519. AssertTrue('External class ',TheClass.IsExternal);
  1520. AssertEquals('External name space','mynamespace',TheClass.ExternalNameSpace);
  1521. AssertEquals('External name ','myname',TheClass.ExternalName);
  1522. end;
  1523. procedure TTestClassType.TestExternalClassNoNameSpace;
  1524. begin
  1525. FStarted:=True;
  1526. Parser.CurrentModeswitches:=[msObjfpc,msexternalClass];
  1527. FDecl.add('TMyClass = Class external name ''me'' ');
  1528. ParseClass;
  1529. AssertTrue('External class ',TheClass.IsExternal);
  1530. AssertEquals('External name space','',TheClass.ExternalNameSpace);
  1531. AssertEquals('External name ','me',TheClass.ExternalName);
  1532. end;
  1533. procedure TTestClassType.TestExternalClassNoNameKeyWord;
  1534. begin
  1535. FStarted:=True;
  1536. Parser.CurrentModeswitches:=[msObjfpc,msexternalClass];
  1537. FDecl.add('TMyClass = Class external ''name'' ''me'' ');
  1538. AssertException('No name keyword raises error',EParserError,@ParseClass);
  1539. end;
  1540. procedure TTestClassType.TestExternalClassNoName;
  1541. begin
  1542. FStarted:=True;
  1543. Parser.CurrentModeswitches:=[msObjfpc,msexternalClass];
  1544. FDecl.add('TMyClass = Class external ''name'' name ');
  1545. AssertException('No name raises error',EParserError,@ParseClass);
  1546. end;
  1547. procedure TTestClassType.TestLocalSimpleType;
  1548. begin
  1549. StartVisibility(visPublic);
  1550. FDecl.add('Type');
  1551. AddMember('TDirection = (left,right)');
  1552. AddMember('Procedure Something');
  1553. ParseClass;
  1554. AssertEquals('Local Enumeration type',TPasEnumType, Type1.ClassType);
  1555. AssertEquals('Visibility is correct',VisPublic, Type1.Visibility);
  1556. AssertEquals('Type name','TDirection', Type1.Name);
  1557. AssertSame('Type parent is class',TheClass, Type1.Parent);
  1558. AssertNotNull('Member 2 is procedure',Method2);
  1559. AssertEquals('method name','Something', Method2.Name);
  1560. end;
  1561. procedure TTestClassType.TestLocalSimpleTypes;
  1562. begin
  1563. StartVisibility(visPublic);
  1564. FDecl.add('Type');
  1565. AddMember('TDirection = (left,right)');
  1566. AddMember('TVerticalDirection = (up,down)');
  1567. AddMember('Procedure Something');
  1568. ParseClass;
  1569. AssertEquals('Local Enumeration type',TPasEnumType, Type1.ClassType);
  1570. AssertEquals('Visibility is correct',VisPublic, Type1.Visibility);
  1571. AssertEquals('Type name','TDirection', Type1.Name);
  1572. AssertSame('Type parent is class',TheClass, Type1.Parent);
  1573. AssertEquals('Local Enumeration type',TPasEnumType, Type2.ClassType);
  1574. AssertEquals('Visibility is correct',VisPublic, Type2.Visibility);
  1575. AssertEquals('Type name','TVerticalDirection', Type2.Name);
  1576. AssertSame('Type parent is class',TheClass, Type2.Parent);
  1577. AssertNotNull('Member 2 is procedure',Method3);
  1578. AssertEquals('method name','Something', Method3.Name);
  1579. end;
  1580. procedure TTestClassType.TestLocalSimpleConst;
  1581. begin
  1582. StartVisibility(visPublic);
  1583. FDecl.add('Const');
  1584. AddMember(' A = 23');
  1585. AddMember('Procedure Something');
  1586. ParseClass;
  1587. AssertEquals('Local const value',TPasConst, Const1.ClassType);
  1588. AssertEquals('Visibility is correct',VisPublic, Const1.Visibility);
  1589. AssertEquals('Const name','A', Const1.Name);
  1590. AssertExpression('Const value',Const1.Expr,pekNUmber,'23');
  1591. AssertSame('Const parent is class',TheClass, Const1.Parent);
  1592. AssertNotNull('Member 2 is procedure',Method2);
  1593. AssertEquals('method name','Something', Method2.Name);
  1594. end;
  1595. procedure TTestClassType.TestLocalSimpleConsts;
  1596. begin
  1597. StartVisibility(visPublic);
  1598. FDecl.add('Const');
  1599. AddMember(' A = 23');
  1600. AddMember(' B = 45');
  1601. AddMember('Procedure Something');
  1602. ParseClass;
  1603. // Const A
  1604. AssertEquals('Local const value',TPasConst, Const1.ClassType);
  1605. AssertEquals('Visibility is correct',VisPublic, Const1.Visibility);
  1606. AssertEquals('Const name','A', Const1.Name);
  1607. AssertExpression('Const value',Const1.Expr,pekNUmber,'23');
  1608. AssertSame('Type parent is class',TheClass, Const1.Parent);
  1609. // Const B
  1610. AssertEquals('Local const value',TPasConst, Const2.ClassType);
  1611. AssertEquals('Visibility is correct',VisPublic, Const2.Visibility);
  1612. AssertEquals('Const name','B', Const2.Name);
  1613. AssertExpression('Const value',Const2.Expr,pekNUmber,'45');
  1614. AssertSame('Type parent is class',TheClass, Const2.Parent);
  1615. AssertNotNull('Member 3 is procedure',Method3);
  1616. AssertEquals('method name','Something', Method3.Name);
  1617. end;
  1618. procedure TTestClassType.TestClassHelperEmpty;
  1619. begin
  1620. StartClassHelper('TOriginal','');
  1621. EndClass();
  1622. ParseClass;
  1623. AssertEquals('Is class helper',okClassHelper,TheClass.ObjKind);
  1624. AssertNotNull('Have helper original',TheClass.HelperForType);
  1625. AssertEquals('Have helper original alias',TPasUnresolvedTypeRef,TheClass.HelperForType.CLassType);
  1626. AssertEquals('Helper original alias name','TOriginal',TheClass.HelperForType.Name);
  1627. AssertEquals('No members',0,TheClass.Members.Count);
  1628. end;
  1629. procedure TTestClassType.TestClassHelperParentedEmpty;
  1630. begin
  1631. StartClassHelper('TOriginal','TOtherHelper');
  1632. EndClass();
  1633. ParseClass;
  1634. AssertEquals('Is class helper',okClassHelper,TheClass.ObjKind);
  1635. AssertNotNull('Have helper original',TheClass.HelperForType);
  1636. AssertEquals('Have helper original alias',TPasUnresolvedTypeRef,TheClass.HelperForType.CLassType);
  1637. AssertEquals('Helper original alias name','TOriginal',TheClass.HelperForType.Name);
  1638. AssertEquals('No members',0,TheClass.Members.Count);
  1639. end;
  1640. procedure TTestClassType.TestClassHelperOneMethod;
  1641. begin
  1642. StartClassHelper('TOriginal','');
  1643. AddMember('Procedure DoSomething(A : Integer)');
  1644. ParseClass;
  1645. AssertEquals('Is class helper',okClassHelper,TheClass.ObjKind);
  1646. AssertNotNull('Have helper original',TheClass.HelperForType);
  1647. AssertEquals('Have helper original alias',TPasUnresolvedTypeRef,TheClass.HelperForType.CLassType);
  1648. AssertEquals('Helper original alias name','TOriginal',TheClass.HelperForType.Name);
  1649. DefaultMethod;
  1650. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1651. AssertEquals('No modifiers',[],Method1.Modifiers);
  1652. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1653. end;
  1654. procedure TTestClassType.TestInterfaceEmpty;
  1655. begin
  1656. StartInterface('','');
  1657. EndClass();
  1658. ParseClass;
  1659. AssertEquals('Is interface',okInterface,TheClass.ObjKind);
  1660. AssertEquals('No members',0,TheClass.Members.Count);
  1661. AssertNull('No UUID',TheClass.GUIDExpr);
  1662. end;
  1663. procedure TTestClassType.TestInterfaceDisp;
  1664. begin
  1665. StartInterface('','',true);
  1666. EndClass();
  1667. ParseClass;
  1668. AssertEquals('Is interface',okDispInterface,TheClass.ObjKind);
  1669. AssertEquals('No members',0,TheClass.Members.Count);
  1670. AssertNull('No UUID',TheClass.GUIDExpr);
  1671. end;
  1672. procedure TTestClassType.TestInterfaceParentedEmpty;
  1673. begin
  1674. StartInterface('IInterface','');
  1675. EndClass();
  1676. ParseClass;
  1677. AssertEquals('Is interface',okInterface,TheClass.ObjKind);
  1678. AssertEquals('No members',0,TheClass.Members.Count);
  1679. AssertNull('No UUID',TheClass.GUIDExpr);
  1680. end;
  1681. procedure TTestClassType.TestInterfaceOneMethod;
  1682. begin
  1683. StartInterface('IInterface','');
  1684. AddMember('Procedure DoSomething(A : Integer)');
  1685. EndClass();
  1686. ParseClass;
  1687. AssertEquals('Is interface',okInterface,TheClass.ObjKind);
  1688. DefaultMethod;
  1689. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1690. AssertEquals('No modifiers',[],Method1.Modifiers);
  1691. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1692. AssertNull('No UUID',TheClass.GUIDExpr);
  1693. end;
  1694. procedure TTestClassType.TestInterfaceDispIDMethod;
  1695. begin
  1696. StartInterface('IInterface','');
  1697. AddMember('Procedure DoSomething(A : Integer) dispid 12');
  1698. ParseClass;
  1699. DefaultMethod;
  1700. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1701. AssertEquals('dispid modifier',[pmDispID],Method1.Modifiers);
  1702. AssertNotNull('dispid expression',Method1.DispIDExpr);
  1703. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1704. end;
  1705. procedure TTestClassType.TestInterfaceDispIDMethod2;
  1706. begin
  1707. StartInterface('IInterface','');
  1708. AddMember('Procedure DoSomething(A : Integer); dispid 12');
  1709. ParseClass;
  1710. DefaultMethod;
  1711. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1712. AssertEquals('dispid modifier',[pmDispID],Method1.Modifiers);
  1713. AssertNotNull('dispid expression',Method1.DispIDExpr);
  1714. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1715. end;
  1716. procedure TTestClassType.TestInterfaceProperty;
  1717. begin
  1718. StartInterface('IInterface','');
  1719. AddMember('Function GetS : Integer');
  1720. AddMember('Property S : Integer Read GetS');
  1721. EndClass();
  1722. ParseClass;
  1723. AssertEquals('Is interface',okInterface,TheClass.ObjKind);
  1724. if TheClass.members.Count<1 then
  1725. Fail('No members for method');
  1726. AssertNotNull('Have method',FunctionMethod1);
  1727. AssertNotNull('Method proc type',FunctionMethod1.ProcType);
  1728. AssertMemberName('GetS');
  1729. AssertEquals('0 arguments',0,FunctionMethod1.ProcType.Args.Count) ;
  1730. AssertEquals('Default visibility',visDefault,FunctionMethod1.Visibility);
  1731. AssertEquals('No modifiers',[],FunctionMethod1.Modifiers);
  1732. AssertEquals('Default calling convention',ccDefault, FunctionMethod1.ProcType.CallingConvention);
  1733. AssertNull('No UUID',TheClass.GUIDExpr);
  1734. AssertNotNull('Have property',Property2);
  1735. AssertMemberName('S',Property2);
  1736. end;
  1737. procedure TTestClassType.TestInterfaceDispProperty;
  1738. begin
  1739. StartInterface('IInterface','',True);
  1740. AddMember('Property S : Integer DispID 1');
  1741. EndClass();
  1742. ParseClass;
  1743. AssertEquals('Is interface',okDispInterface,TheClass.ObjKind);
  1744. if TheClass.members.Count<1 then
  1745. Fail('No members for method');
  1746. AssertNotNull('Have property',Property1);
  1747. AssertMemberName('S',Property1);
  1748. AssertNotNull('Have property dispID',Property1.DispIDExpr);
  1749. AssertEquals('Have number',pekNumber,Property1.DispIDExpr.Kind);
  1750. AssertEquals('Have number','1', (Property1.DispIDExpr as TPrimitiveExpr).Value);
  1751. end;
  1752. procedure TTestClassType.TestInterfaceDispPropertyReadOnly;
  1753. begin
  1754. StartInterface('IInterface','',True);
  1755. AddMember('Property S : Integer readonly DispID 1');
  1756. EndClass();
  1757. ParseClass;
  1758. AssertEquals('Is interface',okDispInterface,TheClass.ObjKind);
  1759. if TheClass.members.Count<1 then
  1760. Fail('No members for method');
  1761. AssertNotNull('Have property',Property1);
  1762. AssertMemberName('S',Property1);
  1763. AssertNotNull('Have property dispID',Property1.DispIDExpr);
  1764. AssertTrue('DispID property is readonly',Property1.DispIDReadOnly);
  1765. AssertEquals('Have number',pekNumber,Property1.DispIDExpr.Kind);
  1766. AssertEquals('Have number','1', (Property1.DispIDExpr as TPrimitiveExpr).Value);
  1767. end;
  1768. procedure TTestClassType.TestInterfaceNoConstructor;
  1769. begin
  1770. StartInterface('','');
  1771. AddMember('Constructor DoSomething(A : Integer)');
  1772. AssertParserError('No constructor in interface');
  1773. end;
  1774. procedure TTestClassType.TestInterfaceNoDestructor;
  1775. begin
  1776. StartInterface('','');
  1777. AddMember('Destructor DoSomething(A : Integer)');
  1778. AssertParserError('No destructor in interface');
  1779. end;
  1780. procedure TTestClassType.TestInterfaceNoFields;
  1781. begin
  1782. StartInterface('','');
  1783. AddMember('AField : Integer');
  1784. AssertParserError('No fields in interface');
  1785. end;
  1786. procedure TTestClassType.TestInterfaceUUID;
  1787. begin
  1788. StartInterface('','123');
  1789. EndClass();
  1790. ParseClass;
  1791. AssertEquals('Is interface',okInterface,TheClass.ObjKind);
  1792. AssertEquals('No members',0,TheClass.Members.Count);
  1793. AssertExpression('UUID',TheClass.GUIDExpr,pekString,'''123''');
  1794. end;
  1795. procedure TTestClassType.TestInterfaceUUIDParentedEmpty;
  1796. begin
  1797. StartInterface('IInterface','123');
  1798. EndClass();
  1799. ParseClass;
  1800. AssertEquals('Is interface',okInterface,TheClass.ObjKind);
  1801. AssertEquals('No members',0,TheClass.Members.Count);
  1802. AssertExpression('UUID',TheClass.GUIDExpr,pekString,'''123''');
  1803. end;
  1804. procedure TTestClassType.TestInterfaceUUIDOneMethod;
  1805. begin
  1806. StartInterface('IInterface','123');
  1807. AddMember('Procedure DoSomething(A : Integer)');
  1808. EndClass();
  1809. ParseClass;
  1810. AssertEquals('Is interface',okInterface,TheClass.ObjKind);
  1811. DefaultMethod;
  1812. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1813. AssertEquals('No modifiers',[],Method1.Modifiers);
  1814. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1815. AssertExpression('UUID',TheClass.GUIDExpr,pekString,'''123''');
  1816. end;
  1817. procedure TTestClassType.TestRecordHelperEmpty;
  1818. begin
  1819. StartRecordHelper('TOriginal','');
  1820. ParseClass;
  1821. AssertEquals('Is Record helper',okRecordHelper,TheClass.ObjKind);
  1822. AssertNotNull('Have helper original',TheClass.HelperForType);
  1823. AssertEquals('Have helper original alias',TPasUnresolvedTypeRef,TheClass.HelperForType.ClassType);
  1824. AssertEquals('Helper original alias name','TOriginal',TheClass.HelperForType.Name);
  1825. AssertEquals('No members',0,TheClass.Members.Count);
  1826. end;
  1827. procedure TTestClassType.TestRecordHelperParentedEmpty;
  1828. begin
  1829. StartRecordHelper('TOriginal','TOtherHelper');
  1830. ParseClass;
  1831. AssertEquals('Is Record helper',okRecordHelper,TheClass.ObjKind);
  1832. AssertNotNull('Have helper original',TheClass.HelperForType);
  1833. AssertEquals('Have helper original alias',TPasUnresolvedTypeRef,TheClass.HelperForType.ClassType);
  1834. AssertEquals('Helper original alias name','TOriginal',TheClass.HelperForType.Name);
  1835. AssertEquals('No members',0,TheClass.Members.Count);
  1836. end;
  1837. procedure TTestClassType.TestRecordHelperOneMethod;
  1838. begin
  1839. StartRecordHelper('TOriginal','');
  1840. AddMember('Procedure DoSomething(A : Integer)');
  1841. ParseClass;
  1842. AssertEquals('Is Record helper',okRecordHelper,TheClass.ObjKind);
  1843. AssertNotNull('Have helper original',TheClass.HelperForType);
  1844. AssertEquals('Have helper original alias',TPasUnresolvedTypeRef,TheClass.HelperForType.ClassType);
  1845. AssertEquals('Helper original alias name','TOriginal',TheClass.HelperForType.Name);
  1846. DefaultMethod;
  1847. AssertEquals('Default visibility',visDefault,Method1.Visibility);
  1848. AssertEquals('No modifiers',[],Method1.Modifiers);
  1849. AssertEquals('Default calling convention',ccDefault, Method1.ProcType.CallingConvention);
  1850. end;
  1851. initialization
  1852. RegisterTest(TTestClassType);
  1853. end.