tcclasstype.pas 83 KB

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