tcparser.pp 97 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668
  1. unit tcparser;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, jsParser, jstree, jsbase;
  6. type
  7. { TTestJSParser }
  8. TTestJSParser= class(TTestCase)
  9. Private
  10. FSource : TStringStream;
  11. FParser : TJSParser;
  12. FSE : TJSSourceElements;
  13. FToFree: TJSElement;
  14. protected
  15. procedure SetUp; override;
  16. procedure TearDown; override;
  17. Procedure CreateParser(Const ASource : string; aVersion : TECMAVersion = TECMAVersion.ecma5);
  18. Procedure CheckClass(E : TJSElement; C : TJSElementClass);
  19. Procedure AssertEquals(Const AMessage : String; Expected, Actual : TJSType); overload;
  20. Procedure AssertEquals(Const AMessage : String; Expected, Actual : TJSVarType); overload;
  21. Procedure AssertIdentifier(Msg : String; El : TJSElement; Const AName : TJSString);
  22. Function GetSourceElements : TJSSourceElements;
  23. Function GetVars : TJSElementNodes;
  24. Function GetStatements : TJSElementNodes;
  25. Function GetFunctions : TJSElementNodes;
  26. Function GetFirstStatement : TJSElement;
  27. Function GetFirstVar : TJSElement;
  28. Function GetExpressionStatement : TJSExpressionStatement;
  29. published
  30. procedure TestEmpty;
  31. procedure TestSimple;
  32. procedure TestSimpleExpressionNumericalLiteral;
  33. procedure TestSimpleExpressionStringLiteral;
  34. procedure TestSimpleExpressionBooleanLiteralFalse;
  35. procedure TestSimpleExpressionBooleanLiteralTrue;
  36. procedure TestSimpleExpressionIdentifier;
  37. procedure TestSimpleExpressionNull;
  38. procedure TestAssignExpressionNumerical;
  39. procedure TestAssignExpressionNull;
  40. procedure TestAssignExpressionString;
  41. procedure TestAssignExpressionBooleanFalse;
  42. procedure TestAssignExpressionBooleanTrue;
  43. procedure TestAssignExpressionIdent;
  44. procedure TestAssignExpressionPlus;
  45. procedure TestAssignExpressionMinus;
  46. procedure TestAssignExpressionDiv;
  47. procedure TestAssignExpressionMul;
  48. procedure TestAssignExpressionMod;
  49. procedure TestAssignExpressionAnd;
  50. procedure TestAssignExpressionOr;
  51. procedure TestAssignExpressionXOr;
  52. procedure TestAssignExpressionLShift;
  53. procedure TestAssignExpressionRShift;
  54. procedure TestAssignExpressionURShift;
  55. procedure TestExpressionPlus;
  56. procedure TestExpressionSub;
  57. procedure TestExpressionMul;
  58. procedure TestExpressionDiv;
  59. procedure TestExpressionMod;
  60. procedure TestExpressionLShift;
  61. procedure TestExpressionRShift;
  62. procedure TestExpressionURShift;
  63. procedure TestExpressionPostPlusPlus;
  64. procedure TestExpressionPostMinusMinus;
  65. procedure TestExpressionPreMinusMinus;
  66. procedure TestExpressionPrePlusPlus;
  67. procedure TestExpressionPrecedenceMulPlus;
  68. procedure TestExpressionPrecedencePlusMul;
  69. procedure TestExpressionPrecedenceMulMinus;
  70. procedure TestExpressionPrecedenceMinusMul;
  71. procedure TestExpressionPrecedenceDivPlus;
  72. procedure TestExpressionPrecedencePlusDiv;
  73. procedure TestExpressionPrecedenceModPlus;
  74. procedure TestExpressionPrecedencePlusMod;
  75. procedure TestExpressionPrecedencePlusPostPlusPlus;
  76. procedure TestExpressionPrecedencePlusPostMinusMinus;
  77. procedure TestExpressionPrecedenceMulPostMinusMinus;
  78. procedure TestExpressionPrecedenceMulPostPlusPlus;
  79. procedure TestExpressionPrecedenceMulPreMinusMinus;
  80. procedure TestExpressionPrecedenceMulPrePlusPlus;
  81. procedure TestExpressionPrecedencePlusPreMinusMinus;
  82. procedure TestExpressionPrecedencePlusPrePlusPlus;
  83. procedure TestExpressionPrecedencePlusInv;
  84. procedure TestExpressionPrecedenceMulInv;
  85. procedure TestExpressionPrecedenceMulNot;
  86. procedure TestExpressionPrecedencePlusNot;
  87. procedure TestExpressionPrecedenceBraceMulPlus;
  88. procedure TestExpressionPrecedenceBracePlusMul;
  89. procedure TestExpressionFunction;
  90. procedure TestFunctionCallNoArgs;
  91. procedure TestFunctionCallOneArg;
  92. procedure TestFunctionCallTwoArgs;
  93. procedure TestArrayExpressionNumericalArgs;
  94. procedure TestArrayExpressionStringArgs;
  95. procedure TestArrayExpressionIdentArgs;
  96. Procedure TestVarDeclarationSimple;
  97. Procedure TestLetDeclarationSimple;
  98. procedure TestVarDeclarationDouble;
  99. procedure TestVarDeclarationSimpleInit;
  100. procedure TestConstDeclarationSimpleInit;
  101. procedure TestVarDeclarationDoubleInit;
  102. procedure TestDebuggerStatement;
  103. procedure TestBlockEmpty;
  104. procedure TestBlockEmptyStatement;
  105. procedure TestBlockSimpleStatement;
  106. procedure TestFunctionDeclarationEmpty;
  107. procedure TestFunctionDeclarationAsync;
  108. procedure TestFunctionDeclarationWithArgs;
  109. procedure TestFunctionDeclarationWithBody;
  110. procedure TestIfSimple;
  111. procedure TestIfElseSimple;
  112. procedure TestIfEmptyBlock;
  113. procedure TestIfEmptyBlockElse;
  114. procedure TestWhileSimple;
  115. procedure TestWhileBlock;
  116. procedure TestDoWhileSimple;
  117. procedure TestDoWhileBlock;
  118. procedure TestForEmpty;
  119. procedure TestForEmptyBody;
  120. procedure TestForSimpleBody;
  121. procedure TestTryCatch;
  122. procedure TestTryCatchFinally;
  123. procedure TestTryFinally;
  124. procedure TestThrow;
  125. procedure TestReturn;
  126. procedure TestAssignment;
  127. procedure TestNew;
  128. procedure TestLabeledStatement;
  129. procedure TestContinue;
  130. procedure TestContinueTarget;
  131. procedure TestBreak;
  132. procedure TestBreakTarget;
  133. procedure TestSwitchEmpty;
  134. procedure TestSwitchOne;
  135. procedure TestSwitchTwo;
  136. procedure TestSwitchTwoDefault;
  137. end;
  138. implementation
  139. uses typinfo;
  140. Procedure TTestJSParser.AssertEquals(Const AMessage: String; Expected,
  141. Actual: TJSType);
  142. Var
  143. NE,NA : String;
  144. begin
  145. NE:=GetEnumName(TypeInfo(TJSType),Ord(Expected));
  146. NA:=GetEnumName(TypeInfo(TJSType),Ord(Actual));
  147. AssertEquals(AMessage,NE,NA);
  148. end;
  149. procedure TTestJSParser.AssertEquals(const AMessage: String; Expected, Actual: TJSVarType);
  150. Var
  151. NE,NA : String;
  152. begin
  153. NE:=GetEnumName(TypeInfo(TJSVarType),Ord(Expected));
  154. NA:=GetEnumName(TypeInfo(TJSVarType),Ord(Actual));
  155. AssertEquals(AMessage,NE,NA);
  156. end;
  157. Procedure TTestJSParser.AssertIdentifier(Msg: String; El: TJSElement;
  158. Const AName: TJSString);
  159. Var
  160. L : TJSPrimaryExpressionIdent;
  161. S1,S2 : String;
  162. begin
  163. AssertNotNull(Msg+' have TJSPrimaryExpressionIdent element',El);
  164. CheckClass(El,TJSPrimaryExpressionIdent);
  165. L:=TJSPrimaryExpressionIdent(el);
  166. S1:=L.Name;
  167. S2:=Aname;
  168. AssertEquals(Msg+'Identifier has correct name',S2,S1);
  169. end;
  170. Function TTestJSParser.GetFirstStatement: TJSElement;
  171. Var
  172. E : TJSElementNodes;
  173. begin
  174. E:=GetStatements;
  175. AssertNotNull('Have statements',E);
  176. AssertEquals('1 statement',1,E.Count);
  177. Result:=E.Nodes[0].Node;
  178. AssertNotNull('First statement assigned',Result);
  179. end;
  180. Function TTestJSParser.GetFirstVar: TJSElement;
  181. Var
  182. E : TJSElementNodes;
  183. begin
  184. E:=GetVars;
  185. AssertNotNull('Have statements',E);
  186. Writeln('Count : ',E.Count);
  187. If (E.Count=0) then
  188. Fail('Zero variables defined');
  189. Result:=E.Nodes[0].Node;
  190. AssertNotNull('First variable declaration',Result);
  191. end;
  192. Function TTestJSParser.GetExpressionStatement: TJSExpressionStatement;
  193. Var
  194. N : TJSElement;
  195. begin
  196. N:=GetFirstStatement;
  197. CheckClass(N,TJSExpressionStatement);
  198. Result:=TJSExpressionStatement(N);
  199. end;
  200. procedure TTestJSParser.TestSimple;
  201. Var
  202. E : TJSElementNodes;
  203. N : TJSElement;
  204. X : TJSExpressionStatement;
  205. begin
  206. CreateParser('1;');
  207. E:=GetStatements;
  208. AssertNotNull('Have statements',E);
  209. AssertEquals('1 statement',1,E.Count);
  210. N:=E.Nodes[0].Node;
  211. AssertNotNull('First statement assigned',N);
  212. AssertNotNull('First statement assigned',N);
  213. CheckClass(N,TJSExpressionStatement);
  214. X:=TJSExpressionStatement(N);
  215. AssertNotNull('Expression statement assigned',X.A);
  216. CheckClass(X.A,TJSLiteral);
  217. end;
  218. procedure TTestJSParser.TestSimpleExpressionNumericalLiteral;
  219. Var
  220. X : TJSExpressionStatement;
  221. begin
  222. CreateParser('1;');
  223. X:=GetExpressionStatement;
  224. AssertNotNull('Expression statement assigned',X.A);
  225. CheckClass(X.A,TJSLiteral);
  226. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  227. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(X.A).Value.ValueType);
  228. AssertEquals('Expression value correct', 1.0,TJSLiteral(X.A).Value.AsNumber);
  229. end;
  230. procedure TTestJSParser.TestSimpleExpressionStringLiteral;
  231. Var
  232. X : TJSExpressionStatement;
  233. begin
  234. CreateParser('"string";');
  235. X:=GetExpressionStatement;
  236. AssertNotNull('Expression statement assigned',X.A);
  237. CheckClass(X.A,TJSLiteral);
  238. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  239. AssertEquals('Expression value type correct', jstString,TJSLiteral(X.A).Value.ValueType);
  240. AssertEquals('Expression value correct', 'string',TJSLiteral(X.A).Value.AsString);
  241. end;
  242. procedure TTestJSParser.TestSimpleExpressionBooleanLiteralFalse;
  243. Var
  244. X : TJSExpressionStatement;
  245. begin
  246. CreateParser('false;');
  247. X:=GetExpressionStatement;
  248. AssertNotNull('Expression statement assigned',X.A);
  249. CheckClass(X.A,TJSLiteral);
  250. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  251. AssertEquals('Expression value type correct', jstBoolean,TJSLiteral(X.A).Value.ValueType);
  252. AssertEquals('Expression value correct', False, TJSLiteral(X.A).Value.AsBoolean);
  253. end;
  254. procedure TTestJSParser.TestSimpleExpressionIdentifier;
  255. Var
  256. X : TJSExpressionStatement;
  257. begin
  258. CreateParser('Something;');
  259. X:=GetExpressionStatement;
  260. AssertNotNull('Expression statement assigned',X.A);
  261. CheckClass(X.A,TJSPrimaryExpressionIdent);
  262. AssertEquals('Expression value assigned','Something',TJSPrimaryExpressionIdent(X.A).Name);
  263. end;
  264. procedure TTestJSParser.TestSimpleExpressionNull;
  265. Var
  266. X : TJSExpressionStatement;
  267. begin
  268. CreateParser('null;');
  269. X:=GetExpressionStatement;
  270. AssertNotNull('Expression statement assigned',X.A);
  271. CheckClass(X.A,TJSLiteral);
  272. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  273. AssertEquals('Expression value type correct', jstNull,TJSLiteral(X.A).Value.ValueType);
  274. AssertEquals('Expression value correct', True, TJSLiteral(X.A).Value.IsNull);
  275. end;
  276. procedure TTestJSParser.TestAssignExpressionNumerical;
  277. Var
  278. X : TJSExpressionStatement;
  279. SA : TJSSimpleAssignStatement;
  280. begin
  281. CreateParser('a=1;');
  282. X:=GetExpressionStatement;
  283. AssertNotNull('Expression statement assigned',X.A);
  284. CheckClass(X.A,TJSSimpleAssignStatement);
  285. SA:=TJSSimpleAssignStatement(X.A);
  286. AssertNotNull('Assignment LHS assigned',SA.LHS);
  287. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  288. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  289. AssertNotNull('Assignment Expression assigned',SA.Expr);
  290. CheckClass(SA.EXPR,TJSLiteral);
  291. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  292. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  293. end;
  294. procedure TTestJSParser.TestAssignExpressionString;
  295. Var
  296. X : TJSExpressionStatement;
  297. SA : TJSSimpleAssignStatement;
  298. begin
  299. CreateParser('a="string";');
  300. X:=GetExpressionStatement;
  301. AssertNotNull('Expression statement assigned',X.A);
  302. CheckClass(X.A,TJSSimpleAssignStatement);
  303. SA:=TJSSimpleAssignStatement(X.A);
  304. AssertNotNull('Assignment LHS assigned',SA.LHS);
  305. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  306. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  307. AssertNotNull('Assignment Expression assigned',SA.Expr);
  308. CheckClass(SA.EXPR,TJSLiteral);
  309. AssertEquals('Expression value type correct', jstString,TJSLiteral(SA.Expr).Value.ValueType);
  310. AssertEquals('Expression value correct', 'string', TJSLiteral(SA.Expr).Value.AsString);
  311. end;
  312. procedure TTestJSParser.TestAssignExpressionBooleanFalse;
  313. Var
  314. X : TJSExpressionStatement;
  315. SA : TJSSimpleAssignStatement;
  316. begin
  317. CreateParser('a=false;');
  318. X:=GetExpressionStatement;
  319. AssertNotNull('Expression statement assigned',X.A);
  320. CheckClass(X.A,TJSSimpleAssignStatement);
  321. SA:=TJSSimpleAssignStatement(X.A);
  322. AssertNotNull('Assignment LHS assigned',SA.LHS);
  323. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  324. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  325. AssertNotNull('Assignment Expression assigned',SA.Expr);
  326. CheckClass(SA.EXPR,TJSLiteral);
  327. AssertEquals('Expression value type correct', jstBoolean,TJSLiteral(SA.Expr).Value.ValueType);
  328. AssertEquals('Expression value correct', False, TJSLiteral(SA.Expr).Value.AsBoolean);
  329. end;
  330. procedure TTestJSParser.TestAssignExpressionBooleanTrue;
  331. Var
  332. X : TJSExpressionStatement;
  333. SA : TJSSimpleAssignStatement;
  334. begin
  335. CreateParser('a=true;');
  336. X:=GetExpressionStatement;
  337. AssertNotNull('Expression statement assigned',X.A);
  338. CheckClass(X.A,TJSSimpleAssignStatement);
  339. SA:=TJSSimpleAssignStatement(X.A);
  340. AssertNotNull('Assignment LHS assigned',SA.LHS);
  341. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  342. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  343. AssertNotNull('Assignment Expression assigned',SA.Expr);
  344. CheckClass(SA.EXPR,TJSLiteral);
  345. AssertEquals('Expression value type correct', jstBoolean,TJSLiteral(SA.Expr).Value.ValueType);
  346. AssertEquals('Expression value correct', True, TJSLiteral(SA.Expr).Value.AsBoolean);
  347. end;
  348. procedure TTestJSParser.TestAssignExpressionNull;
  349. Var
  350. X : TJSExpressionStatement;
  351. SA : TJSSimpleAssignStatement;
  352. begin
  353. CreateParser('a=null;');
  354. X:=GetExpressionStatement;
  355. AssertNotNull('Expression statement assigned',X.A);
  356. CheckClass(X.A,TJSSimpleAssignStatement);
  357. SA:=TJSSimpleAssignStatement(X.A);
  358. AssertNotNull('Assignment LHS assigned',SA.LHS);
  359. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  360. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  361. AssertNotNull('Assignment Expression assigned',SA.Expr);
  362. CheckClass(SA.EXPR,TJSLiteral);
  363. AssertEquals('Expression value type correct', jstNull,TJSLiteral(SA.Expr).Value.ValueType);
  364. AssertEquals('Expression value correct', True, TJSLiteral(SA.Expr).Value.IsNull);
  365. end;
  366. procedure TTestJSParser.TestAssignExpressionIdent;
  367. Var
  368. X : TJSExpressionStatement;
  369. SA : TJSSimpleAssignStatement;
  370. begin
  371. CreateParser('a=b;');
  372. X:=GetExpressionStatement;
  373. AssertNotNull('Expression statement assigned',X.A);
  374. CheckClass(X.A,TJSSimpleAssignStatement);
  375. SA:=TJSSimpleAssignStatement(X.A);
  376. AssertNotNull('Assignment LHS assigned',SA.LHS);
  377. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  378. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  379. AssertNotNull('Assignment Expression assigned',SA.Expr);
  380. CheckClass(SA.EXPR,TJSPrimaryExpressionIdent);
  381. AssertEquals('Expression value type correct', 'b',TJSPrimaryExpressionIdent(SA.Expr).Name);
  382. end;
  383. procedure TTestJSParser.TestAssignExpressionPlus;
  384. Var
  385. X : TJSExpressionStatement;
  386. SA : TJSAddEqAssignStatement;
  387. begin
  388. CreateParser('a+=1;');
  389. X:=GetExpressionStatement;
  390. AssertNotNull('Expression statement assigned',X.A);
  391. CheckClass(X.A,TJSAddEqAssignStatement);
  392. SA:=TJSAddEqAssignStatement(X.A);
  393. AssertNotNull('Assignment LHS assigned',SA.LHS);
  394. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  395. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  396. AssertNotNull('Assignment Expression assigned',SA.Expr);
  397. CheckClass(SA.EXPR,TJSLiteral);
  398. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  399. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  400. end;
  401. procedure TTestJSParser.TestAssignExpressionMinus;
  402. Var
  403. X : TJSExpressionStatement;
  404. SA : TJSSubEqAssignStatement;
  405. begin
  406. CreateParser('a-=1;');
  407. X:=GetExpressionStatement;
  408. AssertNotNull('Expression statement assigned',X.A);
  409. CheckClass(X.A,TJSSubEqAssignStatement);
  410. SA:=TJSSubEqAssignStatement(X.A);
  411. AssertNotNull('Assignment LHS assigned',SA.LHS);
  412. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  413. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  414. AssertNotNull('Assignment Expression assigned',SA.Expr);
  415. CheckClass(SA.EXPR,TJSLiteral);
  416. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  417. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  418. end;
  419. procedure TTestJSParser.TestAssignExpressionMul;
  420. Var
  421. X : TJSExpressionStatement;
  422. SA : TJSMulEqAssignStatement;
  423. begin
  424. CreateParser('a*=1;');
  425. X:=GetExpressionStatement;
  426. AssertNotNull('Expression statement assigned',X.A);
  427. CheckClass(X.A,TJSMulEqAssignStatement);
  428. SA:=TJSMulEqAssignStatement(X.A);
  429. AssertNotNull('Assignment LHS assigned',SA.LHS);
  430. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  431. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  432. AssertNotNull('Assignment Expression assigned',SA.Expr);
  433. CheckClass(SA.EXPR,TJSLiteral);
  434. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  435. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  436. end;
  437. procedure TTestJSParser.TestAssignExpressionDiv;
  438. Var
  439. X : TJSExpressionStatement;
  440. SA : TJSDivEqAssignStatement;
  441. begin
  442. CreateParser('a/=1;');
  443. X:=GetExpressionStatement;
  444. AssertNotNull('Expression statement assigned',X.A);
  445. CheckClass(X.A,TJSDivEqAssignStatement);
  446. SA:=TJSDivEqAssignStatement(X.A);
  447. AssertNotNull('Assignment LHS assigned',SA.LHS);
  448. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  449. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  450. AssertNotNull('Assignment Expression assigned',SA.Expr);
  451. CheckClass(SA.EXPR,TJSLiteral);
  452. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  453. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  454. end;
  455. procedure TTestJSParser.TestAssignExpressionMod;
  456. Var
  457. X : TJSExpressionStatement;
  458. SA : TJSModEqAssignStatement;
  459. begin
  460. CreateParser('a%=1;');
  461. X:=GetExpressionStatement;
  462. AssertNotNull('Expression statement assigned',X.A);
  463. CheckClass(X.A,TJSModEqAssignStatement);
  464. SA:=TJSModEqAssignStatement(X.A);
  465. AssertNotNull('Assignment LHS assigned',SA.LHS);
  466. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  467. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  468. AssertNotNull('Assignment Expression assigned',SA.Expr);
  469. CheckClass(SA.EXPR,TJSLiteral);
  470. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  471. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  472. end;
  473. procedure TTestJSParser.TestAssignExpressionAnd;
  474. Var
  475. X : TJSExpressionStatement;
  476. SA : TJSAndEqAssignStatement;
  477. begin
  478. CreateParser('a&=1;');
  479. X:=GetExpressionStatement;
  480. AssertNotNull('Expression statement assigned',X.A);
  481. CheckClass(X.A,TJSAndEqAssignStatement);
  482. SA:=TJSAndEqAssignStatement(X.A);
  483. AssertNotNull('Assignment LHS assigned',SA.LHS);
  484. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  485. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  486. AssertNotNull('Assignment Expression assigned',SA.Expr);
  487. CheckClass(SA.EXPR,TJSLiteral);
  488. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  489. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  490. end;
  491. procedure TTestJSParser.TestAssignExpressionOr;
  492. Var
  493. X : TJSExpressionStatement;
  494. SA : TJSOrEqAssignStatement;
  495. begin
  496. CreateParser('a|=1;');
  497. X:=GetExpressionStatement;
  498. AssertNotNull('Expression statement assigned',X.A);
  499. CheckClass(X.A,TJSOrEqAssignStatement);
  500. SA:=TJSOrEqAssignStatement(X.A);
  501. AssertNotNull('Assignment LHS assigned',SA.LHS);
  502. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  503. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  504. AssertNotNull('Assignment Expression assigned',SA.Expr);
  505. CheckClass(SA.EXPR,TJSLiteral);
  506. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  507. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  508. end;
  509. procedure TTestJSParser.TestAssignExpressionXOr;
  510. Var
  511. X : TJSExpressionStatement;
  512. SA : TJSXOrEqAssignStatement;
  513. begin
  514. CreateParser('a^=1;');
  515. X:=GetExpressionStatement;
  516. AssertNotNull('Expression statement assigned',X.A);
  517. CheckClass(X.A,TJSXOrEqAssignStatement);
  518. SA:=TJSXOrEqAssignStatement(X.A);
  519. AssertNotNull('Assignment LHS assigned',SA.LHS);
  520. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  521. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  522. AssertNotNull('Assignment Expression assigned',SA.Expr);
  523. CheckClass(SA.EXPR,TJSLiteral);
  524. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  525. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  526. end;
  527. procedure TTestJSParser.TestAssignExpressionLShift;
  528. Var
  529. X : TJSExpressionStatement;
  530. SA : TJSLShiftEqAssignStatement;
  531. begin
  532. CreateParser('a<<=1;');
  533. X:=GetExpressionStatement;
  534. AssertNotNull('Expression statement assigned',X.A);
  535. CheckClass(X.A,TJSLShiftEqAssignStatement);
  536. SA:=TJSLShiftEqAssignStatement(X.A);
  537. AssertNotNull('Assignment LHS assigned',SA.LHS);
  538. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  539. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  540. AssertNotNull('Assignment Expression assigned',SA.Expr);
  541. CheckClass(SA.EXPR,TJSLiteral);
  542. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  543. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  544. end;
  545. procedure TTestJSParser.TestAssignExpressionRShift;
  546. Var
  547. X : TJSExpressionStatement;
  548. SA : TJSRShiftEqAssignStatement;
  549. begin
  550. CreateParser('a>>=1;');
  551. X:=GetExpressionStatement;
  552. AssertNotNull('Expression statement assigned',X.A);
  553. CheckClass(X.A,TJSRShiftEqAssignStatement);
  554. SA:=TJSRShiftEqAssignStatement(X.A);
  555. AssertNotNull('Assignment LHS assigned',SA.LHS);
  556. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  557. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  558. AssertNotNull('Assignment Expression assigned',SA.Expr);
  559. CheckClass(SA.EXPR,TJSLiteral);
  560. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  561. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  562. end;
  563. procedure TTestJSParser.TestAssignExpressionURShift;
  564. Var
  565. X : TJSExpressionStatement;
  566. SA : TJSURShiftEqAssignStatement;
  567. begin
  568. CreateParser('a>>>=1;');
  569. X:=GetExpressionStatement;
  570. AssertNotNull('Expression statement assigned',X.A);
  571. CheckClass(X.A,TJSURShiftEqAssignStatement);
  572. SA:=TJSURShiftEqAssignStatement(X.A);
  573. AssertNotNull('Assignment LHS assigned',SA.LHS);
  574. CheckClass(SA.LHS,TJSPrimaryExpressionIdent);
  575. AssertEquals('Expression LHS name correct', 'a',TJSPrimaryExpressionIdent(SA.LHS).Name);
  576. AssertNotNull('Assignment Expression assigned',SA.Expr);
  577. CheckClass(SA.EXPR,TJSLiteral);
  578. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(SA.Expr).Value.ValueType);
  579. AssertEquals('Expression value correct', 1.0, TJSLiteral(SA.Expr).Value.AsNumber);
  580. end;
  581. procedure TTestJSParser.TestExpressionPlus;
  582. Var
  583. X : TJSExpressionStatement;
  584. E : TJSAdditiveExpressionPlus;
  585. begin
  586. CreateParser('1+2;');
  587. X:=GetExpressionStatement;
  588. AssertNotNull('Expression statement assigned',X.A);
  589. CheckClass(X.A,TJSAdditiveExpressionPlus);
  590. E:=TJSAdditiveExpressionPlus(X.A);
  591. AssertNotNull('Expression left operand assigned',E.A);
  592. AssertNotNull('Expression right operand assigned',E.B);
  593. CheckClass(E.A,TJSLiteral);
  594. CheckClass(E.B,TJSLiteral);
  595. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  596. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  597. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  598. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  599. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  600. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  601. end;
  602. procedure TTestJSParser.TestExpressionSub;
  603. Var
  604. X : TJSExpressionStatement;
  605. E : TJSAdditiveExpressionMinus;
  606. begin
  607. CreateParser('1 - 2;');
  608. X:=GetExpressionStatement;
  609. AssertNotNull('Expression statement assigned',X.A);
  610. CheckClass(X.A,TJSAdditiveExpressionMinus);
  611. E:=TJSAdditiveExpressionMinus(X.A);
  612. AssertNotNull('Expression left operand assigned',E.A);
  613. AssertNotNull('Expression right operand assigned',E.B);
  614. CheckClass(E.A,TJSLiteral);
  615. CheckClass(E.B,TJSLiteral);
  616. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  617. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  618. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  619. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  620. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  621. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  622. end;
  623. procedure TTestJSParser.TestExpressionMul;
  624. Var
  625. X : TJSExpressionStatement;
  626. E : TJSMultiplicativeExpressionMul;
  627. begin
  628. CreateParser('1*2;');
  629. X:=GetExpressionStatement;
  630. AssertNotNull('Expression statement assigned',X.A);
  631. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  632. E:=TJSMultiplicativeExpressionMul(X.A);
  633. AssertNotNull('Expression left operand assigned',E.A);
  634. AssertNotNull('Expression right operand assigned',E.B);
  635. CheckClass(E.A,TJSLiteral);
  636. CheckClass(E.B,TJSLiteral);
  637. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  638. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  639. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  640. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  641. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  642. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  643. end;
  644. procedure TTestJSParser.TestExpressionDiv;
  645. Var
  646. X : TJSExpressionStatement;
  647. E : TJSMultiplicativeExpressionDiv;
  648. begin
  649. CreateParser('1/2;');
  650. X:=GetExpressionStatement;
  651. AssertNotNull('Expression statement assigned',X.A);
  652. CheckClass(X.A,TJSMultiplicativeExpressionDiv);
  653. E:=TJSMultiplicativeExpressionDiv(X.A);
  654. AssertNotNull('Expression left operand assigned',E.A);
  655. AssertNotNull('Expression right operand assigned',E.B);
  656. CheckClass(E.A,TJSLiteral);
  657. CheckClass(E.B,TJSLiteral);
  658. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  659. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  660. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  661. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  662. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  663. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  664. end;
  665. procedure TTestJSParser.TestExpressionMod;
  666. Var
  667. X : TJSExpressionStatement;
  668. E : TJSMultiplicativeExpressionMod;
  669. begin
  670. CreateParser('1%2;');
  671. X:=GetExpressionStatement;
  672. AssertNotNull('Expression statement assigned',X.A);
  673. CheckClass(X.A,TJSMultiplicativeExpressionMod);
  674. E:=TJSMultiplicativeExpressionMod(X.A);
  675. AssertNotNull('Expression left operand assigned',E.A);
  676. AssertNotNull('Expression right operand assigned',E.B);
  677. CheckClass(E.A,TJSLiteral);
  678. CheckClass(E.B,TJSLiteral);
  679. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  680. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  681. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  682. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  683. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  684. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  685. end;
  686. procedure TTestJSParser.TestExpressionLShift;
  687. Var
  688. X : TJSExpressionStatement;
  689. E : TJSLShiftExpression;
  690. begin
  691. CreateParser('1 << 2;');
  692. X:=GetExpressionStatement;
  693. AssertNotNull('Expression statement assigned',X.A);
  694. CheckClass(X.A,TJSLShiftExpression);
  695. E:=TJSLShiftExpression(X.A);
  696. AssertNotNull('Expression left operand assigned',E.A);
  697. AssertNotNull('Expression right operand assigned',E.B);
  698. CheckClass(E.A,TJSLiteral);
  699. CheckClass(E.B,TJSLiteral);
  700. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  701. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  702. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  703. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  704. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  705. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  706. end;
  707. procedure TTestJSParser.TestExpressionRShift;
  708. Var
  709. X : TJSExpressionStatement;
  710. E : TJSRShiftExpression;
  711. begin
  712. CreateParser('1 >> 2;');
  713. X:=GetExpressionStatement;
  714. AssertNotNull('Expression statement assigned',X.A);
  715. CheckClass(X.A,TJSRShiftExpression);
  716. E:=TJSRShiftExpression(X.A);
  717. AssertNotNull('Expression left operand assigned',E.A);
  718. AssertNotNull('Expression right operand assigned',E.B);
  719. CheckClass(E.A,TJSLiteral);
  720. CheckClass(E.B,TJSLiteral);
  721. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  722. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  723. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  724. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  725. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  726. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  727. end;
  728. procedure TTestJSParser.TestExpressionURShift;
  729. Var
  730. X : TJSExpressionStatement;
  731. E : TJSURShiftExpression;
  732. begin
  733. CreateParser('1 >>> 2;');
  734. X:=GetExpressionStatement;
  735. AssertNotNull('Expression statement assigned',X.A);
  736. CheckClass(X.A,TJSURShiftExpression);
  737. E:=TJSURShiftExpression(X.A);
  738. AssertNotNull('Expression left operand assigned',E.A);
  739. AssertNotNull('Expression right operand assigned',E.B);
  740. CheckClass(E.A,TJSLiteral);
  741. CheckClass(E.B,TJSLiteral);
  742. AssertNotNull('Expression left operand value assigned',TJSLiteral(E.A).Value);
  743. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  744. AssertEquals('Expression left operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  745. AssertNotNull('Expression right operand value assigned',TJSLiteral(E.B).Value);
  746. AssertEquals('Expression left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  747. AssertEquals('Expression right operand value correct', 2.0,TJSLiteral(E.B).Value.AsNumber);
  748. end;
  749. procedure TTestJSParser.TestExpressionPostPlusPlus;
  750. Var
  751. X : TJSExpressionStatement;
  752. E : TJSUnaryPostPlusPlusExpression;
  753. begin
  754. CreateParser('1++;');
  755. X:=GetExpressionStatement;
  756. AssertNotNull('Expression statement assigned',X.A);
  757. CheckClass(X.A,TJSUnaryPostPlusPlusExpression);
  758. E:=TJSUnaryPostPlusPlusExpression(X.A);
  759. AssertNotNull('Expression left operand assigned',E.A);
  760. CheckClass(E.A,TJSLiteral);
  761. AssertNotNull('Expression operand value assigned',TJSLiteral(E.A).Value);
  762. AssertEquals('Expression operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  763. AssertEquals('Expression operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  764. end;
  765. procedure TTestJSParser.TestExpressionPostMinusMinus;
  766. Var
  767. X : TJSExpressionStatement;
  768. E : TJSUnaryPostMinusMinusExpression;
  769. begin
  770. CreateParser('1--;');
  771. X:=GetExpressionStatement;
  772. AssertNotNull('Expression statement assigned',X.A);
  773. CheckClass(X.A,TJSUnaryPostMinusMinusExpression);
  774. E:=TJSUnaryPostMinusMinusExpression(X.A);
  775. AssertNotNull('Expression left operand assigned',E.A);
  776. CheckClass(E.A,TJSLiteral);
  777. AssertNotNull('Expression operand value assigned',TJSLiteral(E.A).Value);
  778. AssertEquals('Expression operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  779. AssertEquals('Expression operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  780. end;
  781. procedure TTestJSParser.TestExpressionPrePlusPlus;
  782. Var
  783. X : TJSExpressionStatement;
  784. E : TJSUnaryPrePlusPlusExpression;
  785. begin
  786. CreateParser('++1;');
  787. X:=GetExpressionStatement;
  788. AssertNotNull('Expression statement assigned',X.A);
  789. CheckClass(X.A,TJSUnaryPrePlusPlusExpression);
  790. E:=TJSUnaryPrePlusPlusExpression(X.A);
  791. AssertNotNull('Expression left operand assigned',E.A);
  792. CheckClass(E.A,TJSLiteral);
  793. AssertNotNull('Expression operand value assigned',TJSLiteral(E.A).Value);
  794. AssertEquals('Expression operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  795. AssertEquals('Expression operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  796. end;
  797. procedure TTestJSParser.TestExpressionPreMinusMinus;
  798. Var
  799. X : TJSExpressionStatement;
  800. E : TJSUnaryPreMinusMinusExpression;
  801. begin
  802. CreateParser('--1;');
  803. X:=GetExpressionStatement;
  804. AssertNotNull('Expression statement assigned',X.A);
  805. CheckClass(X.A,TJSUnaryPreMinusMinusExpression);
  806. E:=TJSUnaryPreMinusMinusExpression(X.A);
  807. AssertNotNull('Expression left operand assigned',E.A);
  808. CheckClass(E.A,TJSLiteral);
  809. AssertNotNull('Expression operand value assigned',TJSLiteral(E.A).Value);
  810. AssertEquals('Expression operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  811. AssertEquals('Expression operand value correct', 1.0, TJSLiteral(E.A).Value.AsNumber);
  812. end;
  813. procedure TTestJSParser.TestExpressionPrecedenceMulPlus;
  814. Var
  815. X : TJSExpressionStatement;
  816. E : TJSAdditiveExpressionPlus;
  817. R : TJSMultiplicativeExpressionMul;
  818. begin
  819. CreateParser('2 * 3 + 4;');
  820. X:=GetExpressionStatement;
  821. AssertNotNull('Expression statement assigned',X.A);
  822. CheckClass(X.A,TJSAdditiveExpressionPlus);
  823. E:=TJSAdditiveExpressionPlus(X.A);
  824. AssertNotNull('Expression left operand assigned',E.A);
  825. AssertNotNull('Expression right operand assigned',E.B);
  826. CheckClass(E.A,TJSMultiplicativeExpressionMul);
  827. R:=TJSMultiplicativeExpressionMul(E.A);
  828. CheckClass(E.B,TJSLiteral);
  829. AssertNotNull('Multiplication left operand assigned',R.A);
  830. AssertNotNull('Multiplication right operand assigned',R.B);
  831. CheckClass(R.A,TJSLiteral);
  832. CheckClass(R.B,TJSLiteral);
  833. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  834. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  835. AssertEquals('Multiplication right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  836. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  837. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.B).Value);
  838. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  839. AssertEquals('Expression right operand value correct', 4.0,TJSLiteral(E.B).Value.AsNumber);
  840. end;
  841. procedure TTestJSParser.TestExpressionPrecedenceBraceMulPlus;
  842. Var
  843. X : TJSExpressionStatement;
  844. E : TJSMultiplicativeExpressionMul;
  845. R : TJSAdditiveExpressionPlus;
  846. begin
  847. CreateParser('2 * (3 + 4);');
  848. X:=GetExpressionStatement;
  849. AssertNotNull('Expression statement assigned',X.A);
  850. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  851. E:=TJSMultiplicativeExpressionMul(X.A);
  852. AssertNotNull('Expression left operand assigned',E.A);
  853. AssertNotNull('Expression right operand assigned',E.B);
  854. CheckClass(E.B,TJSAdditiveExpressionPlus);
  855. R:=TJSAdditiveExpressionPlus(E.B);
  856. CheckClass(E.A,TJSLiteral);
  857. AssertNotNull('Multiplication left operand assigned',R.A);
  858. AssertNotNull('Multiplication right operand assigned',R.B);
  859. CheckClass(R.A,TJSLiteral);
  860. CheckClass(R.B,TJSLiteral);
  861. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  862. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(E.A).Value.AsNumber);
  863. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  864. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.A).Value.AsNumber);
  865. AssertNotNull('Addition right operand value assigned',TJSLiteral(R.B).Value);
  866. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  867. AssertEquals('Addition right operand value correct', 4.0,TJSLiteral(R.B).Value.AsNumber);
  868. end;
  869. procedure TTestJSParser.TestExpressionPrecedenceBracePlusMul;
  870. Var
  871. X : TJSExpressionStatement;
  872. E : TJSMultiplicativeExpressionMul;
  873. R : TJSAdditiveExpressionPlus;
  874. begin
  875. CreateParser('(3 + 4)*2;');
  876. X:=GetExpressionStatement;
  877. AssertNotNull('Expression statement assigned',X.A);
  878. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  879. E:=TJSMultiplicativeExpressionMul(X.A);
  880. AssertNotNull('Expression left operand assigned',E.A);
  881. AssertNotNull('Expression right operand assigned',E.B);
  882. CheckClass(E.A,TJSAdditiveExpressionPlus);
  883. R:=TJSAdditiveExpressionPlus(E.A);
  884. CheckClass(E.B,TJSLiteral);
  885. AssertNotNull('Multiplication left operand assigned',R.A);
  886. AssertNotNull('Multiplication right operand assigned',R.B);
  887. CheckClass(R.A,TJSLiteral);
  888. CheckClass(R.B,TJSLiteral);
  889. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  890. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(E.B).Value.AsNumber);
  891. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  892. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.A).Value.AsNumber);
  893. AssertNotNull('Addition right operand value assigned',TJSLiteral(R.B).Value);
  894. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  895. AssertEquals('Addition right operand value correct', 4.0,TJSLiteral(R.B).Value.AsNumber);
  896. end;
  897. procedure TTestJSParser.TestExpressionFunction;
  898. Var
  899. X : TJSExpressionStatement;
  900. A : TJSSimpleAssignStatement;
  901. begin
  902. CreateParser('a = function () {};');
  903. X:=GetExpressionStatement;
  904. CheckClass(X.A,TJSSimpleAssignStatement);
  905. A:=TJSSimpleAssignStatement(X.A);
  906. AssertNotNull('Have left operand',A.LHS);
  907. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  908. AssertEquals('Correct name for assignment LHS ','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  909. end;
  910. procedure TTestJSParser.TestExpressionPrecedencePlusMul;
  911. Var
  912. X : TJSExpressionStatement;
  913. E : TJSAdditiveExpressionPlus;
  914. R : TJSMultiplicativeExpressionMul;
  915. begin
  916. CreateParser('4 + 2 * 3;');
  917. X:=GetExpressionStatement;
  918. AssertNotNull('Expression statement assigned',X.A);
  919. CheckClass(X.A,TJSAdditiveExpressionPlus);
  920. E:=TJSAdditiveExpressionPlus(X.A);
  921. AssertNotNull('Expression left operand assigned',E.A);
  922. AssertNotNull('Expression right operand assigned',E.B);
  923. CheckClass(E.B,TJSMultiplicativeExpressionMul);
  924. R:=TJSMultiplicativeExpressionMul(E.B);
  925. CheckClass(E.A,TJSLiteral);
  926. AssertNotNull('Multiplication left operand assigned',R.A);
  927. AssertNotNull('Multiplication right operand assigned',R.B);
  928. CheckClass(R.A,TJSLiteral);
  929. CheckClass(R.B,TJSLiteral);
  930. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  931. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  932. AssertEquals('Multiplication right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  933. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  934. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  935. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  936. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  937. end;
  938. procedure TTestJSParser.TestExpressionPrecedenceMulMinus;
  939. Var
  940. X : TJSExpressionStatement;
  941. E : TJSAdditiveExpressionMinus;
  942. R : TJSMultiplicativeExpressionMul;
  943. begin
  944. CreateParser('2 * 3 - 4;');
  945. X:=GetExpressionStatement;
  946. AssertNotNull('Expression statement assigned',X.A);
  947. CheckClass(X.A,TJSAdditiveExpressionMinus);
  948. E:=TJSAdditiveExpressionMinus(X.A);
  949. AssertNotNull('Expression left operand assigned',E.A);
  950. AssertNotNull('Expression right operand assigned',E.B);
  951. CheckClass(E.A,TJSMultiplicativeExpressionMul);
  952. R:=TJSMultiplicativeExpressionMul(E.A);
  953. CheckClass(E.B,TJSLiteral);
  954. AssertNotNull('Multiplication left operand assigned',R.A);
  955. AssertNotNull('Multiplication right operand assigned',R.B);
  956. CheckClass(R.A,TJSLiteral);
  957. CheckClass(R.B,TJSLiteral);
  958. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  959. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  960. AssertEquals('Multiplication right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  961. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  962. AssertNotNull('subtraction right operand value assigned',TJSLiteral(E.B).Value);
  963. AssertEquals('subtraction right operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  964. AssertEquals('subtraction right operand value correct', 4.0,TJSLiteral(E.B).Value.AsNumber);
  965. end;
  966. procedure TTestJSParser.TestExpressionPrecedenceMinusMul;
  967. Var
  968. X : TJSExpressionStatement;
  969. E : TJSAdditiveExpressionMinus;
  970. R : TJSMultiplicativeExpressionMul;
  971. begin
  972. CreateParser('4 - 2 * 3;');
  973. X:=GetExpressionStatement;
  974. AssertNotNull('Expression statement assigned',X.A);
  975. CheckClass(X.A,TJSAdditiveExpressionMinus);
  976. E:=TJSAdditiveExpressionMinus(X.A);
  977. AssertNotNull('Expression left operand assigned',E.A);
  978. AssertNotNull('Expression right operand assigned',E.B);
  979. CheckClass(E.B,TJSMultiplicativeExpressionMul);
  980. R:=TJSMultiplicativeExpressionMul(E.B);
  981. CheckClass(E.A,TJSLiteral);
  982. AssertNotNull('Multiplication left operand assigned',R.A);
  983. AssertNotNull('Multiplication right operand assigned',R.B);
  984. CheckClass(R.A,TJSLiteral);
  985. CheckClass(R.B,TJSLiteral);
  986. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  987. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  988. AssertEquals('Multiplication right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  989. AssertEquals('Multiplication right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  990. AssertNotNull('Subtraction left operand value assigned',TJSLiteral(E.A).Value);
  991. AssertEquals('Subtraction left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  992. AssertEquals('Subtraction left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  993. end;
  994. procedure TTestJSParser.TestExpressionPrecedenceDivPlus;
  995. Var
  996. X : TJSExpressionStatement;
  997. E : TJSAdditiveExpressionPlus;
  998. R : TJSMultiplicativeExpressionDiv;
  999. begin
  1000. CreateParser('2 / 3 + 4;');
  1001. X:=GetExpressionStatement;
  1002. AssertNotNull('Expression statement assigned',X.A);
  1003. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1004. E:=TJSAdditiveExpressionPlus(X.A);
  1005. AssertNotNull('Expression left operand assigned',E.A);
  1006. AssertNotNull('Expression right operand assigned',E.B);
  1007. CheckClass(E.A,TJSMultiplicativeExpressionDiv);
  1008. R:=TJSMultiplicativeExpressionDiv(E.A);
  1009. CheckClass(E.B,TJSLiteral);
  1010. AssertNotNull('Div left operand assigned',R.A);
  1011. AssertNotNull('Div right operand assigned',R.B);
  1012. CheckClass(R.A,TJSLiteral);
  1013. CheckClass(R.B,TJSLiteral);
  1014. AssertEquals('Div left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1015. AssertEquals('Div left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1016. AssertEquals('Div right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1017. AssertEquals('Div right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1018. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.B).Value);
  1019. AssertEquals('Addition right operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  1020. AssertEquals('Addition right operand value correct', 4.0,TJSLiteral(E.B).Value.AsNumber);
  1021. end;
  1022. procedure TTestJSParser.TestExpressionPrecedencePlusDiv;
  1023. Var
  1024. X : TJSExpressionStatement;
  1025. E : TJSAdditiveExpressionPlus;
  1026. R : TJSMultiplicativeExpressionDiv;
  1027. begin
  1028. CreateParser('4 + 2 / 3;');
  1029. X:=GetExpressionStatement;
  1030. AssertNotNull('Expression statement assigned',X.A);
  1031. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1032. E:=TJSAdditiveExpressionPlus(X.A);
  1033. AssertNotNull('Expression left operand assigned',E.A);
  1034. AssertNotNull('Expression right operand assigned',E.B);
  1035. CheckClass(E.B,TJSMultiplicativeExpressionDiv);
  1036. R:=TJSMultiplicativeExpressionDiv(E.B);
  1037. CheckClass(E.A,TJSLiteral);
  1038. AssertNotNull('Div left operand assigned',R.A);
  1039. AssertNotNull('Div right operand assigned',R.B);
  1040. CheckClass(R.A,TJSLiteral);
  1041. CheckClass(R.B,TJSLiteral);
  1042. AssertEquals('Div left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1043. AssertEquals('Div left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1044. AssertEquals('Div right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1045. AssertEquals('Div right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1046. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1047. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1048. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1049. end;
  1050. procedure TTestJSParser.TestExpressionPrecedenceModPlus;
  1051. Var
  1052. X : TJSExpressionStatement;
  1053. E : TJSAdditiveExpressionPlus;
  1054. R : TJSMultiplicativeExpressionMod;
  1055. begin
  1056. CreateParser('2 % 3 + 4;');
  1057. X:=GetExpressionStatement;
  1058. AssertNotNull('Expression statement assigned',X.A);
  1059. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1060. E:=TJSAdditiveExpressionPlus(X.A);
  1061. AssertNotNull('Expression left operand assigned',E.A);
  1062. AssertNotNull('Expression right operand assigned',E.B);
  1063. CheckClass(E.A,TJSMultiplicativeExpressionMod);
  1064. R:=TJSMultiplicativeExpressionMod(E.A);
  1065. CheckClass(E.B,TJSLiteral);
  1066. AssertNotNull('mod left operand assigned',R.A);
  1067. AssertNotNull('mod right operand assigned',R.B);
  1068. CheckClass(R.A,TJSLiteral);
  1069. CheckClass(R.B,TJSLiteral);
  1070. AssertEquals('mod left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1071. AssertEquals('mod left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1072. AssertEquals('mod right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1073. AssertEquals('mod right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1074. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.B).Value);
  1075. AssertEquals('Addition right operand type correct', jstNumber, TJSLiteral(E.B).Value.ValueType);
  1076. AssertEquals('Addition right operand value correct', 4.0,TJSLiteral(E.B).Value.AsNumber);
  1077. end;
  1078. procedure TTestJSParser.TestExpressionPrecedencePlusMod;
  1079. Var
  1080. X : TJSExpressionStatement;
  1081. E : TJSAdditiveExpressionPlus;
  1082. R : TJSMultiplicativeExpressionMod;
  1083. begin
  1084. CreateParser('4 + 2 % 3;');
  1085. X:=GetExpressionStatement;
  1086. AssertNotNull('Expression statement assigned',X.A);
  1087. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1088. E:=TJSAdditiveExpressionPlus(X.A);
  1089. AssertNotNull('Expression left operand assigned',E.A);
  1090. AssertNotNull('Expression right operand assigned',E.B);
  1091. CheckClass(E.B,TJSMultiplicativeExpressionMod);
  1092. R:=TJSMultiplicativeExpressionMod(E.B);
  1093. CheckClass(E.A,TJSLiteral);
  1094. AssertNotNull('Mod left operand assigned',R.A);
  1095. AssertNotNull('Mod right operand assigned',R.B);
  1096. CheckClass(R.A,TJSLiteral);
  1097. CheckClass(R.B,TJSLiteral);
  1098. AssertEquals('Mod left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1099. AssertEquals('Mod left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1100. AssertEquals('Mod right operand type correct', jstNumber, TJSLiteral(R.B).Value.ValueType);
  1101. AssertEquals('Mod right operand value correct', 3.0, TJSLiteral(R.B).Value.AsNumber);
  1102. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.A).Value);
  1103. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1104. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1105. end;
  1106. procedure TTestJSParser.TestExpressionPrecedencePlusPostPlusPlus;
  1107. Var
  1108. X : TJSExpressionStatement;
  1109. R : TJSUnaryPostPlusPlusExpression;
  1110. E : TJSAdditiveExpressionPlus;
  1111. begin
  1112. CreateParser('4 + 2++;');
  1113. X:=GetExpressionStatement;
  1114. AssertNotNull('Expression statement assigned',X.A);
  1115. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1116. E:=TJSAdditiveExpressionPlus(X.A);
  1117. AssertNotNull('Expression left operand assigned',E.A);
  1118. AssertNotNull('Expression right operand assigned',E.B);
  1119. CheckClass(E.B,TJSUnaryPostPlusPlusExpression);
  1120. R:=TJSUnaryPostPlusPlusExpression(E.B);
  1121. CheckClass(E.A,TJSLiteral);
  1122. AssertNotNull('++ operand assigned',R.A);
  1123. CheckClass(R.A,TJSLiteral);
  1124. AssertEquals('++ operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1125. AssertEquals('++ operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1126. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1127. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1128. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1129. end;
  1130. procedure TTestJSParser.TestExpressionPrecedencePlusPostMinusMinus;
  1131. Var
  1132. X : TJSExpressionStatement;
  1133. R : TJSUnaryPostMinusMinusExpression;
  1134. E : TJSAdditiveExpressionPlus;
  1135. begin
  1136. CreateParser('4 + 2--;');
  1137. X:=GetExpressionStatement;
  1138. AssertNotNull('Expression statement assigned',X.A);
  1139. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1140. E:=TJSAdditiveExpressionPlus(X.A);
  1141. AssertNotNull('Expression left operand assigned',E.A);
  1142. AssertNotNull('Expression right operand assigned',E.B);
  1143. CheckClass(E.B,TJSUnaryPostMinusMinusExpression);
  1144. R:=TJSUnaryPostMinusMinusExpression(E.B);
  1145. CheckClass(E.A,TJSLiteral);
  1146. AssertNotNull('-- operand assigned',R.A);
  1147. CheckClass(R.A,TJSLiteral);
  1148. AssertEquals('-- operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1149. AssertEquals('-- operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1150. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1151. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1152. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1153. end;
  1154. procedure TTestJSParser.TestExpressionPrecedenceMulPostPlusPlus;
  1155. Var
  1156. X : TJSExpressionStatement;
  1157. R : TJSUnaryPostPlusPlusExpression;
  1158. E : TJSMultiplicativeExpressionMul;
  1159. begin
  1160. CreateParser('4 * 2++;');
  1161. X:=GetExpressionStatement;
  1162. AssertNotNull('Expression statement assigned',X.A);
  1163. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  1164. E:=TJSMultiplicativeExpressionMul(X.A);
  1165. AssertNotNull('Expression left operand assigned',E.A);
  1166. AssertNotNull('Expression right operand assigned',E.B);
  1167. CheckClass(E.B,TJSUnaryPostPlusPlusExpression);
  1168. R:=TJSUnaryPostPlusPlusExpression(E.B);
  1169. CheckClass(E.A,TJSLiteral);
  1170. AssertNotNull('++operand assigned',R.A);
  1171. CheckClass(R.A,TJSLiteral);
  1172. AssertEquals('++ operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1173. AssertEquals('++ operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1174. AssertNotNull('Multiplication left operand value assigned',TJSLiteral(E.A).Value);
  1175. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1176. AssertEquals('Multiplication left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1177. end;
  1178. procedure TTestJSParser.TestExpressionPrecedenceMulPostMinusMinus;
  1179. Var
  1180. X : TJSExpressionStatement;
  1181. R : TJSUnaryPostMinusMinusExpression;
  1182. E : TJSMultiplicativeExpressionMul;
  1183. begin
  1184. CreateParser('4 * 2--;');
  1185. X:=GetExpressionStatement;
  1186. AssertNotNull('Expression statement assigned',X.A);
  1187. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  1188. E:=TJSMultiplicativeExpressionMul(X.A);
  1189. AssertNotNull('Expression left operand assigned',E.A);
  1190. AssertNotNull('Expression right operand assigned',E.B);
  1191. CheckClass(E.B,TJSUnaryPostMinusMinusExpression);
  1192. R:=TJSUnaryPostMinusMinusExpression(E.B);
  1193. CheckClass(E.A,TJSLiteral);
  1194. AssertNotNull('-- operand assigned',R.A);
  1195. CheckClass(R.A,TJSLiteral);
  1196. AssertEquals('-- operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1197. AssertEquals('-- operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1198. AssertNotNull('Multiplication left operand value assigned',TJSLiteral(E.A).Value);
  1199. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1200. AssertEquals('Multiplication left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1201. end;
  1202. procedure TTestJSParser.TestExpressionPrecedencePlusPrePlusPlus;
  1203. Var
  1204. X : TJSExpressionStatement;
  1205. R : TJSUnaryPrePlusPlusExpression;
  1206. E : TJSAdditiveExpressionPlus;
  1207. begin
  1208. CreateParser('4 + ++2;');
  1209. X:=GetExpressionStatement;
  1210. AssertNotNull('Expression statement assigned',X.A);
  1211. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1212. E:=TJSAdditiveExpressionPlus(X.A);
  1213. AssertNotNull('Expression left operand assigned',E.A);
  1214. AssertNotNull('Expression right operand assigned',E.B);
  1215. CheckClass(E.B,TJSUnaryPrePlusPlusExpression);
  1216. R:=TJSUnaryPrePlusPlusExpression(E.B);
  1217. CheckClass(E.A,TJSLiteral);
  1218. AssertNotNull('Multiplication left operand assigned',R.A);
  1219. CheckClass(R.A,TJSLiteral);
  1220. AssertEquals('++ operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1221. AssertEquals('++ operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1222. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1223. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1224. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1225. end;
  1226. procedure TTestJSParser.TestExpressionPrecedencePlusInv;
  1227. Var
  1228. X : TJSExpressionStatement;
  1229. R : TJSUnaryInvExpression;
  1230. E : TJSAdditiveExpressionPlus;
  1231. begin
  1232. CreateParser('4 + ~2;');
  1233. X:=GetExpressionStatement;
  1234. AssertNotNull('Expression statement assigned',X.A);
  1235. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1236. E:=TJSAdditiveExpressionPlus(X.A);
  1237. AssertNotNull('Expression left operand assigned',E.A);
  1238. AssertNotNull('Expression right operand assigned',E.B);
  1239. CheckClass(E.B,TJSUnaryInvExpression);
  1240. R:=TJSUnaryInvExpression(E.B);
  1241. CheckClass(E.A,TJSLiteral);
  1242. AssertNotNull('Multiplication left operand assigned',R.A);
  1243. CheckClass(R.A,TJSLiteral);
  1244. AssertEquals('inv operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1245. AssertEquals('inv operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1246. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1247. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1248. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1249. end;
  1250. procedure TTestJSParser.TestExpressionPrecedenceMulInv;
  1251. Var
  1252. X : TJSExpressionStatement;
  1253. R : TJSUnaryInvExpression;
  1254. E : TJSMultiplicativeExpressionMul;
  1255. begin
  1256. CreateParser('4 * ~2;');
  1257. X:=GetExpressionStatement;
  1258. AssertNotNull('Expression statement assigned',X.A);
  1259. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  1260. E:=TJSMultiplicativeExpressionMul(X.A);
  1261. AssertNotNull('Expression left operand assigned',E.A);
  1262. AssertNotNull('Expression right operand assigned',E.B);
  1263. CheckClass(E.B,TJSUnaryInvExpression);
  1264. R:=TJSUnaryInvExpression(E.B);
  1265. CheckClass(E.A,TJSLiteral);
  1266. AssertNotNull('Multiplication left operand assigned',R.A);
  1267. CheckClass(R.A,TJSLiteral);
  1268. AssertEquals('Inv operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1269. AssertEquals('Inv operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1270. AssertNotNull('Multiplication left operand value assigned',TJSLiteral(E.A).Value);
  1271. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1272. AssertEquals('Multiplication left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1273. end;
  1274. procedure TTestJSParser.TestExpressionPrecedencePlusNot;
  1275. Var
  1276. X : TJSExpressionStatement;
  1277. R : TJSUnaryNotExpression;
  1278. E : TJSAdditiveExpressionPlus;
  1279. begin
  1280. CreateParser('4 + !2;');
  1281. X:=GetExpressionStatement;
  1282. AssertNotNull('Expression statement assigned',X.A);
  1283. CheckClass(X.A,TJSAdditiveExpressionPlus);
  1284. E:=TJSAdditiveExpressionPlus(X.A);
  1285. AssertNotNull('Expression left operand assigned',E.A);
  1286. AssertNotNull('Expression right operand assigned',E.B);
  1287. CheckClass(E.B,TJSUnaryNotExpression);
  1288. R:=TJSUnaryNotExpression(E.B);
  1289. CheckClass(E.A,TJSLiteral);
  1290. AssertNotNull('Multiplication left operand assigned',R.A);
  1291. CheckClass(R.A,TJSLiteral);
  1292. AssertEquals('Not operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  1293. AssertEquals('Not operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  1294. AssertNotNull('Addition left operand value assigned',TJSLiteral(E.A).Value);
  1295. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  1296. AssertEquals('Addition left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  1297. end;
  1298. procedure TTestJSParser.TestFunctionCallNoArgs;
  1299. Var
  1300. X : TJSExpressionStatement;
  1301. C : TJSCallExpression;
  1302. begin
  1303. CreateParser('abc();');
  1304. X:=GetExpressionStatement;
  1305. CheckClass(X.A,TJSCallExpression);
  1306. C:=TJSCallExpression(X.A);
  1307. AssertEquals('No arguments',0,C.Args.Elements.Count);
  1308. AssertNotNull('Call function expression',C.Expr);
  1309. CheckClass(C.Expr,TJSPrimaryExpressionIdent);
  1310. AssertEquals('Function name correct','abc',TJSPrimaryExpressionIdent(C.Expr).Name);
  1311. end;
  1312. procedure TTestJSParser.TestFunctionCallOneArg;
  1313. Var
  1314. X : TJSExpressionStatement;
  1315. C : TJSCallExpression;
  1316. E : TJSelement;
  1317. begin
  1318. CreateParser('abc(d);');
  1319. X:=GetExpressionStatement;
  1320. CheckClass(X.A,TJSCallExpression);
  1321. C:=TJSCallExpression(X.A);
  1322. AssertNotNull('Call function expression',C.Expr);
  1323. CheckClass(C.Expr,TJSPrimaryExpressionIdent);
  1324. AssertEquals('Function name correct','abc',TJSPrimaryExpressionIdent(C.Expr).Name);
  1325. AssertEquals('1 argument',1,C.Args.Elements.Count);
  1326. E:=C.Args.Elements[0].Expr;
  1327. AssertNotNull('First argument expression',E);
  1328. CheckClass(E,TJSPrimaryExpressionIdent);
  1329. AssertEquals('First argument name correct','d',TJSPrimaryExpressionIdent(E).Name);
  1330. end;
  1331. procedure TTestJSParser.TestFunctionCallTwoArgs;
  1332. Var
  1333. X : TJSExpressionStatement;
  1334. C : TJSCallExpression;
  1335. E : TJSelement;
  1336. begin
  1337. CreateParser('abc(d,e);');
  1338. X:=GetExpressionStatement;
  1339. CheckClass(X.A,TJSCallExpression);
  1340. C:=TJSCallExpression(X.A);
  1341. AssertNotNull('Call function expression',C.Expr);
  1342. CheckClass(C.Expr,TJSPrimaryExpressionIdent);
  1343. AssertEquals('Function name correct','abc',TJSPrimaryExpressionIdent(C.Expr).Name);
  1344. AssertEquals('2 arguments',2,C.Args.Elements.Count);
  1345. E:=C.Args.Elements[0].Expr;
  1346. AssertNotNull('First argument expression',E);
  1347. CheckClass(E,TJSPrimaryExpressionIdent);
  1348. AssertEquals('First argument name correct','d',TJSPrimaryExpressionIdent(E).Name);
  1349. E:=C.Args.Elements[1].Expr;
  1350. AssertNotNull('Second argument expression',E);
  1351. CheckClass(E,TJSPrimaryExpressionIdent);
  1352. AssertEquals('Second argument name correct','e',TJSPrimaryExpressionIdent(E).Name);
  1353. end;
  1354. procedure TTestJSParser.TestArrayExpressionNumericalArgs;
  1355. Var
  1356. X : TJSExpressionStatement;
  1357. B : TJSBracketMemberExpression;
  1358. begin
  1359. CreateParser('A[1];');
  1360. X:=GetExpressionStatement;
  1361. CheckClass(X.A,TJSBracketMemberExpression);
  1362. B:=TJSBracketMemberExpression(X.A);
  1363. CheckClass(B.Name,TJSLiteral);
  1364. AssertEquals('Member name operand type correct', jstNumber, TJSLiteral(B.Name).Value.ValueType);
  1365. AssertEquals('Member name operand value correct', 1.0, TJSLiteral(B.Name).Value.AsNumber);
  1366. CheckClass(B.Mexpr,TJSPrimaryExpressionIdent);
  1367. AssertEquals('Array name correct','A',TJSPrimaryExpressionIdent(B.Mexpr).Name);
  1368. end;
  1369. procedure TTestJSParser.TestArrayExpressionStringArgs;
  1370. Var
  1371. X : TJSExpressionStatement;
  1372. B : TJSBracketMemberExpression;
  1373. begin
  1374. CreateParser('A["propname"];');
  1375. X:=GetExpressionStatement;
  1376. CheckClass(X.A,TJSBracketMemberExpression);
  1377. B:=TJSBracketMemberExpression(X.A);
  1378. CheckClass(B.Name,TJSLiteral);
  1379. AssertEquals('Member name operand type correct', jstString, TJSLiteral(B.Name).Value.ValueType);
  1380. AssertEquals('Member name operand value correct', 'propname', TJSLiteral(B.Name).Value.AsString);
  1381. CheckClass(B.Mexpr,TJSPrimaryExpressionIdent);
  1382. AssertEquals('Array name correct','A',TJSPrimaryExpressionIdent(B.Mexpr).Name);
  1383. end;
  1384. procedure TTestJSParser.TestArrayExpressionIdentArgs;
  1385. Var
  1386. X : TJSExpressionStatement;
  1387. B : TJSBracketMemberExpression;
  1388. begin
  1389. CreateParser('A[B];');
  1390. X:=GetExpressionStatement;
  1391. CheckClass(X.A,TJSBracketMemberExpression);
  1392. B:=TJSBracketMemberExpression(X.A);
  1393. CheckClass(B.Name,TJSPrimaryExpressionIdent);
  1394. AssertEquals('Member name identifier correct', 'B', TJSPrimaryExpressionIdent(B.Name).Name);
  1395. CheckClass(B.Mexpr,TJSPrimaryExpressionIdent);
  1396. AssertEquals('Array name correct','A',TJSPrimaryExpressionIdent(B.Mexpr).Name);
  1397. end;
  1398. Procedure TTestJSParser.TestVarDeclarationSimple;
  1399. Var
  1400. X : TJSELement;
  1401. V : TJSVarDeclaration;
  1402. begin
  1403. CreateParser('var a;');
  1404. X:=GetFirstVar;
  1405. AssertNotNull('Variable statement assigned',(X));
  1406. CheckClass(X,TJSVarDeclaration);
  1407. V:=TJSVarDeclaration(X);
  1408. AssertEquals('correct variable type', vtVar, V.VarType);
  1409. AssertEquals('variable name correct registered', 'a', V.Name);
  1410. AssertNull('No initialization expression', V.Init);
  1411. end;
  1412. procedure TTestJSParser.TestLetDeclarationSimple;
  1413. Var
  1414. X : TJSELement;
  1415. V : TJSVarDeclaration;
  1416. begin
  1417. CreateParser('let a;',minLetVersion);
  1418. X:=GetFirstVar;
  1419. CheckClass(X,TJSVarDeclaration);
  1420. V:=TJSVarDeclaration(X);
  1421. AssertEquals('correct variable type', vtLet, V.VarType);
  1422. // AssertNotNull('Variable statement assigned',(X));
  1423. AssertEquals('variable name correct registered', 'a', V.Name);
  1424. AssertNull('No initialization expression', V.Init);
  1425. end;
  1426. procedure TTestJSParser.TestVarDeclarationDouble;
  1427. Var
  1428. X : TJSELement;
  1429. V : TJSVarDeclaration;
  1430. begin
  1431. CreateParser('var a, b ;');
  1432. AssertEquals('2 variables declared',2,GetVars.Count);
  1433. X:=GetFirstVar;
  1434. CheckClass(X,TJSVarDeclaration);
  1435. V:=TJSVarDeclaration(X);
  1436. AssertEquals('correct variable type', vtVar, V.VarType);
  1437. // AssertNotNull('Variable statement assigned',(X));
  1438. AssertEquals('variable name correct registered', 'a', V.name);
  1439. X:=GetVars.Nodes[1].Node;
  1440. CheckClass(X,TJSVarDeclaration);
  1441. V:=TJSVarDeclaration(X);
  1442. AssertEquals('correct variable type', vtVar, V.VarType);
  1443. AssertEquals('variable name correct registered', 'b', V.Name);
  1444. AssertNull('No initialization expression', V.Init);
  1445. end;
  1446. procedure TTestJSParser.TestVarDeclarationSimpleInit;
  1447. Var
  1448. X : TJSELement;
  1449. V : TJSVarDeclaration;
  1450. begin
  1451. CreateParser('var a = b;');
  1452. X:=GetFirstVar;
  1453. CheckClass(X,TJSVarDeclaration);
  1454. V:=TJSVarDeclaration(X);
  1455. // AssertNotNull('Variable statement assigned',(X));
  1456. AssertEquals('variable name correct registered', 'a', V.Name);
  1457. AssertNotNull('Initialization expression present', V.Init);
  1458. CheckClass(V.Init,TJSPrimaryExpressionIdent);
  1459. AssertEquals('Member name identifier correct', 'b', TJSPrimaryExpressionIdent(V.init).Name);
  1460. end;
  1461. procedure TTestJSParser.TestConstDeclarationSimpleInit;
  1462. Var
  1463. X : TJSELement;
  1464. V : TJSVarDeclaration;
  1465. begin
  1466. CreateParser('const a = 1;',MinLetVersion);
  1467. X:=GetFirstVar;
  1468. CheckClass(X,TJSVarDeclaration);
  1469. V:=TJSVarDeclaration(X);
  1470. // AssertNotNull('Variable statement assigned',(X));
  1471. AssertEquals('variable name correct registered', 'a', V.Name);
  1472. AssertNotNull('Initialization expression present', V.Init);
  1473. CheckClass(V.Init,TJSLiteral);
  1474. AssertEquals('Expression value type correct', jstNumber,TJSLiteral(V.Init).Value.ValueType);
  1475. AssertEquals('Expression value correct', 1.0, TJSLiteral(V.Init).Value.AsNumber);
  1476. end;
  1477. procedure TTestJSParser.TestVarDeclarationDoubleInit;
  1478. Var
  1479. X : TJSELement;
  1480. V : TJSVarDeclaration;
  1481. begin
  1482. CreateParser('var a, c = b;');
  1483. AssertEquals('2 variables declared',2,GetVars.Count);
  1484. X:=GetFirstVar;
  1485. CheckClass(X,TJSVarDeclaration);
  1486. V:=TJSVarDeclaration(X);
  1487. // AssertNotNull('Variable statement assigned',(X));
  1488. AssertEquals('variable name correct registered', 'a', V.Name);
  1489. AssertNull('No initialization expression', V.Init);
  1490. X:=GetVars.Nodes[1].Node;
  1491. CheckClass(X,TJSVarDeclaration);
  1492. V:=TJSVarDeclaration(X);
  1493. AssertEquals('variable name correct registered', 'c', V.Name);
  1494. AssertNotNull('No initialization expression', V.Init);
  1495. CheckClass(V.Init,TJSPrimaryExpressionIdent);
  1496. AssertEquals('Member name identifier correct', 'b', TJSPrimaryExpressionIdent(V.init).Name);
  1497. end;
  1498. procedure TTestJSParser.TestDebuggerStatement;
  1499. Var
  1500. E : TJSSourceElements;
  1501. X : TJSElement;
  1502. begin
  1503. CreateParser('debugger',MinDebuggerVersion);
  1504. E:=GetSourceElements;
  1505. AssertEquals('1 statement in block',1,E.Statements.Count);
  1506. X:=E.Statements.Nodes[0].Node;
  1507. CheckClass(X,TJSDebuggerStatement);
  1508. end;
  1509. procedure TTestJSParser.TestBlockEmpty;
  1510. Var
  1511. E : TJSSourceElements;
  1512. X : TJSElement;
  1513. begin
  1514. CreateParser('{}');
  1515. E:=GetSourceElements;
  1516. AssertEquals('1 statement in block',1,E.Statements.Count);
  1517. X:=E.Statements.Nodes[0].Node;
  1518. CheckClass(X,TJSEmptyBlockStatement);
  1519. end;
  1520. procedure TTestJSParser.TestBlockEmptyStatement;
  1521. Var
  1522. E : TJSSourceElements;
  1523. X : TJSElement;
  1524. begin
  1525. CreateParser('{;}');
  1526. E:=GetSourceElements;
  1527. AssertEquals('1 statement in block',1,E.Statements.Count);
  1528. X:=E.Statements.Nodes[0].Node;
  1529. CheckClass(X,TJSEmptyStatement);
  1530. end;
  1531. procedure TTestJSParser.TestBlockSimpleStatement;
  1532. Var
  1533. E : TJSSourceElements;
  1534. X : TJSElement;
  1535. begin
  1536. CreateParser('{a;}');
  1537. E:=GetSourceElements;
  1538. AssertEquals('1 statement in block',1,E.Statements.Count);
  1539. X:=E.Statements.Nodes[0].Node;
  1540. CheckClass(X,TJSExpressionStatement);
  1541. CheckNotNull(TJSExpressionStatement(X).A);
  1542. CheckClass(TJSExpressionStatement(X).A,TJSPrimaryExpressionIdent);
  1543. AssertEquals('a',TJSPrimaryExpressionIdent(TJSExpressionStatement(X).A).Name)
  1544. end;
  1545. procedure TTestJSParser.TestFunctionDeclarationEmpty;
  1546. Var
  1547. E : TJSSourceElements;
  1548. N : TJSElement;
  1549. FD : TJSFunctionDeclarationStatement;
  1550. begin
  1551. CreateParser('function a () {}');
  1552. E:=GetSourceElements;
  1553. AssertEquals('1 function defined',1,E.functions.Count);
  1554. N:=E.Functions.Nodes[0].Node;
  1555. AssertNotNull('Function element defined ',N);
  1556. CheckClass(N,TJSFunctionDeclarationStatement);
  1557. FD:=TJSFunctionDeclarationStatement(N);
  1558. AssertNotNull('Function definition assigned',FD.AFunction);
  1559. AssertFalse('Async function ',FD.AFunction.IsAsync);
  1560. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1561. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1562. AssertEquals('No parameters',0,FD.AFunction.Params.Count);
  1563. N:=FD.AFunction.Body;
  1564. CheckClass(N,TJSFunctionBody);
  1565. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1566. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1567. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1568. AssertEquals('0 statement in functionbody elements',0,E.Statements.Count);
  1569. // TJSEmptyBlockStatement
  1570. end;
  1571. procedure TTestJSParser.TestFunctionDeclarationAsync;
  1572. Var
  1573. E : TJSSourceElements;
  1574. N : TJSElement;
  1575. FD : TJSFunctionDeclarationStatement;
  1576. begin
  1577. CreateParser('async function a () {}',MinAsyncVersion);
  1578. E:=GetSourceElements;
  1579. AssertEquals('1 function defined',1,E.functions.Count);
  1580. N:=E.Functions.Nodes[0].Node;
  1581. AssertNotNull('Function element defined ',N);
  1582. CheckClass(N,TJSFunctionDeclarationStatement);
  1583. FD:=TJSFunctionDeclarationStatement(N);
  1584. AssertNotNull('Function definition assigned',FD.AFunction);
  1585. AssertTrue('Async function ',FD.AFunction.IsAsync);
  1586. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1587. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1588. AssertEquals('No parameters',0,FD.AFunction.Params.Count);
  1589. N:=FD.AFunction.Body;
  1590. CheckClass(N,TJSFunctionBody);
  1591. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1592. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1593. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1594. AssertEquals('0 statement in functionbody elements',0,E.Statements.Count);
  1595. end;
  1596. procedure TTestJSParser.TestFunctionDeclarationWithArgs;
  1597. Var
  1598. E : TJSSourceElements;
  1599. N : TJSElement;
  1600. FD : TJSFunctionDeclarationStatement;
  1601. begin
  1602. CreateParser('function a (b,c) {}');
  1603. E:=GetSourceElements;
  1604. AssertEquals('1 function defined',1,E.functions.Count);
  1605. N:=E.Functions.Nodes[0].Node;
  1606. AssertNotNull('Function element defined ',N);
  1607. CheckClass(N,TJSFunctionDeclarationStatement);
  1608. FD:=TJSFunctionDeclarationStatement(N);
  1609. AssertNotNull('Function definition assigned',FD.AFunction);
  1610. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1611. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1612. AssertEquals('2 parameters',2,FD.AFunction.Params.Count);
  1613. AssertEquals('1st parameter','b',FD.AFunction.Params[0]);
  1614. AssertEquals('2nd parameter','c',FD.AFunction.Params[1]);
  1615. N:=FD.AFunction.Body;
  1616. CheckClass(N,TJSFunctionBody);
  1617. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1618. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1619. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1620. AssertEquals('0 statement in functionbody elements',0,E.Statements.Count);
  1621. // TJSEmptyBlockStatement
  1622. end;
  1623. procedure TTestJSParser.TestFunctionDeclarationWithBody;
  1624. Var
  1625. E : TJSSourceElements;
  1626. N : TJSElement;
  1627. FD : TJSFunctionDeclarationStatement;
  1628. begin
  1629. CreateParser('function a () { b; }');
  1630. E:=GetSourceElements;
  1631. AssertEquals('1 function defined',1,E.functions.Count);
  1632. N:=E.Functions.Nodes[0].Node;
  1633. AssertNotNull('Function element defined ',N);
  1634. CheckClass(N,TJSFunctionDeclarationStatement);
  1635. FD:=TJSFunctionDeclarationStatement(N);
  1636. AssertNotNull('Function definition assigned',FD.AFunction);
  1637. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1638. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1639. AssertEquals('2 parameters',0,FD.AFunction.Params.Count);
  1640. N:=FD.AFunction.Body;
  1641. CheckClass(N,TJSFunctionBody);
  1642. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1643. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1644. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1645. AssertEquals('1 statement in functionbody elements',1,E.Statements.Count);
  1646. N:=E.Statements.Nodes[0].Node;
  1647. CheckClass(N,TJSExpressionStatement);
  1648. CheckNotNull(TJSExpressionStatement(N).A);
  1649. CheckClass(TJSExpressionStatement(N).A,TJSPrimaryExpressionIdent);
  1650. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(N).A).Name);
  1651. // TJSEmptyBlockStatement
  1652. end;
  1653. procedure TTestJSParser.TestIfSimple;
  1654. Var
  1655. E : TJSElement;
  1656. I : TJSIfStatement;
  1657. begin
  1658. CreateParser('if (a) b;');
  1659. E:=GetFirstStatement;
  1660. CheckClass(E,TJSIfStatement);
  1661. I:=TJSIfStatement(E);
  1662. AssertNotNull('Statement condition assigned',I.Cond);
  1663. CheckClass(I.Cond,TJSPrimaryExpressionIdent);
  1664. AssertEquals('a',TJSPrimaryExpressionIdent(I.Cond).Name);
  1665. AssertNull('Statement false branch assigned',I.BFalse);
  1666. AssertNotNull('Statement true branch assigned',I.Btrue);
  1667. CheckClass(I.Btrue,TJSExpressionStatement);
  1668. AssertNotNull('Expression statement expression',TJSExpressionStatement(I.BTrue).A);
  1669. CheckClass(TJSExpressionStatement(I.BTrue).A,TJSPrimaryExpressionIdent);
  1670. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(I.Btrue).A).Name);
  1671. end;
  1672. procedure TTestJSParser.TestIfEmptyBlock;
  1673. Var
  1674. E : TJSElement;
  1675. I : TJSIfStatement;
  1676. begin
  1677. CreateParser('if (a) {}');
  1678. E:=GetFirstStatement;
  1679. CheckClass(E,TJSIfStatement);
  1680. I:=TJSIfStatement(E);
  1681. AssertNotNull('Statement condition assigned',I.Cond);
  1682. CheckClass(I.Cond,TJSPrimaryExpressionIdent);
  1683. AssertEquals('a',TJSPrimaryExpressionIdent(I.Cond).Name);
  1684. AssertNull('Statement false branch assigned',I.BFalse);
  1685. AssertNotNull('Statement true branch assigned',I.Btrue);
  1686. CheckClass(I.Btrue,TJSEmptyBlockStatement);
  1687. end;
  1688. procedure TTestJSParser.TestIfEmptyBlockElse;
  1689. Var
  1690. E : TJSElement;
  1691. I : TJSIfStatement;
  1692. begin
  1693. CreateParser('if (a) {} else b;');
  1694. E:=GetFirstStatement;
  1695. CheckClass(E,TJSIfStatement);
  1696. I:=TJSIfStatement(E);
  1697. AssertNotNull('Statement condition assigned',I.Cond);
  1698. CheckClass(I.Cond,TJSPrimaryExpressionIdent);
  1699. AssertEquals('a',TJSPrimaryExpressionIdent(I.Cond).Name);
  1700. AssertNotNull('Statement false branch assigned',I.BFalse);
  1701. AssertNotNull('Statement true branch assigned',I.Btrue);
  1702. CheckClass(I.Btrue,TJSEmptyBlockStatement);
  1703. end;
  1704. procedure TTestJSParser.TestWhileSimple;
  1705. Var
  1706. E : TJSElement;
  1707. W : TJSWhileStatement;
  1708. begin
  1709. CreateParser('while (a) b;');
  1710. E:=GetFirstStatement;
  1711. CheckClass(E,TJSWhileStatement);
  1712. W:=TJSWhileStatement(E);
  1713. AssertNotNull('Statement condition assigned',W.Cond);
  1714. CheckClass(W.Cond,TJSPrimaryExpressionIdent);
  1715. AssertEquals('a',TJSPrimaryExpressionIdent(W.Cond).Name);
  1716. AssertNotNull('Statement condition assigned',W.body);
  1717. CheckClass(W.Body,TJSExpressionStatement);
  1718. AssertNotNull('Expression statement expression',TJSExpressionStatement(W.Body).A);
  1719. CheckClass(TJSExpressionStatement(W.Body).A,TJSPrimaryExpressionIdent);
  1720. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(W.Body).A).Name);
  1721. end;
  1722. procedure TTestJSParser.TestWhileBlock;
  1723. Var
  1724. E : TJSElement;
  1725. W : TJSWhileStatement;
  1726. // B : TJSBlockStatement;
  1727. begin
  1728. CreateParser('while (a) {b;}');
  1729. E:=GetFirstStatement;
  1730. CheckClass(E,TJSWhileStatement);
  1731. W:=TJSWhileStatement(E);
  1732. AssertNotNull('Statement condition assigned',W.Cond);
  1733. CheckClass(W.Cond,TJSPrimaryExpressionIdent);
  1734. AssertEquals('a',TJSPrimaryExpressionIdent(W.Cond).Name);
  1735. AssertNotNull('Statement condition assigned',W.body);
  1736. CheckClass(W.Body,TJSExpressionStatement);
  1737. AssertNotNull('Expression statement expression',TJSExpressionStatement(W.Body).A);
  1738. CheckClass(TJSExpressionStatement(W.Body).A,TJSPrimaryExpressionIdent);
  1739. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(W.Body).A).Name);
  1740. end;
  1741. procedure TTestJSParser.TestDoWhileSimple;
  1742. Var
  1743. E : TJSElement;
  1744. W : TJSDoWhileStatement;
  1745. // B : TJSBlockStatement;
  1746. begin
  1747. CreateParser('do b; while (a);');
  1748. E:=GetFirstStatement;
  1749. CheckClass(E,TJSDoWhileStatement);
  1750. W:=TJSDoWhileStatement(E);
  1751. AssertNotNull('Statement condition assigned',W.Cond);
  1752. CheckClass(W.Cond,TJSPrimaryExpressionIdent);
  1753. AssertEquals('a',TJSPrimaryExpressionIdent(W.Cond).Name);
  1754. AssertNotNull('Statement condition assigned',W.body);
  1755. CheckClass(W.Body,TJSExpressionStatement);
  1756. AssertNotNull('Expression statement expression',TJSExpressionStatement(W.Body).A);
  1757. CheckClass(TJSExpressionStatement(W.Body).A,TJSPrimaryExpressionIdent);
  1758. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(W.Body).A).Name);
  1759. end;
  1760. procedure TTestJSParser.TestDoWhileBlock;
  1761. Var
  1762. E : TJSElement;
  1763. W : TJSDoWhileStatement;
  1764. // B : TJSBlockStatement;
  1765. begin
  1766. CreateParser('do {b;} while (a);');
  1767. E:=GetFirstStatement;
  1768. CheckClass(E,TJSDoWhileStatement);
  1769. W:=TJSDoWhileStatement(E);
  1770. AssertNotNull('Statement condition assigned',W.Cond);
  1771. CheckClass(W.Cond,TJSPrimaryExpressionIdent);
  1772. AssertEquals('a',TJSPrimaryExpressionIdent(W.Cond).Name);
  1773. AssertNotNull('Statement condition assigned',W.body);
  1774. CheckClass(W.Body,TJSExpressionStatement);
  1775. AssertNotNull('Expression statement expression',TJSExpressionStatement(W.Body).A);
  1776. CheckClass(TJSExpressionStatement(W.Body).A,TJSPrimaryExpressionIdent);
  1777. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(W.Body).A).Name);
  1778. end;
  1779. procedure TTestJSParser.TestForEmpty;
  1780. Var
  1781. E : TJSElement;
  1782. F : TJSForStatement;
  1783. begin
  1784. CreateParser('for (;;) a;');
  1785. E:=GetFirstStatement;
  1786. CheckClass(E,TJSForStatement);
  1787. F:=TJSForStatement(E);
  1788. AssertNull('Statement condition not assigned',F.Cond);
  1789. AssertNull('Statement init not assigned',F.Init);
  1790. AssertNull('Statement step not assigned',F.Incr);
  1791. CheckClass(F.Body,TJSExpressionStatement);
  1792. AssertNotNull('Expression statement expression',TJSExpressionStatement(F.Body).A);
  1793. CheckClass(TJSExpressionStatement(F.Body).A,TJSPrimaryExpressionIdent);
  1794. AssertEquals('a',TJSPrimaryExpressionIdent(TJSExpressionStatement(F.Body).A).Name);
  1795. end;
  1796. procedure TTestJSParser.TestForEmptyBody;
  1797. Var
  1798. E : TJSElement;
  1799. F : TJSForStatement;
  1800. begin
  1801. CreateParser('for (;;) {a;}');
  1802. E:=GetFirstStatement;
  1803. CheckClass(E,TJSForStatement);
  1804. F:=TJSForStatement(E);
  1805. AssertNull('Statement condition not assigned',F.Cond);
  1806. AssertNull('Statement init not assigned',F.Init);
  1807. AssertNull('Statement step not assigned',F.Incr);
  1808. CheckClass(F.Body,TJSExpressionStatement);
  1809. AssertNotNull('Expression statement expression',TJSExpressionStatement(F.Body).A);
  1810. CheckClass(TJSExpressionStatement(F.Body).A,TJSPrimaryExpressionIdent);
  1811. AssertEquals('a',TJSPrimaryExpressionIdent(TJSExpressionStatement(F.Body).A).Name);
  1812. end;
  1813. procedure TTestJSParser.TestForSimpleBody;
  1814. Var
  1815. E : TJSElement;
  1816. F : TJSForStatement;
  1817. begin
  1818. CreateParser('for (a;b;c) {d;}');
  1819. E:=GetFirstStatement;
  1820. CheckClass(E,TJSForStatement);
  1821. F:=TJSForStatement(E);
  1822. AssertNotNull('Statement condition not assigned',F.Cond);
  1823. AssertNotNull('Statement init not assigned',F.Init);
  1824. AssertNotNull('Statement step not assigned',F.Incr);
  1825. CheckClass(F.Init,TJSPrimaryExpressionIdent);
  1826. AssertNotNull('Expression statement expression',TJSPrimaryExpressionIdent(F.Init));
  1827. AssertEquals('a',TJSPrimaryExpressionIdent(F.Init).Name);
  1828. CheckClass(F.Incr,TJSPrimaryExpressionIdent);
  1829. AssertNotNull('Expression statement expression',TJSPrimaryExpressionIdent(F.Incr));
  1830. AssertEquals('c',TJSPrimaryExpressionIdent(F.Incr).Name);
  1831. CheckClass(F.Cond,TJSPrimaryExpressionIdent);
  1832. AssertNotNull('Expression statement expression',TJSPrimaryExpressionIdent(F.Cond));
  1833. AssertEquals('b',TJSPrimaryExpressionIdent(F.cond).Name);
  1834. CheckClass(F.Body,TJSExpressionStatement);
  1835. AssertNotNull('Expression statement expression',TJSExpressionStatement(F.Body).A);
  1836. CheckClass(TJSExpressionStatement(F.Body).A,TJSPrimaryExpressionIdent);
  1837. AssertEquals('d',TJSPrimaryExpressionIdent(TJSExpressionStatement(F.Body).A).Name);
  1838. end;
  1839. procedure TTestJSParser.TestTryCatch;
  1840. Var
  1841. E : TJSElement;
  1842. T : TJSTryCatchStatement;
  1843. begin
  1844. CreateParser('try {a;} catch (e) {b;}');
  1845. E:=GetFirstStatement;
  1846. CheckClass(E,TJSTryCatchStatement);
  1847. T:=TJSTryCatchStatement(E);
  1848. CheckClass(T.Block,TJSExpressionStatement);
  1849. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.Block).A);
  1850. CheckClass(TJSExpressionStatement(T.Block).A,TJSPrimaryExpressionIdent);
  1851. AssertEquals('a',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.Block).A).Name);
  1852. CheckClass(T.BCatch,TJSExpressionStatement);
  1853. AssertEquals('Except object identifier name','e',T.Ident);
  1854. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.BCatch).A);
  1855. CheckClass(TJSExpressionStatement(T.BCatch).A,TJSPrimaryExpressionIdent);
  1856. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.BCatch).A).Name);
  1857. AssertNull('No Finally expression',T.BFinally);
  1858. end;
  1859. procedure TTestJSParser.TestTryCatchFinally;
  1860. Var
  1861. E : TJSElement;
  1862. T : TJSTryCatchFinallyStatement;
  1863. begin
  1864. CreateParser('try {a;} catch (e) {b;} finally {c;}');
  1865. E:=GetFirstStatement;
  1866. CheckClass(E,TJSTryCatchFinallyStatement);
  1867. T:=TJSTryCatchFinallyStatement(E);
  1868. CheckClass(T.Block,TJSExpressionStatement);
  1869. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.Block).A);
  1870. CheckClass(TJSExpressionStatement(T.Block).A,TJSPrimaryExpressionIdent);
  1871. AssertEquals('a',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.Block).A).Name);
  1872. AssertEquals('Except object identifier name','e',T.Ident);
  1873. CheckClass(T.BCatch,TJSExpressionStatement);
  1874. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.BCatch).A);
  1875. CheckClass(TJSExpressionStatement(T.BCatch).A,TJSPrimaryExpressionIdent);
  1876. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.BCatch).A).Name);
  1877. AssertNotNull('Finally expression',T.BFinally);
  1878. CheckClass(T.BFinally,TJSExpressionStatement);
  1879. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.BFinally).A);
  1880. CheckClass(TJSExpressionStatement(T.BFinally).A,TJSPrimaryExpressionIdent);
  1881. AssertEquals('c',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.BFinally).A).Name);
  1882. end;
  1883. procedure TTestJSParser.TestTryFinally;
  1884. Var
  1885. E : TJSElement;
  1886. T : TJSTryFinallyStatement;
  1887. begin
  1888. CreateParser('try {a;} finally {c;}');
  1889. E:=GetFirstStatement;
  1890. CheckClass(E,TJSTryFinallyStatement);
  1891. T:=TJSTryFinallyStatement(E);
  1892. CheckClass(T.Block,TJSExpressionStatement);
  1893. AssertNotNull('Expression statement expression',TJSExpressionStatement(T.Block).A);
  1894. CheckClass(TJSExpressionStatement(T.Block).A,TJSPrimaryExpressionIdent);
  1895. AssertEquals('a',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.Block).A).Name);
  1896. AssertNull('No catch',T.BCatch);
  1897. AssertNotNull('Finally expression',T.BFinally);
  1898. AssertNotNull('Finally expression',TJSExpressionStatement(T.BFinally).A);
  1899. CheckClass(TJSExpressionStatement(T.BFinally).A,TJSPrimaryExpressionIdent);
  1900. AssertEquals('c',TJSPrimaryExpressionIdent(TJSExpressionStatement(T.BFinally).A).Name);
  1901. end;
  1902. procedure TTestJSParser.TestThrow;
  1903. Var
  1904. E : TJSElement;
  1905. T : TJSThrowStatement;
  1906. begin
  1907. CreateParser('throw a;');
  1908. E:=GetFirstStatement;
  1909. CheckClass(E,TJSThrowStatement);
  1910. T:=TJSThrowStatement(E);
  1911. AssertNotNull('Have throw object',T.A);
  1912. CheckClass(T.A,TJSPrimaryExpressionIdent);
  1913. AssertEquals('Correct identifier','a',TJSPrimaryExpressionIdent(T.A).Name);
  1914. end;
  1915. procedure TTestJSParser.TestReturn;
  1916. Var
  1917. E : TJSSourceElements;
  1918. N : TJSElement;
  1919. FD : TJSFunctionDeclarationStatement;
  1920. begin
  1921. CreateParser('function a () { return b; }');
  1922. E:=GetSourceElements;
  1923. AssertEquals('1 function defined',1,E.functions.Count);
  1924. N:=E.Functions.Nodes[0].Node;
  1925. AssertNotNull('Function element defined ',N);
  1926. CheckClass(N,TJSFunctionDeclarationStatement);
  1927. FD:=TJSFunctionDeclarationStatement(N);
  1928. AssertNotNull('Function definition assigned',FD.AFunction);
  1929. AssertEquals('Function name OK','a',FD.AFunction.Name);
  1930. AssertNotNull('Function body assigned', FD.AFunction.Body);
  1931. AssertEquals('No parameters',0,FD.AFunction.Params.Count);
  1932. N:=FD.AFunction.Body;
  1933. CheckClass(N,TJSFunctionBody);
  1934. AssertNotNull('Function body has element',TJSFunctionBody(N).A);
  1935. CheckClass(TJSFunctionBody(N).A, TJSSourceElements);
  1936. E:=TJSSourceElements(TJSFunctionBody(N).A);
  1937. AssertEquals('1 statement in functionbody elements',1,E.Statements.Count);
  1938. end;
  1939. procedure TTestJSParser.TestAssignment;
  1940. Var
  1941. E : TJSElement;
  1942. ES : TJSExpressionStatement;
  1943. A : TJSSimpleAssignStatement;
  1944. begin
  1945. CreateParser('a=b;');
  1946. E:=GetFirstStatement;
  1947. CheckClass(E,TJSExpressionStatement);
  1948. ES:=TJSExpressionStatement(E);
  1949. CheckClass(ES.A,TJSSimpleAssignStatement);
  1950. A:=TJSSimpleAssignStatement(ES.A);
  1951. AssertNotNull('Have LHS',A.LHS);
  1952. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  1953. AssertEquals('Have LHS name','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  1954. CheckClass(A.Expr,TJSPrimaryExpressionIdent);
  1955. AssertEquals('Have RHS name','b',TJSPrimaryExpressionIdent(A.Expr).Name);
  1956. end;
  1957. procedure TTestJSParser.TestNew;
  1958. Var
  1959. E : TJSElement;
  1960. ES : TJSExpressionStatement;
  1961. A : TJSSimpleAssignStatement;
  1962. N : TJSNewMemberExpression;
  1963. L : TJSLiteral;
  1964. begin
  1965. CreateParser('a = new b(123)');
  1966. E:=GetFirstStatement;
  1967. CheckClass(E,TJSExpressionStatement);
  1968. ES:=TJSExpressionStatement(E);
  1969. CheckClass(ES.A,TJSSimpleAssignStatement);
  1970. A:=TJSSimpleAssignStatement(ES.A);
  1971. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  1972. AssertEquals('Have LHS name','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  1973. CheckClass(A.Expr,TJSNewMemberExpression);
  1974. N:=TJSNewMemberExpression(A.Expr);
  1975. AssertNotNull('Have LHS name',N.Mexpr);
  1976. CheckClass(N.Mexpr,TJSPrimaryExpressionIdent);
  1977. AssertEquals('Have LHS name','b',TJSPrimaryExpressionIdent(N.Mexpr).Name);
  1978. AssertNotNull('Have arguments',N.Args);
  1979. AssertEquals('One argument',1,N.Args.Elements.Count);
  1980. AssertNotNull('Have argument 0',N.Args.Elements[0].Expr);
  1981. CheckClass(N.Args.Elements[0].Expr,TJSLiteral);
  1982. L:=TJSLiteral(N.Args.Elements[0].Expr);
  1983. AssertNotNull('Expression value assigned',L.Value);
  1984. AssertEquals('Expression value type correct', jstNumber,L.Value.ValueType);
  1985. AssertEquals('Expression value correct', 123,L.Value.AsNumber);
  1986. end;
  1987. procedure TTestJSParser.TestLabeledStatement;
  1988. Var
  1989. E : TJSElement;
  1990. ES : TJSExpressionStatement;
  1991. A : TJSSimpleAssignStatement;
  1992. N : TJSNewMemberExpression;
  1993. L : TJSLiteral;
  1994. LS : TJSLabeledStatement;
  1995. begin
  1996. CreateParser('loc: a = new b(123)');
  1997. E:=GetFirstStatement;
  1998. CheckClass(E,TJSLabeledStatement);
  1999. LS:=TJSLabeledStatement(E);
  2000. AssertNotNull('Have label',LS.TheLabel);
  2001. AssertEquals('Have correct label','loc',LS.TheLabel.Name);
  2002. CheckClass(LS.A,TJSExpressionStatement);
  2003. ES:=TJSExpressionStatement(LS.A);
  2004. CheckClass(ES.A,TJSSimpleAssignStatement);
  2005. A:=TJSSimpleAssignStatement(ES.A);
  2006. CheckClass(A.LHS,TJSPrimaryExpressionIdent);
  2007. AssertEquals('Have LHS name','a',TJSPrimaryExpressionIdent(A.LHS).Name);
  2008. CheckClass(A.Expr,TJSNewMemberExpression);
  2009. N:=TJSNewMemberExpression(A.Expr);
  2010. AssertNotNull('Have LHS name',N.Mexpr);
  2011. CheckClass(N.Mexpr,TJSPrimaryExpressionIdent);
  2012. AssertEquals('Have LHS name','b',TJSPrimaryExpressionIdent(N.Mexpr).Name);
  2013. AssertNotNull('Have arguments',N.Args);
  2014. AssertEquals('One argument',1,N.Args.Elements.Count);
  2015. AssertNotNull('Have argument 0',N.Args.Elements[0].Expr);
  2016. CheckClass(N.Args.Elements[0].Expr,TJSLiteral);
  2017. L:=TJSLiteral(N.Args.Elements[0].Expr);
  2018. AssertNotNull('Expression value assigned',L.Value);
  2019. AssertEquals('Expression value type correct', jstNumber,L.Value.ValueType);
  2020. AssertEquals('Expression value correct', 123,L.Value.AsNumber);
  2021. end;
  2022. procedure TTestJSParser.TestContinue;
  2023. Var
  2024. E : TJSElement;
  2025. C : TJSContinueStatement;
  2026. begin
  2027. CreateParser('while (true) continue;');
  2028. E:=GetFirstStatement;
  2029. CheckClass(E,TJSWhileStatement);
  2030. E:=TJSWhileStatement(E).Body;
  2031. CheckClass(E,TJSContinueStatement);
  2032. C:=TJSContinueStatement(E);
  2033. AssertEquals('Have correct (empty) label','',C.TargetName);
  2034. end;
  2035. procedure TTestJSParser.TestContinueTarget;
  2036. Var
  2037. E : TJSElement;
  2038. C : TJSContinueStatement;
  2039. begin
  2040. CreateParser('a: while (true) continue a;');
  2041. E:=GetFirstStatement;
  2042. CheckClass(E,TJSLabeledStatement);
  2043. E:=TJSLabeledStatement(E).A;
  2044. CheckClass(E,TJSWhileStatement);
  2045. E:=TJSWhileStatement(E).Body;
  2046. CheckClass(E,TJSContinueStatement);
  2047. C:=TJSContinueStatement(E);
  2048. AssertEquals('Have correct label','a',C.TargetName);
  2049. end;
  2050. procedure TTestJSParser.TestBreakTarget;
  2051. Var
  2052. E : TJSElement;
  2053. C : TJSBreakStatement;
  2054. begin
  2055. CreateParser('a: while (true) break a;');
  2056. E:=GetFirstStatement;
  2057. CheckClass(E,TJSLabeledStatement);
  2058. E:=TJSLabeledStatement(E).A;
  2059. CheckClass(E,TJSWhileStatement);
  2060. E:=TJSWhileStatement(E).Body;
  2061. CheckClass(E,TJSBreakStatement);
  2062. C:=TJSBreakStatement(E);
  2063. AssertEquals('Have correct label','a',C.TargetName);
  2064. end;
  2065. procedure TTestJSParser.TestSwitchEmpty;
  2066. Var
  2067. E : TJSElement;
  2068. S : TJSSwitchStatement;
  2069. begin
  2070. CreateParser('switch (a) {}');
  2071. E:=GetFirstStatement;
  2072. CheckClass(E,TJSSwitchStatement);
  2073. S:=TJSSwitchStatement(E);
  2074. AssertNotNull('Have condition',S.Cond);
  2075. AssertNull('Have no default',S.TheDefault);
  2076. AssertIdentifier('Case condition',S.Cond,'a');
  2077. S:=TJSSwitchStatement(E);
  2078. AssertEquals('No cases',0,S.Cases.Count)
  2079. end;
  2080. procedure TTestJSParser.TestSwitchOne;
  2081. Var
  2082. E : TJSElement;
  2083. S : TJSSwitchStatement;
  2084. C : TJSCaseElement;
  2085. begin
  2086. CreateParser('switch (a) { case c : {}}');
  2087. E:=GetFirstStatement;
  2088. CheckClass(E,TJSSwitchStatement);
  2089. S:=TJSSwitchStatement(E);
  2090. AssertNotNull('Have condition',S.Cond);
  2091. AssertNull('Have no default',S.TheDefault);
  2092. AssertIdentifier('Case condition',S.Cond,'a');
  2093. S:=TJSSwitchStatement(E);
  2094. AssertEquals('1 case',1,S.Cases.Count);
  2095. C:=TJSCaseElement(S.Cases[0]);
  2096. AssertIdentifier('Case expression',C.Expr,'c');
  2097. CheckClass(C.Body,TJSEmptyBlockStatement);
  2098. end;
  2099. procedure TTestJSParser.TestSwitchTwo;
  2100. Var
  2101. E : TJSElement;
  2102. S : TJSSwitchStatement;
  2103. C : TJSCaseElement;
  2104. begin
  2105. CreateParser('switch (a) { case c: {}'+sLineBreak+' case d: {}}');
  2106. E:=GetFirstStatement;
  2107. CheckClass(E,TJSSwitchStatement);
  2108. S:=TJSSwitchStatement(E);
  2109. AssertNotNull('Have condition',S.Cond);
  2110. AssertNull('Have no default',S.TheDefault);
  2111. AssertIdentifier('Case condition',S.Cond,'a');
  2112. S:=TJSSwitchStatement(E);
  2113. AssertEquals('2 cases',2,S.Cases.Count);
  2114. C:=TJSCaseElement(S.Cases[0]);
  2115. AssertIdentifier('Case expression',C.Expr,'c');
  2116. CheckClass(C.Body,TJSEmptyBlockStatement);
  2117. C:=TJSCaseElement(S.Cases[1]);
  2118. AssertIdentifier('Case expression',C.Expr,'d');
  2119. CheckClass(C.Body,TJSEmptyBlockStatement);
  2120. end;
  2121. procedure TTestJSParser.TestSwitchTwoDefault;
  2122. Var
  2123. E : TJSElement;
  2124. S : TJSSwitchStatement;
  2125. C : TJSCaseElement;
  2126. begin
  2127. CreateParser('switch (a) { case c: {} case d: {} default: {}}');
  2128. E:=GetFirstStatement;
  2129. CheckClass(E,TJSSwitchStatement);
  2130. S:=TJSSwitchStatement(E);
  2131. AssertNotNull('Have condition',S.Cond);
  2132. AssertNotNull('Have default',S.TheDefault);
  2133. AssertIdentifier('Case condition',S.Cond,'a');
  2134. S:=TJSSwitchStatement(E);
  2135. AssertEquals('2 cases',3,S.Cases.Count);
  2136. C:=TJSCaseElement(S.Cases[0]);
  2137. AssertIdentifier('Case expression',C.Expr,'c');
  2138. CheckClass(C.Body,TJSEmptyBlockStatement);
  2139. C:=TJSCaseElement(S.Cases[1]);
  2140. AssertIdentifier('Case expression',C.Expr,'d');
  2141. CheckClass(C.Body,TJSEmptyBlockStatement);
  2142. C:=TJSCaseElement(S.Cases[2]);
  2143. CheckClass(C.Body,TJSEmptyBlockStatement);
  2144. AssertSame('Default',C,S.TheDefault);
  2145. end;
  2146. procedure TTestJSParser.TestBreak;
  2147. Var
  2148. E : TJSElement;
  2149. C : TJSBreakStatement;
  2150. begin
  2151. CreateParser('while (true) break;');
  2152. E:=GetFirstStatement;
  2153. CheckClass(E,TJSWhileStatement);
  2154. E:=TJSWhileStatement(E).Body;
  2155. CheckClass(E,TJSBreakStatement);
  2156. C:=TJSBreakStatement(E);
  2157. AssertEquals('Have correct (empty) label','',C.TargetName);
  2158. end;
  2159. procedure TTestJSParser.TestIfElseSimple;
  2160. Var
  2161. E : TJSElement;
  2162. I : TJSIfStatement;
  2163. begin
  2164. CreateParser('if (a) b; else c;');
  2165. E:=GetFirstStatement;
  2166. CheckClass(E,TJSIfStatement);
  2167. I:=TJSIfStatement(E);
  2168. AssertNotNull('Statement condition assigned',I.Cond);
  2169. CheckClass(I.Cond,TJSPrimaryExpressionIdent);
  2170. AssertEquals('a',TJSPrimaryExpressionIdent(I.Cond).Name);
  2171. AssertNotNull('Statement condition assigned',I.Btrue);
  2172. CheckClass(I.Btrue,TJSExpressionStatement);
  2173. AssertNotNull('Expression statement expression',TJSExpressionStatement(I.BTrue).A);
  2174. CheckClass(TJSExpressionStatement(I.BTrue).A,TJSPrimaryExpressionIdent);
  2175. AssertEquals('b',TJSPrimaryExpressionIdent(TJSExpressionStatement(I.Btrue).A).Name);
  2176. AssertNotNull('Else Statement condition assigned',I.BFalse);
  2177. CheckClass(I.BFalse,TJSExpressionStatement);
  2178. AssertNotNull('Else statement expression',TJSExpressionStatement(I.BFalse).A);
  2179. CheckClass(TJSExpressionStatement(I.BFalse).A,TJSPrimaryExpressionIdent);
  2180. AssertEquals('c',TJSPrimaryExpressionIdent(TJSExpressionStatement(I.BFalse).A).Name);
  2181. end;
  2182. procedure TTestJSParser.TestExpressionPrecedenceMulNot;
  2183. Var
  2184. X : TJSExpressionStatement;
  2185. R : TJSUnaryNotExpression;
  2186. E : TJSMultiplicativeExpressionMul;
  2187. begin
  2188. CreateParser('4 * !2;');
  2189. X:=GetExpressionStatement;
  2190. AssertNotNull('Expression statement assigned',X.A);
  2191. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  2192. E:=TJSMultiplicativeExpressionMul(X.A);
  2193. AssertNotNull('Expression left operand assigned',E.A);
  2194. AssertNotNull('Expression right operand assigned',E.B);
  2195. CheckClass(E.B,TJSUnaryNotExpression);
  2196. R:=TJSUnaryNotExpression(E.B);
  2197. CheckClass(E.A,TJSLiteral);
  2198. AssertNotNull('Multiplication left operand assigned',R.A);
  2199. CheckClass(R.A,TJSLiteral);
  2200. AssertEquals('Not operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  2201. AssertEquals('Not operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  2202. AssertNotNull('Multiplication left operand value assigned',TJSLiteral(E.A).Value);
  2203. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  2204. AssertEquals('Multiplication left operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  2205. end;
  2206. procedure TTestJSParser.TestExpressionPrecedencePlusPreMinusMinus;
  2207. Var
  2208. X : TJSExpressionStatement;
  2209. R : TJSUnaryPreMinusMinusExpression;
  2210. E : TJSAdditiveExpressionPlus;
  2211. begin
  2212. CreateParser('4 + --2;');
  2213. X:=GetExpressionStatement;
  2214. AssertNotNull('Expression statement assigned',X.A);
  2215. CheckClass(X.A,TJSAdditiveExpressionPlus);
  2216. E:=TJSAdditiveExpressionPlus(X.A);
  2217. AssertNotNull('Expression left operand assigned',E.A);
  2218. AssertNotNull('Expression right operand assigned',E.B);
  2219. CheckClass(E.B,TJSUnaryPreMinusMinusExpression);
  2220. R:=TJSUnaryPreMinusMinusExpression(E.B);
  2221. CheckClass(E.A,TJSLiteral);
  2222. AssertNotNull('Multiplication left operand assigned',R.A);
  2223. CheckClass(R.A,TJSLiteral);
  2224. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  2225. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  2226. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.A).Value);
  2227. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  2228. AssertEquals('Expression right operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  2229. end;
  2230. procedure TTestJSParser.TestExpressionPrecedenceMulPrePlusPlus;
  2231. Var
  2232. X : TJSExpressionStatement;
  2233. R : TJSUnaryPrePlusPlusExpression;
  2234. E : TJSMultiplicativeExpressionMul;
  2235. begin
  2236. CreateParser('4 * ++2;');
  2237. X:=GetExpressionStatement;
  2238. AssertNotNull('Expression statement assigned',X.A);
  2239. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  2240. E:=TJSMultiplicativeExpressionMul(X.A);
  2241. AssertNotNull('Expression left operand assigned',E.A);
  2242. AssertNotNull('Expression right operand assigned',E.B);
  2243. CheckClass(E.B,TJSUnaryPrePlusPlusExpression);
  2244. R:=TJSUnaryPrePlusPlusExpression(E.B);
  2245. CheckClass(E.A,TJSLiteral);
  2246. AssertNotNull('Multiplication left operand assigned',R.A);
  2247. CheckClass(R.A,TJSLiteral);
  2248. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  2249. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  2250. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.A).Value);
  2251. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  2252. AssertEquals('Expression right operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  2253. end;
  2254. procedure TTestJSParser.TestExpressionPrecedenceMulPreMinusMinus;
  2255. Var
  2256. X : TJSExpressionStatement;
  2257. R : TJSUnaryPreMinusMinusExpression;
  2258. E : TJSMultiplicativeExpressionMul;
  2259. begin
  2260. CreateParser('4 * --2;');
  2261. X:=GetExpressionStatement;
  2262. AssertNotNull('Expression statement assigned',X.A);
  2263. CheckClass(X.A,TJSMultiplicativeExpressionMul);
  2264. E:=TJSMultiplicativeExpressionMul(X.A);
  2265. AssertNotNull('Expression left operand assigned',E.A);
  2266. AssertNotNull('Expression right operand assigned',E.B);
  2267. CheckClass(E.B,TJSUnaryPreMinusMinusExpression);
  2268. R:=TJSUnaryPreMinusMinusExpression(E.B);
  2269. CheckClass(E.A,TJSLiteral);
  2270. AssertNotNull('Multiplication left operand assigned',R.A);
  2271. CheckClass(R.A,TJSLiteral);
  2272. AssertEquals('Multiplication left operand type correct', jstNumber, TJSLiteral(R.A).Value.ValueType);
  2273. AssertEquals('Multiplication left operand value correct', 2.0, TJSLiteral(R.A).Value.AsNumber);
  2274. AssertNotNull('Addition right operand value assigned',TJSLiteral(E.A).Value);
  2275. AssertEquals('Addition left operand type correct', jstNumber, TJSLiteral(E.A).Value.ValueType);
  2276. AssertEquals('Expression right operand value correct', 4.0,TJSLiteral(E.A).Value.AsNumber);
  2277. end;
  2278. procedure TTestJSParser.TestSimpleExpressionBooleanLiteralTrue;
  2279. Var
  2280. X : TJSExpressionStatement;
  2281. begin
  2282. CreateParser('true;');
  2283. X:=GetExpressionStatement;
  2284. AssertNotNull('Expression statement assigned',X.A);
  2285. CheckClass(X.A,TJSLiteral);
  2286. AssertNotNull('Expression value assigned',TJSLiteral(X.A).Value);
  2287. AssertEquals('Expression value type correct', jstBoolean,TJSLiteral(X.A).Value.ValueType);
  2288. AssertEquals('Expression value correct', True, TJSLiteral(X.A).Value.AsBoolean);
  2289. end;
  2290. procedure TTestJSParser.TestEmpty;
  2291. Var
  2292. E : TJSElement;
  2293. FB : TJSFunctionBody;
  2294. SE : TJSSourceElements;
  2295. begin
  2296. CreateParser('var a;');
  2297. E:=FParser.Parse;
  2298. try
  2299. CheckClass(E,TJSFunctionBody);
  2300. FB:=TJSFunctionBody(E);
  2301. AssertNotNull(FB.A);
  2302. CheckClass(FB.A,TJSSourceElements);
  2303. SE:=TJSSourceElements(FB.A);
  2304. AssertEquals('1 variable declaration ',1,SE.Vars.Count);
  2305. CheckClass(FB.A,TJSSourceElements);
  2306. finally
  2307. E.Free;
  2308. end;
  2309. end;
  2310. procedure TTestJSParser.SetUp;
  2311. begin
  2312. FParser:=Nil;
  2313. FSource:=Nil;
  2314. end;
  2315. procedure TTestJSParser.TearDown;
  2316. begin
  2317. FreeAndNil(FToFree);
  2318. FreeAndNil(FParser);
  2319. FReeAndNil(FSource);
  2320. end;
  2321. Procedure TTestJSParser.CreateParser(Const ASource: string; aVersion : TECMAVersion = TECMAVersion.ecma5);
  2322. begin
  2323. FSource:=TStringStream.Create(ASource);
  2324. FParser:=TJSParser.Create(FSource,aVersion);
  2325. end;
  2326. Procedure TTestJSParser.CheckClass(E: TJSElement; C: TJSElementClass);
  2327. begin
  2328. AssertEquals(C,E.ClassType);
  2329. end;
  2330. Function TTestJSParser.GetSourceElements: TJSSourceElements;
  2331. Var
  2332. E : TJSElement;
  2333. FB : TJSFunctionBody;
  2334. begin
  2335. If Not Assigned(FSE) then
  2336. begin
  2337. AssertNotNull('Parser assigned',FParser);
  2338. E:=FParser.Parse;
  2339. CheckClass(E,TJSFunctionBody);
  2340. FB:=TJSFunctionBody(E);
  2341. AssertNotNull(FB.A);
  2342. CheckClass(FB.A,TJSSourceElements);
  2343. FSE:=TJSSourceElements(FB.A);
  2344. FToFree:=E;
  2345. end;
  2346. Result:=FSE;
  2347. end;
  2348. Function TTestJSParser.GetVars: TJSElementNodes;
  2349. begin
  2350. Result:=GetSourceElements.Vars;
  2351. end;
  2352. Function TTestJSParser.GetStatements: TJSElementNodes;
  2353. begin
  2354. Result:=GetSourceElements.Statements;
  2355. end;
  2356. Function TTestJSParser.GetFunctions: TJSElementNodes;
  2357. begin
  2358. Result:=GetSourceElements.Functions;
  2359. end;
  2360. initialization
  2361. RegisterTest(TTestJSParser);
  2362. end.