/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . compose . foundation . text Ċ Ċ import Ġandroidx . compose . ui . Alignment Line Ċ import Ġandroidx . compose . ui . geometry . Offset Ċ import Ġandroidx . compose . ui . geometry . Rect Ċ import Ġandroidx . compose . ui . graphics . Canvas Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . layout . Layout Coordinates Ċ import Ġandroidx . compose . ui . text . Annotated String Ċ import Ġandroidx . compose . ui . text . Internal Text Api Ċ import Ġandroidx . compose . ui . text . Multi Paragraph Intr insics Ċ import Ġandroidx . compose . ui . text . Span Style Ċ import Ġandroidx . compose . ui . text . Text Delegate Ċ import Ġandroidx . compose . ui . text . Text Layout Result Ċ import Ġandroidx . compose . ui . text . Text Range Ċ import Ġandroidx . compose . ui . text . TextStyle Ċ import Ġandroidx . compose . ui . text . createText Layout Result Ċ import Ġandroidx . compose . ui . text . input . Commit Text Edit Op Ċ import Ġandroidx . compose . ui . text . input . Edit Operation Ċ import Ġandroidx . compose . ui . text . input . Edit Processor Ċ import Ġandroidx . compose . ui . text . input . Finish Comp osing Text Edit Op Ċ import Ġandroidx . compose . ui . text . input . I me Action Ċ import Ġandroidx . compose . ui . text . input . Keyboard Type Ċ import Ġandroidx . compose . ui . text . input . Offset Map Ċ import Ġandroidx . compose . ui . text . input . Set Selection Edit Op Ċ import Ġandroidx . compose . ui . text . input . TextField Value Ċ import Ġandroidx . compose . ui . text . input . TextInput Service Ċ import Ġandroidx . compose . ui . text . input . Trans formed Text Ċ import Ġandroidx . compose . ui . text . input . Visual Transformation Ċ import Ġandroidx . compose . ui . text . style . Text Decoration Ċ import Ġandroidx . compose . ui . unit . Constraints Ċ import Ġandroidx . compose . ui . unit . Density Ċ import Ġandroidx . compose . ui . unit . Int Size Ċ import Ġandroidx . compose . ui . unit . Layout Direction Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . any Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . argument Captor Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . eq Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . never Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . times Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġorg . junit . Assert . assertEquals Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . JUnit 4 Ċ import Ġorg . mockito . Argument Matchers . any Long Ċ Ċ @ Opt In ( Internal Text Api :: class ) Ċ @ RunWith ( JUnit 4 :: class ) Ċ class ĠTextField Delegate Test Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcanvas : ĠCanvas ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġm Delegate : ĠText Delegate ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġprocessor : ĠEdit Processor ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġon Value Change : Ġ( TextField Value ) Ġ-> ĠUnit ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġon Editor ActionPerformed : Ġ( Any ) Ġ-> ĠUnit ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtext Input Service : ĠText Input Service ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlayout Coordinates : ĠLayout Coordinates ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmulti Paragraph Intr insics : ĠMulti Paragraph Intr insics ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtext Layout Result : ĠText Layout Result ĊĊĠĠĠ Ġprivate Ġval Ġlayout Direction Ġ= ĠLayout Direction . L tr ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTest Ġimplementation Ġof Ġoffset Ġmap Ġwhich Ġdouble s Ġthe Ġoffset Ġin Ġtransformed Ġtext . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġskipping Offset Map Ġ= Ġobject Ġ: ĠOffset Map Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġoriginal To Trans formed ( offset : ĠInt ): ĠInt Ġ= Ġoffset Ġ* Ġ 2 ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransformed To Original ( offset : ĠInt ): ĠInt Ġ= Ġoffset Ġ/ Ġ 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Delegate Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġcanvas Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġprocessor Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġon Value Change Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġon Editor ActionPerformed Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġtext Input Service Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġlayout Coordinates Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġmulti Paragraph Intr insics Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġtext Layout Result Ġ= Ġmock () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ on _ edit _ command () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġops Ġ= ĠlistOf ( Commit Text Edit Op (" Hello , ĠWorld ", Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Editor State Ġ= ĠText FieldValue ( text Ġ= Ġ" Hello , ĠWorld ", Ġselection Ġ= ĠText Range ( 1 )) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( processor . on Edit Commands ( ops )). thenReturn ( dummy Editor State ) ĊĊĠĠĠĠĠĠĠ ĠTextField Delegate . on Edit Command ( ops , Ġprocessor , Ġon Value Change ) ĊĊĠĠĠĠĠĠĠ Ġverify ( on Value Change , Ġtimes ( 1 )). invoke ( eq ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġdummy Editor State . text , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġdummy Editor State . selection ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ on _ release () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠOffset ( 1 0 0 f , Ġ 2 0 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġdummy Editor State Ġ= ĠText FieldValue ( text Ġ= Ġ" Hello , ĠWorld ", Ġselection Ġ= ĠText Range ( 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĊĠĠĠĠĠĠĠ Ġwhenever ( text Layout Result . get Offset For Position ( position )). thenReturn ( offset ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcapt or Ġ= Ġargument Captor < List < Edit Operation >>() ĊĊĠĠĠĠĠĠĠ Ġwhenever ( processor . on Edit Commands ( capt or . capture ())). thenReturn ( dummy Editor State ) ĊĊĠĠĠĠĠĠĠ ĠTextField Delegate . on Release ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Layout Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOffset Map . identity Offset Map , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . all Values . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . first Value . size ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( capt or . first Value [ 0 ] Ġis ĠSet Selection Edit Op ) ĊĠĠĠĠĠĠĠ Ġverify ( on Value Change , Ġtimes ( 1 )). invoke ( eq ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġdummy Editor State . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġdummy Editor State . selection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). show Software Keyboard ( eq ( dummy Input Session Token )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest _ on _ release _ do _ not _ place _ cursor _ if _ focus _ is _ out () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠOffset ( 1 0 0 f , Ġ 2 0 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĊĠĠĠĠĠĠĠ Ġwhenever ( text Layout Result . get Offset For Position ( position )). thenReturn ( offset ) ĊĠĠĠĠĠĠĠ ĠTextField Delegate . on Release ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Layout Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOffset Map . identity Offset Map , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġverify ( on Value Change , Ġnever ()). invoke ( any ()) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). show Software Keyboard ( eq ( dummy Input Session Token )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġon _ focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdummy Editor State Ġ= ĠText FieldValue ( text Ġ= Ġ" Hello , ĠWorld ", Ġselection Ġ= ĠText Range ( 1 )) ĊĠĠĠĠĠĠĠ ĠTextField Delegate . on Focus ( textInput Service , Ġdummy Editor State , Ġprocessor , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKeyboard Type . Text , ĠI me Action . Unspecified , Ġon Value Change , Ġon Editor ActionPerformed ) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). start Input ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġdummy Editor State . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġdummy Editor State . selection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( Keyboard Type . Text ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( I me Action . Unspecified ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġany (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeq ( on Editor ActionPerformed ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġon _ blur () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcapt or Ġ= Ġargument Captor < List < Edit Operation >>() ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĊĠĠĠĠĠĠĠ Ġwhenever ( processor . on Edit Commands ( capt or . capture ())). thenReturn ( TextField Value ()) ĊĊĠĠĠĠĠĠĠ ĠTextField Delegate . on Blur ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . all Values . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . first Value . size ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( capt or . first Value [ 0 ] Ġis ĠFinish Comp osing Text Edit Op ) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). stop Input ( eq ( dummy Input Session Token )) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service , Ġnever ()). hide Software Keyboard ( any ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġon _ blur _ with _ h iding () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcapt or Ġ= Ġargument Captor < List < Edit Operation >>() ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĊĠĠĠĠĠĠĠ Ġwhenever ( processor . on Edit Commands ( capt or . capture ())). thenReturn ( TextField Value ()) ĊĊĠĠĠĠĠĠĠ ĠTextField Delegate . on Blur ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , Ġ// ĠThere Ġis Ġno Ġnext Ġfocused Ġclient . ĠHide Ġthe Ġkeyboard . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . all Values . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . first Value . size ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( capt or . first Value [ 0 ] Ġis ĠFinish Comp osing Text Edit Op ) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). stop Input ( eq ( dummy Input Session Token )) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). hide Software Keyboard ( eq ( dummy Input Session Token )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnotify _ focused _ rect () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdummy Rect Ġ= ĠRect ( 0 f , Ġ 1 f , Ġ 2 f , Ġ 3 f ) ĊĠĠĠĠĠĠĠ Ġwhenever ( text Layout Result . get BoundingBox ( any ())). thenReturn ( dummy Rect ) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Point Ġ= ĠOffset ( 5 f , Ġ 6 f ) ĊĠĠĠĠĠĠĠ Ġlayout Coordinates Ġ= ĠMock Coordinates ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Offset Ġ= Ġdummy Point ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Editor State Ġ= ĠText FieldValue ( text Ġ= Ġ" Hello , ĠWorld ", Ġselection Ġ= ĠText Range ( 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĠĠĠĠĠĠĠ ĠTextField Delegate . notify Focused Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Editor State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Layout Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Coordinates , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ/* Ġhas Focus Ġ*/, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOffset Map . identity Offset Map ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). notify Focused Rect ( eq ( dummy Input Session Token ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnotify _ focused _ rect _ without _ focus () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdummy Editor State Ġ= ĠText FieldValue ( text Ġ= Ġ" Hello , ĠWorld ", Ġselection Ġ= ĠText Range ( 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĠĠĠĠĠĠĠ ĠTextField Delegate . notify Focused Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Editor State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Layout Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Coordinates , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ/* Ġhas Focus Ġ*/, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOffset Map . identity Offset Map ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service , Ġnever ()). notify Focused Rect ( any (), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnotify _ rect _ tail () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdummy Rect Ġ= ĠRect ( 0 f , Ġ 1 f , Ġ 2 f , Ġ 3 f ) ĊĠĠĠĠĠĠĠ Ġwhenever ( text Layout Result . get BoundingBox ( any ())). thenReturn ( dummy Rect ) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Point Ġ= ĠOffset ( 5 f , Ġ 6 f ) ĊĠĠĠĠĠĠĠ Ġlayout Coordinates Ġ= ĠMock Coordinates ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Offset Ġ= Ġdummy Point ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Editor State Ġ= ĠText FieldValue ( text Ġ= Ġ" Hello , ĠWorld ", Ġselection Ġ= ĠText Range ( 1 2 )) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĠĠĠĠĠĠĠ ĠTextField Delegate . notify Focused Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Editor State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Layout Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Coordinates , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ/* Ġhas Focus Ġ*/, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOffset Map . identity Offset Map ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). notify Focused Rect ( eq ( dummy Input Session Token ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġlayout () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstraints Ġ= ĠConstraints ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠminWidth Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmaxWidth Ġ= Ġ 1 2 8 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠminHeight Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmaxHeight Ġ= Ġ 2 0 4 8 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdummy Text Ġ= ĠAnnot ated String ( text Ġ= Ġ" Hello , ĠWorld ") ĊĠĠĠĠĠĠĠ Ġtext Layout Result Ġ= Ġcreate Text Layout Result ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmulti Paragraph Ġ= Ġmock (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= ĠInt Size ( 1 0 2 4 , Ġ 5 1 2 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġwhenever ( m Delegate . text ). thenReturn ( dummy Text ) ĊĠĠĠĠĠĠĠ Ġwhenever ( m Delegate . style ). thenReturn ( TextStyle ()) ĊĠĠĠĠĠĠĠ Ġwhenever ( m Delegate . density ). thenReturn ( Density ( 1 . 0 f )) ĊĠĠĠĠĠĠĠ Ġwhenever ( m Delegate . resource Loader ). thenReturn ( mock ()) ĊĠĠĠĠĠĠĠ Ġwhenever ( m Delegate . layout ( Constraints ( any Long ()), Ġany (), Ġeq ( null ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. thenReturn ( text Layout Result ) ĊĊĠĠĠĠĠĠĠ Ġval Ġ( width , Ġheight , Ġlayout Result ) Ġ= ĠTextField Delegate . layout ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstraints , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Direction ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 2 4 f , Ġwidth . toFloat ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 1 2 f , Ġheight . toFloat ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( layout Result , Ġtext Layout Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck _ notify _ rect _ uses _ offset _ map () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdummy Rect Ġ= ĠRect ( 0 f , Ġ 1 f , Ġ 2 f , Ġ 3 f ) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Point Ġ= ĠOffset ( 5 f , Ġ 6 f ) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Editor State Ġ= ĠText FieldValue ( text Ġ= Ġ" Hello , ĠWorld ", Ġselection Ġ= ĠText Range ( 1 , Ġ 3 )) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĠĠĠĠĠĠĠ Ġwhenever ( text Layout Result . get BoundingBox ( any ())). thenReturn ( dummy Rect ) ĊĠĠĠĠĠĠĠ Ġlayout Coordinates Ġ= ĠMock Coordinates ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Offset Ġ= Ġdummy Point ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠTextField Delegate . notify Focused Rect ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Editor State , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Delegate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Layout Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlayout Coordinates , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ/* Ġhas Focus Ġ*/, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskipping Offset Map ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( text Layout Result ). get BoundingBox ( 6 ) ĊĠĠĠĠĠĠĠ Ġverify ( textInput Service ). notify Focused Rect ( eq ( dummy Input Session Token ), Ġany ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcheck _ on _ release _ uses _ offset _ map () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= ĠOffset ( 1 0 0 f , Ġ 2 0 0 f ) ĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠ Ġval Ġdummy Editor State Ġ= ĠText FieldValue ( text Ġ= Ġ" Hello , ĠWorld ", Ġselection Ġ= ĠText Range ( 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġdummy Input Session Token Ġ= Ġ 1 0 Ġ// ĠWe Ġare Ġnot Ġusing Ġthis Ġvalue Ġin Ġthis Ġtest . ĠJust Ġdummy . ĊĊĠĠĠĠĠĠĠ Ġwhenever ( text Layout Result . get Offset For Position ( position )). thenReturn ( offset ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcapt or Ġ= Ġargument Captor < List < Edit Operation >>() ĊĊĠĠĠĠĠĠĠ Ġwhenever ( processor . on Edit Commands ( capt or . capture ())). thenReturn ( dummy Editor State ) ĊĊĠĠĠĠĠĠĠ ĠTextField Delegate . on Release ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġposition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Layout Result , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskipping Offset Map , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Value Change , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Input Service , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdummy Input Session Token , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcursor Offset In Trans formed Text Ġ= Ġoffset Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . all Values . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcapt or . first Value . size ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( capt or . first Value [ 0 ] Ġis ĠSet Selection Edit Op ) ĊĠĠĠĠĠĠĠ Ġval Ġset Selection Edit Op Ġ= Ġcapt or . first Value [ 0 ] Ġas ĠSet Selection Edit Op ĊĠĠĠĠĠĠĠ ĠassertEquals ( cursor Offset In Trans formed Text , Ġset Selection Edit Op . start ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( cursor Offset In Trans formed Text , Ġset Selection Edit Op . end ) ĊĠĠĠĠĠĠĠ Ġverify ( on Value Change , Ġtimes ( 1 )). invoke ( eq ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText FieldValue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġdummy Editor State . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselection Ġ= Ġdummy Editor State . selection ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġuse _ identity _ mapping _ if _ none _ visual _ transformation () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( visual Text , Ġoffset Map ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVisual Transformation . None . filter ( Annotated String ( text Ġ= Ġ" Hello , ĠWorld ")) ĊĊĠĠĠĠĠĠĠ ĠassertEquals (" Hello , ĠWorld ", Ġvisual Text . text ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. visual Text . text . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIdentity Ġmapping Ġreturns Ġif Ġno Ġvisual Ġfilter Ġis Ġprovided . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( i , Ġoffset Map . original To Trans formed ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( i , Ġoffset Map . transformed To Original ( i )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġapply _ composition _ decoration () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġidentity Offset Map Ġ= Ġobject Ġ: ĠOffset Map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġoriginal To Trans formed ( offset : ĠInt ): ĠInt Ġ= Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransformed To Original ( offset : ĠInt ): ĠInt Ġ= Ġoffset ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠTrans formed Text ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed Text Ġ= ĠAnnot ated String . Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpush Style ( Span Style ( color Ġ= ĠColor . Red )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Hello , ĠWorld ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. to Annotated String (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Map Ġ= Ġidentity Offset Map ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠTextField Delegate . apply Composition Decoration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcomposition Range Ġ= ĠText Range ( 3 , Ġ 6 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransformed Ġ= Ġinput ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( result . transformed Text . text ). isEqualTo ( input . transformed Text . text ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . transformed Text . span Styles . size ). isEqualTo ( 2 ) ĊĠĠĠĠĠĠĠ ĠassertThat ( result . transformed Text . span Styles ). contains ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAnnot ated String . Range ( Span Style ( text Decoration Ġ= ĠText Decoration . Underline ), Ġ 3 , Ġ 6 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠMock Coordinates ( ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġsize : ĠInt Size Ġ= ĠInt Size . Zero , ĊĠĠĠĠĠĠĠ Ġval Ġlocal Offset : ĠOffset Ġ= ĠOffset . Zero , ĊĠĠĠĠĠĠĠ Ġval Ġglobal Offset : ĠOffset Ġ= ĠOffset . Zero , ĊĠĠĠĠĠĠĠ Ġval Ġroot Offset : ĠOffset Ġ= ĠOffset . Zero ĊĠĠĠ Ġ) Ġ: ĠLayout Coordinates Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġprovided Alignment Lines : ĠSet < Alignment Line > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġempty Set () ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġparent Coordinates : ĠLayout Coordinates ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Attached : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġglobal ToLocal ( global : ĠOffset ): ĠOffset Ġ= Ġlocal Offset ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlocal To Global ( local : ĠOffset ): ĠOffset Ġ= Ġglobal Offset ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlocal To Root ( local : ĠOffset ): ĠOffset Ġ= Ġroot Offset ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild ToLocal ( child : ĠLayout Coordinates , Ġchild Local : ĠOffset ): ĠOffset Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOffset . Zero ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġchild BoundingBox ( child : ĠLayout Coordinates ): ĠRect Ġ= ĠRect . Zero ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget ( line : ĠAlignment Line ): ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ} Ċ }