package Ġio . b unting . k ron Ċ Ċ import Ġjava . lang . IllegalArgumentException Ċ import Ġjava . time .* Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ /** Ċ Ġ* ĠA Ġutility Ġfor Ġtesting Ġfunctionality Ġthat Ġrelies Ġon Ġthe Ġmovement Ġof Ġtime . ĠThis Ġallows Ġyou Ġto Ġmanually Ġincrement Ġthe Ċ Ġ* Ġtime Ġas Ġyou Ġprogress Ġthrough Ġa Ġtest . ĠIt Ġallows Ġreset ting Ġbut Ġotherwise Ġdoes Ġnot Ġallow Ġbackwards Ġmovement Ġof Ġtime . Ċ Ġ* Ċ Ġ* ĠNOTE : ĠThis Ġimplementation Ġdoes ĠNOT Ġcomp ly Ġwith Ġ` Clock `' s Ġrestriction Ġthat Ġimplementations Ġbe Ġimmutable . ĠBy Ġthe Ċ Ġ* Ġvery Ġnature Ġof Ġthis Ġimplementation 's Ġpurpose , Ġmut ability Ġis Ġnecessary . Ċ Ġ*/ Ċ class ĠManual Clock ( private Ġval Ġzone Id : ĠZone Id , Ġprivate Ġval Ġinitial Instant : ĠInstant ): ĠClock () Ġ{ ĊĠĠĠ Ġconstructor ( zone Id : ĠZone Id , Ġinitial Time : ĠLocalDateTime ): ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( zone Id , Ġinitial Time . to Instant ( zone Id . rules . get Offset ( initial Time ))) ĊĠĠĠ Ġconstructor ( zone : ĠString , Ġinitial Time : ĠString ): ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( Zone Id . of ( zone ), ĠLocalDateTime . parse ( initial Time , ĠDateTime Formatter . ISO _ LOCAL _ DATE _ TIME )) ĊĠĠĠ Ġconstructor ( initial Z oned Time : ĠZ onedDateTime ): ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( initial Z oned Time . zone , Ġinitial Z oned Time . to LocalDateTime ()) ĊĠĠĠ Ġconstructor ( initial Z oned Time : ĠString ): ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ( Z onedDateTime . parse ( initial Z oned Time , ĠDateTime Formatter . ISO _ Z ON ED _ DATE _ TIME )) ĊĊĊĠĠĠ Ġprivate Ġval Ġatomic Instant Ġ= ĠAtomic Reference < Instant >( initial Instant ) ĊĊĠĠĠ Ġvar Ġcurrent Instant : ĠInstant ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġatomic Instant . get () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġatomic Instant . get AndUpdate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . is Before ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Clock Ġcannot Ġmove Ġbackwards .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġvar ĠcurrentTime : ĠLocalDateTime ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠLocalDateTime . of Instant ( current Instant , Ġzone Id ) ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Instant Ġ= Ġvalue . to Instant ( zone Id . rules . get Offset ( value )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġshould Ġbe Ġthe Ġonly Ġcase Ġin Ġwhich Ġthe Ġclock Ġcan Ġmove Ġbackwards ĊĠĠĠĠĠĠĠ Ġatomic Instant . set ( initial Instant ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġwith Zone ( zone : ĠZone Id ): ĠClock Ġ= ĠManual Clock ( zone , Ġcurrent Instant ) ĊĠĠĠ Ġoverride Ġfun Ġget Zone (): ĠZone Id Ġ= Ġzone Id ĊĠĠĠ Ġoverride Ġfun Ġinstant (): ĠInstant Ġ= Ġcurrent Instant ĊĊĠĠĠ Ġ// Ġhelpers ĊĠĠĠ Ġfun Ġinc Minutes ( minutes : ĠLong Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠcurrentTime Ġ= ĠcurrentTime . plus Minutes ( minutes ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġincrement Hours ( hours : ĠLong Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠcurrentTime Ġ= ĠcurrentTime . plus Hours ( hours ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġincrement Days ( days : ĠLong Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ ĠcurrentTime Ġ= ĠcurrentTime . plus Days ( days ) ĊĠĠĠ Ġ} Ċ } Ċ