package Ġco . net guru . android . car recognition . feature . camera Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . media . Image Ċ import Ġco . net guru . android . car recognition . Rx Schedulers Override Rule Ċ import Ġco . net guru . android . car recognition . common . extensions . Image Utils Ċ import Ġco . net guru . android . car recognition . data . db . App Database Ċ import Ġco . net guru . android . car recognition . data . db . C ars Ċ import Ġco . net guru . android . car recognition . data . db . C ars Dao Ċ import Ġco . net guru . android . car recognition . data . re cognizer . Car Ċ import Ġco . net guru . android . car recognition . data . re cognizer . Recognition Ċ import Ġco . net guru . android . car recognition . data . re cognizer . T Flow Recognizer Ċ import Ġcom . google . ar . core . Anchor Ċ import Ġcom . google . ar . core . Hit Result Ċ import Ġcom . google . ar . core . Pose Ċ import Ġcom . n ha ar man . mockito _ kotlin .* Ċ import Ġio . reactivex . Maybe Ċ import Ġio . reactivex . Single Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . mockito . Mockito Ċ Ċ class ĠCamera Presenter Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġview Ġ= Ġmock < Camera Contract . View >() ĊĠĠĠ Ġprivate Ġval Ġt flow Ġ= Ġmock < T Flow Recognizer >() ĊĠĠĠ Ġprivate Ġval Ġimage Utils Ġ= Ġmock < Image Utils >() ĊĠĠĠ Ġprivate Ġval Ġdatabase Ġ= Ġmock < App Database >() ĊĠĠĠ Ġprivate Ġval Ġcars Dao Ġ= Ġmock < C ars Dao >() ĊĠĠĠ Ġprivate Ġval Ġcar Ġ= Ġmock < C ars >() ĊĠĠĠ Ġprivate Ġval Ġbitmap Ġ= Ġmock < Bitmap >() ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġpresenter : ĠCamera Presenter ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġoverride Schedulers Rule Ġ= ĠRx Schedulers Override Rule () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġbefore () Ġ{ ĊĠĠĠĠĠĠĠ Ġreset ( t flow , Ġview , Ġdatabase , Ġcars Dao , Ġcar ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( database . car Dao ()). thenReturn ( cars Dao ) ĊĠĠĠĠĠĠĠ ĠMockito .` when `( image Utils . prepare Bitmap ( any (), Ġany ())). thenReturn ( bitmap ) ĊĠĠĠĠĠĠĠ Ġpresenter Ġ= ĠCamera Presenter ( t flow , Ġimage Utils , Ġdatabase ) ĊĠĠĠĠĠĠĠ Ġpresenter . attach View ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġcreate Ġanchor Ġon Ġhit Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġcars Dao . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġfind ById ( Car . VOL K SW AG EN _ PASS AT . id ) Ġ} Ġdo Return ĠMaybe . create Ġ{ Ġit . on Success ( car ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate Re cogn itions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecognition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCar . VOL K SW AG EN _ PASS AT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmock < Hit Result >() ĊĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( result ) ĊĊĠĠĠĠĠĠĠ Ġverify ( view ). create Anchor ( result , Ġcar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġnot Ġcreate Ġanchor Ġwhen Ġdistance Ġis Ġlower Ġthan ĠMIN IMUM _ DISTANCE _ B ETWEEN _ AN CH ORS `() Ġ{ ĊĠĠĠĠĠĠĠ Ġcars Dao . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġfind ById ( Car . VOL K SW AG EN _ PASS AT . id ) Ġ} Ġdo Return ĠMaybe . create Ġ{ Ġit . on Success ( car ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpose 1 Ġ= Ġmock < Pose > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtx () Ġ} Ġdo Return Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġty () Ġ} Ġdo Return Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtz () Ġ} Ġdo Return Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult 1 Ġ= Ġmock < Hit Result > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġhit Pose Ġ} Ġdo Return Ġpose 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpose 2 Ġ= Ġmock < Pose > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtx () Ġ} Ġdo Return Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġty () Ġ} Ġdo Return Ġ 1 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtz () Ġ} Ġdo Return Ġ 1 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult 2 Ġ= Ġmock < Hit Result > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġhit Pose Ġ} Ġdo Return Ġpose 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġanchor Ġ= Ġmock < Anchor > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġpose Ġ} Ġdo Return Ġpose 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġcreate Anchor ( result 1 , Ġcar ) Ġ} Ġdo Return Ġanchor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate Re cogn itions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecognition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCar . VOL K SW AG EN _ PASS AT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( result 1 ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). create Anchor ( result 1 , Ġcar ) ĊĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( result 2 ) ĊĠĠĠĠĠĠĠ Ġverify ( view , Ġtimes ( 0 )). create Anchor ( result 2 , Ġcar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġcreate Ġanchor Ġwhen Ġdistance Ġis Ġhigher Ġthen ĠMIN IMUM _ DISTANCE _ B ETWEEN _ AN CH ORS `() Ġ{ ĊĠĠĠĠĠĠĠ Ġcars Dao . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġfind ById ( Car . VOL K SW AG EN _ PASS AT . id ) Ġ} Ġdo Return ĠMaybe . create Ġ{ Ġit . on Success ( car ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpose 1 Ġ= Ġmock < Pose > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtx () Ġ} Ġdo Return Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġty () Ġ} Ġdo Return Ġ 0 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtz () Ġ} Ġdo Return Ġ 0 f ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult 1 Ġ= Ġmock < Hit Result > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġhit Pose Ġ} Ġdo Return Ġpose 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpose 2 Ġ= Ġmock < Pose > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtx () Ġ} Ġdo Return Ġ 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġty () Ġ} Ġdo Return Ġ 5 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġtz () Ġ} Ġdo Return Ġ 5 f ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult 2 Ġ= Ġmock < Hit Result > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġhit Pose Ġ} Ġdo Return Ġpose 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġanchor Ġ= Ġmock < Anchor > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġpose Ġ} Ġdo Return Ġpose 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġview . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġcreate Anchor ( result 1 , Ġcar ) Ġ} Ġdo Return Ġanchor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate Re cogn itions ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRecognition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCar . VOL K SW AG EN _ PASS AT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 f ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( result 1 ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). create Anchor ( result 1 , Ġcar ) ĊĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( result 2 ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). create Anchor ( result 2 , Ġcar ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġtry Ġattach Ġpin Ġwith Ġincreasing Ġrandom Ġfield `() Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( null ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). try Attach Pin ( 1 ) ĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( null ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). try Attach Pin ( 2 ) ĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( null ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). try Attach Pin ( 3 ) ĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( null ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). try Attach Pin ( 4 ) ĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( null ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). try Attach Pin ( 5 ) ĊĠĠĠĠĠĠĠ Ġpresenter . process Hit Result ( null ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). show Could Not Attach Pin Error () ĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( view ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġshow Ġdetails Ġon Ġ 3 0 Ġframe Ġwhen Ġrecognition Ġis Ġhigh `() Ġ{ ĊĠĠĠĠĠĠĠ Ġcar . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġcopy () Ġ} Ġdo Return Ġmock < C ars >() ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcars Dao . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġfind ById ( Car . VOL K SW AG EN _ PASS AT . id ) Ġ} Ġdo Return ĠMaybe . create Ġ{ Ġit . on Success ( car ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerate Re cogn itions ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecognition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCar . VOL K SW AG EN _ PASS AT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 8 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġverify ( view ). update View Finder ( 0 . 8 f ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). frame Stream Enabled ( false ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). show Details ( car ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). try Attach Pin ( 0 ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). update Recognition Indicator Label ( Camera Presenter . Recognition Label . FOUND ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġchange Ġlabel Ġto Ġrecogn izing Ġon Ġmiddle Ġthreshold `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Re cogn itions ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRecognition ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCar . VOL K SW AG EN _ PASS AT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 6 f ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġverify ( view ). update View Finder ( 0 . 6 f ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). update Recognition Indicator Label ( Camera Presenter . Recognition Label . IN _ PROGRESS ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġshow Ġproper Ġlabel Ġon Ġnot Ġcar `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Re cogn itions ( Recognition ( Car . NOT _ A _ CAR , Ġ 1 f )) ĊĠĠĠĠĠĠĠ Ġverify ( view , Ġtimes ( 5 )). update View Finder ( 0 f ) ĊĠĠĠĠĠĠĠ Ġverify ( view , Ġtimes ( 5 )). update Recognition Indicator Label ( Camera Presenter . Recognition Label . INIT ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġshow Ġproper Ġlabel Ġon Ġother Ġcar `() Ġ{ ĊĠĠĠĠĠĠĠ Ġgenerate Re cogn itions ( Recognition ( Car . OTHER _ CAR , Ġ 1 f )) ĊĠĠĠĠĠĠĠ Ġverify ( view ). update View Finder ( 1 f ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). update Recognition Indicator Label ( Camera Presenter . Recognition Label . FOUND _ UNKNOWN ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġshow Ġview Ġfinder Ġand Ġenable Ġframe Ġstream Ġon Ġdiscard ing Ġbottom Ġsheet `() Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter . bottom Sheet Hidden () ĊĠĠĠĠĠĠĠ Ġverify ( view ). update View Finder ( 0 f ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). frame Stream Enabled ( true ) ĊĠĠĠĠĠĠĠ Ġverify ( view ). show View Finder () ĊĠĠĠĠĠĠĠ Ġverify ( view ). update Recognition Indicator Label ( Camera Presenter . Recognition Label . INIT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġshow Ġrecognition Ġui Ġon Ġpermission Ġgranted `() Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter . on Permission Granted () ĊĠĠĠĠĠĠĠ Ġverify ( view ). show Recognition Ui () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġshow Ġpermission Ġui Ġon Ġpre mission Ġdecl ined `() Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter . on Permission Decl ined () ĊĠĠĠĠĠĠĠ Ġverify ( view ). show Permission Ui () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġshow Ġexploration Ġmode Ġwhen Ġrecognition Ġmode Ġclosed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter . onClose Recognition Clicked () ĊĠĠĠĠĠĠĠ Ġverify ( view ). show Ex ploration Mode () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Should Ġshow Ġrecognition Ġmode Ġwhen Ġexploration Ġmode Ġclosed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġpresenter . on Scan Button Clicked () ĊĠĠĠĠĠĠĠ Ġverify ( view ). show View Finder () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Re cogn itions ( recognition : ĠRecognition ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġframe Ġ= Ġmock < Image >() ĊĠĠĠĠĠĠĠ Ġt flow . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġclassify ( any ()) Ġ} Ġdo Return ĠSingle . just ( recognition ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġview . stub Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġacquire Frame () Ġ} Ġdo Return Ġframe ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// we Ġneed Ġ 5 Ġframes Ġto Ġstart Ġshowing Ġdata ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpresenter . frame Updated () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ