/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 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 Ġcom . android . tools . idea . lang . databinding . reference Ċ Ċ import Ġcom . android . tools . idea . databinding . Data Binding Mode Ċ import Ġcom . android . tools . idea . lang . databinding . Lang Data Binding TestData . PROJECT _ WITH _ DATA _ BINDING _ ANDROID _ X Ċ import Ġcom . android . tools . idea . lang . databinding . Lang Data Binding TestData . PROJECT _ WITH _ DATA _ BINDING _ SUPPORT Ċ import Ġcom . android . tools . idea . lang . databinding . get TestData Path Ċ import Ġcom . android . tools . idea . testing . Android Gradle Project Rule Ċ import Ġcom . android . tools . idea . testing . Android Project Rule Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġcom . intellij . psi . Psi Method Ċ import Ġcom . intellij . psi . Psi Parameter Ċ import Ġcom . intellij . psi . impl . source . resolve . reference . impl . Psi Multi Reference Ċ import Ġcom . intellij . test Framework . Ed t Rule Ċ import Ġcom . intellij . test Framework . Runs In Ed t Ċ import Ġcom . intellij . test Framework . fixtures . Java Code Insight TestFixture Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Ass ume . assume True Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . Parameterized Ċ Ċ /** Ċ Ġ* ĠTests Ġfor Ġdata Ġbinding Ġelements Ġthat Ġhave Ġreferences Ġoutside Ġthe Ġmodule . Ċ Ġ*/ Ċ @ Runs In Ed t Ċ @ RunWith ( Parameterized :: class ) Ċ class ĠData Binding Expr Reference Contributor Gradle Test ( private Ġval Ġmode : ĠData Binding Mode ) Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Parameterized . Parameters ( name Ġ= Ġ"{ 0 }") ĊĠĠĠ Ġfun Ġmodes () Ġ= ĠlistOf ( Data Binding Mode . SUPPORT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Binding Mode . AND RO IDX ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġproject Rule Ġ= ĠAndroid Gradle Project Rule () ĊĊĠ Ġ@ get : Rule ĊĠ Ġval Ġrule Chain Ġ= Ġorg . junit . rules . Rule Chain . outer Rule ( project Rule ). around ( Ed t Rule ()) !! ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠEx pose Ġthe Ġunderlying Ġproject Ġrule Ġfixture Ġdirectly . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠWe Ġknow Ġthat Ġthe Ġunderlying Ġfixture Ġis Ġa Ġ[ Java Code Insight TestFixture ] Ġbecause Ġour ĊĠĠ Ġ* Ġ[ Android Project Rule ] Ġis Ġinitialized Ġto Ġuse Ġthe Ġdisk . ĊĠĠ Ġ* ĊĠĠ Ġ* ĠIn Ġsome Ġcases , Ġusing Ġthe Ġspecific Ġsubclass Ġprovides Ġus Ġwith Ġadditional Ġmethods Ġwe Ġcan ĊĠĠ Ġ* Ġuse Ġto Ġinspect Ġthe Ġstate Ġof Ġour Ġparsed Ġfiles . ĠIn Ġother Ġcases , Ġit 's Ġjust Ġfewer Ġcharacters ĊĠĠ Ġ* Ġto Ġtype . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġfixture : ĠJava Code Insight TestFixture ĊĠĠĠ Ġget () Ġ= Ġproject Rule . fixture Ġas ĠJava Code Insight TestFixture ĊĊĠ Ġ@ Before ĊĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠ Ġfixture . testData Path Ġ= Ġget TestData Path () ĊĠĠĠ Ġproject Rule . load ( when Ġ( mode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠData Binding Mode . SUPPORT Ġ-> ĠPROJECT _ WITH _ DATA _ BINDING _ SUPPORT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPROJECT _ WITH _ DATA _ BINDING _ ANDROID _ X ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmove Caret ToString ( substring : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġeditor Ġ= Ġfixture . editor ĊĠĠĠ Ġval Ġtext Ġ= Ġeditor . document . text ĊĠĠĠ Ġval Ġoffset Ġ= Ġtext . indexOf ( substring ) ĊĠĠĠ ĠAssert . assertTrue ( offset Ġ> Ġ 0 ) ĊĠĠĠ Ġfixture . editor . caret Model . moveTo Offset ( offset ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdb References LiveData () Ġ{ ĊĠĠĠ Ġval Ġlayout File Ġ= Ġproject Rule . project . base Dir . find File By RelativePath (" app / src / main / res / layout / activity _ main . xml ") !! ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġmove Caret ToString (" get LiveData String ") ĊĠĠĠ Ġ// ĠCall Ġconfigure From Existing Virtual File Ġagain Ġto Ġset Ġfixture . file Ġto ĠDb File Ġat Ġthe Ġcaret Ġposition . ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġval Ġjava Str Value Ġ= Ġfixture . find Class (" com . android . example . app with databinding . Sample Vo "). find Methods ByName (" get LiveData String ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse )[ 0 ]. source Element !! ĊĠĠĠ Ġval Ġxml Str Value Ġ= Ġfixture . getReference At Caret Position () !! ĊĠĠĠ Ġ// ĠIf Ġboth Ġof Ġthese Ġare Ġtrue , Ġit Ġmeans ĠXML Ġcan Ġreach ĠJava Ġand ĠJava Ġcan Ġreach ĠXML ĊĠĠĠ ĠassertThat ( xml Str Value . is Reference To ( java Str Value )). isTrue () ĊĠĠĠ ĠassertThat ( xml Str Value . resolve ()). isEqualTo ( java Str Value ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdb References State Flow () Ġ{ ĊĠĠĠ Ġassume True (" State Flow Ġis Ġonly Ġavailable Ġin ĠAndroid X Ġprojects ", Ġmode Ġ== ĠData Binding Mode . AND RO IDX ) ĊĊĠĠĠ Ġval Ġlayout File Ġ= Ġproject Rule . project . base Dir . find File By RelativePath (" app / src / main / res / layout / activity _ main . xml ") !! ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġmove Caret ToString (" getState Flow String ") ĊĠĠĠ Ġ// ĠCall Ġconfigure From Existing Virtual File Ġagain Ġto Ġset Ġfixture . file Ġto ĠDb File Ġat Ġthe Ġcaret Ġposition . ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġval Ġjava Str Value Ġ= Ġfixture . find Class (" com . android . example . app with databinding . Sample Vo "). find Methods ByName (" getState Flow String ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse )[ 0 ]. source Element !! ĊĠĠĠ Ġval Ġxml Str Value Ġ= Ġfixture . getReference At Caret Position () !! ĊĠĠĠ Ġ// ĠIf Ġboth Ġof Ġthese Ġare Ġtrue , Ġit Ġmeans ĠXML Ġcan Ġreach ĠJava Ġand ĠJava Ġcan Ġreach ĠXML ĊĠĠĠ ĠassertThat ( xml Str Value . is Reference To ( java Str Value )). isTrue () ĊĠĠĠ ĠassertThat ( xml Str Value . resolve ()). isEqualTo ( java Str Value ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdb References Observable Fields () Ġ{ ĊĠĠĠ Ġval Ġlayout File Ġ= Ġproject Rule . project . base Dir . find File By RelativePath (" app / src / main / res / layout / activity _ main . xml ") !! ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġmove Caret ToString (" get Observable Field String ") ĊĠĠĠ Ġ// ĠCall Ġconfigure From Existing Virtual File Ġagain Ġto Ġset Ġfixture . file Ġto ĠDb File Ġat Ġthe Ġcaret Ġposition . ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĠĠĠ Ġval Ġjava Str Value Ġ= Ġfixture . find Class (" com . android . example . app with databinding . Sample Vo "). find Methods ByName (" get Observable Field String ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse )[ 0 ]. source Element !! ĊĠĠĠ Ġval Ġxml Str Value Ġ= Ġfixture . getReference At Caret Position () !! ĊĠĠĠ Ġ// ĠIf Ġboth Ġof Ġthese Ġare Ġtrue , Ġit Ġmeans ĠXML Ġcan Ġreach ĠJava Ġand ĠJava Ġcan Ġreach ĠXML ĊĠĠĠ ĠassertThat ( xml Str Value . is Reference To ( java Str Value )). isTrue () ĊĠĠĠ ĠassertThat ( xml Str Value . resolve ()). isEqualTo ( java Str Value ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdb References Binding Methods () Ġ{ ĊĠĠĠ Ġval Ġlayout File Ġ= Ġproject Rule . project . base Dir . find File By RelativePath (" app / src / main / res / layout / activity _ main . xml ") !! ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġ// ĠMove Ġto Ġandroid : onClick =" @{ v | iew Ġ-> Ġvo . save View ( view )} "/> ĊĠĠĠ Ġmove Caret ToString (" iew Ġ-> Ġvo . save ") ĊĠĠĠ Ġ// ĠCall Ġconfigure From Existing Virtual File Ġagain Ġto Ġset Ġfixture . file Ġto ĠDb File Ġat Ġthe Ġcaret Ġposition . ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĠĠĠ Ġval Ġparameter Reference Ġ= Ġ( fixture . getReference At Caret Position () Ġas ĠPsi Multi Reference ). references . first Ġ{ Ġit . resolve () Ġis ĠPsi Parameter Ġ} ĊĊĠĠĠ Ġval Ġpsi Method Ġ= Ġfixture . find Class (" android . view . View . OnClickListener "). find Methods ByName (" onClick ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse )[ 0 ]. source Element !! Ġas ĠPsi Method ĊĠĠĠ Ġ// ĠIf Ġboth Ġof Ġthese Ġare Ġtrue , Ġit Ġmeans ĠXML Ġcan Ġreach ĠJava Ġand ĠJava Ġcan Ġreach ĠXML ĊĠĠĠ ĠassertThat ( parameter Reference . is Reference To ( psi Method . parameter List . parameters [ 0 ])) ĊĠĠĠ ĠassertThat ( parameter Reference . resolve ()). isEqualTo ( psi Method . parameter List . parameters [ 0 ]) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdb References Binding Adapters () Ġ{ ĊĠĠĠ Ġval Ġlayout File Ġ= Ġproject Rule . project . base Dir . find File By RelativePath (" app / src / main / res / layout / activity _ main . xml ") !! ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġ// ĠMove Ġto Ġapp : onClick 2 ==" @{ v | iew 2 Ġ-> Ġvo . save View ( view 2 )} "/> ĊĠĠĠ Ġmove Caret ToString (" iew 2 Ġ-> Ġvo . save ") ĊĠĠĠ Ġ// ĠCall Ġconfigure From Existing Virtual File Ġagain Ġto Ġset Ġfixture . file Ġto ĠDb File Ġat Ġthe Ġcaret Ġposition . ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĠĠĠ Ġval Ġparameter Reference Ġ= Ġ( fixture . getReference At Caret Position () Ġas ĠPsi Multi Reference ). references . first Ġ{ Ġit . resolve () Ġis ĠPsi Parameter Ġ} ĊĊĠĠĠ Ġval Ġpsi Method Ġ= Ġfixture . find Class (" android . view . View . OnClickListener "). find Methods ByName (" onClick ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse )[ 0 ]. source Element !! Ġas ĠPsi Method ĊĠĠĠ Ġ// ĠIf Ġboth Ġof Ġthese Ġare Ġtrue , Ġit Ġmeans ĠXML Ġcan Ġreach ĠJava Ġand ĠJava Ġcan Ġreach ĠXML ĊĠĠĠ ĠassertThat ( parameter Reference . is Reference To ( psi Method . parameter List . parameters [ 0 ])) ĊĠĠĠ ĠassertThat ( parameter Reference . resolve ()). isEqualTo ( psi Method . parameter List . parameters [ 0 ]) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdb Attribute Without Prefix References Binding Adapters () Ġ{ ĊĠĠĠ Ġval Ġlayout File Ġ= Ġproject Rule . project . base Dir . find File By RelativePath (" app / src / main / res / layout / activity _ main . xml ") !! ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġ// ĠMove Ġto ĠonClick 3 =" @{ v | iew 3 Ġ-> Ġvo . save View ( view 3 )} "/> ĊĠĠĠ Ġmove Caret ToString (" iew 3 Ġ-> Ġvo . save ") ĊĠĠĠ Ġ// ĠCall Ġconfigure From Existing Virtual File Ġagain Ġto Ġset Ġfixture . file Ġto ĠDb File Ġat Ġthe Ġcaret Ġposition . ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĠĠĠ Ġval Ġparameter Reference Ġ= Ġ( fixture . getReference At Caret Position () Ġas ĠPsi Multi Reference ). references . first Ġ{ Ġit . resolve () Ġis ĠPsi Parameter Ġ} ĊĊĠĠĠ Ġval Ġpsi Method Ġ= Ġfixture . find Class (" android . view . View . OnClickListener "). find Methods ByName (" onClick ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse )[ 0 ]. source Element !! Ġas ĠPsi Method ĊĠĠĠ Ġ// ĠIf Ġboth Ġof Ġthese Ġare Ġtrue , Ġit Ġmeans ĠXML Ġcan Ġreach ĠJava Ġand ĠJava Ġcan Ġreach ĠXML ĊĠĠĠ ĠassertThat ( parameter Reference . is Reference To ( psi Method . parameter List . parameters [ 0 ])) ĊĠĠĠ ĠassertThat ( parameter Reference . resolve ()). isEqualTo ( psi Method . parameter List . parameters [ 0 ]) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġdb Attribute References Binding Adapter Method () Ġ{ ĊĠĠĠ Ġval Ġlayout File Ġ= Ġproject Rule . project . base Dir . find File By RelativePath (" app / src / main / res / layout / activity _ main . xml ") !! ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĊĠĠĠ Ġ// ĠMove Ġto ĠonClick 3 =" @{ v | iew 3 Ġ-> Ġvo . save View ( view 3 )} "/> ĊĠĠĠ Ġmove Caret ToString (" Click 3 ") ĊĠĠĠ Ġ// ĠCall Ġconfigure From Existing Virtual File Ġagain Ġto Ġset Ġfixture . file Ġto ĠDb File Ġat Ġthe Ġcaret Ġposition . ĊĠĠĠ Ġfixture . configure From Existing Virtual File ( layout File ) ĊĠĠĠ Ġval Ġparameter Reference Ġ= Ġ( fixture . getReference At Caret Position () Ġas ĠPsi Multi Reference ). references . first Ġ{ Ġit . resolve () Ġis ĠPsi Method Ġ} ĊĊĠĠĠ Ġval Ġpsi Method Ġ= Ġfixture . find Class (" com . android . example . app with databinding . My Adapter ") ĊĠĠĠĠĠ Ġ. find Methods ByName (" bind OnClick 3 ", Ġfalse )[ 0 ]. source Element !! Ġas ĠPsi Method ĊĠĠĠ Ġ// ĠIf Ġboth Ġof Ġthese Ġare Ġtrue , Ġit Ġmeans ĠXML Ġcan Ġreach ĠJava Ġand ĠJava Ġcan Ġreach ĠXML ĊĠĠĠ ĠassertThat ( parameter Reference . is Reference To ( psi Method )) ĊĠĠĠ ĠassertThat ( parameter Reference . resolve ()). isEqualTo ( psi Method ) ĊĠ Ġ} Ċ }