tcparser.pp 124 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463
  1. unit tcparser;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, jstoken, jsParser, jstree, jsbase;
  6. type
  7. { TTestJSParser }
  8. { TTestBaseJSParser }
  9. TTestBaseJSParser = class(TTestCase)
  10. Private
  11. FSource : TStringStream;
  12. FParser : TJSParser;
  13. FSE : TJSSourceElements;
  14. FToFree: TJSElement;
  15. protected
  16. procedure SetUp; override;
  17. procedure TearDown; override;
  18. Procedure CreateParser(Const ASource : string; aVersion : TECMAVersion = TECMAVersion.ecma5; aIsTypeScript : Boolean = False);
  19. Function CheckClass(E : TJSElement; C : TJSElementClass; Const aMsg : String = '') : TJSElement;
  20. Function CheckClass(Const aMsg : String; aExpectedClass : TJSElementClass; aActual : TJSElement) : TJSElement;
  21. Procedure AssertEquals(Const AMessage : String; Expected, Actual : TJSToken); overload;
  22. Procedure AssertEquals(Const AMessage : String; Expected, Actual : TJSType); overload;
  23. Procedure AssertEquals(Const AMessage : String; Expected, Actual : TJSVarType); overload;
  24. Procedure AssertIdentifier(Msg : String; El : TJSElement; Const AName : TJSString);
  25. procedure AssertEquals(Const AMessage : String; aExpected : AnsiString; aActual : TJSString); overload;
  26. Function GetSourceElements : TJSSourceElements;
  27. Function GetVars : TJSElementNodes;
  28. Function GetStatements : TJSElementNodes;
  29. Function GetFunctions : TJSElementNodes;
  30. Function GetFirstFunction : TJSFunctionDeclarationStatement;
  31. Function GetClasses : TJSElementNodes;
  32. Function GetFirstClass(isAmbient : Boolean = false) : TJSClassDeclaration;
  33. Function GetFirstStatement : TJSElement;
  34. Function GetFirstVar : TJSElement;
  35. Function GetModules : TJSElementNodes;
  36. Function GetFirstModule : TJSModuleDeclaration;
  37. Function GetNameSpaces : TJSElementNodes;
  38. Function GetFirstNameSpace : TJSNamespaceDeclaration;
  39. Function GetTypes : TJSElementNodes;
  40. Function GetFirstType : TJSTypeDeclaration;
  41. Function GetEnums : TJSElementNodes;
  42. Function GetFirstEnum: TJSEnumDeclaration;
  43. Function GetExpressionStatement : TJSExpressionStatement;
  44. Function GetInterfaces : TJSElementNodes;
  45. Function GetFirstInterface : TJSInterfaceDeclaration;
  46. end;
  47. TTestJSParser= class(TTestBaseJSParser)
  48. private
  49. published
  50. procedure TestEmpty;
  51. procedure TestSimple;
  52. procedure TestSimpleExpressionNumericalLiteral;
  53. procedure TestSimpleExpressionStringLiteral;
  54. procedure TestSimpleExpressionBooleanLiteralFalse;
  55. procedure TestSimpleExpressionBooleanLiteralTrue;
  56. procedure TestSimpleExpressionIdentifier;
  57. procedure TestSimpleExpressionNull;
  58. procedure TestAssignExpressionNumerical;
  59. procedure TestAssignExpressionNull;
  60. procedure TestAssignExpressionString;
  61. procedure TestAssignExpressionBooleanFalse;
  62. procedure TestAssignExpressionBooleanTrue;
  63. procedure TestAssignExpressionIdent;
  64. procedure TestAssignExpressionPlus;
  65. procedure TestAssignExpressionMinus;
  66. procedure TestAssignExpressionDiv;
  67. procedure TestAssignExpressionMul;
  68. procedure TestAssignExpressionMod;
  69. procedure TestAssignExpressionAnd;
  70. procedure TestAssignExpressionOr;
  71. procedure TestAssignExpressionXOr;
  72. procedure TestAssignExpressionLShift;
  73. procedure TestAssignExpressionRShift;
  74. procedure TestAssignExpressionURShift;
  75. procedure TestExpressionPlus;
  76. procedure TestExpressionSub;
  77. procedure TestExpressionMul;
  78. procedure TestExpressionDiv;
  79. procedure TestExpressionMod;
  80. procedure TestExpressionLShift;
  81. procedure TestExpressionRShift;
  82. procedure TestExpressionURShift;
  83. procedure TestExpressionPostPlusPlus;
  84. procedure TestExpressionPostMinusMinus;
  85. procedure TestExpressionPreMinusMinus;
  86. procedure TestExpressionPrePlusPlus;
  87. procedure TestExpressionPrecedenceMulPlus;
  88. procedure TestExpressionPrecedencePlusMul;
  89. procedure TestExpressionPrecedenceMulMinus;
  90. procedure TestExpressionPrecedenceMinusMul;
  91. procedure TestExpressionPrecedenceDivPlus;
  92. procedure TestExpressionPrecedencePlusDiv;
  93. procedure TestExpressionPrecedenceModPlus;
  94. procedure TestExpressionPrecedencePlusMod;
  95. procedure TestExpressionPrecedencePlusPostPlusPlus;
  96. procedure TestExpressionPrecedencePlusPostMinusMinus;
  97. procedure TestExpressionPrecedenceMulPostMinusMinus;
  98. procedure TestExpressionPrecedenceMulPostPlusPlus;
  99. procedure TestExpressionPrecedenceMulPreMinusMinus;
  100. procedure TestExpressionPrecedenceMulPrePlusPlus;
  101. procedure TestExpressionPrecedencePlusPreMinusMinus;
  102. procedure TestExpressionPrecedencePlusPrePlusPlus;
  103. procedure TestExpressionPrecedencePlusInv;
  104. procedure TestExpressionPrecedenceMulInv;
  105. procedure TestExpressionPrecedenceMulNot;
  106. procedure TestExpressionPrecedencePlusNot;
  107. procedure TestExpressionPrecedenceBraceMulPlus;
  108. procedure TestExpressionPrecedenceBracePlusMul;
  109. procedure TestExpressionFunction;
  110. procedure TestFunctionCallNoArgs;
  111. procedure TestAwaitFunctionCallNoArgs;
  112. procedure TestFunctionCallOneArg;
  113. procedure TestFunctionCallTwoArgs;
  114. procedure TestObjectGeneratorFunction;
  115. procedure TestArrayExpressionNumericalArgs;
  116. procedure TestArrayExpressionStringArgs;
  117. procedure TestArrayExpressionIdentArgs;
  118. Procedure TestVarDeclarationSimple;
  119. Procedure TestVarDeclarationInit;
  120. Procedure TestLetDeclarationSimple;
  121. procedure TestVarDeclarationDouble;
  122. procedure TestVarDeclarationSimpleInit;
  123. procedure TestConstDeclarationSimpleInit;
  124. procedure TestVarDeclarationDoubleInit;
  125. procedure TestDebuggerStatement;
  126. procedure TestBlockEmpty;
  127. procedure TestBlockEmptyStatement;
  128. procedure TestBlockSimpleStatement;
  129. procedure TestFunctionDeclarationEmpty;
  130. procedure TestFunctionDeclarationAsync;
  131. procedure TestFunctionDeclarationWithArgs;
  132. procedure TestFunctionDeclarationWithSpreadArgs;
  133. procedure TestFunctionDeclarationWithBody;
  134. procedure TestIfSimple;
  135. procedure TestIfElseSimple;
  136. procedure TestIfEmptyBlock;
  137. procedure TestIfEmptyBlockElse;
  138. procedure TestWhileSimple;
  139. procedure TestWhileBlock;
  140. procedure TestDoWhileSimple;
  141. procedure TestDoWhileBlock;
  142. procedure TestForEmpty;
  143. procedure TestForEmptyBody;
  144. procedure TestForSimpleBody;
  145. procedure TestTryCatch;
  146. procedure TestTryCatchFinally;
  147. procedure TestTryFinally;
  148. procedure TestThrow;
  149. procedure TestReturn;
  150. procedure TestAssignment;
  151. procedure TestNew;
  152. procedure TestLabeledStatement;
  153. procedure TestContinue;
  154. procedure TestContinueTarget;
  155. procedure TestBreak;
  156. procedure TestBreakTarget;
  157. procedure TestSwitchEmpty;
  158. procedure TestSwitchOne;
  159. procedure TestSwitchTwo;
  160. procedure TestSwitchTwoDefault;
  161. Procedure TestImportModule;
  162. Procedure TestImportImportedDefault;
  163. Procedure TestImportNamespaceImport;
  164. Procedure TestImportImportedDefaultAndNamespaceImport;
  165. Procedure TestImportNamedImport;
  166. Procedure TestImportNamedImportAlias;
  167. Procedure TestImport2NamedImports;
  168. Procedure TestImport2NamedImportAlias;
  169. Procedure TestImport2NamedImportsComma;
  170. Procedure TestImportDefaultAndNamedImport;
  171. Procedure TestExportAll;
  172. Procedure TestExportAllFrom;
  173. Procedure TestExportExportNameFrom;
  174. Procedure TestExportExportName;
  175. Procedure TestExportExportNameAlias;
  176. Procedure TestExportVar;
  177. Procedure TestExportLet;
  178. Procedure TestExportConst;
  179. Procedure TestExportFunction;
  180. Procedure TestExportDefaultAssignment;
  181. Procedure TestExportDefaultFunction;
  182. Procedure TestExportDefaultAsyncFunction;
  183. Procedure TestClass;
  184. Procedure TestClassExtends;
  185. Procedure TestClassWithMethod;
  186. procedure TestClassExpression;
  187. procedure TestLetClassExpression;
  188. end;
  189. implementation
  190. uses typinfo;
  191. { ----------------------------------------------------------------------
  192. TTestBaseJSParser
  193. ----------------------------------------------------------------------}
  194. procedure TTestBaseJSParser.SetUp;
  195. begin
  196. FParser:=Nil;
  197. FSource:=Nil;
  198. end;
  199. procedure TTestBaseJSParser.TearDown;
  200. begin
  201. FreeAndNil(FToFree);
  202. FreeAndNil(FParser);
  203. FReeAndNil(FSource);
  204. end;
  205. Procedure TTestBaseJSParser.CreateParser(Const ASource: string; aVersion : TECMAVersion = TECMAVersion.ecma5; aIsTypeScript : Boolean = False);
  206. begin
  207. FSource:=TStringStream.Create(ASource);
  208. FParser:=TJSParser.Create(FSource,aVersion,aIsTypescript);
  209. end;
  210. function TTestBaseJSParser.CheckClass(E: TJSElement; C: TJSElementClass; const aMsg: String): TJSElement;
  211. begin
  212. AssertNotNull(aMsg+': Not null element',E);
  213. AssertNotNull(aMsg+': Not null class',C);
  214. AssertEquals(aMsg,C,E.ClassType);
  215. Result:=E;
  216. end;
  217. function TTestBaseJSParser.CheckClass(const aMsg: String; aExpectedClass: TJSElementClass; aActual: TJSElement): TJSElement;
  218. begin
  219. Result:=CheckClass(aActual,aExpectedClass,aMsg);
  220. end;
  221. procedure TTestBaseJSParser.AssertEquals(const AMessage: String; Expected, Actual: TJSToken);
  222. Var
  223. NE,NA : String;
  224. begin
  225. NE:=GetEnumName(TypeInfo(TJSToken),Ord(Expected));
  226. NA:=GetEnumName(TypeInfo(TJSToken),Ord(Actual));
  227. AssertEquals(AMessage,NE,NA);
  228. end;
  229. Function TTestBaseJSParser.GetSourceElements: TJSSourceElements;
  230. Var
  231. E : TJSElement;
  232. FB : TJSFunctionBody;
  233. begin
  234. If Not Assigned(FSE) then
  235. begin
  236. AssertNotNull('Parser assigned',FParser);
  237. E:=FParser.Parse;
  238. CheckClass(E,TJSFunctionBody);
  239. FB:=TJSFunctionBody(E);
  240. AssertNotNull(FB.A);
  241. CheckClass(FB.A,TJSSourceElements);
  242. FSE:=TJSSourceElements(FB.A);
  243. FToFree:=E;
  244. end;
  245. Result:=FSE;
  246. end;
  247. Function TTestBaseJSParser.GetVars: TJSElementNodes;
  248. begin
  249. Result:=GetSourceElements.Vars;
  250. end;
  251. Function TTestBaseJSParser.GetStatements: TJSElementNodes;
  252. begin
  253. Result:=GetSourceElements.Statements;
  254. end;
  255. Function TTestBaseJSParser.GetFunctions: TJSElementNodes;
  256. begin
  257. Result:=GetSourceElements.Functions;
  258. end;
  259. function TTestBaseJSParser.GetFirstFunction: TJSFunctionDeclarationStatement;
  260. Var
  261. aFunctions : TJSElementNodes;
  262. begin
  263. aFunctions:=GetFunctions;
  264. AssertTrue('Have functions ',aFunctions.Count>0);
  265. AssertNotNull('have first function node',aFunctions.Nodes[0].Node);
  266. AssertEquals('First function node is function declaration',TJSFunctionDeclarationStatement,aFunctions.Nodes[0].Node.ClassType);
  267. Result:=TJSFunctionDeclarationStatement(aFunctions.Nodes[0].Node);
  268. end;
  269. function TTestBaseJSParser.GetClasses: TJSElementNodes;
  270. begin
  271. Result:=GetSourceElements.Classes;
  272. end;
  273. function TTestBaseJSParser.GetFirstClass(isAmbient : Boolean = false): TJSClassDeclaration;
  274. Var
  275. aClasses : TJSElementNodes;
  276. begin
  277. aClasses:=GetClasses;
  278. AssertTrue('Have classes ',aClasses.Count>0);
  279. AssertNotNull('have first class node',aClasses.Nodes[0].Node);
  280. if IsAmbient then
  281. AssertEquals('First class node is ambientclass declaration',TJSAmbientClassDeclaration,aClasses.Nodes[0].Node.ClassType)
  282. else
  283. AssertEquals('First class node is class declaration',TJSClassDeclaration,aClasses.Nodes[0].Node.ClassType);
  284. Result:=TJSClassDeclaration(aClasses.Nodes[0].Node);
  285. end;
  286. Procedure TTestBaseJSParser.AssertEquals(Const AMessage: String; Expected,
  287. Actual: TJSType);
  288. Var
  289. NE,NA : String;
  290. begin
  291. NE:=GetEnumName(TypeInfo(TJSType),Ord(Expected));
  292. NA:=GetEnumName(TypeInfo(TJSType),Ord(Actual));
  293. AssertEquals(AMessage,NE,NA);
  294. end;
  295. procedure TTestBaseJSParser.AssertEquals(const AMessage: String; Expected, Actual: TJSVarType);
  296. Var
  297. NE,NA : String;
  298. begin
  299. NE:=GetEnumName(TypeInfo(TJSVarType),Ord(Expected));
  300. NA:=GetEnumName(TypeInfo(TJSVarType),Ord(Actual));
  301. AssertEquals(AMessage,NE,NA);
  302. end;
  303. Procedure TTestBaseJSParser.AssertIdentifier(Msg: String; El: TJSElement;
  304. Const AName: TJSString);
  305. Var
  306. L : TJSPrimaryExpressionIdent;
  307. S1,S2 : TJSString;
  308. begin
  309. AssertNotNull(Msg+' have TJSPrimaryExpressionIdent element',El);
  310. CheckClass(El,TJSPrimaryExpressionIdent);
  311. L:=TJSPrimaryExpressionIdent(el);
  312. S1:=L.Name;
  313. S2:=Aname;
  314. AssertEquals(Msg+'Identifier has correct name',S2,S1);
  315. end;
  316. procedure TTestBaseJSParser.AssertEquals(const AMessage: String; aExpected: AnsiString; aActual: TJSString);
  317. begin
  318. AssertEquals(AMessage,UTF8Decode(aExpected),aActual);
  319. end;
  320. Function TTestBaseJSParser.GetFirstStatement: TJSElement;
  321. Var
  322. E : TJSElementNodes;
  323. begin
  324. E:=GetStatements;
  325. AssertNotNull('Have statements',E);
  326. AssertTrue('1 statement',1<=E.Count);
  327. Result:=E.Nodes[0].Node;
  328. AssertNotNull('First statement assigned',Result);
  329. end;
  330. Function TTestBaseJSParser.GetFirstVar: TJSElement;
  331. Var
  332. E : TJSElementNodes;
  333. begin
  334. E:=GetVars;
  335. AssertNotNull('Have statements',E);
  336. Writeln('Count : ',E.Count);
  337. If (E.Count=0) then
  338. Fail('Zero variables defined');
  339. Result:=E.Nodes[0].Node;
  340. AssertNotNull('First variable declaration',Result);
  341. end;
  342. function TTestBaseJSParser.GetModules: TJSElementNodes;
  343. begin
  344. Result:=GetSourceElements.Modules;
  345. end;
  346. function TTestBaseJSParser.GetFirstModule: TJSModuleDeclaration;
  347. Var
  348. E : TJSElementNodes;
  349. begin
  350. E:=GetModules;
  351. AssertNotNull('Have modules',E);
  352. AssertEquals('1 statement',1,E.Count);
  353. AssertEquals('First module node is module declaration',TJSModuleDeclaration,E.Nodes[0].Node.ClassType);
  354. Result:=E.Nodes[0].Node as TJSModuleDeclaration;
  355. end;
  356. function TTestBaseJSParser.GetNameSpaces: TJSElementNodes;
  357. begin
  358. Result:=GetSourceElements.NameSpaces;
  359. end;
  360. function TTestBaseJSParser.GetFirstNameSpace: TJSNamespaceDeclaration;
  361. Var
  362. E : TJSElementNodes;
  363. begin
  364. E:=GetNameSpaces;
  365. AssertNotNull('Have namespaces',E);
  366. AssertEquals('1 namespace',1,E.Count);
  367. AssertEquals('First module node is namespace declaration',TJSNamespaceDeclaration,E.Nodes[0].Node.ClassType);
  368. Result:=E.Nodes[0].Node as TJSNamespaceDeclaration;
  369. end;
  370. function TTestBaseJSParser.GetTypes: TJSElementNodes;
  371. begin
  372. Result:=GetSourceElements.Types;
  373. end;
  374. function TTestBaseJSParser.GetFirstType: TJSTypeDeclaration;
  375. Var
  376. E : TJSElementNodes;
  377. begin
  378. E:=GetTypes;
  379. AssertNotNull('Have types',E);
  380. AssertEquals('1 type',1,E.Count);
  381. AssertEquals('First type node is type declaration',TJSTypeDeclaration,E.Nodes[0].Node.ClassType);
  382. Result:=(E.Nodes[0].Node as TJSTypeDeclaration);
  383. end;
  384. function TTestBaseJSParser.GetEnums: TJSElementNodes;
  385. begin
  386. Result:=GetSourceElements.Enums;
  387. end;
  388. function TTestBaseJSParser.GetFirstEnum: TJSEnumDeclaration;
  389. Var
  390. E : TJSElementNodes;
  391. begin
  392. E:=GetEnums;
  393. AssertNotNull('Have enums',E);
  394. AssertEquals('1 type',1,E.Count);
  395. AssertEquals('First type node is enum declaration',TJSEnumDeclaration,E.Nodes[0].Node.ClassType);
  396. Result:=(E.Nodes[0].Node as TJSEnumDeclaration);
  397. end;
  398. Function TTestBaseJSParser.GetExpressionStatement: TJSExpressionStatement;
  399. Var
  400. N : TJSElement;
  401. begin
  402. N:=GetFirstStatement;
  403. CheckClass(N,TJSExpressionStatement);
  404. Result:=TJSExpressionStatement(N);
  405. end;
  406. function TTestBaseJSParser.GetInterfaces: TJSElementNodes;
  407. begin
  408. Result:=GetSourceElements.Interfaces;
  409. end;
  410. function TTestBaseJSParser.GetFirstInterface: TJSInterfaceDeclaration;
  411. Var
  412. E : TJSElementNodes;
  413. begin
  414. E:=GetInterfaces;
  415. AssertNotNull('Have interfaces',E);
  416. AssertEquals('1 interfaces',1,E.Count);
  417. AssertEquals('First interface node is interface declaration',TJSInterfaceDeclaration,E.Nodes[0].Node.ClassType);
  418. Result:=(E.Nodes[0].Node as TJSInterfaceDeclaration);
  419. end;
  420. { ----------------------------------------------------------------------
  421. TTestJSParser
  422. ----------------------------------------------------------------------}
  423. procedure TTestJSParser.TestSimple;
  424. Var
  425. E : TJSElementNodes;
  426. N : TJSElement;
  427. X : TJSExpressionStatement;
  428. begin
  429. CreateParser('1;');
  430. E:=GetStatements;
  431. AssertNotNull('Have statements',E);
  432. AssertEquals('1 statement',1,E.Count);
  433. N:=E.Nodes[0].Node;
  434. AssertNotNull('First statement assigned',N);
  435. AssertNotNull('First statement assigned',N);
  436. CheckClass(N,TJSExpressionStatement);
  437. X:=TJSExpressionStatement(N);
  438. AssertNotNull('Expression statement assigned',X.A);
  439. CheckClass(X.A,TJSLiteral);
  440. end;
  441. procedure TTestJSParser.TestSimpleExpressionNumericalLiteral;
  442. Var
  443. X : TJSExpressionStatement;
  444. begin
  445. CreateParser('1;');
  446. X:=GetExpressionStatement;
  447. AssertNotNull('Expression statement assigned',X.A);
  448. CheckClass(X.A,TJSLiteral);
  449. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  450. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(X.A).Value.ValueType);
  451. AssertEquals('Expression value correct', 1.0,TJSLiteral(X.A).Value.AsNumber);
  452. end;
  453. procedure TTestJSParser.TestSimpleExpressionStringLiteral;
  454. Var
  455. X : TJSExpressionStatement;
  456. begin
  457. CreateParser('"string";');
  458. X:=GetExpressionStatement;
  459. AssertNotNull('Expression statement assigned',X.A);
  460. CheckClass(X.A,TJSLiteral);
  461. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  462. AssertEquals('Expression value type correct', jstString,TJSLiteral(X.A).Value.ValueType);
  463. AssertEquals('Expression value correct', 'string',TJSLiteral(X.A).Value.AsString);
  464. end;
  465. procedure TTestJSParser.TestSimpleExpressionBooleanLiteralFalse;
  466. Var
  467. X : TJSExpressionStatement;
  468. begin
  469. CreateParser('false;');
  470. X:=GetExpressionStatement;
  471. AssertNotNull('Expression statement assigned',X.A);
  472. CheckClass(X.A,TJSLiteral);
  473. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  474. AssertEquals('Expression value type correct', jstBoolean,TJSLiteral(X.A).Value.ValueType);
  475. AssertEquals('Expression value correct', False, TJSLiteral(X.A).Value.AsBoolean);
  476. end;
  477. procedure TTestJSParser.TestSimpleExpressionIdentifier;
  478. Var
  479. X : TJSExpressionStatement;
  480. begin
  481. CreateParser('Something;');
  482. X:=GetExpressionStatement;
  483. AssertNotNull('Expression statement assigned',X.A);
  484. CheckClass(X.A,TJSPrimaryExpressionIdent);
  485. AssertEquals('Expression value assigned','Something',TJSPrimaryExpressionIdent(X.A).Name);
  486. end;
  487. procedure TTestJSParser.TestSimpleExpressionNull;
  488. Var
  489. X : TJSExpressionStatement;
  490. begin
  491. CreateParser('null;');
  492. X:=GetExpressionStatement;
  493. AssertNotNull('Expression statement assigned',X.A);
  494. CheckClass(X.A,TJSLiteral);
  495. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  496. AssertEquals('Expression value type correct', jstNull,TJSLiteral(X.A).Value.ValueType);
  497. AssertEquals('Expression value correct', True, TJSLiteral(X.A).Value.IsNull);
  498. end;
  499. procedure TTestJSParser.TestAssignExpressionNumerical;
  500. Var
  501. X : TJSExpressionStatement;
  502. SA : TJSSimpleAssignStatement;
  503. begin
  504. CreateParser('a=1;');
  505. X:=GetExpressionStatement;
  506. AssertNotNull('Expression statement assigned',X.A);
  507. CheckClass(X.A,TJSSimpleAssignStatement);
  508. SA:=TJSSimpleAssignStatement(X.A);
  509. AssertNotNull('Assignment LHS assigned',SA.LHS);
  510. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  511. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  512. AssertNotNull('Assignment Expression assigned',SA.Expr);
  513. CheckClass(SA.EXPR,TJSLiteral);
  514. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  515. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  516. end;
  517. procedure TTestJSParser.TestAssignExpressionString;
  518. Var
  519. X : TJSExpressionStatement;
  520. SA : TJSSimpleAssignStatement;
  521. begin
  522. CreateParser('a="string";');
  523. X:=GetExpressionStatement;
  524. AssertNotNull('Expression statement assigned',X.A);
  525. CheckClass(X.A,TJSSimpleAssignStatement);
  526. SA:=TJSSimpleAssignStatement(X.A);
  527. AssertNotNull('Assignment LHS assigned',SA.LHS);
  528. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  529. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  530. AssertNotNull('Assignment Expression assigned',SA.Expr);
  531. CheckClass(SA.EXPR,TJSLiteral);
  532. AssertEquals('Expression value type correct', jstString,TJSLiteral(SA.Expr).Value.ValueType);
  533. AssertEquals('Expression value correct', 'string', TJSLiteral(SA.Expr).Value.AsString);
  534. end;
  535. procedure TTestJSParser.TestAssignExpressionBooleanFalse;
  536. Var
  537. X : TJSExpressionStatement;
  538. SA : TJSSimpleAssignStatement;
  539. begin
  540. CreateParser('a=false;');
  541. X:=GetExpressionStatement;
  542. AssertNotNull('Expression statement assigned',X.A);
  543. CheckClass(X.A,TJSSimpleAssignStatement);
  544. SA:=TJSSimpleAssignStatement(X.A);
  545. AssertNotNull('Assignment LHS assigned',SA.LHS);
  546. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  547. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  548. AssertNotNull('Assignment Expression assigned',SA.Expr);
  549. CheckClass(SA.EXPR,TJSLiteral);
  550. AssertEquals('Expression value type correct', jstBoolean,TJSLiteral(SA.Expr).Value.ValueType);
  551. AssertEquals('Expression value correct', False, TJSLiteral(SA.Expr).Value.AsBoolean);
  552. end;
  553. procedure TTestJSParser.TestAssignExpressionBooleanTrue;
  554. Var
  555. X : TJSExpressionStatement;
  556. SA : TJSSimpleAssignStatement;
  557. begin
  558. CreateParser('a=true;');
  559. X:=GetExpressionStatement;
  560. AssertNotNull('Expression statement assigned',X.A);
  561. CheckClass(X.A,TJSSimpleAssignStatement);
  562. SA:=TJSSimpleAssignStatement(X.A);
  563. AssertNotNull('Assignment LHS assigned',SA.LHS);
  564. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  565. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  566. AssertNotNull('Assignment Expression assigned',SA.Expr);
  567. CheckClass(SA.EXPR,TJSLiteral);
  568. AssertEquals('Expression value type correct', jstBoolean,TJSLiteral(SA.Expr).Value.ValueType);
  569. AssertEquals('Expression value correct', True, TJSLiteral(SA.Expr).Value.AsBoolean);
  570. end;
  571. procedure TTestJSParser.TestAssignExpressionNull;
  572. Var
  573. X : TJSExpressionStatement;
  574. SA : TJSSimpleAssignStatement;
  575. begin
  576. CreateParser('a=null;');
  577. X:=GetExpressionStatement;
  578. AssertNotNull('Expression statement assigned',X.A);
  579. CheckClass(X.A,TJSSimpleAssignStatement);
  580. SA:=TJSSimpleAssignStatement(X.A);
  581. AssertNotNull('Assignment LHS assigned',SA.LHS);
  582. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  583. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  584. AssertNotNull('Assignment Expression assigned',SA.Expr);
  585. CheckClass(SA.EXPR,TJSLiteral);
  586. AssertEquals('Expression value type correct', jstNull,TJSLiteral(SA.Expr).Value.ValueType);
  587. AssertEquals('Expression value correct', True, TJSLiteral(SA.Expr).Value.IsNull);
  588. end;
  589. procedure TTestJSParser.TestAssignExpressionIdent;
  590. Var
  591. X : TJSExpressionStatement;
  592. SA : TJSSimpleAssignStatement;
  593. begin
  594. CreateParser('a=b;');
  595. X:=GetExpressionStatement;
  596. AssertNotNull('Expression statement assigned',X.A);
  597. CheckClass(X.A,TJSSimpleAssignStatement);
  598. SA:=TJSSimpleAssignStatement(X.A);
  599. AssertNotNull('Assignment LHS assigned',SA.LHS);
  600. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  601. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  602. AssertNotNull('Assignment Expression assigned',SA.Expr);
  603. CheckClass(SA.EXPR,TJSPrimaryExpressionIdent);
  604. AssertEquals('Expression value type correct', 'b',TJSPrimaryExpressionIdent(SA.Expr).Name);
  605. end;
  606. procedure TTestJSParser.TestAssignExpressionPlus;
  607. Var
  608. X : TJSExpressionStatement;
  609. SA : TJSAddEqAssignStatement;
  610. begin
  611. CreateParser('a+=1;');
  612. X:=GetExpressionStatement;
  613. AssertNotNull('Expression statement assigned',X.A);
  614. CheckClass(X.A,TJSAddEqAssignStatement);
  615. SA:=TJSAddEqAssignStatement(X.A);
  616. AssertNotNull('Assignment LHS assigned',SA.LHS);
  617. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  618. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  619. AssertNotNull('Assignment Expression assigned',SA.Expr);
  620. CheckClass(SA.EXPR,TJSLiteral);
  621. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  622. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  623. end;
  624. procedure TTestJSParser.TestAssignExpressionMinus;
  625. Var
  626. X : TJSExpressionStatement;
  627. SA : TJSSubEqAssignStatement;
  628. begin
  629. CreateParser('a-=1;');
  630. X:=GetExpressionStatement;
  631. AssertNotNull('Expression statement assigned',X.A);
  632. CheckClass(X.A,TJSSubEqAssignStatement);
  633. SA:=TJSSubEqAssignStatement(X.A);
  634. AssertNotNull('Assignment LHS assigned',SA.LHS);
  635. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  636. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  637. AssertNotNull('Assignment Expression assigned',SA.Expr);
  638. CheckClass(SA.EXPR,TJSLiteral);
  639. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  640. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  641. end;
  642. procedure TTestJSParser.TestAssignExpressionMul;
  643. Var
  644. X : TJSExpressionStatement;
  645. SA : TJSMulEqAssignStatement;
  646. begin
  647. CreateParser('a*=1;');
  648. X:=GetExpressionStatement;
  649. AssertNotNull('Expression statement assigned',X.A);
  650. CheckClass(X.A,TJSMulEqAssignStatement);
  651. SA:=TJSMulEqAssignStatement(X.A);
  652. AssertNotNull('Assignment LHS assigned',SA.LHS);
  653. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  654. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  655. AssertNotNull('Assignment Expression assigned',SA.Expr);
  656. CheckClass(SA.EXPR,TJSLiteral);
  657. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  658. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  659. end;
  660. procedure TTestJSParser.TestAssignExpressionDiv;
  661. Var
  662. X : TJSExpressionStatement;
  663. SA : TJSDivEqAssignStatement;
  664. begin
  665. CreateParser('a/=1;');
  666. X:=GetExpressionStatement;
  667. AssertNotNull('Expression statement assigned',X.A);
  668. CheckClass(X.A,TJSDivEqAssignStatement);
  669. SA:=TJSDivEqAssignStatement(X.A);
  670. AssertNotNull('Assignment LHS assigned',SA.LHS);
  671. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  672. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  673. AssertNotNull('Assignment Expression assigned',SA.Expr);
  674. CheckClass(SA.EXPR,TJSLiteral);
  675. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  676. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  677. end;
  678. procedure TTestJSParser.TestAssignExpressionMod;
  679. Var
  680. X : TJSExpressionStatement;
  681. SA : TJSModEqAssignStatement;
  682. begin
  683. CreateParser('a%=1;');
  684. X:=GetExpressionStatement;
  685. AssertNotNull('Expression statement assigned',X.A);
  686. CheckClass(X.A,TJSModEqAssignStatement);
  687. SA:=TJSModEqAssignStatement(X.A);
  688. AssertNotNull('Assignment LHS assigned',SA.LHS);
  689. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  690. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  691. AssertNotNull('Assignment Expression assigned',SA.Expr);
  692. CheckClass(SA.EXPR,TJSLiteral);
  693. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  694. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  695. end;
  696. procedure TTestJSParser.TestAssignExpressionAnd;
  697. Var
  698. X : TJSExpressionStatement;
  699. SA : TJSAndEqAssignStatement;
  700. begin
  701. CreateParser('a&=1;');
  702. X:=GetExpressionStatement;
  703. AssertNotNull('Expression statement assigned',X.A);
  704. CheckClass(X.A,TJSAndEqAssignStatement);
  705. SA:=TJSAndEqAssignStatement(X.A);
  706. AssertNotNull('Assignment LHS assigned',SA.LHS);
  707. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  708. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  709. AssertNotNull('Assignment Expression assigned',SA.Expr);
  710. CheckClass(SA.EXPR,TJSLiteral);
  711. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  712. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  713. end;
  714. procedure TTestJSParser.TestAssignExpressionOr;
  715. Var
  716. X : TJSExpressionStatement;
  717. SA : TJSOrEqAssignStatement;
  718. begin
  719. CreateParser('a|=1;');
  720. X:=GetExpressionStatement;
  721. AssertNotNull('Expression statement assigned',X.A);
  722. CheckClass(X.A,TJSOrEqAssignStatement);
  723. SA:=TJSOrEqAssignStatement(X.A);
  724. AssertNotNull('Assignment LHS assigned',SA.LHS);
  725. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  726. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  727. AssertNotNull('Assignment Expression assigned',SA.Expr);
  728. CheckClass(SA.EXPR,TJSLiteral);
  729. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  730. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  731. end;
  732. procedure TTestJSParser.TestAssignExpressionXOr;
  733. Var
  734. X : TJSExpressionStatement;
  735. SA : TJSXOrEqAssignStatement;
  736. begin
  737. CreateParser('a^=1;');
  738. X:=GetExpressionStatement;
  739. AssertNotNull('Expression statement assigned',X.A);
  740. CheckClass(X.A,TJSXOrEqAssignStatement);
  741. SA:=TJSXOrEqAssignStatement(X.A);
  742. AssertNotNull('Assignment LHS assigned',SA.LHS);
  743. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  744. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  745. AssertNotNull('Assignment Expression assigned',SA.Expr);
  746. CheckClass(SA.EXPR,TJSLiteral);
  747. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  748. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  749. end;
  750. procedure TTestJSParser.TestAssignExpressionLShift;
  751. Var
  752. X : TJSExpressionStatement;
  753. SA : TJSLShiftEqAssignStatement;
  754. begin
  755. CreateParser('a<<=1;');
  756. X:=GetExpressionStatement;
  757. AssertNotNull('Expression statement assigned',X.A);
  758. CheckClass(X.A,TJSLShiftEqAssignStatement);
  759. SA:=TJSLShiftEqAssignStatement(X.A);
  760. AssertNotNull('Assignment LHS assigned',SA.LHS);
  761. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  762. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  763. AssertNotNull('Assignment Expression assigned',SA.Expr);
  764. CheckClass(SA.EXPR,TJSLiteral);
  765. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  766. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  767. end;
  768. procedure TTestJSParser.TestAssignExpressionRShift;
  769. Var
  770. X : TJSExpressionStatement;
  771. SA : TJSRShiftEqAssignStatement;
  772. begin
  773. CreateParser('a>>=1;');
  774. X:=GetExpressionStatement;
  775. AssertNotNull('Expression statement assigned',X.A);
  776. CheckClass(X.A,TJSRShiftEqAssignStatement);
  777. SA:=TJSRShiftEqAssignStatement(X.A);
  778. AssertNotNull('Assignment LHS assigned',SA.LHS);
  779. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  780. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  781. AssertNotNull('Assignment Expression assigned',SA.Expr);
  782. CheckClass(SA.EXPR,TJSLiteral);
  783. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  784. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  785. end;
  786. procedure TTestJSParser.TestAssignExpressionURShift;
  787. Var
  788. X : TJSExpressionStatement;
  789. SA : TJSURShiftEqAssignStatement;
  790. begin
  791. CreateParser('a>>>=1;');
  792. X:=GetExpressionStatement;
  793. AssertNotNull('Expression statement assigned',X.A);
  794. CheckClass(X.A,TJSURShiftEqAssignStatement);
  795. SA:=TJSURShiftEqAssignStatement(X.A);
  796. AssertNotNull('Assignment LHS assigned',SA.LHS);
  797. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  798. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  799. AssertNotNull('Assignment Expression assigned',SA.Expr);
  800. CheckClass(SA.EXPR,TJSLiteral);
  801. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  802. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  803. end;
  804. procedure TTestJSParser.TestExpressionPlus;
  805. Var
  806. X : TJSExpressionStatement;
  807. E : TJSAdditiveExpressionPlus;
  808. begin
  809. CreateParser('1+2;');
  810. X:=GetExpressionStatement;
  811. AssertNotNull('Expression statement assigned',X.A);
  812. CheckClass(X.A,TJSAdditiveExpressionPlus);
  813. E:=TJSAdditiveExpressionPlus(X.A);
  814. AssertNotNull('Expression left operand assigned',E.A);
  815. AssertNotNull('Expression right operand assigned',E.B);
  816. CheckClass(E.A,TJSLiteral);
  817. CheckClass(E.B,TJSLiteral);
  818. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  819. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  820. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  821. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  822. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  823. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  824. end;
  825. procedure TTestJSParser.TestExpressionSub;
  826. Var
  827. X : TJSExpressionStatement;
  828. E : TJSAdditiveExpressionMinus;
  829. begin
  830. CreateParser('1 - 2;');
  831. X:=GetExpressionStatement;
  832. AssertNotNull('Expression statement assigned',X.A);
  833. CheckClass(X.A,TJSAdditiveExpressionMinus);
  834. E:=TJSAdditiveExpressionMinus(X.A);
  835. AssertNotNull('Expression left operand assigned',E.A);
  836. AssertNotNull('Expression right operand assigned',E.B);
  837. CheckClass(E.A,TJSLiteral);
  838. CheckClass(E.B,TJSLiteral);
  839. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  840. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  841. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  842. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  843. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  844. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  845. end;
  846. procedure TTestJSParser.TestExpressionMul;
  847. Var
  848. X : TJSExpressionStatement;
  849. E : TJSMultiplicativeExpressionMul;
  850. begin
  851. CreateParser('1*2;');
  852. X:=GetExpressionStatement;
  853. AssertNotNull('Expression statement assigned',X.A);
  854. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  855. E:=TJSMultiplicativeExpressionMul(X.A);
  856. AssertNotNull('Expression left operand assigned',E.A);
  857. AssertNotNull('Expression right operand assigned',E.B);
  858. CheckClass(E.A,TJSLiteral);
  859. CheckClass(E.B,TJSLiteral);
  860. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  861. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  862. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  863. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  864. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  865. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  866. end;
  867. procedure TTestJSParser.TestExpressionDiv;
  868. Var
  869. X : TJSExpressionStatement;
  870. E : TJSMultiplicativeExpressionDiv;
  871. begin
  872. CreateParser('1/2;');
  873. X:=GetExpressionStatement;
  874. AssertNotNull('Expression statement assigned',X.A);
  875. CheckClass(X.A,TJSMultiplicativeExpressionDiv);
  876. E:=TJSMultiplicativeExpressionDiv(X.A);
  877. AssertNotNull('Expression left operand assigned',E.A);
  878. AssertNotNull('Expression right operand assigned',E.B);
  879. CheckClass(E.A,TJSLiteral);
  880. CheckClass(E.B,TJSLiteral);
  881. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  882. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  883. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  884. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  885. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  886. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  887. end;
  888. procedure TTestJSParser.TestExpressionMod;
  889. Var
  890. X : TJSExpressionStatement;
  891. E : TJSMultiplicativeExpressionMod;
  892. begin
  893. CreateParser('1%2;');
  894. X:=GetExpressionStatement;
  895. AssertNotNull('Expression statement assigned',X.A);
  896. CheckClass(X.A,TJSMultiplicativeExpressionMod);
  897. E:=TJSMultiplicativeExpressionMod(X.A);
  898. AssertNotNull('Expression left operand assigned',E.A);
  899. AssertNotNull('Expression right operand assigned',E.B);
  900. CheckClass(E.A,TJSLiteral);
  901. CheckClass(E.B,TJSLiteral);
  902. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  903. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  904. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  905. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  906. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  907. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  908. end;
  909. procedure TTestJSParser.TestExpressionLShift;
  910. Var
  911. X : TJSExpressionStatement;
  912. E : TJSLShiftExpression;
  913. begin
  914. CreateParser('1 << 2;');
  915. X:=GetExpressionStatement;
  916. AssertNotNull('Expression statement assigned',X.A);
  917. CheckClass(X.A,TJSLShiftExpression);
  918. E:=TJSLShiftExpression(X.A);
  919. AssertNotNull('Expression left operand assigned',E.A);
  920. AssertNotNull('Expression right operand assigned',E.B);
  921. CheckClass(E.A,TJSLiteral);
  922. CheckClass(E.B,TJSLiteral);
  923. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  924. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  925. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  926. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  927. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  928. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  929. end;
  930. procedure TTestJSParser.TestExpressionRShift;
  931. Var
  932. X : TJSExpressionStatement;
  933. E : TJSRShiftExpression;
  934. begin
  935. CreateParser('1 >> 2;');
  936. X:=GetExpressionStatement;
  937. AssertNotNull('Expression statement assigned',X.A);
  938. CheckClass(X.A,TJSRShiftExpression);
  939. E:=TJSRShiftExpression(X.A);
  940. AssertNotNull('Expression left operand assigned',E.A);
  941. AssertNotNull('Expression right operand assigned',E.B);
  942. CheckClass(E.A,TJSLiteral);
  943. CheckClass(E.B,TJSLiteral);
  944. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  945. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  946. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  947. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  948. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  949. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  950. end;
  951. procedure TTestJSParser.TestExpressionURShift;
  952. Var
  953. X : TJSExpressionStatement;
  954. E : TJSURShiftExpression;
  955. begin
  956. CreateParser('1 >>> 2;');
  957. X:=GetExpressionStatement;
  958. AssertNotNull('Expression statement assigned',X.A);
  959. CheckClass(X.A,TJSURShiftExpression);
  960. E:=TJSURShiftExpression(X.A);
  961. AssertNotNull('Expression left operand assigned',E.A);
  962. AssertNotNull('Expression right operand assigned',E.B);
  963. CheckClass(E.A,TJSLiteral);
  964. CheckClass(E.B,TJSLiteral);
  965. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  966. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  967. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  968. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  969. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  970. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  971. end;
  972. procedure TTestJSParser.TestExpressionPostPlusPlus;
  973. Var
  974. X : TJSExpressionStatement;
  975. E : TJSUnaryPostPlusPlusExpression;
  976. begin
  977. CreateParser('1++;');
  978. X:=GetExpressionStatement;
  979. AssertNotNull('Expression statement assigned',X.A);
  980. CheckClass(X.A,TJSUnaryPostPlusPlusExpression);
  981. E:=TJSUnaryPostPlusPlusExpression(X.A);
  982. AssertNotNull('Expression left operand assigned',E.A);
  983. CheckClass(E.A,TJSLiteral);
  984. AssertNotNull('Expression operand value assigned',TJSLiteral(E.A).Value);
  985. AssertEquals('Expression operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  986. AssertEquals('Expression operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  987. end;
  988. procedure TTestJSParser.TestExpressionPostMinusMinus;
  989. Var
  990. X : TJSExpressionStatement;
  991. E : TJSUnaryPostMinusMinusExpression;
  992. begin
  993. CreateParser('1--;');
  994. X:=GetExpressionStatement;
  995. AssertNotNull('Expression statement assigned',X.A);
  996. CheckClass(X.A,TJSUnaryPostMinusMinusExpression);
  997. E:=TJSUnaryPostMinusMinusExpression(X.A);
  998. AssertNotNull('Expression left operand assigned',E.A);
  999. CheckClass(E.A,TJSLiteral);
  1000. AssertNotNull('Expression operand value assigned',TJSLiteral(E.A).Value);
  1001. AssertEquals('Expression operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1002. AssertEquals('Expression operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  1003. end;
  1004. procedure TTestJSParser.TestExpressionPrePlusPlus;
  1005. Var
  1006. X : TJSExpressionStatement;
  1007. E : TJSUnaryPrePlusPlusExpression;
  1008. begin
  1009. CreateParser('++1;');
  1010. X:=GetExpressionStatement;
  1011. AssertNotNull('Expression statement assigned',X.A);
  1012. CheckClass(X.A,TJSUnaryPrePlusPlusExpression);
  1013. E:=TJSUnaryPrePlusPlusExpression(X.A);
  1014. AssertNotNull('Expression left operand assigned',E.A);
  1015. CheckClass(E.A,TJSLiteral);
  1016. AssertNotNull('Expression operand value assigned',TJSLiteral(E.A).Value);
  1017. AssertEquals('Expression operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1018. AssertEquals('Expression operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  1019. end;
  1020. procedure TTestJSParser.TestExpressionPreMinusMinus;
  1021. Var
  1022. X : TJSExpressionStatement;
  1023. E : TJSUnaryPreMinusMinusExpression;
  1024. begin
  1025. CreateParser('--1;');
  1026. X:=GetExpressionStatement;
  1027. AssertNotNull('Expression statement assigned',X.A);
  1028. CheckClass(X.A,TJSUnaryPreMinusMinusExpression);
  1029. E:=TJSUnaryPreMinusMinusExpression(X.A);
  1030. AssertNotNull('Expression left operand assigned',E.A);
  1031. CheckClass(E.A,TJSLiteral);
  1032. AssertNotNull('Expression operand value assigned',TJSLiteral(E.A).Value);
  1033. AssertEquals('Expression operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1034. AssertEquals('Expression operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  1035. end;
  1036. procedure TTestJSParser.TestExpressionPrecedenceMulPlus;
  1037. Var
  1038. X : TJSExpressionStatement;
  1039. E : TJSAdditiveExpressionPlus;
  1040. R : TJSMultiplicativeExpressionMul;
  1041. begin
  1042. CreateParser('2 * 3 + 4;');
  1043. X:=GetExpressionStatement;
  1044. AssertNotNull('Expression statement assigned',X.A);
  1045. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1046. E:=TJSAdditiveExpressionPlus(X.A);
  1047. AssertNotNull('Expression left operand assigned',E.A);
  1048. AssertNotNull('Expression right operand assigned',E.B);
  1049. CheckClass(E.A,TJSMultiplicativeExpressionMul);
  1050. R:=TJSMultiplicativeExpressionMul(E.A);
  1051. CheckClass(E.B,TJSLiteral);
  1052. AssertNotNull('Multiplication left operand assigned',R.A);
  1053. AssertNotNull('Multiplication right operand assigned',R.B);
  1054. CheckClass(R.A,TJSLiteral);
  1055. CheckClass(R.B,TJSLiteral);
  1056. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1057. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1058. AssertEquals('Multiplication right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1059. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1060. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.B).Value);
  1061. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  1062. AssertEquals('Expression right operand value correct', 4.0,TJSLiteral(E.B).Value.AsNumber);
  1063. end;
  1064. procedure TTestJSParser.TestExpressionPrecedenceBraceMulPlus;
  1065. Var
  1066. X : TJSExpressionStatement;
  1067. E : TJSMultiplicativeExpressionMul;
  1068. R : TJSAdditiveExpressionPlus;
  1069. begin
  1070. CreateParser('2 * (3 + 4);');
  1071. X:=GetExpressionStatement;
  1072. AssertNotNull('Expression statement assigned',X.A);
  1073. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  1074. E:=TJSMultiplicativeExpressionMul(X.A);
  1075. AssertNotNull('Expression left operand assigned',E.A);
  1076. AssertNotNull('Expression right operand assigned',E.B);
  1077. CheckClass(E.B,TJSAdditiveExpressionPlus);
  1078. R:=TJSAdditiveExpressionPlus(E.B);
  1079. CheckClass(E.A,TJSLiteral);
  1080. AssertNotNull('Multiplication left operand assigned',R.A);
  1081. AssertNotNull('Multiplication right operand assigned',R.B);
  1082. CheckClass(R.A,TJSLiteral);
  1083. CheckClass(R.B,TJSLiteral);
  1084. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1085. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(E.A).Value.AsNumber);
  1086. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1087. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.A).Value.AsNumber);
  1088. AssertNotNull('Addition right operand value assigned',TJSLiteral(R.B).Value);
  1089. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1090. AssertEquals('Addition right operand value correct', 4.0,TJSLiteral(R.B).Value.AsNumber);
  1091. end;
  1092. procedure TTestJSParser.TestExpressionPrecedenceBracePlusMul;
  1093. Var
  1094. X : TJSExpressionStatement;
  1095. E : TJSMultiplicativeExpressionMul;
  1096. R : TJSAdditiveExpressionPlus;
  1097. begin
  1098. CreateParser('(3 + 4)*2;');
  1099. X:=GetExpressionStatement;
  1100. AssertNotNull('Expression statement assigned',X.A);
  1101. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  1102. E:=TJSMultiplicativeExpressionMul(X.A);
  1103. AssertNotNull('Expression left operand assigned',E.A);
  1104. AssertNotNull('Expression right operand assigned',E.B);
  1105. CheckClass(E.A,TJSAdditiveExpressionPlus);
  1106. R:=TJSAdditiveExpressionPlus(E.A);
  1107. CheckClass(E.B,TJSLiteral);
  1108. AssertNotNull('Multiplication left operand assigned',R.A);
  1109. AssertNotNull('Multiplication right operand assigned',R.B);
  1110. CheckClass(R.A,TJSLiteral);
  1111. CheckClass(R.B,TJSLiteral);
  1112. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  1113. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(E.B).Value.AsNumber);
  1114. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1115. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.A).Value.AsNumber);
  1116. AssertNotNull('Addition right operand value assigned',TJSLiteral(R.B).Value);
  1117. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1118. AssertEquals('Addition right operand value correct', 4.0,TJSLiteral(R.B).Value.AsNumber);
  1119. end;
  1120. procedure TTestJSParser.TestExpressionFunction;
  1121. Var
  1122. X : TJSExpressionStatement;
  1123. A : TJSSimpleAssignStatement;
  1124. begin
  1125. CreateParser('a = function () {};');
  1126. X:=GetExpressionStatement;
  1127. CheckClass(X.A,TJSSimpleAssignStatement);
  1128. A:=TJSSimpleAssignStatement(X.A);
  1129. AssertNotNull('Have left operand',A.LHS);
  1130. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  1131. AssertEquals('Correct name for assignment LHS ','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  1132. end;
  1133. procedure TTestJSParser.TestExpressionPrecedencePlusMul;
  1134. Var
  1135. X : TJSExpressionStatement;
  1136. E : TJSAdditiveExpressionPlus;
  1137. R : TJSMultiplicativeExpressionMul;
  1138. begin
  1139. CreateParser('4 + 2 * 3;');
  1140. X:=GetExpressionStatement;
  1141. AssertNotNull('Expression statement assigned',X.A);
  1142. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1143. E:=TJSAdditiveExpressionPlus(X.A);
  1144. AssertNotNull('Expression left operand assigned',E.A);
  1145. AssertNotNull('Expression right operand assigned',E.B);
  1146. CheckClass(E.B,TJSMultiplicativeExpressionMul);
  1147. R:=TJSMultiplicativeExpressionMul(E.B);
  1148. CheckClass(E.A,TJSLiteral);
  1149. AssertNotNull('Multiplication left operand assigned',R.A);
  1150. AssertNotNull('Multiplication right operand assigned',R.B);
  1151. CheckClass(R.A,TJSLiteral);
  1152. CheckClass(R.B,TJSLiteral);
  1153. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1154. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1155. AssertEquals('Multiplication right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1156. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1157. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1158. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1159. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1160. end;
  1161. procedure TTestJSParser.TestExpressionPrecedenceMulMinus;
  1162. Var
  1163. X : TJSExpressionStatement;
  1164. E : TJSAdditiveExpressionMinus;
  1165. R : TJSMultiplicativeExpressionMul;
  1166. begin
  1167. CreateParser('2 * 3 - 4;');
  1168. X:=GetExpressionStatement;
  1169. AssertNotNull('Expression statement assigned',X.A);
  1170. CheckClass(X.A,TJSAdditiveExpressionMinus);
  1171. E:=TJSAdditiveExpressionMinus(X.A);
  1172. AssertNotNull('Expression left operand assigned',E.A);
  1173. AssertNotNull('Expression right operand assigned',E.B);
  1174. CheckClass(E.A,TJSMultiplicativeExpressionMul);
  1175. R:=TJSMultiplicativeExpressionMul(E.A);
  1176. CheckClass(E.B,TJSLiteral);
  1177. AssertNotNull('Multiplication left operand assigned',R.A);
  1178. AssertNotNull('Multiplication right operand assigned',R.B);
  1179. CheckClass(R.A,TJSLiteral);
  1180. CheckClass(R.B,TJSLiteral);
  1181. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1182. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1183. AssertEquals('Multiplication right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1184. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1185. AssertNotNull('subtraction right operand value assigned',TJSLiteral(E.B).Value);
  1186. AssertEquals('subtraction right operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  1187. AssertEquals('subtraction right operand value correct', 4.0,TJSLiteral(E.B).Value.AsNumber);
  1188. end;
  1189. procedure TTestJSParser.TestExpressionPrecedenceMinusMul;
  1190. Var
  1191. X : TJSExpressionStatement;
  1192. E : TJSAdditiveExpressionMinus;
  1193. R : TJSMultiplicativeExpressionMul;
  1194. begin
  1195. CreateParser('4 - 2 * 3;');
  1196. X:=GetExpressionStatement;
  1197. AssertNotNull('Expression statement assigned',X.A);
  1198. CheckClass(X.A,TJSAdditiveExpressionMinus);
  1199. E:=TJSAdditiveExpressionMinus(X.A);
  1200. AssertNotNull('Expression left operand assigned',E.A);
  1201. AssertNotNull('Expression right operand assigned',E.B);
  1202. CheckClass(E.B,TJSMultiplicativeExpressionMul);
  1203. R:=TJSMultiplicativeExpressionMul(E.B);
  1204. CheckClass(E.A,TJSLiteral);
  1205. AssertNotNull('Multiplication left operand assigned',R.A);
  1206. AssertNotNull('Multiplication right operand assigned',R.B);
  1207. CheckClass(R.A,TJSLiteral);
  1208. CheckClass(R.B,TJSLiteral);
  1209. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1210. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1211. AssertEquals('Multiplication right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1212. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1213. AssertNotNull('Subtraction left operand value assigned',TJSLiteral(E.A).Value);
  1214. AssertEquals('Subtraction left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1215. AssertEquals('Subtraction left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1216. end;
  1217. procedure TTestJSParser.TestExpressionPrecedenceDivPlus;
  1218. Var
  1219. X : TJSExpressionStatement;
  1220. E : TJSAdditiveExpressionPlus;
  1221. R : TJSMultiplicativeExpressionDiv;
  1222. begin
  1223. CreateParser('2 / 3 + 4;');
  1224. X:=GetExpressionStatement;
  1225. AssertNotNull('Expression statement assigned',X.A);
  1226. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1227. E:=TJSAdditiveExpressionPlus(X.A);
  1228. AssertNotNull('Expression left operand assigned',E.A);
  1229. AssertNotNull('Expression right operand assigned',E.B);
  1230. CheckClass(E.A,TJSMultiplicativeExpressionDiv);
  1231. R:=TJSMultiplicativeExpressionDiv(E.A);
  1232. CheckClass(E.B,TJSLiteral);
  1233. AssertNotNull('Div left operand assigned',R.A);
  1234. AssertNotNull('Div right operand assigned',R.B);
  1235. CheckClass(R.A,TJSLiteral);
  1236. CheckClass(R.B,TJSLiteral);
  1237. AssertEquals('Div left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1238. AssertEquals('Div left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1239. AssertEquals('Div right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1240. AssertEquals('Div right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1241. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.B).Value);
  1242. AssertEquals('Addition right operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  1243. AssertEquals('Addition right operand value correct', 4.0,TJSLiteral(E.B).Value.AsNumber);
  1244. end;
  1245. procedure TTestJSParser.TestExpressionPrecedencePlusDiv;
  1246. Var
  1247. X : TJSExpressionStatement;
  1248. E : TJSAdditiveExpressionPlus;
  1249. R : TJSMultiplicativeExpressionDiv;
  1250. begin
  1251. CreateParser('4 + 2 / 3;');
  1252. X:=GetExpressionStatement;
  1253. AssertNotNull('Expression statement assigned',X.A);
  1254. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1255. E:=TJSAdditiveExpressionPlus(X.A);
  1256. AssertNotNull('Expression left operand assigned',E.A);
  1257. AssertNotNull('Expression right operand assigned',E.B);
  1258. CheckClass(E.B,TJSMultiplicativeExpressionDiv);
  1259. R:=TJSMultiplicativeExpressionDiv(E.B);
  1260. CheckClass(E.A,TJSLiteral);
  1261. AssertNotNull('Div left operand assigned',R.A);
  1262. AssertNotNull('Div right operand assigned',R.B);
  1263. CheckClass(R.A,TJSLiteral);
  1264. CheckClass(R.B,TJSLiteral);
  1265. AssertEquals('Div left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1266. AssertEquals('Div left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1267. AssertEquals('Div right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1268. AssertEquals('Div right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1269. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1270. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1271. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1272. end;
  1273. procedure TTestJSParser.TestExpressionPrecedenceModPlus;
  1274. Var
  1275. X : TJSExpressionStatement;
  1276. E : TJSAdditiveExpressionPlus;
  1277. R : TJSMultiplicativeExpressionMod;
  1278. begin
  1279. CreateParser('2 % 3 + 4;');
  1280. X:=GetExpressionStatement;
  1281. AssertNotNull('Expression statement assigned',X.A);
  1282. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1283. E:=TJSAdditiveExpressionPlus(X.A);
  1284. AssertNotNull('Expression left operand assigned',E.A);
  1285. AssertNotNull('Expression right operand assigned',E.B);
  1286. CheckClass(E.A,TJSMultiplicativeExpressionMod);
  1287. R:=TJSMultiplicativeExpressionMod(E.A);
  1288. CheckClass(E.B,TJSLiteral);
  1289. AssertNotNull('mod left operand assigned',R.A);
  1290. AssertNotNull('mod right operand assigned',R.B);
  1291. CheckClass(R.A,TJSLiteral);
  1292. CheckClass(R.B,TJSLiteral);
  1293. AssertEquals('mod left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1294. AssertEquals('mod left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1295. AssertEquals('mod right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1296. AssertEquals('mod right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1297. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.B).Value);
  1298. AssertEquals('Addition right operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  1299. AssertEquals('Addition right operand value correct', 4.0,TJSLiteral(E.B).Value.AsNumber);
  1300. end;
  1301. procedure TTestJSParser.TestExpressionPrecedencePlusMod;
  1302. Var
  1303. X : TJSExpressionStatement;
  1304. E : TJSAdditiveExpressionPlus;
  1305. R : TJSMultiplicativeExpressionMod;
  1306. begin
  1307. CreateParser('4 + 2 % 3;');
  1308. X:=GetExpressionStatement;
  1309. AssertNotNull('Expression statement assigned',X.A);
  1310. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1311. E:=TJSAdditiveExpressionPlus(X.A);
  1312. AssertNotNull('Expression left operand assigned',E.A);
  1313. AssertNotNull('Expression right operand assigned',E.B);
  1314. CheckClass(E.B,TJSMultiplicativeExpressionMod);
  1315. R:=TJSMultiplicativeExpressionMod(E.B);
  1316. CheckClass(E.A,TJSLiteral);
  1317. AssertNotNull('Mod left operand assigned',R.A);
  1318. AssertNotNull('Mod right operand assigned',R.B);
  1319. CheckClass(R.A,TJSLiteral);
  1320. CheckClass(R.B,TJSLiteral);
  1321. AssertEquals('Mod left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1322. AssertEquals('Mod left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1323. AssertEquals('Mod right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1324. AssertEquals('Mod right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1325. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.A).Value);
  1326. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1327. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1328. end;
  1329. procedure TTestJSParser.TestExpressionPrecedencePlusPostPlusPlus;
  1330. Var
  1331. X : TJSExpressionStatement;
  1332. R : TJSUnaryPostPlusPlusExpression;
  1333. E : TJSAdditiveExpressionPlus;
  1334. begin
  1335. CreateParser('4 + 2++;');
  1336. X:=GetExpressionStatement;
  1337. AssertNotNull('Expression statement assigned',X.A);
  1338. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1339. E:=TJSAdditiveExpressionPlus(X.A);
  1340. AssertNotNull('Expression left operand assigned',E.A);
  1341. AssertNotNull('Expression right operand assigned',E.B);
  1342. CheckClass(E.B,TJSUnaryPostPlusPlusExpression);
  1343. R:=TJSUnaryPostPlusPlusExpression(E.B);
  1344. CheckClass(E.A,TJSLiteral);
  1345. AssertNotNull('++ operand assigned',R.A);
  1346. CheckClass(R.A,TJSLiteral);
  1347. AssertEquals('++ operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1348. AssertEquals('++ operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1349. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1350. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1351. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1352. end;
  1353. procedure TTestJSParser.TestExpressionPrecedencePlusPostMinusMinus;
  1354. Var
  1355. X : TJSExpressionStatement;
  1356. R : TJSUnaryPostMinusMinusExpression;
  1357. E : TJSAdditiveExpressionPlus;
  1358. begin
  1359. CreateParser('4 + 2--;');
  1360. X:=GetExpressionStatement;
  1361. AssertNotNull('Expression statement assigned',X.A);
  1362. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1363. E:=TJSAdditiveExpressionPlus(X.A);
  1364. AssertNotNull('Expression left operand assigned',E.A);
  1365. AssertNotNull('Expression right operand assigned',E.B);
  1366. CheckClass(E.B,TJSUnaryPostMinusMinusExpression);
  1367. R:=TJSUnaryPostMinusMinusExpression(E.B);
  1368. CheckClass(E.A,TJSLiteral);
  1369. AssertNotNull('-- operand assigned',R.A);
  1370. CheckClass(R.A,TJSLiteral);
  1371. AssertEquals('-- operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1372. AssertEquals('-- operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1373. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1374. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1375. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1376. end;
  1377. procedure TTestJSParser.TestExpressionPrecedenceMulPostPlusPlus;
  1378. Var
  1379. X : TJSExpressionStatement;
  1380. R : TJSUnaryPostPlusPlusExpression;
  1381. E : TJSMultiplicativeExpressionMul;
  1382. begin
  1383. CreateParser('4 * 2++;');
  1384. X:=GetExpressionStatement;
  1385. AssertNotNull('Expression statement assigned',X.A);
  1386. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  1387. E:=TJSMultiplicativeExpressionMul(X.A);
  1388. AssertNotNull('Expression left operand assigned',E.A);
  1389. AssertNotNull('Expression right operand assigned',E.B);
  1390. CheckClass(E.B,TJSUnaryPostPlusPlusExpression);
  1391. R:=TJSUnaryPostPlusPlusExpression(E.B);
  1392. CheckClass(E.A,TJSLiteral);
  1393. AssertNotNull('++operand assigned',R.A);
  1394. CheckClass(R.A,TJSLiteral);
  1395. AssertEquals('++ operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1396. AssertEquals('++ operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1397. AssertNotNull('Multiplication left operand value assigned',TJSLiteral(E.A).Value);
  1398. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1399. AssertEquals('Multiplication left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1400. end;
  1401. procedure TTestJSParser.TestExpressionPrecedenceMulPostMinusMinus;
  1402. Var
  1403. X : TJSExpressionStatement;
  1404. R : TJSUnaryPostMinusMinusExpression;
  1405. E : TJSMultiplicativeExpressionMul;
  1406. begin
  1407. CreateParser('4 * 2--;');
  1408. X:=GetExpressionStatement;
  1409. AssertNotNull('Expression statement assigned',X.A);
  1410. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  1411. E:=TJSMultiplicativeExpressionMul(X.A);
  1412. AssertNotNull('Expression left operand assigned',E.A);
  1413. AssertNotNull('Expression right operand assigned',E.B);
  1414. CheckClass(E.B,TJSUnaryPostMinusMinusExpression);
  1415. R:=TJSUnaryPostMinusMinusExpression(E.B);
  1416. CheckClass(E.A,TJSLiteral);
  1417. AssertNotNull('-- operand assigned',R.A);
  1418. CheckClass(R.A,TJSLiteral);
  1419. AssertEquals('-- operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1420. AssertEquals('-- operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1421. AssertNotNull('Multiplication left operand value assigned',TJSLiteral(E.A).Value);
  1422. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1423. AssertEquals('Multiplication left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1424. end;
  1425. procedure TTestJSParser.TestExpressionPrecedencePlusPrePlusPlus;
  1426. Var
  1427. X : TJSExpressionStatement;
  1428. R : TJSUnaryPrePlusPlusExpression;
  1429. E : TJSAdditiveExpressionPlus;
  1430. begin
  1431. CreateParser('4 + ++2;');
  1432. X:=GetExpressionStatement;
  1433. AssertNotNull('Expression statement assigned',X.A);
  1434. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1435. E:=TJSAdditiveExpressionPlus(X.A);
  1436. AssertNotNull('Expression left operand assigned',E.A);
  1437. AssertNotNull('Expression right operand assigned',E.B);
  1438. CheckClass(E.B,TJSUnaryPrePlusPlusExpression);
  1439. R:=TJSUnaryPrePlusPlusExpression(E.B);
  1440. CheckClass(E.A,TJSLiteral);
  1441. AssertNotNull('Multiplication left operand assigned',R.A);
  1442. CheckClass(R.A,TJSLiteral);
  1443. AssertEquals('++ operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1444. AssertEquals('++ operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1445. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1446. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1447. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1448. end;
  1449. procedure TTestJSParser.TestExpressionPrecedencePlusInv;
  1450. Var
  1451. X : TJSExpressionStatement;
  1452. R : TJSUnaryInvExpression;
  1453. E : TJSAdditiveExpressionPlus;
  1454. begin
  1455. CreateParser('4 + ~2;');
  1456. X:=GetExpressionStatement;
  1457. AssertNotNull('Expression statement assigned',X.A);
  1458. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1459. E:=TJSAdditiveExpressionPlus(X.A);
  1460. AssertNotNull('Expression left operand assigned',E.A);
  1461. AssertNotNull('Expression right operand assigned',E.B);
  1462. CheckClass(E.B,TJSUnaryInvExpression);
  1463. R:=TJSUnaryInvExpression(E.B);
  1464. CheckClass(E.A,TJSLiteral);
  1465. AssertNotNull('Multiplication left operand assigned',R.A);
  1466. CheckClass(R.A,TJSLiteral);
  1467. AssertEquals('inv operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1468. AssertEquals('inv operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1469. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1470. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1471. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1472. end;
  1473. procedure TTestJSParser.TestExpressionPrecedenceMulInv;
  1474. Var
  1475. X : TJSExpressionStatement;
  1476. R : TJSUnaryInvExpression;
  1477. E : TJSMultiplicativeExpressionMul;
  1478. begin
  1479. CreateParser('4 * ~2;');
  1480. X:=GetExpressionStatement;
  1481. AssertNotNull('Expression statement assigned',X.A);
  1482. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  1483. E:=TJSMultiplicativeExpressionMul(X.A);
  1484. AssertNotNull('Expression left operand assigned',E.A);
  1485. AssertNotNull('Expression right operand assigned',E.B);
  1486. CheckClass(E.B,TJSUnaryInvExpression);
  1487. R:=TJSUnaryInvExpression(E.B);
  1488. CheckClass(E.A,TJSLiteral);
  1489. AssertNotNull('Multiplication left operand assigned',R.A);
  1490. CheckClass(R.A,TJSLiteral);
  1491. AssertEquals('Inv operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1492. AssertEquals('Inv operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1493. AssertNotNull('Multiplication left operand value assigned',TJSLiteral(E.A).Value);
  1494. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1495. AssertEquals('Multiplication left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1496. end;
  1497. procedure TTestJSParser.TestExpressionPrecedencePlusNot;
  1498. Var
  1499. X : TJSExpressionStatement;
  1500. R : TJSUnaryNotExpression;
  1501. E : TJSAdditiveExpressionPlus;
  1502. begin
  1503. CreateParser('4 + !2;');
  1504. X:=GetExpressionStatement;
  1505. AssertNotNull('Expression statement assigned',X.A);
  1506. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1507. E:=TJSAdditiveExpressionPlus(X.A);
  1508. AssertNotNull('Expression left operand assigned',E.A);
  1509. AssertNotNull('Expression right operand assigned',E.B);
  1510. CheckClass(E.B,TJSUnaryNotExpression);
  1511. R:=TJSUnaryNotExpression(E.B);
  1512. CheckClass(E.A,TJSLiteral);
  1513. AssertNotNull('Multiplication left operand assigned',R.A);
  1514. CheckClass(R.A,TJSLiteral);
  1515. AssertEquals('Not operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1516. AssertEquals('Not operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1517. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1518. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1519. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1520. end;
  1521. procedure TTestJSParser.TestFunctionCallNoArgs;
  1522. Var
  1523. X : TJSExpressionStatement;
  1524. C : TJSCallExpression;
  1525. begin
  1526. CreateParser('abc();');
  1527. X:=GetExpressionStatement;
  1528. CheckClass(X.A,TJSCallExpression);
  1529. C:=TJSCallExpression(X.A);
  1530. AssertEquals('No arguments',0,C.Args.Elements.Count);
  1531. AssertNotNull('Call function expression',C.Expr);
  1532. CheckClass(C.Expr,TJSPrimaryExpressionIdent);
  1533. AssertEquals('Function name correct','abc',TJSPrimaryExpressionIdent(C.Expr).Name);
  1534. end;
  1535. procedure TTestJSParser.TestAwaitFunctionCallNoArgs;
  1536. Var
  1537. X : TJSExpressionStatement;
  1538. W : TJSAwaitExpression;
  1539. C : TJSCallExpression;
  1540. begin
  1541. CreateParser('await abc();',MinAwaitVersion);
  1542. X:=GetExpressionStatement;
  1543. CheckClass(X.A,TJSAwaitExpression);
  1544. W:=TJSAwaitExpression(X.A);
  1545. CheckClass(W.A,TJSCallExpression);
  1546. C:=TJSCallExpression(W.A);
  1547. AssertEquals('No arguments',0,C.Args.Elements.Count);
  1548. AssertNotNull('Call function expression',C.Expr);
  1549. CheckClass(C.Expr,TJSPrimaryExpressionIdent);
  1550. AssertEquals('Function name correct','abc',TJSPrimaryExpressionIdent(C.Expr).Name);
  1551. end;
  1552. procedure TTestJSParser.TestFunctionCallOneArg;
  1553. Var
  1554. X : TJSExpressionStatement;
  1555. C : TJSCallExpression;
  1556. E : TJSelement;
  1557. begin
  1558. CreateParser('abc(d);');
  1559. X:=GetExpressionStatement;
  1560. CheckClass(X.A,TJSCallExpression);
  1561. C:=TJSCallExpression(X.A);
  1562. AssertNotNull('Call function expression',C.Expr);
  1563. CheckClass(C.Expr,TJSPrimaryExpressionIdent);
  1564. AssertEquals('Function name correct','abc',TJSPrimaryExpressionIdent(C.Expr).Name);
  1565. AssertEquals('1 argument',1,C.Args.Elements.Count);
  1566. E:=C.Args.Elements[0].Expr;
  1567. AssertNotNull('First argument expression',E);
  1568. CheckClass(E,TJSPrimaryExpressionIdent);
  1569. AssertEquals('First argument name correct','d',TJSPrimaryExpressionIdent(E).Name);
  1570. end;
  1571. procedure TTestJSParser.TestFunctionCallTwoArgs;
  1572. Var
  1573. X : TJSExpressionStatement;
  1574. C : TJSCallExpression;
  1575. E : TJSelement;
  1576. begin
  1577. CreateParser('abc(d,e);');
  1578. X:=GetExpressionStatement;
  1579. CheckClass(X.A,TJSCallExpression);
  1580. C:=TJSCallExpression(X.A);
  1581. AssertNotNull('Call function expression',C.Expr);
  1582. CheckClass(C.Expr,TJSPrimaryExpressionIdent);
  1583. AssertEquals('Function name correct','abc',TJSPrimaryExpressionIdent(C.Expr).Name);
  1584. AssertEquals('2 arguments',2,C.Args.Elements.Count);
  1585. E:=C.Args.Elements[0].Expr;
  1586. AssertNotNull('First argument expression',E);
  1587. CheckClass(E,TJSPrimaryExpressionIdent);
  1588. AssertEquals('First argument name correct','d',TJSPrimaryExpressionIdent(E).Name);
  1589. E:=C.Args.Elements[1].Expr;
  1590. AssertNotNull('Second argument expression',E);
  1591. CheckClass(E,TJSPrimaryExpressionIdent);
  1592. AssertEquals('Second argument name correct','e',TJSPrimaryExpressionIdent(E).Name);
  1593. end;
  1594. procedure TTestJSParser.TestObjectGeneratorFunction;
  1595. Var
  1596. X : TJSExpressionStatement;
  1597. SA : TJSSimpleAssignStatement;
  1598. Obj : TJSObjectLiteral;
  1599. begin
  1600. CreateParser('a = {* g() { } };',MinGeneratorVersion);
  1601. X:=GetExpressionStatement;
  1602. AssertNotNull('Expression statement assigned',X.A);
  1603. CheckClass(X.A,TJSSimpleAssignStatement);
  1604. SA:=TJSSimpleAssignStatement(X.A);
  1605. AssertNotNull('Assignment LHS assigned',SA.LHS);
  1606. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  1607. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  1608. AssertNotNull('Assignment Expression assigned',SA.Expr);
  1609. AssertEquals('Assignment Expression assigned',TJSObjectLiteral,SA.Expr.ClassType);
  1610. Obj:=TJSObjectLiteral(SA.Expr);
  1611. AssertEquals('Object element count',1,Obj.Elements.Count);
  1612. AssertEquals('Object element name','g',Obj.Elements[0].Name);
  1613. AssertEquals('Object element expression',TJSFunctionDeclarationStatement,Obj.Elements[0].Expr.ClassType);
  1614. AssertTrue('Generator',TJSFunctionDeclarationStatement(Obj.Elements[0].Expr).IsGenerator);
  1615. end;
  1616. procedure TTestJSParser.TestArrayExpressionNumericalArgs;
  1617. Var
  1618. X : TJSExpressionStatement;
  1619. B : TJSBracketMemberExpression;
  1620. begin
  1621. CreateParser('A[1];');
  1622. X:=GetExpressionStatement;
  1623. CheckClass(X.A,TJSBracketMemberExpression);
  1624. B:=TJSBracketMemberExpression(X.A);
  1625. CheckClass(B.Name,TJSLiteral);
  1626. AssertEquals('Member name operand type correct', jstNumber, TJSLiteral(B.Name).Value.ValueType);
  1627. AssertEquals('Member name operand value correct', 1.0, TJSLiteral(B.Name).Value.AsNumber);
  1628. CheckClass(B.Mexpr,TJSPrimaryExpressionIdent);
  1629. AssertEquals('Array name correct','A',TJSPrimaryExpressionIdent(B.Mexpr).Name);
  1630. end;
  1631. procedure TTestJSParser.TestArrayExpressionStringArgs;
  1632. Var
  1633. X : TJSExpressionStatement;
  1634. B : TJSBracketMemberExpression;
  1635. begin
  1636. CreateParser('A["propname"];');
  1637. X:=GetExpressionStatement;
  1638. CheckClass(X.A,TJSBracketMemberExpression);
  1639. B:=TJSBracketMemberExpression(X.A);
  1640. CheckClass(B.Name,TJSLiteral);
  1641. AssertEquals('Member name operand type correct', jstString, TJSLiteral(B.Name).Value.ValueType);
  1642. AssertEquals('Member name operand value correct', 'propname', TJSLiteral(B.Name).Value.AsString);
  1643. CheckClass(B.Mexpr,TJSPrimaryExpressionIdent);
  1644. AssertEquals('Array name correct','A',TJSPrimaryExpressionIdent(B.Mexpr).Name);
  1645. end;
  1646. procedure TTestJSParser.TestArrayExpressionIdentArgs;
  1647. Var
  1648. X : TJSExpressionStatement;
  1649. B : TJSBracketMemberExpression;
  1650. begin
  1651. CreateParser('A[B];');
  1652. X:=GetExpressionStatement;
  1653. CheckClass(X.A,TJSBracketMemberExpression);
  1654. B:=TJSBracketMemberExpression(X.A);
  1655. CheckClass(B.Name,TJSPrimaryExpressionIdent);
  1656. AssertEquals('Member name identifier correct', 'B', TJSPrimaryExpressionIdent(B.Name).Name);
  1657. CheckClass(B.Mexpr,TJSPrimaryExpressionIdent);
  1658. AssertEquals('Array name correct','A',TJSPrimaryExpressionIdent(B.Mexpr).Name);
  1659. end;
  1660. Procedure TTestJSParser.TestVarDeclarationSimple;
  1661. Var
  1662. X : TJSELement;
  1663. V : TJSVarDeclaration;
  1664. begin
  1665. CreateParser('var a;');
  1666. X:=GetFirstVar;
  1667. AssertNotNull('Variable statement assigned',(X));
  1668. CheckClass(X,TJSVarDeclaration);
  1669. V:=TJSVarDeclaration(X);
  1670. AssertEquals('correct variable type', vtVar, V.VarType);
  1671. AssertEquals('variable name correct registered', 'a', V.Name);
  1672. AssertNull('No initialization expression', V.Init);
  1673. end;
  1674. procedure TTestJSParser.TestVarDeclarationInit;
  1675. Var
  1676. X : TJSELement;
  1677. V : TJSVarDeclaration;
  1678. begin
  1679. CreateParser('var a = 0;');
  1680. X:=GetFirstVar;
  1681. AssertNotNull('Variable statement assigned',(X));
  1682. CheckClass(X,TJSVarDeclaration);
  1683. V:=TJSVarDeclaration(X);
  1684. AssertEquals('correct variable type', vtVar, V.VarType);
  1685. AssertEquals('variable name correct registered', 'a', V.Name);
  1686. AssertNotNull('initialization expression', V.Init);
  1687. CheckClass(V.Init,TJSLiteral);
  1688. AssertEquals('Init value correct', 0, TJSLiteral(V.init).Value.AsNumber);
  1689. end;
  1690. procedure TTestJSParser.TestLetDeclarationSimple;
  1691. Var
  1692. X : TJSELement;
  1693. V : TJSVarDeclaration;
  1694. begin
  1695. CreateParser('let a;',minLetVersion);
  1696. X:=GetFirstVar;
  1697. CheckClass(X,TJSVarDeclaration);
  1698. V:=TJSVarDeclaration(X);
  1699. AssertEquals('correct variable type', vtLet, V.VarType);
  1700. // AssertNotNull('Variable statement assigned',(X));
  1701. AssertEquals('variable name correct registered', 'a', V.Name);
  1702. AssertNull('No initialization expression', V.Init);
  1703. end;
  1704. procedure TTestJSParser.TestVarDeclarationDouble;
  1705. Var
  1706. X : TJSELement;
  1707. V : TJSVarDeclaration;
  1708. begin
  1709. CreateParser('var a, b ;');
  1710. AssertEquals('2 variables declared',2,GetVars.Count);
  1711. X:=GetFirstVar;
  1712. CheckClass(X,TJSVarDeclaration);
  1713. V:=TJSVarDeclaration(X);
  1714. AssertEquals('correct variable type', vtVar, V.VarType);
  1715. // AssertNotNull('Variable statement assigned',(X));
  1716. AssertEquals('variable name correct registered', 'a', V.name);
  1717. X:=GetVars.Nodes[1].Node;
  1718. CheckClass(X,TJSVarDeclaration);
  1719. V:=TJSVarDeclaration(X);
  1720. AssertEquals('correct variable type', vtVar, V.VarType);
  1721. AssertEquals('variable name correct registered', 'b', V.Name);
  1722. AssertNull('No initialization expression', V.Init);
  1723. end;
  1724. procedure TTestJSParser.TestVarDeclarationSimpleInit;
  1725. Var
  1726. X : TJSELement;
  1727. V : TJSVarDeclaration;
  1728. begin
  1729. CreateParser('var a = b;');
  1730. X:=GetFirstVar;
  1731. CheckClass(X,TJSVarDeclaration);
  1732. V:=TJSVarDeclaration(X);
  1733. // AssertNotNull('Variable statement assigned',(X));
  1734. AssertEquals('variable name correct registered', 'a', V.Name);
  1735. AssertNotNull('Initialization expression present', V.Init);
  1736. CheckClass(V.Init,TJSPrimaryExpressionIdent);
  1737. AssertEquals('Member name identifier correct', 'b', TJSPrimaryExpressionIdent(V.init).Name);
  1738. end;
  1739. procedure TTestJSParser.TestConstDeclarationSimpleInit;
  1740. Var
  1741. X : TJSELement;
  1742. V : TJSVarDeclaration;
  1743. begin
  1744. CreateParser('const a = 1;',MinLetVersion);
  1745. X:=GetFirstVar;
  1746. CheckClass(X,TJSVarDeclaration);
  1747. V:=TJSVarDeclaration(X);
  1748. // AssertNotNull('Variable statement assigned',(X));
  1749. AssertEquals('variable name correct registered', 'a', V.Name);
  1750. AssertNotNull('Initialization expression present', V.Init);
  1751. CheckClass(V.Init,TJSLiteral);
  1752. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(V.Init).Value.ValueType);
  1753. AssertEquals('Expression value correct', 1.0, TJSLiteral(V.Init).Value.AsNumber);
  1754. end;
  1755. procedure TTestJSParser.TestVarDeclarationDoubleInit;
  1756. Var
  1757. X : TJSELement;
  1758. V : TJSVarDeclaration;
  1759. begin
  1760. CreateParser('var a, c = b;');
  1761. AssertEquals('2 variables declared',2,GetVars.Count);
  1762. X:=GetFirstVar;
  1763. CheckClass(X,TJSVarDeclaration);
  1764. V:=TJSVarDeclaration(X);
  1765. // AssertNotNull('Variable statement assigned',(X));
  1766. AssertEquals('variable name correct registered', 'a', V.Name);
  1767. AssertNull('No initialization expression', V.Init);
  1768. X:=GetVars.Nodes[1].Node;
  1769. CheckClass(X,TJSVarDeclaration);
  1770. V:=TJSVarDeclaration(X);
  1771. AssertEquals('variable name correct registered', 'c', V.Name);
  1772. AssertNotNull('No initialization expression', V.Init);
  1773. CheckClass(V.Init,TJSPrimaryExpressionIdent);
  1774. AssertEquals('Member name identifier correct', 'b', TJSPrimaryExpressionIdent(V.init).Name);
  1775. end;
  1776. procedure TTestJSParser.TestDebuggerStatement;
  1777. Var
  1778. E : TJSSourceElements;
  1779. X : TJSElement;
  1780. begin
  1781. CreateParser('debugger',MinDebuggerVersion);
  1782. E:=GetSourceElements;
  1783. AssertEquals('1 statement in block',1,E.Statements.Count);
  1784. X:=E.Statements.Nodes[0].Node;
  1785. CheckClass(X,TJSDebuggerStatement);
  1786. end;
  1787. procedure TTestJSParser.TestBlockEmpty;
  1788. Var
  1789. E : TJSSourceElements;
  1790. X : TJSElement;
  1791. begin
  1792. CreateParser('{}');
  1793. E:=GetSourceElements;
  1794. AssertEquals('1 statement in block',1,E.Statements.Count);
  1795. X:=E.Statements.Nodes[0].Node;
  1796. CheckClass(X,TJSEmptyBlockStatement);
  1797. end;
  1798. procedure TTestJSParser.TestBlockEmptyStatement;
  1799. Var
  1800. E : TJSSourceElements;
  1801. X : TJSElement;
  1802. begin
  1803. CreateParser('{;}');
  1804. E:=GetSourceElements;
  1805. AssertEquals('1 statement in block',1,E.Statements.Count);
  1806. X:=E.Statements.Nodes[0].Node;
  1807. CheckClass(X,TJSEmptyStatement);
  1808. end;
  1809. procedure TTestJSParser.TestBlockSimpleStatement;
  1810. Var
  1811. E : TJSSourceElements;
  1812. X : TJSElement;
  1813. begin
  1814. CreateParser('{a;}');
  1815. E:=GetSourceElements;
  1816. AssertEquals('1 statement in block',1,E.Statements.Count);
  1817. X:=E.Statements.Nodes[0].Node;
  1818. CheckClass(X,TJSExpressionStatement);
  1819. CheckNotNull(TJSExpressionStatement(X).A);
  1820. CheckClass(TJSExpressionStatement(X).A,TJSPrimaryExpressionIdent);
  1821. AssertEquals('Name','a',TJSPrimaryExpressionIdent(TJSExpressionStatement(X).A).Name)
  1822. end;
  1823. procedure TTestJSParser.TestFunctionDeclarationEmpty;
  1824. Var
  1825. E : TJSSourceElements;
  1826. N : TJSElement;
  1827. FD : TJSFunctionDeclarationStatement;
  1828. begin
  1829. CreateParser('function a () {}');
  1830. E:=GetSourceElements;
  1831. AssertEquals('1 function defined',1,E.functions.Count);
  1832. N:=E.Functions.Nodes[0].Node;
  1833. AssertNotNull('Function element defined ',N);
  1834. CheckClass(N,TJSFunctionDeclarationStatement);
  1835. FD:=TJSFunctionDeclarationStatement(N);
  1836. AssertNotNull('Function definition assigned',FD.AFunction);
  1837. AssertFalse('Async function ',FD.AFunction.IsAsync);
  1838. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1839. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1840. AssertEquals('No parameters',0,FD.AFunction.Params.Count);
  1841. N:=FD.AFunction.Body;
  1842. CheckClass(N,TJSFunctionBody);
  1843. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1844. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1845. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1846. AssertEquals('0 statement in functionbody elements',0,E.Statements.Count);
  1847. // TJSEmptyBlockStatement
  1848. end;
  1849. procedure TTestJSParser.TestFunctionDeclarationAsync;
  1850. Var
  1851. E : TJSSourceElements;
  1852. N : TJSElement;
  1853. FD : TJSFunctionDeclarationStatement;
  1854. begin
  1855. CreateParser('async function a () {}',MinAsyncVersion);
  1856. E:=GetSourceElements;
  1857. AssertEquals('1 function defined',1,E.functions.Count);
  1858. N:=E.Functions.Nodes[0].Node;
  1859. AssertNotNull('Function element defined ',N);
  1860. CheckClass(N,TJSFunctionDeclarationStatement);
  1861. FD:=TJSFunctionDeclarationStatement(N);
  1862. AssertNotNull('Function definition assigned',FD.AFunction);
  1863. AssertTrue('Async function ',FD.AFunction.IsAsync);
  1864. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1865. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1866. AssertEquals('No parameters',0,FD.AFunction.Params.Count);
  1867. N:=FD.AFunction.Body;
  1868. CheckClass(N,TJSFunctionBody);
  1869. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1870. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1871. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1872. AssertEquals('0 statement in functionbody elements',0,E.Statements.Count);
  1873. end;
  1874. procedure TTestJSParser.TestFunctionDeclarationWithArgs;
  1875. Var
  1876. E : TJSSourceElements;
  1877. N : TJSElement;
  1878. FD : TJSFunctionDeclarationStatement;
  1879. begin
  1880. CreateParser('function a (b,c) {}');
  1881. E:=GetSourceElements;
  1882. AssertEquals('1 function defined',1,E.functions.Count);
  1883. N:=E.Functions.Nodes[0].Node;
  1884. AssertNotNull('Function element defined ',N);
  1885. CheckClass(N,TJSFunctionDeclarationStatement);
  1886. FD:=TJSFunctionDeclarationStatement(N);
  1887. AssertNotNull('Function definition assigned',FD.AFunction);
  1888. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1889. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1890. AssertEquals('2 parameters',2,FD.AFunction.Params.Count);
  1891. AssertEquals('1st parameter','b',FD.AFunction.Params[0]);
  1892. AssertEquals('2nd parameter','c',FD.AFunction.Params[1]);
  1893. N:=FD.AFunction.Body;
  1894. CheckClass(N,TJSFunctionBody);
  1895. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1896. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1897. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1898. AssertEquals('0 statement in functionbody elements',0,E.Statements.Count);
  1899. // TJSEmptyBlockStatement
  1900. end;
  1901. procedure TTestJSParser.TestFunctionDeclarationWithSpreadArgs;
  1902. Var
  1903. E : TJSSourceElements;
  1904. N : TJSElement;
  1905. FD : TJSFunctionDeclarationStatement;
  1906. P : TJSTypedParam;
  1907. begin
  1908. CreateParser('function a (...b,c) {}');
  1909. E:=GetSourceElements;
  1910. AssertEquals('1 function defined',1,E.functions.Count);
  1911. N:=E.Functions.Nodes[0].Node;
  1912. AssertNotNull('Function element defined ',N);
  1913. CheckClass(N,TJSFunctionDeclarationStatement);
  1914. FD:=TJSFunctionDeclarationStatement(N);
  1915. AssertNotNull('Function definition assigned',FD.AFunction);
  1916. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1917. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1918. AssertEquals('2 parameters',2,FD.AFunction.Params.Count);
  1919. AssertEquals('1st parameter','b',FD.AFunction.Params[0]);
  1920. AssertEquals('1st parameter','b',FD.AFunction.TypedParams.Names[0]);
  1921. AssertTrue('1st parameter spread',FD.AFunction.TypedParams.Params[0].IsSpread);
  1922. AssertEquals('2nd parameter','c',FD.AFunction.Params[1]);
  1923. N:=FD.AFunction.Body;
  1924. CheckClass(N,TJSFunctionBody);
  1925. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1926. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1927. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1928. AssertEquals('0 statement in functionbody elements',0,E.Statements.Count);
  1929. // TJSEmptyBlockStatement
  1930. end;
  1931. procedure TTestJSParser.TestFunctionDeclarationWithBody;
  1932. Var
  1933. E : TJSSourceElements;
  1934. N : TJSElement;
  1935. FD : TJSFunctionDeclarationStatement;
  1936. begin
  1937. CreateParser('function a () { b; }');
  1938. E:=GetSourceElements;
  1939. AssertEquals('1 function defined',1,E.functions.Count);
  1940. N:=E.Functions.Nodes[0].Node;
  1941. AssertNotNull('Function element defined ',N);
  1942. CheckClass(N,TJSFunctionDeclarationStatement);
  1943. FD:=TJSFunctionDeclarationStatement(N);
  1944. AssertNotNull('Function definition assigned',FD.AFunction);
  1945. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1946. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1947. AssertEquals('2 parameters',0,FD.AFunction.Params.Count);
  1948. N:=FD.AFunction.Body;
  1949. CheckClass(N,TJSFunctionBody);
  1950. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1951. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1952. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1953. AssertEquals('1 statement in functionbody elements',1,E.Statements.Count);
  1954. N:=E.Statements.Nodes[0].Node;
  1955. CheckClass(N,TJSExpressionStatement);
  1956. CheckNotNull(TJSExpressionStatement(N).A);
  1957. CheckClass(TJSExpressionStatement(N).A,TJSPrimaryExpressionIdent);
  1958. AssertEquals('Name','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(N).A).Name);
  1959. // TJSEmptyBlockStatement
  1960. end;
  1961. procedure TTestJSParser.TestIfSimple;
  1962. Var
  1963. E : TJSElement;
  1964. I : TJSIfStatement;
  1965. begin
  1966. CreateParser('if (a) b;');
  1967. E:=GetFirstStatement;
  1968. CheckClass(E,TJSIfStatement);
  1969. I:=TJSIfStatement(E);
  1970. AssertNotNull('Statement condition assigned',I.Cond);
  1971. CheckClass(I.Cond,TJSPrimaryExpressionIdent);
  1972. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(I.Cond).Name);
  1973. AssertNull('Statement false branch assigned',I.BFalse);
  1974. AssertNotNull('Statement true branch assigned',I.Btrue);
  1975. CheckClass(I.Btrue,TJSExpressionStatement);
  1976. AssertNotNull('Expression statement expression',TJSExpressionStatement(I.BTrue).A);
  1977. CheckClass(TJSExpressionStatement(I.BTrue).A,TJSPrimaryExpressionIdent);
  1978. AssertEquals('Name 2','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(I.Btrue).A).Name);
  1979. end;
  1980. procedure TTestJSParser.TestIfEmptyBlock;
  1981. Var
  1982. E : TJSElement;
  1983. I : TJSIfStatement;
  1984. begin
  1985. CreateParser('if (a) {}');
  1986. E:=GetFirstStatement;
  1987. CheckClass(E,TJSIfStatement);
  1988. I:=TJSIfStatement(E);
  1989. AssertNotNull('Statement condition assigned',I.Cond);
  1990. CheckClass(I.Cond,TJSPrimaryExpressionIdent);
  1991. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(I.Cond).Name);
  1992. AssertNull('Statement false branch assigned',I.BFalse);
  1993. AssertNotNull('Statement true branch assigned',I.Btrue);
  1994. CheckClass(I.Btrue,TJSEmptyBlockStatement);
  1995. end;
  1996. procedure TTestJSParser.TestIfEmptyBlockElse;
  1997. Var
  1998. E : TJSElement;
  1999. I : TJSIfStatement;
  2000. begin
  2001. CreateParser('if (a) {} else b;');
  2002. E:=GetFirstStatement;
  2003. CheckClass(E,TJSIfStatement);
  2004. I:=TJSIfStatement(E);
  2005. AssertNotNull('Statement condition assigned',I.Cond);
  2006. CheckClass(I.Cond,TJSPrimaryExpressionIdent);
  2007. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(I.Cond).Name);
  2008. AssertNotNull('Statement false branch assigned',I.BFalse);
  2009. AssertNotNull('Statement true branch assigned',I.Btrue);
  2010. CheckClass(I.Btrue,TJSEmptyBlockStatement);
  2011. end;
  2012. procedure TTestJSParser.TestWhileSimple;
  2013. Var
  2014. E : TJSElement;
  2015. W : TJSWhileStatement;
  2016. begin
  2017. CreateParser('while (a) b;');
  2018. E:=GetFirstStatement;
  2019. CheckClass(E,TJSWhileStatement);
  2020. W:=TJSWhileStatement(E);
  2021. AssertNotNull('Statement condition assigned',W.Cond);
  2022. CheckClass(W.Cond,TJSPrimaryExpressionIdent);
  2023. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(W.Cond).Name);
  2024. AssertNotNull('Statement condition assigned',W.body);
  2025. CheckClass(W.Body,TJSExpressionStatement);
  2026. AssertNotNull('Expression statement expression',TJSExpressionStatement(W.Body).A);
  2027. CheckClass(TJSExpressionStatement(W.Body).A,TJSPrimaryExpressionIdent);
  2028. AssertEquals('Name 1','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(W.Body).A).Name);
  2029. end;
  2030. procedure TTestJSParser.TestWhileBlock;
  2031. Var
  2032. E : TJSElement;
  2033. W : TJSWhileStatement;
  2034. // B : TJSBlockStatement;
  2035. begin
  2036. CreateParser('while (a) {b;}');
  2037. E:=GetFirstStatement;
  2038. CheckClass(E,TJSWhileStatement);
  2039. W:=TJSWhileStatement(E);
  2040. AssertNotNull('Statement condition assigned',W.Cond);
  2041. CheckClass(W.Cond,TJSPrimaryExpressionIdent);
  2042. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(W.Cond).Name);
  2043. AssertNotNull('Statement condition assigned',W.body);
  2044. CheckClass(W.Body,TJSExpressionStatement);
  2045. AssertNotNull('Expression statement expression',TJSExpressionStatement(W.Body).A);
  2046. CheckClass(TJSExpressionStatement(W.Body).A,TJSPrimaryExpressionIdent);
  2047. AssertEquals('Name 1','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(W.Body).A).Name);
  2048. end;
  2049. procedure TTestJSParser.TestDoWhileSimple;
  2050. Var
  2051. E : TJSElement;
  2052. W : TJSDoWhileStatement;
  2053. // B : TJSBlockStatement;
  2054. begin
  2055. CreateParser('do b; while (a);');
  2056. E:=GetFirstStatement;
  2057. CheckClass(E,TJSDoWhileStatement);
  2058. W:=TJSDoWhileStatement(E);
  2059. AssertNotNull('Statement condition assigned',W.Cond);
  2060. CheckClass(W.Cond,TJSPrimaryExpressionIdent);
  2061. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(W.Cond).Name);
  2062. AssertNotNull('Statement condition assigned',W.body);
  2063. CheckClass(W.Body,TJSExpressionStatement);
  2064. AssertNotNull('Expression statement expression',TJSExpressionStatement(W.Body).A);
  2065. CheckClass(TJSExpressionStatement(W.Body).A,TJSPrimaryExpressionIdent);
  2066. AssertEquals('Name 1','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(W.Body).A).Name);
  2067. end;
  2068. procedure TTestJSParser.TestDoWhileBlock;
  2069. Var
  2070. E : TJSElement;
  2071. W : TJSDoWhileStatement;
  2072. // B : TJSBlockStatement;
  2073. begin
  2074. CreateParser('do {b;} while (a);');
  2075. E:=GetFirstStatement;
  2076. CheckClass(E,TJSDoWhileStatement);
  2077. W:=TJSDoWhileStatement(E);
  2078. AssertNotNull('Statement condition assigned',W.Cond);
  2079. CheckClass(W.Cond,TJSPrimaryExpressionIdent);
  2080. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(W.Cond).Name);
  2081. AssertNotNull('Statement condition assigned',W.body);
  2082. CheckClass(W.Body,TJSExpressionStatement);
  2083. AssertNotNull('Expression statement expression',TJSExpressionStatement(W.Body).A);
  2084. CheckClass(TJSExpressionStatement(W.Body).A,TJSPrimaryExpressionIdent);
  2085. AssertEquals('Name 1','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(W.Body).A).Name);
  2086. end;
  2087. procedure TTestJSParser.TestForEmpty;
  2088. Var
  2089. E : TJSElement;
  2090. F : TJSForStatement;
  2091. begin
  2092. CreateParser('for (;;) a;');
  2093. E:=GetFirstStatement;
  2094. CheckClass(E,TJSForStatement);
  2095. F:=TJSForStatement(E);
  2096. AssertNull('Statement condition not assigned',F.Cond);
  2097. AssertNull('Statement init not assigned',F.Init);
  2098. AssertNull('Statement step not assigned',F.Incr);
  2099. CheckClass(F.Body,TJSExpressionStatement);
  2100. AssertNotNull('Expression statement expression',TJSExpressionStatement(F.Body).A);
  2101. CheckClass(TJSExpressionStatement(F.Body).A,TJSPrimaryExpressionIdent);
  2102. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(TJSExpressionStatement(F.Body).A).Name);
  2103. end;
  2104. procedure TTestJSParser.TestForEmptyBody;
  2105. Var
  2106. E : TJSElement;
  2107. F : TJSForStatement;
  2108. begin
  2109. CreateParser('for (;;) {a;}');
  2110. E:=GetFirstStatement;
  2111. CheckClass(E,TJSForStatement);
  2112. F:=TJSForStatement(E);
  2113. AssertNull('Statement condition not assigned',F.Cond);
  2114. AssertNull('Statement init not assigned',F.Init);
  2115. AssertNull('Statement step not assigned',F.Incr);
  2116. CheckClass(F.Body,TJSExpressionStatement);
  2117. AssertNotNull('Expression statement expression',TJSExpressionStatement(F.Body).A);
  2118. CheckClass(TJSExpressionStatement(F.Body).A,TJSPrimaryExpressionIdent);
  2119. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(TJSExpressionStatement(F.Body).A).Name);
  2120. end;
  2121. procedure TTestJSParser.TestForSimpleBody;
  2122. Var
  2123. E : TJSElement;
  2124. F : TJSForStatement;
  2125. begin
  2126. CreateParser('for (a;b;c) {d;}');
  2127. E:=GetFirstStatement;
  2128. CheckClass(E,TJSForStatement);
  2129. F:=TJSForStatement(E);
  2130. AssertNotNull('Statement condition not assigned',F.Cond);
  2131. AssertNotNull('Statement init not assigned',F.Init);
  2132. AssertNotNull('Statement step not assigned',F.Incr);
  2133. CheckClass(F.Init,TJSPrimaryExpressionIdent);
  2134. AssertNotNull('Expression statement expression',TJSPrimaryExpressionIdent(F.Init));
  2135. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(F.Init).Name);
  2136. CheckClass(F.Incr,TJSPrimaryExpressionIdent);
  2137. AssertNotNull('Expression statement expression',TJSPrimaryExpressionIdent(F.Incr));
  2138. AssertEquals('Name 2','c',TJSPrimaryExpressionIdent(F.Incr).Name);
  2139. CheckClass(F.Cond,TJSPrimaryExpressionIdent);
  2140. AssertNotNull('Expression statement expression',TJSPrimaryExpressionIdent(F.Cond));
  2141. AssertEquals('Name 3','b',TJSPrimaryExpressionIdent(F.cond).Name);
  2142. CheckClass(F.Body,TJSExpressionStatement);
  2143. AssertNotNull('Expression statement expression',TJSExpressionStatement(F.Body).A);
  2144. CheckClass(TJSExpressionStatement(F.Body).A,TJSPrimaryExpressionIdent);
  2145. AssertEquals('Name 4','d',TJSPrimaryExpressionIdent(TJSExpressionStatement(F.Body).A).Name);
  2146. end;
  2147. procedure TTestJSParser.TestTryCatch;
  2148. Var
  2149. E : TJSElement;
  2150. T : TJSTryCatchStatement;
  2151. begin
  2152. CreateParser('try {a;} catch (e) {b;}');
  2153. E:=GetFirstStatement;
  2154. CheckClass(E,TJSTryCatchStatement);
  2155. T:=TJSTryCatchStatement(E);
  2156. CheckClass(T.Block,TJSExpressionStatement);
  2157. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.Block).A);
  2158. CheckClass(TJSExpressionStatement(T.Block).A,TJSPrimaryExpressionIdent);
  2159. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.Block).A).Name);
  2160. CheckClass(T.BCatch,TJSExpressionStatement);
  2161. AssertEquals('Except object identifier name','e',T.Ident);
  2162. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.BCatch).A);
  2163. CheckClass(TJSExpressionStatement(T.BCatch).A,TJSPrimaryExpressionIdent);
  2164. AssertEquals('Name 2','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.BCatch).A).Name);
  2165. AssertNull('No Finally expression',T.BFinally);
  2166. end;
  2167. procedure TTestJSParser.TestTryCatchFinally;
  2168. Var
  2169. E : TJSElement;
  2170. T : TJSTryCatchFinallyStatement;
  2171. begin
  2172. CreateParser('try {a;} catch (e) {b;} finally {c;}');
  2173. E:=GetFirstStatement;
  2174. CheckClass(E,TJSTryCatchFinallyStatement);
  2175. T:=TJSTryCatchFinallyStatement(E);
  2176. CheckClass(T.Block,TJSExpressionStatement);
  2177. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.Block).A);
  2178. CheckClass(TJSExpressionStatement(T.Block).A,TJSPrimaryExpressionIdent);
  2179. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.Block).A).Name);
  2180. AssertEquals('Except object identifier name','e',T.Ident);
  2181. CheckClass(T.BCatch,TJSExpressionStatement);
  2182. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.BCatch).A);
  2183. CheckClass(TJSExpressionStatement(T.BCatch).A,TJSPrimaryExpressionIdent);
  2184. AssertEquals('Name 2','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.BCatch).A).Name);
  2185. AssertNotNull('Finally expression',T.BFinally);
  2186. CheckClass(T.BFinally,TJSExpressionStatement);
  2187. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.BFinally).A);
  2188. CheckClass(TJSExpressionStatement(T.BFinally).A,TJSPrimaryExpressionIdent);
  2189. AssertEquals('Name 3','c',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.BFinally).A).Name);
  2190. end;
  2191. procedure TTestJSParser.TestTryFinally;
  2192. Var
  2193. E : TJSElement;
  2194. T : TJSTryFinallyStatement;
  2195. begin
  2196. CreateParser('try {a;} finally {c;}');
  2197. E:=GetFirstStatement;
  2198. CheckClass(E,TJSTryFinallyStatement);
  2199. T:=TJSTryFinallyStatement(E);
  2200. CheckClass(T.Block,TJSExpressionStatement);
  2201. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.Block).A);
  2202. CheckClass(TJSExpressionStatement(T.Block).A,TJSPrimaryExpressionIdent);
  2203. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.Block).A).Name);
  2204. AssertNull('No catch',T.BCatch);
  2205. AssertNotNull('Finally expression',T.BFinally);
  2206. AssertNotNull('Finally expression',TJSExpressionStatement(T.BFinally).A);
  2207. CheckClass(TJSExpressionStatement(T.BFinally).A,TJSPrimaryExpressionIdent);
  2208. AssertEquals('Name 2','c',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.BFinally).A).Name);
  2209. end;
  2210. procedure TTestJSParser.TestThrow;
  2211. Var
  2212. E : TJSElement;
  2213. T : TJSThrowStatement;
  2214. begin
  2215. CreateParser('throw a;');
  2216. E:=GetFirstStatement;
  2217. CheckClass(E,TJSThrowStatement);
  2218. T:=TJSThrowStatement(E);
  2219. AssertNotNull('Have throw object',T.A);
  2220. CheckClass(T.A,TJSPrimaryExpressionIdent);
  2221. AssertEquals('Correct identifier','a',TJSPrimaryExpressionIdent(T.A).Name);
  2222. end;
  2223. procedure TTestJSParser.TestReturn;
  2224. Var
  2225. E : TJSSourceElements;
  2226. N : TJSElement;
  2227. FD : TJSFunctionDeclarationStatement;
  2228. begin
  2229. CreateParser('function a () { return b; }');
  2230. E:=GetSourceElements;
  2231. AssertEquals('1 function defined',1,E.functions.Count);
  2232. N:=E.Functions.Nodes[0].Node;
  2233. AssertNotNull('Function element defined ',N);
  2234. CheckClass(N,TJSFunctionDeclarationStatement);
  2235. FD:=TJSFunctionDeclarationStatement(N);
  2236. AssertNotNull('Function definition assigned',FD.AFunction);
  2237. AssertEquals('Function name OK','a',FD.AFunction.Name);
  2238. AssertNotNull('Function body assigned', FD.AFunction.Body);
  2239. AssertEquals('No parameters',0,FD.AFunction.Params.Count);
  2240. N:=FD.AFunction.Body;
  2241. CheckClass(N,TJSFunctionBody);
  2242. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  2243. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  2244. E:=TJSSourceElements(TJSFunctionBody(N).A);
  2245. AssertEquals('1 statement in functionbody elements',1,E.Statements.Count);
  2246. end;
  2247. procedure TTestJSParser.TestAssignment;
  2248. Var
  2249. E : TJSElement;
  2250. ES : TJSExpressionStatement;
  2251. A : TJSSimpleAssignStatement;
  2252. begin
  2253. CreateParser('a=b;');
  2254. E:=GetFirstStatement;
  2255. CheckClass(E,TJSExpressionStatement);
  2256. ES:=TJSExpressionStatement(E);
  2257. CheckClass(ES.A,TJSSimpleAssignStatement);
  2258. A:=TJSSimpleAssignStatement(ES.A);
  2259. AssertNotNull('Have LHS',A.LHS);
  2260. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  2261. AssertEquals('Have LHS name','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  2262. CheckClass(A.Expr,TJSPrimaryExpressionIdent);
  2263. AssertEquals('Have RHS name','b',TJSPrimaryExpressionIdent(A.Expr).Name);
  2264. end;
  2265. procedure TTestJSParser.TestNew;
  2266. Var
  2267. E : TJSElement;
  2268. ES : TJSExpressionStatement;
  2269. A : TJSSimpleAssignStatement;
  2270. N : TJSNewMemberExpression;
  2271. L : TJSLiteral;
  2272. begin
  2273. CreateParser('a = new b(123)');
  2274. E:=GetFirstStatement;
  2275. CheckClass(E,TJSExpressionStatement);
  2276. ES:=TJSExpressionStatement(E);
  2277. CheckClass(ES.A,TJSSimpleAssignStatement);
  2278. A:=TJSSimpleAssignStatement(ES.A);
  2279. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  2280. AssertEquals('Have LHS name','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  2281. CheckClass(A.Expr,TJSNewMemberExpression);
  2282. N:=TJSNewMemberExpression(A.Expr);
  2283. AssertNotNull('Have LHS name',N.Mexpr);
  2284. CheckClass(N.Mexpr,TJSPrimaryExpressionIdent);
  2285. AssertEquals('Have LHS name','b',TJSPrimaryExpressionIdent(N.Mexpr).Name);
  2286. AssertNotNull('Have arguments',N.Args);
  2287. AssertEquals('One argument',1,N.Args.Elements.Count);
  2288. AssertNotNull('Have argument 0',N.Args.Elements[0].Expr);
  2289. CheckClass(N.Args.Elements[0].Expr,TJSLiteral);
  2290. L:=TJSLiteral(N.Args.Elements[0].Expr);
  2291. AssertNotNull('Expression value assigned',L.Value);
  2292. AssertEquals('Expression value type correct', jstNumber,L.Value.ValueType);
  2293. AssertEquals('Expression value correct', 123,L.Value.AsNumber);
  2294. end;
  2295. procedure TTestJSParser.TestLabeledStatement;
  2296. Var
  2297. E : TJSElement;
  2298. ES : TJSExpressionStatement;
  2299. A : TJSSimpleAssignStatement;
  2300. N : TJSNewMemberExpression;
  2301. L : TJSLiteral;
  2302. LS : TJSLabeledStatement;
  2303. begin
  2304. CreateParser('loc: a = new b(123)');
  2305. E:=GetFirstStatement;
  2306. CheckClass(E,TJSLabeledStatement);
  2307. LS:=TJSLabeledStatement(E);
  2308. AssertNotNull('Have label',LS.TheLabel);
  2309. AssertEquals('Have correct label','loc',LS.TheLabel.Name);
  2310. CheckClass(LS.A,TJSExpressionStatement);
  2311. ES:=TJSExpressionStatement(LS.A);
  2312. CheckClass(ES.A,TJSSimpleAssignStatement);
  2313. A:=TJSSimpleAssignStatement(ES.A);
  2314. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  2315. AssertEquals('Have LHS name','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  2316. CheckClass(A.Expr,TJSNewMemberExpression);
  2317. N:=TJSNewMemberExpression(A.Expr);
  2318. AssertNotNull('Have LHS name',N.Mexpr);
  2319. CheckClass(N.Mexpr,TJSPrimaryExpressionIdent);
  2320. AssertEquals('Have LHS name','b',TJSPrimaryExpressionIdent(N.Mexpr).Name);
  2321. AssertNotNull('Have arguments',N.Args);
  2322. AssertEquals('One argument',1,N.Args.Elements.Count);
  2323. AssertNotNull('Have argument 0',N.Args.Elements[0].Expr);
  2324. CheckClass(N.Args.Elements[0].Expr,TJSLiteral);
  2325. L:=TJSLiteral(N.Args.Elements[0].Expr);
  2326. AssertNotNull('Expression value assigned',L.Value);
  2327. AssertEquals('Expression value type correct', jstNumber,L.Value.ValueType);
  2328. AssertEquals('Expression value correct', 123,L.Value.AsNumber);
  2329. end;
  2330. procedure TTestJSParser.TestContinue;
  2331. Var
  2332. E : TJSElement;
  2333. C : TJSContinueStatement;
  2334. begin
  2335. CreateParser('while (true) continue;');
  2336. E:=GetFirstStatement;
  2337. CheckClass(E,TJSWhileStatement);
  2338. E:=TJSWhileStatement(E).Body;
  2339. CheckClass(E,TJSContinueStatement);
  2340. C:=TJSContinueStatement(E);
  2341. AssertEquals('Have correct (empty) label','',C.TargetName);
  2342. end;
  2343. procedure TTestJSParser.TestContinueTarget;
  2344. Var
  2345. E : TJSElement;
  2346. C : TJSContinueStatement;
  2347. begin
  2348. CreateParser('a: while (true) continue a;');
  2349. E:=GetFirstStatement;
  2350. CheckClass(E,TJSLabeledStatement);
  2351. E:=TJSLabeledStatement(E).A;
  2352. CheckClass(E,TJSWhileStatement);
  2353. E:=TJSWhileStatement(E).Body;
  2354. CheckClass(E,TJSContinueStatement);
  2355. C:=TJSContinueStatement(E);
  2356. AssertEquals('Have correct label','a',C.TargetName);
  2357. end;
  2358. procedure TTestJSParser.TestBreakTarget;
  2359. Var
  2360. E : TJSElement;
  2361. C : TJSBreakStatement;
  2362. begin
  2363. CreateParser('a: while (true) break a;');
  2364. E:=GetFirstStatement;
  2365. CheckClass(E,TJSLabeledStatement);
  2366. E:=TJSLabeledStatement(E).A;
  2367. CheckClass(E,TJSWhileStatement);
  2368. E:=TJSWhileStatement(E).Body;
  2369. CheckClass(E,TJSBreakStatement);
  2370. C:=TJSBreakStatement(E);
  2371. AssertEquals('Have correct label','a',C.TargetName);
  2372. end;
  2373. procedure TTestJSParser.TestSwitchEmpty;
  2374. Var
  2375. E : TJSElement;
  2376. S : TJSSwitchStatement;
  2377. begin
  2378. CreateParser('switch (a) {}');
  2379. E:=GetFirstStatement;
  2380. CheckClass(E,TJSSwitchStatement);
  2381. S:=TJSSwitchStatement(E);
  2382. AssertNotNull('Have condition',S.Cond);
  2383. AssertNull('Have no default',S.TheDefault);
  2384. AssertIdentifier('Case condition',S.Cond,'a');
  2385. S:=TJSSwitchStatement(E);
  2386. AssertEquals('No cases',0,S.Cases.Count)
  2387. end;
  2388. procedure TTestJSParser.TestSwitchOne;
  2389. Var
  2390. E : TJSElement;
  2391. S : TJSSwitchStatement;
  2392. C : TJSCaseElement;
  2393. begin
  2394. CreateParser('switch (a) { case c : {}}');
  2395. E:=GetFirstStatement;
  2396. CheckClass(E,TJSSwitchStatement);
  2397. S:=TJSSwitchStatement(E);
  2398. AssertNotNull('Have condition',S.Cond);
  2399. AssertNull('Have no default',S.TheDefault);
  2400. AssertIdentifier('Case condition',S.Cond,'a');
  2401. S:=TJSSwitchStatement(E);
  2402. AssertEquals('1 case',1,S.Cases.Count);
  2403. C:=TJSCaseElement(S.Cases[0]);
  2404. AssertIdentifier('Case expression',C.Expr,'c');
  2405. CheckClass(C.Body,TJSEmptyBlockStatement);
  2406. end;
  2407. procedure TTestJSParser.TestSwitchTwo;
  2408. Var
  2409. E : TJSElement;
  2410. S : TJSSwitchStatement;
  2411. C : TJSCaseElement;
  2412. begin
  2413. CreateParser('switch (a) { case c: {}'+sLineBreak+' case d: {}}');
  2414. E:=GetFirstStatement;
  2415. CheckClass(E,TJSSwitchStatement);
  2416. S:=TJSSwitchStatement(E);
  2417. AssertNotNull('Have condition',S.Cond);
  2418. AssertNull('Have no default',S.TheDefault);
  2419. AssertIdentifier('Case condition',S.Cond,'a');
  2420. S:=TJSSwitchStatement(E);
  2421. AssertEquals('2 cases',2,S.Cases.Count);
  2422. C:=TJSCaseElement(S.Cases[0]);
  2423. AssertIdentifier('Case expression',C.Expr,'c');
  2424. CheckClass(C.Body,TJSEmptyBlockStatement);
  2425. C:=TJSCaseElement(S.Cases[1]);
  2426. AssertIdentifier('Case expression',C.Expr,'d');
  2427. CheckClass(C.Body,TJSEmptyBlockStatement);
  2428. end;
  2429. procedure TTestJSParser.TestSwitchTwoDefault;
  2430. Var
  2431. E : TJSElement;
  2432. S : TJSSwitchStatement;
  2433. C : TJSCaseElement;
  2434. begin
  2435. CreateParser('switch (a) { case c: {} case d: {} default: {}}');
  2436. E:=GetFirstStatement;
  2437. CheckClass(E,TJSSwitchStatement);
  2438. S:=TJSSwitchStatement(E);
  2439. AssertNotNull('Have condition',S.Cond);
  2440. AssertNotNull('Have default',S.TheDefault);
  2441. AssertIdentifier('Case condition',S.Cond,'a');
  2442. S:=TJSSwitchStatement(E);
  2443. AssertEquals('2 cases',3,S.Cases.Count);
  2444. C:=TJSCaseElement(S.Cases[0]);
  2445. AssertIdentifier('Case expression',C.Expr,'c');
  2446. CheckClass(C.Body,TJSEmptyBlockStatement);
  2447. C:=TJSCaseElement(S.Cases[1]);
  2448. AssertIdentifier('Case expression',C.Expr,'d');
  2449. CheckClass(C.Body,TJSEmptyBlockStatement);
  2450. C:=TJSCaseElement(S.Cases[2]);
  2451. CheckClass(C.Body,TJSEmptyBlockStatement);
  2452. AssertSame('Default',C,S.TheDefault);
  2453. end;
  2454. procedure TTestJSParser.TestImportModule;
  2455. Var
  2456. E : TJSElement;
  2457. Imp : TJSImportStatement absolute E;
  2458. begin
  2459. CreateParser('import "a.js"',MinImportVersion);
  2460. E:=GetFirstStatement;
  2461. CheckClass(E,TJSImportStatement);
  2462. AssertEquals('DefaultImportedName','',Imp.DefaultBinding);
  2463. AssertEquals('NamespaceImport','',Imp.NameSpaceImport);
  2464. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2465. AssertFalse('Named imports',Imp.HaveNamedImports);
  2466. end;
  2467. procedure TTestJSParser.TestImportImportedDefault;
  2468. Var
  2469. E : TJSElement;
  2470. Imp : TJSImportStatement absolute E;
  2471. begin
  2472. CreateParser('import A from "a.js"',MinImportVersion);
  2473. E:=GetFirstStatement;
  2474. CheckClass(E,TJSImportStatement);
  2475. AssertEquals('DefaultImportedName','A',Imp.DefaultBinding);
  2476. AssertEquals('NamespaceImport','',Imp.NameSpaceImport);
  2477. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2478. AssertFalse('Named imports',Imp.HaveNamedImports);
  2479. end;
  2480. procedure TTestJSParser.TestImportNamespaceImport;
  2481. Var
  2482. E : TJSElement;
  2483. Imp : TJSImportStatement absolute E;
  2484. begin
  2485. CreateParser('import * as A from "a.js"',MinImportVersion);
  2486. E:=GetFirstStatement;
  2487. CheckClass(E,TJSImportStatement);
  2488. AssertEquals('DefaultImportedName','',Imp.DefaultBinding);
  2489. AssertEquals('NamespaceImport','A',Imp.NameSpaceImport);
  2490. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2491. AssertFalse('Named imports',Imp.HaveNamedImports);
  2492. end;
  2493. procedure TTestJSParser.TestImportImportedDefaultAndNamespaceImport;
  2494. Var
  2495. E : TJSElement;
  2496. Imp : TJSImportStatement absolute E;
  2497. begin
  2498. CreateParser('import A, * as B from "a.js"',MinImportVersion);
  2499. E:=GetFirstStatement;
  2500. CheckClass(E,TJSImportStatement);
  2501. AssertEquals('DefaultImportedName','A',Imp.DefaultBinding);
  2502. AssertEquals('NamespaceImport','B',Imp.NameSpaceImport);
  2503. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2504. AssertFalse('Named imports',Imp.HaveNamedImports);
  2505. end;
  2506. procedure TTestJSParser.TestImportNamedImport;
  2507. Var
  2508. E : TJSElement;
  2509. Imp : TJSImportStatement absolute E;
  2510. NamedImp : TJSNamedImportElement;
  2511. begin
  2512. CreateParser('import {A} from "a.js"',MinImportVersion);
  2513. E:=GetFirstStatement;
  2514. CheckClass(E,TJSImportStatement);
  2515. AssertEquals('DefaultImportedName','',Imp.DefaultBinding);
  2516. AssertEquals('NamespaceImport','',Imp.NameSpaceImport);
  2517. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2518. AssertTrue('Named imports',Imp.HaveNamedImports);
  2519. AssertEquals('Named import count',1,Imp.NamedImports.Count);
  2520. NamedImp:=Imp.NamedImports[0];
  2521. AssertEquals('Named import name','A',NamedImp.Name);
  2522. AssertEquals('Named import alias','',NamedImp.Alias);
  2523. end;
  2524. procedure TTestJSParser.TestImportNamedImportAlias;
  2525. Var
  2526. E : TJSElement;
  2527. Imp : TJSImportStatement absolute E;
  2528. NamedImp : TJSNamedImportElement;
  2529. begin
  2530. CreateParser('import {A as C} from "a.js"',MinImportVersion);
  2531. E:=GetFirstStatement;
  2532. CheckClass(E,TJSImportStatement);
  2533. AssertEquals('DefaultImportedName','',Imp.DefaultBinding);
  2534. AssertEquals('NamespaceImport','',Imp.NameSpaceImport);
  2535. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2536. AssertTrue('Named imports',Imp.HaveNamedImports);
  2537. AssertEquals('Named import count',1,Imp.NamedImports.Count);
  2538. NamedImp:=Imp.NamedImports[0];
  2539. AssertEquals('Named import name','A',NamedImp.Name);
  2540. AssertEquals('Named import alias','C',NamedImp.Alias);
  2541. end;
  2542. procedure TTestJSParser.TestImport2NamedImports;
  2543. Var
  2544. E : TJSElement;
  2545. Imp : TJSImportStatement absolute E;
  2546. NamedImp : TJSNamedImportElement;
  2547. begin
  2548. CreateParser('import {A, B} from "a.js"',MinImportVersion);
  2549. E:=GetFirstStatement;
  2550. CheckClass(E,TJSImportStatement);
  2551. AssertEquals('DefaultImportedName','',Imp.DefaultBinding);
  2552. AssertEquals('NamespaceImport','',Imp.NameSpaceImport);
  2553. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2554. AssertTrue('Named imports',Imp.HaveNamedImports);
  2555. AssertEquals('Named import count',2,Imp.NamedImports.Count);
  2556. NamedImp:=Imp.NamedImports[0];
  2557. AssertEquals('Named import name 1','A',NamedImp.Name);
  2558. AssertEquals('Named import alias 1','',NamedImp.Alias);
  2559. NamedImp:=Imp.NamedImports[1];
  2560. AssertEquals('Named import name 2','B',NamedImp.Name);
  2561. AssertEquals('Named import alias 2','',NamedImp.Alias);
  2562. end;
  2563. procedure TTestJSParser.TestImport2NamedImportAlias;
  2564. Var
  2565. E : TJSElement;
  2566. Imp : TJSImportStatement absolute E;
  2567. NamedImp : TJSNamedImportElement;
  2568. begin
  2569. CreateParser('import {A as C, B as D} from "a.js"',MinImportVersion);
  2570. E:=GetFirstStatement;
  2571. CheckClass(E,TJSImportStatement);
  2572. AssertEquals('DefaultImportedName','',Imp.DefaultBinding);
  2573. AssertEquals('NamespaceImport','',Imp.NameSpaceImport);
  2574. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2575. AssertTrue('Named imports',Imp.HaveNamedImports);
  2576. AssertEquals('Named import count',2,Imp.NamedImports.Count);
  2577. NamedImp:=Imp.NamedImports[0];
  2578. AssertEquals('Named import name 1','A',NamedImp.Name);
  2579. AssertEquals('Named import alias 1','C',NamedImp.Alias);
  2580. NamedImp:=Imp.NamedImports[1];
  2581. AssertEquals('Named import name 2','B',NamedImp.Name);
  2582. AssertEquals('Named import alias 2','D',NamedImp.Alias);
  2583. end;
  2584. procedure TTestJSParser.TestImport2NamedImportsComma;
  2585. Var
  2586. E : TJSElement;
  2587. Imp : TJSImportStatement absolute E;
  2588. NamedImp : TJSNamedImportElement;
  2589. begin
  2590. CreateParser('import {A, B, } from "a.js"',MinImportVersion);
  2591. E:=GetFirstStatement;
  2592. CheckClass(E,TJSImportStatement);
  2593. AssertEquals('DefaultImportedName','',Imp.DefaultBinding);
  2594. AssertEquals('NamespaceImport','',Imp.NameSpaceImport);
  2595. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2596. AssertTrue('Named imports',Imp.HaveNamedImports);
  2597. AssertEquals('Named import count',2,Imp.NamedImports.Count);
  2598. NamedImp:=Imp.NamedImports[0];
  2599. AssertEquals('Named import name 1','A',NamedImp.Name);
  2600. AssertEquals('Named import alias 1','',NamedImp.Alias);
  2601. NamedImp:=Imp.NamedImports[1];
  2602. AssertEquals('Named import name 2','B',NamedImp.Name);
  2603. AssertEquals('Named import alias 2','',NamedImp.Alias);
  2604. end;
  2605. procedure TTestJSParser.TestImportDefaultAndNamedImport;
  2606. Var
  2607. E : TJSElement;
  2608. Imp : TJSImportStatement absolute E;
  2609. NamedImp : TJSNamedImportElement;
  2610. begin
  2611. CreateParser('import D, {A} from "a.js"',MinImportVersion);
  2612. E:=GetFirstStatement;
  2613. CheckClass(E,TJSImportStatement);
  2614. AssertEquals('DefaultImportedName','D',Imp.DefaultBinding);
  2615. AssertEquals('NamespaceImport','',Imp.NameSpaceImport);
  2616. AssertEquals('Modulename','a.js',Imp.ModuleName);
  2617. AssertTrue('Named imports',Imp.HaveNamedImports);
  2618. AssertEquals('Named import count',1,Imp.NamedImports.Count);
  2619. NamedImp:=Imp.NamedImports[0];
  2620. AssertEquals('Named import name','A',NamedImp.Name);
  2621. AssertEquals('Named import alias','',NamedImp.Alias);
  2622. end;
  2623. procedure TTestJSParser.TestExportAll;
  2624. Var
  2625. E : TJSElement;
  2626. Exp : TJSExportStatement absolute E;
  2627. begin
  2628. CreateParser('export *',MinExportVersion);
  2629. E:=GetFirstStatement;
  2630. AssertFalse('Default',Exp.IsDefault);
  2631. CheckClass(E,TJSExportStatement);
  2632. AssertEquals('NameSpaceExport','*',Exp.NameSpaceExport);
  2633. AssertNull('Declaration',Exp.Declaration);
  2634. AssertEquals('ModuleName','',Exp.ModuleName);
  2635. AssertFalse('ExportNames',Exp.HaveExportNames);
  2636. end;
  2637. procedure TTestJSParser.TestExportAllFrom;
  2638. Var
  2639. E : TJSElement;
  2640. Exp : TJSExportStatement absolute E;
  2641. begin
  2642. CreateParser('export * from "a.js"',MinExportVersion);
  2643. E:=GetFirstStatement;
  2644. CheckClass(E,TJSExportStatement);
  2645. AssertEquals('NameSpaceExport','*',Exp.NameSpaceExport);
  2646. AssertFalse('Default',Exp.IsDefault);
  2647. AssertNull('Declaration',Exp.Declaration);
  2648. AssertEquals('ModuleName','a.js',Exp.ModuleName);
  2649. AssertFalse('ExportNames',Exp.HaveExportNames);
  2650. end;
  2651. procedure TTestJSParser.TestExportExportName;
  2652. Var
  2653. E : TJSElement;
  2654. Exp : TJSExportStatement absolute E;
  2655. El : TJSExportNameElement;
  2656. begin
  2657. CreateParser('export { a }',MinExportVersion);
  2658. E:=GetFirstStatement;
  2659. CheckClass(E,TJSExportStatement);
  2660. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2661. AssertFalse('Default',Exp.IsDefault);
  2662. AssertNull('Declaration',Exp.Declaration);
  2663. AssertEquals('ModuleName','',Exp.ModuleName);
  2664. AssertTrue('ExportNames',Exp.HaveExportNames);
  2665. AssertEquals('ExportNames count',1,Exp.ExportNames.Count);
  2666. El:=Exp.ExportNames[0];
  2667. AssertEquals('ExportNames[0].Name','a',El.Name);
  2668. AssertEquals('ExportNames[0].Name','',El.Alias);
  2669. end;
  2670. procedure TTestJSParser.TestExportExportNameAlias;
  2671. Var
  2672. E : TJSElement;
  2673. Exp : TJSExportStatement absolute E;
  2674. El : TJSExportNameElement;
  2675. begin
  2676. CreateParser('export { a as b }',MinExportVersion);
  2677. E:=GetFirstStatement;
  2678. CheckClass(E,TJSExportStatement);
  2679. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2680. AssertFalse('Default',Exp.IsDefault);
  2681. AssertNull('Declaration',Exp.Declaration);
  2682. AssertEquals('ModuleName','',Exp.ModuleName);
  2683. AssertTrue('ExportNames',Exp.HaveExportNames);
  2684. AssertEquals('ExportNames count',1,Exp.ExportNames.Count);
  2685. El:=Exp.ExportNames[0];
  2686. AssertEquals('ExportNames[0].Name','a',El.Name);
  2687. AssertEquals('ExportNames[0].Name','b',El.Alias);
  2688. end;
  2689. procedure TTestJSParser.TestExportVar;
  2690. Var
  2691. E : TJSElement;
  2692. Exp : TJSExportStatement absolute E;
  2693. V : TJSVariableStatement;
  2694. begin
  2695. CreateParser('export var a = 1',MinExportVersion);
  2696. E:=GetFirstStatement;
  2697. CheckClass(E,TJSExportStatement);
  2698. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2699. AssertFalse('Default',Exp.IsDefault);
  2700. AssertNotNull('Declaration',Exp.Declaration);
  2701. CheckClass(Exp.Declaration,TJSVariableStatement);
  2702. V:=TJSVariableStatement(Exp.Declaration);
  2703. AssertEquals('var type',vtVar,V.varType);
  2704. CheckClass(V.VarDecl,TJSVarDeclaration);
  2705. AssertEquals('Variable name','a',TJSVarDeclaration(V.VarDecl).Name);
  2706. end;
  2707. procedure TTestJSParser.TestExportLet;
  2708. Var
  2709. E : TJSElement;
  2710. Exp : TJSExportStatement absolute E;
  2711. V : TJSVariableStatement;
  2712. begin
  2713. CreateParser('export let a = 1',MinExportVersion);
  2714. E:=GetFirstStatement;
  2715. CheckClass(E,TJSExportStatement);
  2716. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2717. AssertFalse('Default',Exp.IsDefault);
  2718. AssertNotNull('Declaration',Exp.Declaration);
  2719. CheckClass(Exp.Declaration,TJSVariableStatement);
  2720. V:=TJSVariableStatement(Exp.Declaration);
  2721. AssertEquals('var type',vtLet,V.varType);
  2722. CheckClass(V.VarDecl,TJSVarDeclaration);
  2723. AssertEquals('Variable name','a',TJSVarDeclaration(V.VarDecl).Name);
  2724. end;
  2725. procedure TTestJSParser.TestExportConst;
  2726. Var
  2727. E : TJSElement;
  2728. Exp : TJSExportStatement absolute E;
  2729. V : TJSVariableStatement;
  2730. begin
  2731. CreateParser('export const a = 1',MinExportVersion);
  2732. E:=GetFirstStatement;
  2733. CheckClass(E,TJSExportStatement);
  2734. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2735. AssertFalse('Default',Exp.IsDefault);
  2736. AssertNotNull('Declaration',Exp.Declaration);
  2737. CheckClass(Exp.Declaration,TJSVariableStatement);
  2738. V:=TJSVariableStatement(Exp.Declaration);
  2739. AssertEquals('var type',vtConst,V.varType);
  2740. CheckClass(V.VarDecl,TJSVarDeclaration);
  2741. AssertEquals('Variable name','a',TJSVarDeclaration(V.VarDecl).Name);
  2742. end;
  2743. procedure TTestJSParser.TestExportFunction;
  2744. Var
  2745. E : TJSElement;
  2746. Exp : TJSExportStatement absolute E;
  2747. F : TJSFunctionDeclarationStatement;
  2748. begin
  2749. CreateParser('export function a () { return 1; } ',MinExportVersion);
  2750. E:=GetFirstStatement;
  2751. CheckClass(E,TJSExportStatement);
  2752. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2753. AssertFalse('Default',Exp.IsDefault);
  2754. AssertNotNull('Declaration',Exp.Declaration);
  2755. CheckClass(Exp.Declaration,TJSFunctionDeclarationStatement);
  2756. F:=TJSFunctionDeclarationStatement(Exp.Declaration);
  2757. AssertNotNull('Have function', F.AFunction);
  2758. AssertEquals('Variable name','a',F.AFunction.Name);
  2759. end;
  2760. procedure TTestJSParser.TestExportDefaultAssignment;
  2761. Var
  2762. E : TJSElement;
  2763. Exp : TJSExportStatement absolute E;
  2764. A : TJSAssignStatement;
  2765. begin
  2766. CreateParser('export default a = 1',MinExportVersion);
  2767. E:=GetFirstStatement;
  2768. CheckClass(E,TJSExportStatement);
  2769. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2770. AssertTrue('Default',Exp.IsDefault);
  2771. AssertNotNull('Declaration',Exp.Declaration);
  2772. CheckClass(Exp.Declaration,TJSSimpleAssignStatement);
  2773. A:=TJSSimpleAssignStatement(Exp.Declaration);
  2774. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  2775. AssertEquals('Operator token',jstoken.tjsASSIGN,A.OperatorToken);
  2776. AssertEquals('Variable name','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  2777. end;
  2778. procedure TTestJSParser.TestExportDefaultFunction;
  2779. Var
  2780. E : TJSElement;
  2781. Exp : TJSExportStatement absolute E;
  2782. F : TJSFunctionDeclarationStatement;
  2783. begin
  2784. CreateParser('export default function a () { return 1; } ',MinExportVersion);
  2785. E:=GetFirstStatement;
  2786. CheckClass(E,TJSExportStatement);
  2787. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2788. AssertTrue('Default',Exp.IsDefault);
  2789. AssertNotNull('Declaration',Exp.Declaration);
  2790. CheckClass(Exp.Declaration,TJSFunctionDeclarationStatement);
  2791. F:=TJSFunctionDeclarationStatement(Exp.Declaration);
  2792. AssertNotNull('Have function', F.AFunction);
  2793. AssertEquals('Variable name','a',F.AFunction.Name);
  2794. AssertFalse('Async',F.AFunction.IsAsync);
  2795. end;
  2796. procedure TTestJSParser.TestExportDefaultAsyncFunction;
  2797. Var
  2798. E : TJSElement;
  2799. Exp : TJSExportStatement absolute E;
  2800. F : TJSFunctionDeclarationStatement;
  2801. begin
  2802. CreateParser('export default async function a () { return 1; } ',MinExportVersion);
  2803. E:=GetFirstStatement;
  2804. CheckClass(E,TJSExportStatement);
  2805. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2806. AssertTrue('Default',Exp.IsDefault);
  2807. AssertNotNull('Declaration',Exp.Declaration);
  2808. CheckClass(Exp.Declaration,TJSFunctionDeclarationStatement);
  2809. F:=TJSFunctionDeclarationStatement(Exp.Declaration);
  2810. AssertNotNull('Have function', F.AFunction);
  2811. AssertEquals('Variable name','a',F.AFunction.Name);
  2812. AssertTrue('Async',F.AFunction.IsAsync);
  2813. end;
  2814. procedure TTestJSParser.TestClass;
  2815. begin
  2816. CreateParser('class Rectangle { } ',MinClassVersion);
  2817. AssertEquals('class name correct','Rectangle',GetFirstClass.Name);
  2818. AssertNull('class extends name correct',GetFirstClass.Extends);
  2819. end;
  2820. procedure TTestJSParser.TestClassExtends;
  2821. Var
  2822. Ext: TJSTypeReference;
  2823. begin
  2824. CreateParser('class Rectangle extends Shape { function myMethod () { return null; } } ',MinClassVersion);
  2825. AssertEquals('class name correct','Rectangle',GetFirstClass.Name);
  2826. Ext:=TJSTypeReference(CheckClass('Extends is type ref',TJSTypeReference,GetFirstClass.Extends));
  2827. AssertEquals('class extends name correct','Shape',Ext.Name);
  2828. end;
  2829. procedure TTestJSParser.TestClassWithMethod;
  2830. begin
  2831. CreateParser('class Rectangle { function myMethod () { return null; } } ',MinClassVersion);
  2832. AssertEquals('class name correct','Rectangle',GetFirstClass.Name);
  2833. AssertNull('class extends name correct',GetFirstClass.Extends);
  2834. AssertNotNull('Have members',GetFirstClass.Members);
  2835. AssertEquals('Have functions',1,GetFirstClass.Members.Functions.Count);
  2836. end;
  2837. procedure TTestJSParser.TestClassExpression;
  2838. Var
  2839. X : TJSExpressionStatement;
  2840. A : TJSSimpleAssignStatement;
  2841. begin
  2842. CreateParser('a = class Rectangle { } ',MinClassVersion);
  2843. X:=GetExpressionStatement;
  2844. CheckClass(X.A,TJSSimpleAssignStatement);
  2845. A:=TJSSimpleAssignStatement(X.A);
  2846. AssertNotNull('Have left operand',A.LHS);
  2847. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  2848. AssertEquals('Correct name for assignment LHS ','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  2849. end;
  2850. procedure TTestJSParser.TestLetClassExpression;
  2851. Var
  2852. aVars : TJSVariableStatement;
  2853. aVarDecl : TJSVarDeclaration;
  2854. aClass : TJSClassDeclaration;
  2855. begin
  2856. CreateParser('let a = class Rectangle { } ',MinClassVersion);
  2857. AssertEquals('class name correct',TJSVariableStatement, GetFirstStatement.ClassType);
  2858. aVars:=TJSVariableStatement(GetFirstStatement);
  2859. AssertEquals('First class node is var declaration',TJSVarDeclaration,aVars.VarDecl.ClassType);
  2860. aVarDecl:=TJSVarDeclaration(aVars.VarDecl);
  2861. AssertNotNull('Var declaration has init',aVarDecl.Init);
  2862. AssertEquals('Init is class declaration',TJSClassDeclaration,aVarDecl.Init.ClassType);
  2863. aClass:=TJSClassDeclaration(aVarDecl.Init);
  2864. AssertEquals('class name correct','Rectangle',aClass.Name);
  2865. end;
  2866. procedure TTestJSParser.TestExportExportNameFrom;
  2867. Var
  2868. E : TJSElement;
  2869. Exp : TJSExportStatement absolute E;
  2870. El : TJSExportNameElement;
  2871. begin
  2872. CreateParser('export { a } from "a.js"',MinExportVersion);
  2873. E:=GetFirstStatement;
  2874. CheckClass(E,TJSExportStatement);
  2875. AssertEquals('NameSpaceExport','',Exp.NameSpaceExport);
  2876. AssertNull('Declaration',Exp.Declaration);
  2877. AssertEquals('ModuleName','a.js',Exp.ModuleName);
  2878. AssertTrue('ExportNames',Exp.HaveExportNames);
  2879. AssertEquals('ExportNames count',1,Exp.ExportNames.Count);
  2880. El:=Exp.ExportNames[0];
  2881. AssertEquals('ExportNames[0].Name','a',El.Name);
  2882. AssertEquals('ExportNames[0].Name','',El.Alias);
  2883. end;
  2884. procedure TTestJSParser.TestBreak;
  2885. Var
  2886. E : TJSElement;
  2887. C : TJSBreakStatement;
  2888. begin
  2889. CreateParser('while (true) break;');
  2890. E:=GetFirstStatement;
  2891. CheckClass(E,TJSWhileStatement);
  2892. E:=TJSWhileStatement(E).Body;
  2893. CheckClass(E,TJSBreakStatement);
  2894. C:=TJSBreakStatement(E);
  2895. AssertEquals('Have correct (empty) label','',C.TargetName);
  2896. end;
  2897. procedure TTestJSParser.TestIfElseSimple;
  2898. Var
  2899. E : TJSElement;
  2900. I : TJSIfStatement;
  2901. begin
  2902. CreateParser('if (a) b; else c;');
  2903. E:=GetFirstStatement;
  2904. CheckClass(E,TJSIfStatement);
  2905. I:=TJSIfStatement(E);
  2906. AssertNotNull('Statement condition assigned',I.Cond);
  2907. CheckClass(I.Cond,TJSPrimaryExpressionIdent);
  2908. AssertEquals('Name 1','a',TJSPrimaryExpressionIdent(I.Cond).Name);
  2909. AssertNotNull('Statement condition assigned',I.Btrue);
  2910. CheckClass(I.Btrue,TJSExpressionStatement);
  2911. AssertNotNull('Expression statement expression',TJSExpressionStatement(I.BTrue).A);
  2912. CheckClass(TJSExpressionStatement(I.BTrue).A,TJSPrimaryExpressionIdent);
  2913. AssertEquals('Name 1','b',TJSPrimaryExpressionIdent(TJSExpressionStatement(I.Btrue).A).Name);
  2914. AssertNotNull('Else Statement condition assigned',I.BFalse);
  2915. CheckClass(I.BFalse,TJSExpressionStatement);
  2916. AssertNotNull('Else statement expression',TJSExpressionStatement(I.BFalse).A);
  2917. CheckClass(TJSExpressionStatement(I.BFalse).A,TJSPrimaryExpressionIdent);
  2918. AssertEquals('Name 1','c',TJSPrimaryExpressionIdent(TJSExpressionStatement(I.BFalse).A).Name);
  2919. end;
  2920. procedure TTestJSParser.TestExpressionPrecedenceMulNot;
  2921. Var
  2922. X : TJSExpressionStatement;
  2923. R : TJSUnaryNotExpression;
  2924. E : TJSMultiplicativeExpressionMul;
  2925. begin
  2926. CreateParser('4 * !2;');
  2927. X:=GetExpressionStatement;
  2928. AssertNotNull('Expression statement assigned',X.A);
  2929. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  2930. E:=TJSMultiplicativeExpressionMul(X.A);
  2931. AssertNotNull('Expression left operand assigned',E.A);
  2932. AssertNotNull('Expression right operand assigned',E.B);
  2933. CheckClass(E.B,TJSUnaryNotExpression);
  2934. R:=TJSUnaryNotExpression(E.B);
  2935. CheckClass(E.A,TJSLiteral);
  2936. AssertNotNull('Multiplication left operand assigned',R.A);
  2937. CheckClass(R.A,TJSLiteral);
  2938. AssertEquals('Not operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  2939. AssertEquals('Not operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  2940. AssertNotNull('Multiplication left operand value assigned',TJSLiteral(E.A).Value);
  2941. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  2942. AssertEquals('Multiplication left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  2943. end;
  2944. procedure TTestJSParser.TestExpressionPrecedencePlusPreMinusMinus;
  2945. Var
  2946. X : TJSExpressionStatement;
  2947. R : TJSUnaryPreMinusMinusExpression;
  2948. E : TJSAdditiveExpressionPlus;
  2949. begin
  2950. CreateParser('4 + --2;');
  2951. X:=GetExpressionStatement;
  2952. AssertNotNull('Expression statement assigned',X.A);
  2953. CheckClass(X.A,TJSAdditiveExpressionPlus);
  2954. E:=TJSAdditiveExpressionPlus(X.A);
  2955. AssertNotNull('Expression left operand assigned',E.A);
  2956. AssertNotNull('Expression right operand assigned',E.B);
  2957. CheckClass(E.B,TJSUnaryPreMinusMinusExpression);
  2958. R:=TJSUnaryPreMinusMinusExpression(E.B);
  2959. CheckClass(E.A,TJSLiteral);
  2960. AssertNotNull('Multiplication left operand assigned',R.A);
  2961. CheckClass(R.A,TJSLiteral);
  2962. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  2963. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  2964. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.A).Value);
  2965. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  2966. AssertEquals('Expression right operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  2967. end;
  2968. procedure TTestJSParser.TestExpressionPrecedenceMulPrePlusPlus;
  2969. Var
  2970. X : TJSExpressionStatement;
  2971. R : TJSUnaryPrePlusPlusExpression;
  2972. E : TJSMultiplicativeExpressionMul;
  2973. begin
  2974. CreateParser('4 * ++2;');
  2975. X:=GetExpressionStatement;
  2976. AssertNotNull('Expression statement assigned',X.A);
  2977. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  2978. E:=TJSMultiplicativeExpressionMul(X.A);
  2979. AssertNotNull('Expression left operand assigned',E.A);
  2980. AssertNotNull('Expression right operand assigned',E.B);
  2981. CheckClass(E.B,TJSUnaryPrePlusPlusExpression);
  2982. R:=TJSUnaryPrePlusPlusExpression(E.B);
  2983. CheckClass(E.A,TJSLiteral);
  2984. AssertNotNull('Multiplication left operand assigned',R.A);
  2985. CheckClass(R.A,TJSLiteral);
  2986. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  2987. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  2988. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.A).Value);
  2989. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  2990. AssertEquals('Expression right operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  2991. end;
  2992. procedure TTestJSParser.TestExpressionPrecedenceMulPreMinusMinus;
  2993. Var
  2994. X : TJSExpressionStatement;
  2995. R : TJSUnaryPreMinusMinusExpression;
  2996. E : TJSMultiplicativeExpressionMul;
  2997. begin
  2998. CreateParser('4 * --2;');
  2999. X:=GetExpressionStatement;
  3000. AssertNotNull('Expression statement assigned',X.A);
  3001. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  3002. E:=TJSMultiplicativeExpressionMul(X.A);
  3003. AssertNotNull('Expression left operand assigned',E.A);
  3004. AssertNotNull('Expression right operand assigned',E.B);
  3005. CheckClass(E.B,TJSUnaryPreMinusMinusExpression);
  3006. R:=TJSUnaryPreMinusMinusExpression(E.B);
  3007. CheckClass(E.A,TJSLiteral);
  3008. AssertNotNull('Multiplication left operand assigned',R.A);
  3009. CheckClass(R.A,TJSLiteral);
  3010. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  3011. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  3012. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.A).Value);
  3013. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  3014. AssertEquals('Expression right operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  3015. end;
  3016. procedure TTestJSParser.TestSimpleExpressionBooleanLiteralTrue;
  3017. Var
  3018. X : TJSExpressionStatement;
  3019. begin
  3020. CreateParser('true;');
  3021. X:=GetExpressionStatement;
  3022. AssertNotNull('Expression statement assigned',X.A);
  3023. CheckClass(X.A,TJSLiteral);
  3024. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  3025. AssertEquals('Expression value type correct', jstBoolean,TJSLiteral(X.A).Value.ValueType);
  3026. AssertEquals('Expression value correct', True, TJSLiteral(X.A).Value.AsBoolean);
  3027. end;
  3028. procedure TTestJSParser.TestEmpty;
  3029. Var
  3030. E : TJSElement;
  3031. FB : TJSFunctionBody;
  3032. SE : TJSSourceElements;
  3033. begin
  3034. CreateParser('var a;');
  3035. E:=FParser.Parse;
  3036. try
  3037. CheckClass(E,TJSFunctionBody);
  3038. FB:=TJSFunctionBody(E);
  3039. AssertNotNull(FB.A);
  3040. CheckClass(FB.A,TJSSourceElements);
  3041. SE:=TJSSourceElements(FB.A);
  3042. AssertEquals('1 variable declaration ',1,SE.Vars.Count);
  3043. CheckClass(FB.A,TJSSourceElements);
  3044. finally
  3045. E.Free;
  3046. end;
  3047. end;
  3048. initialization
  3049. RegisterTest(TTestJSParser);
  3050. end.