/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 8 Ġ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 . build . gradle . internal . tasks Ċ Ċ import Ġandroid . databinding . tool . Data Binding Builder . BINDING _ CLASS _ LIST _ SUFFIX Ċ import Ġandroid . databinding . tool . Data Binding Builder . INCREMENT AL _ BINDING _ CLASSES _ LIST _ DIR Ċ import Ġandroid . databinding . tool . Data Binding Builder . INCREMENT AL _ BIN _ A AR _ DIR Ċ import Ġandroid . databinding . tool . util . File Util Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake Gradle Property Ċ import Ġcom . android . build . gradle . internal . fixtures . Fake No Op Analytics Service Ċ import Ġcom . android . build . gradle . internal . profile . Analytics Service Ċ import Ġcom . android . build . gradle . internal . tasks . databinding . Data Binding Merge Base Class Log Delegate Ċ import Ġcom . android . build . gradle . internal . tasks . databinding . Data Binding Merge Base Class Log Runnable Ċ import Ġcom . android . ide . common . resources . File Status Ċ import Ġcom . google . common . collect . ImmutableList Ċ import Ġcom . google . common . truth . Truth . assertThat Ċ import Ġorg . apache . commons . io . FileUtils Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . file . Directory Ċ import Ġorg . gradle . api . file . Directory Property Ċ import Ġorg . gradle . api . file . Regular File Property Ċ import Ġorg . gradle . api . provider . Property Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . test fixtures . Project Builder Ċ import Ġorg . gradle . workers . Worker Executor Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġorg . mockito . Mock Ċ import Ġorg . mockito . Mockito Annotations Ċ import Ġjava . io . File Ċ Ċ private Ġfun ĠgetFile In Data Binding Folder ( directory : ĠString , Ġinput Dir : ĠFile , Ġfilename : ĠString ): ĠFile Ġ{ ĊĠĠĠ Ġval Ġdata Binding Folder Ġ= ĠFile ( input Dir , Ġdirectory ) ĊĠĠĠ Ġreturn ĠFile ( data Binding Folder , Ġfilename ) Ċ } Ċ Ċ class ĠData Binding Merge Base Class Log Test Ġ{ ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġval Ġtemporary Folder Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġexpected Out Folder : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoutput Dir : ĠProvider < Directory > ĊĠĠĠ Ġ@ Mock Ġprivate Ġlateinit Ġvar Ġtask : ĠAndroid Variant Task ĊĠĠĠ Ġ@ Mock Ġprivate Ġlateinit Ġvar Ġexecutor : ĠWorker Executor ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġproject : ĠProject ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠMockito Annotations . init Mocks ( this ) ĊĠĠĠĠĠĠĠ Ġproject Ġ= ĠProject Builder . builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Project Dir ( temporary Folder . new Folder ()). build () ĊĠĠĠĠĠĠĠ Ġexpected Out Folder Ġ= Ġtemporary Folder . new Folder () ĊĠĠĠĠĠĠĠ Ġoutput Dir Ġ= Ġproject . objects . directory Property (). also Ġ{ Ġit . set ( expected Out Folder ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġnon Incremental From Folder () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass List 1 Ġ= Ġ" class _ list _ 1 $ BINDING _ CLASS _ LIST _ SUFFIX " ĊĠĠĠĠĠĠĠ Ġval Ġclass List 2 Ġ= Ġ" class _ list _ 2 $ BINDING _ CLASS _ LIST _ SUFFIX " ĊĊĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= Ġcreate Folder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" blah ", ĊĠĠĠĠĠĠĠĠĠĠĠ ĠImmutableList . of ( classList 1 , Ġclass List 2 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġget Delegate ( folder ) ĊĠĠĠĠĠĠĠ Ġdelegate . do Full Run ( executor ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( collect Outputs ()). contains Exactly ( classList 1 , Ġclass List 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġincremental Folder With Changes () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass List 1 Ġ= Ġ" class _ list _ 1 $ BINDING _ CLASS _ LIST _ SUFFIX " ĊĠĠĠĠĠĠĠ Ġval Ġclass List 2 Ġ= Ġ" class _ list _ 2 $ BINDING _ CLASS _ LIST _ SUFFIX " ĊĠĠĠĠĠĠĠ Ġval Ġclass List 3 Ġ= Ġ" class _ list _ 3 $ BINDING _ CLASS _ LIST _ SUFFIX " ĊĠĠĠĠĠĠĠ Ġval Ġclass List 4 Ġ= Ġ" class _ list _ 4 $ BINDING _ CLASS _ LIST _ SUFFIX " ĊĠĠĠĠĠĠĠ Ġval Ġclass List 5 Ġ= Ġ" class _ list _ 5 $ BINDING _ CLASS _ LIST _ SUFFIX " ĊĊĠĠĠĠĠĠĠ Ġval Ġclass List Input Dir Ġ= Ġcreate Folder (" blah ", ĠImmutableList . of ( classList 1 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġget Delegate ( classList Input Dir ) ĊĠĠĠĠĠĠĠ Ġdelegate . do Full Run ( executor ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġrun Ġanother Ġinvocation Ġw / Ġa Ġnew Ġfile Ġin Ġthat Ġfolder ĊĠĠĠĠĠĠĠ Ġval Ġun wanted Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate In Folder ( INCREMENT AL _ BIN _ A AR _ DIR , Ġclass List Input Dir , Ġ" un necessary . tada ") ĊĠĠĠĠĠĠĠ Ġval Ġwanted Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate In Folder ( INCREMENT AL _ BINDING _ CLASSES _ LIST _ DIR , Ġclass List Input Dir , Ġclass List 2 ) ĊĊĠĠĠĠĠĠĠ Ġdelegate . do Incremental Run ( executor , Ġmap Of ( un wanted Ġto ĠFile Status . NEW , Ġwanted Ġto ĠFile Status . NEW )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( collect Outputs ()). contains Exactly ( classList 1 , Ġclass List 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġchange Ġfile Ġcontents . Ġliter ally ĊĠĠĠĠĠĠĠ Ġval Ġclass List 1 Updated Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile In Data Binding Folder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIN CRE MENT AL _ BINDING _ CLASSES _ LIST _ DIR , Ġclass List Input Dir , Ġclass List 1 ) ĊĠĠĠĠĠĠĠ ĠFileUtils . writeString ToFile ( classList 1 Updated , Ġ" updated - class - list ") ĊĊĠĠĠĠĠĠĠ Ġdelegate . do Incremental Run ( executor , Ġmap Of ( classList 1 Updated Ġto ĠFile Status . CHANGED )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( collect Outputs ()). contains Exactly ( classList 1 , Ġclass List 2 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclass List Out File Ġ= Ġfind OutputFile ( classList 1 Updated . name ) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( FileUtils . readFile ToString ( classList Out File )). isEqualTo (" updated - class - list ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġdelete Ġone Ġfile ĊĠĠĠĠĠĠĠ Ġdelegate . do Incremental Run ( executor , Ġmap Of ( classList 1 Updated Ġto ĠFile Status . RE MOVED )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( collect Outputs ()). contains Exactly ( classList 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġintroduce Ġanother Ġfolder ĊĠĠĠĠĠĠĠ Ġval Ġclass List Input Dir 2 Ġ= Ġcreate Folder (" foobar ", ĠImmutableList . of (" d . qq ")) ĊĠĠĠĠĠĠĠ Ġval Ġclass List Input 2 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate In Folder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIN CRE MENT AL _ BINDING _ CLASSES _ LIST _ DIR , Ġclass List Input Dir 2 , Ġclass List 3 ) ĊĊĠĠĠĠĠĠĠ Ġdelegate . do Incremental Run ( executor , Ġmap Of ( classList Input 2 Ġto ĠFile Status . NEW )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( collect Outputs ()). contains Exactly ( classList 2 , Ġclass List 3 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġmore Ġnew Ġinput Ġin Ġboth ĊĠĠĠĠĠĠĠ Ġval Ġnew In Input 3 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate In Folder ( INCREMENT AL _ BINDING _ CLASSES _ LIST _ DIR , Ġclass List Input Dir , Ġclass List 4 ) ĊĠĠĠĠĠĠĠ Ġval Ġnew In Input 4 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate In Folder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIN CRE MENT AL _ BINDING _ CLASSES _ LIST _ DIR , Ġclass List Input Dir 2 , Ġclass List 5 ) ĊĊĠĠĠĠĠĠĠ Ġdelegate . do Incremental Run ( executor , Ġmap Of ( new In Input 3 Ġto ĠFile Status . NEW , Ġnew In Input 4 Ġto ĠFile Status . NEW )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( collect Outputs ()). contains Exactly ( classList 2 , Ġclass List 3 , Ġclass List 4 , Ġclass List 5 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Delegate ( folder : ĠFile ) Ġ= Ġobject Ġ: ĠData Binding Merge Base Class Log Delegate ( task , Ġproject . objects . file Collection (), Ġproject . objects . file Collection (). also Ġ{ Ġit . set From ( folder )}, Ġoutput Dir ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsubmit ( workers : ĠWorker Executor , Ġfile : ĠFile , Ġstatus : ĠFile Status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠData Binding Merge Base Class Log Runnable () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Parameters (): ĠParams Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠParams () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġfile : ĠRegular File Property ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġproject . objects . file Property (). file Value ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġout Folder : ĠDirectory Property ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġproject . objects . directory Property (). also Ġ{ Ġit . set ( output Dir ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġstatus : ĠProperty < File Status > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġproject . objects . property ( File Status :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . set ( status ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval ĠprojectName : ĠProperty < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġproject . objects . property ( String :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . set (" projectName ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtask Owner : ĠProperty < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġproject . objects . property ( String :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . set (" task Owner ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġworker Key : ĠProperty < String > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġproject . objects . property ( String :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . set (" worker Key ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġanalytics Service : ĠProperty < Analytics Service > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠFake Gradle Property ( Fake No Op Analytics Service ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. execute () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Outputs (): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile Util . list And Sort Files ( expected Out Folder ). map ( File :: getName ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind OutputFile ( name : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFile Util . list And Sort Files ( expected Out Folder ). first Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Folder ( fileName : ĠString , Ġfiles : ĠList < String >): File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= Ġtemporary Folder . new Folder (" class list -$ fileName ") ĊĠĠĠĠĠĠĠ Ġfiles . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFileUtils . touch ( getFile In Data Binding Folder ( INCREMENT AL _ BINDING _ CLASSES _ LIST _ DIR , Ġfolder , Ġit )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfolder ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate In Folder ( folder Name : ĠString , Ġinput Dir : ĠFile , Ġfilename : ĠString ) Ġ: ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠgetFile In Data Binding Folder ( folder Name , Ġinput Dir , Ġfilename ) ĊĠĠĠĠĠĠĠ ĠFileUtils . touch ( file ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} Ċ }