package Ġcom . red ap par at . layout verifier . tests Ċ Ċ import Ġandroid . view . View Ċ import Ġandroidx . recyclerview . widget . Linear LayoutManager Ċ import Ġandroidx . recyclerview . widget . RecyclerView Ċ import Ġandroidx . test . core . app . Application Provider . getApplicationContext Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġcom . red ap par at . layout verifier . Layout Verifier Ċ import Ġcom . red ap par at . layout verifier . Schemas Ċ import Ġcom . red ap par at . layout verifier . extractor . Default Features Ċ import Ġcom . red ap par at . layout verifier . serializer . Gson Serializer Ċ import Ġcom . red ap par at . layout verifier . tests . view . Simple Adapter Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġjava . io . File ĊĊ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠLayout Verifier Integration Tests Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 Ġ- ĠFlat Ġlayout Ġ- ĠSuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" flat _ layout ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 2 Ġ- ĠFlat Ġlayout Ġ- ĠFailure , Ġlayout Ġstructure Ġis Ġdifferent `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Exception ( AssertionError :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" flat _ layout ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 3 Ġ- ĠFlat Ġlayout Ġ- ĠFailure , Ġcontent Ġis Ġdifferent `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Exception ( AssertionError :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" flat _ layout ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 4 Ġ- ĠFlat Ġlayout Ġ- ĠSuccess , Ġdifferent Ġlayout Ġtype Ġbut Ġsame Ġoutput `() Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" flat _ layout ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 5 Ġ- ĠFlat Ġlayout Ġ- ĠFailure , Ġdifferent Ġlayout Ġwith Ġstrict Ġtype Ġmatching `() Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Exception ( AssertionError :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. match Type ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" flat _ layout ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 6 Ġ- ĠFlat Ġlayout Ġ- ĠSuccess , Ġonly Ġmatch Ġgiven Ġviews `() Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. views ( R . id . textView _ b ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" flat _ layout __ view _ subset ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 7 Ġ- ĠFlat Ġlayout Ġ- ĠSuccess , Ġignore Ġtext `() Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exclude Features ( set Of ( Default Features . TEXT )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" flat _ layout ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 8 Ġ- ĠFlat Ġlayout Ġ- ĠSmall Ġscreen `() Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. screen Size ( 1 0 0 , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" flat _ layout __ small _ screen ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 9 Ġ- ĠNested Ġlayout Ġ- ĠSuccess `() Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" nested _ layout ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 0 Ġ- ĠRe cycler Ġview Ġ- ĠSuccess , Ġcontent Ġfits Ġon Ġthe Ġscreen `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= ĠRecyclerView ( getApplicationContext ()) ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= ĠLinearLayoutManager ( getApplicationContext ()) ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= ĠSimple Adapter ( 3 ) ĊĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. view ( re cyclerView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" recycler _ view __ 3 _ elements ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 1 Ġ- ĠRe cycler Ġview Ġ- ĠSuccess , Ġcontent Ġdoes Ġnot Ġfit Ġon Ġthe Ġscreen `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġre cyclerView Ġ= ĠRecyclerView ( getApplicationContext ()) ĊĠĠĠĠĠĠĠ Ġre cyclerView . layout Manager Ġ= ĠLinearLayoutManager ( getApplicationContext ()) ĊĠĠĠĠĠĠĠ Ġre cyclerView . adapter Ġ= ĠSimple Adapter ( 5 0 ) ĊĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. view ( re cyclerView ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. screen Size ( 2 4 0 , Ġ 3 2 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" recycler _ view __ 5 0 _ elements ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 2 Ġ- ĠSchema Ġversion Ġis Ġthe Ġsame Ġ- ĠDo Ġnot Ġrewrite Ġsnapshot Ġfile `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCleanup ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot File Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Verifier . DEFAULT _ SNAPSHOT S _ PATH , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" schema _ version _ ide mpot ency . json " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġtest Ġonce ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" schema _ version _ ide mpot ency ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġfile Ġexists ĊĠĠĠĠĠĠĠ ĠassertTrue (" Snapshot Ġfile Ġexists ", Ġsnapshot File . exists ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRead Ġsnapshot Ġfor Ġthe Ġfirst Ġrun ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot On First Run Ġ= ĠGson Serializer (). deserialize From Stream ( snapshot File . inputStream ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġtest Ġsecond Ġtime Ġwhich Ġwill Ġresult Ġin Ġa Ġdifferent Ġsnapshot Ġfile ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 7 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. exclude Features ( set Of ( Default Features . TEXT )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" schema _ version _ ide mpot ency ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠRead Ġsnapshot Ġfor Ġthe Ġsecond Ġrun ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot On Second Run Ġ= ĠGson Serializer (). deserialize From Stream ( snapshot File . inputStream ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTwo Ġruns Ġshould Ġgiven Ġan Ġidentical Ġsnapshot Ġsince Ġthe Ġsecond Ġrun Ġwould Ġnot Ġoverwrite Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġfile ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot On First Run , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshot On Second Run ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 3 Ġ- ĠSchema Ġversion Ġchanged Ġ- ĠSuccess , Ġlayout Ġis Ġvalid Ġin Ġold Ġschema `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġtest Ġon Ġold Ġschema ĊĠĠĠĠĠĠĠ ĠLayout Verifier . Builder ( getApplicationContext ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. schema Version ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" schema _ update _ success ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġtest Ġon Ġnew Ġschema . ĠShould Ġsucceed . ĊĠĠĠĠĠĠĠ ĠLayout Verifier . Builder ( getApplicationContext ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. schema Version ( Schemas . latest Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" schema _ update _ success ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 3 Ġ- ĠSchema Ġversion Ġchanged Ġ- ĠFailure , Ġlayout Ġis Ġnot Ġvalid Ġin Ġold Ġschema `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġtest Ġon Ġold Ġschema ĊĠĠĠĠĠĠĠ ĠLayout Verifier . Builder ( getApplicationContext ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. schema Version ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" schema _ update _ failure ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġtest Ġon Ġnew Ġschema . ĠShould Ġfail . ĊĠĠĠĠĠĠĠ Ġassert Exception ( AssertionError :: class . java ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLayout Verifier . Builder ( getApplicationContext ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. schema Version ( Schemas . latest Version ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 0 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" schema _ update _ failure ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 4 Ġ- ĠSchema Ġv 3 Ġfeatures `() Ġ{ ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 1 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" schema _ v 3 _ features ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 5 Ġ- ĠR ussian Ġcharacters `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġinitial Ġsnapshot ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" r ussian _ characters ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠRun Ġvalidation Ġagainst Ġthe Ġsaved Ġsnapshot ĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. layout ( R . layout . case _ 0 1 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" r ussian _ characters ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Case Ġ 1 6 Ġ- ĠGenerated Ġview Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Ġ= ĠView ( getApplicationContext ()) ĊĊĠĠĠĠĠĠĠ Ġview . id Ġ= ĠView . generate View Id () ĊĊĠĠĠĠĠĠĠ Ġdefault Layout Verifier () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. view ( view ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. match (" generated _ view _ id ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun Ġdelete Temporary Snapshot Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Names Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" schema _ version _ ide mpot ency ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" schema _ update _ success ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" schema _ update _ failure ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" r ussian _ characters " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtest Names ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠFile ( Layout Verifier . DEFAULT _ SNAPSHOT S _ PATH , Ġ"$ it . json ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . delete ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdefault Layout Verifier () Ġ= ĠLayout Verifier . Builder ( getApplicationContext ()) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġprivate Ġfun Ġassert Exception ( type : ĠClass <* >, Ġoperation : Ġ() Ġ-> ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoperation () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Expected Ġexception Ġof Ġtype Ġ$ type . ĠNo Ġexception Ġreceived .") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! type . isAssignableFrom ( e . java Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfail (" Expected Ġexception Ġof Ġtype Ġ$ type . ĠReceived : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }