package Ġde . r ki . cor on aw arn app . presence tracing . check ins . checkout . auto Ċ Ċ import Ġandroid . app . Alarm Manager Ċ import Ġandroid . app . Pending Intent Ċ import Ġde . r ki . cor on aw arn app . presence tracing . check ins . Check In Ċ import Ġde . r ki . cor on aw arn app . presence tracing . check ins . Check In Repository Ċ import Ġde . r ki . cor on aw arn app . presence tracing . check ins . checkout . Check Out Handler Ċ import Ġde . r ki . cor on aw arn app . util . TimeStamp er Ċ import Ġio . kot est . matchers . shouldBe Ċ import Ġio . mock k . Mock K Annotations Ċ import Ġio . mock k . Runs Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . co Verify Sequence Ċ import Ġio . mock k . every Ċ import Ġio . mock k . impl . annotations . Mock K Ċ import Ġio . mock k . just Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . verify Ċ import Ġkotlinx . coroutines . Coroutine Scope Ċ import Ġkotlinx . coroutines . flow . flow Of Ċ import Ġkotlinx . coroutines . test . Test Coroutine Scope Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġok io . ByteString . Companion . encode Ċ import Ġorg . joda . time . Instant Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġtest helpers . Base Test Ċ Ċ class ĠAuto Check Out Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġ@ Mock K Ġlateinit Ġvar Ġintent Factory : ĠAuto Check Out Intent Factory ĊĠĠĠ Ġ@ Mock K Ġlateinit Ġvar Ġrepository : ĠCheck In Repository ĊĠĠĠ Ġ@ Mock K Ġlateinit Ġvar Ġcheck Out Handler : ĠCheck Out Handler ĊĠĠĠ Ġ@ Mock K Ġlateinit Ġvar Ġalarm Manager : ĠAlarm Manager ĊĠĠĠ Ġ@ Mock K Ġlateinit Ġvar Ġtime Stamp er : ĠTime Stamp er ĊĊĠĠĠ Ġprivate Ġval Ġbase Check in Ġ= ĠCheck In ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġ 0 L , ĊĠĠĠĠĠĠĠ Ġtrace Location Id Ġ= Ġ" trace Location Id 1 ". encode (), ĊĠĠĠĠĠĠĠ Ġversion Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" bro thers Ġbirthday ", ĊĠĠĠĠĠĠĠ Ġaddress Ġ= Ġ" M ali bu ", ĊĠĠĠĠĠĠĠ Ġtrace Location Start Ġ= ĠInstant . EPOCH , ĊĠĠĠĠĠĠĠ Ġtrace Location End Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġdefault Check In Length In Minutes Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġcrypto graphic Seed Ġ= Ġ" crypto graphic Seed ". encode (), ĊĠĠĠĠĠĠĠ Ġcn PublicKey Ġ= Ġ" cn PublicKey ", ĊĠĠĠĠĠĠĠ Ġcheck In Start Ġ= ĠInstant . EPOCH , ĊĠĠĠĠĠĠĠ Ġcheck In End Ġ= ĠInstant . EPOCH , ĊĠĠĠĠĠĠĠ Ġcompleted Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġcreate Journal Entry Ġ= Ġfalse ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġtest Check In 1 Ġ= Ġbase Check in . copy ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġ 4 2 L , ĊĠĠĠĠĠĠĠ Ġcheck In End Ġ= ĠInstant . EPOCH . plus ( 5 0 0 ), ĊĠĠĠĠĠĠĠ Ġcompleted Ġ= Ġtrue ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġtest Check In 2 Ġ= Ġbase Check in . copy ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġ 4 3 L , ĊĠĠĠĠĠĠĠ Ġcheck In End Ġ= ĠInstant . EPOCH . plus ( 6 0 0 ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġtest Check In 3 Ġ= Ġbase Check in . copy ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġ 4 4 L , ĊĠĠĠĠĠĠĠ Ġcheck In End Ġ= ĠInstant . EPOCH . plus ( 7 0 0 ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġtest Check In 4 Ġ= Ġbase Check in . copy ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġ 4 5 L , ĊĠĠĠĠĠĠĠ Ġcheck In End Ġ= ĠInstant . EPOCH . plus ( 2 0 0 0 ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ ĠMock K Annotations . init ( this ) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġrepository . all Check Ins Ġ} Ġreturns Ġflow Of ( listOf ( test Check In 2 , Ġtest Check In 1 , Ġtest Check In 3 , Ġtest Check In 4 )) ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtime Stamp er . now UTC Ġ} Ġreturns ĠInstant . EPOCH . plus ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository . get Check In ById ( 4 2 L ) Ġ} Ġreturns Ġtest Check In 1 ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository . get Check In ById ( 4 3 L ) Ġ} Ġreturns Ġtest Check In 2 ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository . get Check In ById ( 4 4 L ) Ġ} Ġreturns Ġtest Check In 3 ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository . get Check In ById ( 4 5 L ) Ġ} Ġreturns Ġtest Check In 4 ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcheck Out Handler . check Out ( any (), Ġany ()) Ġ} Ġjust ĠRuns ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġintent Factory . create Intent ( any ()) Ġ} Ġreturns Ġmock k () ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġalarm Manager . set Exact ( any (), Ġany (), Ġany ()) Ġ} Ġjust ĠRuns ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġalarm Manager . cancel ( any < Pending Intent >()) Ġ} Ġjust ĠRuns ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Instance ( scope : ĠCor outine Scope Ġ= ĠTest Coroutine Scope ()) Ġ= ĠAuto Check Out ( ĊĠĠĠĠĠĠĠ Ġapp Scope Ġ= Ġscope , ĊĠĠĠĠĠĠĠ Ġrepository Ġ= Ġrepository , ĊĠĠĠĠĠĠĠ Ġcheck Out Handler Ġ= Ġcheck Out Handler , ĊĠĠĠĠĠĠĠ Ġalarm Manager Ġ= Ġalarm Manager , ĊĠĠĠĠĠĠĠ Ġtime Stamp er Ġ= Ġtime Stamp er , ĊĠĠĠĠĠĠĠ Ġintent Factory Ġ= Ġintent Factory , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` process Ġover due `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Instance ( scope Ġ= Ġthis ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Over Due Check outs () ĠshouldBe ĠlistOf ( 4 3 L , Ġ 4 4 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 2 L , Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 5 L , Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 3 L , Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 4 L , Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` exceptions Ġduring Ġprocessing Ġof Ġover due Ġcheck ins Ġdo Ġnot Ġabort Ġthe Ġwhole Ġprocess `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcheck Out Handler . check Out ( 4 3 L , Ġany ()) Ġ} Ġthrows ĠException () ĊĠĠĠĠĠĠĠ Ġcreate Instance ( scope Ġ= Ġthis ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Over Due Check outs () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 2 L , Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 5 L , Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġco Verify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 3 L , Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 4 L , Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` 0 id Ġcheck - in Ġis Ġnot Ġprocessed `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Instance ( scope Ġ= Ġthis ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Check Out ( 0 L ) ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Check In ById ( 0 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` process Ġcheck Ġin `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Instance ( scope Ġ= Ġthis ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Check Out ( 4 3 L ) ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Check In ById ( 4 3 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Out Handler . check Out ( 4 3 L , Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` null Ġcheck Ġins Ġare Ġnot Ġprocessed `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġrepository . get Check In ById ( 4 2 L ) Ġ} Ġreturns Ġnull ĊĊĠĠĠĠĠĠĠ Ġcreate Instance ( scope Ġ= Ġthis ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Check Out ( 4 2 L ) ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġco Verify Sequence Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepository . get Check In ById ( 4 2 L ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` exceptions Ġduring Ġcheckout Ġare Ġcaught `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcheck Out Handler . check Out ( 4 2 L , Ġany ()) Ġ} Ġthrows ĠException () ĊĊĠĠĠĠĠĠĠ Ġcreate Instance ( scope Ġ= Ġthis ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperform Check Out ( 4 2 L ) ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` alarm Ġrefresh Ġtargets Ġthe Ġnext Ġcheck - out Ġthat Ġis Ġdue `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmock Intent Ġ= Ġmock k < Pending Intent >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġintent Factory . create Intent ( any ()) Ġ} Ġreturns Ġmock Intent ĊĊĠĠĠĠĠĠĠ Ġcreate Instance ( scope Ġ= Ġthis ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Alarm () ĠshouldBe Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Factory . create Intent ( 4 5 L ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . set Exact ( Alarm Manager . RTC _ WAKE UP , Ġtest Check In 4 . check In End . millis , Ġmock Intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` if Ġthere Ġis Ġno Ġupcoming Ġcheck - out , Ġwe Ġcancel Ġany Ġal arms `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtime Stamp er . now UTC Ġ} Ġreturns ĠInstant . EPOCH . plus ( 2 0 0 0 ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmock Intent Ġ= Ġmock k < Pending Intent >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġintent Factory . create Intent ( any ()) Ġ} Ġreturns Ġmock Intent ĊĊĠĠĠĠĠĠĠ Ġcreate Instance ( scope Ġ= Ġthis ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrefresh Alarm () ĠshouldBe Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġverify Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent Factory . create Intent ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalarm Manager . cancel ( mock Intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ