tcwriter.pp 81 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144
  1. unit tcwriter;
  2. {$mode objfpc}
  3. {$H+}
  4. {$codepage utf8}
  5. interface
  6. uses
  7. Classes, SysUtils, fpcunit, testregistry, jsbase, jstree, jswriter;
  8. type
  9. { TTestJSWriter }
  10. TTestJSWriter = class(TTestCase)
  11. private
  12. FElement: TJSElement;
  13. FTextWriter: TBufferWriter;
  14. FWriter: TJSWriter;
  15. protected
  16. procedure SetUp; override;
  17. procedure TearDown; override;
  18. Procedure WriteElement(JS : TJSElement); // Set element in Element, write. Freed on teardown
  19. Procedure AssertResult(Const Msg, Result : AnsiString); // Compare result;
  20. Procedure AssertResult(Const Msg : string; Result : UnicodeString); // Compare result;
  21. Procedure AssertWrite(Const Msg : String; Result : AnsiString; AElement : TJSElement); // Call writelement, compare result;
  22. Procedure AssertWrite(Const Msg : string; Result : UnicodeString; AElement : TJSElement); // Call writelement, compare result;
  23. Function CreateIdent(Const AName : String) : TJSPrimaryExpressionIdent;
  24. Function CreateLiteral(Const AValue : TJSString) : TJSLiteral;
  25. Function CreateLiteral(Const AValue : Integer) : TJSLiteral;
  26. Function CreateLiteral(Const AValue : Boolean) : TJSLiteral;
  27. Property TextWriter : TBufferWriter Read FTextWriter;
  28. Property Writer : TJSWriter Read FWriter;
  29. Property Element : TJSElement read FElement;
  30. end;
  31. TTestTestJSWriter = Class(TTestJSWriter)
  32. published
  33. procedure TestEmpty;
  34. end;
  35. { TTestLiteralWriter }
  36. TTestLiteralWriter= class(TTestJSWriter)
  37. published
  38. Procedure TestInteger;
  39. Procedure TestBooleanTrue;
  40. Procedure TestBooleanFalse;
  41. Procedure TestUndefined;
  42. Procedure TestNull;
  43. Procedure TestString;
  44. Procedure TestStringQuote;
  45. Procedure TestStringBackslash;
  46. Procedure TestStringslash;
  47. Procedure TestStringsBack;
  48. Procedure TestStringsTab;
  49. Procedure TestStringsLineFeed;
  50. Procedure TestStringsFormFeed;
  51. Procedure TestStringsCarriageReturn;
  52. Procedure TestArrayEmpty;
  53. Procedure TestArrayEmptyCompact;
  54. Procedure TestArrayOneElement;
  55. Procedure TestArrayOneElementCompact;
  56. Procedure TestArrayOneElementIndent;
  57. Procedure TestArrayTwoElements;
  58. Procedure TestArrayTwoElementsCompact;
  59. Procedure TestArrayTwoElementsCompact2;
  60. Procedure TestArrayThreeElementsCompact;
  61. Procedure TestObjectEmpty;
  62. Procedure TestObjectEmptyCompact;
  63. Procedure TestObjectOneElement;
  64. Procedure TestObjectOneElementCompact;
  65. Procedure TestObjectOneElementIndent;
  66. Procedure TestObjectOneElementCompactQuoted;
  67. Procedure TestObjectTwoElements;
  68. Procedure TestObjectTwoElementCompact;
  69. Procedure TestObjectTwoElementCompact2;
  70. Procedure TestObjectTwoElementCompactQuoted;
  71. Procedure TestObjectThreeElementsCompact;
  72. end;
  73. { TTestStatementWriter }
  74. TTestStatementWriter = class(TTestJSWriter)
  75. Public
  76. Procedure TestAssignment(Const Msg : String; AClass : TJSAssignStatementClass; Result : String;ACompact : Boolean);
  77. Function CreateAssignment(AClass : TJSAssignStatementClass) : TJSAssignStatement;
  78. Function CreateStatementListOneElement : TJSStatementList;
  79. Function CreateStatementListTwoElement2 : TJSStatementList;
  80. published
  81. Procedure TestEmptyStatement;
  82. Procedure TestEmptyStatementComment;
  83. Procedure TestEmptyStatementBlock;
  84. Procedure TestEmptyStatementBlockIndent;
  85. Procedure TestEmptyStatementBlockCompact;
  86. Procedure TestVarDeclaration;
  87. Procedure TestVarDeclarationInit;
  88. Procedure TestVarListDeclaration;
  89. Procedure TestVarListDeclarationInit;
  90. Procedure TestVarDeclarationStatement;
  91. Procedure TestLetDeclarationStatement;
  92. Procedure TestConstDeclarationStatement;
  93. Procedure TestDebuggerStatement;
  94. Procedure TestVarListDeclarationStatement;
  95. Procedure TestConstListDeclarationStatement;
  96. Procedure TestVarListDeclarationStatement2Vars;
  97. Procedure TestVarListDeclarationStatement3Vars;
  98. Procedure TestReturnStatement;
  99. Procedure TestLabeledStatement;
  100. Procedure TestLabeledStatementCompact;
  101. Procedure TestContinueStatement;
  102. Procedure TestContinueTargetStatement;
  103. Procedure TestBreakStatement;
  104. Procedure TestBreakTargetStatement;
  105. Procedure TestAssignmentStatementSimple;
  106. Procedure TestAssignmentStatementSimpleCompact;
  107. Procedure TestAssignmentStatementAdd;
  108. Procedure TestAssignmentStatementAddCompact;
  109. Procedure TestAssignmentStatementSubtract;
  110. Procedure TestAssignmentStatementSubtractCompact;
  111. Procedure TestAssignmentStatementMultiply;
  112. Procedure TestAssignmentStatementMultiplyCompact;
  113. Procedure TestAssignmentStatementDivide;
  114. Procedure TestAssignmentStatementDivideCompact;
  115. Procedure TestAssignmentStatementShift;
  116. Procedure TestAssignmentStatementShiftCompact;
  117. Procedure TestAssignmentStatementRShift;
  118. Procedure TestAssignmentStatementRShiftCompact;
  119. Procedure TestAssignmentStatementURShift;
  120. Procedure TestAssignmentStatementURShiftCompact;
  121. Procedure TestAssignmentStatementMod;
  122. Procedure TestAssignmentStatementModCompact;
  123. Procedure TestAssignmentStatementBinaryOr;
  124. Procedure TestAssignmentStatementBinaryOrCompact;
  125. Procedure TestAssignmentStatementBinaryXOr;
  126. Procedure TestAssignmentStatementBinaryXOrCompact;
  127. Procedure TestAssignmentStatementBinaryAnd;
  128. Procedure TestAssignmentStatementBinaryAndCompact;
  129. Procedure TestForStatementEmpty;
  130. Procedure TestForStatementFull;
  131. Procedure TestForStatementFull1;
  132. Procedure TestForStatementCompact;
  133. Procedure TestForStatement2loops2inits;
  134. Procedure TestForInStatement;
  135. Procedure TestWhileStatement;
  136. Procedure TestDoWhileStatement;
  137. Procedure TestSwitchStatementEmpty;
  138. Procedure TestSwitchStatementEmptyCompact;
  139. Procedure TestSwitchStatementOneElement;
  140. Procedure TestSwitchStatementOneElementCompact;
  141. Procedure TestSwitchStatementTwoElements;
  142. Procedure TestSwitchStatementTwoElementsCompact;
  143. Procedure TestSwitchStatementTwoElementsDefault;
  144. Procedure TestSwitchStatementTwoElementsDefaultCompact;
  145. Procedure TestSwitchStatementTwoElementsOneEmpty;
  146. Procedure TestSwitchStatementTwoElementsOneEmptyCompact;
  147. Procedure TestIfThen;
  148. Procedure TestIfThenElse;
  149. Procedure TestStatementListEmpty;
  150. Procedure TestStatementListEmptyCompact;
  151. Procedure TestStatementListOneStatement;
  152. Procedure TestStatementListOneStatementCompact;
  153. Procedure TestStatementListTwoStatements;
  154. Procedure TestStatementListTwoStatementsCompact;
  155. Procedure TestStatementListTree4;
  156. Procedure TestStatementListFor;
  157. Procedure TestEmptyFunctionDef;
  158. Procedure TestEmptyFunctionDefCompact;
  159. Procedure TestFunctionDefParams;
  160. Procedure TestFunctionDefParamsCompact;
  161. Procedure TestFunctionDefBody1;
  162. Procedure TestFunctionDefBody1Compact;
  163. Procedure TestFunctionDefBody2;
  164. Procedure TestFunctionDefBody2Compact;
  165. Procedure TestFunctionDefAsync;
  166. Procedure TestTryCatch;
  167. Procedure TestTryCatchCompact;
  168. Procedure TestTryFinally;
  169. Procedure TestTryFinallyCompact;
  170. Procedure TestTryCatchFinally;
  171. Procedure TestTryCatchFinallyCompact;
  172. Procedure TestWith;
  173. Procedure TestWithCompact;
  174. Procedure TestSourceElements;
  175. Procedure TestSourceElementsCompact;
  176. Procedure TestImportModule;
  177. Procedure TestImportDefaultBinding;
  178. Procedure TestImportDefaultBindingNameSpace;
  179. Procedure TestImportNameSpace;
  180. Procedure TestImportNamedImport;
  181. Procedure TestImportNamedImportAlias;
  182. Procedure TestImport2NamedImport;
  183. Procedure TestImportDefaultBindingNamedImport;
  184. Procedure TestExportAll;
  185. Procedure TestExportAllFrom;
  186. Procedure TestExportExportName;
  187. Procedure TestExportExportNameAlias;
  188. Procedure TestExportExportNameFrom;
  189. Procedure TestExportVar;
  190. Procedure TestExportLet;
  191. Procedure TestExportConst;
  192. Procedure TestExportFunction;
  193. Procedure TestExportDefaultAssignment;
  194. Procedure TestExportDefaultFunction;
  195. Procedure TestExportDefaultAsyncFunction;
  196. end;
  197. { TTestExpressionWriter }
  198. TTestExpressionWriter = class(TTestJSWriter)
  199. Protected
  200. Procedure TestUnary(Const Msg : String; AClass : TJSUnaryClass; Result : String);
  201. Procedure TestBinary(Const Msg : String; AClass : TJSBinaryClass; Result : String; ACompact : Boolean);
  202. Procedure TestBinaryNested(Const Msg : String; AClass : TJSBinaryClass; Result : String; ACompact : Boolean);
  203. Published
  204. Procedure TestIdent;
  205. Procedure TestThis;
  206. Procedure TestThrowStatement;
  207. Procedure TestUnaryDelete;
  208. Procedure TestUnaryVoid;
  209. Procedure TestUnaryTypeOf;
  210. Procedure TestUnaryAwait;
  211. Procedure TestUnaryYield;
  212. Procedure TestPrefixPlusPLus;
  213. Procedure TestPrefixMinusMinus;
  214. Procedure TestUnaryMinus;
  215. Procedure TestUnaryPlus;
  216. Procedure TestUnaryInv;
  217. Procedure TestUnaryNot;
  218. Procedure TestPostPlusPLus;
  219. Procedure TestPostMinusMinus;
  220. Procedure TestBinaryLogicalOr;
  221. Procedure TestBinaryLogicalOrCompact;
  222. Procedure TestBinaryLogicalOrNested;
  223. Procedure TestBinaryLogicalAnd;
  224. Procedure TestBinaryLogicalAndCompact;
  225. Procedure TestBinaryLogicalAndNested;
  226. Procedure TestBinaryBitwiseOr;
  227. Procedure TestBinaryBitwiseOrCompact;
  228. Procedure TestBinaryBitwiseAnd;
  229. Procedure TestBinaryBitwiseAndCompact;
  230. Procedure TestBinaryBitwiseXOr;
  231. Procedure TestBinaryBitwiseXOrCompact;
  232. Procedure TestBinaryEQ;
  233. Procedure TestBinaryEQCompact;
  234. Procedure TestBinaryNE;
  235. Procedure TestBinaryNECompact;
  236. Procedure TestBinarySEQ;
  237. Procedure TestBinarySEQCompact;
  238. Procedure TestBinarySNE;
  239. Procedure TestBinarySNECompact;
  240. Procedure TestBinaryLT;
  241. Procedure TestBinaryLTCompact;
  242. Procedure TestBinaryGT;
  243. Procedure TestBinaryGTCompact;
  244. Procedure TestBinaryLE;
  245. Procedure TestBinaryLECompact;
  246. Procedure TestBinaryGE;
  247. Procedure TestBinaryGECompact;
  248. Procedure TestBinaryIN;
  249. Procedure TestBinaryINCompact;
  250. Procedure TestBinaryInstanceOf;
  251. Procedure TestBinaryInstanceOfCompact;
  252. Procedure TestBinaryLShift;
  253. Procedure TestBinaryLShiftOfCompact;
  254. Procedure TestBinaryRShift;
  255. Procedure TestBinaryRShiftOfCompact;
  256. Procedure TestBinaryURShift;
  257. Procedure TestBinaryURShiftOfCompact;
  258. Procedure TestBinaryPlus;
  259. Procedure TestBinaryPlusCompact;
  260. Procedure TestBinaryPlusNested;
  261. Procedure TestBinaryMinus;
  262. Procedure TestBinaryMinusCompact;
  263. Procedure TestBinaryMinusNested;
  264. Procedure TestBinaryMultiply;
  265. Procedure TestBinaryMultiplyCompact;
  266. Procedure TestBinaryMultiplyNested;
  267. Procedure TestBinaryDivide;
  268. Procedure TestBinaryDivideCompact;
  269. Procedure TestBinaryMod;
  270. Procedure TestBinaryModCompact;
  271. Procedure TestBinaryComma;
  272. Procedure TestBinaryCommaCompact;
  273. Procedure TestBinaryCallDiv;
  274. Procedure TestDotMember;
  275. Procedure TestArgMember;
  276. Procedure TestNewMember;
  277. Procedure TestNewMemberCompact;
  278. Procedure TestNewMemberNoArgs;
  279. Procedure TestCall;
  280. Procedure TestCallCompact;
  281. Procedure TestCallCompact2;
  282. Procedure TestCallNoArgs;
  283. Procedure TestConditional;
  284. Procedure TestRegularExpressionLiteral;
  285. Procedure TestRegularExpressionLiteralFlags;
  286. end;
  287. implementation
  288. { TTestExpressionWriter }
  289. procedure TTestExpressionWriter.TestUnary(const Msg: String;
  290. AClass: TJSUnaryClass; Result: String);
  291. Var
  292. U : TJSUnary;
  293. begin
  294. U:=AClass.Create(0,0);
  295. U.A:=CreateIdent('a');
  296. AssertWrite(Msg,Result,U);
  297. end;
  298. procedure TTestExpressionWriter.TestBinary(const Msg: String;
  299. AClass: TJSBinaryClass; Result: String; ACompact: Boolean);
  300. Var
  301. U : TJSBinary;
  302. begin
  303. if ACompact then
  304. Writer.Options:=Writer.Options+[woCompact];
  305. U:=AClass.Create(0,0);
  306. U.A:=CreateIdent('a');
  307. U.B:=CreateIdent('b');
  308. AssertWrite(Msg,Result,U);
  309. end;
  310. procedure TTestExpressionWriter.TestBinaryNested(const Msg: String;
  311. AClass: TJSBinaryClass; Result: String; ACompact: Boolean);
  312. var
  313. U: TJSBinary;
  314. begin
  315. if ACompact then
  316. Writer.Options:=Writer.Options+[woCompact];
  317. U:=AClass.Create(0,0);
  318. U.A:=AClass.Create(0,0);
  319. TJSBinary(U.A).A:=CreateIdent('a');
  320. TJSBinary(U.A).B:=CreateIdent('b');
  321. U.B:=AClass.Create(0,0);
  322. TJSBinary(U.B).A:=CreateIdent('c');
  323. TJSBinary(U.B).B:=CreateIdent('d');
  324. AssertWrite(Msg,Result,U);
  325. end;
  326. procedure TTestExpressionWriter.TestIdent;
  327. begin
  328. AssertWrite('ABC','ABC',CreateIdent('ABC'));
  329. end;
  330. procedure TTestExpressionWriter.TestThis;
  331. begin
  332. AssertWrite('this','this',TJSPrimaryExpressionThis.Create(0,0));
  333. end;
  334. procedure TTestExpressionWriter.TestThrowStatement;
  335. begin
  336. TestUnary('Throw expresssion',TJSThrowStatement,'throw a');
  337. end;
  338. procedure TTestExpressionWriter.TestUnaryDelete;
  339. begin
  340. TestUnary('Delete expresssion',TJSUnaryDeleteExpression,'delete a');
  341. end;
  342. procedure TTestExpressionWriter.TestUnaryVoid;
  343. begin
  344. TestUnary('Void expresssion',TJSUnaryVoidExpression,'void a');
  345. end;
  346. procedure TTestExpressionWriter.TestUnaryTypeOf;
  347. begin
  348. TestUnary('typeof expresssion',TJSUnaryTypeOfExpression,'typeof a');
  349. end;
  350. procedure TTestExpressionWriter.TestUnaryAwait;
  351. begin
  352. TestUnary('await expresssion',TJSAwaitExpression,'await a');
  353. end;
  354. procedure TTestExpressionWriter.TestUnaryYield;
  355. begin
  356. TestUnary('await expresssion',TJSYieldExpression,'yield a');
  357. end;
  358. procedure TTestExpressionWriter.TestPrefixPlusPLus;
  359. begin
  360. TestUnary('prefix ++ expresssion',TJSUnaryPrePlusPlusExpression,'++a');
  361. end;
  362. procedure TTestExpressionWriter.TestPrefixMinusMinus;
  363. begin
  364. TestUnary('prefix -- expresssion',TJSUnaryPreMinusMinusExpression,'--a');
  365. end;
  366. procedure TTestExpressionWriter.TestUnaryMinus;
  367. begin
  368. TestUnary('unary - expresssion',TJSUnaryMinusExpression,'-a');
  369. end;
  370. procedure TTestExpressionWriter.TestUnaryPlus;
  371. begin
  372. TestUnary('unary + expresssion',TJSUnaryPlusExpression,'+a');
  373. end;
  374. procedure TTestExpressionWriter.TestUnaryInv;
  375. begin
  376. TestUnary('unary invert expresssion',TJSUnaryInvExpression,'~a');
  377. end;
  378. procedure TTestExpressionWriter.TestUnaryNot;
  379. begin
  380. TestUnary('unary not expresssion',TJSUnaryNotExpression,'!a');
  381. end;
  382. procedure TTestExpressionWriter.TestPostPlusPLus;
  383. begin
  384. TestUnary('postfix ++ expresssion',TJSUnaryPostPlusPlusExpression,'a++');
  385. end;
  386. procedure TTestExpressionWriter.TestPostMinusMinus;
  387. begin
  388. TestUnary('postfix -- expresssion',TJSUnaryPostMinusMinusExpression,'a--');
  389. end;
  390. procedure TTestExpressionWriter.TestBinaryLogicalOr;
  391. begin
  392. TestBinary('logical or',TJSLogicalOrExpression,'(a || b)',False);
  393. end;
  394. procedure TTestExpressionWriter.TestBinaryLogicalOrCompact;
  395. begin
  396. TestBinary('logical or',TJSLogicalOrExpression,'(a||b)',True);
  397. end;
  398. procedure TTestExpressionWriter.TestBinaryLogicalOrNested;
  399. begin
  400. TestBinaryNested('logical or',TJSLogicalOrExpression,'(a||b||c||d)',True);
  401. end;
  402. procedure TTestExpressionWriter.TestBinaryLogicalAnd;
  403. begin
  404. TestBinary('logical or',TJSLogicalAndExpression,'(a && b)',False);
  405. end;
  406. procedure TTestExpressionWriter.TestBinaryLogicalAndCompact;
  407. begin
  408. TestBinary('logical or',TJSLogicalAndExpression,'(a&&b)',True);
  409. end;
  410. procedure TTestExpressionWriter.TestBinaryLogicalAndNested;
  411. begin
  412. TestBinaryNested('logical and',TJSLogicalAndExpression,'(a&&b&&c&&d)',True);
  413. end;
  414. procedure TTestExpressionWriter.TestBinaryBitwiseOr;
  415. begin
  416. TestBinary('Bitwise or',TJSBitwiseOrExpression,'(a | b)',False);
  417. end;
  418. procedure TTestExpressionWriter.TestBinaryBitwiseOrCompact;
  419. begin
  420. TestBinary('Bitwise or',TJSBitwiseOrExpression,'(a|b)',True);
  421. end;
  422. procedure TTestExpressionWriter.TestBinaryBitwiseAnd;
  423. begin
  424. TestBinary('Bitwise and',TJSBitwiseAndExpression,'(a & b)',False);
  425. end;
  426. procedure TTestExpressionWriter.TestBinaryBitwiseAndCompact;
  427. begin
  428. TestBinary('Bitwise and',TJSBitwiseAndExpression,'(a&b)',True);
  429. end;
  430. procedure TTestExpressionWriter.TestBinaryBitwiseXOr;
  431. begin
  432. TestBinary('Bitwise xor',TJSBitwiseXOrExpression,'(a ^ b)',False);
  433. end;
  434. procedure TTestExpressionWriter.TestBinaryBitwiseXOrCompact;
  435. begin
  436. TestBinary('Bitwise xor',TJSBitwiseXOrExpression,'(a^b)',True);
  437. end;
  438. procedure TTestExpressionWriter.TestBinaryEQ;
  439. begin
  440. TestBinary('Equal',TJSEqualityExpressionEQ,'(a == b)',False);
  441. end;
  442. procedure TTestExpressionWriter.TestBinaryEQCompact;
  443. begin
  444. TestBinary('Equal',TJSEqualityExpressionEQ,'(a==b)',True);
  445. end;
  446. procedure TTestExpressionWriter.TestBinaryNE;
  447. begin
  448. TestBinary('Not Equal',TJSEqualityExpressionNE,'(a != b)',False);
  449. end;
  450. procedure TTestExpressionWriter.TestBinaryNECompact;
  451. begin
  452. TestBinary('Not Equal',TJSEqualityExpressionNE,'(a!=b)',True);
  453. end;
  454. procedure TTestExpressionWriter.TestBinarySEQ;
  455. begin
  456. TestBinary('Strictly Equal',TJSEqualityExpressionSEQ,'(a === b)',False);
  457. end;
  458. procedure TTestExpressionWriter.TestBinarySEQCompact;
  459. begin
  460. TestBinary('Strictly Equal',TJSEqualityExpressionSEQ,'(a===b)',True);
  461. end;
  462. procedure TTestExpressionWriter.TestBinarySNE;
  463. begin
  464. TestBinary('Strictly Equal',TJSEqualityExpressionSNE,'(a !== b)',False);
  465. end;
  466. procedure TTestExpressionWriter.TestBinarySNECompact;
  467. begin
  468. TestBinary('Strictly Equal',TJSEqualityExpressionSNE,'(a!==b)',True);
  469. end;
  470. procedure TTestExpressionWriter.TestBinaryLT;
  471. begin
  472. TestBinary('Less than',TJSRelationalExpressionLT,'(a < b)',False);
  473. end;
  474. procedure TTestExpressionWriter.TestBinaryLTCompact;
  475. begin
  476. TestBinary('Less than',TJSRelationalExpressionLT,'(a<b)',True);
  477. end;
  478. procedure TTestExpressionWriter.TestBinaryGT;
  479. begin
  480. TestBinary('Greater than',TJSRelationalExpressionGT,'(a > b)',False);
  481. end;
  482. procedure TTestExpressionWriter.TestBinaryGTCompact;
  483. begin
  484. TestBinary('Greater than',TJSRelationalExpressionGT,'(a>b)',True);
  485. end;
  486. procedure TTestExpressionWriter.TestBinaryLE;
  487. begin
  488. TestBinary('Less than or equal',TJSRelationalExpressionLE,'(a <= b)',False);
  489. end;
  490. procedure TTestExpressionWriter.TestBinaryLECompact;
  491. begin
  492. TestBinary('Less than or equal',TJSRelationalExpressionLE,'(a<=b)',True);
  493. end;
  494. procedure TTestExpressionWriter.TestBinaryGE;
  495. begin
  496. TestBinary('Greater than or equal',TJSRelationalExpressionGE,'(a >= b)',False);
  497. end;
  498. procedure TTestExpressionWriter.TestBinaryGECompact;
  499. begin
  500. TestBinary('Greater than or equal',TJSRelationalExpressionGE,'(a>=b)',True);
  501. end;
  502. procedure TTestExpressionWriter.TestBinaryIN;
  503. begin
  504. TestBinary('Prop in Object',TJSRelationalExpressionIN,'(a in b)',False);
  505. end;
  506. procedure TTestExpressionWriter.TestBinaryINCompact;
  507. begin
  508. TestBinary('Prop in Object',TJSRelationalExpressionIN,'(a in b)',True);
  509. end;
  510. procedure TTestExpressionWriter.TestBinaryInstanceOf;
  511. begin
  512. TestBinary('A instanceof Object',TJSRelationalExpressionInStanceOf,'(a instanceof b)',False);
  513. end;
  514. procedure TTestExpressionWriter.TestBinaryInstanceOfCompact;
  515. begin
  516. TestBinary('A instanceof Object',TJSRelationalExpressionInStanceOf,'(a instanceof b)',true);
  517. end;
  518. procedure TTestExpressionWriter.TestBinaryLShift;
  519. begin
  520. TestBinary('A lshift B',TJSLShiftExpression,'(a << b)',False);
  521. end;
  522. procedure TTestExpressionWriter.TestBinaryLShiftOfCompact;
  523. begin
  524. TestBinary('A lshift B',TJSLShiftExpression,'(a<<b)',True);
  525. end;
  526. procedure TTestExpressionWriter.TestBinaryRShift;
  527. begin
  528. TestBinary('A rshift B',TJSRShiftExpression,'(a >> b)',False);
  529. end;
  530. procedure TTestExpressionWriter.TestBinaryRShiftOfCompact;
  531. begin
  532. TestBinary('A rshift B',TJSRShiftExpression,'(a>>b)',True);
  533. end;
  534. procedure TTestExpressionWriter.TestBinaryURShift;
  535. begin
  536. TestBinary('A urshift B',TJSURShiftExpression,'(a >>> b)',False);
  537. end;
  538. procedure TTestExpressionWriter.TestBinaryURShiftOfCompact;
  539. begin
  540. TestBinary('A urshift B',TJSURShiftExpression,'(a>>>b)',True);
  541. end;
  542. procedure TTestExpressionWriter.TestBinaryPlus;
  543. begin
  544. TestBinary('A plus B',TJSAdditiveExpressionPlus,'(a + b)',False);
  545. end;
  546. procedure TTestExpressionWriter.TestBinaryPlusCompact;
  547. begin
  548. TestBinary('A plus B',TJSAdditiveExpressionPlus,'(a+b)',True);
  549. end;
  550. procedure TTestExpressionWriter.TestBinaryPlusNested;
  551. begin
  552. TestBinaryNested('(A+B)+(C+D)',TJSAdditiveExpressionPlus,'(a+b+(c+d))',True);
  553. end;
  554. procedure TTestExpressionWriter.TestBinaryMinus;
  555. begin
  556. TestBinary('A minus B',TJSAdditiveExpressionMinus,'(a - b)',False);
  557. end;
  558. procedure TTestExpressionWriter.TestBinaryMinusCompact;
  559. begin
  560. TestBinary('A minus B',TJSAdditiveExpressionMinus,'(a-b)',True);
  561. end;
  562. procedure TTestExpressionWriter.TestBinaryMinusNested;
  563. begin
  564. TestBinaryNested('(A-B)-(C-D)',TJSAdditiveExpressionMinus,'(a-b-(c-d))',True);
  565. end;
  566. procedure TTestExpressionWriter.TestBinaryMultiply;
  567. begin
  568. TestBinary('A multiply B',TJSMultiplicativeExpressionMul,'(a * b)',False);
  569. end;
  570. procedure TTestExpressionWriter.TestBinaryMultiplyCompact;
  571. begin
  572. TestBinary('A multiply B',TJSMultiplicativeExpressionMul,'(a*b)',True);
  573. end;
  574. procedure TTestExpressionWriter.TestBinaryMultiplyNested;
  575. begin
  576. TestBinaryNested('(A*B)*(C*D)',TJSMultiplicativeExpressionMul,'(a*b*(c*d))',True);
  577. end;
  578. procedure TTestExpressionWriter.TestBinaryDivide;
  579. begin
  580. TestBinary('A divide B',TJSMultiplicativeExpressionDiv,'(a / b)',False);
  581. end;
  582. procedure TTestExpressionWriter.TestBinaryDivideCompact;
  583. begin
  584. TestBinary('A divide B',TJSMultiplicativeExpressionDiv,'(a/b)',True);
  585. end;
  586. procedure TTestExpressionWriter.TestBinaryMod;
  587. begin
  588. TestBinary('A mod B',TJSMultiplicativeExpressionMod,'(a % b)',False);
  589. end;
  590. procedure TTestExpressionWriter.TestBinaryModCompact;
  591. begin
  592. TestBinary('A mod B',TJSMultiplicativeExpressionMod,'(a%b)',True);
  593. end;
  594. procedure TTestExpressionWriter.TestBinaryComma;
  595. begin
  596. TestBinary('A comma B',TJSCommaExpression,'(a, b)',False);
  597. end;
  598. procedure TTestExpressionWriter.TestBinaryCommaCompact;
  599. begin
  600. TestBinary('A comma B',TJSCommaExpression,'(a,b)',True);
  601. end;
  602. procedure TTestExpressionWriter.TestBinaryCallDiv;
  603. var
  604. aDiv: TJSMultiplicativeExpressionDiv;
  605. LeftMul: TJSMultiplicativeExpressionMul;
  606. LeftCall: TJSCallExpression;
  607. RightSub: TJSAdditiveExpressionMinus;
  608. Expr: String;
  609. begin
  610. // (2*f(3))/(a-4)
  611. aDiv:=TJSMultiplicativeExpressionDiv.Create(0,0);
  612. // (2*f(3))
  613. LeftMul:=TJSMultiplicativeExpressionMul.Create(0,0);
  614. aDiv.A:=LeftMul;
  615. // 2
  616. LeftMul.A:=CreateLiteral(2);
  617. // f(3)
  618. LeftCall:=TJSCallExpression.Create(0,0);
  619. LeftMul.B:=LeftCall;
  620. LeftCall.Expr:=CreateIdent('f');
  621. LeftCall.Args:=TJSArguments.Create(0,0);
  622. LeftCall.AddArg(CreateLiteral(3));
  623. // (a-4)
  624. RightSub:=TJSAdditiveExpressionMinus.Create(0,0);
  625. aDiv.B:=RightSub;
  626. RightSub.A:=CreateIdent('a');
  627. RightSub.B:=CreateLiteral(4);
  628. Expr:='((2 * f(3)) / (a - 4))';
  629. AssertWrite('keep needed brackets of '+Expr,Expr,aDiv);
  630. end;
  631. procedure TTestExpressionWriter.TestDotMember;
  632. Var
  633. U : TJSDotMemberExpression;
  634. begin
  635. U:=TJSDotMemberExpression.Create(0,0);
  636. U.Mexpr:=CreateIdent('a');
  637. U.Name:='b';
  638. AssertWrite('member b of object a (a.b)','a.b',U);
  639. end;
  640. procedure TTestExpressionWriter.TestArgMember;
  641. Var
  642. U : TJSBracketMemberExpression;
  643. begin
  644. U:=TJSBracketMemberExpression.Create(0,0);
  645. U.Mexpr:=CreateIdent('a');
  646. U.Name:=CreateIdent('b');
  647. AssertWrite('member b of object a (a[b])','a[b]',U);
  648. end;
  649. procedure TTestExpressionWriter.TestNewMember;
  650. Var
  651. U : TJSNewMemberExpression;
  652. begin
  653. U:=TJSNewMemberExpression.Create(0,0);
  654. U.Mexpr:=CreateIdent('a');;
  655. U.Args:=TJSArguments.Create(0,0);
  656. U.Args.Elements.AddElement;
  657. U.Args.Elements[0].Expr:=CreateLiteral(123);
  658. AssertWrite('member b of object a (a[b])','new a(123)',U);
  659. end;
  660. procedure TTestExpressionWriter.TestNewMemberCompact;
  661. Var
  662. U : TJSNewMemberExpression;
  663. begin
  664. Writer.Options:=Writer.Options+[woCompact];
  665. U:=TJSNewMemberExpression.Create(0,0);
  666. U.Mexpr:=CreateIdent('a');
  667. U.Args:=TJSArguments.Create(0,0);
  668. U.Args.Elements.AddElement;
  669. U.Args.Elements[0].Expr:=CreateLiteral(123);
  670. AssertWrite('new a(123)','new a(123)',U);
  671. end;
  672. procedure TTestExpressionWriter.TestNewMemberNoArgs;
  673. Var
  674. U : TJSNewMemberExpression;
  675. begin
  676. U:=TJSNewMemberExpression.Create(0,0);
  677. U.Mexpr:=CreateIdent('a');
  678. AssertWrite('new a()','new a()',U);
  679. end;
  680. procedure TTestExpressionWriter.TestCall;
  681. Var
  682. U : TJSCallExpression;
  683. begin
  684. U:=TJSCallExpression.Create(0,0);
  685. U.Expr:=CreateIdent('a');
  686. U.Args:=TJSArguments.Create(0,0);
  687. U.Args.Elements.AddElement;
  688. U.Args.Elements[0].Expr:=CreateLiteral(123);
  689. AssertWrite('call a(123)',
  690. 'a(123)',U);
  691. end;
  692. procedure TTestExpressionWriter.TestCallCompact;
  693. Var
  694. U : TJSCallExpression;
  695. begin
  696. Writer.Options:=Writer.Options+[woCompact];
  697. U:=TJSCallExpression.Create(0,0);
  698. U.Expr:=CreateIdent('a');
  699. U.Args:=TJSArguments.Create(0,0);
  700. U.Args.Elements.AddElement;
  701. U.Args.Elements[0].Expr:=CreateLiteral(123);
  702. AssertWrite('call a(123)','a(123)',U);
  703. end;
  704. procedure TTestExpressionWriter.TestCallCompact2;
  705. Var
  706. U : TJSCallExpression;
  707. begin
  708. Writer.Options:=Writer.Options+[woCompactArguments];
  709. U:=TJSCallExpression.Create(0,0);
  710. U.Expr:=CreateIdent('a');
  711. U.Args:=TJSArguments.Create(0,0);
  712. U.Args.Elements.AddElement;
  713. U.Args.Elements[0].Expr:=CreateLiteral(123);
  714. U.Args.Elements.AddElement;
  715. U.Args.Elements[1].Expr:=CreateLiteral(456);
  716. AssertWrite('call a(123,456)','a(123,456)',U);
  717. end;
  718. procedure TTestExpressionWriter.TestCallNoArgs;
  719. Var
  720. U : TJSCallExpression;
  721. begin
  722. U:=TJSCallExpression.Create(0,0);
  723. U.Expr:=CreateIdent('a');
  724. AssertWrite('call a()','a()',U);
  725. end;
  726. procedure TTestExpressionWriter.TestConditional;
  727. Var
  728. U : TJSConditionalExpression;
  729. begin
  730. U:=TJSConditionalExpression.Create(0,0);
  731. U.A:=CreateIdent('a');
  732. U.B:=CreateIdent('b');
  733. U.C:=CreateIdent('c');
  734. AssertWrite('a ? b : c','(a ? b : c)',U);
  735. end;
  736. procedure TTestExpressionWriter.TestRegularExpressionLiteral;
  737. Var
  738. S : TJSRegularExpressionLiteral;
  739. begin
  740. S:=TJSRegularExpressionLiteral.Create(0,0);
  741. S.Pattern.AsString:='a';
  742. AssertWrite('/a/','/a/',S);
  743. end;
  744. procedure TTestExpressionWriter.TestRegularExpressionLiteralFlags;
  745. Var
  746. S : TJSRegularExpressionLiteral;
  747. begin
  748. S:=TJSRegularExpressionLiteral.Create(0,0);
  749. S.Pattern.AsString:='a';
  750. S.PatternFlags.AsString:='g';
  751. AssertWrite('/a/g','/a/g',S);
  752. end;
  753. { ---------------------------------------------------------------------
  754. TTestStatementWriter
  755. ---------------------------------------------------------------------}
  756. procedure TTestStatementWriter.TestAssignment(const Msg: String;
  757. AClass: TJSAssignStatementClass; Result: String; ACompact: Boolean);
  758. Var
  759. U : TJSAssignStatement;
  760. begin
  761. if ACompact then
  762. Writer.Options:=Writer.Options+[woCompact];
  763. U:=CreateAssignment(AClass);
  764. AssertWrite(Msg,Result,U);
  765. end;
  766. function TTestStatementWriter.CreateAssignment(AClass: TJSAssignStatementClass
  767. ): TJSAssignStatement;
  768. begin
  769. if AClass=Nil then
  770. AClass := TJSSimpleAssignStatement;
  771. Result:=AClass.Create(0,0);
  772. Result.LHS:=CreateIdent('a');
  773. Result.Expr:=CreateIdent('b');
  774. end;
  775. function TTestStatementWriter.CreateStatementListOneElement: TJSStatementList;
  776. begin
  777. Result:=TJSStatementList.Create(0,0);
  778. Result.A:=CreateAssignment(nil);
  779. end;
  780. function TTestStatementWriter.CreateStatementListTwoElement2: TJSStatementList;
  781. begin
  782. Result:=TJSStatementList.Create(0,0);
  783. Result.A:=CreateAssignment(nil);
  784. Result.B:=CreateAssignment(nil);
  785. end;
  786. procedure TTestStatementWriter.TestEmptyStatement;
  787. begin
  788. AssertWrite('Empty statement','',TJSEmptyStatement.Create(0,0));
  789. end;
  790. procedure TTestStatementWriter.TestEmptyStatementComment;
  791. begin
  792. Writer.Options:=[woEmptyStatementAsComment,woUseUTF8];
  793. AssertWrite('Empty statement as comment','/* Empty statement */',TJSEmptyStatement.Create(0,0));
  794. end;
  795. procedure TTestStatementWriter.TestEmptyStatementBlock;
  796. begin
  797. AssertWrite('Empty statement block','{'+sLineBreak+'}',TJSEmptyBlockStatement.Create(0,0));
  798. end;
  799. procedure TTestStatementWriter.TestEmptyStatementBlockIndent;
  800. begin
  801. Writer.IndentSize:=2;
  802. Writer.Indent;
  803. AssertWrite('Empty statement block',' {'+sLineBreak+' }',TJSEmptyBlockStatement.Create(0,0));
  804. end;
  805. procedure TTestStatementWriter.TestEmptyStatementBlockCompact;
  806. begin
  807. Writer.Options:=[woCompact,woUseUTF8];
  808. AssertWrite('Empty statement block','{}',TJSEmptyBlockStatement.Create(0,0));
  809. end;
  810. procedure TTestStatementWriter.TestVarDeclaration;
  811. Var
  812. V : TJSVarDeclaration;
  813. begin
  814. V:=TJSVarDeclaration.Create(0,0);
  815. V.Name:='a';
  816. AssertWrite('simple var','a',V);
  817. end;
  818. procedure TTestStatementWriter.TestVarDeclarationInit;
  819. Var
  820. V : TJSVarDeclaration;
  821. begin
  822. V:=TJSVarDeclaration.Create(0,0);
  823. V.Name:='a';
  824. V.Init:=CreateLiteral(1);
  825. AssertWrite('simple var, init ','a = 1',V);
  826. end;
  827. procedure TTestStatementWriter.TestVarListDeclaration;
  828. Var
  829. B,L : TJSVariableDeclarationList;
  830. V : TJSVarDeclaration;
  831. begin
  832. L:=TJSVariableDeclarationList.Create(0,0);
  833. V:=TJSVarDeclaration.Create(0,0);
  834. V.Name:='a';
  835. L.A:=V;
  836. B:=TJSVariableDeclarationList.Create(0,0);
  837. V:=TJSVarDeclaration.Create(0,0);
  838. V.Name:='b';
  839. B.A:=V;
  840. V.Init:=CreateLiteral(1);
  841. L.B:=B;
  842. AssertWrite('simple var list ','a, b = 1',L);
  843. end;
  844. procedure TTestStatementWriter.TestVarListDeclarationInit;
  845. Var
  846. B,L : TJSVariableDeclarationList;
  847. V : TJSVarDeclaration;
  848. begin
  849. L:=TJSVariableDeclarationList.Create(0,0);
  850. V:=TJSVarDeclaration.Create(0,0);;
  851. V.Name:='a';
  852. L.A:=V;
  853. B:=TJSVariableDeclarationList.Create(0,0);
  854. V:=TJSVarDeclaration.Create(0,0);;
  855. V.Name:='b';
  856. B.A:=V;
  857. L.B:=B;
  858. AssertWrite('simple var list ','a, b',L);
  859. end;
  860. procedure TTestStatementWriter.TestVarDeclarationStatement;
  861. Var
  862. S : TJSVariableStatement;
  863. V : TJSVarDeclaration;
  864. begin
  865. S:=TJSVariableStatement.Create(0,0);
  866. V:=TJSVarDeclaration.Create(0,0);
  867. S.VarDecl:=V;
  868. V.Name:='a';
  869. AssertWrite('simple var','var a',S);
  870. end;
  871. procedure TTestStatementWriter.TestLetDeclarationStatement;
  872. Var
  873. S : TJSVariableStatement;
  874. V : TJSVarDeclaration;
  875. begin
  876. S:=TJSVariableStatement.Create(0,0);
  877. S.varType:=vtLet;
  878. V:=TJSVarDeclaration.Create(0,0);
  879. S.VarDecl:=V;
  880. V.Name:='a';
  881. AssertWrite('simple let','let a',S);
  882. end;
  883. procedure TTestStatementWriter.TestConstDeclarationStatement;
  884. Var
  885. S : TJSVariableStatement;
  886. V : TJSVarDeclaration;
  887. begin
  888. S:=TJSVariableStatement.Create(0,0);
  889. S.varType:=vtConst;
  890. V:=TJSVarDeclaration.Create(0,0);
  891. S.VarDecl:=V;
  892. V.Name:='a';
  893. V.Init:=CreateLiteral(1);
  894. AssertWrite('simple const','const a = 1',S);
  895. end;
  896. procedure TTestStatementWriter.TestDebuggerStatement;
  897. Var
  898. S : TJSDebuggerStatement;
  899. begin
  900. S:=TJSDebuggerStatement.Create(0,0);
  901. AssertWrite('debugger statement','debugger',S);
  902. end;
  903. procedure TTestStatementWriter.TestVarListDeclarationStatement;
  904. Var
  905. S : TJSVariableStatement;
  906. V : TJSVarDeclaration;
  907. L : TJSVariableDeclarationList;
  908. begin
  909. S:=TJSVariableStatement.Create(0,0);
  910. L:=TJSVariableDeclarationList.Create(0,0);
  911. V:=TJSVarDeclaration.Create(0,0);
  912. L.A:=V;
  913. S.VarDecl:=L;
  914. V.Name:='a';
  915. AssertWrite('simple var','var a',S);
  916. end;
  917. procedure TTestStatementWriter.TestConstListDeclarationStatement;
  918. Var
  919. S : TJSVariableStatement;
  920. V : TJSVarDeclaration;
  921. L : TJSVariableDeclarationList;
  922. begin
  923. S:=TJSVariableStatement.Create(0,0);
  924. L:=TJSVariableDeclarationList.Create(0,0);
  925. V:=TJSVarDeclaration.Create(0,0);
  926. S.VarType:=vtConst;
  927. L.A:=V;
  928. S.VarDecl:=L;
  929. V.Name:='a';
  930. AssertWrite('simple const','const a',S);
  931. end;
  932. procedure TTestStatementWriter.TestVarListDeclarationStatement2Vars;
  933. Var
  934. S : TJSVariableStatement;
  935. V : TJSVarDeclaration;
  936. L : TJSVariableDeclarationList;
  937. begin
  938. S:=TJSVariableStatement.Create(0,0);
  939. L:=TJSVariableDeclarationList.Create(0,0);
  940. S.VarDecl:=L;
  941. V:=TJSVarDeclaration.Create(0,0);
  942. L.A:=V;
  943. V.Name:='a';
  944. L.B:=TJSVariableDeclarationList.Create(0,0);
  945. L:=TJSVariableDeclarationList(L.B);
  946. V:=TJSVarDeclaration.Create(0,0);
  947. L.A:=V;
  948. V.Name:='b';
  949. AssertWrite('simple 2 vars','var a, b',S);
  950. end;
  951. procedure TTestStatementWriter.TestVarListDeclarationStatement3Vars;
  952. Var
  953. S : TJSVariableStatement;
  954. V : TJSVarDeclaration;
  955. L : TJSVariableDeclarationList;
  956. begin
  957. S:=TJSVariableStatement.Create(0,0);
  958. L:=TJSVariableDeclarationList.Create(0,0);
  959. S.VarDecl:=L;
  960. V:=TJSVarDeclaration.Create(0,0);
  961. L.A:=V;
  962. V.Name:='a';
  963. V.Init:=CreateLiteral(1);
  964. L.B:=TJSVariableDeclarationList.Create(0,0);
  965. L:=TJSVariableDeclarationList(L.B);
  966. V:=TJSVarDeclaration.Create(0,0);
  967. L.A:=V;
  968. V.Name:='b';
  969. V.Init:=CreateLiteral(2);
  970. V:=TJSVarDeclaration.Create(0,0);
  971. L.B:=V;
  972. V.Name:='c';
  973. V.Init:=CreateLiteral(3);
  974. AssertWrite('simple 3 vars','var a = 1, b = 2, c = 3',S);
  975. end;
  976. procedure TTestStatementWriter.TestReturnStatement;
  977. Var
  978. S : TJSReturnStatement;
  979. begin
  980. S:=TJSReturnStatement.Create(0,0);
  981. S.Expr:=CreateIdent('a');
  982. AssertWrite('simple return','return a',S);
  983. end;
  984. procedure TTestStatementWriter.TestLabeledStatement;
  985. Var
  986. LS : TJSLabeledStatement;
  987. S : TJSReturnStatement;
  988. begin
  989. LS:=TJSLabeledStatement.Create(0,0);
  990. LS.TheLabel:=TJSLabel.Create;
  991. LS.TheLabel.Name:='loc';
  992. S:=TJSReturnStatement.Create(0,0);
  993. S.Expr:=CreateIDent('a');
  994. LS.A:=S;
  995. AssertWrite('simple return','loc:'+sLineBreak+'return a',LS);
  996. end;
  997. procedure TTestStatementWriter.TestLabeledStatementCompact;
  998. Var
  999. LS : TJSLabeledStatement;
  1000. S : TJSReturnStatement;
  1001. begin
  1002. Writer.Options:=[woCompact,woUseUTF8];
  1003. LS:=TJSLabeledStatement.Create(0,0);
  1004. LS.TheLabel:=TJSLabel.Create;
  1005. LS.TheLabel.Name:='loc';
  1006. S:=TJSReturnStatement.Create(0,0);
  1007. S.Expr:=CreateIdent('a');
  1008. LS.A:=S;
  1009. AssertWrite('simple return','loc: return a',LS);
  1010. end;
  1011. procedure TTestStatementWriter.TestContinueStatement;
  1012. Var
  1013. S : TJSContinueStatement;
  1014. begin
  1015. S:=TJSContinueStatement.Create(0,0);
  1016. AssertWrite('simple continue','continue',S);
  1017. end;
  1018. procedure TTestStatementWriter.TestContinueTargetStatement;
  1019. Var
  1020. S : TJSContinueStatement;
  1021. begin
  1022. S:=TJSContinueStatement.Create(0,0);
  1023. S.TargetName:='a';
  1024. AssertWrite('continue a','continue a',S);
  1025. end;
  1026. procedure TTestStatementWriter.TestBreakStatement;
  1027. Var
  1028. S : TJSBreakStatement;
  1029. begin
  1030. S:=TJSBreakStatement.Create(0,0);
  1031. AssertWrite('simple break','break',S);
  1032. end;
  1033. procedure TTestStatementWriter.TestBreakTargetStatement;
  1034. Var
  1035. S : TJSBreakStatement;
  1036. begin
  1037. S:=TJSBreakStatement.Create(0,0);
  1038. S.TargetName:='a';
  1039. AssertWrite('simple break a','break a',S);
  1040. end;
  1041. procedure TTestStatementWriter.TestAssignmentStatementSimple;
  1042. begin
  1043. TestAssignment('Simple assignment',TJSSimpleAssignStatement,'a = b',False);
  1044. end;
  1045. procedure TTestStatementWriter.TestAssignmentStatementSimpleCompact;
  1046. begin
  1047. TestAssignment('Simple assignment',TJSSimpleAssignStatement,'a=b',True);
  1048. end;
  1049. procedure TTestStatementWriter.TestAssignmentStatementAdd;
  1050. begin
  1051. TestAssignment('Add assignment',TJSAddEqAssignStatement,'a += b',False);
  1052. end;
  1053. procedure TTestStatementWriter.TestAssignmentStatementAddCompact;
  1054. begin
  1055. TestAssignment('Add assignment',TJSAddEqAssignStatement,'a+=b',True);
  1056. end;
  1057. procedure TTestStatementWriter.TestAssignmentStatementSubtract;
  1058. begin
  1059. TestAssignment('Subtract assignment',TJSSubEqAssignStatement,'a -= b',False);
  1060. end;
  1061. procedure TTestStatementWriter.TestAssignmentStatementSubtractCompact;
  1062. begin
  1063. TestAssignment('Subtract assignment',TJSSubEqAssignStatement,'a-=b',True);
  1064. end;
  1065. procedure TTestStatementWriter.TestAssignmentStatementMultiply;
  1066. begin
  1067. TestAssignment('Multiply assignment',TJSMulEqAssignStatement,'a *= b',False);
  1068. end;
  1069. procedure TTestStatementWriter.TestAssignmentStatementMultiplyCompact;
  1070. begin
  1071. TestAssignment('Multiply assignment',TJSMulEqAssignStatement,'a*=b',True);
  1072. end;
  1073. procedure TTestStatementWriter.TestAssignmentStatementDivide;
  1074. begin
  1075. TestAssignment('Divide assignment',TJSDivEqAssignStatement,'a /= b',False);
  1076. end;
  1077. procedure TTestStatementWriter.TestAssignmentStatementDivideCompact;
  1078. begin
  1079. TestAssignment('Divide assignment',TJSDivEqAssignStatement,'a/=b',True);
  1080. end;
  1081. procedure TTestStatementWriter.TestAssignmentStatementShift;
  1082. begin
  1083. TestAssignment('Shift assignment',TJSLShiftEqAssignStatement,'a <<= b',False);
  1084. end;
  1085. procedure TTestStatementWriter.TestAssignmentStatementShiftCompact;
  1086. begin
  1087. TestAssignment('Shift assignment',TJSLShiftEqAssignStatement,'a<<=b',True);
  1088. end;
  1089. procedure TTestStatementWriter.TestAssignmentStatementRShift;
  1090. begin
  1091. TestAssignment('RShift assignment',TJSRShiftEqAssignStatement,'a >>= b',False);
  1092. end;
  1093. procedure TTestStatementWriter.TestAssignmentStatementRShiftCompact;
  1094. begin
  1095. TestAssignment('RShift assignment',TJSRShiftEqAssignStatement,'a>>=b',True);
  1096. end;
  1097. procedure TTestStatementWriter.TestAssignmentStatementURShift;
  1098. begin
  1099. TestAssignment('URShift assignment',TJSURShiftEqAssignStatement,'a >>>= b',False);
  1100. end;
  1101. procedure TTestStatementWriter.TestAssignmentStatementURShiftCompact;
  1102. begin
  1103. TestAssignment('URShift assignment',TJSURShiftEqAssignStatement,'a>>>=b',True);
  1104. end;
  1105. procedure TTestStatementWriter.TestAssignmentStatementMod;
  1106. begin
  1107. TestAssignment('Mod assignment',TJSModEqAssignStatement,'a %= b',False);
  1108. end;
  1109. procedure TTestStatementWriter.TestAssignmentStatementModCompact;
  1110. begin
  1111. TestAssignment('Mod assignment',TJSModEqAssignStatement,'a%=b',True);
  1112. end;
  1113. procedure TTestStatementWriter.TestAssignmentStatementBinaryOr;
  1114. begin
  1115. TestAssignment('Binary or assignment',TJSOrEqAssignStatement,'a |= b',False);
  1116. end;
  1117. procedure TTestStatementWriter.TestAssignmentStatementBinaryOrCompact;
  1118. begin
  1119. TestAssignment('Binary or assignment',TJSOrEqAssignStatement,'a |= b',False);
  1120. end;
  1121. procedure TTestStatementWriter.TestAssignmentStatementBinaryXOr;
  1122. begin
  1123. TestAssignment('Binary xor assignment',TJSXOrEqAssignStatement,'a ^= b',False);
  1124. end;
  1125. procedure TTestStatementWriter.TestAssignmentStatementBinaryXOrCompact;
  1126. begin
  1127. TestAssignment('Binary xor assignment',TJSXOrEqAssignStatement,'a^=b',True);
  1128. end;
  1129. procedure TTestStatementWriter.TestAssignmentStatementBinaryAnd;
  1130. begin
  1131. TestAssignment('Binary and assignment',TJSAndEqAssignStatement,'a &= b',False);
  1132. end;
  1133. procedure TTestStatementWriter.TestAssignmentStatementBinaryAndCompact;
  1134. begin
  1135. TestAssignment('Binary and assignment',TJSAndEqAssignStatement,'a&=b',True);
  1136. end;
  1137. procedure TTestStatementWriter.TestForStatementEmpty;
  1138. Var
  1139. S : TJSForStatement;
  1140. begin
  1141. S:=TJSForStatement.Create(0,0);
  1142. S.Body:=TJSEmptyBlockStatement.Create(0,0);
  1143. AssertWrite('neverending for','for (; ; ) {'+sLineBreak+'}',S);
  1144. end;
  1145. procedure TTestStatementWriter.TestForStatementFull;
  1146. Var
  1147. S : TJSForStatement;
  1148. UPP : TJSUnaryPostPlusPlusExpression;
  1149. CL : TJSRelationalExpressionLT;
  1150. sa : TJSSimpleAssignStatement;
  1151. begin
  1152. SA:=TJSSimpleAssignStatement.Create(0,0);
  1153. SA.LHS:=CreateIdent('i');
  1154. SA.Expr:=CreateLiteral(0);
  1155. UPP:=TJSUnaryPostPlusPlusExpression.Create(0,0);
  1156. UPP.A:=CreateIdent('i');
  1157. CL:=TJSRelationalExpressionLT.Create(0,0);
  1158. CL.A:=CreateIdent('i');
  1159. CL.B:=CreateLiteral(10);
  1160. S:=TJSForStatement.Create(0,0);
  1161. S.Init:=SA;
  1162. S.Incr:=UPP;
  1163. S.Cond:=CL;
  1164. S.Body:=TJSEmptyBlockStatement.Create(0,0);
  1165. AssertWrite('for i:=0 to 9','for (i = 0; i < 10; i++) {'+sLineBreak+'}',S);
  1166. end;
  1167. procedure TTestStatementWriter.TestForStatementFull1;
  1168. Var
  1169. S : TJSForStatement;
  1170. UPP : TJSUnaryPostPlusPlusExpression;
  1171. CL : TJSRelationalExpressionLT;
  1172. sa : TJSSimpleAssignStatement;
  1173. begin
  1174. SA:=TJSSimpleAssignStatement.Create(0,0);
  1175. SA.LHS:=CreateIdent('i');
  1176. SA.Expr:=CreateLiteral(0);
  1177. UPP:=TJSUnaryPostPlusPlusExpression.Create(0,0);
  1178. UPP.A:=CreateIdent('i');
  1179. CL:=TJSRelationalExpressionLT.Create(0,0);
  1180. CL.A:=CreateIdent('i');
  1181. CL.B:=CreateLiteral(10);
  1182. S:=TJSForStatement.Create(0,0);
  1183. S.Init:=SA;
  1184. S.Incr:=UPP;
  1185. S.Cond:=CL;
  1186. S.Body:=CreateStatementListOneElement;
  1187. AssertWrite('for i:=0 to 9',
  1188. 'for (i = 0; i < 10; i++) {'+sLineBreak
  1189. +'a = b;'+sLineBreak
  1190. +'}',S);
  1191. end;
  1192. procedure TTestStatementWriter.TestForStatementCompact;
  1193. Var
  1194. S : TJSForStatement;
  1195. UPP : TJSUnaryPostPlusPlusExpression;
  1196. CL : TJSRelationalExpressionLT;
  1197. sa : TJSSimpleAssignStatement;
  1198. begin
  1199. SA:=TJSSimpleAssignStatement.Create(0,0);
  1200. SA.LHS:=CreateIdent('i');
  1201. SA.Expr:=CreateLiteral(0);
  1202. UPP:=TJSUnaryPostPlusPlusExpression.Create(0,0);
  1203. UPP.A:=CreateIdent('i');
  1204. CL:=TJSRelationalExpressionLT.Create(0,0);
  1205. CL.A:=CreateIdent('i');
  1206. CL.B:=CreateLiteral(10);
  1207. S:=TJSForStatement.Create(0,0);
  1208. S.Init:=SA;
  1209. S.Incr:=UPP;
  1210. S.Cond:=CL;
  1211. S.Body:=TJSEmptyBlockStatement.Create(0,0);
  1212. Writer.Options:=[woCompact,woUseUTF8];
  1213. AssertWrite('for i:=0 to 9','for (i=0; i<10; i++) {}',S);
  1214. end;
  1215. procedure TTestStatementWriter.TestForStatement2loops2inits;
  1216. var
  1217. L: TJSStatementList;
  1218. function CreateIdent(aName: string): TJSPrimaryExpressionIdent;
  1219. begin
  1220. Result:=TJSPrimaryExpressionIdent.Create(0,0);
  1221. Result.Name:=TJSString(aName);
  1222. end;
  1223. function CreateNumber(i: TJSNumber): TJSLiteral;
  1224. begin
  1225. Result:=TJSLiteral.Create(0,0);
  1226. Result.Value.AsNumber:=i;
  1227. end;
  1228. function CreateAssignSt(LHS, Expr: TJSElement): TJSSimpleAssignStatement;
  1229. begin
  1230. Result:=TJSSimpleAssignStatement.Create(0,0);
  1231. Result.LHS:=LHS;
  1232. Result.Expr:=Expr;
  1233. end;
  1234. function CreateFor(LoopVar, LoopEndVar: string; StartExpr, EndExpr: TJSElement;
  1235. Up: boolean; Target: string): TJSForStatement;
  1236. var
  1237. V: TJSVariableStatement;
  1238. C: TJSCommaExpression;
  1239. begin
  1240. Result:=TJSForStatement.Create(0,0);
  1241. V:=TJSVariableStatement.Create(0,0);
  1242. Result.Init:=V;
  1243. C:=TJSCommaExpression.Create(0,0);
  1244. V.VarDecl:=C;
  1245. C.A:=CreateAssignSt(CreateIdent(LoopVar),StartExpr);
  1246. C.B:=CreateAssignSt(CreateIdent(LoopEndVar),EndExpr);
  1247. if Up then
  1248. Result.Cond:=TJSRelationalExpressionLE.Create(0,0)
  1249. else
  1250. Result.Cond:=TJSRelationalExpressionGE.Create(0,0);
  1251. TJSRelationalExpression(Result.Cond).A:=CreateIdent(LoopVar);
  1252. TJSRelationalExpression(Result.Cond).B:=CreateIdent(LoopEndVar);
  1253. if Up then
  1254. Result.Incr:=TJSUnaryPostPlusPlusExpression.Create(0,0)
  1255. else
  1256. Result.Incr:=TJSUnaryPostMinusMinusExpression.Create(0,0);
  1257. TJSUnaryExpression(Result.Incr).A:=CreateIdent(LoopVar);
  1258. Result.Body:=CreateAssignSt(CreateIdent(Target),CreateIdent(LoopVar));
  1259. end;
  1260. begin
  1261. L:=TJSStatementList.Create(0,0);
  1262. L.A:=CreateFor('$loop1','$loopend2',CreateNumber(3),CreateNumber(5),true,'$mod.i');
  1263. L.B:=CreateFor('$loop3','$loopend4',CreateNumber(10),CreateNumber(7),false,'$mod.i');
  1264. AssertWrite('for i:=3 to 5 do ; for i:=10 downto 7 do ;',
  1265. '{'+LineEnding
  1266. +'for (var $loop1 = 3, $loopend2 = 5; $loop1 <= $loopend2; $loop1++) $mod.i = $loop1;'+LineEnding
  1267. +'for (var $loop3 = 10, $loopend4 = 7; $loop3 >= $loopend4; $loop3--) $mod.i = $loop3;'+LineEnding
  1268. +'}'
  1269. ,L);
  1270. end;
  1271. procedure TTestStatementWriter.TestForInStatement;
  1272. Var
  1273. S : TJSForInStatement;
  1274. begin
  1275. S:=TJSForInStatement.Create(0,0);
  1276. S.LHS:=CreateIdent('a');
  1277. S.List:=CreateIdent('b');
  1278. S.Body:=TJSEmptyBlockStatement.Create(0,0);
  1279. AssertWrite('for a in b','for (a in b) {'+sLineBreak+'}',S);
  1280. end;
  1281. procedure TTestStatementWriter.TestWhileStatement;
  1282. Var
  1283. S : TJSWhileStatement;
  1284. begin
  1285. S:=TJSWhileStatement.Create(0,0);
  1286. S.Cond:=CreateIdent('a');
  1287. S.Body:=TJSEmptyBlockStatement.Create(0,0);
  1288. AssertWrite('while a ','while (a) {'+sLineBreak+'}',S);
  1289. end;
  1290. procedure TTestStatementWriter.TestDoWhileStatement;
  1291. Var
  1292. S : TJSDoWhileStatement;
  1293. begin
  1294. S:=TJSDoWhileStatement.Create(0,0);
  1295. S.Cond:=CreateIdent('a');
  1296. S.Body:=TJSEmptyBlockStatement.Create(0,0);
  1297. AssertWrite('do while a ','do {'+sLineBreak+'} while (a)',S);
  1298. end;
  1299. procedure TTestStatementWriter.TestSwitchStatementEmpty;
  1300. Var
  1301. S : TJSSwitchStatement;
  1302. begin
  1303. S:=TJSSwitchStatement.Create(0,0);
  1304. S.Cond:=CreateIdent('a');
  1305. AssertWrite('switch ','switch (a) {'+sLineBreak+'}',S);
  1306. end;
  1307. procedure TTestStatementWriter.TestSwitchStatementEmptyCompact;
  1308. Var
  1309. S : TJSSwitchStatement;
  1310. begin
  1311. Writer.Options:=[woCompact,woUseUTF8];
  1312. S:=TJSSwitchStatement.Create(0,0);
  1313. S.Cond:=CreateIdent('a');
  1314. AssertWrite('switch ','switch (a) {}',S);
  1315. end;
  1316. procedure TTestStatementWriter.TestSwitchStatementOneElement;
  1317. Var
  1318. S : TJSSwitchStatement;
  1319. C : TJSCaseElement;
  1320. begin
  1321. // Writer.Options:=[woCompact,woUseUTF8];
  1322. S:=TJSSwitchStatement.Create(0,0);
  1323. S.Cond:=CreateIdent('a');
  1324. C:=S.Cases.AddCase;
  1325. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1326. C.Expr:=CreateIdent('c');
  1327. AssertWrite('switch ','switch (a) {'+sLineBreak+'case c:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'}',S);
  1328. end;
  1329. procedure TTestStatementWriter.TestSwitchStatementOneElementCompact;
  1330. Var
  1331. S : TJSSwitchStatement;
  1332. C : TJSCaseElement;
  1333. begin
  1334. Writer.Options:=[woCompact,woUseUTF8];
  1335. S:=TJSSwitchStatement.Create(0,0);
  1336. S.Cond:=CreateIdent('a');
  1337. C:=S.Cases.AddCase;
  1338. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1339. C.Expr:=CreateIdent('c');
  1340. AssertWrite('switch ','switch (a) {case c: {}}',S);
  1341. end;
  1342. procedure TTestStatementWriter.TestSwitchStatementTwoElements;
  1343. Var
  1344. S : TJSSwitchStatement;
  1345. C : TJSCaseElement;
  1346. begin
  1347. // Writer.Options:=[woCompact,woUseUTF8];
  1348. S:=TJSSwitchStatement.Create(0,0);
  1349. S.Cond:=CreateIdent('a');
  1350. C:=S.Cases.AddCase;
  1351. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1352. C.Expr:=CreateIdent('c');
  1353. C:=S.Cases.AddCase;
  1354. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1355. C.Expr:=CreateIdent('d');
  1356. AssertWrite('switch ','switch (a) {'+sLineBreak+'case c:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'case d:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'}',S);
  1357. end;
  1358. procedure TTestStatementWriter.TestSwitchStatementTwoElementsCompact;
  1359. Var
  1360. S : TJSSwitchStatement;
  1361. C : TJSCaseElement;
  1362. begin
  1363. Writer.Options:=[woCompact,woUseUTF8];
  1364. S:=TJSSwitchStatement.Create(0,0);
  1365. S.Cond:=CreateIdent('a');
  1366. C:=S.Cases.AddCase;
  1367. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1368. C.Expr:=CreateIdent('c');
  1369. C:=S.Cases.AddCase;
  1370. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1371. C.Expr:=CreateIdent('d');
  1372. AssertWrite('switch ','switch (a) {case c: {} case d: {}}',S);
  1373. end;
  1374. procedure TTestStatementWriter.TestSwitchStatementTwoElementsDefault;
  1375. Var
  1376. S : TJSSwitchStatement;
  1377. C : TJSCaseElement;
  1378. begin
  1379. S:=TJSSwitchStatement.Create(0,0);
  1380. S.Cond:=CreateIdent('a');
  1381. C:=S.Cases.AddCase;
  1382. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1383. C.Expr:=CreateIdent('c');
  1384. C:=S.Cases.AddCase;
  1385. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1386. C.Expr:=CreateIdent('d');
  1387. C:=S.Cases.AddCase;
  1388. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1389. S.TheDefault:=C;
  1390. AssertWrite('switch ','switch (a) {'+sLineBreak+'case c:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'case d:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'default:'+sLineBreak+'{'+sLineBreak+'}'+sLineBreak+'}',S);
  1391. end;
  1392. procedure TTestStatementWriter.TestSwitchStatementTwoElementsDefaultCompact;
  1393. Var
  1394. S : TJSSwitchStatement;
  1395. C : TJSCaseElement;
  1396. begin
  1397. Writer.Options:=[woCompact,woUseUTF8];
  1398. S:=TJSSwitchStatement.Create(0,0);
  1399. S.Cond:=CreateIdent('a');
  1400. C:=S.Cases.AddCase;
  1401. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1402. C.Expr:=CreateIdent('c');
  1403. C:=S.Cases.AddCase;
  1404. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1405. C.Expr:=CreateIdent('d');
  1406. C:=S.Cases.AddCase;
  1407. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1408. S.TheDefault:=C;
  1409. AssertWrite('switch ','switch (a) {case c: {} case d: {} default: {}}',S);
  1410. end;
  1411. procedure TTestStatementWriter.TestSwitchStatementTwoElementsOneEmpty;
  1412. Var
  1413. S : TJSSwitchStatement;
  1414. C : TJSCaseElement;
  1415. begin
  1416. S:=TJSSwitchStatement.Create(0,0);
  1417. S.Cond:=CreateIdent('a');
  1418. C:=S.Cases.AddCase;
  1419. C.Expr:=CreateIdent('c');
  1420. C:=S.Cases.AddCase;
  1421. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1422. C.Expr:=CreateIdent('d');
  1423. C:=S.Cases.AddCase;
  1424. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1425. S.TheDefault:=C;
  1426. AssertWrite('switch ',
  1427. 'switch (a) {'+sLineBreak
  1428. +'case c:'+sLineBreak
  1429. +'case d:'+sLineBreak
  1430. +'{'+sLineBreak
  1431. +'}'+sLineBreak
  1432. +'default:'+sLineBreak
  1433. +'{'+sLineBreak
  1434. +'}'+sLineBreak
  1435. +'}',S);
  1436. end;
  1437. procedure TTestStatementWriter.TestSwitchStatementTwoElementsOneEmptyCompact;
  1438. Var
  1439. S : TJSSwitchStatement;
  1440. C : TJSCaseElement;
  1441. begin
  1442. Writer.Options:=[woCompact,woUseUTF8];
  1443. S:=TJSSwitchStatement.Create(0,0);
  1444. S.Cond:=CreateIdent('a');
  1445. C:=S.Cases.AddCase;
  1446. C.Expr:=CreateIdent('c');
  1447. C:=S.Cases.AddCase;
  1448. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1449. C.Expr:=CreateIdent('d');
  1450. C:=S.Cases.AddCase;
  1451. C.Body:=TJSEmptyBlockStatement.Create(0,0);;
  1452. S.TheDefault:=C;
  1453. AssertWrite('switch ','switch (a) {case c: case d: {} default: {}}',S);
  1454. end;
  1455. procedure TTestStatementWriter.TestIfThen;
  1456. Var
  1457. S : TJSIfStatement;
  1458. begin
  1459. // Writer.Options:=[woCompact,woUseUTF8];
  1460. S:=TJSIfStatement.Create(0,0);
  1461. S.Cond:=CreateIdent('a');
  1462. S.btrue:=TJSEmptyBlockStatement.Create(0,0);
  1463. AssertWrite('if then','if (a) {'+sLineBreak+'}',S);
  1464. end;
  1465. procedure TTestStatementWriter.TestIfThenElse;
  1466. Var
  1467. S : TJSIfStatement;
  1468. begin
  1469. // Writer.Options:=[woCompact,woUseUTF8];
  1470. S:=TJSIfStatement.Create(0,0);
  1471. S.Cond:=CreateIdent('a');
  1472. S.btrue:=TJSEmptyBlockStatement.Create(0,0);
  1473. S.bfalse:=TJSEmptyBlockStatement.Create(0,0);
  1474. AssertWrite('if then',
  1475. 'if (a) {'+sLineBreak
  1476. +'} else {'+sLineBreak
  1477. +'}',S);
  1478. end;
  1479. procedure TTestStatementWriter.TestStatementListEmpty;
  1480. Var
  1481. S : TJSStatementList;
  1482. begin
  1483. // Writer.Options:=[woCompact,woUseUTF8];
  1484. S:=TJSStatementList.Create(0,0);
  1485. AssertWrite('Statement list','{'+sLineBreak+'}',S);
  1486. end;
  1487. procedure TTestStatementWriter.TestStatementListEmptyCompact;
  1488. Var
  1489. S : TJSStatementList;
  1490. begin
  1491. Writer.Options:=[woCompact,woUseUTF8];
  1492. S:=TJSStatementList.Create(0,0);
  1493. AssertWrite('Statement list','{}',S);
  1494. end;
  1495. procedure TTestStatementWriter.TestStatementListOneStatement;
  1496. Var
  1497. S : TJSStatementList;
  1498. begin
  1499. // Writer.Options:=[woCompact,woUseUTF8];
  1500. S:=TJSStatementList.Create(0,0);
  1501. S.A:=CreateAssignment(nil);
  1502. AssertWrite('Statement list',
  1503. '{'+sLineBreak
  1504. +'a = b;'+sLineBreak
  1505. +'}',S);
  1506. end;
  1507. procedure TTestStatementWriter.TestStatementListOneStatementCompact;
  1508. Var
  1509. S : TJSStatementList;
  1510. begin
  1511. Writer.Options:=[woCompact,woUseUTF8];
  1512. S:=TJSStatementList.Create(0,0);
  1513. S.A:=CreateAssignment(nil);
  1514. AssertWrite('Statement list','{a=b}',S);
  1515. end;
  1516. procedure TTestStatementWriter.TestStatementListTwoStatements;
  1517. Var
  1518. S : TJSStatementList;
  1519. begin
  1520. // Writer.Options:=[woCompact,woUseUTF8];
  1521. S:=TJSStatementList.Create(0,0);
  1522. S.A:=CreateAssignment(nil);
  1523. S.B:=CreateAssignment(nil);
  1524. AssertWrite('Statement list',
  1525. '{'+sLineBreak
  1526. +'a = b;'+sLineBreak
  1527. +'a = b;'+sLineBreak
  1528. +'}',S);
  1529. end;
  1530. procedure TTestStatementWriter.TestStatementListTwoStatementsCompact;
  1531. Var
  1532. S : TJSStatementList;
  1533. begin
  1534. Writer.Options:=[woCompact,woUseUTF8];
  1535. S:=TJSStatementList.Create(0,0);
  1536. S.A:=CreateAssignment(nil);
  1537. S.B:=CreateAssignment(nil);
  1538. AssertWrite('Statement list','{a=b; a=b}',S);
  1539. end;
  1540. procedure TTestStatementWriter.TestStatementListTree4;
  1541. var
  1542. S1, S11, S12: TJSStatementList;
  1543. begin
  1544. Writer.Options:=[woUseUTF8];
  1545. S1:=TJSStatementList.Create(0,0);
  1546. S11:=TJSStatementList.Create(0,0);
  1547. S1.A:=S11;
  1548. S12:=TJSStatementList.Create(0,0);
  1549. S1.B:=S12;
  1550. S11.A:=CreateAssignment(nil);
  1551. S11.B:=CreateAssignment(nil);
  1552. S12.A:=CreateAssignment(nil);
  1553. S12.B:=CreateAssignment(nil);
  1554. AssertWrite('Statement list',
  1555. '{'+sLineBreak
  1556. +'a = b;'+sLineBreak
  1557. +'a = b;'+sLineBreak
  1558. +'a = b;'+sLineBreak
  1559. +'a = b;'+sLineBreak
  1560. +'}',S1);
  1561. end;
  1562. procedure TTestStatementWriter.TestStatementListFor;
  1563. Var
  1564. S : TJSStatementList;
  1565. begin
  1566. // Writer.Options:=[woCompact,woUseUTF8];
  1567. S:=TJSStatementList.Create(0,0);
  1568. S.A:=TJSForStatement.Create(0,0);
  1569. TJSForStatement(S.A).Body:=TJSEmptyBlockStatement.Create(0,0);
  1570. AssertWrite('Statement list',
  1571. '{'+sLineBreak
  1572. +'for (; ; ) {'+sLineBreak
  1573. +'};'+sLineBreak
  1574. +'}',S);
  1575. end;
  1576. procedure TTestStatementWriter.TestEmptyFunctionDef;
  1577. Var
  1578. FD : TJSFunctionDeclarationStatement;
  1579. begin
  1580. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1581. FD.AFunction:=TJSFuncDef.Create;
  1582. FD.AFunction.Name:='a';
  1583. AssertWrite('Empty function',
  1584. 'function a() {'+sLineBreak
  1585. +'}',FD);
  1586. end;
  1587. procedure TTestStatementWriter.TestEmptyFunctionDefCompact;
  1588. Var
  1589. FD : TJSFunctionDeclarationStatement;
  1590. begin
  1591. Writer.Options:=[woCompact,woUseUTF8];
  1592. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1593. FD.AFunction:=TJSFuncDef.Create;
  1594. FD.AFunction.Name:='a';
  1595. AssertWrite('Empty function, compact','function a() {}',FD);
  1596. end;
  1597. procedure TTestStatementWriter.TestFunctionDefParams;
  1598. Var
  1599. FD : TJSFunctionDeclarationStatement;
  1600. begin
  1601. // Writer.Options:=[woCompact,woUseUTF8];
  1602. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1603. FD.AFunction:=TJSFuncDef.Create;
  1604. FD.AFunction.Name:='a';
  1605. FD.AFunction.TypedParams.AddParam('b');
  1606. FD.AFunction.TypedParams.AddParam('c');
  1607. FD.AFunction.TypedParams.AddParam('d');
  1608. AssertWrite('Empty function, 3 params',
  1609. 'function a(b, c, d) {'+sLineBreak
  1610. +'}',FD);
  1611. end;
  1612. procedure TTestStatementWriter.TestFunctionDefParamsCompact;
  1613. Var
  1614. FD : TJSFunctionDeclarationStatement;
  1615. begin
  1616. Writer.Options:=[woCompact,woUseUTF8];
  1617. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1618. FD.AFunction:=TJSFuncDef.Create;
  1619. FD.AFunction.Name:='a';
  1620. FD.AFunction.TypedParams.AddParam('b');
  1621. FD.AFunction.TypedParams.AddParam('c');
  1622. FD.AFunction.TypedParams.AddParam('d');
  1623. AssertWrite('Empty function, 3 params, compact','function a(b,c,d) {}',FD);
  1624. end;
  1625. procedure TTestStatementWriter.TestFunctionDefBody1;
  1626. Var
  1627. FD : TJSFunctionDeclarationStatement;
  1628. R : TJSReturnStatement;
  1629. begin
  1630. Writer.IndentSize:=2;
  1631. // Writer.Options:=[woCompact,woUseUTF8];
  1632. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1633. FD.AFunction:=TJSFuncDef.Create;
  1634. FD.AFunction.Name:='a';
  1635. FD.AFunction.Body:=TJSFunctionBody.Create(0,0);
  1636. R:=TJSReturnStatement.Create(0,0);
  1637. R.Expr:=CreateLiteral(0);
  1638. FD.AFunction.Body.A:=R;
  1639. AssertWrite('1 statement, ',
  1640. 'function a() {'+sLineBreak
  1641. +' return 0;'+sLineBreak
  1642. +'}',FD);
  1643. end;
  1644. procedure TTestStatementWriter.TestFunctionDefBody1Compact;
  1645. Var
  1646. FD : TJSFunctionDeclarationStatement;
  1647. R : TJSReturnStatement;
  1648. begin
  1649. Writer.IndentSize:=2;
  1650. Writer.Options:=[woCompact,woUseUTF8];
  1651. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1652. FD.AFunction:=TJSFuncDef.Create;
  1653. FD.AFunction.Name:='a';
  1654. FD.AFunction.Body:=TJSFunctionBody.Create(0,0);
  1655. R:=TJSReturnStatement.Create(0,0);
  1656. R.Expr:=CreateLiteral(0);
  1657. FD.AFunction.Body.A:=R;
  1658. AssertWrite('1 statement, compact','function a() {return 0; }',FD);
  1659. end;
  1660. procedure TTestStatementWriter.TestFunctionDefBody2;
  1661. Var
  1662. FD : TJSFunctionDeclarationStatement;
  1663. R : TJSReturnStatement;
  1664. L : TJSStatementList;
  1665. A : TJSAssignStatement;
  1666. M : TJSMultiplicativeExpressionMul;
  1667. begin
  1668. Writer.IndentSize:=2;
  1669. // Writer.Options:=[woCompact,woUseUTF8];
  1670. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1671. FD.AFunction:=TJSFuncDef.Create;
  1672. FD.AFunction.Name:='a';
  1673. FD.AFunction.Body:=TJSFunctionBody.Create(0,0);
  1674. FD.AFunction.TypedParams.AddParam('b');
  1675. R:=TJSReturnStatement.Create(0,0);
  1676. R.Expr:=CreateIdent('b');
  1677. L:=TJSStatementList.Create(0,0);
  1678. A:=TJSSimpleAssignStatement.Create(0,0);
  1679. A.LHS:=CreateIdent('b');
  1680. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1681. M.A:=CreateIdent('b');
  1682. M.B:=CreateLiteral(10);
  1683. A.Expr:=M;
  1684. L.A:=A;
  1685. L.B:=R;
  1686. FD.AFunction.Body.A:=L;
  1687. AssertWrite('Function, 2 statements',
  1688. 'function a(b) {'+sLineBreak
  1689. +' b = b * 10;'+sLineBreak
  1690. +' return b;'+sLineBreak
  1691. +'}',FD);
  1692. end;
  1693. procedure TTestStatementWriter.TestFunctionDefBody2Compact;
  1694. Var
  1695. FD : TJSFunctionDeclarationStatement;
  1696. R : TJSReturnStatement;
  1697. L : TJSStatementList;
  1698. A : TJSAssignStatement;
  1699. M : TJSMultiplicativeExpressionMul;
  1700. begin
  1701. Writer.IndentSize:=2;
  1702. Writer.Options:=[woCompact,woUseUTF8];
  1703. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1704. FD.AFunction:=TJSFuncDef.Create;
  1705. FD.AFunction.Name:='a';
  1706. FD.AFunction.Body:=TJSFunctionBody.Create(0,0);
  1707. FD.AFunction.TypedParams.AddParam('b');
  1708. R:=TJSReturnStatement.Create(0,0);
  1709. R.Expr:=CreateIdent('b');
  1710. L:=TJSStatementList.Create(0,0);
  1711. A:=TJSSimpleAssignStatement.Create(0,0);
  1712. A.LHS:=CreateIdent('b');
  1713. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1714. M.A:=CreateIdent('b');
  1715. M.B:=CreateLiteral(10);
  1716. A.Expr:=M;
  1717. L.A:=A;
  1718. L.B:=R;
  1719. FD.AFunction.Body.A:=L;
  1720. AssertWrite('Function, 2 statements, compact','function a(b) {b=b*10; return b}',FD);
  1721. end;
  1722. procedure TTestStatementWriter.TestFunctionDefAsync;
  1723. Var
  1724. FD : TJSFunctionDeclarationStatement;
  1725. begin
  1726. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  1727. FD.AFunction:=TJSFuncDef.Create;
  1728. FD.AFunction.IsAsync:=true;
  1729. FD.AFunction.Name:='a';
  1730. AssertWrite('Async function',
  1731. 'async function a() {'+sLineBreak
  1732. +'}',FD);
  1733. end;
  1734. procedure TTestStatementWriter.TestTryCatch;
  1735. Var
  1736. T : TJSTryCatchStatement;
  1737. A : TJSAssignStatement;
  1738. M : TJSMultiplicativeExpressionMul;
  1739. begin
  1740. Writer.IndentSize:=2;
  1741. T:=TJSTryCatchStatement.Create(0,0);
  1742. T.Ident:='e';
  1743. A:=TJSSimpleAssignStatement.Create(0,0);
  1744. A.LHS:=CreateIdent('b');
  1745. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1746. M.A:=CreateIdent('b');
  1747. M.B:=CreateLiteral(10);
  1748. A.Expr:=M;
  1749. T.Block:=A;
  1750. A:=TJSSimpleAssignStatement.Create(0,0);
  1751. A.LHS:=CreateIdent('b');
  1752. A.Expr:=CreateLiteral(1);
  1753. T.BCatch:=A;
  1754. AssertWrite('Try catch',
  1755. 'try {'+sLineBreak
  1756. +' b = b * 10'+sLineBreak
  1757. +'} catch (e) {'+sLineBreak
  1758. +' b = 1'+sLineBreak
  1759. +'}',T);
  1760. end;
  1761. procedure TTestStatementWriter.TestTryCatchCompact;
  1762. Var
  1763. T : TJSTryCatchStatement;
  1764. A : TJSAssignStatement;
  1765. M : TJSMultiplicativeExpressionMul;
  1766. begin
  1767. Writer.IndentSize:=2;
  1768. Writer.Options:=[woCompact,woUseUTF8];
  1769. T:=TJSTryCatchStatement.Create(0,0);
  1770. T.Ident:='e';
  1771. A:=TJSSimpleAssignStatement.Create(0,0);
  1772. A.LHS:=CreateIdent('b');
  1773. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1774. M.A:=CreateIdent('b');
  1775. M.B:=CreateLiteral(10);
  1776. A.Expr:=M;
  1777. T.Block:=A;
  1778. A:=TJSSimpleAssignStatement.Create(0,0);
  1779. A.LHS:=CreateIdent('b');
  1780. A.Expr:=CreateLiteral(1);
  1781. T.BCatch:=A;
  1782. AssertWrite('Try catch compact','try {b=b*10} catch (e) {b=1}',T);
  1783. end;
  1784. procedure TTestStatementWriter.TestTryFinally;
  1785. Var
  1786. T : TJSTryFinallyStatement;
  1787. A : TJSAssignStatement;
  1788. M : TJSMultiplicativeExpressionMul;
  1789. begin
  1790. Writer.IndentSize:=2;
  1791. T:=TJSTryFinallyStatement.Create(0,0);
  1792. T.Ident:='e';
  1793. A:=TJSSimpleAssignStatement.Create(0,0);
  1794. A.LHS:=CreateIdent('b');
  1795. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1796. M.A:=CreateIdent('b');
  1797. M.B:=CreateLiteral(10);
  1798. A.Expr:=M;
  1799. T.Block:=A;
  1800. A:=TJSSimpleAssignStatement.Create(0,0);
  1801. A.LHS:=CreateIdent('b');
  1802. A.Expr:=CreateLiteral(1);
  1803. T.BFinally:=A;
  1804. AssertWrite('Try finally ',
  1805. 'try {'+sLineBreak
  1806. +' b = b * 10'+sLineBreak
  1807. +'} finally {'+sLineBreak
  1808. +' b = 1'+sLineBreak
  1809. +'}',T);
  1810. end;
  1811. procedure TTestStatementWriter.TestTryFinallyCompact;
  1812. Var
  1813. T : TJSTryFinallyStatement;
  1814. A : TJSAssignStatement;
  1815. M : TJSMultiplicativeExpressionMul;
  1816. begin
  1817. Writer.IndentSize:=2;
  1818. Writer.Options:=[woCompact,woUseUTF8];
  1819. T:=TJSTryFinallyStatement.Create(0,0);
  1820. T.Ident:='e';
  1821. A:=TJSSimpleAssignStatement.Create(0,0);
  1822. A.LHS:=CreateIdent('b');
  1823. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1824. M.A:=CreateIdent('b');
  1825. M.B:=CreateLiteral(10);
  1826. A.Expr:=M;
  1827. T.Block:=A;
  1828. A:=TJSSimpleAssignStatement.Create(0,0);
  1829. A.LHS:=CreateIdent('b');
  1830. A.Expr:=CreateLiteral(1);
  1831. T.BFinally:=A;
  1832. AssertWrite('Try finally compact','try {b=b*10} finally {b=1}',T);
  1833. end;
  1834. procedure TTestStatementWriter.TestTryCatchFinally;
  1835. Var
  1836. T : TJSTryCatchFinallyStatement;
  1837. A : TJSAssignStatement;
  1838. M : TJSMultiplicativeExpressionMul;
  1839. begin
  1840. Writer.IndentSize:=2;
  1841. T:=TJSTryCatchFinallyStatement.Create(0,0);
  1842. T.Ident:='e';
  1843. A:=TJSSimpleAssignStatement.Create(0,0);
  1844. A.LHS:=CreateIdent('b');
  1845. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1846. M.A:=CreateIdent('b');
  1847. M.B:=CreateLiteral(10);
  1848. A.Expr:=M;
  1849. T.Block:=A;
  1850. A:=TJSSimpleAssignStatement.Create(0,0);
  1851. A.LHS:=CreateIdent('b');
  1852. A.Expr:=CreateLiteral(10);
  1853. T.BCatch:=A;
  1854. A:=TJSSimpleAssignStatement.Create(0,0);
  1855. A.LHS:=CreateIdent('b');
  1856. A.Expr:=CreateLiteral(1);
  1857. T.BFinally:=A;
  1858. AssertWrite('Try finally ',
  1859. 'try {'+sLineBreak
  1860. +' b = b * 10'+sLineBreak
  1861. +'} catch (e) {'+sLineBreak
  1862. +' b = 10'+sLineBreak
  1863. +'} finally {'+sLineBreak
  1864. +' b = 1'+sLineBreak+'}',T);
  1865. end;
  1866. procedure TTestStatementWriter.TestTryCatchFinallyCompact;
  1867. Var
  1868. T : TJSTryCatchFinallyStatement;
  1869. A : TJSAssignStatement;
  1870. M : TJSMultiplicativeExpressionMul;
  1871. begin
  1872. Writer.IndentSize:=2;
  1873. Writer.Options:=[woCompact,woUseUTF8];
  1874. T:=TJSTryCatchFinallyStatement.Create(0,0);
  1875. T.Ident:='e';
  1876. A:=TJSSimpleAssignStatement.Create(0,0);
  1877. A.LHS:=CreateIdent('b');
  1878. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1879. M.A:=CreateIdent('b');
  1880. M.B:=CreateLiteral(10);
  1881. A.Expr:=M;
  1882. T.Block:=A;
  1883. A:=TJSSimpleAssignStatement.Create(0,0);
  1884. A.LHS:=CreateIdent('b');
  1885. A.Expr:=CreateLiteral(10);
  1886. T.BCatch:=A;
  1887. A:=TJSSimpleAssignStatement.Create(0,0);
  1888. A.LHS:=CreateIdent('b');
  1889. A.Expr:=CreateLiteral(1);
  1890. T.BFinally:=A;
  1891. AssertWrite('Try finally ','try {b=b*10} catch (e) {b=10} finally {b=1}',T);
  1892. end;
  1893. procedure TTestStatementWriter.TestWith;
  1894. Var
  1895. T : TJSWithStatement;
  1896. A : TJSAssignStatement;
  1897. M : TJSMultiplicativeExpressionMul;
  1898. begin
  1899. Writer.IndentSize:=2;
  1900. // Writer.Options:=[woCompact,woUseUTF8];
  1901. T:=TJSWithStatement.Create(0,0);
  1902. T.A:=CreateIdent('e');
  1903. A:=TJSSimpleAssignStatement.Create(0,0);
  1904. A.LHS:=CreateIdent('b');
  1905. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1906. M.A:=CreateIdent('b');
  1907. M.B:=CreateLiteral(10);
  1908. A.Expr:=M;
  1909. T.B:=A;
  1910. AssertWrite('With statement ','with (e)'+slineBreak+' b = b * 10',T);
  1911. end;
  1912. procedure TTestStatementWriter.TestWithCompact;
  1913. Var
  1914. T : TJSWithStatement;
  1915. A : TJSAssignStatement;
  1916. M : TJSMultiplicativeExpressionMul;
  1917. begin
  1918. Writer.IndentSize:=2;
  1919. Writer.Options:=[woCompact,woUseUTF8];
  1920. T:=TJSWithStatement.Create(0,0);
  1921. T.A:=CreateIdent('e');
  1922. A:=TJSSimpleAssignStatement.Create(0,0);
  1923. A.LHS:=CreateIdent('b');
  1924. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1925. M.A:=CreateIdent('b');
  1926. M.B:=CreateLiteral(10);
  1927. A.Expr:=M;
  1928. T.B:=A;
  1929. AssertWrite('With statement ','with (e) b=b*10',T);
  1930. end;
  1931. procedure TTestStatementWriter.TestSourceElements;
  1932. Var
  1933. T : TJSSourceElements;
  1934. A : TJSAssignStatement;
  1935. M : TJSMultiplicativeExpressionMul;
  1936. begin
  1937. Writer.IndentSize:=2;
  1938. // Writer.Options:=[woCompact,woUseUTF8];
  1939. T:=TJSSourceElements.Create(0,0);
  1940. A:=TJSSimpleAssignStatement.Create(0,0);
  1941. A.LHS:=CreateIdent('b');
  1942. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1943. M.A:=CreateIdent('b');
  1944. M.B:=CreateLiteral(10);
  1945. A.Expr:=M;
  1946. T.Statements.AddNode.Node:=A;
  1947. A:=TJSSimpleAssignStatement.Create(0,0);
  1948. A.LHS:=CreateIdent('c');
  1949. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1950. M.A:=CreateIdent('c');
  1951. M.B:=CreateLiteral(2);
  1952. A.Expr:=M;
  1953. T.Statements.AddNode.Node:=A;
  1954. AssertWrite('Statement lists ','b = b * 10;'+sLineBreak+'c = c * 2;'+sLineBreak,T);
  1955. end;
  1956. procedure TTestStatementWriter.TestSourceElementsCompact;
  1957. Var
  1958. T : TJSSourceElements;
  1959. A : TJSAssignStatement;
  1960. M : TJSMultiplicativeExpressionMul;
  1961. begin
  1962. Writer.IndentSize:=2;
  1963. Writer.Options:=[woCompact,woUseUTF8];
  1964. T:=TJSSourceElements.Create(0,0);
  1965. A:=TJSSimpleAssignStatement.Create(0,0);
  1966. A.LHS:=CreateIdent('b');
  1967. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1968. M.A:=CreateIdent('b');
  1969. M.B:=CreateLiteral(10);
  1970. A.Expr:=M;
  1971. T.Statements.AddNode.Node:=A;
  1972. A:=TJSSimpleAssignStatement.Create(0,0);
  1973. A.LHS:=CreateIdent('c');
  1974. M:=TJSMultiplicativeExpressionMul.Create(0,0);
  1975. M.A:=CreateIdent('c');
  1976. M.B:=CreateLiteral(2);
  1977. A.Expr:=M;
  1978. T.Statements.AddNode.Node:=A;
  1979. AssertWrite('Statement lists compact','b=b*10; c=c*2;',T);
  1980. end;
  1981. procedure TTestStatementWriter.TestImportModule;
  1982. Var
  1983. Imp : TJSImportStatement;
  1984. begin
  1985. Imp:=TJSImportStatement.Create(0,0);
  1986. Imp.ModuleName:='a.js';
  1987. AssertWrite('Import statement','import "a.js"',Imp);
  1988. end;
  1989. procedure TTestStatementWriter.TestImportDefaultBinding;
  1990. Var
  1991. Imp : TJSImportStatement;
  1992. begin
  1993. Imp:=TJSImportStatement.Create(0,0);
  1994. Imp.DefaultBinding:='A';
  1995. Imp.ModuleName:='a.js';
  1996. AssertWrite('Import statement','import A from "a.js"',Imp);
  1997. end;
  1998. procedure TTestStatementWriter.TestImportDefaultBindingNameSpace;
  1999. Var
  2000. Imp : TJSImportStatement;
  2001. begin
  2002. Imp:=TJSImportStatement.Create(0,0);
  2003. Imp.DefaultBinding:='A';
  2004. Imp.NameSpaceImport:='Q';
  2005. Imp.ModuleName:='a.js';
  2006. AssertWrite('Import statement','import A , * as Q from "a.js"',Imp);
  2007. end;
  2008. procedure TTestStatementWriter.TestImportNameSpace;
  2009. Var
  2010. Imp : TJSImportStatement;
  2011. begin
  2012. Imp:=TJSImportStatement.Create(0,0);
  2013. Imp.NameSpaceImport:='Q';
  2014. Imp.ModuleName:='a.js';
  2015. AssertWrite('Import statement','import * as Q from "a.js"',Imp);
  2016. end;
  2017. procedure TTestStatementWriter.TestImportNamedImport;
  2018. Var
  2019. Imp : TJSImportStatement;
  2020. begin
  2021. Imp:=TJSImportStatement.Create(0,0);
  2022. With Imp.NamedImports.AddElement do
  2023. begin
  2024. Name:='A';
  2025. end;
  2026. Imp.ModuleName:='a.js';
  2027. AssertWrite('Import statement','import { A } from "a.js"',Imp);
  2028. end;
  2029. procedure TTestStatementWriter.TestImportNamedImportAlias;
  2030. Var
  2031. Imp : TJSImportStatement;
  2032. begin
  2033. Imp:=TJSImportStatement.Create(0,0);
  2034. With Imp.NamedImports.AddElement do
  2035. begin
  2036. Name:='A';
  2037. Alias:='Q';
  2038. end;
  2039. Imp.ModuleName:='a.js';
  2040. AssertWrite('Import statement','import { A as Q } from "a.js"',Imp);
  2041. end;
  2042. procedure TTestStatementWriter.TestImport2NamedImport;
  2043. Var
  2044. Imp : TJSImportStatement;
  2045. begin
  2046. Imp:=TJSImportStatement.Create(0,0);
  2047. With Imp.NamedImports.AddElement do
  2048. begin
  2049. Name:='A';
  2050. end;
  2051. With Imp.NamedImports.AddElement do
  2052. begin
  2053. Name:='B';
  2054. end;
  2055. Imp.ModuleName:='a.js';
  2056. AssertWrite('Import statement','import { A , B } from "a.js"',Imp);
  2057. end;
  2058. procedure TTestStatementWriter.TestImportDefaultBindingNamedImport;
  2059. Var
  2060. Imp : TJSImportStatement;
  2061. begin
  2062. Imp:=TJSImportStatement.Create(0,0);
  2063. Imp.DefaultBinding:='C';
  2064. With Imp.NamedImports.AddElement do
  2065. Name:='A';
  2066. Imp.ModuleName:='a.js';
  2067. AssertWrite('Import statement','import C , { A } from "a.js"',Imp);
  2068. end;
  2069. procedure TTestStatementWriter.TestExportAll;
  2070. Var
  2071. Exp : TJSExportStatement;
  2072. begin
  2073. Exp:=TJSExportStatement.Create(0,0);
  2074. Exp.NameSpaceExport:='*';
  2075. AssertWrite('Export statement','export *',Exp);
  2076. end;
  2077. procedure TTestStatementWriter.TestExportAllFrom;
  2078. Var
  2079. Exp : TJSExportStatement;
  2080. begin
  2081. Exp:=TJSExportStatement.Create(0,0);
  2082. Exp.NameSpaceExport:='*';
  2083. Exp.ModuleName:='a.js';
  2084. AssertWrite('Export statement','export * from "a.js"',Exp);
  2085. end;
  2086. procedure TTestStatementWriter.TestExportExportName;
  2087. Var
  2088. Exp : TJSExportStatement;
  2089. begin
  2090. Exp:=TJSExportStatement.Create(0,0);
  2091. Exp.ExportNames.AddAlias.Name:='a';
  2092. AssertWrite('Export statement','export { a }',Exp);
  2093. end;
  2094. procedure TTestStatementWriter.TestExportExportNameAlias;
  2095. Var
  2096. Exp : TJSExportStatement;
  2097. begin
  2098. Exp:=TJSExportStatement.Create(0,0);
  2099. With Exp.ExportNames.AddAlias do
  2100. begin
  2101. Name:='a';
  2102. Alias:='b';
  2103. end;
  2104. AssertWrite('Export statement','export { a as b }',Exp);
  2105. end;
  2106. procedure TTestStatementWriter.TestExportExportNameFrom;
  2107. Var
  2108. Exp : TJSExportStatement;
  2109. begin
  2110. Exp:=TJSExportStatement.Create(0,0);
  2111. Exp.ExportNames.AddAlias.Name:='a';
  2112. Exp.ModuleName:='a.js';
  2113. AssertWrite('Export statement','export { a } from "a.js"',Exp);
  2114. end;
  2115. procedure TTestStatementWriter.TestExportVar;
  2116. Var
  2117. Exp : TJSExportStatement;
  2118. VS : TJSVariableStatement;
  2119. VV : TJSVarDeclaration;
  2120. begin
  2121. Exp:=TJSExportStatement.Create(0,0);
  2122. VS:=TJSVariableStatement.Create(0,0);
  2123. VV:=TJSVarDeclaration.Create(0,0);
  2124. VS.VarDecl:=VV;
  2125. VV.Name:='a';
  2126. Exp.Declaration:=VS;
  2127. AssertWrite('Export statement','export var a',Exp);
  2128. end;
  2129. procedure TTestStatementWriter.TestExportLet;
  2130. Var
  2131. Exp : TJSExportStatement;
  2132. VS : TJSVariableStatement;
  2133. VV : TJSVarDeclaration;
  2134. begin
  2135. Exp:=TJSExportStatement.Create(0,0);
  2136. VS:=TJSVariableStatement.Create(0,0);
  2137. VS.varType:=vtLet;
  2138. VV:=TJSVarDeclaration.Create(0,0);
  2139. VS.VarDecl:=VV;
  2140. VV.varType:=vtLet;
  2141. VV.Name:='a';
  2142. Exp.Declaration:=VS;
  2143. AssertWrite('Export statement','export let a',Exp);
  2144. end;
  2145. procedure TTestStatementWriter.TestExportConst;
  2146. Var
  2147. Exp : TJSExportStatement;
  2148. VS : TJSVariableStatement;
  2149. VV : TJSVarDeclaration;
  2150. begin
  2151. Exp:=TJSExportStatement.Create(0,0);
  2152. VS:=TJSVariableStatement.Create(0,0);
  2153. VS.varType:=vtConst;
  2154. VV:=TJSVarDeclaration.Create(0,0);
  2155. VS.VarDecl:=VV;
  2156. VV.varType:=vtConst;
  2157. VV.Name:='a';
  2158. Exp.Declaration:=VS;
  2159. AssertWrite('Export statement','export const a',Exp);
  2160. end;
  2161. procedure TTestStatementWriter.TestExportFunction;
  2162. Var
  2163. Exp : TJSExportStatement;
  2164. FD : TJSFunctionDeclarationStatement;
  2165. begin
  2166. Exp:=TJSExportStatement.Create(0,0);
  2167. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  2168. FD.AFunction:=TJSFuncDef.Create;
  2169. FD.AFunction.Name:='a';
  2170. Exp.Declaration:=FD;
  2171. AssertWrite('Empty function',
  2172. 'export function a() {'+sLineBreak
  2173. +'}',Exp);
  2174. end;
  2175. procedure TTestStatementWriter.TestExportDefaultAssignment;
  2176. Var
  2177. Exp : TJSExportStatement;
  2178. U : TJSAssignStatement;
  2179. begin
  2180. Exp:=TJSExportStatement.Create(0,0);
  2181. Exp.IsDefault:=True;
  2182. U:=CreateAssignment(TJSSimpleAssignStatement);
  2183. Exp.Declaration:=U;
  2184. AssertWrite('Export','export default a = b',Exp);
  2185. end;
  2186. procedure TTestStatementWriter.TestExportDefaultFunction;
  2187. Var
  2188. Exp : TJSExportStatement;
  2189. FD : TJSFunctionDeclarationStatement;
  2190. begin
  2191. Exp:=TJSExportStatement.Create(0,0);
  2192. Exp.IsDefault:=True;
  2193. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  2194. FD.AFunction:=TJSFuncDef.Create;
  2195. FD.AFunction.Name:='a';
  2196. Exp.Declaration:=FD;
  2197. AssertWrite('Empty function',
  2198. 'export default function a() {'+sLineBreak
  2199. +'}',Exp);
  2200. end;
  2201. procedure TTestStatementWriter.TestExportDefaultAsyncFunction;
  2202. Var
  2203. Exp : TJSExportStatement;
  2204. FD : TJSFunctionDeclarationStatement;
  2205. begin
  2206. Exp:=TJSExportStatement.Create(0,0);
  2207. Exp.IsDefault:=True;
  2208. FD:=TJSFunctionDeclarationStatement.Create(0,0);
  2209. FD.AFunction:=TJSFuncDef.Create;
  2210. FD.AFunction.IsAsync:=True;
  2211. FD.AFunction.Name:='a';
  2212. Exp.Declaration:=FD;
  2213. AssertWrite('Empty function',
  2214. 'export default async function a() {'+sLineBreak
  2215. +'}',Exp);
  2216. end;
  2217. { ---------------------------------------------------------------------
  2218. TTestLiteralWriter
  2219. ---------------------------------------------------------------------}
  2220. Procedure TTestLiteralWriter.TestInteger;
  2221. begin
  2222. AssertWrite('1','1',CreateLiteral(1));
  2223. end;
  2224. Procedure TTestLiteralWriter.TestBooleanTrue;
  2225. Var
  2226. L : TJSLiteral;
  2227. begin
  2228. L:=TJSLiteral.Create(0,0,'');
  2229. L.Value.Asboolean:=True;
  2230. AssertWrite('true','true',L);
  2231. end;
  2232. Procedure TTestLiteralWriter.TestBooleanFalse;
  2233. Var
  2234. L : TJSLiteral;
  2235. begin
  2236. L:=TJSLiteral.Create(0,0,'');
  2237. L.Value.Asboolean:=False;
  2238. AssertWrite('false','false',L);
  2239. end;
  2240. Procedure TTestLiteralWriter.TestUndefined;
  2241. Var
  2242. L : TJSLiteral;
  2243. begin
  2244. L:=TJSLiteral.Create(0,0,'');
  2245. AssertWrite('undefined','undefined',L);
  2246. end;
  2247. Procedure TTestLiteralWriter.TestNull;
  2248. Var
  2249. L : TJSLiteral;
  2250. begin
  2251. L:=TJSLiteral.Create(0,0,'');
  2252. L.Value.IsNull:=True;
  2253. AssertWrite('null','null',L);
  2254. end;
  2255. Procedure TTestLiteralWriter.TestString;
  2256. Var
  2257. L : TJSLiteral;
  2258. begin
  2259. L:=TJSLiteral.Create(0,0,'');
  2260. L.Value.AsString:='abcd';
  2261. AssertWrite('abcd','"abcd"',L);
  2262. end;
  2263. Procedure TTestLiteralWriter.TestStringQuote;
  2264. Var
  2265. L : TJSLiteral;
  2266. begin
  2267. L:=TJSLiteral.Create(0,0,'');
  2268. L.Value.AsString:='ab"cd';
  2269. AssertWrite('ab"cd','''ab"cd''',L);
  2270. end;
  2271. Procedure TTestLiteralWriter.TestStringBackslash;
  2272. Var
  2273. L : TJSLiteral;
  2274. begin
  2275. L:=TJSLiteral.Create(0,0,'');
  2276. L.Value.AsString:='ab\cd';
  2277. AssertWrite('ab\cd','"ab\\cd"',L);
  2278. end;
  2279. Procedure TTestLiteralWriter.TestStringslash;
  2280. Var
  2281. L : TJSLiteral;
  2282. begin
  2283. L:=TJSLiteral.Create(0,0,'');
  2284. L.Value.AsString:='ab/cd';
  2285. AssertWrite('ab/cd','"ab/cd"',L);
  2286. end;
  2287. Procedure TTestLiteralWriter.TestStringsBack;
  2288. Var
  2289. L : TJSLiteral;
  2290. begin
  2291. L:=TJSLiteral.Create(0,0,'');
  2292. L.Value.AsString:='ab'#8'cd';
  2293. AssertWrite('ab'#8'cd','"ab\bcd"',L);
  2294. end;
  2295. Procedure TTestLiteralWriter.TestStringsTab;
  2296. Var
  2297. L : TJSLiteral;
  2298. begin
  2299. L:=TJSLiteral.Create(0,0,'');
  2300. L.Value.AsString:='ab'#9'cd';
  2301. AssertWrite('ab'#9'cd','"ab\tcd"',L);
  2302. end;
  2303. Procedure TTestLiteralWriter.TestStringsLineFeed;
  2304. Var
  2305. L : TJSLiteral;
  2306. begin
  2307. L:=TJSLiteral.Create(0,0,'');
  2308. L.Value.AsString:='ab'#10'cd';
  2309. AssertWrite('ab'#10'cd','"ab\ncd"',L);
  2310. end;
  2311. Procedure TTestLiteralWriter.TestStringsFormFeed;
  2312. Var
  2313. L : TJSLiteral;
  2314. begin
  2315. L:=TJSLiteral.Create(0,0,'');
  2316. L.Value.AsString:='ab'#12'cd';
  2317. AssertWrite('ab'#12'cd','"ab\fcd"',L);
  2318. end;
  2319. Procedure TTestLiteralWriter.TestStringsCarriageReturn;
  2320. Var
  2321. L : TJSLiteral;
  2322. begin
  2323. L:=TJSLiteral.Create(0,0,'');
  2324. L.Value.AsString:='ab'#13'cd';
  2325. AssertWrite('ab'#13'cd','"ab\rcd"',L);
  2326. end;
  2327. Procedure TTestLiteralWriter.TestArrayEmpty;
  2328. Var
  2329. L : TJSArrayLiteral;
  2330. begin
  2331. L:=TJSArrayLiteral.Create(0,0);
  2332. AssertWrite('Empty array ','[]',L); // Always
  2333. end;
  2334. Procedure TTestLiteralWriter.TestArrayEmptyCompact;
  2335. Var
  2336. L : TJSArrayLiteral;
  2337. begin
  2338. Writer.Options:=[woCompact,woUseUTF8];
  2339. L:=TJSArrayLiteral.Create(0,0);
  2340. AssertWrite('Empty array ','[]',L);
  2341. end;
  2342. Procedure TTestLiteralWriter.TestArrayOneElement;
  2343. Var
  2344. L : TJSArrayLiteral;
  2345. I : TJSLiteral;
  2346. begin
  2347. L:=TJSArrayLiteral.Create(0,0);
  2348. I:=TJSLiteral.Create(0,0);
  2349. I.Value.AsNumber:=1;
  2350. L.Elements.AddElement.Expr:=I;
  2351. AssertWrite('Empty array ','[1]',L);
  2352. end;
  2353. Procedure TTestLiteralWriter.TestArrayOneElementCompact;
  2354. Var
  2355. L : TJSArrayLiteral;
  2356. I : TJSLiteral;
  2357. begin
  2358. Writer.Options:=[woCompact,woUseUTF8];
  2359. L:=TJSArrayLiteral.Create(0,0);
  2360. I:=TJSLiteral.Create(0,0);
  2361. I.Value.AsNumber:=1;
  2362. L.Elements.AddElement.Expr:=I;
  2363. AssertWrite('Empty array ','[1]',L);
  2364. end;
  2365. Procedure TTestLiteralWriter.TestArrayOneElementIndent;
  2366. Var
  2367. L : TJSArrayLiteral;
  2368. I : TJSLiteral;
  2369. begin
  2370. Writer.IndentSize:=2;
  2371. L:=TJSArrayLiteral.Create(0,0);
  2372. I:=TJSLiteral.Create(0,0);
  2373. I.Value.AsNumber:=1;
  2374. L.Elements.AddElement.Expr:=I;
  2375. AssertWrite('Empty array ','[1]',L);
  2376. end;
  2377. Procedure TTestLiteralWriter.TestArrayTwoElements;
  2378. Var
  2379. L : TJSArrayLiteral;
  2380. I : TJSLiteral;
  2381. begin
  2382. L:=TJSArrayLiteral.Create(0,0);
  2383. I:=TJSLiteral.Create(0,0);
  2384. I.Value.AsNumber:=1;
  2385. L.Elements.AddElement.Expr:=I;
  2386. I:=TJSLiteral.Create(0,0);
  2387. I.Value.AsNumber:=2;
  2388. L.Elements.AddElement.Expr:=I;
  2389. AssertWrite('Empty array ','[1, 2]',L);
  2390. end;
  2391. Procedure TTestLiteralWriter.TestArrayTwoElementsCompact;
  2392. Var
  2393. L : TJSArrayLiteral;
  2394. I : TJSLiteral;
  2395. begin
  2396. Writer.Options:=[woCompact,woUseUTF8];
  2397. L:=TJSArrayLiteral.Create(0,0);
  2398. I:=TJSLiteral.Create(0,0);
  2399. I.Value.AsNumber:=1;
  2400. L.Elements.AddElement.Expr:=I;
  2401. I:=TJSLiteral.Create(0,0);
  2402. I.Value.AsNumber:=2;
  2403. L.Elements.AddElement.Expr:=I;
  2404. AssertWrite('Empty array ','[1,2]',L);
  2405. end;
  2406. Procedure TTestLiteralWriter.TestArrayTwoElementsCompact2;
  2407. Var
  2408. L : TJSArrayLiteral;
  2409. I : TJSLiteral;
  2410. begin
  2411. Writer.Options:=[woCompactArrayLiterals,woUseUTF8];
  2412. L:=TJSArrayLiteral.Create(0,0);
  2413. I:=TJSLiteral.Create(0,0);
  2414. I.Value.AsNumber:=1;
  2415. L.Elements.AddElement.Expr:=I;
  2416. I:=TJSLiteral.Create(0,0);
  2417. I.Value.AsNumber:=2;
  2418. L.Elements.AddElement.Expr:=I;
  2419. AssertWrite('Empty array ','[1,2]',L);
  2420. end;
  2421. Procedure TTestLiteralWriter.TestArrayThreeElementsCompact;
  2422. Var
  2423. L : TJSArrayLiteral;
  2424. I : TJSLiteral;
  2425. begin
  2426. Writer.Options:=[woCompact,woUseUTF8];
  2427. L:=TJSArrayLiteral.Create(0,0);
  2428. I:=TJSLiteral.Create(0,0);
  2429. I.Value.AsNumber:=1;
  2430. L.Elements.AddElement.Expr:=I;
  2431. I:=TJSLiteral.Create(0,0);
  2432. I.Value.AsNumber:=2;
  2433. L.Elements.AddElement.Expr:=I;
  2434. I:=TJSLiteral.Create(0,0);
  2435. I.Value.AsNumber:=3;
  2436. L.Elements.AddElement.Expr:=I;
  2437. AssertWrite('Empty array ','[1,2,3]',L);
  2438. end;
  2439. Procedure TTestLiteralWriter.TestObjectEmpty;
  2440. Var
  2441. L : TJSObjectLiteral;
  2442. begin
  2443. L:=TJSObjectLiteral.Create(0,0);
  2444. AssertWrite('Empty object ','{}',L); // Always
  2445. end;
  2446. Procedure TTestLiteralWriter.TestObjectEmptyCompact;
  2447. Var
  2448. L : TJSObjectLiteral;
  2449. begin
  2450. Writer.Options:=[woCompact,woUseUTF8];
  2451. L:=TJSObjectLiteral.Create(0,0);
  2452. AssertWrite('Empty object ','{}',L); // Always
  2453. end;
  2454. Procedure TTestLiteralWriter.TestObjectOneElement;
  2455. Var
  2456. L : TJSObjectLiteral;
  2457. E : TJSObjectLiteralElement;
  2458. I : TJSLiteral;
  2459. begin
  2460. L:=TJSObjectLiteral.Create(0,0);
  2461. E:=L.Elements.AddElement;
  2462. I:=TJSLiteral.Create(0,0);
  2463. I.Value.AsNumber:=1;
  2464. E.Expr:=I;
  2465. E.Name:='abc';
  2466. AssertWrite('Empty object ','{'+slineBreak+'abc: 1'+sLineBreak+'}',L);
  2467. end;
  2468. Procedure TTestLiteralWriter.TestObjectOneElementCompact;
  2469. Var
  2470. L : TJSObjectLiteral;
  2471. E : TJSObjectLiteralElement;
  2472. I : TJSLiteral;
  2473. begin
  2474. L:=TJSObjectLiteral.Create(0,0);
  2475. E:=L.Elements.AddElement;
  2476. I:=TJSLiteral.Create(0,0);
  2477. I.Value.AsNumber:=1;
  2478. E.Expr:=I;
  2479. E.Name:='abc';
  2480. Writer.Options:=[woCompact,woUseUTF8];
  2481. AssertWrite('Empty object ','{abc: 1}',L);
  2482. end;
  2483. Procedure TTestLiteralWriter.TestObjectOneElementIndent;
  2484. Var
  2485. L : TJSObjectLiteral;
  2486. E : TJSObjectLiteralElement;
  2487. I : TJSLiteral;
  2488. begin
  2489. L:=TJSObjectLiteral.Create(0,0);
  2490. E:=L.Elements.AddElement;
  2491. I:=TJSLiteral.Create(0,0);
  2492. I.Value.AsNumber:=1;
  2493. E.Expr:=I;
  2494. E.Name:='abc';
  2495. Writer.IndentSize:=2;
  2496. AssertWrite('Empty object ','{'+slineBreak+' abc: 1'+sLineBreak+'}',L);
  2497. end;
  2498. Procedure TTestLiteralWriter.TestObjectOneElementCompactQuoted;
  2499. Var
  2500. L : TJSObjectLiteral;
  2501. E : TJSObjectLiteralElement;
  2502. I : TJSLiteral;
  2503. begin
  2504. L:=TJSObjectLiteral.Create(0,0);
  2505. E:=L.Elements.AddElement;
  2506. I:=TJSLiteral.Create(0,0);
  2507. I.Value.AsNumber:=1;
  2508. E.Expr:=I;
  2509. E.Name:='abc';
  2510. Writer.Options:=[woCompact,woUseUTF8,woQuoteElementNames];
  2511. AssertWrite('Empty object ','{"abc": 1}',L);
  2512. end;
  2513. Procedure TTestLiteralWriter.TestObjectTwoElements;
  2514. Var
  2515. L : TJSObjectLiteral;
  2516. E : TJSObjectLiteralElement;
  2517. I : TJSLiteral;
  2518. begin
  2519. L:=TJSObjectLiteral.Create(0,0);
  2520. E:=L.Elements.AddElement;
  2521. I:=TJSLiteral.Create(0,0);
  2522. I.Value.AsNumber:=1;
  2523. E.Expr:=I;
  2524. E.Name:='abc';
  2525. E:=L.Elements.AddElement;
  2526. I:=TJSLiteral.Create(0,0);
  2527. I.Value.AsNumber:=2;
  2528. E.Expr:=I;
  2529. E.Name:='efg';
  2530. AssertWrite('Empty object ','{'+slineBreak+'abc: 1,'+sLineBreak+'efg: 2'+slineBreak+'}',L);
  2531. end;
  2532. Procedure TTestLiteralWriter.TestObjectTwoElementCompact;
  2533. Var
  2534. L : TJSObjectLiteral;
  2535. E : TJSObjectLiteralElement;
  2536. I : TJSLiteral;
  2537. begin
  2538. L:=TJSObjectLiteral.Create(0,0);
  2539. E:=L.Elements.AddElement;
  2540. I:=TJSLiteral.Create(0,0);
  2541. I.Value.AsNumber:=1;
  2542. E.Expr:=I;
  2543. E.Name:='abc';
  2544. E:=L.Elements.AddElement;
  2545. I:=TJSLiteral.Create(0,0);
  2546. I.Value.AsNumber:=2;
  2547. E.Expr:=I;
  2548. E.Name:='efg';
  2549. Writer.Options:=[woCompact,woUseUTF8];
  2550. AssertWrite('Empty object ','{abc: 1, efg: 2}',L);
  2551. end;
  2552. Procedure TTestLiteralWriter.TestObjectTwoElementCompact2;
  2553. Var
  2554. L : TJSObjectLiteral;
  2555. E : TJSObjectLiteralElement;
  2556. I : TJSLiteral;
  2557. begin
  2558. L:=TJSObjectLiteral.Create(0,0);
  2559. E:=L.Elements.AddElement;
  2560. I:=TJSLiteral.Create(0,0);
  2561. I.Value.AsNumber:=1;
  2562. E.Expr:=I;
  2563. E.Name:='abc';
  2564. E:=L.Elements.AddElement;
  2565. I:=TJSLiteral.Create(0,0);
  2566. I.Value.AsNumber:=2;
  2567. E.Expr:=I;
  2568. E.Name:='efg';
  2569. Writer.Options:=[woCompactObjectLiterals,woUseUTF8];
  2570. AssertWrite('Empty object ','{abc: 1, efg: 2}',L);
  2571. end;
  2572. Procedure TTestLiteralWriter.TestObjectTwoElementCompactQuoted;
  2573. Var
  2574. L : TJSObjectLiteral;
  2575. E : TJSObjectLiteralElement;
  2576. I : TJSLiteral;
  2577. begin
  2578. L:=TJSObjectLiteral.Create(0,0);
  2579. E:=L.Elements.AddElement;
  2580. I:=TJSLiteral.Create(0,0);
  2581. I.Value.AsNumber:=1;
  2582. E.Expr:=I;
  2583. E.Name:='abc';
  2584. E:=L.Elements.AddElement;
  2585. I:=TJSLiteral.Create(0,0);
  2586. I.Value.AsNumber:=2;
  2587. E.Expr:=I;
  2588. E.Name:='efg';
  2589. Writer.Options:=[woCompact,woUseUTF8,woQuoteElementNames];
  2590. AssertWrite('Empty object ','{"abc": 1, "efg": 2}',L);
  2591. end;
  2592. Procedure TTestLiteralWriter.TestObjectThreeElementsCompact;
  2593. Var
  2594. L : TJSObjectLiteral;
  2595. E : TJSObjectLiteralElement;
  2596. I : TJSLiteral;
  2597. begin
  2598. L:=TJSObjectLiteral.Create(0,0);
  2599. E:=L.Elements.AddElement;
  2600. I:=TJSLiteral.Create(0,0);
  2601. I.Value.AsNumber:=1;
  2602. E.Expr:=I;
  2603. E.Name:='abc';
  2604. E:=L.Elements.AddElement;
  2605. I:=TJSLiteral.Create(0,0);
  2606. I.Value.AsNumber:=2;
  2607. E.Expr:=I;
  2608. E.Name:='efg';
  2609. E:=L.Elements.AddElement;
  2610. I:=TJSLiteral.Create(0,0);
  2611. I.Value.AsNumber:=3;
  2612. E.Expr:=I;
  2613. E.Name:='hij';
  2614. Writer.Options:=[woCompact,woUseUTF8];
  2615. AssertWrite('Empty object ','{abc: 1, efg: 2, hij: 3}',L);
  2616. end;
  2617. { ---------------------------------------------------------------------
  2618. TTestJSWriter
  2619. ---------------------------------------------------------------------}
  2620. procedure TTestJSWriter.SetUp;
  2621. begin
  2622. FTextWriter:=TBufferWriter.Create(120);
  2623. FWriter:=TJSWriter.Create(FTextWriter);
  2624. end;
  2625. procedure TTestJSWriter.TearDown;
  2626. begin
  2627. FreeAndNil(FWriter);
  2628. FreeAndNil(FTextWriter);
  2629. FreeAndNil(FElement);
  2630. end;
  2631. Procedure TTestJSWriter.WriteElement(JS: TJSElement);
  2632. begin
  2633. FElement:=JS;
  2634. FWriter.WriteJS(JS);
  2635. end;
  2636. Procedure TTestJSWriter.AssertResult(Const Msg, Result: AnsiString);
  2637. Var
  2638. S : AnsiString;
  2639. p: Integer;
  2640. begin
  2641. S:=FTextWriter.AsString;
  2642. if S=Result then exit;
  2643. p:=1;
  2644. while (p<=length(S)) and (p<=length(Result)) and (S[p]=Result[p]) do inc(p);
  2645. if p>length(S) then
  2646. AssertEquals(Msg+' (actual too short)',Result,S)
  2647. else if p>length(Result) then
  2648. AssertEquals(Msg+' (actual too long)',Result,S)
  2649. else
  2650. AssertEquals(Msg+' (diff at '+IntToStr(p)+' "'+S[p]+'")',Result,S);
  2651. end;
  2652. Procedure TTestJSWriter.AssertResult(Const Msg: string; Result: UnicodeString);
  2653. Var
  2654. S : UnicodeString;
  2655. p: Integer;
  2656. begin
  2657. S:=UTF8Decode(FTextWriter.AsString);
  2658. if S=Result then exit;
  2659. p:=1;
  2660. while (p<=length(S)) and (p<=length(Result)) and (S[p]=Result[p]) do inc(p);
  2661. if p>length(S) then
  2662. AssertEquals(Msg+' (actual too short)',String(Result),String(S))
  2663. else if p>length(Result) then
  2664. AssertEquals(Msg+' (actual too long)',String(Result),String(S))
  2665. else
  2666. AssertEquals(Msg+' (diff at '+IntToStr(p)+' "'+String(S[p])+'")',String(Result),String(S));
  2667. end;
  2668. Procedure TTestJSWriter.AssertWrite(Const Msg : String; Result: AnsiString;
  2669. AElement: TJSElement);
  2670. begin
  2671. WriteElement(AElement);
  2672. AssertResult(Msg,Result);
  2673. end;
  2674. Procedure TTestJSWriter.AssertWrite(Const Msg: string; Result: UnicodeString;
  2675. AElement: TJSElement);
  2676. begin
  2677. WriteElement(AElement);
  2678. AssertResult(Msg,Result);
  2679. end;
  2680. Function TTestJSWriter.CreateIdent(Const AName: String): TJSPrimaryExpressionIdent;
  2681. begin
  2682. Result:=TJSPrimaryExpressionIdent.Create(0,0);
  2683. Result.Name:=TJSString(AName);
  2684. end;
  2685. Function TTestJSWriter.CreateLiteral(Const AValue: TJSString): TJSLiteral;
  2686. begin
  2687. Result:=TJSLiteral.Create(0,0);
  2688. Result.Value.AsString:=Avalue;
  2689. end;
  2690. Function TTestJSWriter.CreateLiteral(Const AValue: Integer): TJSLiteral;
  2691. begin
  2692. Result:=TJSLiteral.Create(0,0);
  2693. Result.Value.AsNumber:=Avalue;
  2694. end;
  2695. Function TTestJSWriter.CreateLiteral(Const AValue: Boolean): TJSLiteral;
  2696. begin
  2697. Result:=TJSLiteral.Create(0,0);
  2698. Result.Value.AsBoolean:=Avalue;
  2699. end;
  2700. { ---------------------------------------------------------------------
  2701. TTestTestJSWriter
  2702. ---------------------------------------------------------------------}
  2703. procedure TTestTestJSWriter.TestEmpty;
  2704. begin
  2705. AssertNotNull('Have text writer',TextWriter);
  2706. AssertNotNull('Have JS writer',Writer);
  2707. AssertNull('Have no element',Element);
  2708. AssertSame('Correct text writer for js writer',TextWriter,Writer.Writer);
  2709. AssertEquals('No indent',0,Writer.IndentSize);
  2710. if not (Writer.Options=[woUseUTF8]) then
  2711. Fail('Options are not using UTF8');
  2712. end;
  2713. Initialization
  2714. RegisterTests([TTestTestJSWriter,TTestLiteralWriter,TTestExpressionWriter,TTestStatementWriter]);
  2715. end.