package Ġcom . mapbox . maps . renderer Ċ Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . os . Looper Ċ import Ġcom . mapbox . common . Shadow Logger Ċ import Ġcom . mapbox . maps . Map Interface Ċ import Ġcom . mapbox . maps . MapView Ċ import Ġcom . mapbox . maps . Size Ċ import Ġcom . mapbox . maps . Task Ċ import Ġcom . mapbox . maps . renderer . gl . Pixel Reader Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . slot Ċ import Ġio . mock k . verify Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . ro bo lectric . Shadow s Ċ import Ġorg . ro bo lectric . annotation . Config Ċ import Ġorg . ro bo lectric . annotation . Looper Mode Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ @ Config ( shadow s Ġ= Ġ[ Shadow Logger :: class ]) Ċ @ Looper Mode ( Looper Mode . Mode . PA USED ) Ċ internal Ġabstract Ġclass ĠMap box Renderer Test Ġ{ ĊĊĠ Ġprotected Ġlateinit Ġvar Ġrender Thread : ĠMap box Render Thread ĊĠ Ġprotected Ġlateinit Ġvar Ġmap box Renderer : ĠMap box Renderer ĊĊĠ Ġ@ Before ĊĠ Ġopen Ġfun ĠsetUp () Ġ{ ĊĠĠĠ Ġrender Thread Ġ= Ġmock k ( relax ed Ġ= Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġset Map Test () Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmock k < Map Interface >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġmap box Renderer . set Map ( map ) ĊĠĠĠ Ġassert ( mapbox Renderer . map Ġ== Ġmap ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġschedule Rep aint Test () Ġ{ ĊĠĠĠ Ġmap box Renderer . schedule Rep aint () ĊĠĠĠ Ġverify Ġ{ Ġrender Thread . request Render () Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġschedule Task Test () Ġ{ ĊĠĠĠ Ġval Ġtask Ġ= Ġmock k < Task >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġmap box Renderer . schedule Task ( task ) ĊĠĠĠ Ġverify Ġ{ Ġrender Thread . queue Event ( any ()) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun ĠonStart Test () Ġ{ ĊĠĠĠ Ġmap box Renderer . onStart () ĊĠĠĠ Ġverify Ġ{ Ġrender Thread . resume () Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Stop Test () Ġ{ ĊĠĠĠ Ġmap box Renderer . on Stop () ĊĠĠĠ Ġverify Ġ{ Ġrender Thread . pause () Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġset Maximum F ps Test () Ġ{ ĊĠĠĠ Ġmap box Renderer . setMaximum F ps ( 1 0 ) ĊĠĠĠ Ġverify Ġ{ Ġrender Thread . setMaximum F ps ( 1 0 ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġqueue Event Test () Ġ{ ĊĠĠĠ Ġval Ġevent Ġ= Ġmock k < Runnable >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġmap box Renderer . queue Event ( event ) ĊĠĠĠ Ġverify Ġ{ Ġrender Thread . queue Event ( event ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġqueue Render Event Test () Ġ{ ĊĠĠĠ Ġval Ġevent Ġ= Ġmock k < Runnable >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġmap box Renderer . queue Render Event ( event ) ĊĠĠĠ Ġverify Ġ{ Ġrender Thread . queue Render Event ( event ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Surface Created Test () Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmock k < Map Interface >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġmap box Renderer . map Ġ= Ġmap ĊĠĠĠ Ġmap box Renderer . on Surface Created () ĊĠĠĠ Ġverify Ġ{ Ġmap . create Renderer () Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Surface Changed Test () Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmock k < Map Interface >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġmap box Renderer . map Ġ= Ġmap ĊĠĠĠ Ġmap box Renderer . on Surface Changed ( 1 , Ġ 1 ) ĊĠĠĠ Ġverify Ġ{ Ġmap . size Ġ= ĠSize ( 1 f , Ġ 1 f ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Surface Destroyed Test () Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmock k < Map Interface >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġmap box Renderer . map Ġ= Ġmap ĊĠĠĠ Ġmap box Renderer . on Surface Destroyed () ĊĠĠĠ Ġverify Ġ{ Ġmap . destroy Renderer () Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Draw Frame Test () Ġ{ ĊĠĠĠ Ġval Ġmap Ġ= Ġmock k < Map Interface >( relax Unit Fun Ġ= Ġtrue ) ĊĠĠĠ Ġmap box Renderer . map Ġ= Ġmap ĊĠĠĠ Ġmap box Renderer . on Draw Frame () ĊĠĠĠ Ġverify Ġ{ Ġmap . render () Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Snapshot Success Sync () Ġ{ ĊĠĠĠ Ġval Ġpixel Reader Ġ= Ġmock k < Pixel Reader >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . width Ġ} Ġreturns Ġ 1 ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . height Ġ} Ġreturns Ġ 1 ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . read Pixels () Ġ} Ġreturns ĠByteBuffer . allocate Direct ( 1 Ġ* Ġ 1 Ġ* Ġ 4 ) ĊĠĠĠ Ġvar Ġhandler : ĠHandler ĊĠĠĠ Ġval Ġhandler Thread Ġ= ĠHandler Thread (" thread "). apply Ġ{ ĊĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠ Ġhandler Ġ= ĠHandler ( this . lo oper ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrunnable Ġ= Ġslot < Runnable >() ĊĠĠĠ Ġevery Ġ{ Ġrender Thread . queue Render Event ( capture ( run nable )) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠ Ġhandler . post ( run nable . captured ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmap box Renderer . pixel Reader Ġ= Ġpixel Reader ĊĠĠĠ Ġmap box Renderer . ready For Snapshot Ġ= ĠAtomic Boolean ( true ) ĊĠĠĠ Ġmap box Renderer . on Surface Changed ( 1 , Ġ 1 ) ĊĠĠĠ ĠShadow s . shadow Of ( Looper . get Main Looper ()). pause () ĊĠĠĠ Ġmap box Renderer . snapshot () ĊĠĠĠ ĠShadow s . shadow Of ( Looper . get Main Looper ()). idle () ĊĠĠĠ Ġverify Ġ{ Ġpixel Reader . read Pixels () Ġ} ĊĠĠĠ Ġhandler Thread . quit () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Snapshot Failure Sync () Ġ{ ĊĠĠĠ Ġval Ġpixel Reader Ġ= Ġmock k < Pixel Reader >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . width Ġ} Ġreturns Ġ 1 ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . height Ġ} Ġreturns Ġ 1 ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . read Pixels () Ġ} Ġreturns ĠByteBuffer . allocate Direct ( 1 Ġ* Ġ 1 Ġ* Ġ 4 ) ĊĠĠĠ Ġvar Ġhandler : ĠHandler ĊĠĠĠ Ġval Ġhandler Thread Ġ= ĠHandler Thread (" thread "). apply Ġ{ ĊĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠ Ġhandler Ġ= ĠHandler ( this . lo oper ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrunnable Ġ= Ġslot < Runnable >() ĊĠĠĠ Ġevery Ġ{ Ġrender Thread . queue Render Event ( capture ( run nable )) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠ Ġhandler . post ( run nable . captured ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmap box Renderer . pixel Reader Ġ= Ġpixel Reader ĊĠĠĠ Ġmap box Renderer . ready For Snapshot Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠ Ġmap box Renderer . on Surface Changed ( 1 , Ġ 1 ) ĊĠĠĠ ĠShadow s . shadow Of ( Looper . get Main Looper ()). pause () ĊĠĠĠ Ġmap box Renderer . snapshot () ĊĠĠĠ ĠShadow s . shadow Of ( Looper . get Main Looper ()). idle () ĊĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġpixel Reader . read Pixels () Ġ} ĊĠĠĠ Ġhandler Thread . quit () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Snapshot Success Async () Ġ{ ĊĠĠĠ Ġval Ġpixel Reader Ġ= Ġmock k < Pixel Reader >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . width Ġ} Ġreturns Ġ 1 ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . height Ġ} Ġreturns Ġ 1 ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . read Pixels () Ġ} Ġreturns ĠByteBuffer . allocate Direct ( 1 Ġ* Ġ 1 Ġ* Ġ 4 ) ĊĠĠĠ Ġvar Ġhandler : ĠHandler ĊĠĠĠ Ġval Ġhandler Thread Ġ= ĠHandler Thread (" thread "). apply Ġ{ ĊĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠ Ġhandler Ġ= ĠHandler ( this . lo oper ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrunnable Ġ= Ġslot < Runnable >() ĊĠĠĠ Ġevery Ġ{ Ġrender Thread . queue Render Event ( capture ( run nable )) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠ Ġhandler . post ( run nable . captured ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmap box Renderer . pixel Reader Ġ= Ġpixel Reader ĊĠĠĠ Ġmap box Renderer . ready For Snapshot Ġ= ĠAtomic Boolean ( true ) ĊĠĠĠ Ġmap box Renderer . on Surface Changed ( 1 , Ġ 1 ) ĊĠĠĠ Ġval Ġcallback Ġ= ĠMap View . On Snapshot Ready Ġ{ ĊĠĠĠĠĠ Ġverify Ġ{ Ġpixel Reader . read Pixels () Ġ} ĊĠĠĠĠĠ Ġhandler Thread . quit () ĊĠĠĠ Ġ} ĊĠĠĠ ĠShadow s . shadow Of ( Looper . get Main Looper ()). pause () ĊĠĠĠ ĠShadow s . shadow Of ( handler Thread . lo oper ). pause () ĊĠĠĠ Ġmap box Renderer . snapshot ( callback ) ĊĠĠĠ ĠShadow s . shadow Of ( handler Thread . lo oper ). idle () ĊĠĠĠ ĠShadow s . shadow Of ( Looper . get Main Looper ()). idle () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Snapshot Failure Async () Ġ{ ĊĠĠĠ Ġval Ġpixel Reader Ġ= Ġmock k < Pixel Reader >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . width Ġ} Ġreturns Ġ 1 ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . height Ġ} Ġreturns Ġ 1 ĊĠĠĠ Ġevery Ġ{ Ġpixel Reader . read Pixels () Ġ} Ġreturns ĠByteBuffer . allocate Direct ( 1 Ġ* Ġ 1 Ġ* Ġ 4 ) ĊĠĠĠ Ġvar Ġhandler : ĠHandler ĊĠĠĠ Ġval Ġhandler Thread Ġ= ĠHandler Thread (" thread "). apply Ġ{ ĊĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠ Ġhandler Ġ= ĠHandler ( this . lo oper ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrunnable Ġ= Ġslot < Runnable >() ĊĠĠĠ Ġevery Ġ{ Ġrender Thread . queue Render Event ( capture ( run nable )) Ġ} Ġanswers Ġ{ ĊĠĠĠĠĠ Ġhandler . post ( run nable . captured ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmap box Renderer . pixel Reader Ġ= Ġpixel Reader ĊĠĠĠ Ġmap box Renderer . ready For Snapshot Ġ= ĠAtomic Boolean ( false ) ĊĠĠĠ Ġmap box Renderer . on Surface Changed ( 1 , Ġ 1 ) ĊĠĠĠ Ġval Ġcallback Ġ= ĠMap View . On Snapshot Ready Ġ{ ĊĠĠĠĠĠ ĠAssert . assertNull ( it ) ĊĠĠĠĠĠ Ġhandler Thread . quit () ĊĠĠĠ Ġ} ĊĠĠĠ ĠShadow s . shadow Of ( Looper . get Main Looper ()). pause () ĊĠĠĠ Ġmap box Renderer . snapshot ( callback ) ĊĠĠĠ ĠShadow s . shadow Of ( Looper . get Main Looper ()). idle () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġon Destroy Test () Ġ{ ĊĠĠĠ Ġval Ġlistener Ġ= ĠOn F ps Changed Listener Ġ{ Ġ} ĊĠĠĠ Ġevery Ġ{ Ġrender Thread . fps Changed Listener Ġ} Ġreturns Ġlistener ĊĠĠĠ Ġmap box Renderer . setOn F ps Changed Listener ( listener ) ĊĠĠĠ Ġmap box Renderer . on Destroy () ĊĠĠĠ ĠAssert . assertEquals ( true , Ġmap box Renderer . need Destroy ) ĊĠĠĠ Ġverify Ġ{ Ġrender Thread . fps Changed Listener Ġ= Ġnull Ġ} ĊĠ Ġ} Ċ }