tctsparser.pp 70 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922
  1. unit tctsparser;
  2. {$mode ObjFPC}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, testregistry, tcparser, jsscanner, jsbase, jstree, jstoken;
  6. Type
  7. { TTestTypeScriptParser }
  8. TTestTypeScriptParser = Class(TTestBaseJSParser)
  9. private
  10. Public
  11. Procedure StartTS(aSource : String);
  12. procedure CheckMembers(M : TJSSourceElements; aVars,aFunctions,aStatements,aClasses,aModules,aNamespaces,aTypes : Integer);
  13. Published
  14. Procedure TestDeclareModule;
  15. Procedure TestDeclareModuleIdentifier;
  16. Procedure TestDeclareNamespace;
  17. Procedure TestDeclareGlobal;
  18. Procedure TestDeclareUniqueConst;
  19. Procedure TestDeclareFunction;
  20. Procedure TestDeclareFunctionOptionalArg;
  21. Procedure TestDeclareFunctionSpreadArg;
  22. Procedure TestDeclareFunctionLiteralArg;
  23. Procedure TestDeclareTypeAlias;
  24. Procedure TestDeclareTypeAliasDotted;
  25. Procedure TestDeclareTypeTypeQuery;
  26. Procedure TestDeclareTypeUnion;
  27. Procedure TestDeclareTypeUnionConsts;
  28. Procedure TestDeclareTypeUnionAllowEmpty;
  29. Procedure TestDeclareUnionTuple;
  30. Procedure TestDeclareUnionIntersectionType;
  31. Procedure TestDeclareTypeTuple;
  32. Procedure TestDeclareTypeArray;
  33. Procedure TestDeclareTypeArrayOfUnionType;
  34. Procedure TestDeclareTypeArrayOfFunctionType;
  35. Procedure TestDeclareTypeArrayGeneric;
  36. Procedure TestDeclareTypeArrayGenericConst;
  37. Procedure TestDeclareTypeArrayKeyOf;
  38. Procedure TestDeclareTypeGeneric;
  39. Procedure TestDeclareTypeGenericGeneric;
  40. Procedure TestDeclareTypeGenericNested;
  41. procedure TestDeclareTypeGenericNestedTwice;
  42. Procedure TestDeclareTypeGenericAssigned;
  43. Procedure TestDeclareTypeGenericConstSubtype;
  44. Procedure TestDeclareTypeObject;
  45. Procedure TestDeclareTypeObjectLineBreak;
  46. Procedure TestDeclareTypeObjectPropRef;
  47. procedure TestDeclareTypeObjectIndexSignature;
  48. Procedure TestDeclareTypeArrowFunction;
  49. Procedure TestDeclareTypeArrowFunctionShort;
  50. Procedure TestDeclareTypeArrowFunctionTwoArgs;
  51. Procedure TestDeclareTypeArrowFunctionArgsCommaEnd;
  52. procedure TestDeclareTypeGenericConstraint;
  53. procedure TestDeclareTypeTypeImport;
  54. procedure TestDeclareTypeTypeOfImport;
  55. procedure TestDeclareTypeTypeOfDefault;
  56. procedure TestDeclareTypeReadonly;
  57. procedure TestDeclareArgTypeInferred;
  58. Procedure TestDeclareEnum;
  59. Procedure TestDeclareEnumKeywordElement;
  60. Procedure TestDeclareConstEnum;
  61. Procedure TestDeclareConstEnumAssigned;
  62. procedure TestDeclareInterfaceEmpty;
  63. procedure TestDeclareAmbientInterfaceEmpty;
  64. procedure TestDeclareInterfaceExtendsEmpty;
  65. procedure TestDeclareInterfaceExtendsTwoEmpty;
  66. procedure TestDeclareInterfaceProperty;
  67. procedure TestDeclareInterfaceOptionalProperty;
  68. procedure TestDeclareInterfaceUntypedProperty;
  69. procedure TestDeclareInterfaceOptionalUntypedProperty;
  70. procedure TestDeclareInterfaceMethod;
  71. procedure TestDeclareInterfaceMethodNoReturn;
  72. procedure TestDeclareInterfaceCallable;
  73. procedure TestDeclareInterfaceMethodThisReturn;
  74. procedure TestDeclateInterfaceGenericProperty;
  75. procedure TestDeclateInterfaceGeneric;
  76. procedure TestDeclareInterfaceExtendsGeneric;
  77. Procedure TestDeclareInterfaceHidden;
  78. procedure TestDeclareClassEmpty;
  79. procedure TestDeclareAbstractClassEmpty;
  80. procedure TestDeclareClassIndexSignature;
  81. procedure TestDeclareClassIndexSignatureIn;
  82. procedure TestDeclareClassExtendsGeneric;
  83. procedure TestDeclareClassGeneric;
  84. procedure TestDeclareClassStaticFunction;
  85. procedure TestDeclareClassStaticFunctionUntypedArg;
  86. procedure TestDeclareClassStaticReadonlyProperty;
  87. procedure TestDeclareClassReadonlyProperty;
  88. procedure TestDeclareClassGenericFunctionProperty;
  89. procedure TestDeclareClassImplements;
  90. procedure TestDeclareClassExtendsFunctionCall;
  91. Procedure TestDeclareClassStaticReadOnly;
  92. procedure TestDeclareInterfaceIndexSignature;
  93. procedure TestDeclareInterfaceFixedStringProperty;
  94. procedure TestDeclareInterfaceFixedBooleanProperty;
  95. procedure TestDeclareInterfaceFixedUnionProperty;
  96. procedure TestDeclareInterfaceDestructuredFunctionProperty;
  97. procedure TestDeclareInterfaceNoSemicolon;
  98. procedure TestDeclareConstructorSignature;
  99. procedure TestDeclareFunctionDestructuredParam;
  100. procedure TestDeclareFunctionIs;
  101. procedure TestDeclareFunctionThisParam;
  102. procedure TestExportNamespacedClass;
  103. procedure TestExportAbstractClass;
  104. procedure TestExportClassConstructor;
  105. procedure TestExportInterface;
  106. procedure TestExportInterfaceDefault;
  107. procedure TestExportInterfaceIndexSignature;
  108. procedure TestExportInterfaceIndexSignatureOptional;
  109. procedure TestExportImportStatement;
  110. procedure TestExportAssignStatement;
  111. procedure TestExportAsNamespace;
  112. procedure TestExportNamespaceClass;
  113. procedure TestExportDefaultFunction;
  114. procedure TestExportFunction;
  115. procedure TestExportTypeArrowFunctionArgsComma;
  116. procedure TestDeclareExportInterfaceDestructuredFunctionProperty;
  117. procedure TestExportEnum;
  118. procedure TestExportObjectUnion;
  119. Procedure TestExportNoSemicolon;
  120. Procedure TestExportAsKeyWord;
  121. procedure TestNamespaceInterfaceFUnction;
  122. end;
  123. implementation
  124. { TTestTypeScriptParser }
  125. procedure TTestTypeScriptParser.StartTS(aSource: String);
  126. begin
  127. CreateParser(aSource,ecma2021,True);
  128. end;
  129. procedure TTestTypeScriptParser.CheckMembers(M : TJSSourceElements; aVars, aFunctions, aStatements, aClasses, aModules, aNamespaces,aTypes: Integer);
  130. begin
  131. AssertEquals('functions count',aFunctions,M.Functions.Count);
  132. AssertEquals('vars count',aVars,M.Vars.Count);
  133. AssertEquals('Statements count',aStatements,M.Statements.Count);
  134. AssertEquals('classes count',aClasses,M.Classes.Count);
  135. AssertEquals('namespaces count',aNamespaces,M.NameSpaces.Count);
  136. AssertEquals('Modules count',aModules,M.Modules.Count);
  137. AssertEquals('Types count',aTypes,M.Modules.Count);
  138. end;
  139. procedure TTestTypeScriptParser.TestDeclareModule;
  140. Var
  141. M : TJSModuleDeclaration;
  142. begin
  143. StartTS('declare module "a" { }');
  144. M:=GetFirstModule;
  145. AssertEquals('Name','a',M.Name);
  146. CheckMembers(M.Members,0,0,0,0,0,0,0);
  147. end;
  148. procedure TTestTypeScriptParser.TestDeclareModuleIdentifier;
  149. Var
  150. M : TJSModuleDeclaration;
  151. begin
  152. StartTS('declare module a { }');
  153. M:=GetFirstModule;
  154. AssertEquals('Name','a',M.Name);
  155. CheckMembers(M.Members,0,0,0,0,0,0,0);
  156. end;
  157. procedure TTestTypeScriptParser.TestDeclareNamespace;
  158. Var
  159. N : TJSNamespaceDeclaration;
  160. begin
  161. StartTS('declare namespace a { }');
  162. N:=GetFirstNamespace;
  163. AssertEquals('Name','a',N.Name);
  164. CheckMembers(N.Members,0,0,0,0,0,0,0);
  165. end;
  166. procedure TTestTypeScriptParser.TestDeclareGlobal;
  167. Var
  168. N : TJSNamespaceDeclaration;
  169. begin
  170. StartTS('declare global { }');
  171. N:=GetFirstNamespace;
  172. AssertEquals('Name','',N.Name);
  173. AssertEquals('Global',True,N.IsGlobal);
  174. CheckMembers(N.Members,0,0,0,0,0,0,0);
  175. end;
  176. procedure TTestTypeScriptParser.TestDeclareUniqueConst;
  177. Var
  178. V : TJSVarDeclaration;
  179. begin
  180. StartTS('const A : unique symbol');
  181. V:=TJSVarDeclaration(CheckClass('Var',TJSVarDeclaration,GetFirstVar));
  182. AssertEquals('Unique ',True,V.IsUnique);
  183. end;
  184. procedure TTestTypeScriptParser.TestDeclareFunction;
  185. Var
  186. F : TJSFunctionDeclarationStatement;
  187. begin
  188. StartTS('declare function a (b : number) : string ;');
  189. F:=GetFirstFunction;
  190. AssertEquals('Name','a',F.AFunction.Name);
  191. AssertNull('No body',F.AFunction.Body);
  192. AssertNotNull('Have params',F.AFunction.TypedParams);
  193. AssertEquals('Param Count',1,F.AFunction.TypedParams.Count);
  194. AssertEquals('Param 1 name','b',F.AFunction.TypedParams.Names[0]);
  195. AssertEquals('Param 1 optional',False,F.AFunction.TypedParams.Params[0].IsOptional);
  196. end;
  197. procedure TTestTypeScriptParser.TestDeclareFunctionOptionalArg;
  198. Var
  199. F : TJSFunctionDeclarationStatement;
  200. begin
  201. StartTS('declare function a (b ? : number) : string ;');
  202. F:=GetFirstFunction;
  203. AssertEquals('Name','a',F.AFunction.Name);
  204. AssertNull('No body',F.AFunction.Body);
  205. AssertNotNull('Have params',F.AFunction.TypedParams);
  206. AssertEquals('Param Count',1,F.AFunction.TypedParams.Count);
  207. AssertEquals('Param 1 name','b',F.AFunction.TypedParams.Names[0]);
  208. AssertEquals('Param 1 optional',True,F.AFunction.TypedParams.Params[0].IsOptional);
  209. end;
  210. procedure TTestTypeScriptParser.TestDeclareFunctionSpreadArg;
  211. Var
  212. F : TJSFunctionDeclarationStatement;
  213. begin
  214. StartTS('declare function a (...b ? : number) : string ;');
  215. F:=GetFirstFunction;
  216. AssertEquals('Name','a',F.AFunction.Name);
  217. AssertNull('No body',F.AFunction.Body);
  218. AssertNotNull('Have params',F.AFunction.TypedParams);
  219. AssertEquals('Param Count',1,F.AFunction.TypedParams.Count);
  220. AssertEquals('Param 1 name','b',F.AFunction.TypedParams.Names[0]);
  221. AssertEquals('Param 1 optional',True,F.AFunction.TypedParams.Params[0].IsOptional);
  222. AssertEquals('Param 1 spread',True,F.AFunction.TypedParams.Params[0].IsSpread);
  223. end;
  224. procedure TTestTypeScriptParser.TestDeclareFunctionLiteralArg;
  225. Var
  226. F : TJSFunctionDeclarationStatement;
  227. R : TJSFixedValueReference;
  228. begin
  229. StartTS('declare function a (b : ''number'') : string ;');
  230. F:=GetFirstFunction;
  231. AssertEquals('Name','a',F.AFunction.Name);
  232. AssertNull('No body',F.AFunction.Body);
  233. AssertNotNull('Have params',F.AFunction.TypedParams);
  234. AssertEquals('Param Count',1,F.AFunction.TypedParams.Count);
  235. AssertEquals('Param 1 name','b',F.AFunction.TypedParams.Names[0]);
  236. AssertEquals('Param 1 optional',False,F.AFunction.TypedParams.Params[0].IsOptional);
  237. AssertEquals('Param 1 spread',False,F.AFunction.TypedParams.Params[0].IsSpread);
  238. AssertNotNull('Param 1 type',F.AFunction.TypedParams.Types[0]);
  239. R:=TJSFixedValueReference(CheckClass('Param 1 type',TJSFixedValueReference,F.AFunction.TypedParams.Types[0]));
  240. AssertNotNull('Have Fixedvalue',R.FixedValue);
  241. AssertNotNull('Have Fixedvalue.Value',R.FixedValue.Value);
  242. AssertEquals('Fixed value','number',R.FixedValue.Value.AsString);
  243. end;
  244. procedure TTestTypeScriptParser.TestDeclareTypeAlias;
  245. Var
  246. T : TJSTypeDeclaration;
  247. begin
  248. StartTS('type a = b;');
  249. T:=GetFirstType;
  250. AssertEquals('Name','a',T.Name);
  251. AssertNotNull('Have type def',T.TypeDef);
  252. AssertEquals('Correct type def class',TJSTypeReference,T.TypeDef.ClassType);
  253. AssertEquals('Correct name def class','b',TJSTypeReference(T.TypeDef).Name);
  254. AssertEquals('Correct IsTypeOf',False,TJSTypeReference(T.TypeDef).IsTypeOf);
  255. end;
  256. procedure TTestTypeScriptParser.TestDeclareTypeAliasDotted;
  257. Var
  258. T : TJSTypeDeclaration;
  259. begin
  260. StartTS('type a = b.c;');
  261. T:=GetFirstType;
  262. AssertEquals('Name','a',T.Name);
  263. AssertNotNull('Have type def',T.TypeDef);
  264. AssertEquals('Correct type def class',TJSTypeReference,T.TypeDef.ClassType);
  265. AssertEquals('Correct name def class','b.c',TJSTypeReference(T.TypeDef).Name);
  266. AssertEquals('Correct isTypeOf',False,TJSTypeReference(T.TypeDef).IsTypeOf);
  267. end;
  268. procedure TTestTypeScriptParser.TestDeclareTypeTypeQuery;
  269. Var
  270. T : TJSTypeDeclaration;
  271. begin
  272. StartTS('type a = typeof b;');
  273. T:=GetFirstType;
  274. AssertEquals('Name','a',T.Name);
  275. AssertNotNull('Have type def',T.TypeDef);
  276. AssertEquals('Correct type def class',TJSTypeReference,T.TypeDef.ClassType);
  277. AssertEquals('Correct name def class','b',TJSTypeReference(T.TypeDef).Name);
  278. AssertEquals('Correct name def class',True,TJSTypeReference(T.TypeDef).IsTypeOf);
  279. end;
  280. procedure TTestTypeScriptParser.TestDeclareTypeUnion;
  281. Var
  282. T : TJSTypeDeclaration;
  283. U : TJSUnionTypeDef;
  284. R : TJSTypeReference;
  285. begin
  286. StartTS('type a = string | number');
  287. T:=GetFirstType;
  288. AssertEquals('Name','a',T.Name);
  289. AssertNotNull('Have type def',T.TypeDef);
  290. AssertEquals('Correct type def class',TJSUnionTypeDef,T.TypeDef.ClassType);
  291. U:=TJSUnionTypeDef(T.TypeDef);
  292. AssertEquals('Correct number of elements',2,U.TypeCount);
  293. AssertEquals('Correct type of element 0',TJSTypeReference, U.Types[0].ClassType);
  294. R:=U.Types[0] as TJSTypeReference;
  295. AssertEquals('Name type 0','string',R.Name);
  296. AssertEquals('Correct type of element 0',TJSTypeReference, U.Types[1].ClassType);
  297. R:=U.Types[1] as TJSTypeReference;
  298. AssertEquals('Name type 1','number',R.Name);
  299. end;
  300. procedure TTestTypeScriptParser.TestDeclareTypeUnionConsts;
  301. Var
  302. T : TJSTypeDeclaration;
  303. U : TJSUnionTypeDef;
  304. R : TJSFixedValueReference;
  305. begin
  306. StartTS('type a = "string" | "number"');
  307. T:=GetFirstType;
  308. AssertEquals('Name','a',T.Name);
  309. AssertNotNull('Have type def',T.TypeDef);
  310. AssertEquals('Correct type def class',TJSUnionTypeDef,T.TypeDef.ClassType);
  311. U:=TJSUnionTypeDef(T.TypeDef);
  312. AssertEquals('Correct number of elements',2,U.TypeCount);
  313. AssertEquals('Correct type of element 0',TJSFixedValueReference, U.Types[0].ClassType);
  314. R:=U.Types[0] as TJSFixedValueReference;
  315. AssertEquals('Name type 0','string',R.FixedValue.Value.AsString);
  316. AssertEquals('Correct type of element 0',TJSFixedValueReference, U.Types[1].ClassType);
  317. R:=U.Types[1] as TJSFixedValueReference;
  318. AssertEquals('Name type 1','number',R.FixedValue.Value.AsString);
  319. end;
  320. procedure TTestTypeScriptParser.TestDeclareTypeUnionAllowEmpty;
  321. Var
  322. T : TJSTypeDeclaration;
  323. U : TJSUnionTypeDef;
  324. R : TJSTypeReference;
  325. begin
  326. StartTS('type a = | string | number');
  327. T:=GetFirstType;
  328. AssertEquals('Name','a',T.Name);
  329. AssertNotNull('Have type def',T.TypeDef);
  330. AssertEquals('Correct type def class',TJSUnionTypeDef,T.TypeDef.ClassType);
  331. U:=TJSUnionTypeDef(T.TypeDef);
  332. AssertEquals('Allow empty ',True,U.AllowEmpty);
  333. AssertEquals('Correct number of elements',2,U.TypeCount);
  334. AssertEquals('Correct type of element 0',TJSTypeReference, U.Types[0].ClassType);
  335. R:=U.Types[0] as TJSTypeReference;
  336. AssertEquals('Name type 0','string',R.Name);
  337. AssertEquals('Correct type of element 0',TJSTypeReference, U.Types[1].ClassType);
  338. R:=U.Types[1] as TJSTypeReference;
  339. AssertEquals('Name type 1','number',R.Name);
  340. end;
  341. procedure TTestTypeScriptParser.TestDeclareUnionTuple;
  342. Var
  343. T : TJSTypeDeclaration;
  344. begin
  345. StartTS('declare type Color = string | [number, number, number, number] | ColorObject;');
  346. T:=GetFirstType;
  347. AssertEquals('Name','Color',T.Name);
  348. end;
  349. procedure TTestTypeScriptParser.TestDeclareUnionIntersectionType;
  350. Var
  351. T : TJSTypeDeclaration;
  352. U : TJSUnionTypeDef;
  353. begin
  354. StartTs('declare type MyType = number | (string | number) ;');
  355. T:=GetFirstType;
  356. AssertEquals('Name','MyType',T.Name);
  357. AssertNotNull('Have type def',T.TypeDef);
  358. AssertEquals('Correct type def class',TJSUnionTypeDef,T.TypeDef.ClassType);
  359. U:=TJSUnionTypeDef(T.TypeDef);
  360. AssertEquals('Correct number of elements',2,U.TypeCount);
  361. end;
  362. procedure TTestTypeScriptParser.TestDeclareTypeTuple;
  363. Var
  364. T : TJSTypeDeclaration;
  365. U : TJSTupleTypeDef;
  366. R : TJSTypeReference;
  367. begin
  368. StartTS('type a = [string , number]');
  369. T:=GetFirstType;
  370. AssertEquals('Name','a',T.Name);
  371. AssertNotNull('Have type def',T.TypeDef);
  372. AssertEquals('Correct type def class',TJSTupleTypeDef,T.TypeDef.ClassType);
  373. U:=TJSTupleTypeDef(T.TypeDef);
  374. AssertEquals('Correct number of elements',2,U.TypeCount);
  375. AssertEquals('Correct type of element 0',TJSTypeReference, U.Types[0].ClassType);
  376. R:=U.Types[0] as TJSTypeReference;
  377. AssertEquals('Name type 0','string',R.Name);
  378. AssertEquals('Correct type of element 0',TJSTypeReference, U.Types[1].ClassType);
  379. R:=U.Types[1] as TJSTypeReference;
  380. AssertEquals('Name type 1','number',R.Name);
  381. end;
  382. procedure TTestTypeScriptParser.TestDeclareTypeArray;
  383. Var
  384. T : TJSTypeDeclaration;
  385. A : TJSArrayTypeDef;
  386. R : TJSTypeReference;
  387. begin
  388. StartTS('type a = string[]');
  389. T:=GetFirstType;
  390. AssertEquals('Name','a',T.Name);
  391. AssertNotNull('Have type def',T.TypeDef);
  392. AssertEquals('Correct type def class',TJSArrayTypeDef,T.TypeDef.ClassType);
  393. A:=TJSArrayTypeDef(T.TypeDef);
  394. AssertNotNull('have base type',A.BaseType);
  395. AssertEquals('Correct type of base type',TJSTypeReference, A.BaseType.ClassType);
  396. R:=A.BaseType as TJSTypeReference;
  397. AssertEquals('Name base type','string',R.Name);
  398. end;
  399. procedure TTestTypeScriptParser.TestDeclareTypeArrayOfUnionType;
  400. Var
  401. T : TJSTypeDeclaration;
  402. A : TJSArrayTypeDef;
  403. U : TJSUnionTypeDef;
  404. R : TJSTypeReference;
  405. begin
  406. StartTS('type a = (string | number)[]');
  407. T:=GetFirstType;
  408. AssertEquals('Name','a',T.Name);
  409. A:=TJSArrayTypeDef(CheckClass(T.TypeDef,TJSArrayTypeDef,'Type def class'));
  410. U:=TJSUnionTypeDef(CheckClass(A.BaseType,TJSUnionTypeDef,'base type Union class '));
  411. AssertEquals('Union Count',2,U.TypeCount);
  412. R:=TJSTypeReference(CheckClass(U.Types[0],TJSTypeReference,'Union class element 0'));
  413. AssertEquals('Name base type','string',R.Name);
  414. R:=TJSTypeReference(CheckClass(U.Types[1],TJSTypeReference,'Union class element 1'));
  415. AssertEquals('Name base type','number',R.Name);
  416. end;
  417. procedure TTestTypeScriptParser.TestDeclareTypeArrayOfFunctionType;
  418. Var
  419. T : TJSTypeDeclaration;
  420. A : TJSArrayTypeDef;
  421. F : TJSArrowFunctionTypeDef;
  422. R : TJSTypeReference;
  423. begin
  424. StartTS('type a = (() => string)[]');
  425. T:=GetFirstType;
  426. AssertEquals('Name','a',T.Name);
  427. A:=TJSArrayTypeDef(CheckClass(T.TypeDef,TJSArrayTypeDef,'Type def class'));
  428. F:=TJSArrowFunctionTypeDef(CheckClass(A.BaseType,TJSArrowFunctionTypeDef,'Have arrow function'));
  429. AssertNotNull('Have function definition',F.aFunction);
  430. R:=TJSTypeReference(CheckClass(F.aFunction.ResultType,TJSTypeReference,'Have function result'));
  431. AssertEquals('result type name','string',R.Name);
  432. AssertEquals('function argument count',0,F.aFunction.TypedParams.Count);
  433. end;
  434. procedure TTestTypeScriptParser.TestDeclareTypeArrayKeyOf;
  435. Var
  436. T : TJSTypeDeclaration;
  437. A : TJSArrayTypeDef;
  438. R : TJSTypeReference;
  439. begin
  440. StartTS('type a = string[keyof B]');
  441. T:=GetFirstType;
  442. AssertEquals('Name','a',T.Name);
  443. AssertNotNull('Have type def',T.TypeDef);
  444. AssertEquals('Correct type def class',TJSArrayTypeDef,T.TypeDef.ClassType);
  445. A:=TJSArrayTypeDef(T.TypeDef);
  446. AssertNotNull('have base type',A.BaseType);
  447. AssertEquals('Correct type of base type',TJSTypeReference, A.BaseType.ClassType);
  448. R:=A.BaseType as TJSTypeReference;
  449. AssertEquals('Name base type','string',R.Name);
  450. AssertEquals('Correct type of base type',TJSTypeReference, A.IndexType.ClassType);
  451. R:=A.IndexType as TJSTypeReference;
  452. AssertEquals('Name base type','B',R.Name);
  453. AssertEquals('Keyof type',True,R.IsKeyOf);
  454. end;
  455. procedure TTestTypeScriptParser.TestDeclareTypeArrayGeneric;
  456. Var
  457. T : TJSTypeDeclaration;
  458. A : TJSArrayTypeDef;
  459. R : TJSTypeReference;
  460. begin
  461. StartTS('type a = Array<string>');
  462. T:=GetFirstType;
  463. AssertEquals('Name','a',T.Name);
  464. AssertNotNull('Have type def',T.TypeDef);
  465. AssertEquals('Correct type def class',TJSArrayTypeDef,T.TypeDef.ClassType);
  466. A:=TJSArrayTypeDef(T.TypeDef);
  467. AssertNotNull('have base type',A.BaseType);
  468. AssertEquals('Correct type of base type',TJSTypeReference, A.BaseType.ClassType);
  469. R:=A.BaseType as TJSTypeReference;
  470. AssertEquals('Name base type','string',R.Name);
  471. end;
  472. procedure TTestTypeScriptParser.TestDeclareTypeArrayGenericConst;
  473. Var
  474. T : TJSTypeDeclaration;
  475. A : TJSArrayTypeDef;
  476. U : TJSUnionTypeDef;
  477. begin
  478. StartTS('type a = Array<"params" | "query" | "headers" | "body">;');
  479. T:=GetFirstType;
  480. AssertEquals('Name','a',T.Name);
  481. AssertNotNull('Have type def',T.TypeDef);
  482. AssertEquals('Correct type def class',TJSArrayTypeDef,T.TypeDef.ClassType);
  483. A:=TJSArrayTypeDef(T.TypeDef);
  484. AssertNotNull('have base type',A.BaseType);
  485. AssertEquals('Correct type of base type',TJSUnionTypeDef, A.BaseType.ClassType);
  486. U:=A.BaseType as TJSUnionTypeDef;
  487. AssertEquals('Element count',4,U.TypeCount);
  488. end;
  489. procedure TTestTypeScriptParser.TestDeclareTypeGeneric;
  490. Var
  491. T : TJSTypeDeclaration;
  492. G : TJSGenericTypeRef;
  493. R : TJSTypeReference;
  494. begin
  495. StartTS('type a = Shell<string>');
  496. T:=GetFirstType;
  497. AssertEquals('Name','a',T.Name);
  498. AssertNotNull('Have type def',T.TypeDef);
  499. AssertEquals('Correct type def class',TJSGenericTypeRef,T.TypeDef.ClassType);
  500. G:=TJSGenericTypeRef(T.TypeDef);
  501. AssertNotNull('have base type',G.BaseType);
  502. AssertEquals('Correct type of base type',TJSTypeReference, G.BaseType.ClassType);
  503. R:=G.BaseType as TJSTypeReference;
  504. AssertEquals('Name base type','Shell',R.Name);
  505. AssertEquals('Correct number of parameters',1, G.ParamTypeCount);
  506. AssertEquals('Correct type of parameter 0',TJSTypeReference, G.ParamTypes[0].Classtype);
  507. R:=G.ParamTypes[0] as TJSTypeReference;
  508. AssertEquals('Name base type','string',R.Name);
  509. end;
  510. procedure TTestTypeScriptParser.TestDeclareTypeGenericGeneric;
  511. Var
  512. T : TJSTypeDeclaration;
  513. G : TJSTupleTypeDef;
  514. R : TJSTypeReference;
  515. begin
  516. StartTS('type Pair<T> = [T,T]');
  517. T:=GetFirstType;
  518. AssertEquals('Name','Pair',T.Name);
  519. AssertNotNull('Have type def',T.TypeDef);
  520. AssertEquals('Correct number of parameters',1, T.TypeParams.Count);
  521. AssertEquals('Correct type of parameter 0',TJSTypeReference, T.TypeParams[0].Node.Classtype);
  522. R:=T.TypeParams[0].Node as TJSTypeReference;
  523. AssertEquals('Name base type','T',R.Name);
  524. AssertEquals('Correct type def class',TJSTupleTypeDef,T.TypeDef.ClassType);
  525. G:=TJSTupleTypeDef(T.TypeDef);
  526. AssertEquals('Correct number of parameters',2, G.TypeCount);
  527. AssertEquals('Correct type of parameter 0',TJSTypeReference, G.Types[0].Classtype);
  528. R:=G.Types[0] as TJSTypeReference;
  529. AssertEquals('Name base type','T',R.Name);
  530. AssertEquals('Correct type of parameter 1',TJSTypeReference, G.Types[1].Classtype);
  531. R:=G.Types[1] as TJSTypeReference;
  532. AssertEquals('Name base type','T',R.Name);
  533. end;
  534. procedure TTestTypeScriptParser.TestDeclareTypeGenericNested;
  535. Var
  536. T : TJSTypeDeclaration;
  537. G : TJSGenericTypeRef;
  538. R : TJSTypeReference;
  539. begin
  540. StartTS('type a = A<Q,B<C>>;');
  541. T:=GetFirstType;
  542. AssertEquals('Name','a',T.Name);
  543. AssertNotNull('Have type def',T.TypeDef);
  544. AssertEquals('Correct type def class',TJSGenericTypeRef,T.TypeDef.ClassType);
  545. G:=TJSGenericTypeRef(T.TypeDef);
  546. AssertNotNull('have base type',G.BaseType);
  547. AssertEquals('Correct type of base type',TJSTypeReference, G.BaseType.ClassType);
  548. R:=G.BaseType as TJSTypeReference;
  549. AssertEquals('Name base type','A',R.Name);
  550. AssertEquals('Correct number of parameters',2, G.ParamTypeCount);
  551. // Arg 1
  552. AssertEquals('Correct type of parameter 0',TJSTypeReference, G.ParamTypes[0].Classtype);
  553. R:=G.ParamTypes[0] as TJSTypeReference;
  554. AssertEquals('Name base type','Q',R.Name);
  555. // Arg 2
  556. AssertEquals('Correct type of base type',TJSGenericTypeRef, G.ParamTypes[1].Classtype);
  557. G:=G.ParamTypes[1] as TJSGenericTypeRef;
  558. AssertNotNull('have base type',G.BaseType);
  559. AssertEquals('Correct type of base type',TJSTypeReference, G.BaseType.ClassType);
  560. R:=G.BaseType as TJSTypeReference;
  561. AssertEquals('Name base type','B',R.Name);
  562. AssertEquals('Correct number of parameters',1, G.ParamTypeCount);
  563. AssertEquals('Correct type of parameter 0',TJSTypeReference, G.ParamTypes[0].Classtype);
  564. R:=G.ParamTypes[0] as TJSTypeReference;
  565. AssertEquals('Name base type','C',R.Name);
  566. end;
  567. procedure TTestTypeScriptParser.TestDeclareTypeGenericNestedTwice;
  568. Var
  569. T : TJSTypeDeclaration;
  570. begin
  571. StartTS('type a = A<Q<B<C<D>>>>;');
  572. T:=GetFirstType;
  573. AssertEquals('Name','a',T.Name);
  574. AssertNotNull('Have type def',T.TypeDef);
  575. AssertEquals('Correct type def class',TJSGenericTypeRef,T.TypeDef.ClassType);
  576. end;
  577. procedure TTestTypeScriptParser.TestDeclareTypeGenericAssigned;
  578. Var
  579. T : TJSTypeDeclaration;
  580. R : TJSTypeReference;
  581. P : TJSNamedParamTypeDef;
  582. begin
  583. StartTS('type TA<TEvent = any, TResult = any> = B;');
  584. T:=TJSTypeDeclaration(CheckClass('First type',TJSTypeDeclaration,GetFirstType));
  585. R:=TJSTypeReference(CheckClass('Correct type',TJSTypeReference,T.TypeDef));
  586. AssertEquals('Name','B',R.Name);
  587. AssertEquals('Type param count',2,T.TypeParams.Count);
  588. // Param 1
  589. P:=TJSNamedParamTypeDef(CheckClass('Param 1,',TJSNamedParamTypeDef,T.TypeParams.JSElements[0]));
  590. R:=TJSTypeReference(CheckClass('Correct type',TJSTypeReference,P.ParamName));
  591. AssertEquals('Name','TEvent',R.Name);
  592. R:=TJSTypeReference(CheckClass('Correct type',TJSTypeReference,P.ParamType));
  593. AssertEquals('Name','any',R.Name);
  594. // Param 2
  595. P:=TJSNamedParamTypeDef(CheckClass('Param 2,',TJSNamedParamTypeDef,T.TypeParams.JSElements[1]));
  596. R:=TJSTypeReference(CheckClass('Correct type',TJSTypeReference,P.ParamName));
  597. AssertEquals('Name','TResult',R.Name);
  598. R:=TJSTypeReference(CheckClass('Correct type',TJSTypeReference,P.ParamType));
  599. AssertEquals('Name','any',R.Name);
  600. end;
  601. procedure TTestTypeScriptParser.TestDeclareTypeGenericConstSubtype;
  602. Var
  603. T : TJSTypeDeclaration;
  604. G : TJSGenericTypeRef;
  605. R : TJSTypeReference;
  606. begin
  607. StartTS('type StatusCodeMap = Record<string, "trace" | "debug" | "info" | "warn" | "error">');
  608. T:=TJSTypeDeclaration(CheckClass('First type',TJSTypeDeclaration,GetFirstType));
  609. AssertEquals('Name','StatusCodeMap',T.Name);
  610. G:=TJSGenericTypeRef(CheckClass('Correct type',TJSGenericTypeRef,T.TypeDef));
  611. R:=TJSTypeReference(CheckClass('Correct type',TJSTypeReference,G.BaseType));
  612. AssertEquals('Name','Record',R.Name);
  613. end;
  614. procedure TTestTypeScriptParser.TestDeclareTypeObject;
  615. Var
  616. T : TJSTypeDeclaration;
  617. O : TJSObjectTypeDef;
  618. R : TJSTypeReference;
  619. begin
  620. StartTS('type TreeItem = {left : TreeItem, right : TreeItem};');
  621. T:=GetFirstType;
  622. AssertEquals('Name','TreeItem',T.Name);
  623. AssertNotNull('Have type def',T.TypeDef);
  624. AssertEquals('Correct type of typedef',TJSObjectTypeDef, T.TypeDef.ClassType);
  625. O:=TJSObjectTypeDef(T.TypeDef);
  626. AssertEquals('Correct number of elements',2, O.ElementCount);
  627. AssertEquals('Correct name of element 0','left', O.Elements[0].Name);
  628. AssertEquals('Correct type of element 0',TJSTypeReference, O.Elements[0].ElementType.ClassType);
  629. R:=O.Elements[0].ElementType as TJSTypeReference;
  630. AssertEquals('Name base type','TreeItem',R.Name);
  631. AssertEquals('Correct name of element 0','right', O.Elements[1].Name);
  632. AssertEquals('Correct type of element 1',TJSTypeReference, O.Elements[1].ElementType.ClassType);
  633. R:=O.Elements[1].ElementType as TJSTypeReference;
  634. AssertEquals('Name base type','TreeItem',R.Name);
  635. end;
  636. procedure TTestTypeScriptParser.TestDeclareTypeObjectLineBreak;
  637. Var
  638. T : TJSTypeDeclaration;
  639. O : TJSObjectTypeDef;
  640. R : TJSTypeReference;
  641. begin
  642. StartTS('type TreeItem = {'#10+
  643. 'left : TreeItem'#10+
  644. 'right : TreeItem'#10+
  645. '};');
  646. T:=GetFirstType;
  647. AssertEquals('Name','TreeItem',T.Name);
  648. AssertNotNull('Have type def',T.TypeDef);
  649. AssertEquals('Correct type of typedef',TJSObjectTypeDef, T.TypeDef.ClassType);
  650. O:=TJSObjectTypeDef(T.TypeDef);
  651. AssertEquals('Correct number of elements',2, O.ElementCount);
  652. AssertEquals('Correct name of element 0','left', O.Elements[0].Name);
  653. AssertEquals('Correct type of element 0',TJSTypeReference, O.Elements[0].ElementType.ClassType);
  654. R:=O.Elements[0].ElementType as TJSTypeReference;
  655. AssertEquals('Name base type','TreeItem',R.Name);
  656. AssertEquals('Correct name of element 0','right', O.Elements[1].Name);
  657. AssertEquals('Correct type of element 1',TJSTypeReference, O.Elements[1].ElementType.ClassType);
  658. R:=O.Elements[1].ElementType as TJSTypeReference;
  659. AssertEquals('Name base type','TreeItem',R.Name);
  660. end;
  661. procedure TTestTypeScriptParser.TestDeclareTypeObjectIndexSignature;
  662. Var
  663. T : TJSTypeDeclaration;
  664. O : TJSObjectTypeDef;
  665. // R : TJSTypeReference;
  666. SigDecl: TJSIndexSignatureDeclaration;
  667. begin
  668. StartTS('type TreeItem = { [x: string]: never, [x: number]: never };');
  669. T:=GetFirstType;
  670. AssertEquals('Name','TreeItem',T.Name);
  671. AssertNotNull('Have type def',T.TypeDef);
  672. AssertEquals('Correct type of typedef',TJSObjectTypeDef, T.TypeDef.ClassType);
  673. O:=TJSObjectTypeDef(T.TypeDef);
  674. AssertEquals('Correct number of elements',2, O.ElementCount);
  675. SigDecl:=TJSIndexSignatureDeclaration(CheckClass('Index signature',TJSIndexSignatureDeclaration,O.Elements[0]));
  676. AssertEquals('No name','',SigDecl.Name);
  677. AssertEquals('Index type','string',SigDecl.IndexType);
  678. end;
  679. procedure TTestTypeScriptParser.TestDeclareTypeArrowFunction;
  680. Var
  681. T : TJSTypeDeclaration;
  682. A : TJSArrowFunctionTypeDef;
  683. P : TJSTypedParam;
  684. R : TJSTypeReference;
  685. begin
  686. StartTS('type CallBack = (data : t) => void;');
  687. T:=GetFirstType;
  688. AssertEquals('Name','CallBack',T.Name);
  689. A:=TJSArrowFunctionTypeDef(CheckClass(T.TypeDef,TJSArrowFunctionTypeDef,'Have arrow function'));
  690. AssertNotNull('Have function definition',A.aFunction);
  691. R:=TJSTypeReference(CheckClass(A.aFunction.ResultType,TJSTypeReference,'Have function result'));
  692. AssertEquals('result type name','void',R.Name);
  693. AssertEquals('function argument count',1,A.aFunction.TypedParams.Count);
  694. P:=A.aFunction.TypedParams.Params[0];
  695. AssertEquals('param name','data',P.Name);
  696. R:=TJSTypeReference(CheckClass(P.Node,TJSTypeReference,'Have param type'));
  697. AssertEquals('param type name','t',R.Name);
  698. end;
  699. procedure TTestTypeScriptParser.TestDeclareTypeArrowFunctionShort;
  700. Var
  701. T : TJSTypeDeclaration;
  702. A : TJSArrowFunctionTypeDef;
  703. R : TJSTypeReference;
  704. begin
  705. StartTS('type CallBack = () => void;');
  706. T:=GetFirstType;
  707. AssertEquals('Name','CallBack',T.Name);
  708. A:=TJSArrowFunctionTypeDef(CheckClass(T.TypeDef,TJSArrowFunctionTypeDef,'Have arrow function'));
  709. AssertNotNull('Have function definition',A.aFunction);
  710. R:=TJSTypeReference(CheckClass(A.aFunction.ResultType,TJSTypeReference,'Have function result'));
  711. AssertEquals('result type name','void',R.Name);
  712. AssertEquals('function argument count',0,A.aFunction.TypedParams.Count);
  713. end;
  714. procedure TTestTypeScriptParser.TestDeclareTypeArrowFunctionTwoArgs;
  715. Var
  716. T : TJSTypeDeclaration;
  717. A : TJSArrowFunctionTypeDef;
  718. P : TJSTypedParam;
  719. R : TJSTypeReference;
  720. begin
  721. StartTS('type CallBack = (data : t, context: t2) => void;');
  722. T:=GetFirstType;
  723. AssertEquals('Name','CallBack',T.Name);
  724. A:=TJSArrowFunctionTypeDef(CheckClass(T.TypeDef,TJSArrowFunctionTypeDef,'Have arrow function'));
  725. AssertNotNull('Have function definition',A.aFunction);
  726. R:=TJSTypeReference(CheckClass(A.aFunction.ResultType,TJSTypeReference,'Have function result'));
  727. AssertEquals('result type name','void',R.Name);
  728. AssertEquals('function argument count',2,A.aFunction.TypedParams.Count);
  729. P:=A.aFunction.TypedParams.Params[0];
  730. AssertEquals('param name','data',P.Name);
  731. R:=TJSTypeReference(CheckClass(P.Node,TJSTypeReference,'Have param 0 type'));
  732. AssertEquals('param type name','t',R.Name);
  733. P:=A.aFunction.TypedParams.Params[1];
  734. AssertEquals('param name','context',P.Name);
  735. R:=TJSTypeReference(CheckClass(P.Node,TJSTypeReference,'Have param 1 type'));
  736. AssertEquals('param type name','t2',R.Name);
  737. end;
  738. procedure TTestTypeScriptParser.TestDeclareTypeArrowFunctionArgsCommaEnd;
  739. Var
  740. T : TJSTypeDeclaration;
  741. A : TJSArrowFunctionTypeDef;
  742. P : TJSTypedParam;
  743. R : TJSTypeReference;
  744. begin
  745. StartTS('type CallBack = ( '#10+
  746. ' reject: FN,'#10+
  747. ') => void;');
  748. T:=GetFirstType;
  749. AssertEquals('Name','CallBack',T.Name);
  750. A:=TJSArrowFunctionTypeDef(CheckClass(T.TypeDef,TJSArrowFunctionTypeDef,'Have arrow function'));
  751. AssertNotNull('Have function definition',A.aFunction);
  752. R:=TJSTypeReference(CheckClass(A.aFunction.ResultType,TJSTypeReference,'Have function result'));
  753. AssertEquals('result type name','void',R.Name);
  754. AssertEquals('function argument count',1,A.aFunction.TypedParams.Count);
  755. P:=A.aFunction.TypedParams.Params[0];
  756. AssertEquals('param name','reject',P.Name);
  757. R:=TJSTypeReference(CheckClass(P.Node,TJSTypeReference,'Have param 0 type'));
  758. AssertEquals('param type name','FN',R.Name);
  759. end;
  760. procedure TTestTypeScriptParser.TestDeclareTypeObjectPropRef;
  761. Var
  762. aDecl : TJSTypeDeclaration;
  763. ObjType : TJSObjectTypeDef;
  764. PropType : TJSPropertyDeclaration;
  765. U : TJSUnionTypeDef;
  766. A : TJSArrayTypeDef;
  767. F : TJSFixedValueReference;
  768. begin
  769. // rimraf.Options &
  770. StartTs('type Options = {'#10 +
  771. ' glob?: rimraf.Options["glob"] | true;'#10 +
  772. ' disableGlob?: never;'#10 +
  773. ' };');
  774. aDecl:=TJSTypeDeclaration(CheckClass('First type',TJSTypeDeclaration,GetFirstType));
  775. ObjType:=TJSObjectTypeDef(CheckClass('a type',TJSObjectTypeDef,aDecl.TypeDef));
  776. PropType:=TJSPropertyDeclaration(CheckClass('First prop',TJSPropertyDeclaration,ObjType.Elements[0]));
  777. U:=TJSUnionTypeDef(CheckClass('Prop type',TJSUnionTypeDef,PropType.ElementType));
  778. A:=TJSArrayTypeDef(CheckClass('First el',TJSArrayTypeDef,U.Types[0]));
  779. F:=TJSFixedValueReference(CheckClass('Array Index',TJSFixedValueReference,A.IndexType));
  780. AssertEquals('value','glob',F.FixedValue.Value.AsString);
  781. end;
  782. procedure TTestTypeScriptParser.TestDeclareEnum;
  783. Var
  784. E : TJSEnumDeclaration;
  785. ET : TJSEnumTypeDef;
  786. begin
  787. StartTS('enum Colors {red,blue,green};');
  788. E:=GetFirstEnum;
  789. AssertEquals('Name','Colors',E.Name);
  790. ET:=TJSEnumTypeDef(CheckClass(E.EnumDef,TJSEnumTypeDef,'Have enum definition'));
  791. AssertEquals('Member count',3,ET.NameCount);
  792. AssertEquals('Member 0','red',ET.Names[0]);
  793. AssertEquals('Member 1','blue',ET.Names[1]);
  794. AssertEquals('Member 2','green',ET.Names[2]);
  795. end;
  796. procedure TTestTypeScriptParser.TestDeclareEnumKeywordElement;
  797. Var
  798. E : TJSEnumDeclaration;
  799. ET : TJSEnumTypeDef;
  800. begin
  801. StartTS('enum Colors {delete,new,green};');
  802. E:=GetFirstEnum;
  803. AssertEquals('Name','Colors',E.Name);
  804. ET:=TJSEnumTypeDef(CheckClass(E.EnumDef,TJSEnumTypeDef,'Have enum definition'));
  805. AssertEquals('Member count',3,ET.NameCount);
  806. AssertEquals('Member 0','delete',ET.Names[0]);
  807. AssertEquals('Member 1','new',ET.Names[1]);
  808. AssertEquals('Member 2','green',ET.Names[2]);
  809. end;
  810. procedure TTestTypeScriptParser.TestDeclareConstEnum;
  811. Var
  812. Stat : TJSEnumStatement;
  813. E : TJSEnumDeclaration;
  814. ET : TJSEnumTypeDef;
  815. begin
  816. StartTS('const enum Colors {red,blue,green};');
  817. Stat:=TJSEnumStatement(CheckClass('First statement',TJSEnumStatement,GetFirstStatement));
  818. E:=TJSEnumDeclaration(CheckClass('Decl',TJSEnumDeclaration,Stat.EnumDecl));
  819. AssertEquals('Name','Colors',E.Name);
  820. ET:=TJSEnumTypeDef(CheckClass(E.EnumDef,TJSEnumTypeDef,'Have enum definition'));
  821. AssertEquals('Is const',True,ET.IsConst);
  822. AssertEquals('Member count',3,ET.NameCount);
  823. AssertEquals('Member 0','red',ET.Names[0]);
  824. AssertEquals('Member 1','blue',ET.Names[1]);
  825. AssertEquals('Member 2','green',ET.Names[2]);
  826. end;
  827. procedure TTestTypeScriptParser.TestDeclareConstEnumAssigned;
  828. Var
  829. Stat : TJSEnumStatement;
  830. E : TJSEnumDeclaration;
  831. ET : TJSEnumTypeDef;
  832. Lit : TJSLiteral;
  833. begin
  834. StartTS('const enum Colors {red = 1,blue = 2,green};');
  835. Stat:=TJSEnumStatement(CheckClass('First statement',TJSEnumStatement,GetFirstStatement));
  836. E:=TJSEnumDeclaration(CheckClass('Decl',TJSEnumDeclaration,Stat.EnumDecl));
  837. AssertEquals('Name','Colors',E.Name);
  838. ET:=TJSEnumTypeDef(CheckClass(E.EnumDef,TJSEnumTypeDef,'Have enum definition'));
  839. AssertEquals('Is const',True,ET.IsConst);
  840. AssertEquals('Member count',3,ET.NameCount);
  841. AssertEquals('Member 0','red',ET.Names[0]);
  842. lit:=TJSLiteral(CheckClass('Member 0 assigned',TJSLiteral,ET.Elements[0].Value));
  843. AssertEquals('Lit value',1,Lit.Value.AsNumber);
  844. AssertEquals('Member 1','blue',ET.Names[1]);
  845. lit:=TJSLiteral(CheckClass('Member 1 assigned',TJSLiteral,ET.Elements[1].Value));
  846. AssertEquals('Lit value',2,Lit.Value.AsNumber);
  847. AssertEquals('Member 2','green',ET.Names[2]);
  848. end;
  849. procedure TTestTypeScriptParser.TestDeclareInterfaceEmpty;
  850. Var
  851. Decl : TJSInterfaceDeclaration;
  852. begin
  853. StartTS('interface Empty {};');
  854. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  855. AssertNotNull('Have declaration');
  856. AssertEquals('Name','Empty',Decl.Name);
  857. AssertNull('No Extends',Decl.Extends);
  858. // AssertEquals('Extends count',0,Decl.Extends.Count);
  859. AssertEquals('Members count',0,Decl.Values.Count);
  860. end;
  861. procedure TTestTypeScriptParser.TestDeclareAmbientInterfaceEmpty;
  862. Var
  863. Decl : TJSInterfaceDeclaration;
  864. begin
  865. StartTS('declare interface Empty {};');
  866. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  867. AssertEquals('First type node is type declaration',True,GetInterfaces.Nodes[0].IsAmbient);
  868. AssertNotNull('Have declaration');
  869. AssertEquals('Name','Empty',Decl.Name);
  870. AssertNull('No Extends',Decl.Extends);
  871. // AssertEquals('Extends count',0,Decl.Extends.Count);
  872. AssertEquals('Members count',0,Decl.Values.Count);
  873. end;
  874. procedure TTestTypeScriptParser.TestDeclareInterfaceExtendsEmpty;
  875. Var
  876. Decl : TJSInterfaceDeclaration;
  877. Lit : TJSLiteral;
  878. begin
  879. StartTS('interface Empty extends ParentEmpty {};');
  880. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  881. AssertNotNull('Have declaration');
  882. AssertEquals('Name','Empty',Decl.Name);
  883. AssertNotNull('Extends',Decl.Extends);
  884. AssertEquals('Extends count',1,Decl.Extends.Count);
  885. Lit:=TJSLiteral(CheckClass(Decl.Extends.Nodes[0].Node,TJSLiteral,'Literal 0 '));
  886. AssertNotNull('Lit has value',Lit.Value);
  887. AssertEquals('Extends name','ParentEmpty',Lit.Value.AsString);
  888. end;
  889. procedure TTestTypeScriptParser.TestDeclareInterfaceExtendsTwoEmpty;
  890. Var
  891. Decl : TJSInterfaceDeclaration;
  892. Lit : TJSLiteral;
  893. begin
  894. StartTS('interface Empty extends ParentEmpty,MoreEmpty {};');
  895. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  896. AssertNotNull('Have declaration');
  897. AssertEquals('Name','Empty',Decl.Name);
  898. AssertNotNull('Extends',Decl.Extends);
  899. AssertEquals('Extends count',2,Decl.Extends.Count);
  900. Lit:=TJSLiteral(CheckClass(Decl.Extends.Nodes[0].Node,TJSLiteral,'Literal 0 '));
  901. AssertNotNull('Lit has value',Lit.Value);
  902. AssertEquals('Extends name','ParentEmpty',Lit.Value.AsString);
  903. Lit:=TJSLiteral(CheckClass(Decl.Extends.Nodes[1].Node,TJSLiteral,'Literal 0 '));
  904. AssertNotNull('Lit has value',Lit.Value);
  905. AssertEquals('Extends name','MoreEmpty',Lit.Value.AsString);
  906. end;
  907. procedure TTestTypeScriptParser.TestDeclareInterfaceProperty;
  908. Var
  909. Decl : TJSInterfaceDeclaration;
  910. Prop : TJSPropertyDeclaration;
  911. R : TJSTypeReference;
  912. begin
  913. StartTS('interface Friend { name: string; };');
  914. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  915. AssertNotNull('Have declaration');
  916. AssertEquals('Name','Friend',Decl.Name);
  917. AssertNull('Extends',Decl.Extends);
  918. AssertEquals('Member count',1,Decl.ElementCount);
  919. Prop:=TJSPropertyDeclaration(CheckClass('Property class',TJSPropertyDeclaration,Decl.Elements[0]));
  920. AssertEquals('Property name','name',Prop.Name);
  921. AssertEquals('Property optional',koDefault,Prop.Optional);
  922. R:=TJSTypeReference(CheckClass('Property type',TJSTypeReference,Prop.ElementType));
  923. AssertEquals('Property type name','string',R.Name);
  924. end;
  925. procedure TTestTypeScriptParser.TestDeclareInterfaceOptionalProperty;
  926. Var
  927. Decl : TJSInterfaceDeclaration;
  928. Prop : TJSPropertyDeclaration;
  929. R : TJSTypeReference;
  930. begin
  931. StartTS('interface Friend { name ? : string; };');
  932. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  933. AssertNotNull('Have declaration');
  934. AssertEquals('Name','Friend',Decl.Name);
  935. AssertNull('Extends',Decl.Extends);
  936. AssertEquals('Member count',1,Decl.ElementCount);
  937. Prop:=TJSPropertyDeclaration(CheckClass('Property class',TJSPropertyDeclaration,Decl.Elements[0]));
  938. AssertEquals('Property name','name',Prop.Name);
  939. AssertEquals('Property optional',koOptional,Prop.Optional);
  940. R:=TJSTypeReference(CheckClass('Property type',TJSTypeReference,Prop.ElementType));
  941. AssertEquals('Property type name','string',R.Name);
  942. end;
  943. procedure TTestTypeScriptParser.TestDeclareInterfaceUntypedProperty;
  944. Var
  945. Decl : TJSInterfaceDeclaration;
  946. Prop : TJSPropertyDeclaration;
  947. R : TJSTypeReference;
  948. begin
  949. StartTS('interface Friend { name ; };');
  950. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  951. AssertNotNull('Have declaration');
  952. AssertEquals('Name','Friend',Decl.Name);
  953. AssertNull('Extends',Decl.Extends);
  954. AssertEquals('Member count',1,Decl.ElementCount);
  955. Prop:=TJSPropertyDeclaration(CheckClass('Property class',TJSPropertyDeclaration,Decl.Elements[0]));
  956. AssertEquals('Property name','name',Prop.Name);
  957. AssertEquals('Property optional',koDefault,Prop.Optional);
  958. R:=TJSTypeReference(CheckClass('Property type',TJSTypeReference,Prop.ElementType));
  959. AssertEquals('Property type name','any',R.Name);
  960. end;
  961. procedure TTestTypeScriptParser.TestDeclareInterfaceOptionalUntypedProperty;
  962. Var
  963. Decl : TJSInterfaceDeclaration;
  964. Prop : TJSPropertyDeclaration;
  965. R : TJSTypeReference;
  966. begin
  967. StartTS('interface Friend { name ? ; };');
  968. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  969. AssertNotNull('Have declaration');
  970. AssertEquals('Name','Friend',Decl.Name);
  971. AssertNull('Extends',Decl.Extends);
  972. AssertEquals('Member count',1,Decl.ElementCount);
  973. Prop:=TJSPropertyDeclaration(CheckClass('Property class',TJSPropertyDeclaration,Decl.Elements[0]));
  974. AssertEquals('Property name','name',Prop.Name);
  975. AssertEquals('Property optional',koOptional,Prop.Optional);
  976. R:=TJSTypeReference(CheckClass('Property type',TJSTypeReference,Prop.ElementType));
  977. AssertEquals('Property type name','any',R.Name);
  978. end;
  979. procedure TTestTypeScriptParser.TestDeclareInterfaceMethod;
  980. Var
  981. Decl : TJSInterfaceDeclaration;
  982. M : TJSMethodDeclaration;
  983. R : TJSTypeReference;
  984. begin
  985. StartTS('interface JQuery { text (content: string) : string; };');
  986. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  987. AssertNotNull('Have declaration');
  988. AssertEquals('Name','JQuery',Decl.Name);
  989. AssertNull('Extends',Decl.Extends);
  990. AssertEquals('Member count',1,Decl.ElementCount);
  991. M:=TJSMethodDeclaration(CheckClass('Method class',TJSMethodDeclaration,Decl.Elements[0]));
  992. AssertEquals('Method name','text',M.Name);
  993. AssertEquals('Method optional',koDefault,M.Optional);
  994. AssertNotNull('Have function def',M.FuncDef);
  995. R:=TJSTypeReference(CheckClass('Result type',TJSTypeReference,M.FuncDef.ResultType));
  996. AssertEquals('Property type name','string',R.Name);
  997. end;
  998. procedure TTestTypeScriptParser.TestDeclareInterfaceMethodNoReturn;
  999. Var
  1000. Decl : TJSInterfaceDeclaration;
  1001. M : TJSMethodDeclaration;
  1002. R : TJSTypeReference;
  1003. begin
  1004. StartTS('interface JQuery { text (content: string) ; };');
  1005. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  1006. AssertNotNull('Have declaration');
  1007. AssertEquals('Name','JQuery',Decl.Name);
  1008. AssertNull('Extends',Decl.Extends);
  1009. AssertEquals('Member count',1,Decl.ElementCount);
  1010. M:=TJSMethodDeclaration(CheckClass('Method class',TJSMethodDeclaration,Decl.Elements[0]));
  1011. AssertEquals('Method name','text',M.Name);
  1012. AssertEquals('Method optional',koDefault,M.Optional);
  1013. AssertNotNull('Have function def',M.FuncDef);
  1014. R:=TJSTypeReference(CheckClass('Result type',TJSTypeReference,M.FuncDef.ResultType));
  1015. AssertEquals('Property type name','any',R.Name);
  1016. end;
  1017. procedure TTestTypeScriptParser.TestDeclareInterfaceCallable;
  1018. Var
  1019. Decl : TJSInterfaceDeclaration;
  1020. M : TJSMethodDeclaration;
  1021. R : TJSTypeReference;
  1022. begin
  1023. StartTS('interface JQuery { (query : string) : JQuery; };');
  1024. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  1025. AssertNotNull('Have declaration');
  1026. AssertEquals('Name','JQuery',Decl.Name);
  1027. AssertNull('Extends',Decl.Extends);
  1028. AssertEquals('Member count',1,Decl.ElementCount);
  1029. M:=TJSMethodDeclaration(CheckClass('Method class',TJSMethodDeclaration,Decl.Elements[0]));
  1030. AssertEquals('Method name','',M.Name);
  1031. AssertEquals('Method optional',koDefault,M.Optional);
  1032. AssertNotNull('Have function def',M.FuncDef);
  1033. R:=TJSTypeReference(CheckClass('Result type',TJSTypeReference,M.FuncDef.ResultType));
  1034. AssertEquals('Property type name','JQuery',R.Name);
  1035. end;
  1036. procedure TTestTypeScriptParser.TestDeclareInterfaceMethodThisReturn;
  1037. Var
  1038. Decl : TJSInterfaceDeclaration;
  1039. M : TJSMethodDeclaration;
  1040. R : TJSTypeReference;
  1041. begin
  1042. StartTS('interface JQuery { text (content: string) : this; };');
  1043. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  1044. AssertNotNull('Have declaration');
  1045. AssertEquals('Name','JQuery',Decl.Name);
  1046. AssertNull('Extends',Decl.Extends);
  1047. AssertEquals('Member count',1,Decl.ElementCount);
  1048. M:=TJSMethodDeclaration(CheckClass('Method class',TJSMethodDeclaration,Decl.Elements[0]));
  1049. AssertEquals('Method name','text',M.Name);
  1050. AssertEquals('Method optional',koDefault,M.Optional);
  1051. AssertNotNull('Have function def',M.FuncDef);
  1052. R:=TJSTypeReference(CheckClass('Result type',TJSTypeReference,M.FuncDef.ResultType));
  1053. AssertEquals('Property type name','this',R.Name);
  1054. end;
  1055. procedure TTestTypeScriptParser.TestDeclateInterfaceGenericProperty;
  1056. Var
  1057. Decl:TJSInterfaceDeclaration;
  1058. Prop: TJSPropertyDeclaration;
  1059. R: TJSTypeReference;
  1060. U : TJSUnionTypeDef;
  1061. G : TJSGenericTypeRef;
  1062. begin
  1063. STartTS('export interface CalendarBaseProps { '+
  1064. ' dayComponent?: React.Component<DayComponentProps> | React.SFC<DayComponentProps>; '+
  1065. ' disabledByDefault?: boolean;'+
  1066. '};');
  1067. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  1068. AssertEquals('Count elements',2,Decl.ElementCount);
  1069. Prop:=TJSPropertyDeclaration(CheckClass('Property class',TJSPropertyDeclaration,Decl.Elements[0]));
  1070. AssertEquals('Property name','dayComponent',Prop.Name);
  1071. AssertEquals('Property optional',koOptional,Prop.Optional);
  1072. U:=TJSUnionTypeDef(CheckClass('Property type',TJSUnionTypeDef,Prop.ElementType));
  1073. G:=TJSGenericTypeRef(CheckClass('Union 1',TJSGenericTypeRef,U.Types[0]));
  1074. R:=TJSTypeReference(CheckClass('Generic base type',TJSTypeReference,G.BaseType));
  1075. AssertEquals('Generic 1 base type Name ','React.Component',R.Name);
  1076. G:=TJSGenericTypeRef(CheckClass('Union 2',TJSGenericTypeRef,U.Types[1]));
  1077. R:=TJSTypeReference(CheckClass('Generic base type',TJSTypeReference,G.BaseType));
  1078. AssertEquals('Generic 2 base type Name ','React.SFC',R.Name);
  1079. end;
  1080. procedure TTestTypeScriptParser.TestDeclateInterfaceGeneric;
  1081. Var
  1082. Decl : TJSInterfaceDeclaration;
  1083. R : TJSTypeReference;
  1084. Lit : TJSLiteral;
  1085. begin
  1086. StartTS('interface Empty <TItem> extends ParentEmpty {};');
  1087. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  1088. AssertNotNull('Have declaration');
  1089. AssertEquals('Name','Empty',Decl.Name);
  1090. AssertNotNull('Extends',Decl.Extends);
  1091. AssertEquals('Type param count',1,Decl.TypeParams.Count);
  1092. R:=TJSTypeReference(CheckClass('Type param 1',TJSTypeReference,Decl.TypeParams.Nodes[0].Node));
  1093. AssertEquals('Type param Name','TItem',R.Name);
  1094. AssertEquals('Extends count',1,Decl.Extends.Count);
  1095. Lit:=TJSLiteral(CheckClass(Decl.Extends.Nodes[0].Node,TJSLiteral,'Literal 0 '));
  1096. AssertNotNull('Lit has value',Lit.Value);
  1097. AssertEquals('Extends name','ParentEmpty',Lit.Value.AsString);
  1098. end;
  1099. procedure TTestTypeScriptParser.TestDeclareInterfaceExtendsGeneric;
  1100. Var
  1101. Decl : TJSInterfaceDeclaration;
  1102. R : TJSTypeReference;
  1103. begin
  1104. StartTS('interface Empty <TItem> extends ParentEmpty<Titem> {};');
  1105. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  1106. AssertNotNull('Have declaration',Decl);
  1107. AssertEquals('Name','Empty',Decl.Name);
  1108. AssertNotNull('Extends',Decl.Extends);
  1109. AssertEquals('Type param count',1,Decl.TypeParams.Count);
  1110. R:=TJSTypeReference(CheckClass('Type param 1',TJSTypeReference,Decl.TypeParams.Nodes[0].Node));
  1111. AssertEquals('Type param Name','TItem',R.Name);
  1112. AssertEquals('Extends count',1,Decl.Extends.Count);
  1113. end;
  1114. procedure TTestTypeScriptParser.TestDeclareInterfaceHidden;
  1115. Var
  1116. Decl : TJSInterfaceDeclaration;
  1117. begin
  1118. StartTS('interface JQuery extends JQuerySlickInitials {'#10+
  1119. ' hidden: ''mozHidden'' | ''webkitHidden'' | ''hidden'';'#10+
  1120. '}');
  1121. Decl:=TJSInterfaceDeclaration(CheckClass(GetFirstInterface,TJSInterfaceDeclaration,'Interface'));
  1122. AssertNotNull('Have declaration',Decl);
  1123. AssertEquals('Name','JQuery',Decl.Name);
  1124. AssertNotNull('Extends',Decl.Extends);
  1125. end;
  1126. procedure TTestTypeScriptParser.TestDeclareClassEmpty;
  1127. Var
  1128. Decl : TJSClassDeclaration;
  1129. begin
  1130. StartTS('declare class JQuery {};');
  1131. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1132. AssertNotNull('Have declaration');
  1133. AssertEquals('Name','JQuery',Decl.Name);
  1134. AssertNull('Extends',Decl.Extends);
  1135. AssertNull('Members',Decl.Members);
  1136. end;
  1137. procedure TTestTypeScriptParser.TestDeclareAbstractClassEmpty;
  1138. Var
  1139. Decl : TJSClassDeclaration;
  1140. begin
  1141. StartTS('declare abstract class JQuery {};');
  1142. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1143. AssertNotNull('Have declaration');
  1144. AssertEquals('Name','JQuery',Decl.Name);
  1145. AssertNull('Extends',Decl.Extends);
  1146. AssertNull('Members',Decl.Members);
  1147. AssertTrue('Abstract',Decl.IsAbstract);
  1148. end;
  1149. procedure TTestTypeScriptParser.TestDeclareClassIndexSignature;
  1150. Var
  1151. Decl : TJSClassDeclaration;
  1152. SigDecl : TJSIndexSignatureDeclaration;
  1153. begin
  1154. StartTS('class TDictionary { [a : string] : string; } ;');
  1155. Decl:=TJSClassDeclaration(CheckClass('Interface',TJSClassDeclaration,GetFirstClass));
  1156. AssertEquals('Interface name','TDictionary',Decl.Name);
  1157. AssertEquals('One var',1,Decl.Members.Vars.Count);
  1158. SigDecl:=TJSIndexSignatureDeclaration(CheckClass('Index signature',TJSIndexSignatureDeclaration,Decl.Members.Vars[0].Node));
  1159. AssertEquals('No name','',SigDecl.Name);
  1160. AssertEquals('Index type','string',SigDecl.IndexType);
  1161. end;
  1162. procedure TTestTypeScriptParser.TestDeclareClassIndexSignatureIn;
  1163. Var
  1164. Decl : TJSClassDeclaration;
  1165. SigDecl : TJSIndexSignatureDeclaration;
  1166. IndexType : TJSTypeReference;
  1167. begin
  1168. StartTS('class TDictionary { [a in B] : string; } ;');
  1169. Decl:=TJSClassDeclaration(CheckClass('Interface',TJSClassDeclaration,GetFirstClass));
  1170. AssertEquals('Interface name','TDictionary',Decl.Name);
  1171. AssertEquals('One var',1,Decl.Members.Vars.Count);
  1172. SigDecl:=TJSIndexSignatureDeclaration(CheckClass('Index signature',TJSIndexSignatureDeclaration,Decl.Members.Vars[0].Node));
  1173. AssertEquals('No name','',SigDecl.Name);
  1174. IndexType:=TJSTypeReference(CheckClass('Index type',TJSTypeReference,SigDecl.InIndexType));
  1175. AssertEquals('Type ref name','B',IndexType.Name);
  1176. end;
  1177. procedure TTestTypeScriptParser.TestDeclareClassExtendsGeneric;
  1178. Var
  1179. Decl : TJSAmbientClassDeclaration;
  1180. Gen : TJSGenericTypeRef;
  1181. Ref : TJSTypeReference;
  1182. begin
  1183. StartTS('declare class JQuery extends MyClass<any> {};');
  1184. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1185. AssertNotNull('Have declaration');
  1186. AssertEquals('Name','JQuery',Decl.Name);
  1187. Gen:=TJSGenericTypeRef(CheckClass('Extends class',TJSGenericTypeRef,Decl.Extends));
  1188. Ref:=TJSTypeReference(CheckClass('Base class',TJSTypeReference,Gen.BaseType));
  1189. AssertEquals('Name','MyClass',Ref.Name);
  1190. AssertNull('Members',Decl.Members);
  1191. end;
  1192. procedure TTestTypeScriptParser.TestDeclareClassGeneric;
  1193. Var
  1194. Decl : TJSAmbientClassDeclaration;
  1195. Ref : TJSTypeReference;
  1196. begin
  1197. StartTS('declare class JQuery<any> extends MyClass {};');
  1198. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1199. AssertNotNull('Have declaration');
  1200. AssertEquals('Name','JQuery',Decl.Name);
  1201. Ref:=TJSTypeReference(CheckClass('Base class',TJSTypeReference,Decl.extends));
  1202. AssertEquals('Name','MyClass',Ref.Name);
  1203. AssertNotNull('Have type params',Decl.TypeParams);
  1204. AssertEquals('Type Param count ',1,Decl.TypeParams.Count);
  1205. Ref:=TJSTypeReference(CheckClass('Base class',TJSTypeReference,Decl.TypeParams.Nodes[0].Node));
  1206. AssertEquals('Name','any',Ref.Name);
  1207. AssertNull('Members',Decl.Members);
  1208. end;
  1209. procedure TTestTypeScriptParser.TestDeclareClassStaticFunction;
  1210. Var
  1211. Decl : TJSClassDeclaration;
  1212. begin
  1213. StartTS('declare class JQuery { static extends() : string; };');
  1214. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1215. AssertNotNull('Have declaration');
  1216. AssertEquals('Name','JQuery',Decl.Name);
  1217. AssertEquals('Function count',1,Decl.Members.Functions.Count);
  1218. end;
  1219. procedure TTestTypeScriptParser.TestDeclareClassStaticFunctionUntypedArg;
  1220. Var
  1221. Decl : TJSClassDeclaration;
  1222. begin
  1223. StartTS('declare class JQuery { private soso(a) ; };');
  1224. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1225. AssertNotNull('Have declaration');
  1226. AssertEquals('Name','JQuery',Decl.Name);
  1227. AssertEquals('Function count',1,Decl.Members.Functions.Count);
  1228. end;
  1229. procedure TTestTypeScriptParser.TestDeclareClassStaticReadonlyProperty;
  1230. Var
  1231. Decl : TJSClassDeclaration;
  1232. Prop : TJSPropertyDeclaration;
  1233. begin
  1234. StartTS('declare class JQuery { static readonly a : string; };');
  1235. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1236. AssertNotNull('Have declaration');
  1237. AssertEquals('Name','JQuery',Decl.Name);
  1238. AssertEquals('Var count',1,Decl.Members.vars.Count);
  1239. Prop:=TJSPropertyDeclaration(CheckClass('Class',TJSPropertyDeclaration,Decl.Members.vars.JSElements[0]));
  1240. AssertTrue('Prop readonly',Prop.IsReadOnly);
  1241. AssertTrue('Prop Static',Prop.IsStatic);
  1242. end;
  1243. procedure TTestTypeScriptParser.TestDeclareClassReadonlyProperty;
  1244. Var
  1245. Decl : TJSClassDeclaration;
  1246. Prop : TJSPropertyDeclaration;
  1247. begin
  1248. StartTS('declare class JQuery { readonly a : string; };');
  1249. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1250. AssertNotNull('Have declaration');
  1251. AssertEquals('Name','JQuery',Decl.Name);
  1252. AssertEquals('Var count',1,Decl.Members.vars.Count);
  1253. Prop:=TJSPropertyDeclaration(CheckClass('Class',TJSPropertyDeclaration,Decl.Members.vars.JSElements[0]));
  1254. AssertTrue('Prop readonly',Prop.IsReadOnly);
  1255. AssertFalse('Prop Static',Prop.IsStatic);
  1256. end;
  1257. procedure TTestTypeScriptParser.TestDeclareClassGenericFunctionProperty;
  1258. begin
  1259. StartTS('declare class changeRequestInterceptor {'#10+
  1260. ' getRequest: <T>(request: T, entity: Entity, index: number) => T;'#10+
  1261. '}');
  1262. GetFirstClass(True);
  1263. end;
  1264. procedure TTestTypeScriptParser.TestDeclareClassImplements;
  1265. Var
  1266. Decl : TJSClassDeclaration;
  1267. Prop : TJSPropertyDeclaration;
  1268. begin
  1269. StartTS('declare class JQuery implements IQuery { readonly a : string; };');
  1270. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1271. AssertNotNull('Have declaration');
  1272. AssertEquals('Name','JQuery',Decl.Name);
  1273. AssertEquals('Var count',1,Decl.Members.vars.Count);
  1274. Prop:=TJSPropertyDeclaration(CheckClass('Class',TJSPropertyDeclaration,Decl.Members.vars.JSElements[0]));
  1275. AssertTrue('Prop readonly',Prop.IsReadOnly);
  1276. AssertFalse('Prop Static',Prop.IsStatic);
  1277. end;
  1278. procedure TTestTypeScriptParser.TestDeclareClassExtendsFunctionCall;
  1279. Var
  1280. Decl: TJSAmbientClassDeclaration;
  1281. E : TJSTypeFuncCall;
  1282. begin
  1283. StartTS('declare class TextArea extends Component.extend(TextSupport) {}');
  1284. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1285. AssertNotNull('Have declaration',Decl);
  1286. AssertEquals('Name','TextArea',Decl.Name);
  1287. E:=TJSTypeFuncCall(CheckClass('Extends',TJSTypeFuncCall,Decl.Extends));
  1288. AssertEquals('Function name','Component.extend',E.Name);
  1289. end;
  1290. procedure TTestTypeScriptParser.TestDeclareClassStaticReadOnly;
  1291. Var
  1292. Decl: TJSAmbientClassDeclaration;
  1293. E : TJSClassConstDeclaration;
  1294. begin
  1295. StartTS('declare class A { static readonly B = 1 }');
  1296. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1297. AssertNotNull('Have declaration',Decl);
  1298. AssertEquals('Name','A',Decl.Name);
  1299. AssertEquals('member count',1,Decl.ClassDef.ElementCount);
  1300. AssertEquals('Member name','B',Decl.ClassDef.Elements[0].Name);
  1301. E:=TJSClassConstDeclaration(CheckClass('Member class',TJSClassConstDeclaration,Decl.ClassDef.Elements[0]));
  1302. AssertNotNull(E);
  1303. end;
  1304. procedure TTestTypeScriptParser.TestDeclareInterfaceIndexSignature;
  1305. Var
  1306. Decl : TJSInterfaceDeclaration;
  1307. SigDecl : TJSIndexSignatureDeclaration;
  1308. begin
  1309. StartTS('interface TDictionary { [a : string] : string; } ;');
  1310. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1311. AssertEquals('Interface name','TDictionary',Decl.Name);
  1312. AssertEquals('One var',1,Decl.ElementCount);
  1313. SigDecl:=TJSIndexSignatureDeclaration(CheckClass('Index signature',TJSIndexSignatureDeclaration,Decl.Elements[0]));
  1314. AssertEquals('No name','',SigDecl.Name);
  1315. end;
  1316. procedure TTestTypeScriptParser.TestDeclareInterfaceFixedStringProperty;
  1317. Var
  1318. Decl : TJSInterfaceDeclaration;
  1319. Prop : TJSPropertyDeclaration;
  1320. begin
  1321. StartTS('export interface Color { R : "red" } ;');
  1322. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1323. AssertEquals('Interface name','Color',Decl.Name);
  1324. AssertEquals('One member',1,Decl.ElementCount);
  1325. Prop:=TJSPropertyDeclaration(CheckClass('Element 0',TJSPropertyDeclaration,Decl.Elements[0]));
  1326. AssertEquals('member name','R',Prop.Name);
  1327. AssertEquals('member fixed value','red',Prop.FixedStringValue);
  1328. end;
  1329. procedure TTestTypeScriptParser.TestDeclareInterfaceFixedBooleanProperty;
  1330. Var
  1331. Decl : TJSInterfaceDeclaration;
  1332. Prop : TJSPropertyDeclaration;
  1333. Fix : TJSFixedValueReference;
  1334. begin
  1335. StartTS('export interface Color { R : false } ;');
  1336. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1337. AssertEquals('Interface name','Color',Decl.Name);
  1338. AssertEquals('One member',1,Decl.ElementCount);
  1339. Prop:=TJSPropertyDeclaration(CheckClass('Element 0',TJSPropertyDeclaration,Decl.Elements[0]));
  1340. AssertEquals('member name','R',Prop.Name);
  1341. Fix:=TJSFixedValueReference(CheckClass('member fixed value',TJSFixedValueReference,Prop.ElementType));
  1342. AssertNotNull('Value literal',Fix.FixedValue);
  1343. end;
  1344. procedure TTestTypeScriptParser.TestDeclareInterfaceFixedUnionProperty;
  1345. Var
  1346. Decl : TJSInterfaceDeclaration;
  1347. Prop : TJSPropertyDeclaration;
  1348. U : TJSUnionTypeDef;
  1349. Fix : TJSFixedValueReference;
  1350. begin
  1351. StartTS('export interface Color { R : false | ''string'' } ;');
  1352. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1353. AssertEquals('Interface name','Color',Decl.Name);
  1354. AssertEquals('One member',1,Decl.ElementCount);
  1355. Prop:=TJSPropertyDeclaration(CheckClass('Element 0',TJSPropertyDeclaration,Decl.Elements[0]));
  1356. AssertEquals('member name','R',Prop.Name);
  1357. U:=TJSUnionTypeDef(CheckClass('member fixed value',TJSUnionTypeDef,Prop.ElementType));
  1358. AssertEquals('Member count',2,U.TypeCount);
  1359. Fix:=TJSFixedValueReference(CheckClass('member fixed value',TJSFixedValueReference,U.Types[0]));
  1360. AssertNotNull('Value literal',Fix.FixedValue);
  1361. Fix:=TJSFixedValueReference(CheckClass('member fixed value',TJSFixedValueReference,U.Types[1]));
  1362. AssertNotNull('Value literal',Fix.FixedValue);
  1363. end;
  1364. procedure TTestTypeScriptParser.TestDeclareInterfaceDestructuredFunctionProperty;
  1365. begin
  1366. StartTs('interface I18nComponentProps {'#10+
  1367. ' children: ({ i18n, i18nHash }: { i18n: I18n, i18nHash?: string }) => ReactNode;'#10+
  1368. '}');
  1369. AssertNotNull(GetFirstStatement);
  1370. end;
  1371. procedure TTestTypeScriptParser.TestDeclareExportInterfaceDestructuredFunctionProperty;
  1372. begin
  1373. StartTs('export interface I18nComponentProps {'#10+
  1374. ' children: ({ i18n, i18nHash }: { i18n: I18n, i18nHash?: string }) => ReactNode;'#10+
  1375. '}');
  1376. AssertNotNull(GetFirstStatement);
  1377. end;
  1378. procedure TTestTypeScriptParser.TestDeclareInterfaceNoSemicolon;
  1379. begin
  1380. StartTs(' interface Conversions {'#10+
  1381. ' ansi: (ansi: number) => string'#10+
  1382. ' rgb: (r: number, g: number, b: number) => string'#10+
  1383. '}');
  1384. AssertNotNull(GetFirstStatement);
  1385. end;
  1386. procedure TTestTypeScriptParser.TestDeclareConstructorSignature;
  1387. Var
  1388. Decl : TJSInterfaceDeclaration;
  1389. meth : TJSMethodDeclaration;
  1390. begin
  1391. StartTS('export interface Color { new (r: number, g:number, b : number) : Color; } ;');
  1392. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1393. AssertEquals('Interface name','Color',Decl.Name);
  1394. AssertEquals('One member',1,Decl.ElementCount);
  1395. Meth:=TJSMethodDeclaration(CheckClass('Element 0',TJSMethodDeclaration,Decl.Elements[0]));
  1396. AssertEquals('member name','new',Meth.Name);
  1397. end;
  1398. procedure TTestTypeScriptParser.TestDeclareFunctionDestructuredParam;
  1399. begin
  1400. StartTS('declare function A({b,c,d} : E): F;');
  1401. GetStatements;
  1402. end;
  1403. procedure TTestTypeScriptParser.TestDeclareFunctionIs;
  1404. begin
  1405. StartTS('declare function hasOwnProperty(target: A): target is B ;');
  1406. GetStatements;
  1407. end;
  1408. procedure TTestTypeScriptParser.TestDeclareFunctionThisParam;
  1409. begin
  1410. StartTS('declare function hasOwnProperty(this: A): B ;');
  1411. GetStatements;
  1412. end;
  1413. procedure TTestTypeScriptParser.TestDeclareTypeGenericConstraint;
  1414. Var
  1415. Decl : TJSTypeDeclaration;
  1416. begin
  1417. StartTs('type ValueMap<T extends BaseType, Datum> = { [key: string]: number | string | boolean | null | ValueFn<T, Datum, number | string | boolean | null> };');
  1418. Decl:=GetFirstType;
  1419. AssertNotNull(Decl);
  1420. end;
  1421. procedure TTestTypeScriptParser.TestDeclareTypeTypeImport;
  1422. Var
  1423. Decl : TJSImportTypeRef;
  1424. begin
  1425. StartTS(' type AppChannel = import(''main'').AppChannel;');
  1426. Decl:=TJSImportTypeRef(CheckClass('First',TJSImportTypeRef,GetFirstType.TypeDef));
  1427. AssertEquals('Name','AppChannel',Decl.Name);
  1428. AssertEquals('File','main',Decl.fileName);
  1429. end;
  1430. procedure TTestTypeScriptParser.TestDeclareTypeTypeOfImport;
  1431. Var
  1432. Decl : TJSImportTypeRef;
  1433. begin
  1434. StartTS(' type AppChannel = typeof import(''main'').AppChannel;');
  1435. Decl:=TJSImportTypeRef(CheckClass('First',TJSImportTypeRef,GetFirstType.TypeDef));
  1436. AssertEquals('Name','AppChannel',Decl.Name);
  1437. AssertEquals('File','main',Decl.fileName);
  1438. AssertEquals('File',True,Decl.IsTypeOf);
  1439. end;
  1440. procedure TTestTypeScriptParser.TestDeclareTypeTypeOfDefault;
  1441. Var
  1442. Decl : TJSImportTypeRef;
  1443. begin
  1444. StartTS(' type AppChannel = typeof import(''main'').default;');
  1445. Decl:=TJSImportTypeRef(CheckClass('First',TJSImportTypeRef,GetFirstType.TypeDef));
  1446. AssertEquals('Name','default',Decl.Name);
  1447. AssertEquals('File','main',Decl.fileName);
  1448. AssertEquals('File',True,Decl.IsTypeOf);
  1449. end;
  1450. procedure TTestTypeScriptParser.TestDeclareTypeReadonly;
  1451. Var
  1452. Decl : TJSFunctionStatement;
  1453. Def : TJSFuncDef;
  1454. R : TJSTypeReference;
  1455. begin
  1456. StartTS('declare function markdownTable(table: readonly string): string;');
  1457. Decl:=GetFirstFunction;
  1458. AssertNotNull('Have decl',Decl.AFunction);
  1459. Def:=Decl.AFunction;
  1460. AssertEquals('Params',1,Def.TypedParams.Count);
  1461. R:=TJSTypeReference(CheckClass('Arg type',TJSTypeReference,Def.TypedParams.Types[0]));
  1462. AssertTrue('Read only',R.IsReadonly);
  1463. end;
  1464. procedure TTestTypeScriptParser.TestDeclareArgTypeInferred;
  1465. Var
  1466. Decl : TJSTypeDeclaration;
  1467. begin
  1468. StartTS('type A = (args: infer B) => C;');
  1469. Decl:=GetFirstType;
  1470. AssertNotNull(Decl);
  1471. end;
  1472. procedure TTestTypeScriptParser.TestExportNamespacedClass;
  1473. Var
  1474. NS : TJSNamespaceDeclaration;
  1475. Exp : TJSExportStatement;
  1476. begin
  1477. StartTS('export namespace Collection {'#10+
  1478. ' type EventType = string;'#10+
  1479. ' class Event extends events.Event {'#10+
  1480. ' constructor(type: EventType, opt_element?: any);'#10+
  1481. ' element: any;'#10+
  1482. ' }'#10+
  1483. '}');
  1484. Exp:=TJSExportStatement(CheckClass('Export',TJSExportStatement,GetFirstStatement));
  1485. NS:=TJSNamespaceDeclaration(CheckClass('Namespace', TJSNamespaceDeclaration, Exp.Declaration));
  1486. AssertEquals('NS name','Collection',NS.Name);
  1487. end;
  1488. procedure TTestTypeScriptParser.TestExportClassConstructor;
  1489. Var
  1490. Decl : TJSClassDeclaration;
  1491. begin
  1492. StartTS('export class JQuery { constructor (); };');
  1493. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1494. AssertNotNull('Have declaration');
  1495. AssertEquals('Name','JQuery',Decl.Name);
  1496. AssertNull('Extends',Decl.Extends);
  1497. AssertNotNull('Members',Decl.Members);
  1498. AssertEquals('members count',1,Decl.Members.Functions.Count);
  1499. AssertFalse('Abstract',Decl.IsAbstract);
  1500. end;
  1501. procedure TTestTypeScriptParser.TestExportAbstractClass;
  1502. Var
  1503. Decl : TJSAmbientClassDeclaration;
  1504. begin
  1505. StartTS('export abstract class JQuery {};');
  1506. Decl:=TJSAmbientClassDeclaration(CheckClass('Class',TJSAmbientClassDeclaration,GetFirstClass(True)));
  1507. AssertNotNull('Have declaration');
  1508. AssertEquals('Name','JQuery',Decl.Name);
  1509. AssertNull('Extends',Decl.Extends);
  1510. AssertNull('Members',Decl.Members);
  1511. AssertTrue('Abstract',Decl.IsAbstract);
  1512. end;
  1513. procedure TTestTypeScriptParser.TestExportInterface;
  1514. Var
  1515. Decl : TJSInterfaceDeclaration;
  1516. begin
  1517. StartTS('export interface Color { R,G,B : string; } ;');
  1518. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1519. AssertEquals('Interface name','Color',Decl.Name);
  1520. end;
  1521. procedure TTestTypeScriptParser.TestExportInterfaceDefault;
  1522. Var
  1523. Decl : TJSInterfaceDeclaration;
  1524. begin
  1525. StartTS('export default interface Color { R,G,B : string; } ;');
  1526. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1527. AssertEquals('Interface name','Color',Decl.Name);
  1528. end;
  1529. procedure TTestTypeScriptParser.TestExportInterfaceIndexSignature;
  1530. Var
  1531. Decl : TJSInterfaceDeclaration;
  1532. SigDecl : TJSIndexSignatureDeclaration;
  1533. begin
  1534. StartTS('export interface Color { level : string; [key : string] : any; } ;');
  1535. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1536. AssertEquals('Interface name','Color',Decl.Name);
  1537. AssertEquals('One var',2,Decl.ElementCount);
  1538. SigDecl:=TJSIndexSignatureDeclaration(CheckClass('Index signature',TJSIndexSignatureDeclaration,Decl.Elements[1]));
  1539. AssertEquals('No name','',SigDecl.Name);
  1540. end;
  1541. procedure TTestTypeScriptParser.TestExportInterfaceIndexSignatureOptional;
  1542. Var
  1543. Decl : TJSInterfaceDeclaration;
  1544. SigDecl : TJSIndexSignatureDeclaration;
  1545. begin
  1546. StartTS('export interface Color { [key : string] ? : any; } ;');
  1547. Decl:=TJSInterfaceDeclaration(CheckClass('Interface',TJSInterfaceDeclaration,GetFirstInterface));
  1548. AssertEquals('Interface name','Color',Decl.Name);
  1549. AssertEquals('One var',1,Decl.ElementCount);
  1550. SigDecl:=TJSIndexSignatureDeclaration(CheckClass('Index signature',TJSIndexSignatureDeclaration,Decl.Elements[0]));
  1551. AssertEquals('No name','',SigDecl.Name);
  1552. end;
  1553. procedure TTestTypeScriptParser.TestExportImportStatement;
  1554. Var
  1555. expDecl : TJSExportStatement;
  1556. Decl : TJSImportStatement;
  1557. Call : TJSCallExpression;
  1558. begin
  1559. StartTS('export import LocaleConfig = require("locale");');
  1560. ExpDecl:=TJSExportStatement(CheckClass('import',TJSExportStatement,GetFirstStatement));
  1561. Decl:=TJSImportStatement(CheckClass('import',TJSImportStatement,expDecl.Declaration));
  1562. Call:=TJSCallExpression(CheckClass('Have import assign', TJSCallExpression, Decl.Expression));
  1563. AssertNotNull('Have call expression',Call.Expr);
  1564. CheckClass('Call function name',TJSPrimaryExpressionIdent,Call.Expr);
  1565. AssertEquals('call function','require',TJSPrimaryExpressionIdent(Call.Expr).Name);
  1566. end;
  1567. procedure TTestTypeScriptParser.TestExportAssignStatement;
  1568. var
  1569. Decl: TJSExportStatement;
  1570. begin
  1571. StartTS('export = LocaleConfig;');
  1572. Decl:=TJSExportStatement(CheckClass('export',TJSExportStatement,GetFirstStatement));
  1573. AssertNotNull('Have assignment',Decl.Declaration);
  1574. end;
  1575. procedure TTestTypeScriptParser.TestExportAsNamespace;
  1576. var
  1577. Decl: TJSExportStatement;
  1578. begin
  1579. StartTS('export as namespace B;');
  1580. Decl:=TJSExportStatement(CheckClass('export',TJSExportStatement,GetFirstStatement));
  1581. AssertEquals('Namespace export','B',Decl.NameSpaceExport);
  1582. end;
  1583. procedure TTestTypeScriptParser.TestExportNamespaceClass;
  1584. var
  1585. Decl: TJSNamespaceDeclaration;
  1586. begin
  1587. StartTS('declare namespace g { export class Grid { collection(name?: string): mongo.Collection; } };');
  1588. Decl:=TJSNamespaceDeclaration(CheckClass('export',TJSNamespaceDeclaration,GetFirstNameSpace));
  1589. AssertNotNull('Have namespace',Decl);
  1590. end;
  1591. procedure TTestTypeScriptParser.TestExportFunction;
  1592. Var
  1593. Exp : TJSExportStatement;
  1594. begin
  1595. StartTs('export function clone(stylesheet: CSSStyleSheet): CSSStyleSheet;'#10+
  1596. 'export function parse(token: string): CSSStyleSheet;');
  1597. AssertEquals('Statement count',2,GetStatements.Count);
  1598. Exp:=TJSExportStatement(CheckClass('export',TJSExportStatement,GetFirstStatement));
  1599. AssertNotNull('Have statement',Exp);
  1600. end;
  1601. procedure TTestTypeScriptParser.TestExportDefaultFunction;
  1602. Var
  1603. Exp : TJSExportStatement;
  1604. begin
  1605. StartTs('export default function (stylesheet: CSSStyleSheet): CSSStyleSheet;');
  1606. AssertEquals('Statement count',1,GetStatements.Count);
  1607. Exp:=TJSExportStatement(CheckClass('export',TJSExportStatement,GetFirstStatement));
  1608. AssertNotNull('Have statement',Exp);
  1609. end;
  1610. procedure TTestTypeScriptParser.TestExportTypeArrowFunctionArgsComma;
  1611. Var
  1612. S : TJSExportStatement;
  1613. begin
  1614. StartTS('export type ConnectionRequestCb = ('#10+
  1615. ' info: ConnectionRequestInfo,'#10+
  1616. ' accept: ConnectionRequestAcceptFn,'#10+
  1617. ' reject: ConnectionRequestRejectFn,'#10+
  1618. ' ) => void;');
  1619. S:=TJSExportStatement(CheckClass('First statement',TJSExportStatement,GetFirstStatement));
  1620. CheckClass('Decl',TJSTypeDeclaration,S.Declaration);
  1621. end;
  1622. procedure TTestTypeScriptParser.TestExportEnum;
  1623. Var
  1624. S : TJSExportStatement;
  1625. E : TJSEnumDeclaration;
  1626. ET : TJSEnumTypeDef;
  1627. begin
  1628. StartTS('export enum Colors {red,blue,green};');
  1629. S:=TJSExportStatement(CheckClass('First statement',TJSExportStatement,GetFirstStatement));
  1630. E:=TJSEnumDeclaration(CheckClass('Decl',TJSEnumDeclaration,S.Declaration));
  1631. AssertEquals('Name','Colors',E.Name);
  1632. ET:=TJSEnumTypeDef(CheckClass(E.EnumDef,TJSEnumTypeDef,'Have enum definition'));
  1633. AssertEquals('Member count',3,ET.NameCount);
  1634. AssertEquals('Member 0','red',ET.Names[0]);
  1635. AssertEquals('Member 1','blue',ET.Names[1]);
  1636. AssertEquals('Member 2','green',ET.Names[2]);
  1637. end;
  1638. procedure TTestTypeScriptParser.TestExportObjectUnion;
  1639. begin
  1640. StartTs('export type VisitorIdentifier = { id: string } | { user_id: string };'#10+
  1641. 'export interface Visitor {'#10+
  1642. ' type: "visitor"; '#10+
  1643. '}');
  1644. AssertNotNull(GetStatements);
  1645. end;
  1646. procedure TTestTypeScriptParser.TestExportNoSemicolon;
  1647. begin
  1648. StartTs('export function intlReducer(state: IntlState | undefined, action: IntlAction): IntlState'#10+
  1649. 'export function updateIntl (opts: IntlState): IntlAction');
  1650. AssertNotNull(GetStatements);
  1651. end;
  1652. procedure TTestTypeScriptParser.TestExportAsKeyWord;
  1653. begin
  1654. StartTs('export { del as delete };');
  1655. AssertNotNull(GetStatements);
  1656. end;
  1657. procedure TTestTypeScriptParser.TestNamespaceInterfaceFunction;
  1658. Var
  1659. NS : TJSNameSpaceStatement;
  1660. begin
  1661. StartTs('declare namespace Rox {'#10+
  1662. ' interface RoxContainer {'#10+
  1663. ' [key: string]: Flag | RoxNumber | RoxString;'#10+
  1664. ' }'#10+
  1665. ' function register(namespace: string, roxContainer: RoxContainer): void;'#10+
  1666. ' function register(roxContainer: RoxContainer): void;'#10+
  1667. '}');
  1668. NS:=TJSNameSpaceStatement(CheckClass('NS',TJSNameSpaceStatement,GetFirstStatement));
  1669. AssertNotNull(NS);
  1670. end;
  1671. initialization
  1672. RegisterTest(TTestTypeScriptParser);
  1673. end.