tcwriter.pp 70 KB

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