package Ġgr . black sw amp . dam ag ere ports . data . db Ċ Ċ import Ġandroid . database . sqlite . SQLite Constraint Exception Ċ import Ġandroidx . arch . core . executor . testing . Instant Task Executor Rule Ċ import Ġandroidx . paging . to LiveData Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . room . Room Database Ċ import Ġandroidx . room . paging . Limit Offset DataSource Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġgr . black sw amp . core . db . count Ċ import Ġgr . black sw amp . core . db . count Where Ċ import Ġgr . black sw amp . core . testing . get Or Await Ċ import Ġgr . black sw amp . dam ag ere ports . Test App Ċ import Ġgr . black sw amp . dam ag ere ports . TestData Ċ import Ġgr . black sw amp . dam ag ere ports . data . db . dao . Model Dao Ċ import Ġgr . black sw amp . dam ag ere ports . data . db . entities . Model Entity Ċ import Ġgr . black sw amp . dam ag ere ports . data . db . entities . Report Entity Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . ro bo lectric . annotation . Config Ċ import Ġjava . util .* Ċ Ċ @ Experimental Cor outines Api Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ @ Config ( application Ġ= ĠTest App :: class ) Ċ class ĠModel Dao Test Ġ{ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdb : ĠApp Database Impl ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdao : ĠModel Dao ĊĊĠĠĠ Ġ@ get : Rule ĊĠĠĠ Ġvar Ġinstant Task Executor Rule Ġ= ĠInstant Task Executor Rule () ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Ġ= ĠRoom . in Memory Database Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Provider . getApplicationContext (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠApp Database Impl :: class . java ĊĠĠĠĠĠĠĠ Ġ). allow MainThread Queries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġdao Ġ= Ġdb . model Dao ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġ( db Ġas ĠRoom Database ). close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` insert Ġnew Ġmodel `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbrand Ġ= ĠTest Data . B RAN DS . random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠTest Data . MODE LS . filter Ġ{ Ġit . brand Ġ== Ġbrand . id Ġ}. random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . brand Dao . insert Brand ( brand ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert Model ( model ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdb . count (" models ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` insert Ġwith Ġinvalid Ġbrand Ġfails `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbrand Ġ= ĠTest Data . B RAN DS . random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠTest Data . MODE LS . first Ġ{ Ġit . brand Ġ== Ġbrand . id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert Model ( model ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( t . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( error Ġis ĠSQLite Constraint Exception ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġdb . count (" models ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` update Ġmodel `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdated Ġ= ĠTest Data . MODE LS . random (). copy ( name Ġ= Ġ" this Ġis Ġthe Ġnew Ġthing ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . update Model ( updated ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( TestData . MODE LS . size , Ġdb . count (" models ")) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdb . count Where (" models ", Ġ" Ġname Ġ= Ġ'${ updated . name }' ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` search Ġmodels Ġwith Ġno Ġargs `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloaded Ġ= Ġ( dao . load Models ( TestData . MODE LS [ 2 ]. id , Ġ""). create () Ġas ĠLimit Offset DataSource ). load Range ( 0 , Ġ 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( TestData . MODE LS . count Ġ{ Ġit . brand Ġ== ĠTest Data . MODE LS [ 2 ]. id Ġ}, Ġloaded . count Ġ{ Ġl Ġ-> ĠTest Data . MODE LS . any Ġ{ Ġit Ġ== Ġl Ġ} Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` search Ġmodels Ġwith Ġfilter `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= Ġ" Hello ĠWorld " Ġ// this Ġis Ġon Ġpurpose Ġ 1 1 Ġcharacters Ġso Ġthat Ġthe Ġrandom Ġmodels Ġcannot Ġpossibly Ġcontain Ġit Ġin Ġtheir Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModel Entity ( UUID . randomUUID (), Ġ" 5 ${ filter } 1 ", ĠTest Data . B RAN DS [ 7 0 ]. id , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠModel Entity ( UUID . randomUUID (), Ġ" 2 ${ filter } 2 ", ĠTest Data . B RAN DS [ 7 0 ]. id , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠModel Entity ( UUID . randomUUID (), Ġ" 3 ${ filter } 3 ", ĠTest Data . B RAN DS [ 7 0 ]. id , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠModel Entity ( UUID . randomUUID (), Ġ" 1 ${ filter } 4 ", ĠTest Data . B RAN DS [ 7 0 ]. id , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected . forEach Ġ{ Ġdao . insert Model ( it ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloaded Ġ= Ġ( dao . load Models ( TestData . B RAN DS [ 7 0 ]. id , Ġfilter ). create () Ġas ĠLimit Offset DataSource ). load Range ( 0 , Ġ 1 0 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected . sorted By Ġ{ Ġit . name Ġ}, Ġloaded ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` delete Ġmodel `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleted Ġ= ĠTest Data . MODE LS . random (). id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . delete Model ById ( deleted ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġdb . count Where (" models ", Ġ" Ġid Ġ= Ġ'$ deleted ' ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` delete Ġmodel Ġused Ġfails `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Delete Ġ= ĠTest Data . MODE LS . random () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . report Dao . insert Report ( Report Entity ( UUID . randomUUID (), Ġ" 1 2 3 ", Ġ" 1 2 3 ", Ġto Delete . brand , Ġto Delete . id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġdb . count (" models ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġerror : ĠThrowable ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdao . delete Model ById ( to Delete . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( t ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror Ġ= Ġt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( error Ġis ĠSQLite Constraint Exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġdb . count (" models ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` load Ġmodel Ġby Ġid Ġsuccessfully `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= ĠTest Data . MODE LS . random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġdao . load Model ById ( expected . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġmodel ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` load Ġmodel Ġthat Ġdoes Ġnot Ġexist `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġdao . load Model ById ( UUID . randomUUID ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( model ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` flag ging Ġmodel Ġas Ġdeleted Ġworks `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Delete Ġ= ĠTest Data . MODE LS . random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġdao . flag Model Deleted ( to Delete . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġdb . count Where (" models ", Ġ" Ġid Ġ= Ġ'${ to Delete . id }' Ġand Ġdeleted Ġ= Ġ 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` flag ging Ġan Ġalready Ġdeleted Ġmodel Ġreturns Ġthat Ġnothing Ġis Ġaffected `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbrand Ġ= ĠTest Data . MODE LS . random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . flag Model Deleted ( brand . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġdb . count Where (" models ", Ġ" Ġid Ġ= Ġ'${ brand . id }' Ġand Ġdeleted Ġ= Ġ 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcount ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġdao . flag Model Deleted ( brand . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġdb . count Where (" models ", Ġ" Ġid Ġ= Ġ'${ brand . id }' Ġand Ġdeleted Ġ= Ġ 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` un Deleting Ġa Ġmodel Ġworks `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= ĠTest Data . MODE LS . random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . flag Model Deleted ( model . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcount Ġ= Ġdb . count Where (" models ", Ġ" Ġid Ġ= Ġ'${ model . id }' Ġand Ġdeleted Ġ= Ġ 1 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcount ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġdao . un Flag Model Deleted ( model . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġdb . count Where (" models ", Ġ" Ġid Ġ= Ġ'${ model . id }' Ġand Ġdeleted Ġ= Ġ 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcount ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` un Deleting Ġa Ġmodel Ġthat Ġis Ġnot Ġdeleted Ġreturns Ġthat Ġnothing Ġis Ġaffected `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Delete Ġ= ĠTest Data . MODE LS . random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġdao . un Flag Model Deleted ( to Delete . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresponse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` flag ging Ġa Ġmodel Ġas Ġdeleted Ġre - triggers Ġthe Ġpaging Ġquery Ġsource `() Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinit Models () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbrand Id Ġ= ĠTest Data . B RAN DS . random (). id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodels Ġ= ĠTest Data . MODE LS . filter Ġ{ Ġit . brand Ġ== Ġbrand Id Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġdao . load Models ( brand Id , Ġ""). to LiveData ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= Ġsource . get Or Await () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( models . size , Ġvalue . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġto Delete Ġ= ĠTest Data . MODE LS . filter Ġ{ Ġit . brand Ġ== Ġbrand Id Ġ}. random () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . flag Model Deleted ( to Delete . id ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġsource . get Or Await () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( models . size Ġ- Ġ 1 , Ġvalue . size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinit Models () Ġ{ ĊĠĠĠĠĠĠĠ ĠTest Data . B RAN DS . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . brand Dao . insert Brand ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠTest Data . MODE LS . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdao . insert Model ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ