/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠN icol as ĠMal ta is Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . mal ta is n . notes . model Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroidx . room . Room Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġandroidx . test . ext . junit . runners . Android JUnit 4 Ċ import Ġcom . mal ta is n . notes . date For Ċ import Ġcom . mal ta is n . notes . model . entity . Label Ċ import Ġcom . mal ta is n . notes . model . entity . Label Ref Ċ import Ġcom . mal ta is n . notes . model . entity . Note Status Ċ import Ġcom . mal ta is n . notes . model . entity . Note With Labels Ċ import Ġcom . mal ta is n . notes . model . entity . Pin ned Status Ċ import Ġcom . mal ta is n . notes . model . entity . Reminder Ċ import Ġcom . mal ta is n . notes . test Note Ċ import Ġcom . mal ta is n . notes . ui . search . Search Query Clean er Ċ import Ġcom . mal ta is n . recur picker . Rec urrence Finder Ċ import Ġkotlinx . coroutines . flow . first Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġjava . util . Date Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNull Ċ Ċ @ RunWith ( Android JUnit 4 :: class ) Ċ class ĠNotes Dao Test Ġ{ Ċ // search ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġdatabase : ĠNotes Database ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġnotes Dao : ĠNotes Dao ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlabels Dao : ĠLabels Dao ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġcreate Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠApplication Provider . getApplicationContext < Context >() ĊĠĠĠĠĠĠĠ Ġdatabase Ġ= ĠRoom . in Memory Database Builder ( context , ĠNotes Database :: class . java ). build () ĊĠĠĠĠĠĠĠ Ġnotes Dao Ġ= Ġdatabase . notes Dao () ĊĠĠĠĠĠĠĠ Ġlabels Dao Ġ= Ġdatabase . labels Dao () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun Ġclose Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġdatabase . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġread Write Tests () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnote No Id Ġ= Ġtest Note ( title Ġ= Ġ" note ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠInsert ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġnotes Dao . insert ( note No Id ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( note No Id . copy ( id Ġ= Ġid ), Ġnotes Dao . getById ( id )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġwith Ġinsert ĊĠĠĠĠĠĠĠ Ġval Ġupdated Note 0 Ġ= Ġtest Note ( id Ġ= Ġ 1 , Ġtitle Ġ= Ġ" updated Ġnote Ġ 0 ") ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( updated Note 0 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( updated Note 0 , Ġnotes Dao . getById ( 1 )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġdirectly ĊĠĠĠĠĠĠĠ Ġval Ġupdated Note 1 Ġ= Ġtest Note ( id Ġ= Ġ 1 , Ġtitle Ġ= Ġ" updated Ġnote Ġ 1 ") ĊĠĠĠĠĠĠĠ Ġnotes Dao . update ( updated Note 1 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( updated Note 1 , Ġnotes Dao . getById ( id )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete ĊĠĠĠĠĠĠĠ Ġnotes Dao . delete ( updated Note 1 ) ĊĠĠĠĠĠĠĠ ĠassertNull ( notes Dao . getById ( id )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠInsert Ġall ĊĠĠĠĠĠĠĠ Ġval Ġnew Notes Ġ= ĠlistOf ( test Note ( id Ġ= Ġ 1 ), Ġtest Note ( id Ġ= Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert All ( new Notes ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( new Notes [ 0 ], Ġnotes Dao . getById ( 1 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( new Notes [ 1 ], Ġnotes Dao . getById ( 2 )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠUpdate Ġall ĊĠĠĠĠĠĠĠ Ġval Ġupdated Notes Ġ= ĠlistOf ( test Note ( id Ġ= Ġ 1 , Ġtitle Ġ= Ġ" updated Ġ 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Note ( id Ġ= Ġ 2 , Ġtitle Ġ= Ġ" updated Ġ 2 ")) ĊĠĠĠĠĠĠĠ Ġnotes Dao . update All ( updated Notes ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( updated Notes [ 0 ], Ġnotes Dao . getById ( 1 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( updated Notes [ 1 ], Ġnotes Dao . getById ( 2 )) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġall ĊĠĠĠĠĠĠĠ Ġnotes Dao . delete All ( updated Notes ) ĊĠĠĠĠĠĠĠ ĠassertNull ( notes Dao . getById ( 1 )) ĊĠĠĠĠĠĠĠ ĠassertNull ( notes Dao . getById ( 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġclear Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert All ( listOf ( test Note (), Ġtest Note (), Ġtest Note ())) ĊĠĠĠĠĠĠĠ Ġnotes Dao . clear () ĊĠĠĠĠĠĠĠ ĠassertEquals ( emptyList (), Ġnotes Dao . getAll ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠgetBy Status Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠAdd Ġ 5 Ġnotes Ġfor Ġeach Ġstatus , Ġordered Ġby Ġdescending Ġlast Ġmodified Ġtime . ĠAlso Ġadd Ġa Ġpinned Ġactive Ġnote Ġfirst . ĊĠĠĠĠĠĠĠ Ġ// ĠThen Ġcompare Ġthese Ġnotes Ġwith Ġthe Ġresult Ġof Ġthe Ġdatabase Ġquery . ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 L .. 5 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Dao . insert ( Label ( i , Ġ" label Ġ$ i ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbase Date Ġ= Ġdate For (" 2 0 2 0 - 0 1 - 0 1 T 0 0 : 0 0 : 0 0 . 0 0 0 Z ") ĊĠĠĠĠĠĠĠ Ġval Ġactive Notes Ġ= Ġmutable ListOf < Note With Labels >() ĊĊĠĠĠĠĠĠĠ Ġval Ġpinned Note Ġ= Ġtest Note ( id Ġ= Ġ 1 , Ġstatus Ġ= ĠNote Status . ACTIVE , Ġadded Ġ= Ġbase Date , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodified Ġ= Ġbase Date , Ġpinned Ġ= ĠPin ned Status . PIN N ED ) ĊĠĠĠĠĠĠĠ Ġactive Notes Ġ+= ĠNote With Labels ( pinned Note , Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( pinned Note ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġ 2 L ĊĠĠĠĠĠĠĠ Ġrepeat ( 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( status Ġin ĠNote Status . values ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠDate ( base Date . time Ġ- Ġit Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnote Ġ= Ġtest Note ( id Ġ= Ġid , Ġstatus Ġ= Ġstatus , Ġadded Ġ= Ġdate , Ġmodified Ġ= Ġdate ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . insert ( note ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabel Id Ġ= Ġit Ġ+ Ġ 1 L ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Dao . insert Refs ( listOf ( Label Ref ( id , Ġlabel Id ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠNote Status . ACTIVE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Notes Ġ+= ĠNote With Labels ( note , ĠlistOf NotNull ( labels Dao . getById ( label Id ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnote Flow Ġ= Ġnotes Dao . getBy Status ( Note Status . ACTIVE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSort Settings ( Sort Field . MODI FIED _ DATE , ĠSort Direction . DESC ENDING )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( active Notes , Ġnote Flow . first ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠDelete Ġany Ġnote Ġto Ġsee Ġif Ġflow Ġis Ġupdated . ĊĠĠĠĠĠĠĠ Ġnotes Dao . delete ( active Notes . remove At ( active Notes . indices . random ()). note ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( active Notes , Ġnote Flow . first ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠgetBy Status Hidden Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġa Ġnote Ġhas Ġat Ġleast Ġone Ġhidden Ġlabel , Ġit Ġshouldn 't Ġbe Ġreturned Ġby Ġthe Ġquery . ĊĠĠĠĠĠĠĠ Ġval Ġlabels Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLabel ( 1 , Ġ" label 1 ", Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLabel ( 2 , Ġ" label 2 ", Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLabel ( 3 , Ġ" label 3 ", Ġtrue ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( label Ġin Ġlabels ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Dao . insert ( label ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel Ids Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 L ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 2 L ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 3 L ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 L , Ġ 2 L ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 2 L , Ġ 3 L ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 L , Ġ 3 L ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( 1 L , Ġ 2 L , Ġ 3 L ), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġnote Ġ= Ġtest Note ( status Ġ= ĠNote Status . ACTIVE ) ĊĠĠĠĠĠĠĠ Ġfor Ġ(( i , Ġids ) Ġin Ġlabel Ids . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnote Id Ġ= Ġi Ġ+ Ġ 1 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . insert ( note . copy ( id Ġ= Ġnote Id )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Dao . insert Refs ( ids . map Ġ{ ĠLabel Ref ( note Id , Ġit ) Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġnotes Dao . getBy Status ( Note Status . ACTIVE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSort Settings ( Sort Field . MODI FIED _ DATE , ĠSort Direction . DESC ENDING )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( 1 L , Ġ 2 L ), Ġnotes . first (). map Ġ{ Ġit . note . id Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġinsert Notes And Labels (): ĠList < Note With Labels > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġinsert Ġ 5 Ġnotes , Ġthe Ġfirst Ġnote Ġhaving Ġlabel 1 Ġonly , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġeach Ġnote Ġhaving Ġone Ġmore Ġlabel , Ġso Ġthat Ġnote Ġ 5 Ġhas Ġlabels Ġ 1 - 5 . ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 L .. 5 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Dao . insert ( Label ( i , Ġ" label Ġ$ i ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġmutable ListOf < Note With Labels >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 L .. 5 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= ĠDate ( i Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnote Ġ= Ġtest Note ( id Ġ= Ġi , Ġadded Ġ= Ġdate , Ġmodified Ġ= Ġdate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlabels Ġ= Ġ( 1 L .. i ). map Ġ{ Ġlabels Dao . getById ( it ) !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . insert ( note ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabels Dao . insert Refs ( labels . map Ġ{ ĠLabel Ref ( i , Ġit . id ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Ġ+= ĠNote With Labels ( note , Ġlabels ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnotes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠgetBy Label Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġinsert Notes And Labels (). to Mutable List () ĊĊĠĠĠĠĠĠĠ Ġ// Ġpin Ġone Ġnote Ġto Ġverify Ġcorrect Ġordering ĊĠĠĠĠĠĠĠ Ġnotes [ 3 ] Ġ= Ġnotes [ 3 ]. copy ( notes [ 3 ]. note . copy ( pinned Ġ= ĠPin ned Status . PIN N ED )) ĊĠĠĠĠĠĠĠ Ġnotes Dao . update ( notes [ 3 ]. note ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsort Settings Ġ= ĠSort Settings ( Sort Field . MODI FIED _ DATE , ĠSort Direction . DESC ENDING ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( notes [ 4 ]), Ġnotes Dao . getBy Label ( 5 , Ġsort Settings ). first (). toSet ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( notes [ 3 ], Ġnotes [ 4 ], Ġnotes [ 2 ]), Ġnotes Dao . getBy Label ( 3 , Ġsort Settings ). first ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġlabel 1 Flow Ġ= Ġnotes Dao . getBy Label ( 1 , Ġsort Settings ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( notes [ 3 ], Ġnotes [ 4 ], Ġnotes [ 2 ], Ġnotes [ 1 ], Ġnotes [ 0 ]), Ġlabel 1 Flow . first ()) ĊĊĠĠĠĠĠĠĠ Ġ// Ġverify Ġthat Ġlabel Ġrefs Ġare Ġdeleted Ġin Ġcascade Ġand Ġthat Ġflow Ġis Ġupdated ĊĠĠĠĠĠĠĠ Ġlabels Dao . delete ( labels Dao . getById ( 1 ) !! ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( emptyList (), Ġlabel 1 Flow . first ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠgetAll Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġinsert Notes And Labels () ĊĠĠĠĠĠĠĠ ĠassertEquals ( notes . toSet (), Ġnotes Dao . getAll (). toSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget ById With Labels Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġinsert Notes And Labels () ĊĠĠĠĠĠĠĠ ĠassertEquals ( notes [ 0 ], Ġnotes Dao . getById With Labels ( 1 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( notes [ 1 ], Ġnotes Dao . getById With Labels ( 2 )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( notes [ 4 ], Ġnotes Dao . getById With Labels ( 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdelete Notes By Status And Date Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdates Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 0 1 9 - 0 1 - 0 1 T 0 0 : 0 0 : 0 0 . 0 0 0 Z ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 0 1 9 - 0 5 - 0 1 T 0 0 : 0 0 : 0 0 . 0 0 0 Z ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 0 1 9 - 1 2 - 3 1 T 1 2 : 3 4 : 5 6 . 7 8 9 Z ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 0 1 9 - 1 2 - 3 1 T 2 3 : 5 9 : 5 9 . 9 9 9 Z ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 0 2 0 - 0 1 - 0 1 T 0 0 : 0 0 : 0 0 . 0 0 0 Z ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 0 2 0 - 0 1 - 0 2 T 0 0 : 0 0 : 0 0 . 0 0 0 Z ") ĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġdates . map Indexed Ġ{ Ġi , Ġdate Str Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdate Ġ= Ġdate For ( date Str ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Note ( id Ġ= Ġi Ġ+ Ġ 1 L , Ġadded Ġ= Ġdate , Ġmodified Ġ= Ġdate , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠNote Status . DELETED ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert All ( notes ) ĊĊĠĠĠĠĠĠĠ Ġnotes Dao . delete Notes By Status And Date ( Note Status . DELETED , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdate For (" 2 0 2 0 - 0 1 - 0 1 T 0 0 : 0 0 : 0 0 . 0 0 0 Z "). time ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( notes [ 4 ], Ġnotes [ 5 ]), Ġnotes Dao . getAll (). map Ġ{ Ġit . note Ġ}. toSet ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠgetAll With Reminder Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrecur Finder Ġ= ĠRec urrence Finder () ĊĠĠĠĠĠĠĠ Ġval Ġrem inders Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRem inder . create ( date For (" 2 0 2 0 - 0 1 - 0 1 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġrecur Finder ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRem inder . create ( date For (" 2 0 2 0 - 0 2 - 0 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġrecur Finder ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRem inder . create ( date For (" 2 0 2 0 - 0 2 - 0 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġrecur Finder ). mark As Done (), ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= Ġinsert Notes And Labels (). zip ( rem inders ). map Ġ{ Ġ( note , Ġreminder ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Note Ġ= Ġnote . note . copy ( reminder Ġ= Ġreminder ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . update ( new Note ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNote With Labels ( new Note , Ġnote . labels ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( notes [ 0 ], Ġnotes [ 3 ]), Ġnotes Dao . getAll With Reminder (). first ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsearch Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnote 0 Ġ= Ġtest Note ( id Ġ= Ġ 1 , Ġtitle Ġ= Ġ" note ", Ġcontent Ġ= Ġ" content ") ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( note 0 ) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 2 , Ġtitle Ġ= Ġ" title ", Ġcontent Ġ= Ġ" foo ")) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 3 , Ġtitle Ġ= Ġ" my Ġnote ", Ġcontent Ġ= Ġ" bar ")) ĊĊĠĠĠĠĠĠĠ Ġlabels Dao . insert ( Label ( 1 , Ġ" label Ġ 1 ")) ĊĠĠĠĠĠĠĠ Ġlabels Dao . insert Refs ( listOf ( Label Ref ( 1 , Ġ 1 ))) ĊĊĠĠĠĠĠĠĠ Ġval Ġnote Flow Ġ= Ġnotes Dao . search (" content ", ĠSort Settings ( Sort Field . MODI FIED _ DATE , ĠSort Direction . DESC ENDING )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( Note With Labels ( note 0 , ĠlistOf ( labels Dao . getById ( 1 ) !! ))), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnote Flow . first ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġnote 1 Ġ= Ġtest Note ( id Ġ= Ġ 4 , Ġtitle Ġ= Ġ" note Ġcopy ", Ġcontent Ġ= Ġ" content Ġcopy ") ĊĠĠĠĠĠĠĠ Ġval Ġnote 2 Ġ= Ġtest Note ( id Ġ= Ġ 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= Ġ" arch ived ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Ġ= Ġ" arch ived Ġcontent ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠNote Status . ARCH IVED ) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( note 1 ) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( note 2 ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( listOf ( note 1 , Ġnote 0 , Ġnote 2 ), Ġnote Flow . first (). map Ġ{ Ġit . note Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠgetBy Status Sort Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠgetBy Status Ġshould Ġbe Ġsorted Ġcorrectly . ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 1 , Ġtitle Ġ= Ġ" A ")) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 2 , Ġtitle Ġ= Ġ" b ")) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 3 , Ġtitle Ġ= Ġ" C ", Ġmodified Ġ= Ġdate For (" 2 1 0 0 - 0 1 - 0 1 "))) ĊĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 3 ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnote Flow Ġ= Ġnotes Dao . getBy Status ( Note Status . ACTIVE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSort Settings ( Sort Field . TITLE , ĠSort Direction . ASC ENDING )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( notes , Ġnote Flow . first ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠgetBy Label Sort Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠgetBy Label Ġshould Ġbe Ġsorted Ġcorrectly . ĊĠĠĠĠĠĠĠ Ġlabels Dao . insert ( Label ( 1 , Ġ" label ")) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 1 , Ġadded Ġ= Ġdate For (" 2 0 0 0 - 0 1 - 0 1 "))) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 2 , Ġadded Ġ= Ġdate For (" 2 0 0 1 - 0 1 - 0 1 "))) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 3 , Ġadded Ġ= Ġdate For (" 2 0 0 2 - 0 1 - 0 1 "))) ĊĠĠĠĠĠĠĠ Ġlabels Dao . insert Refs ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Ref ( 1 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Ref ( 2 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLabel Ref ( 3 , Ġ 1 ), ĊĠĠĠĠĠĠĠ Ġ)) ĊĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 3 ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnote Flow Ġ= Ġnotes Dao . getBy Label ( 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSort Settings ( Sort Field . AD DED _ DATE , ĠSort Direction . ASC ENDING )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( notes , Ġnote Flow . first ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġsearch Sort Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsearch Ġshould Ġbe Ġsorted Ġcorrectly . ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 1 , Ġtitle Ġ= Ġ" A aa ", Ġcontent Ġ= Ġ" foo ")) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 2 , Ġtitle Ġ= Ġ" b BB ", Ġcontent Ġ= Ġ" foobar ")) ĊĠĠĠĠĠĠĠ Ġnotes Dao . insert ( test Note ( id Ġ= Ġ 3 , Ġtitle Ġ= Ġ" z ", Ġcontent Ġ= Ġ" fo ob arb az ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġnotes Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotes Dao . getById With Labels ( 1 ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnote Flow Ġ= Ġnotes Dao . search ( Search Query Clean er . clean (" foo "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSort Settings ( Sort Field . TITLE , ĠSort Direction . DESC ENDING )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( notes , Ġnote Flow . first ()) ĊĠĠĠ Ġ} Ċ } Ċ