1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993 |
- unit tcHTMLWidgets;
- {$mode objfpc}
- interface
- uses
- Classes, SysUtils, fpcunit, testregistry, web, webwidget, htmlwidgets, tcwidget, js;
- Type
- { TTestButtonWidget }
- TTestButtonWidget = Class(TBaseTestWidget)
- private
- FButton: TButtonWidget;
- Protected
- Procedure SetUp; override;
- Procedure TearDown; override;
- Property Button : TButtonWidget Read FButton;
- Published
- Procedure TestTextBeforeRender;
- Procedure TestTextAfterRender;
- Procedure TestTextElementID;
- Procedure TestClick;
- end;
- { TTestLabelWidget }
- TMyLabelWidget = Class(TLabelWidget)
- Public
- Property LabelElement;
- end;
- TTestLabelWidget = Class(TBaseTestWidget)
- private
- FEdit: TTextInputWidget;
- FMy: TMyLabelWidget;
- Protected
- Procedure SetUp; override;
- Procedure TearDown; override;
- Property My : TMyLabelWidget Read FMy;
- Property Edit : TTextInputWidget Read FEdit;
- Published
- Procedure TestPropsBeforeRender;
- Procedure TestPropsAfterRender;
- end;
- { TTestViewPort }
- { TMyViewPort }
- TMyViewPort = Class(TViewPort)
- Public
- Procedure SetParentId;
- Procedure SetParent;
- Procedure SetElementID;
- end;
- TTestViewPort = Class(TBaseTestWidget)
- private
- FMy: TMyViewPort;
- Protected
- Procedure Setup; override;
- Procedure TearDown; override;
- Property My : TMyViewPort Read FMy;
- Published
- Procedure TestInstance;
- Procedure TestHTMLTag;
- Procedure TestElement;
- Procedure TestUnrender;
- Procedure TestNoParent;
- Procedure TestNoElementID;
- Procedure TestNoParentID;
- end;
- { TTestPage }
- { TMyWebPage }
- TMyWebPage = Class(TWebPage)
- Public
- Procedure SetParentId;
- Procedure SetParent;
- Procedure SetElementID;
- end;
- TTestPage = Class(TBaseTestWidget)
- private
- FMy: TMyWebPage;
- Protected
- Function CreateElement(aID : String) : TJSHTMLElement;
- Procedure Setup; override;
- Procedure TearDown; override;
- Property My : TMyWebPage Read FMy;
- Published
- Procedure TestEmpty;
- Procedure TestAsWindow;
- Procedure TestNoParentOK;
- Procedure TestDefaultTag;
- end;
- { TBaseTestInputElement }
- TInputHack = class(TCustomInputWidget)
- Public
- Property Element;
- Property InputElement;
- end;
- TBaseTestInputElement = Class(TBaseTestWidget)
- private
- FMy: TCustomInputWidget;
- function GetInputElement: TJSHTMLInputElement;
- Protected
- // Must be handled in descendent. Called during setup to populate My.
- Function CreateInput : TCustomInputWidget; virtual; abstract;
- // (Re)create my. Calls createinput
- Procedure CreateMy; virtual;
- Procedure Setup; override;
- Procedure TearDown; override;
- // Assert basic properties are correct on the element.
- procedure AssertBaseProps(aType, aValueName, aValue: String; aText: String='');
- Property My : TCustomInputWidget Read FMy;
- Property InputElement : TJSHTMLInputElement Read GetInputElement;
- Published
- Procedure TestEmpty;
- Procedure TestRequiredOnRender;
- Procedure TestReadOnlyOnRender;
- Procedure TestRequiredAfterRender;
- Procedure TestReadOnlyAfterRender;
- end;
- { TTestTextInputElement }
- TTestTextInputElement = Class(TBaseTestInputElement)
- Protected
- FITT: TInputTextType;
- Procedure setup; override;
- Function CreateInput : TCustomInputWidget; override;
- Function MyText : TTextInputWidget;
- Published
- Procedure TestDefaultTextType;
- Procedure TestRender;
- Procedure TestChangeValue;
- Procedure TestChangeName;
- Procedure TestChangeTextType;
- Procedure TestTypePassword;
- Procedure TestTypeNumber;
- Procedure TestAsNumber;
- Procedure TestTypeEmail;
- Procedure TestTypeSearch;
- Procedure TestTypeTel;
- Procedure TestTypeURL;
- Procedure TestTypeColor;
- end;
- { TTestRadioInputElement }
- TTestRadioInputElement = Class(TBaseTestInputElement)
- Protected
- Function CreateInput : TCustomInputWidget; override;
- Function MyRadio : TRadioInputWidget;
- Published
- Procedure TestPropsOnRender;
- Procedure TestPropsAfterRender;
- end;
- TTestCheckboxInputElement = Class(TBaseTestInputElement)
- Protected
- Function CreateInput : TCustomInputWidget; override;
- Function MyCheckbox : TCheckboxInputWidget;
- Published
- Procedure TestPropsOnRender;
- Procedure TestPropsAfterRender;
- end;
- TMyDateInputWidget = Class(TDateInputWidget)
- end;
- { TTestDateInputElement }
- TTestDateInputElement = Class(TBaseTestInputElement)
- Protected
- Function CreateInput : TCustomInputWidget; override;
- Procedure CreateMy; override;
- Function MyDate : TMyDateInputWidget;
- Published
- Procedure TestPropsOnRender;
- Procedure TestPropsAfterRender;
- end;
- TMyFileInputWidget = Class(TFileInputWidget)
- end;
- { TTestFileInputElement }
- TTestFileInputElement = Class(TBaseTestInputElement)
- Protected
- Function CreateInput : TCustomInputWidget; override;
- Procedure CreateMy; override;
- Function MyFile : TMyFileInputWidget;
- Published
- Procedure TestPropsOnRender;
- Procedure TestPropsAfterRender;
- end;
- TMyHiddenInputWidget = Class(THiddenInputWidget)
- end;
- { TTestHiddenInputElement }
- TTestHiddenInputElement = Class(TBaseTestInputElement)
- Protected
- Function CreateInput : TCustomInputWidget; override;
- Function MyHidden : TMyHiddenInputWidget;
- Published
- Procedure TestPropsOnRender;
- Procedure TestPropsAfterRender;
- end;
- { TTestTextAreaElement }
- TMyTextAreaWidget = Class(TTextAreaWidget)
- Public
- Property TextArea;
- end;
- TTestTextAreaElement = Class(TBaseTestWidget)
- private
- FMy: TMyTextAreaWidget;
- function GetArea: TJSHTMLTextAreaElement;
- Protected
- Procedure Setup; override;
- Procedure TearDown; override;
- Property My : TMyTextAreaWidget Read FMy;
- Property Area : TJSHTMLTextAreaElement Read GetArea;
- Published
- Procedure TestEmpty;
- Procedure TestPropsOnRender;
- Procedure TestPropsAfterRender;
- end;
- TMyImageWidget = Class(TImageWidget)
- Public
- Property Element;
- end;
- { TTestImageElement }
- TTestImageElement = Class(TBaseTestWidget)
- private
- FMy: TMyImageWidget;
- function GetImg: TJSHTMLImageElement;
- Protected
- Procedure Setup; override;
- Procedure TearDown; override;
- Function ThisURL : String;
- Property My : TMyImageWidget Read FMy;
- Property Image : TJSHTMLImageElement Read GetImg;
- Published
- Procedure TestEmpty;
- Procedure TestPropsOnRender;
- Procedure TestPropsAfterRender;
- end;
- TMySelectWidget = Class(TSelectWidget)
- Public
- Property Element;
- Property SelectElement;
- Property Options;
- end;
- { TTestSelectElement }
- TTestSelectElement = Class(TBaseTestWidget)
- private
- FMy: TMySelectWidget;
- procedure AssertOption(Idx: Integer; aText, aValue: String; Selected: Boolean=False);
- function GetOptions: TJSHTMLOPtionElementArray;
- function GetSelect: TJSHTMLSelectElement;
- Protected
- Procedure Setup; override;
- Procedure TearDown; override;
- Property My : TMySelectWidget Read FMy;
- Property Select : TJSHTMLSelectElement Read GetSelect;
- Property Options : TJSHTMLOPtionElementArray Read GetOptions;
- Published
- Procedure TestEmpty;
- Procedure TestPropsOnRender;
- Procedure TestPropsAfterRender;
- Procedure TestMultiSelect;
- Procedure TestNoSelectedIndex;
- end;
- TMyTextWidget = Class(TTextWidget)
- Public
- Property Element;
- Property ParentElement;
- end;
- { TTestTextWidget }
- TTestTextWidget = Class(TBaseTestWidget)
- private
- FMy: TMyTextWidget;
- Protected
- Procedure Setup; override;
- Procedure TearDown; override;
- Property My : TMyTextWidget Read FMy;
- Published
- Procedure TestEmpty;
- Procedure TestRenderText;
- Procedure TestRenderedTextChange;
- Procedure TestRenderHTML;
- Procedure TestRenderedHTMLChange;
- procedure TestTextModeChangeRenders;
- procedure TestEnvelopeChangeRenders;
- end;
- TMyTextLinesWidget = Class(TTextLinesWidget)
- Public
- Property Element;
- Property ParentElement;
- end;
- { TTestTextLinesWidget }
- TTestTextLinesWidget = Class(TBaseTestWidget)
- private
- FMy: TMyTextLinesWidget;
- Protected
- Procedure Setup; override;
- Procedure TearDown; override;
- Property My : TMyTextLinesWidget Read FMy;
- Published
- Procedure TestEmpty;
- Procedure TestRenderText;
- Procedure TestRenderedTextChange;
- Procedure TestRenderTextLineBreaks;
- Procedure TestRenderHTML;
- Procedure TestRenderHTMLLineBreaks;
- Procedure TestRenderedHTMLChange;
- procedure TestTextModeChangeRenders;
- procedure TestEnvelopeChangeRenders;
- end;
- { TMyTableWidget }
- TMyTableWidget = Class(TCustomTableWidget)
- private
- FRowCount: Integer;
- Protected
- Type
- TMyTableRowCountEnumerator = Class(TTableRowCountEnumerator)
- procedure GetCellData(aData: TTableWidgetCellData); override;
- end;
- Public
- Constructor create(aOwner : TComponent); override;
- Function GetBodyRowEnumerator : TTableRowEnumerator; override;
- Function GetRowEnumerator(aKind: TRowKind): TTableRowEnumerator; override;
- Property RowCount : Integer Read FRowCount Write FRowCount;
- Property CustomColumns;
- Property Caption;
- Property TableOptions;
- Property OnGetCellData;
- Property OnCellClick;
- Property OnHeaderCellClick;
- Property OnFooterCellClick;
- Property OnRowClick;
- Property OnHeaderRowClick;
- Property OnFooterRowClick;
- end;
- { TTestTableWidget }
- TTestTableWidget = Class(TBaseTestWidget)
- private
- FMy: TMyTableWidget;
- FClickCount : Integer;
- FClickEvent: TJSEvent;
- procedure AssertTableCaption(El: TJSHTMLElement);
- procedure CheckBodyCells(aParent: TJSHTMLELement);
- procedure CheckBodyRow(aParent: TJSHTMLELement; aIndex: Integer);
- procedure CheckCellData(el: TJSHTMLElement; aRow, aCol: Integer; rk: TRowKind; RowOption: TTableOption; ColOption: TTableOption);
- procedure CheckHeaderCells(aParent: TJSHTMLELement);
- procedure CheckFooterCells(aParent: TJSHTMLELement);
- procedure CheckRowData(aRow: TJSHTMLELement; aRowKind: TRowKind; aRowKindOption: TTableOption; aIndex: integer);
- procedure DoClickCount(Sender: TObject; Event: TJSEvent);
- Protected
- Procedure Setup; override;
- Procedure TearDown; override;
- Property My : TMyTableWidget Read FMy;
- Published
- Procedure TestEmpty;
- Procedure TestRender;
- Procedure TestRenderNoCaption;
- Procedure TestRenderNoCaptionNoHeaders;
- Procedure TestRenderFooters;
- Procedure TestRenderNoheaderFooterBody;
- Procedure TestRenderRowId;
- Procedure TestRenderCellID;
- Procedure TestRenderHeaderRowData;
- Procedure TestRenderHeaderCellDataRow;
- Procedure TestRenderHeaderCellDataCol;
- Procedure TestRenderRowData;
- Procedure TestRenderBodyCellDataRow;
- Procedure TestRenderBodyCellDataCol;
- Procedure TestRenderFooterRowData;
- Procedure TestRenderFooterCellDataRow;
- Procedure TestRenderFooterCellDataCol;
- Procedure TestClickHeaderCell;
- Procedure TestClickFooterCell;
- Procedure TestClickCell;
- Procedure TestClickRow;
- Procedure TestClickRowFromCell;
- Procedure TestClickHeaderRowFromHeaderCell;
- Procedure TestClickFooterRowFromFooterCell;
- end;
- implementation
- { TTestTableWidget }
- procedure TTestTableWidget.Setup;
- begin
- inherited Setup;
- FMy:=TMyTableWidget.Create(Nil);
- FMy.ParentID:=SBaseWindowID;
- end;
- procedure TTestTableWidget.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- procedure TTestTableWidget.TestEmpty;
- begin
- AssertNotNull('Have table',My);
- AssertEquals('Have parentid',SBaseWindowID,My.ParentID);
- AssertNotNull('Have table cols',My.CustomColumns);
- AssertEquals('Have table col count',2,My.CustomColumns.Count);
- end;
- procedure TTestTableWidget.CheckHeaderCells(aParent : TJSHTMLELement);
- Var
- El : TJSHTMLElement;
- I : integer;
- Col : TCustomTableColumn;
- begin
- AssertEquals('Header row count',1, aParent.childElementCount);
- aParent:=TJSHTMLElement(aParent.firstElementChild);
- AssertnotNull('Have row',aParent);
- AssertEquals('Have row tag','tr',LowerCase(aParent.tagname));
- CheckRowData(aParent,rkHeader,toHeaderRowData,0);
- AssertEquals('Header cell count',My.CustomColumns.Count, aParent.childElementCount);
- I:=0;
- el:=TJSHTMLElement(aParent.firstElementChild);
- While el<>Nil do
- begin
- AssertTrue('have col avail',I<My.CustomColumns.Count);
- Col:=My.CustomColumns[i];
- AssertNotNull('have col instance',Col);
- AssertEquals('Have head element','th',LowerCase(el.tagName));
- AssertEquals('Have head content col caption',Col.Caption,el.innerText);
- CheckCellData(el,0,i,rkHeader,toHeaderCellDataRow,toHeaderCellDataCol);
- El:=TJSHTMLElement(El.nextElementSibling);
- Inc(i);
- end;
- end;
- procedure TTestTableWidget.CheckRowData(aRow: TJSHTMLELement; aRowKind : TRowKind; aRowKindOption : TTableOption; aIndex : integer);
- Var
- S : String;
- begin
- S:=RowKindNames[aRowKind];
- if (toRowID in My.TableOptions) then
- AssertEquals(S+' row ID',My.ElementID+'-'+S+'-'+IntToStr(aIndex),String(aRow.ID))
- else
- AssertEquals(S+' Row ID empty','',aRow.ID);
- if (aRowKindOption in My.TableOptions) then
- begin
- AssertEquals(S+' row data',IntToStr(aIndex),String(aRow.Dataset['row']));
- AssertEquals(S+' row kind data',S,String(aRow.Dataset['kind']));
- end
- else
- begin
- AssertTrue(S+' empty row data',isUndefined(aRow.Dataset['kind']));
- AssertTrue(S+' empty row data',isUndefined(aRow.Dataset['row']));
- end;
- end;
- procedure TTestTableWidget.CheckFooterCells(aParent: TJSHTMLELement);
- Var
- El : TJSHTMLElement;
- I : integer;
- Col : TCustomTableColumn;
- begin
- AssertEquals('Footer row count',1, aParent.childElementCount);
- aParent:=TJSHTMLElement(aParent.firstElementChild);
- AssertnotNull('Have row',aParent);
- AssertEquals('Have row tag','tr',LowerCase(aParent.tagname));
- CheckRowData(aParent,rkFooter,tofooterRowData,0);
- AssertEquals('Footer cell count',My.CustomColumns.Count, aParent.childElementCount);
- I:=0;
- el:=TJSHTMLElement(aParent.firstElementChild);
- While el<>Nil do
- begin
- AssertTrue('have col avail',I<My.CustomColumns.Count);
- Col:=My.CustomColumns[i];
- AssertNotNull('have col instance',Col);
- AssertEquals('Have footer element','td',LowerCase(el.tagName));
- AssertEquals('Have footer content',Format('Footer[%d]',[I]),el.innerText);
- CheckCellData(el,0,i,rkFooter,toFooterCellDataRow,toFooterCellDataCol);
- El:=TJSHTMLElement(El.nextElementSibling);
- Inc(i);
- end;
- end;
- procedure TTestTableWidget.DoClickCount(Sender: TObject; Event: TJSEvent);
- begin
- Inc(FClickCount);
- AssertSame('Table',My,Sender);
- FClickEvent:=Event;
- end;
- procedure TTestTableWidget.CheckCellData(el : TJSHTMLElement; aRow,aCol : Integer; rk : TRowKind; RowOption : TTableOption; ColOption : TTableOption) ;
- Var
- S : String;
- begin
- S:=RowKindNames[RK];
- if toCellID in My.TableOptions then
- AssertEquals('Cell ID',My.ElementID+'-'+S+'-'+IntToStr(aRow)+'-'+IntToStr(aCol),el.ID)
- else
- AssertEquals('Cell ID','',el.ID);
- if ([rowoption,coloption] * My.TableOptions) <> [] then
- AssertEquals(S+'row kind data',S,String(el.Dataset['kind']))
- else
- AssertTrue(S+'cell empty row data',isUndefined(el.Dataset['kind']));
- if (rowOption in My.TableOptions) then
- AssertEquals(S+'cell row data',IntToStr(aRow),String(el.Dataset['row']))
- else
- AssertTrue(S+' cell empty row data',isUndefined(el.Dataset['row']));
- if (ColOption in My.TableOptions) then
- AssertEquals(S+' cell col data',IntToStr(aCol),String(el.Dataset['col']))
- else
- AssertTrue(S+' cell empty col data',isUndefined(el.Dataset['col']));
- end;
- procedure TTestTableWidget.CheckBodyRow(aParent : TJSHTMLELement; aIndex : Integer);
- Var
- El : TJSHTMLElement;
- I : integer;
- Col : TCustomTableColumn;
- begin
- CheckRowData(aParent,rkBody,toBodyRowData,aIndex);
- AssertEquals('row cell count',My.CustomColumns.Count, aParent.childElementCount);
- I:=0;
- el:=TJSHTMLElement(aParent.firstElementChild);
- While el<>Nil do
- begin
- AssertTrue('have col avail',I<My.CustomColumns.Count);
- Col:=My.CustomColumns[i];
- AssertNotNull('have col instance',Col);
- AssertEquals('Have cell element','td',LowerCase(el.tagName));
- AssertEquals('Have cell content ',Format('cell[%d,%d]',[I,aIndex]),el.innerText);
- CheckCellData(el,aIndex,i,rkBody,toBodyCellDataRow,toBodyCellDataCol);
- El:=TJSHTMLElement(El.nextElementSibling);
- Inc(i);
- end;
- end;
- procedure TTestTableWidget.CheckBodyCells(aParent : TJSHTMLELement);
- Var
- aRow : integer;
- begin
- AssertEquals('Body row count',My.RowCount, aParent.childElementCount);
- aParent:=TJSHTMLElement(aParent.firstElementChild);
- aRow:=0;
- While aParent<>nil do
- begin
- AssertNotNull('Have row',aParent);
- AssertEquals('Have row tag','tr',LowerCase(aParent.tagname));
- CheckBodyRow(aParent,aRow);
- aParent:=TJSHTMLElement(aParent.nextElementSibling);
- inc(aRow);
- end;
- end;
- procedure TTestTableWidget.AssertTableCaption(El : TJSHTMLElement);
- begin
- AssertTrue('Caption element',SameText('caption',el.tagName));
- AssertEquals('Caption',My.Caption,El.InnerHTML)
- end;
- procedure TTestTableWidget.TestRender;
- Var
- El : TJSHTMLElement;
- begin
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','table',Lowercase(My.Element.tagName));
- AssertEquals('Sub elements',3,My.Element.childElementCount);
- El:=TJSHTMLElement(My.Element.firstElementChild);
- AssertTableCaption(El);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have head element','thead',LowerCase(el.tagName));
- CheckHeaderCells(el);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have body element','tbody',LowerCase(el.tagName));
- CheckBodyCells(el);
- end;
- procedure TTestTableWidget.TestRenderNoCaption;
- Var
- El : TJSHTMLElement;
- begin
- My.Caption:='';
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','table',Lowercase(My.Element.tagName));
- AssertEquals('Sub elements',2,My.Element.childElementCount);
- El:=TJSHTMLElement(My.Element.firstElementChild);
- AssertEquals('Have head element','thead',LowerCase(el.tagName));
- CheckHeaderCells(el);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have body element','tbody',LowerCase(el.tagName));
- CheckBodyCells(el);
- end;
- procedure TTestTableWidget.TestRenderNoCaptionNoHeaders;
- Var
- El : TJSHTMLElement;
- begin
- My.Caption:='';
- My.TableOptions:=My.TableOptions-[toHeaderRow];
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','table',Lowercase(My.Element.tagName));
- AssertEquals('Sub elements',1,My.Element.childElementCount);
- El:=TJSHTMLElement(My.Element.firstElementChild);
- AssertEquals('Have body element','tbody',LowerCase(el.tagName));
- CheckBodyCells(el);
- end;
- procedure TTestTableWidget.TestRenderFooters;
- Var
- El : TJSHTMLElement;
- begin
- My.TableOptions:=My.TableOptions+[toFooterRow];
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','table',Lowercase(My.Element.tagName));
- AssertEquals('Sub elements',4,My.Element.childElementCount);
- El:=TJSHTMLElement(My.Element.firstElementChild);
- AssertTableCaption(El);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have head element','thead',LowerCase(el.tagName));
- CheckHeaderCells(el);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have body element','tbody',LowerCase(el.tagName));
- CheckBodyCells(el);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have footer element','tfoot',LowerCase(el.tagName));
- CheckFooterCells(el);
- end;
- procedure TTestTableWidget.TestRenderNoheaderFooterBody;
- Var
- El : TJSHTMLElement;
- begin
- My.TableOptions:=My.TableOptions-[toFooter,toBody,toHeader]+[toFooterRow];
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','table',Lowercase(My.Element.tagName));
- AssertEquals('Sub elements',5,My.Element.childElementCount);
- El:=TJSHTMLElement(My.Element.firstElementChild);
- AssertTableCaption(El);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have head element','tr',LowerCase(el.tagName));
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have body element 1','tr',LowerCase(el.tagName));
- CheckBodyRow(El,0);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have body element 2','tr',LowerCase(el.tagName));
- CheckBodyRow(El,1);
- El:=TJSHTMLElement(El.nextElementSibling);
- AssertEquals('Have footer element','tr',LowerCase(el.tagName));
- end;
- procedure TTestTableWidget.TestRenderRowId;
- begin
- My.TableOptions:=My.TableOptions+[toRowID];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderCellID;
- begin
- My.TableOptions:=My.TableOptions+[toCellID];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderHeaderRowData;
- begin
- My.TableOptions:=My.TableOptions+[toHeaderRowData];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderHeaderCellDataRow;
- begin
- My.TableOptions:=My.TableOptions+[toHeaderCellDataRow];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderHeaderCellDataCol;
- begin
- My.TableOptions:=My.TableOptions+[toHeaderCellDataCol];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderRowData;
- begin
- My.TableOptions:=My.TableOptions+[toBodyRowData];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderBodyCellDataRow;
- begin
- My.TableOptions:=My.TableOptions+[toBodyCellDataRow];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderBodyCellDataCol;
- begin
- My.TableOptions:=My.TableOptions+[toBodyCellDataCol];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderFooterRowData;
- begin
- My.TableOptions:=My.TableOptions+[tofooterRowData];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderFooterCellDataRow;
- begin
- My.TableOptions:=My.TableOptions+[tofooterCellDataRow];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestRenderFooterCellDataCol;
- begin
- My.TableOptions:=My.TableOptions+[tofooterCellDataCol];
- TestRender;// Check functions will do additional check.
- end;
- procedure TTestTableWidget.TestClickHeaderCell;
- Var
- ev : TJSEvent;
- el : TJSHTMLElement;
- begin
- My.Caption:='';
- My.OnHeaderCellClick:=@DoClickCount;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- ev:=TJSEvent.New('click');
- el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild.firstElementChild);
- AssertEquals('TH el','th',LowerCase(el.TagName));
- el.dispatchEvent(ev);
- AssertEquals('One click',1,FClickCount);
- AssertSame('Event',ev,FClickEvent);
- end;
- procedure TTestTableWidget.TestClickFooterCell;
- Var
- ev : TJSEvent;
- el : TJSHTMLElement;
- begin
- My.Caption:='';
- My.TableOptions:=My.TableOptions-[toHeaderRow]+[toFooterRow];
- My.OnFooterCellClick:=@DoClickCount;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- ev:=TJSEvent.New('click');
- el:=TJSHTMLElement(My.Element.firstElementChild.nextElementSibling.firstElementChild.firstElementChild);
- AssertEquals('TD el','td',LowerCase(el.TagName));
- el.dispatchEvent(ev);
- AssertEquals('One click',1,FClickCount);
- AssertSame('Event',ev,FClickEvent);
- end;
- procedure TTestTableWidget.TestClickCell;
- Var
- ev : TJSEvent;
- el : TJSHTMLElement;
- begin
- My.Caption:='';
- My.TableOptions:=My.TableOptions-[toHeaderRow];
- My.OnCellClick:=@DoClickCount;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- ev:=TJSEvent.New('click');
- el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild.firstElementChild);
- AssertEquals('TD el','td',LowerCase(el.TagName));
- el.dispatchEvent(ev);
- AssertEquals('One click',1,FClickCount);
- AssertSame('Event',ev,FClickEvent);
- end;
- procedure TTestTableWidget.TestClickRow;
- Var
- ev : TJSEvent;
- el : TJSHTMLElement;
- begin
- My.Caption:='';
- My.TableOptions:=My.TableOptions-[toHeaderRow];
- My.OnRowClick:=@DoClickCount;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- ev:=TJSEvent.New('click');
- el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild);
- AssertEquals('TD el','tr',LowerCase(el.TagName));
- el.dispatchEvent(ev);
- AssertEquals('One click',1,FClickCount);
- AssertSame('Event',ev,FClickEvent);
- end;
- procedure TTestTableWidget.TestClickRowFromCell;
- Var
- ev : TJSEvent;
- el : TJSHTMLElement;
- begin
- My.Caption:='';
- My.TableOptions:=My.TableOptions-[toHeaderRow];
- My.OnRowClick:=@DoClickCount;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- ev:=TJSEvent.New('click');
- el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild.FirstElementChild);
- AssertEquals('TD el','td',LowerCase(el.TagName));
- el.dispatchEvent(ev);
- AssertEquals('One click',1,FClickCount);
- AssertSame('Event',ev,FClickEvent);
- end;
- procedure TTestTableWidget.TestClickHeaderRowFromHeaderCell;
- Var
- ev : TJSEvent;
- el : TJSHTMLElement;
- begin
- My.Caption:='';
- // My.TableOptions:=My.TableOptions;
- My.OnHeaderRowClick:=@DoClickCount;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- ev:=TJSEvent.New('click');
- el:=TJSHTMLElement(My.Element.firstElementChild.firstElementChild.FirstElementChild);
- AssertEquals('TD el','th',LowerCase(el.TagName));
- el.dispatchEvent(ev);
- AssertEquals('One click',1,FClickCount);
- AssertSame('Event',ev,FClickEvent);
- end;
- procedure TTestTableWidget.TestClickFooterRowFromFooterCell;
- Var
- ev : TJSEvent;
- el : TJSHTMLElement;
- begin
- My.Caption:='';
- My.TableOptions:=My.TableOptions-[toHeaderRow]+[toFooterRow];
- My.OnFooterRowClick:=@DoClickCount;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- ev:=TJSEvent.New('click');
- el:=TJSHTMLElement(My.Element.firstElementChild.nextElementSibling.firstElementChild.firstElementChild);
- AssertEquals('TD el','td',LowerCase(el.TagName));
- el.dispatchEvent(ev);
- AssertEquals('One click',1,FClickCount);
- AssertSame('Event',ev,FClickEvent);
- end;
- { TMyTableWidget }
- constructor TMyTableWidget.create(aOwner: TComponent);
- begin
- inherited create(aOwner);
- CustomColumns.Add ('Col1');
- CustomColumns.Add ('Col2');
- Caption:='Our caption';
- RowCount:=2;
- end;
- function TMyTableWidget.GetBodyRowEnumerator: TTableRowEnumerator;
- begin
- Result:=TMyTableRowCountEnumerator.Create(Self,RowCount);
- end;
- function TMyTableWidget.GetRowEnumerator(aKind: TRowKind): TTableRowEnumerator;
- begin
- if AKind=rkFooter then
- Result:=TMyTableRowCountEnumerator.Create(Self,1)
- else
- Result:=Inherited GetRowEnumerator(aKind);
- end;
- procedure TMyTableWidget.TMyTableRowCountEnumerator.GetCellData(aData: TTableWidgetCellData);
- begin
- inherited GetCellData(aData);
- Case aData.Kind of
- rkBody :
- aData.Text:=Format('cell[%d,%d]',[aData.Col,aData.Row]);
- rkFooter :
- begin
- aData.Text:=Format('Footer[%d]',[aData.Col]);
- end;
- end;
- end;
- { TTestTextLinesWidget }
- procedure TTestTextLinesWidget.Setup;
- begin
- inherited Setup;
- FMy:=TMyTextLinesWidget.Create(Nil);
- FMy.ParentID:=SBaseWindowID;
- FMy.Lines.Add('0<1');
- FMy.Lines.Add('two');
- end;
- procedure TTestTextLinesWidget.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- procedure TTestTextLinesWidget.TestEmpty;
- begin
- AssertNotNull('Have widget',My);
- AssertNull('widget not rendered',My.Element);
- AssertTrue('Text mode default text',tmText=My.TextMode);
- AssertTrue('Envelope tag default paragraph',ttParagraph=My.EnvelopeTag);
- end;
- procedure TTestTextLinesWidget.TestRenderText;
- begin
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','P',My.Element.tagName);
- AssertEquals('Have text','0<1'+slineBreak+'two'+slineBreak,My.Element.InnerText);
- end;
- procedure TTestTextLinesWidget.TestRenderedTextChange;
- begin
- My.Refresh;
- My.Lines[1]:='Three';
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','P',My.Element.tagName);
- AssertEquals('Have text','0<1'+slineBreak+'Three'+slineBreak,My.Element.InnerText);
- end;
- procedure TTestTextLinesWidget.TestRenderTextLineBreaks;
- begin
- My.ForceLineBreaks:=True;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have text','0<1'+slineBreak+'two'+slineBreak,My.Element.InnerText);
- AssertEquals('Have HTML','0&lt;1<br>two<br>',My.Element.InnerHtml);
- end;
- procedure TTestTextLinesWidget.TestRenderHTML;
- begin
- My.TextMode:=tmHTML;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','P',My.Element.tagName);
- AssertEquals('Have text','0<1 two',My.Element.InnerText);
- AssertEquals('Have HTML','0<1'+sLineBreak+'two'+sLineBreak,My.Element.InnerHtml);
- end;
- procedure TTestTextLinesWidget.TestRenderHTMLLineBreaks;
- begin
- My.TextMode:=tmHTML;
- My.ForceLineBreaks:=True;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','P',My.Element.tagName);
- AssertEquals('Have text','0<1'+slineBreak+'two'+slineBreak,My.Element.InnerText);
- AssertEquals('Have HTML','0<1<br>two<br>',My.Element.InnerHtml);
- end;
- procedure TTestTextLinesWidget.TestRenderedHTMLChange;
- begin
- TestRenderHTML;
- My.Lines[1]:='three';
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','P',My.Element.tagName);
- AssertEquals('Have text','0<1 three',My.Element.InnerText);
- AssertEquals('Have HTML','0<1'+sLineBreak+'three'+sLineBreak,My.Element.InnerHtml);
- end;
- procedure TTestTextLinesWidget.TestTextModeChangeRenders;
- begin
- TestRenderText;
- My.TextMode:=tmHTML;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','P',My.Element.tagName);
- AssertEquals('Have text','0<1 two',My.Element.InnerText);
- AssertEquals('Have HTML','0<1'+sLineBreak+'two'+sLineBreak,My.Element.InnerHtml);
- end;
- procedure TTestTextLinesWidget.TestEnvelopeChangeRenders;
- begin
- TestRenderText;
- My.EnvelopeTag:=ttSpan;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','SPAN',My.Element.tagName);
- AssertEquals('Have text','0<1'+slineBreak+'two'+slineBreak,My.Element.InnerText);
- end;
- { TTestTextWidget }
- procedure TTestTextWidget.Setup;
- begin
- inherited Setup;
- FMy:=TMyTextWidget.Create(Nil);
- FMy.ParentID:=SBaseWindowID;
- FMy.Text:='0<1';
- end;
- procedure TTestTextWidget.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- procedure TTestTextWidget.TestEmpty;
- begin
- AssertNotNull('Have widget',My);
- AssertNull('widget not rendered',My.Element);
- AssertTrue('Text mode default text',tmText=My.TextMode);
- AssertTrue('Envelope tag default paragraph',ttParagraph=My.EnvelopeTag);
- end;
- procedure TTestTextWidget.TestRenderText;
- begin
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','P',My.Element.tagName);
- AssertEquals('Have text','0<1',My.Element.InnerText);
- end;
- procedure TTestTextWidget.TestRenderedTextChange;
- begin
- TestRenderText;
- My.Text:='Something else';
- AssertEquals('Have text','Something else',My.Element.InnerText);
- end;
- procedure TTestTextWidget.TestRenderHTML;
- begin
- My.TextMode:=tmHTML;
- My.Refresh;
- AssertNotNull('Have element',My.Element);
- AssertEquals('Have element','P',My.Element.tagName);
- AssertEquals('Have text','0<1',My.Element.InnerText);
- AssertEquals('Have HTML','0<1',My.Element.InnerHtml);
- end;
- procedure TTestTextWidget.TestRenderedHTMLChange;
- begin
- TestRenderHtml;
- My.Text:='2>1';
- AssertEquals('Have text','2>1',My.Element.InnerText);
- AssertEquals('Have HTML','2>1',My.Element.InnerHtml);
- end;
- procedure TTestTextWidget.TestTextModeChangeRenders;
- begin
- TestRenderText;
- My.TextMode:=tmHTML;
- AssertEquals('Have text','0<1',My.Element.InnerText);
- AssertEquals('Have HTML','0<1',My.Element.InnerHtml);
- end;
- procedure TTestTextWidget.TestEnvelopeChangeRenders;
- begin
- TestRenderText;
- My.EnvelopeTag:=ttSpan;
- AssertEquals('Have element','SPAN',My.Element.tagName);
- AssertEquals('Have text','0<1',My.Element.InnerText);
- AssertEquals('Have HTML','0&lt;1',My.Element.InnerHtml);
- end;
- { TTestLabelWidget }
- procedure TTestLabelWidget.SetUp;
- begin
- inherited SetUp;
- FMy:=TMyLabelWidget.Create(Nil);
- My.Text:='Your name';
- My.ParentID:=SBaseWindowID;
- FEdit:=TTextInputWidget.Create(Nil);
- FEdit.ParentID:=SBaseWindowID;
- FMy.LabelFor:=Edit;
- end;
- procedure TTestLabelWidget.TearDown;
- begin
- FreeAndNil(Fmy);
- FreeAndNil(FEdit);
- inherited TearDown;
- end;
- procedure TTestLabelWidget.TestPropsBeforeRender;
- begin
- Edit.Refresh;
- My.Refresh;
- AssertEquals('text','Your name',My.LabelElement.innerText);
- AssertEquals('for',Edit.ElementID,My.LabelElement.For_);
- end;
- procedure TTestLabelWidget.TestPropsAfterRender;
- begin
- My.LabelFor:=Nil;
- My.Refresh;
- AssertEquals('text','Your name',My.LabelElement.innerText);
- AssertEquals('for','',My.LabelElement.For_);
- // Will render Edit!
- My.LabelFor:=Edit;
- AssertTrue('Have edit id',Edit.ElementID<>'');
- My.Text:='My Name';
- My.Refresh;
- AssertEquals('text','My Name',My.LabelElement.innerText);
- AssertEquals('for',Edit.ElementID,My.LabelElement.For_);
- end;
- { TTestSelectElement }
- function TTestSelectElement.GetOptions: TJSHTMLOPtionElementArray;
- begin
- Result:=My.Options;
- end;
- function TTestSelectElement.GetSelect: TJSHTMLSelectElement;
- begin
- Result:=My.SelectElement;
- end;
- procedure TTestSelectElement.Setup;
- begin
- inherited Setup;
- FMy:=TMySelectWidget.Create(Nil);
- FMy.ParentID:=SBaseWindowID;
- FMy.Items.Add('One');
- FMy.Items.Add('Two');
- FMy.Items.Add('Three');
- FMy.Values.Add('1');
- FMy.Values.Add('2');
- FMy.Values.Add('3');
- FMy.SelectedIndex:=0;
- end;
- procedure TTestSelectElement.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- procedure TTestSelectElement.TestEmpty;
- begin
- AssertNotNull('Have widget',My);
- AssertNull('Not rendered',My.Element);
- end;
- procedure TTestSelectElement.AssertOption(Idx : Integer; aText,aValue : String; Selected : Boolean= False);
- Var
- O : TJSHTMLOptionElement;
- begin
- AssertTrue('Correct index',Idx<Select.childElementCount);
- O:=Select.children[Idx] as TJSHTMLOptionElement;
- AssertEquals('Text',aText,O.InnerText);
- if aValue='' then aValue:=aText;
- AssertEquals('Value',aValue,O.Value);
- AssertEquals('Selected',Selected,O.selected);
- end;
- procedure TTestSelectElement.TestPropsOnRender;
- begin
- My.Refresh;
- AssertTree('select/option');
- AssertEquals('Multi',False,Select.multiple);
- AssertEquals('SelectedIndex',0,Select.selectedIndex);
- AssertEquals('Amount of options',3,Length(Options));
- AssertEquals('Amount of option values',3,Select.childElementCount);
- AssertOption(0,'One','1',True);
- AssertOption(1,'Two','2');
- AssertOption(2,'Three','3');
- end;
- procedure TTestSelectElement.TestPropsAfterRender;
- Var
- L1,L2 : TStrings;
- begin
- TestPropsOnRender;
- My.Multiple:=True;
- L1:=My.Items;
- l2:=My.Values;
- L1.BeginUpdate;
- L2.BeginUpdate;
- L1.Clear;
- L1.Add('Alpha');
- L1.Add('Beta');
- L1.Add('Gamma');
- L2.Clear;
- L2.Add('a');
- L2.Add('b');
- L1.EndUpdate;
- L2.EndUpdate;
- My.SelectedIndex:=2;
- AssertEquals('Multi',True,Select.multiple);
- AssertEquals('SelectedIndex',2,Select.selectedIndex);
- AssertEquals('Amount of options',3,Length(Options));
- AssertEquals('Amount of option values',3,Select.childElementCount);
- AssertOption(0,'Alpha','a');
- AssertOption(1,'Beta','b');
- AssertOption(2,'Gamma','Gamma',True);
- end;
- procedure TTestSelectElement.TestMultiSelect;
- Var
- I : Integer;
- begin
- TestPropsOnRender;
- My.Multiple:=True;
- For I:=0 to My.Items.Count-1 do
- begin
- AssertEquals(IntToStr(I)+' selected',I=My.SelectedIndex,My.Selected[I]);
- AssertEquals(IntToStr(I)+' option selected',I=My.SelectedIndex,Options[i].Selected);
- end;
- My.Selected[2]:=True;
- AssertEquals('First selected index',0,My.SelectedIndex);
- AssertEquals('Additional selected',True,Options[2].Selected);
- AssertEquals('Additional option selected',True,My.Selected[2]);
- AssertEquals('SelectionCount',2,My.selectionCount);
- AssertEquals('SelectionValue[0]','1',My.selectionValue[0]);
- AssertEquals('SelectionItem[0]','One',My.SelectionItem[0]);
- AssertEquals('SelectionValue[1]','3',My.selectionValue[1]);
- AssertEquals('SelectionItem[1]','Three',My.selectionItem[1]);
- end;
- procedure TTestSelectElement.TestNoSelectedIndex;
- begin
- My.SelectedIndex:=-1;
- My.Refresh;
- AssertTree('select/option');
- AssertEquals('Multi',False,Select.multiple);
- AssertEquals('SelectedIndex',-1,Select.selectedIndex);
- AssertEquals('Amount of options',3,Length(Options));
- AssertEquals('Amount of option values',3,Select.childElementCount);
- AssertOption(0,'One','1');
- AssertOption(1,'Two','2');
- AssertOption(2,'Three','3');
- end;
- { TTestImageElement }
- function TTestImageElement.GetImg: TJSHTMLImageElement;
- begin
- Result:=TJSHTMLImageElement(My.Element);
- end;
- procedure TTestImageElement.Setup;
- begin
- inherited Setup;
- FMy:=TMyImageWidget.Create(Nil);
- FMy.ParentID:=SBaseWindowID;
- FMy.Src:='img.png';
- FMy.Width:=64;
- FMy.Height:=128;
- end;
- procedure TTestImageElement.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- function TTestImageElement.ThisURL: String;
- begin
- Result:=ExtractFilePath(Window.Location.href);
- end;
- procedure TTestImageElement.TestEmpty;
- begin
- AssertNotNull('have image',My);
- AssertNull('Not rendered',My.Element);
- end;
- procedure TTestImageElement.TestPropsOnRender;
- begin
- My.Refresh;
- AssertNotNull('have element',My.Element);
- AssertEquals('URL',ThisURL+'img.png',Image.src);
- AssertEquals('Width',64,Image.width);
- AssertEquals('Height',128,Image.Height);
- end;
- procedure TTestImageElement.TestPropsAfterRender;
- begin
- My.Refresh;
- My.Src:='img2.png';
- My.Width:=88;
- My.Height:=166;
- AssertEquals('URL',ThisURL+'img2.png',Image.src);
- AssertEquals('Width',88,Image.width);
- AssertEquals('Height',166,Image.Height);
- end;
- { TTestHiddenInputElement }
- function TTestHiddenInputElement.CreateInput: TCustomInputWidget;
- begin
- Result:=THiddenInputWidget.Create(Nil);
- end;
- function TTestHiddenInputElement.MyHidden: TMyHiddenInputWidget;
- begin
- Result:=My as TMyHiddenInputWidget;
- end;
- procedure TTestHiddenInputElement.TestPropsOnRender;
- begin
- My.Refresh;
- AssertBaseProps('','','');
- end;
- procedure TTestHiddenInputElement.TestPropsAfterRender;
- begin
- My.Refresh;
- My.ValueName:='a';
- My.Value:='b';
- AssertBaseProps('hidden','a','b');
- end;
- { TTestDateInputElement }
- function TTestDateInputElement.CreateInput: TCustomInputWidget;
- begin
- Result:=TMyDateInputWidget.Create(Nil);
- end;
- procedure TTestDateInputElement.CreateMy;
- begin
- inherited CreateMy;
- MyDate.Date:=Date;
- end;
- function TTestDateInputElement.MyDate: TMyDateInputWidget;
- begin
- Result:=My as TMyDateInputWidget;
- end;
- procedure TTestDateInputElement.TestPropsOnRender;
- begin
- My.Refresh;
- AssertBaseProps('','',FormatDateTime('yyyy-mm-dd',Date));
- end;
- procedure TTestDateInputElement.TestPropsAfterRender;
- begin
- My.Refresh;
- MyDate.Date:=Date-1;
- AssertBaseProps('','',FormatDateTime('yyyy-mm-dd',Date-1));
- end;
- { TTestFileInputElement }
- function TTestFileInputElement.CreateInput: TCustomInputWidget;
- begin
- Result:=TMyFileInputWidget.Create(Nil);
- end;
- procedure TTestFileInputElement.CreateMy;
- begin
- inherited CreateMy;
- My.Value:='';
- end;
- function TTestFileInputElement.MyFile: TMyFileInputWidget;
- begin
- Result:=My as TMyFileInputWidget;
- end;
- procedure TTestFileInputElement.TestPropsOnRender;
- begin
- My.Refresh;
- // We cannot use assertbaseprops
- AssertTree('input('+My.ElementID+')');
- AssertEquals('Type','file',InputElement._Type);
- AssertEquals('Value name','Test',InputElement.name);
- AssertEquals('Value','',InputElement.value);
- AssertEquals('Text (inner text)','',InputElement.innerText);
- end;
- procedure TTestFileInputElement.TestPropsAfterRender;
- begin
- My.Refresh;
- // We cannot use assertbaseprops
- AssertTree('input('+My.ElementID+')');
- AssertEquals('Type','file',InputElement._Type);
- AssertEquals('Value name','Test',InputElement.name);
- AssertEquals('Value','',InputElement.value);
- AssertEquals('Text (inner text)','',InputElement.innerText);
- end;
- { TTestRadioInputElement }
- function TTestRadioInputElement.CreateInput: TCustomInputWidget;
- begin
- Result:=TRadioInputWidget.Create(Nil);
- end;
- function TTestRadioInputElement.MyRadio: TRadioInputWidget;
- begin
- Result:=My as TRadioInputWidget;
- end;
- procedure TTestRadioInputElement.TestPropsOnRender;
- begin
- MyRadio.Checked:=true;
- My.Refresh;
- AssertBaseProps('','','');
- AssertEquals('Checked',true,InputElement.Checked);
- end;
- procedure TTestRadioInputElement.TestPropsAfterRender;
- begin
- My.Refresh;
- AssertEquals('Checked before',False,InputElement.Checked);
- MyRadio.Checked:=true;
- AssertBaseProps('','','');
- AssertEquals('Checked after',true,InputElement.Checked);
- end;
- { TTestCheckBoxInputElement }
- function TTestCheckBoxInputElement.CreateInput: TCustomInputWidget;
- begin
- Result:=TCheckBoxInputWidget.Create(Nil);
- end;
- function TTestCheckBoxInputElement.MyCheckBox: TCheckBoxInputWidget;
- begin
- Result:=My as TCheckBoxInputWidget;
- end;
- procedure TTestCheckBoxInputElement.TestPropsOnRender;
- begin
- MyCheckBox.Checked:=true;
- My.Refresh;
- AssertBaseProps('','','');
- AssertEquals('Checked',true,InputElement.Checked);
- end;
- procedure TTestCheckBoxInputElement.TestPropsAfterRender;
- begin
- My.Refresh;
- AssertEquals('Checked before',False,InputElement.Checked);
- MyCheckBox.Checked:=true;
- AssertBaseProps('','','');
- AssertEquals('Checked after',true,InputElement.Checked);
- end;
- { TTestTextAreaElement }
- function TTestTextAreaElement.GetArea: TJSHTMLTextAreaElement;
- begin
- Result:=FMy.TextArea
- end;
- procedure TTestTextAreaElement.Setup;
- begin
- inherited Setup;
- FMy:=TMyTextAreaWidget.Create(Nil);
- FMy.Lines.Add('a');
- FMy.Lines.Add('b');
- end;
- procedure TTestTextAreaElement.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- procedure TTestTextAreaElement.TestEmpty;
- begin
- AssertNotNull(My);
- end;
- procedure TTestTextAreaElement.TestPropsOnRender;
- begin
- My.ParentID:=BaseID;
- My.ValueName:='test';
- My.Columns:=25;
- My.Rows:=35;
- My.MaxLength:=500;
- My.Wrap:=tawHard;
- My.Required:=True;
- My.ReadOnly:=True;
- My.Refresh;
- AssertEquals('ValueName','test',area.Name);
- AssertEquals('Wrap','hard',area.Wrap);
- AssertEquals('Rows',35,area.Rows);
- AssertEquals('Cols',25,area.Cols);
- AssertEquals('MaxLength',500,area.MaxLength);
- AssertEquals('Text','a'+sLineBreak+'b'+sLineBreak,area.innerHtml);
- AssertEquals('Required',true,Area.Required);
- AssertEquals('ReadOnly',true,Area.ReadOnly);
- end;
- procedure TTestTextAreaElement.TestPropsAfterRender;
- begin
- My.ParentID:=BaseID;
- My.Refresh;
- My.ValueName:='test';
- My.Columns:=25;
- My.Rows:=35;
- My.MaxLength:=500;
- My.Required:=True;
- My.ReadOnly:=True;
- My.Wrap:=tawHard;
- With My.Lines do
- begin
- BeginUpdate;
- Clear;
- Add('d');
- Add('e');
- EndUpdate;
- end;
- AssertEquals('ValueName','test',area.Name);
- AssertEquals('Wrap','hard',area.Wrap);
- AssertEquals('Rows',35,area.Rows);
- AssertEquals('Cols',25,area.Cols);
- AssertEquals('MaxLength',500,area.MaxLength);
- AssertEquals('Text','d'+sLineBreak+'e'+sLineBreak,area.innerHTML);
- AssertEquals('Required',true,Area.Required);
- AssertEquals('ReadOnly',true,Area.ReadOnly);
- end;
- { TTestTextInputElement }
- procedure TTestTextInputElement.setup;
- begin
- inherited setup;
- FITT:=ittText;
- end;
- function TTestTextInputElement.CreateInput: TCustomInputWidget;
- begin
- Result:=TTextInputWidget.Create(Nil);
- TTextInputWidget(Result).TextType:=FITT;
- end;
- function TTestTextInputElement.MyText: TTextInputWidget;
- begin
- Result:=My as TTextInputWidget;
- end;
- procedure TTestTextInputElement.TestDefaultTextType;
- begin
- AssertTrue('Correct type',ittText=MyText.TextType);
- end;
- procedure TTestTextInputElement.TestRender;
- begin
- My.Refresh;
- AssertBaseProps('','','','');
- end;
- procedure TTestTextInputElement.TestChangeValue;
- begin
- My.Refresh;
- AssertBaseProps('','','','');
- My.Value:='soso';
- AssertEquals('Value propagates','soso',InputElement.value);
- end;
- procedure TTestTextInputElement.TestChangeName;
- begin
- My.Refresh;
- AssertBaseProps('','','','');
- My.ValueName:='soso';
- AssertEquals('ValueName propagates','soso',InputElement.name);
- end;
- procedure TTestTextInputElement.TestChangeTextType;
- begin
- My.Refresh;
- AssertBaseProps('','','','');
- MyText.TextType:=ittPassword;
- AssertEquals('TextType propagates to type','password',InputElement._type);
- end;
- procedure TTestTextInputElement.TestTypePassword;
- begin
- FItt:=ittPassword;
- CreateMy;
- My.Refresh;
- AssertBaseProps('password','','','');
- end;
- procedure TTestTextInputElement.TestTypeNumber;
- begin
- FItt:=ittNumber;
- CreateMy;
- My.Refresh;
- AssertBaseProps('number','','','');
- end;
- procedure TTestTextInputElement.TestAsNumber;
- begin
- TestTypeNumber;
- AssertBaseProps('number','','','');
- AssertEquals('Correct read',1,MyText.AsNumber);
- MyText.AsNumber:=123;
- AssertEquals('Correctly set','123',InputElement.Value);
- AssertEquals('Correctly set 2','123',Mytext.Value);
- end;
- procedure TTestTextInputElement.TestTypeEmail;
- begin
- FItt:=ittEmail;
- CreateMy;
- My.Refresh;
- AssertBaseProps('email','','','');
- end;
- procedure TTestTextInputElement.TestTypeSearch;
- begin
- FItt:=ittSearch;
- CreateMy;
- My.Refresh;
- AssertBaseProps('search','','','');
- end;
- procedure TTestTextInputElement.TestTypeTel;
- begin
- FItt:=ittTelephone;
- CreateMy;
- My.Refresh;
- AssertBaseProps('tel','','','');
- end;
- procedure TTestTextInputElement.TestTypeURL;
- begin
- FItt:=ittURL;
- CreateMy;
- My.Refresh;
- AssertBaseProps('url','','','');
- end;
- procedure TTestTextInputElement.TestTypeColor;
- begin
- FItt:=ittColor;
- CreateMy;
- My.Refresh;
- AssertBaseProps('color','','#000000','');
- end;
- { TBaseTestInputElement }
- function TBaseTestInputElement.GetInputElement: TJSHTMLInputElement;
- begin
- Result:= TInputHack(My).InputElement;
- AssertNotNull('Have input element',Result);
- end;
- procedure TBaseTestInputElement.CreateMy;
- begin
- FreeAndNil(FMy);
- FMy:=CreateInput;
- FMy.ParentID:=BaseID;
- FMy.ValueName:='Test';
- FMy.Value:='1';
- end;
- procedure TBaseTestInputElement.Setup;
- begin
- inherited Setup;
- CreateMy;
- end;
- procedure TBaseTestInputElement.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- procedure TBaseTestInputElement.AssertBaseProps(aType, aValueName, aValue : String; aText : String = '');
- Var
- El : TJSHTMLInputElement;
- begin
- if AType='' then
- aType:=My.InputType;
- if aValueName='' then
- aValueName:='Test'; // Same as in CreateMy
- if aValue='' then
- aValue:='1'; // Same as in CreateMy
- el:=InputElement;
- AssertTree('input('+el.ID+')');
- AssertEquals('Type',aType,el._Type);
- AssertEquals('Value name',aValueName,el.name);
- AssertEquals('Value',aValue,el.value);
- AssertEquals('Text (inner text)',aText,el.innerText);
- end;
- procedure TBaseTestInputElement.TestEmpty;
- begin
- AssertNotNull('Have element',My);
- end;
- procedure TBaseTestInputElement.TestRequiredOnRender;
- begin
- My.Required:=True;
- My.Refresh;
- AssertEquals('required',True,InputElement.required);
- end;
- procedure TBaseTestInputElement.TestReadOnlyOnRender;
- begin
- My.ReadOnly:=True;
- My.Refresh;
- AssertEquals('ReadOnly',True,InputElement.ReadOnly);
- end;
- procedure TBaseTestInputElement.TestRequiredAfterRender;
- begin
- My.Refresh;
- My.Required:=True;
- AssertEquals('required',True,InputElement.required);
- end;
- procedure TBaseTestInputElement.TestReadOnlyAfterRender;
- begin
- My.Refresh;
- My.ReadOnly:=True;
- AssertEquals('ReadOnly',True,InputElement.ReadOnly);
- end;
- { TMyWebPage }
- procedure TMyWebPage.SetParentId;
- begin
- ParentID:='A';
- end;
- procedure TMyWebPage.SetParent;
- begin
- Parent:=TViewPort.Create(Nil);
- end;
- procedure TMyWebPage.SetElementID;
- begin
- ElementID:=BaseID;
- end;
- { TTestPage }
- function TTestPage.CreateElement(aID: String): TJSHTMLElement;
- begin
- Result:=TJSHTMLElement(Document.CreateElement('div'));
- Result.ID:=aID;
- BaseWindow.AppendChild(Result);
- end;
- procedure TTestPage.Setup;
- begin
- inherited Setup;
- FMy:=TMyWebPage.Create(Nil);
- end;
- procedure TTestPage.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- procedure TTestPage.TestEmpty;
- begin
- AssertNotNull('Have element');
- end;
- procedure TTestPage.TestAsWindow;
- begin
- // Set element to base-window
- My.SetElementID;
- AssertSame('Correct',BaseWindow,My.Element);
- end;
- procedure TTestPage.TestNoParentOK;
- begin
- My.Refresh;
- AssertSame('Correct parent',ViewPort.Element,My.ParentElement);
- end;
- procedure TTestPage.TestDefaultTag;
- begin
- AssertEquals('Correct tag','div',My.HTMLTag);
- end;
- { TMyViewPort }
- procedure TMyViewPort.SetParentId;
- begin
- ParentID:='SomeThing';
- end;
- procedure TMyViewPort.SetParent;
- begin
- Parent:=Instance
- end;
- procedure TMyViewPort.SetElementID;
- begin
- ElementID:='Something';
- end;
- { TTestViewPort }
- procedure TTestViewPort.Setup;
- begin
- inherited Setup;
- FMy:=TMyViewPort.Create(Nil);
- end;
- procedure TTestViewPort.TearDown;
- begin
- FreeAndNil(FMy);
- inherited TearDown;
- end;
- procedure TTestViewPort.TestInstance;
- begin
- AssertNotNull('Have viewport',ViewPort);
- AssertSame('Have viewport',TViewPort.Instance,ViewPort);
- end;
- procedure TTestViewPort.TestHTMLTag;
- begin
- AssertEquals('Correct tag','body',ViewPort.HTMLTag);
- end;
- procedure TTestViewPort.TestElement;
- begin
- AssertSame('Correct Element',Document.Body,ViewPort.Element);
- end;
- procedure TTestViewPort.TestUnrender;
- begin
- AssertSame('Element retained',Document.Body,ViewPort.Element);
- end;
- procedure TTestViewPort.TestNoParent;
- begin
- AssertException('No parent can be set',EWidgets,@My.SetParent);
- end;
- procedure TTestViewPort.TestNoElementID;
- begin
- AssertException('No elementID can be set',EWidgets,@My.SetElementID);
- end;
- procedure TTestViewPort.TestNoParentID;
- begin
- AssertException('No ParentID can be set',EWidgets,@My.SetParentID);
- end;
- { TTestButtonWidget }
- procedure TTestButtonWidget.SetUp;
- begin
- inherited SetUp;
- FButton:=TButtonWidget.Create(Nil);
- end;
- procedure TTestButtonWidget.TearDown;
- begin
- FreeAndNil(FButton);
- inherited TearDown;
- end;
- procedure TTestButtonWidget.TestTextBeforeRender;
- Var
- El : TJSHTMLElement;
- begin
- Button.ParentID:=BaseID;
- Button.Text:='Click me';
- Button.Refresh;
- El:=AssertTree('button('+Button.ElementID+')');
- AssertEquals('Text set','Click me',el.innerText);
- end;
- procedure TTestButtonWidget.TestTextAfterRender;
- Var
- El : TJSHTMLElement;
- begin
- Button.ParentID:=BaseID;
- Button.Refresh;
- El:=AssertTree('button('+Button.ElementID+')');
- Button.Text:='Click me';
- AssertEquals('Text set','Click me',el.innerText);
- end;
- procedure TTestButtonWidget.TestTextElementID;
- Var
- El : TJSHTMLElement;
- begin
- el:=TJSHTMLElement(Document.createElement('button'));
- el.id:='b1';
- BaseWindow.appendChild(el);
- El:=AssertTree('button(b1)');
- Button.elementID:='b1';
- Button.Refresh;
- Button.Text:='Click me';
- AssertEquals('Text set','Click me',el.innerText);
- end;
- procedure TTestButtonWidget.TestClick;
- begin
- Button.ParentID:=BaseID;
- Button.Refresh;
- Button.OnClick:=@MyTestEventHandler;
- Button.Click;
- AssertEvent('click',Button);
- end;
- initialization
- RegisterTests([TTestViewPort,TTestButtonWidget,TTestPage,
- TTestTextInputElement,TTestTextAreaElement,
- TTestRadioInputElement,TTestCheckBoxInputElement,
- TTestDateInputElement,TTestFileInputElement,
- TTestHiddenInputElement, TTestImageElement,
- TTestImageElement,
- TTestLabelWidget,TTestTextWidget,TTestTextLinesWidget,
- TTestSelectElement,
- TTestTableWidget]);
- end.
|