package Ġrac ra . compose . smooth _ corner _ rect _ library Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroidx . compose . ui . graphics . as Android Bitmap Ċ import Ġandroidx . compose . ui . test . Semantics Node Interaction Ċ import Ġandroidx . compose . ui . test . capture To Image Ċ import Ġandroidx . test . platform . app . Instrumentation Registry Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . lang . AssertionError Ċ Ċ /** Ċ Ġ* ĠTakes Ġa Ġscreenshot Ġof Ġthe Ġgiven Ġnode Ġand Ġcomp ares Ġthe Ġresulting Ġimage Ġto Ġthe Ġexpected Ġscreenshot Ċ Ġ* Ġthrowing Ġan Ġerror Ġif Ġthey Ġaren 't Ġidentical . Ċ Ġ* Ċ Ġ* ĠExpected Ġimages Ġare Ġexpected Ġto Ġbe Ġin Ġandroid Test / assets . Ċ Ġ* Ċ Ġ* ĠScreenshots Ġtaken Ġwill Ġbe Ġsaved Ġin Ġ/ data / data /{ package }/ files Ġon Ġdevice . Ċ Ġ* Ċ Ġ* Ġ@ param Ġimage Name Ġthe Ġname Ġgiven Ġto Ġthe Ġimage Ġfile Ġin Ġthe Ġassets Ġdirectory Ġof Ġthe Ġtests Ġwithout Ċ Ġ* Ġthe Ġfile Ġextension Ċ Ġ* Ġ@ param Ġnode Ġthe Ġnode Ġin Ġthe Ġsemantics Ġtree Ġof Ġa Ġcompose Test Rule Ġto Ġbe Ġtested Ċ Ġ* Ġ@ param Ġsave Test Screenshots Ġset Ġthis Ġto Ġtrue Ġif Ġyou Ġwould Ġlike Ġto Ġsave Ġthe Ġscreenshots Ġon Ġdevice Ċ Ġ*/ Ċ fun Ġassert Image Matches Expected ( ĊĠĠĠ Ġimage Name : ĠString , ĊĠĠĠ Ġnode : ĠSem antics Node Interaction , ĊĠĠĠ Ġsave Test Screenshots : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġimage Ġ= Ġnode . capture To Image (). as Android Bitmap () ĊĊĠĠĠ Ġif Ġ( save Test Screenshots ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsave Image ( image Name , Ġimage ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexpected Image Ġ= Ġopen Image ( image Name ) ĊĊĠĠĠ Ġimage . compare ( expected Image ) Ċ } Ċ Ċ private Ġfun Ġsave Image ( ĊĠĠĠ Ġimage Name : ĠString , ĊĠĠĠ Ġimage : ĠBitmap Ċ ) Ġ{ ĊĠĠĠ Ġval ĠfileName Ġ= Ġ"${ image Name }_${ image . width }_${ image . height }_${ System . currentTimeMillis () }" ĊĠĠĠ Ġval Ġpath Ġ= ĠInstrument ation Registry . get Instrumentation (). target Context . files Dir ĊĊĠĠĠ ĠFileOutputStream ("$ path /$ fileName . png "). use Ġ{ ĊĠĠĠĠĠĠĠ Ġimage . compress ( Bitmap . Compress Format . PNG , Ġ 1 0 0 , Ġit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprintln (" Test Ġimage Ġsaved Ġat Ġ$ path /$ fileName . png ") Ċ } Ċ Ċ private Ġfun Ġopen Image ( ĊĠĠĠ Ġimage Name : ĠString Ċ ): ĠBitmap Ġ{ ĊĠĠĠ Ġval ĠfileName Ġ= Ġ"${ image Name }. png " ĊĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠInstrument ation Registry . get Instrumentation (). context . resources . assets . open ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName ĊĠĠĠĠĠĠĠ Ġ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode Stream ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( error : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġfind Ġ$ fileName Ġin Ġandroid Test / assets Ġto Ġcompare Ġit Ġto Ġtest Ġimage ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠBitmap . compare ( ĊĠĠĠ Ġother : ĠBitmap Ċ ) Ġ{ ĊĠĠĠ Ġif Ġ( this . width Ġ!= Ġother . width Ġ|| Ġthis . height Ġ!= Ġother . height ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest Ġscreenshot Ġand Ġexpected Ġscreenshot Ġhave Ġdifferent Ġsizes : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠExpected Ġscreenshot Ġ(${ other . width } Ġpx Ġby Ġ${ other . height } Ġpx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- ĠTest Ġscreenshot Ġ(${ this . width } Ġpx Ġby Ġ${ this . height } Ġpx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEnsure Ġcurrent Ġtesting Ġdevice Ġdensity Ġis Ġthe Ġsame Ġas Ġthe Ġone Ġused ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Ġproduce Ġexpected Ġscreenshots . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThese Ġwill Ġbe Ġused Ġto Ġstore Ġthe Ġcurrent Ġrows Ġbeing Ġcompared ĊĠĠĠ Ġval Ġthis Row Ġ= ĠInt Array ( this . width ) ĊĠĠĠ Ġval Ġother Row Ġ= ĠInt Array ( other . width ) ĊĊĠĠĠ Ġfor Ġ( row Ġin Ġ 0 Ġuntil Ġthis . height ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠPopulate Ġthe ĠInt Arrays Ġwith Ġcurrent Ġrows ĊĠĠĠĠĠĠĠ Ġthis . getRow ( this Row , Ġrow ) ĊĠĠĠĠĠĠĠ Ġother . getRow ( other Row , Ġrow ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! this Row . content Equals ( other Row )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Test Ġscreenshot Ġdoes Ġnot Ġmatch Ġexpected Ġscreenshot ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠBitmap . getRow ( pixels : ĠInt Array , Ġrow : ĠInt ) Ġ= ĊĠĠĠ Ġthis . get Pixels ( pixels , Ġ 0 , Ġthis . width , Ġ 0 , Ġrow , Ġthis . width , Ġ 1 )