tchtmlwidgets.pp 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993
  1. unit tcHTMLWidgets;
  2. {$mode objfpc}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry, web, webwidget, htmlwidgets, tcwidget, js;
  6. Type
  7. { TTestButtonWidget }
  8. TTestButtonWidget = Class(TBaseTestWidget)
  9. private
  10. FButton: TButtonWidget;
  11. Protected
  12. Procedure SetUp; override;
  13. Procedure TearDown; override;
  14. Property Button : TButtonWidget Read FButton;
  15. Published
  16. Procedure TestTextBeforeRender;
  17. Procedure TestTextAfterRender;
  18. Procedure TestTextElementID;
  19. Procedure TestClick;
  20. end;
  21. { TTestLabelWidget }
  22. TMyLabelWidget = Class(TLabelWidget)
  23. Public
  24. Property LabelElement;
  25. end;
  26. TTestLabelWidget = Class(TBaseTestWidget)
  27. private
  28. FEdit: TTextInputWidget;
  29. FMy: TMyLabelWidget;
  30. Protected
  31. Procedure SetUp; override;
  32. Procedure TearDown; override;
  33. Property My : TMyLabelWidget Read FMy;
  34. Property Edit : TTextInputWidget Read FEdit;
  35. Published
  36. Procedure TestPropsBeforeRender;
  37. Procedure TestPropsAfterRender;
  38. end;
  39. { TTestViewPort }
  40. { TMyViewPort }
  41. TMyViewPort = Class(TViewPort)
  42. Public
  43. Procedure SetParentId;
  44. Procedure SetParent;
  45. Procedure SetElementID;
  46. end;
  47. TTestViewPort = Class(TBaseTestWidget)
  48. private
  49. FMy: TMyViewPort;
  50. Protected
  51. Procedure Setup; override;
  52. Procedure TearDown; override;
  53. Property My : TMyViewPort Read FMy;
  54. Published
  55. Procedure TestInstance;
  56. Procedure TestHTMLTag;
  57. Procedure TestElement;
  58. Procedure TestUnrender;
  59. Procedure TestNoParent;
  60. Procedure TestNoElementID;
  61. Procedure TestNoParentID;
  62. end;
  63. { TTestPage }
  64. { TMyWebPage }
  65. TMyWebPage = Class(TWebPage)
  66. Public
  67. Procedure SetParentId;
  68. Procedure SetParent;
  69. Procedure SetElementID;
  70. end;
  71. TTestPage = Class(TBaseTestWidget)
  72. private
  73. FMy: TMyWebPage;
  74. Protected
  75. Function CreateElement(aID : String) : TJSHTMLElement;
  76. Procedure Setup; override;
  77. Procedure TearDown; override;
  78. Property My : TMyWebPage Read FMy;
  79. Published
  80. Procedure TestEmpty;
  81. Procedure TestAsWindow;
  82. Procedure TestNoParentOK;
  83. Procedure TestDefaultTag;
  84. end;
  85. { TBaseTestInputElement }
  86. TInputHack = class(TCustomInputWidget)
  87. Public
  88. Property Element;
  89. Property InputElement;
  90. end;
  91. TBaseTestInputElement = Class(TBaseTestWidget)
  92. private
  93. FMy: TCustomInputWidget;
  94. function GetInputElement: TJSHTMLInputElement;
  95. Protected
  96. // Must be handled in descendent. Called during setup to populate My.
  97. Function CreateInput : TCustomInputWidget; virtual; abstract;
  98. // (Re)create my. Calls createinput
  99. Procedure CreateMy; virtual;
  100. Procedure Setup; override;
  101. Procedure TearDown; override;
  102. // Assert basic properties are correct on the element.
  103. procedure AssertBaseProps(aType, aValueName, aValue: String; aText: String='');
  104. Property My : TCustomInputWidget Read FMy;
  105. Property InputElement : TJSHTMLInputElement Read GetInputElement;
  106. Published
  107. Procedure TestEmpty;
  108. Procedure TestRequiredOnRender;
  109. Procedure TestReadOnlyOnRender;
  110. Procedure TestRequiredAfterRender;
  111. Procedure TestReadOnlyAfterRender;
  112. end;
  113. { TTestTextInputElement }
  114. TTestTextInputElement = Class(TBaseTestInputElement)
  115. Protected
  116. FITT: TInputTextType;
  117. Procedure setup; override;
  118. Function CreateInput : TCustomInputWidget; override;
  119. Function MyText : TTextInputWidget;
  120. Published
  121. Procedure TestDefaultTextType;
  122. Procedure TestRender;
  123. Procedure TestChangeValue;
  124. Procedure TestChangeName;
  125. Procedure TestChangeTextType;
  126. Procedure TestTypePassword;
  127. Procedure TestTypeNumber;
  128. Procedure TestAsNumber;
  129. Procedure TestTypeEmail;
  130. Procedure TestTypeSearch;
  131. Procedure TestTypeTel;
  132. Procedure TestTypeURL;
  133. Procedure TestTypeColor;
  134. end;
  135. { TTestRadioInputElement }
  136. TTestRadioInputElement = Class(TBaseTestInputElement)
  137. Protected
  138. Function CreateInput : TCustomInputWidget; override;
  139. Function MyRadio : TRadioInputWidget;
  140. Published
  141. Procedure TestPropsOnRender;
  142. Procedure TestPropsAfterRender;
  143. end;
  144. TTestCheckboxInputElement = Class(TBaseTestInputElement)
  145. Protected
  146. Function CreateInput : TCustomInputWidget; override;
  147. Function MyCheckbox : TCheckboxInputWidget;
  148. Published
  149. Procedure TestPropsOnRender;
  150. Procedure TestPropsAfterRender;
  151. end;
  152. TMyDateInputWidget = Class(TDateInputWidget)
  153. end;
  154. { TTestDateInputElement }
  155. TTestDateInputElement = Class(TBaseTestInputElement)
  156. Protected
  157. Function CreateInput : TCustomInputWidget; override;
  158. Procedure CreateMy; override;
  159. Function MyDate : TMyDateInputWidget;
  160. Published
  161. Procedure TestPropsOnRender;
  162. Procedure TestPropsAfterRender;
  163. end;
  164. TMyFileInputWidget = Class(TFileInputWidget)
  165. end;
  166. { TTestFileInputElement }
  167. TTestFileInputElement = Class(TBaseTestInputElement)
  168. Protected
  169. Function CreateInput : TCustomInputWidget; override;
  170. Procedure CreateMy; override;
  171. Function MyFile : TMyFileInputWidget;
  172. Published
  173. Procedure TestPropsOnRender;
  174. Procedure TestPropsAfterRender;
  175. end;
  176. TMyHiddenInputWidget = Class(THiddenInputWidget)
  177. end;
  178. { TTestHiddenInputElement }
  179. TTestHiddenInputElement = Class(TBaseTestInputElement)
  180. Protected
  181. Function CreateInput : TCustomInputWidget; override;
  182. Function MyHidden : TMyHiddenInputWidget;
  183. Published
  184. Procedure TestPropsOnRender;
  185. Procedure TestPropsAfterRender;
  186. end;
  187. { TTestTextAreaElement }
  188. TMyTextAreaWidget = Class(TTextAreaWidget)
  189. Public
  190. Property TextArea;
  191. end;
  192. TTestTextAreaElement = Class(TBaseTestWidget)
  193. private
  194. FMy: TMyTextAreaWidget;
  195. function GetArea: TJSHTMLTextAreaElement;
  196. Protected
  197. Procedure Setup; override;
  198. Procedure TearDown; override;
  199. Property My : TMyTextAreaWidget Read FMy;
  200. Property Area : TJSHTMLTextAreaElement Read GetArea;
  201. Published
  202. Procedure TestEmpty;
  203. Procedure TestPropsOnRender;
  204. Procedure TestPropsAfterRender;
  205. end;
  206. TMyImageWidget = Class(TImageWidget)
  207. Public
  208. Property Element;
  209. end;
  210. { TTestImageElement }
  211. TTestImageElement = Class(TBaseTestWidget)
  212. private
  213. FMy: TMyImageWidget;
  214. function GetImg: TJSHTMLImageElement;
  215. Protected
  216. Procedure Setup; override;
  217. Procedure TearDown; override;
  218. Function ThisURL : String;
  219. Property My : TMyImageWidget Read FMy;
  220. Property Image : TJSHTMLImageElement Read GetImg;
  221. Published
  222. Procedure TestEmpty;
  223. Procedure TestPropsOnRender;
  224. Procedure TestPropsAfterRender;
  225. end;
  226. TMySelectWidget = Class(TSelectWidget)
  227. Public
  228. Property Element;
  229. Property SelectElement;
  230. Property Options;
  231. end;
  232. { TTestSelectElement }
  233. TTestSelectElement = Class(TBaseTestWidget)
  234. private
  235. FMy: TMySelectWidget;
  236. procedure AssertOption(Idx: Integer; aText, aValue: String; Selected: Boolean=False);
  237. function GetOptions: TJSHTMLOPtionElementArray;
  238. function GetSelect: TJSHTMLSelectElement;
  239. Protected
  240. Procedure Setup; override;
  241. Procedure TearDown; override;
  242. Property My : TMySelectWidget Read FMy;
  243. Property Select : TJSHTMLSelectElement Read GetSelect;
  244. Property Options : TJSHTMLOPtionElementArray Read GetOptions;
  245. Published
  246. Procedure TestEmpty;
  247. Procedure TestPropsOnRender;
  248. Procedure TestPropsAfterRender;
  249. Procedure TestMultiSelect;
  250. Procedure TestNoSelectedIndex;
  251. end;
  252. TMyTextWidget = Class(TTextWidget)
  253. Public
  254. Property Element;
  255. Property ParentElement;
  256. end;
  257. { TTestTextWidget }
  258. TTestTextWidget = Class(TBaseTestWidget)
  259. private
  260. FMy: TMyTextWidget;
  261. Protected
  262. Procedure Setup; override;
  263. Procedure TearDown; override;
  264. Property My : TMyTextWidget Read FMy;
  265. Published
  266. Procedure TestEmpty;
  267. Procedure TestRenderText;
  268. Procedure TestRenderedTextChange;
  269. Procedure TestRenderHTML;
  270. Procedure TestRenderedHTMLChange;
  271. procedure TestTextModeChangeRenders;
  272. procedure TestEnvelopeChangeRenders;
  273. end;
  274. TMyTextLinesWidget = Class(TTextLinesWidget)
  275. Public
  276. Property Element;
  277. Property ParentElement;
  278. end;
  279. { TTestTextLinesWidget }
  280. TTestTextLinesWidget = Class(TBaseTestWidget)
  281. private
  282. FMy: TMyTextLinesWidget;
  283. Protected
  284. Procedure Setup; override;
  285. Procedure TearDown; override;
  286. Property My : TMyTextLinesWidget Read FMy;
  287. Published
  288. Procedure TestEmpty;
  289. Procedure TestRenderText;
  290. Procedure TestRenderedTextChange;
  291. Procedure TestRenderTextLineBreaks;
  292. Procedure TestRenderHTML;
  293. Procedure TestRenderHTMLLineBreaks;
  294. Procedure TestRenderedHTMLChange;
  295. procedure TestTextModeChangeRenders;
  296. procedure TestEnvelopeChangeRenders;
  297. end;
  298. { TMyTableWidget }
  299. TMyTableWidget = Class(TCustomTableWidget)
  300. private
  301. FRowCount: Integer;
  302. Protected
  303. Type
  304. TMyTableRowCountEnumerator = Class(TTableRowCountEnumerator)
  305. procedure GetCellData(aData: TTableWidgetCellData); override;
  306. end;
  307. Public
  308. Constructor create(aOwner : TComponent); override;
  309. Function GetBodyRowEnumerator : TTableRowEnumerator; override;
  310. Function GetRowEnumerator(aKind: TRowKind): TTableRowEnumerator; override;
  311. Property RowCount : Integer Read FRowCount Write FRowCount;
  312. Property CustomColumns;
  313. Property Caption;
  314. Property TableOptions;
  315. Property OnGetCellData;
  316. Property OnCellClick;
  317. Property OnHeaderCellClick;
  318. Property OnFooterCellClick;
  319. Property OnRowClick;
  320. Property OnHeaderRowClick;
  321. Property OnFooterRowClick;
  322. end;
  323. { TTestTableWidget }
  324. TTestTableWidget = Class(TBaseTestWidget)
  325. private
  326. FMy: TMyTableWidget;
  327. FClickCount : Integer;
  328. FClickEvent: TJSEvent;
  329. procedure AssertTableCaption(El: TJSHTMLElement);
  330. procedure CheckBodyCells(aParent: TJSHTMLELement);
  331. procedure CheckBodyRow(aParent: TJSHTMLELement; aIndex: Integer);
  332. procedure CheckCellData(el: TJSHTMLElement; aRow, aCol: Integer; rk: TRowKind; RowOption: TTableOption; ColOption: TTableOption);
  333. procedure CheckHeaderCells(aParent: TJSHTMLELement);
  334. procedure CheckFooterCells(aParent: TJSHTMLELement);
  335. procedure CheckRowData(aRow: TJSHTMLELement; aRowKind: TRowKind; aRowKindOption: TTableOption; aIndex: integer);
  336. procedure DoClickCount(Sender: TObject; Event: TJSEvent);
  337. Protected
  338. Procedure Setup; override;
  339. Procedure TearDown; override;
  340. Property My : TMyTableWidget Read FMy;
  341. Published
  342. Procedure TestEmpty;
  343. Procedure TestRender;
  344. Procedure TestRenderNoCaption;
  345. Procedure TestRenderNoCaptionNoHeaders;
  346. Procedure TestRenderFooters;
  347. Procedure TestRenderNoheaderFooterBody;
  348. Procedure TestRenderRowId;
  349. Procedure TestRenderCellID;
  350. Procedure TestRenderHeaderRowData;
  351. Procedure TestRenderHeaderCellDataRow;
  352. Procedure TestRenderHeaderCellDataCol;
  353. Procedure TestRenderRowData;
  354. Procedure TestRenderBodyCellDataRow;
  355. Procedure TestRenderBodyCellDataCol;
  356. Procedure TestRenderFooterRowData;
  357. Procedure TestRenderFooterCellDataRow;
  358. Procedure TestRenderFooterCellDataCol;
  359. Procedure TestClickHeaderCell;
  360. Procedure TestClickFooterCell;
  361. Procedure TestClickCell;
  362. Procedure TestClickRow;
  363. Procedure TestClickRowFromCell;
  364. Procedure TestClickHeaderRowFromHeaderCell;
  365. Procedure TestClickFooterRowFromFooterCell;
  366. end;
  367. implementation
  368. { TTestTableWidget }
  369. procedure TTestTableWidget.Setup;
  370. begin
  371. inherited Setup;
  372. FMy:=TMyTableWidget.Create(Nil);
  373. FMy.ParentID:=SBaseWindowID;
  374. end;
  375. procedure TTestTableWidget.TearDown;
  376. begin
  377. FreeAndNil(FMy);
  378. inherited TearDown;
  379. end;
  380. procedure TTestTableWidget.TestEmpty;
  381. begin
  382. AssertNotNull('Have table',My);
  383. AssertEquals('Have parentid',SBaseWindowID,My.ParentID);
  384. AssertNotNull('Have table cols',My.CustomColumns);
  385. AssertEquals('Have table col count',2,My.CustomColumns.Count);
  386. end;
  387. procedure TTestTableWidget.CheckHeaderCells(aParent : TJSHTMLELement);
  388. Var
  389. El : TJSHTMLElement;
  390. I : integer;
  391. Col : TCustomTableColumn;
  392. begin
  393. AssertEquals('Header row count',1, aParent.childElementCount);
  394. aParent:=TJSHTMLElement(aParent.firstElementChild);
  395. AssertnotNull('Have row',aParent);
  396. AssertEquals('Have row tag','tr',LowerCase(aParent.tagname));
  397. CheckRowData(aParent,rkHeader,toHeaderRowData,0);
  398. AssertEquals('Header cell count',My.CustomColumns.Count, aParent.childElementCount);
  399. I:=0;
  400. el:=TJSHTMLElement(aParent.firstElementChild);
  401. While el<>Nil do
  402. begin
  403. AssertTrue('have col avail',I<My.CustomColumns.Count);
  404. Col:=My.CustomColumns[i];
  405. AssertNotNull('have col instance',Col);
  406. AssertEquals('Have head element','th',LowerCase(el.tagName));
  407. AssertEquals('Have head content col caption',Col.Caption,el.innerText);
  408. CheckCellData(el,0,i,rkHeader,toHeaderCellDataRow,toHeaderCellDataCol);
  409. El:=TJSHTMLElement(El.nextElementSibling);
  410. Inc(i);
  411. end;
  412. end;
  413. procedure TTestTableWidget.CheckRowData(aRow: TJSHTMLELement; aRowKind : TRowKind; aRowKindOption : TTableOption; aIndex : integer);
  414. Var
  415. S : String;
  416. begin
  417. S:=RowKindNames[aRowKind];
  418. if (toRowID in My.TableOptions) then
  419. AssertEquals(S+' row ID',My.ElementID+'-'+S+'-'+IntToStr(aIndex),String(aRow.ID))
  420. else
  421. AssertEquals(S+' Row ID empty','',aRow.ID);
  422. if (aRowKindOption in My.TableOptions) then
  423. begin
  424. AssertEquals(S+' row data',IntToStr(aIndex),String(aRow.Dataset['row']));
  425. AssertEquals(S+' row kind data',S,String(aRow.Dataset['kind']));
  426. end
  427. else
  428. begin
  429. AssertTrue(S+' empty row data',isUndefined(aRow.Dataset['kind']));
  430. AssertTrue(S+' empty row data',isUndefined(aRow.Dataset['row']));
  431. end;
  432. end;
  433. procedure TTestTableWidget.CheckFooterCells(aParent: TJSHTMLELement);
  434. Var
  435. El : TJSHTMLElement;
  436. I : integer;
  437. Col : TCustomTableColumn;
  438. begin
  439. AssertEquals('Footer row count',1, aParent.childElementCount);
  440. aParent:=TJSHTMLElement(aParent.firstElementChild);
  441. AssertnotNull('Have row',aParent);
  442. AssertEquals('Have row tag','tr',LowerCase(aParent.tagname));
  443. CheckRowData(aParent,rkFooter,tofooterRowData,0);
  444. AssertEquals('Footer cell count',My.CustomColumns.Count, aParent.childElementCount);
  445. I:=0;
  446. el:=TJSHTMLElement(aParent.firstElementChild);
  447. While el<>Nil do
  448. begin
  449. AssertTrue('have col avail',I<My.CustomColumns.Count);
  450. Col:=My.CustomColumns[i];
  451. AssertNotNull('have col instance',Col);
  452. AssertEquals('Have footer element','td',LowerCase(el.tagName));
  453. AssertEquals('Have footer content',Format('Footer[%d]',[I]),el.innerText);
  454. CheckCellData(el,0,i,rkFooter,toFooterCellDataRow,toFooterCellDataCol);
  455. El:=TJSHTMLElement(El.nextElementSibling);
  456. Inc(i);
  457. end;
  458. end;
  459. procedure TTestTableWidget.DoClickCount(Sender: TObject; Event: TJSEvent);
  460. begin
  461. Inc(FClickCount);
  462. AssertSame('Table',My,Sender);
  463. FClickEvent:=Event;
  464. end;
  465. procedure TTestTableWidget.CheckCellData(el : TJSHTMLElement; aRow,aCol : Integer; rk : TRowKind; RowOption : TTableOption; ColOption : TTableOption) ;
  466. Var
  467. S : String;
  468. begin
  469. S:=RowKindNames[RK];
  470. if toCellID in My.TableOptions then
  471. AssertEquals('Cell ID',My.ElementID+'-'+S+'-'+IntToStr(aRow)+'-'+IntToStr(aCol),el.ID)
  472. else
  473. AssertEquals('Cell ID','',el.ID);
  474. if ([rowoption,coloption] * My.TableOptions) <> [] then
  475. AssertEquals(S+'row kind data',S,String(el.Dataset['kind']))
  476. else
  477. AssertTrue(S+'cell empty row data',isUndefined(el.Dataset['kind']));
  478. if (rowOption in My.TableOptions) then
  479. AssertEquals(S+'cell row data',IntToStr(aRow),String(el.Dataset['row']))
  480. else
  481. AssertTrue(S+' cell empty row data',isUndefined(el.Dataset['row']));
  482. if (ColOption in My.TableOptions) then
  483. AssertEquals(S+' cell col data',IntToStr(aCol),String(el.Dataset['col']))
  484. else
  485. AssertTrue(S+' cell empty col data',isUndefined(el.Dataset['col']));
  486. end;
  487. procedure TTestTableWidget.CheckBodyRow(aParent : TJSHTMLELement; aIndex : Integer);
  488. Var
  489. El : TJSHTMLElement;
  490. I : integer;
  491. Col : TCustomTableColumn;
  492. begin
  493. CheckRowData(aParent,rkBody,toBodyRowData,aIndex);
  494. AssertEquals('row cell count',My.CustomColumns.Count, aParent.childElementCount);
  495. I:=0;
  496. el:=TJSHTMLElement(aParent.firstElementChild);
  497. While el<>Nil do
  498. begin
  499. AssertTrue('have col avail',I<My.CustomColumns.Count);
  500. Col:=My.CustomColumns[i];
  501. AssertNotNull('have col instance',Col);
  502. AssertEquals('Have cell element','td',LowerCase(el.tagName));
  503. AssertEquals('Have cell content ',Format('cell[%d,%d]',[I,aIndex]),el.innerText);
  504. CheckCellData(el,aIndex,i,rkBody,toBodyCellDataRow,toBodyCellDataCol);
  505. El:=TJSHTMLElement(El.nextElementSibling);
  506. Inc(i);
  507. end;
  508. end;
  509. procedure TTestTableWidget.CheckBodyCells(aParent : TJSHTMLELement);
  510. Var
  511. aRow : integer;
  512. begin
  513. AssertEquals('Body row count',My.RowCount, aParent.childElementCount);
  514. aParent:=TJSHTMLElement(aParent.firstElementChild);
  515. aRow:=0;
  516. While aParent<>nil do
  517. begin
  518. AssertNotNull('Have row',aParent);
  519. AssertEquals('Have row tag','tr',LowerCase(aParent.tagname));
  520. CheckBodyRow(aParent,aRow);
  521. aParent:=TJSHTMLElement(aParent.nextElementSibling);
  522. inc(aRow);
  523. end;
  524. end;
  525. procedure TTestTableWidget.AssertTableCaption(El : TJSHTMLElement);
  526. begin
  527. AssertTrue('Caption element',SameText('caption',el.tagName));
  528. AssertEquals('Caption',My.Caption,El.InnerHTML)
  529. end;
  530. procedure TTestTableWidget.TestRender;
  531. Var
  532. El : TJSHTMLElement;
  533. begin
  534. My.Refresh;
  535. AssertNotNull('Have element',My.Element);
  536. AssertEquals('Have element','table',Lowercase(My.Element.tagName));
  537. AssertEquals('Sub elements',3,My.Element.childElementCount);
  538. El:=TJSHTMLElement(My.Element.firstElementChild);
  539. AssertTableCaption(El);
  540. El:=TJSHTMLElement(El.nextElementSibling);
  541. AssertEquals('Have head element','thead',LowerCase(el.tagName));
  542. CheckHeaderCells(el);
  543. El:=TJSHTMLElement(El.nextElementSibling);
  544. AssertEquals('Have body element','tbody',LowerCase(el.tagName));
  545. CheckBodyCells(el);
  546. end;
  547. procedure TTestTableWidget.TestRenderNoCaption;
  548. Var
  549. El : TJSHTMLElement;
  550. begin
  551. My.Caption:='';
  552. My.Refresh;
  553. AssertNotNull('Have element',My.Element);
  554. AssertEquals('Have element','table',Lowercase(My.Element.tagName));
  555. AssertEquals('Sub elements',2,My.Element.childElementCount);
  556. El:=TJSHTMLElement(My.Element.firstElementChild);
  557. AssertEquals('Have head element','thead',LowerCase(el.tagName));
  558. CheckHeaderCells(el);
  559. El:=TJSHTMLElement(El.nextElementSibling);
  560. AssertEquals('Have body element','tbody',LowerCase(el.tagName));
  561. CheckBodyCells(el);
  562. end;
  563. procedure TTestTableWidget.TestRenderNoCaptionNoHeaders;
  564. Var
  565. El : TJSHTMLElement;
  566. begin
  567. My.Caption:='';
  568. My.TableOptions:=My.TableOptions-[toHeaderRow];
  569. My.Refresh;
  570. AssertNotNull('Have element',My.Element);
  571. AssertEquals('Have element','table',Lowercase(My.Element.tagName));
  572. AssertEquals('Sub elements',1,My.Element.childElementCount);
  573. El:=TJSHTMLElement(My.Element.firstElementChild);
  574. AssertEquals('Have body element','tbody',LowerCase(el.tagName));
  575. CheckBodyCells(el);
  576. end;
  577. procedure TTestTableWidget.TestRenderFooters;
  578. Var
  579. El : TJSHTMLElement;
  580. begin
  581. My.TableOptions:=My.TableOptions+[toFooterRow];
  582. My.Refresh;
  583. AssertNotNull('Have element',My.Element);
  584. AssertEquals('Have element','table',Lowercase(My.Element.tagName));
  585. AssertEquals('Sub elements',4,My.Element.childElementCount);
  586. El:=TJSHTMLElement(My.Element.firstElementChild);
  587. AssertTableCaption(El);
  588. El:=TJSHTMLElement(El.nextElementSibling);
  589. AssertEquals('Have head element','thead',LowerCase(el.tagName));
  590. CheckHeaderCells(el);
  591. El:=TJSHTMLElement(El.nextElementSibling);
  592. AssertEquals('Have body element','tbody',LowerCase(el.tagName));
  593. CheckBodyCells(el);
  594. El:=TJSHTMLElement(El.nextElementSibling);
  595. AssertEquals('Have footer element','tfoot',LowerCase(el.tagName));
  596. CheckFooterCells(el);
  597. end;
  598. procedure TTestTableWidget.TestRenderNoheaderFooterBody;
  599. Var
  600. El : TJSHTMLElement;
  601. begin
  602. My.TableOptions:=My.TableOptions-[toFooter,toBody,toHeader]+[toFooterRow];
  603. My.Refresh;
  604. AssertNotNull('Have element',My.Element);
  605. AssertEquals('Have element','table',Lowercase(My.Element.tagName));
  606. AssertEquals('Sub elements',5,My.Element.childElementCount);
  607. El:=TJSHTMLElement(My.Element.firstElementChild);
  608. AssertTableCaption(El);
  609. El:=TJSHTMLElement(El.nextElementSibling);
  610. AssertEquals('Have head element','tr',LowerCase(el.tagName));
  611. El:=TJSHTMLElement(El.nextElementSibling);
  612. AssertEquals('Have body element 1','tr',LowerCase(el.tagName));
  613. CheckBodyRow(El,0);
  614. El:=TJSHTMLElement(El.nextElementSibling);
  615. AssertEquals('Have body element 2','tr',LowerCase(el.tagName));
  616. CheckBodyRow(El,1);
  617. El:=TJSHTMLElement(El.nextElementSibling);
  618. AssertEquals('Have footer element','tr',LowerCase(el.tagName));
  619. end;
  620. procedure TTestTableWidget.TestRenderRowId;
  621. begin
  622. My.TableOptions:=My.TableOptions+[toRowID];
  623. TestRender;// Check functions will do additional check.
  624. end;
  625. procedure TTestTableWidget.TestRenderCellID;
  626. begin
  627. My.TableOptions:=My.TableOptions+[toCellID];
  628. TestRender;// Check functions will do additional check.
  629. end;
  630. procedure TTestTableWidget.TestRenderHeaderRowData;
  631. begin
  632. My.TableOptions:=My.TableOptions+[toHeaderRowData];
  633. TestRender;// Check functions will do additional check.
  634. end;
  635. procedure TTestTableWidget.TestRenderHeaderCellDataRow;
  636. begin
  637. My.TableOptions:=My.TableOptions+[toHeaderCellDataRow];
  638. TestRender;// Check functions will do additional check.
  639. end;
  640. procedure TTestTableWidget.TestRenderHeaderCellDataCol;
  641. begin
  642. My.TableOptions:=My.TableOptions+[toHeaderCellDataCol];
  643. TestRender;// Check functions will do additional check.
  644. end;
  645. procedure TTestTableWidget.TestRenderRowData;
  646. begin
  647. My.TableOptions:=My.TableOptions+[toBodyRowData];
  648. TestRender;// Check functions will do additional check.
  649. end;
  650. procedure TTestTableWidget.TestRenderBodyCellDataRow;
  651. begin
  652. My.TableOptions:=My.TableOptions+[toBodyCellDataRow];
  653. TestRender;// Check functions will do additional check.
  654. end;
  655. procedure TTestTableWidget.TestRenderBodyCellDataCol;
  656. begin
  657. My.TableOptions:=My.TableOptions+[toBodyCellDataCol];
  658. TestRender;// Check functions will do additional check.
  659. end;
  660. procedure TTestTableWidget.TestRenderFooterRowData;
  661. begin
  662. My.TableOptions:=My.TableOptions+[tofooterRowData];
  663. TestRender;// Check functions will do additional check.
  664. end;
  665. procedure TTestTableWidget.TestRenderFooterCellDataRow;
  666. begin
  667. My.TableOptions:=My.TableOptions+[tofooterCellDataRow];
  668. TestRender;// Check functions will do additional check.
  669. end;
  670. procedure TTestTableWidget.TestRenderFooterCellDataCol;
  671. begin
  672. My.TableOptions:=My.TableOptions+[tofooterCellDataCol];
  673. TestRender;// Check functions will do additional check.
  674. end;
  675. procedure TTestTableWidget.TestClickHeaderCell;
  676. Var
  677. ev : TJSEvent;
  678. el : TJSHTMLElement;
  679. begin
  680. My.Caption:='';
  681. My.OnHeaderCellClick:=@DoClickCount;
  682. My.Refresh;
  683. AssertNotNull('Have element',My.Element);
  684. ev:=TJSEvent.New('click');
  685. el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild.firstElementChild);
  686. AssertEquals('TH el','th',LowerCase(el.TagName));
  687. el.dispatchEvent(ev);
  688. AssertEquals('One click',1,FClickCount);
  689. AssertSame('Event',ev,FClickEvent);
  690. end;
  691. procedure TTestTableWidget.TestClickFooterCell;
  692. Var
  693. ev : TJSEvent;
  694. el : TJSHTMLElement;
  695. begin
  696. My.Caption:='';
  697. My.TableOptions:=My.TableOptions-[toHeaderRow]+[toFooterRow];
  698. My.OnFooterCellClick:=@DoClickCount;
  699. My.Refresh;
  700. AssertNotNull('Have element',My.Element);
  701. ev:=TJSEvent.New('click');
  702. el:=TJSHTMLElement(My.Element.firstElementChild.nextElementSibling.firstElementChild.firstElementChild);
  703. AssertEquals('TD el','td',LowerCase(el.TagName));
  704. el.dispatchEvent(ev);
  705. AssertEquals('One click',1,FClickCount);
  706. AssertSame('Event',ev,FClickEvent);
  707. end;
  708. procedure TTestTableWidget.TestClickCell;
  709. Var
  710. ev : TJSEvent;
  711. el : TJSHTMLElement;
  712. begin
  713. My.Caption:='';
  714. My.TableOptions:=My.TableOptions-[toHeaderRow];
  715. My.OnCellClick:=@DoClickCount;
  716. My.Refresh;
  717. AssertNotNull('Have element',My.Element);
  718. ev:=TJSEvent.New('click');
  719. el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild.firstElementChild);
  720. AssertEquals('TD el','td',LowerCase(el.TagName));
  721. el.dispatchEvent(ev);
  722. AssertEquals('One click',1,FClickCount);
  723. AssertSame('Event',ev,FClickEvent);
  724. end;
  725. procedure TTestTableWidget.TestClickRow;
  726. Var
  727. ev : TJSEvent;
  728. el : TJSHTMLElement;
  729. begin
  730. My.Caption:='';
  731. My.TableOptions:=My.TableOptions-[toHeaderRow];
  732. My.OnRowClick:=@DoClickCount;
  733. My.Refresh;
  734. AssertNotNull('Have element',My.Element);
  735. ev:=TJSEvent.New('click');
  736. el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild);
  737. AssertEquals('TD el','tr',LowerCase(el.TagName));
  738. el.dispatchEvent(ev);
  739. AssertEquals('One click',1,FClickCount);
  740. AssertSame('Event',ev,FClickEvent);
  741. end;
  742. procedure TTestTableWidget.TestClickRowFromCell;
  743. Var
  744. ev : TJSEvent;
  745. el : TJSHTMLElement;
  746. begin
  747. My.Caption:='';
  748. My.TableOptions:=My.TableOptions-[toHeaderRow];
  749. My.OnRowClick:=@DoClickCount;
  750. My.Refresh;
  751. AssertNotNull('Have element',My.Element);
  752. ev:=TJSEvent.New('click');
  753. el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild.FirstElementChild);
  754. AssertEquals('TD el','td',LowerCase(el.TagName));
  755. el.dispatchEvent(ev);
  756. AssertEquals('One click',1,FClickCount);
  757. AssertSame('Event',ev,FClickEvent);
  758. end;
  759. procedure TTestTableWidget.TestClickHeaderRowFromHeaderCell;
  760. Var
  761. ev : TJSEvent;
  762. el : TJSHTMLElement;
  763. begin
  764. My.Caption:='';
  765. // My.TableOptions:=My.TableOptions;
  766. My.OnHeaderRowClick:=@DoClickCount;
  767. My.Refresh;
  768. AssertNotNull('Have element',My.Element);
  769. ev:=TJSEvent.New('click');
  770. el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild.FirstElementChild);
  771. AssertEquals('TD el','th',LowerCase(el.TagName));
  772. el.dispatchEvent(ev);
  773. AssertEquals('One click',1,FClickCount);
  774. AssertSame('Event',ev,FClickEvent);
  775. end;
  776. procedure TTestTableWidget.TestClickFooterRowFromFooterCell;
  777. Var
  778. ev : TJSEvent;
  779. el : TJSHTMLElement;
  780. begin
  781. My.Caption:='';
  782. My.TableOptions:=My.TableOptions-[toHeaderRow]+[toFooterRow];
  783. My.OnFooterRowClick:=@DoClickCount;
  784. My.Refresh;
  785. AssertNotNull('Have element',My.Element);
  786. ev:=TJSEvent.New('click');
  787. el:=TJSHTMLElement(My.Element.firstElementChild.nextElementSibling.firstElementChild.firstElementChild);
  788. AssertEquals('TD el','td',LowerCase(el.TagName));
  789. el.dispatchEvent(ev);
  790. AssertEquals('One click',1,FClickCount);
  791. AssertSame('Event',ev,FClickEvent);
  792. end;
  793. { TMyTableWidget }
  794. constructor TMyTableWidget.create(aOwner: TComponent);
  795. begin
  796. inherited create(aOwner);
  797. CustomColumns.Add ('Col1');
  798. CustomColumns.Add ('Col2');
  799. Caption:='Our caption';
  800. RowCount:=2;
  801. end;
  802. function TMyTableWidget.GetBodyRowEnumerator: TTableRowEnumerator;
  803. begin
  804. Result:=TMyTableRowCountEnumerator.Create(Self,RowCount);
  805. end;
  806. function TMyTableWidget.GetRowEnumerator(aKind: TRowKind): TTableRowEnumerator;
  807. begin
  808. if AKind=rkFooter then
  809. Result:=TMyTableRowCountEnumerator.Create(Self,1)
  810. else
  811. Result:=Inherited GetRowEnumerator(aKind);
  812. end;
  813. procedure TMyTableWidget.TMyTableRowCountEnumerator.GetCellData(aData: TTableWidgetCellData);
  814. begin
  815. inherited GetCellData(aData);
  816. Case aData.Kind of
  817. rkBody :
  818. aData.Text:=Format('cell[%d,%d]',[aData.Col,aData.Row]);
  819. rkFooter :
  820. begin
  821. aData.Text:=Format('Footer[%d]',[aData.Col]);
  822. end;
  823. end;
  824. end;
  825. { TTestTextLinesWidget }
  826. procedure TTestTextLinesWidget.Setup;
  827. begin
  828. inherited Setup;
  829. FMy:=TMyTextLinesWidget.Create(Nil);
  830. FMy.ParentID:=SBaseWindowID;
  831. FMy.Lines.Add('0&lt;1');
  832. FMy.Lines.Add('two');
  833. end;
  834. procedure TTestTextLinesWidget.TearDown;
  835. begin
  836. FreeAndNil(FMy);
  837. inherited TearDown;
  838. end;
  839. procedure TTestTextLinesWidget.TestEmpty;
  840. begin
  841. AssertNotNull('Have widget',My);
  842. AssertNull('widget not rendered',My.Element);
  843. AssertTrue('Text mode default text',tmText=My.TextMode);
  844. AssertTrue('Envelope tag default paragraph',ttParagraph=My.EnvelopeTag);
  845. end;
  846. procedure TTestTextLinesWidget.TestRenderText;
  847. begin
  848. My.Refresh;
  849. AssertNotNull('Have element',My.Element);
  850. AssertEquals('Have element','P',My.Element.tagName);
  851. AssertEquals('Have text','0&lt;1'+slineBreak+'two'+slineBreak,My.Element.InnerText);
  852. end;
  853. procedure TTestTextLinesWidget.TestRenderedTextChange;
  854. begin
  855. My.Refresh;
  856. My.Lines[1]:='Three';
  857. AssertNotNull('Have element',My.Element);
  858. AssertEquals('Have element','P',My.Element.tagName);
  859. AssertEquals('Have text','0&lt;1'+slineBreak+'Three'+slineBreak,My.Element.InnerText);
  860. end;
  861. procedure TTestTextLinesWidget.TestRenderTextLineBreaks;
  862. begin
  863. My.ForceLineBreaks:=True;
  864. My.Refresh;
  865. AssertNotNull('Have element',My.Element);
  866. AssertEquals('Have text','0&lt;1'+slineBreak+'two'+slineBreak,My.Element.InnerText);
  867. AssertEquals('Have HTML','0&amp;lt;1<br>two<br>',My.Element.InnerHtml);
  868. end;
  869. procedure TTestTextLinesWidget.TestRenderHTML;
  870. begin
  871. My.TextMode:=tmHTML;
  872. My.Refresh;
  873. AssertNotNull('Have element',My.Element);
  874. AssertEquals('Have element','P',My.Element.tagName);
  875. AssertEquals('Have text','0<1 two',My.Element.InnerText);
  876. AssertEquals('Have HTML','0&lt;1'+sLineBreak+'two'+sLineBreak,My.Element.InnerHtml);
  877. end;
  878. procedure TTestTextLinesWidget.TestRenderHTMLLineBreaks;
  879. begin
  880. My.TextMode:=tmHTML;
  881. My.ForceLineBreaks:=True;
  882. My.Refresh;
  883. AssertNotNull('Have element',My.Element);
  884. AssertEquals('Have element','P',My.Element.tagName);
  885. AssertEquals('Have text','0<1'+slineBreak+'two'+slineBreak,My.Element.InnerText);
  886. AssertEquals('Have HTML','0&lt;1<br>two<br>',My.Element.InnerHtml);
  887. end;
  888. procedure TTestTextLinesWidget.TestRenderedHTMLChange;
  889. begin
  890. TestRenderHTML;
  891. My.Lines[1]:='three';
  892. AssertNotNull('Have element',My.Element);
  893. AssertEquals('Have element','P',My.Element.tagName);
  894. AssertEquals('Have text','0<1 three',My.Element.InnerText);
  895. AssertEquals('Have HTML','0&lt;1'+sLineBreak+'three'+sLineBreak,My.Element.InnerHtml);
  896. end;
  897. procedure TTestTextLinesWidget.TestTextModeChangeRenders;
  898. begin
  899. TestRenderText;
  900. My.TextMode:=tmHTML;
  901. AssertNotNull('Have element',My.Element);
  902. AssertEquals('Have element','P',My.Element.tagName);
  903. AssertEquals('Have text','0<1 two',My.Element.InnerText);
  904. AssertEquals('Have HTML','0&lt;1'+sLineBreak+'two'+sLineBreak,My.Element.InnerHtml);
  905. end;
  906. procedure TTestTextLinesWidget.TestEnvelopeChangeRenders;
  907. begin
  908. TestRenderText;
  909. My.EnvelopeTag:=ttSpan;
  910. AssertNotNull('Have element',My.Element);
  911. AssertEquals('Have element','SPAN',My.Element.tagName);
  912. AssertEquals('Have text','0&lt;1'+slineBreak+'two'+slineBreak,My.Element.InnerText);
  913. end;
  914. { TTestTextWidget }
  915. procedure TTestTextWidget.Setup;
  916. begin
  917. inherited Setup;
  918. FMy:=TMyTextWidget.Create(Nil);
  919. FMy.ParentID:=SBaseWindowID;
  920. FMy.Text:='0&lt;1';
  921. end;
  922. procedure TTestTextWidget.TearDown;
  923. begin
  924. FreeAndNil(FMy);
  925. inherited TearDown;
  926. end;
  927. procedure TTestTextWidget.TestEmpty;
  928. begin
  929. AssertNotNull('Have widget',My);
  930. AssertNull('widget not rendered',My.Element);
  931. AssertTrue('Text mode default text',tmText=My.TextMode);
  932. AssertTrue('Envelope tag default paragraph',ttParagraph=My.EnvelopeTag);
  933. end;
  934. procedure TTestTextWidget.TestRenderText;
  935. begin
  936. My.Refresh;
  937. AssertNotNull('Have element',My.Element);
  938. AssertEquals('Have element','P',My.Element.tagName);
  939. AssertEquals('Have text','0&lt;1',My.Element.InnerText);
  940. end;
  941. procedure TTestTextWidget.TestRenderedTextChange;
  942. begin
  943. TestRenderText;
  944. My.Text:='Something else';
  945. AssertEquals('Have text','Something else',My.Element.InnerText);
  946. end;
  947. procedure TTestTextWidget.TestRenderHTML;
  948. begin
  949. My.TextMode:=tmHTML;
  950. My.Refresh;
  951. AssertNotNull('Have element',My.Element);
  952. AssertEquals('Have element','P',My.Element.tagName);
  953. AssertEquals('Have text','0<1',My.Element.InnerText);
  954. AssertEquals('Have HTML','0&lt;1',My.Element.InnerHtml);
  955. end;
  956. procedure TTestTextWidget.TestRenderedHTMLChange;
  957. begin
  958. TestRenderHtml;
  959. My.Text:='2&gt;1';
  960. AssertEquals('Have text','2>1',My.Element.InnerText);
  961. AssertEquals('Have HTML','2&gt;1',My.Element.InnerHtml);
  962. end;
  963. procedure TTestTextWidget.TestTextModeChangeRenders;
  964. begin
  965. TestRenderText;
  966. My.TextMode:=tmHTML;
  967. AssertEquals('Have text','0<1',My.Element.InnerText);
  968. AssertEquals('Have HTML','0&lt;1',My.Element.InnerHtml);
  969. end;
  970. procedure TTestTextWidget.TestEnvelopeChangeRenders;
  971. begin
  972. TestRenderText;
  973. My.EnvelopeTag:=ttSpan;
  974. AssertEquals('Have element','SPAN',My.Element.tagName);
  975. AssertEquals('Have text','0&lt;1',My.Element.InnerText);
  976. AssertEquals('Have HTML','0&amp;lt;1',My.Element.InnerHtml);
  977. end;
  978. { TTestLabelWidget }
  979. procedure TTestLabelWidget.SetUp;
  980. begin
  981. inherited SetUp;
  982. FMy:=TMyLabelWidget.Create(Nil);
  983. My.Text:='Your name';
  984. My.ParentID:=SBaseWindowID;
  985. FEdit:=TTextInputWidget.Create(Nil);
  986. FEdit.ParentID:=SBaseWindowID;
  987. FMy.LabelFor:=Edit;
  988. end;
  989. procedure TTestLabelWidget.TearDown;
  990. begin
  991. FreeAndNil(Fmy);
  992. FreeAndNil(FEdit);
  993. inherited TearDown;
  994. end;
  995. procedure TTestLabelWidget.TestPropsBeforeRender;
  996. begin
  997. Edit.Refresh;
  998. My.Refresh;
  999. AssertEquals('text','Your name',My.LabelElement.innerText);
  1000. AssertEquals('for',Edit.ElementID,My.LabelElement.For_);
  1001. end;
  1002. procedure TTestLabelWidget.TestPropsAfterRender;
  1003. begin
  1004. My.LabelFor:=Nil;
  1005. My.Refresh;
  1006. AssertEquals('text','Your name',My.LabelElement.innerText);
  1007. AssertEquals('for','',My.LabelElement.For_);
  1008. // Will render Edit!
  1009. My.LabelFor:=Edit;
  1010. AssertTrue('Have edit id',Edit.ElementID<>'');
  1011. My.Text:='My Name';
  1012. My.Refresh;
  1013. AssertEquals('text','My Name',My.LabelElement.innerText);
  1014. AssertEquals('for',Edit.ElementID,My.LabelElement.For_);
  1015. end;
  1016. { TTestSelectElement }
  1017. function TTestSelectElement.GetOptions: TJSHTMLOPtionElementArray;
  1018. begin
  1019. Result:=My.Options;
  1020. end;
  1021. function TTestSelectElement.GetSelect: TJSHTMLSelectElement;
  1022. begin
  1023. Result:=My.SelectElement;
  1024. end;
  1025. procedure TTestSelectElement.Setup;
  1026. begin
  1027. inherited Setup;
  1028. FMy:=TMySelectWidget.Create(Nil);
  1029. FMy.ParentID:=SBaseWindowID;
  1030. FMy.Items.Add('One');
  1031. FMy.Items.Add('Two');
  1032. FMy.Items.Add('Three');
  1033. FMy.Values.Add('1');
  1034. FMy.Values.Add('2');
  1035. FMy.Values.Add('3');
  1036. FMy.SelectedIndex:=0;
  1037. end;
  1038. procedure TTestSelectElement.TearDown;
  1039. begin
  1040. FreeAndNil(FMy);
  1041. inherited TearDown;
  1042. end;
  1043. procedure TTestSelectElement.TestEmpty;
  1044. begin
  1045. AssertNotNull('Have widget',My);
  1046. AssertNull('Not rendered',My.Element);
  1047. end;
  1048. procedure TTestSelectElement.AssertOption(Idx : Integer; aText,aValue : String; Selected : Boolean= False);
  1049. Var
  1050. O : TJSHTMLOptionElement;
  1051. begin
  1052. AssertTrue('Correct index',Idx<Select.childElementCount);
  1053. O:=Select.children[Idx] as TJSHTMLOptionElement;
  1054. AssertEquals('Text',aText,O.InnerText);
  1055. if aValue='' then aValue:=aText;
  1056. AssertEquals('Value',aValue,O.Value);
  1057. AssertEquals('Selected',Selected,O.selected);
  1058. end;
  1059. procedure TTestSelectElement.TestPropsOnRender;
  1060. begin
  1061. My.Refresh;
  1062. AssertTree('select/option');
  1063. AssertEquals('Multi',False,Select.multiple);
  1064. AssertEquals('SelectedIndex',0,Select.selectedIndex);
  1065. AssertEquals('Amount of options',3,Length(Options));
  1066. AssertEquals('Amount of option values',3,Select.childElementCount);
  1067. AssertOption(0,'One','1',True);
  1068. AssertOption(1,'Two','2');
  1069. AssertOption(2,'Three','3');
  1070. end;
  1071. procedure TTestSelectElement.TestPropsAfterRender;
  1072. Var
  1073. L1,L2 : TStrings;
  1074. begin
  1075. TestPropsOnRender;
  1076. My.Multiple:=True;
  1077. L1:=My.Items;
  1078. l2:=My.Values;
  1079. L1.BeginUpdate;
  1080. L2.BeginUpdate;
  1081. L1.Clear;
  1082. L1.Add('Alpha');
  1083. L1.Add('Beta');
  1084. L1.Add('Gamma');
  1085. L2.Clear;
  1086. L2.Add('a');
  1087. L2.Add('b');
  1088. L1.EndUpdate;
  1089. L2.EndUpdate;
  1090. My.SelectedIndex:=2;
  1091. AssertEquals('Multi',True,Select.multiple);
  1092. AssertEquals('SelectedIndex',2,Select.selectedIndex);
  1093. AssertEquals('Amount of options',3,Length(Options));
  1094. AssertEquals('Amount of option values',3,Select.childElementCount);
  1095. AssertOption(0,'Alpha','a');
  1096. AssertOption(1,'Beta','b');
  1097. AssertOption(2,'Gamma','Gamma',True);
  1098. end;
  1099. procedure TTestSelectElement.TestMultiSelect;
  1100. Var
  1101. I : Integer;
  1102. begin
  1103. TestPropsOnRender;
  1104. My.Multiple:=True;
  1105. For I:=0 to My.Items.Count-1 do
  1106. begin
  1107. AssertEquals(IntToStr(I)+' selected',I=My.SelectedIndex,My.Selected[I]);
  1108. AssertEquals(IntToStr(I)+' option selected',I=My.SelectedIndex,Options[i].Selected);
  1109. end;
  1110. My.Selected[2]:=True;
  1111. AssertEquals('First selected index',0,My.SelectedIndex);
  1112. AssertEquals('Additional selected',True,Options[2].Selected);
  1113. AssertEquals('Additional option selected',True,My.Selected[2]);
  1114. AssertEquals('SelectionCount',2,My.selectionCount);
  1115. AssertEquals('SelectionValue[0]','1',My.selectionValue[0]);
  1116. AssertEquals('SelectionItem[0]','One',My.SelectionItem[0]);
  1117. AssertEquals('SelectionValue[1]','3',My.selectionValue[1]);
  1118. AssertEquals('SelectionItem[1]','Three',My.selectionItem[1]);
  1119. end;
  1120. procedure TTestSelectElement.TestNoSelectedIndex;
  1121. begin
  1122. My.SelectedIndex:=-1;
  1123. My.Refresh;
  1124. AssertTree('select/option');
  1125. AssertEquals('Multi',False,Select.multiple);
  1126. AssertEquals('SelectedIndex',-1,Select.selectedIndex);
  1127. AssertEquals('Amount of options',3,Length(Options));
  1128. AssertEquals('Amount of option values',3,Select.childElementCount);
  1129. AssertOption(0,'One','1');
  1130. AssertOption(1,'Two','2');
  1131. AssertOption(2,'Three','3');
  1132. end;
  1133. { TTestImageElement }
  1134. function TTestImageElement.GetImg: TJSHTMLImageElement;
  1135. begin
  1136. Result:=TJSHTMLImageElement(My.Element);
  1137. end;
  1138. procedure TTestImageElement.Setup;
  1139. begin
  1140. inherited Setup;
  1141. FMy:=TMyImageWidget.Create(Nil);
  1142. FMy.ParentID:=SBaseWindowID;
  1143. FMy.Src:='img.png';
  1144. FMy.Width:=64;
  1145. FMy.Height:=128;
  1146. end;
  1147. procedure TTestImageElement.TearDown;
  1148. begin
  1149. FreeAndNil(FMy);
  1150. inherited TearDown;
  1151. end;
  1152. function TTestImageElement.ThisURL: String;
  1153. begin
  1154. Result:=ExtractFilePath(Window.Location.href);
  1155. end;
  1156. procedure TTestImageElement.TestEmpty;
  1157. begin
  1158. AssertNotNull('have image',My);
  1159. AssertNull('Not rendered',My.Element);
  1160. end;
  1161. procedure TTestImageElement.TestPropsOnRender;
  1162. begin
  1163. My.Refresh;
  1164. AssertNotNull('have element',My.Element);
  1165. AssertEquals('URL',ThisURL+'img.png',Image.src);
  1166. AssertEquals('Width',64,Image.width);
  1167. AssertEquals('Height',128,Image.Height);
  1168. end;
  1169. procedure TTestImageElement.TestPropsAfterRender;
  1170. begin
  1171. My.Refresh;
  1172. My.Src:='img2.png';
  1173. My.Width:=88;
  1174. My.Height:=166;
  1175. AssertEquals('URL',ThisURL+'img2.png',Image.src);
  1176. AssertEquals('Width',88,Image.width);
  1177. AssertEquals('Height',166,Image.Height);
  1178. end;
  1179. { TTestHiddenInputElement }
  1180. function TTestHiddenInputElement.CreateInput: TCustomInputWidget;
  1181. begin
  1182. Result:=THiddenInputWidget.Create(Nil);
  1183. end;
  1184. function TTestHiddenInputElement.MyHidden: TMyHiddenInputWidget;
  1185. begin
  1186. Result:=My as TMyHiddenInputWidget;
  1187. end;
  1188. procedure TTestHiddenInputElement.TestPropsOnRender;
  1189. begin
  1190. My.Refresh;
  1191. AssertBaseProps('','','');
  1192. end;
  1193. procedure TTestHiddenInputElement.TestPropsAfterRender;
  1194. begin
  1195. My.Refresh;
  1196. My.ValueName:='a';
  1197. My.Value:='b';
  1198. AssertBaseProps('hidden','a','b');
  1199. end;
  1200. { TTestDateInputElement }
  1201. function TTestDateInputElement.CreateInput: TCustomInputWidget;
  1202. begin
  1203. Result:=TMyDateInputWidget.Create(Nil);
  1204. end;
  1205. procedure TTestDateInputElement.CreateMy;
  1206. begin
  1207. inherited CreateMy;
  1208. MyDate.Date:=Date;
  1209. end;
  1210. function TTestDateInputElement.MyDate: TMyDateInputWidget;
  1211. begin
  1212. Result:=My as TMyDateInputWidget;
  1213. end;
  1214. procedure TTestDateInputElement.TestPropsOnRender;
  1215. begin
  1216. My.Refresh;
  1217. AssertBaseProps('','',FormatDateTime('yyyy-mm-dd',Date));
  1218. end;
  1219. procedure TTestDateInputElement.TestPropsAfterRender;
  1220. begin
  1221. My.Refresh;
  1222. MyDate.Date:=Date-1;
  1223. AssertBaseProps('','',FormatDateTime('yyyy-mm-dd',Date-1));
  1224. end;
  1225. { TTestFileInputElement }
  1226. function TTestFileInputElement.CreateInput: TCustomInputWidget;
  1227. begin
  1228. Result:=TMyFileInputWidget.Create(Nil);
  1229. end;
  1230. procedure TTestFileInputElement.CreateMy;
  1231. begin
  1232. inherited CreateMy;
  1233. My.Value:='';
  1234. end;
  1235. function TTestFileInputElement.MyFile: TMyFileInputWidget;
  1236. begin
  1237. Result:=My as TMyFileInputWidget;
  1238. end;
  1239. procedure TTestFileInputElement.TestPropsOnRender;
  1240. begin
  1241. My.Refresh;
  1242. // We cannot use assertbaseprops
  1243. AssertTree('input('+My.ElementID+')');
  1244. AssertEquals('Type','file',InputElement._Type);
  1245. AssertEquals('Value name','Test',InputElement.name);
  1246. AssertEquals('Value','',InputElement.value);
  1247. AssertEquals('Text (inner text)','',InputElement.innerText);
  1248. end;
  1249. procedure TTestFileInputElement.TestPropsAfterRender;
  1250. begin
  1251. My.Refresh;
  1252. // We cannot use assertbaseprops
  1253. AssertTree('input('+My.ElementID+')');
  1254. AssertEquals('Type','file',InputElement._Type);
  1255. AssertEquals('Value name','Test',InputElement.name);
  1256. AssertEquals('Value','',InputElement.value);
  1257. AssertEquals('Text (inner text)','',InputElement.innerText);
  1258. end;
  1259. { TTestRadioInputElement }
  1260. function TTestRadioInputElement.CreateInput: TCustomInputWidget;
  1261. begin
  1262. Result:=TRadioInputWidget.Create(Nil);
  1263. end;
  1264. function TTestRadioInputElement.MyRadio: TRadioInputWidget;
  1265. begin
  1266. Result:=My as TRadioInputWidget;
  1267. end;
  1268. procedure TTestRadioInputElement.TestPropsOnRender;
  1269. begin
  1270. MyRadio.Checked:=true;
  1271. My.Refresh;
  1272. AssertBaseProps('','','');
  1273. AssertEquals('Checked',true,InputElement.Checked);
  1274. end;
  1275. procedure TTestRadioInputElement.TestPropsAfterRender;
  1276. begin
  1277. My.Refresh;
  1278. AssertEquals('Checked before',False,InputElement.Checked);
  1279. MyRadio.Checked:=true;
  1280. AssertBaseProps('','','');
  1281. AssertEquals('Checked after',true,InputElement.Checked);
  1282. end;
  1283. { TTestCheckBoxInputElement }
  1284. function TTestCheckBoxInputElement.CreateInput: TCustomInputWidget;
  1285. begin
  1286. Result:=TCheckBoxInputWidget.Create(Nil);
  1287. end;
  1288. function TTestCheckBoxInputElement.MyCheckBox: TCheckBoxInputWidget;
  1289. begin
  1290. Result:=My as TCheckBoxInputWidget;
  1291. end;
  1292. procedure TTestCheckBoxInputElement.TestPropsOnRender;
  1293. begin
  1294. MyCheckBox.Checked:=true;
  1295. My.Refresh;
  1296. AssertBaseProps('','','');
  1297. AssertEquals('Checked',true,InputElement.Checked);
  1298. end;
  1299. procedure TTestCheckBoxInputElement.TestPropsAfterRender;
  1300. begin
  1301. My.Refresh;
  1302. AssertEquals('Checked before',False,InputElement.Checked);
  1303. MyCheckBox.Checked:=true;
  1304. AssertBaseProps('','','');
  1305. AssertEquals('Checked after',true,InputElement.Checked);
  1306. end;
  1307. { TTestTextAreaElement }
  1308. function TTestTextAreaElement.GetArea: TJSHTMLTextAreaElement;
  1309. begin
  1310. Result:=FMy.TextArea
  1311. end;
  1312. procedure TTestTextAreaElement.Setup;
  1313. begin
  1314. inherited Setup;
  1315. FMy:=TMyTextAreaWidget.Create(Nil);
  1316. FMy.Lines.Add('a');
  1317. FMy.Lines.Add('b');
  1318. end;
  1319. procedure TTestTextAreaElement.TearDown;
  1320. begin
  1321. FreeAndNil(FMy);
  1322. inherited TearDown;
  1323. end;
  1324. procedure TTestTextAreaElement.TestEmpty;
  1325. begin
  1326. AssertNotNull(My);
  1327. end;
  1328. procedure TTestTextAreaElement.TestPropsOnRender;
  1329. begin
  1330. My.ParentID:=BaseID;
  1331. My.ValueName:='test';
  1332. My.Columns:=25;
  1333. My.Rows:=35;
  1334. My.MaxLength:=500;
  1335. My.Wrap:=tawHard;
  1336. My.Required:=True;
  1337. My.ReadOnly:=True;
  1338. My.Refresh;
  1339. AssertEquals('ValueName','test',area.Name);
  1340. AssertEquals('Wrap','hard',area.Wrap);
  1341. AssertEquals('Rows',35,area.Rows);
  1342. AssertEquals('Cols',25,area.Cols);
  1343. AssertEquals('MaxLength',500,area.MaxLength);
  1344. AssertEquals('Text','a'+sLineBreak+'b'+sLineBreak,area.innerHtml);
  1345. AssertEquals('Required',true,Area.Required);
  1346. AssertEquals('ReadOnly',true,Area.ReadOnly);
  1347. end;
  1348. procedure TTestTextAreaElement.TestPropsAfterRender;
  1349. begin
  1350. My.ParentID:=BaseID;
  1351. My.Refresh;
  1352. My.ValueName:='test';
  1353. My.Columns:=25;
  1354. My.Rows:=35;
  1355. My.MaxLength:=500;
  1356. My.Required:=True;
  1357. My.ReadOnly:=True;
  1358. My.Wrap:=tawHard;
  1359. With My.Lines do
  1360. begin
  1361. BeginUpdate;
  1362. Clear;
  1363. Add('d');
  1364. Add('e');
  1365. EndUpdate;
  1366. end;
  1367. AssertEquals('ValueName','test',area.Name);
  1368. AssertEquals('Wrap','hard',area.Wrap);
  1369. AssertEquals('Rows',35,area.Rows);
  1370. AssertEquals('Cols',25,area.Cols);
  1371. AssertEquals('MaxLength',500,area.MaxLength);
  1372. AssertEquals('Text','d'+sLineBreak+'e'+sLineBreak,area.innerHTML);
  1373. AssertEquals('Required',true,Area.Required);
  1374. AssertEquals('ReadOnly',true,Area.ReadOnly);
  1375. end;
  1376. { TTestTextInputElement }
  1377. procedure TTestTextInputElement.setup;
  1378. begin
  1379. inherited setup;
  1380. FITT:=ittText;
  1381. end;
  1382. function TTestTextInputElement.CreateInput: TCustomInputWidget;
  1383. begin
  1384. Result:=TTextInputWidget.Create(Nil);
  1385. TTextInputWidget(Result).TextType:=FITT;
  1386. end;
  1387. function TTestTextInputElement.MyText: TTextInputWidget;
  1388. begin
  1389. Result:=My as TTextInputWidget;
  1390. end;
  1391. procedure TTestTextInputElement.TestDefaultTextType;
  1392. begin
  1393. AssertTrue('Correct type',ittText=MyText.TextType);
  1394. end;
  1395. procedure TTestTextInputElement.TestRender;
  1396. begin
  1397. My.Refresh;
  1398. AssertBaseProps('','','','');
  1399. end;
  1400. procedure TTestTextInputElement.TestChangeValue;
  1401. begin
  1402. My.Refresh;
  1403. AssertBaseProps('','','','');
  1404. My.Value:='soso';
  1405. AssertEquals('Value propagates','soso',InputElement.value);
  1406. end;
  1407. procedure TTestTextInputElement.TestChangeName;
  1408. begin
  1409. My.Refresh;
  1410. AssertBaseProps('','','','');
  1411. My.ValueName:='soso';
  1412. AssertEquals('ValueName propagates','soso',InputElement.name);
  1413. end;
  1414. procedure TTestTextInputElement.TestChangeTextType;
  1415. begin
  1416. My.Refresh;
  1417. AssertBaseProps('','','','');
  1418. MyText.TextType:=ittPassword;
  1419. AssertEquals('TextType propagates to type','password',InputElement._type);
  1420. end;
  1421. procedure TTestTextInputElement.TestTypePassword;
  1422. begin
  1423. FItt:=ittPassword;
  1424. CreateMy;
  1425. My.Refresh;
  1426. AssertBaseProps('password','','','');
  1427. end;
  1428. procedure TTestTextInputElement.TestTypeNumber;
  1429. begin
  1430. FItt:=ittNumber;
  1431. CreateMy;
  1432. My.Refresh;
  1433. AssertBaseProps('number','','','');
  1434. end;
  1435. procedure TTestTextInputElement.TestAsNumber;
  1436. begin
  1437. TestTypeNumber;
  1438. AssertBaseProps('number','','','');
  1439. AssertEquals('Correct read',1,MyText.AsNumber);
  1440. MyText.AsNumber:=123;
  1441. AssertEquals('Correctly set','123',InputElement.Value);
  1442. AssertEquals('Correctly set 2','123',Mytext.Value);
  1443. end;
  1444. procedure TTestTextInputElement.TestTypeEmail;
  1445. begin
  1446. FItt:=ittEmail;
  1447. CreateMy;
  1448. My.Refresh;
  1449. AssertBaseProps('email','','','');
  1450. end;
  1451. procedure TTestTextInputElement.TestTypeSearch;
  1452. begin
  1453. FItt:=ittSearch;
  1454. CreateMy;
  1455. My.Refresh;
  1456. AssertBaseProps('search','','','');
  1457. end;
  1458. procedure TTestTextInputElement.TestTypeTel;
  1459. begin
  1460. FItt:=ittTelephone;
  1461. CreateMy;
  1462. My.Refresh;
  1463. AssertBaseProps('tel','','','');
  1464. end;
  1465. procedure TTestTextInputElement.TestTypeURL;
  1466. begin
  1467. FItt:=ittURL;
  1468. CreateMy;
  1469. My.Refresh;
  1470. AssertBaseProps('url','','','');
  1471. end;
  1472. procedure TTestTextInputElement.TestTypeColor;
  1473. begin
  1474. FItt:=ittColor;
  1475. CreateMy;
  1476. My.Refresh;
  1477. AssertBaseProps('color','','#000000','');
  1478. end;
  1479. { TBaseTestInputElement }
  1480. function TBaseTestInputElement.GetInputElement: TJSHTMLInputElement;
  1481. begin
  1482. Result:= TInputHack(My).InputElement;
  1483. AssertNotNull('Have input element',Result);
  1484. end;
  1485. procedure TBaseTestInputElement.CreateMy;
  1486. begin
  1487. FreeAndNil(FMy);
  1488. FMy:=CreateInput;
  1489. FMy.ParentID:=BaseID;
  1490. FMy.ValueName:='Test';
  1491. FMy.Value:='1';
  1492. end;
  1493. procedure TBaseTestInputElement.Setup;
  1494. begin
  1495. inherited Setup;
  1496. CreateMy;
  1497. end;
  1498. procedure TBaseTestInputElement.TearDown;
  1499. begin
  1500. FreeAndNil(FMy);
  1501. inherited TearDown;
  1502. end;
  1503. procedure TBaseTestInputElement.AssertBaseProps(aType, aValueName, aValue : String; aText : String = '');
  1504. Var
  1505. El : TJSHTMLInputElement;
  1506. begin
  1507. if AType='' then
  1508. aType:=My.InputType;
  1509. if aValueName='' then
  1510. aValueName:='Test'; // Same as in CreateMy
  1511. if aValue='' then
  1512. aValue:='1'; // Same as in CreateMy
  1513. el:=InputElement;
  1514. AssertTree('input('+el.ID+')');
  1515. AssertEquals('Type',aType,el._Type);
  1516. AssertEquals('Value name',aValueName,el.name);
  1517. AssertEquals('Value',aValue,el.value);
  1518. AssertEquals('Text (inner text)',aText,el.innerText);
  1519. end;
  1520. procedure TBaseTestInputElement.TestEmpty;
  1521. begin
  1522. AssertNotNull('Have element',My);
  1523. end;
  1524. procedure TBaseTestInputElement.TestRequiredOnRender;
  1525. begin
  1526. My.Required:=True;
  1527. My.Refresh;
  1528. AssertEquals('required',True,InputElement.required);
  1529. end;
  1530. procedure TBaseTestInputElement.TestReadOnlyOnRender;
  1531. begin
  1532. My.ReadOnly:=True;
  1533. My.Refresh;
  1534. AssertEquals('ReadOnly',True,InputElement.ReadOnly);
  1535. end;
  1536. procedure TBaseTestInputElement.TestRequiredAfterRender;
  1537. begin
  1538. My.Refresh;
  1539. My.Required:=True;
  1540. AssertEquals('required',True,InputElement.required);
  1541. end;
  1542. procedure TBaseTestInputElement.TestReadOnlyAfterRender;
  1543. begin
  1544. My.Refresh;
  1545. My.ReadOnly:=True;
  1546. AssertEquals('ReadOnly',True,InputElement.ReadOnly);
  1547. end;
  1548. { TMyWebPage }
  1549. procedure TMyWebPage.SetParentId;
  1550. begin
  1551. ParentID:='A';
  1552. end;
  1553. procedure TMyWebPage.SetParent;
  1554. begin
  1555. Parent:=TViewPort.Create(Nil);
  1556. end;
  1557. procedure TMyWebPage.SetElementID;
  1558. begin
  1559. ElementID:=BaseID;
  1560. end;
  1561. { TTestPage }
  1562. function TTestPage.CreateElement(aID: String): TJSHTMLElement;
  1563. begin
  1564. Result:=TJSHTMLElement(Document.CreateElement('div'));
  1565. Result.ID:=aID;
  1566. BaseWindow.AppendChild(Result);
  1567. end;
  1568. procedure TTestPage.Setup;
  1569. begin
  1570. inherited Setup;
  1571. FMy:=TMyWebPage.Create(Nil);
  1572. end;
  1573. procedure TTestPage.TearDown;
  1574. begin
  1575. FreeAndNil(FMy);
  1576. inherited TearDown;
  1577. end;
  1578. procedure TTestPage.TestEmpty;
  1579. begin
  1580. AssertNotNull('Have element');
  1581. end;
  1582. procedure TTestPage.TestAsWindow;
  1583. begin
  1584. // Set element to base-window
  1585. My.SetElementID;
  1586. AssertSame('Correct',BaseWindow,My.Element);
  1587. end;
  1588. procedure TTestPage.TestNoParentOK;
  1589. begin
  1590. My.Refresh;
  1591. AssertSame('Correct parent',ViewPort.Element,My.ParentElement);
  1592. end;
  1593. procedure TTestPage.TestDefaultTag;
  1594. begin
  1595. AssertEquals('Correct tag','div',My.HTMLTag);
  1596. end;
  1597. { TMyViewPort }
  1598. procedure TMyViewPort.SetParentId;
  1599. begin
  1600. ParentID:='SomeThing';
  1601. end;
  1602. procedure TMyViewPort.SetParent;
  1603. begin
  1604. Parent:=Instance
  1605. end;
  1606. procedure TMyViewPort.SetElementID;
  1607. begin
  1608. ElementID:='Something';
  1609. end;
  1610. { TTestViewPort }
  1611. procedure TTestViewPort.Setup;
  1612. begin
  1613. inherited Setup;
  1614. FMy:=TMyViewPort.Create(Nil);
  1615. end;
  1616. procedure TTestViewPort.TearDown;
  1617. begin
  1618. FreeAndNil(FMy);
  1619. inherited TearDown;
  1620. end;
  1621. procedure TTestViewPort.TestInstance;
  1622. begin
  1623. AssertNotNull('Have viewport',ViewPort);
  1624. AssertSame('Have viewport',TViewPort.Instance,ViewPort);
  1625. end;
  1626. procedure TTestViewPort.TestHTMLTag;
  1627. begin
  1628. AssertEquals('Correct tag','body',ViewPort.HTMLTag);
  1629. end;
  1630. procedure TTestViewPort.TestElement;
  1631. begin
  1632. AssertSame('Correct Element',Document.Body,ViewPort.Element);
  1633. end;
  1634. procedure TTestViewPort.TestUnrender;
  1635. begin
  1636. AssertSame('Element retained',Document.Body,ViewPort.Element);
  1637. end;
  1638. procedure TTestViewPort.TestNoParent;
  1639. begin
  1640. AssertException('No parent can be set',EWidgets,@My.SetParent);
  1641. end;
  1642. procedure TTestViewPort.TestNoElementID;
  1643. begin
  1644. AssertException('No elementID can be set',EWidgets,@My.SetElementID);
  1645. end;
  1646. procedure TTestViewPort.TestNoParentID;
  1647. begin
  1648. AssertException('No ParentID can be set',EWidgets,@My.SetParentID);
  1649. end;
  1650. { TTestButtonWidget }
  1651. procedure TTestButtonWidget.SetUp;
  1652. begin
  1653. inherited SetUp;
  1654. FButton:=TButtonWidget.Create(Nil);
  1655. end;
  1656. procedure TTestButtonWidget.TearDown;
  1657. begin
  1658. FreeAndNil(FButton);
  1659. inherited TearDown;
  1660. end;
  1661. procedure TTestButtonWidget.TestTextBeforeRender;
  1662. Var
  1663. El : TJSHTMLElement;
  1664. begin
  1665. Button.ParentID:=BaseID;
  1666. Button.Text:='Click me';
  1667. Button.Refresh;
  1668. El:=AssertTree('button('+Button.ElementID+')');
  1669. AssertEquals('Text set','Click me',el.innerText);
  1670. end;
  1671. procedure TTestButtonWidget.TestTextAfterRender;
  1672. Var
  1673. El : TJSHTMLElement;
  1674. begin
  1675. Button.ParentID:=BaseID;
  1676. Button.Refresh;
  1677. El:=AssertTree('button('+Button.ElementID+')');
  1678. Button.Text:='Click me';
  1679. AssertEquals('Text set','Click me',el.innerText);
  1680. end;
  1681. procedure TTestButtonWidget.TestTextElementID;
  1682. Var
  1683. El : TJSHTMLElement;
  1684. begin
  1685. el:=TJSHTMLElement(Document.createElement('button'));
  1686. el.id:='b1';
  1687. BaseWindow.appendChild(el);
  1688. El:=AssertTree('button(b1)');
  1689. Button.elementID:='b1';
  1690. Button.Refresh;
  1691. Button.Text:='Click me';
  1692. AssertEquals('Text set','Click me',el.innerText);
  1693. end;
  1694. procedure TTestButtonWidget.TestClick;
  1695. begin
  1696. Button.ParentID:=BaseID;
  1697. Button.Refresh;
  1698. Button.OnClick:=@MyTestEventHandler;
  1699. Button.Click;
  1700. AssertEvent('click',Button);
  1701. end;
  1702. initialization
  1703. RegisterTests([TTestViewPort,TTestButtonWidget,TTestPage,
  1704. TTestTextInputElement,TTestTextAreaElement,
  1705. TTestRadioInputElement,TTestCheckBoxInputElement,
  1706. TTestDateInputElement,TTestFileInputElement,
  1707. TTestHiddenInputElement, TTestImageElement,
  1708. TTestImageElement,
  1709. TTestLabelWidget,TTestTextWidget,TTestTextLinesWidget,
  1710. TTestSelectElement,
  1711. TTestTableWidget]);
  1712. end.