/* ĊĠĠ ĠCopyright Ġ 2 0 1 7 - 2 0 2 0 ĠChar les ĠK orn . ĊĊĠĠ Ġ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 Ġb ate ct . updates Ċ Ċ import Ġb ate ct . VersionInfo Ċ import Ġb ate ct . test utils . create ForEach Test Ċ import Ġb ate ct . test utils . create Logger ForEach Test Ċ import Ġb ate ct . test utils . on Ċ import Ġb ate ct . ui . Console Ċ import Ġb ate ct . utils . Version Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . in Order Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . never Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . verify Zero Interactions Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . wh enever Ċ import Ġorg . spe k framework . spe k 2 . Spe k Ċ import Ġorg . spe k framework . spe k 2 . style . specification . describe Ċ import Ġjava . time . Zone Offset Ċ import Ġjava . time . Z onedDateTime Ċ Ċ object ĠUpdate Notifier Spec Ġ: ĠSpe k ({ ĊĠĠĠ Ġdescribe (" an Ġupdate Ġnot ifier ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdate Info Storage Ġby Ġcreate ForEach Test Ġ{ Ġmock < Update Info Storage >() Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġupdate Info Updater Ġby Ġcreate ForEach Test Ġ{ Ġmock < Update Info Updater >() Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġversion Info Ġby Ġcreate ForEach Test Ġ{ Ġmock < VersionInfo >() Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġconsole Ġby Ġcreate ForEach Test Ġ{ Ġmock < Console >() Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlogger Ġby Ġcreate Logger ForEach Test () ĊĠĠĠĠĠĠĠ Ġvar ĠcurrentTime Ġ= ĠZ onedDateTime . of ( 0 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , ĠZone Offset . UTC ) ĊĊĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= ĠZ onedDateTime . of ( 0 , Ġ 1 , Ġ 1 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , ĠZone Offset . UTC ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġon (" when Ġthe Ġupdate Ġnotification Ġis Ġdisabled ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Notifier Ġ= ĠUpdate Notifier ( true , Ġupdate Info Storage , Ġupdate Info Updater , Ġversion Info , Ġconsole , Ġlogger , Ġ{ ĠcurrentTime Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġattempt Ġto Ġload Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Storage , Ġnever ()). read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġprint Ġanything Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( console ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġtrigger Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater , Ġnever ()). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdescribe (" when Ġthe Ġupdate Ġnotification Ġis Ġenabled ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Notifier Ġby Ġcreate ForEach Test Ġ{ ĠUpdate Notifier ( false , Ġupdate Info Storage , Ġupdate Info Updater , Ġversion Info , Ġconsole , Ġlogger , Ġ{ ĠcurrentTime Ġ}) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" when Ġno Ġcached Ġupdate Ġinformation Ġis Ġavailable ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( update Info Storage . read ()). thenReturn ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġprint Ġanything Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( console ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" triggers Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater ). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġon (" when Ġthe Ġcached Ġupdate Ġinformation Ġcan 't Ġbe Ġread ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( update Info Storage . read ()). then Throw ( RuntimeException (" Something Ġwent Ġwrong ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġprint Ġanything Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( console ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" triggers Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater ). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescribe (" when Ġthe Ġcached Ġupdate Ġinformation Ġcan Ġbe Ġread ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Updated Ġ= ĠZ onedDateTime . of ( 2 0 1 7 , Ġ 1 0 , Ġ 3 , Ġ 1 , Ġ 1 0 , Ġ 0 , Ġ 0 , ĠZone Offset . UTC ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupdate Info Ġ= ĠUpdate Info ( Version ( 0 , Ġ 3 , Ġ 0 ), Ġ" https :// something . com / b ate ct / 0 . 3 ", Ġlast Updated , Ġempty List ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( update Info Storage . read ()). thenReturn ( update Info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescribe (" and Ġit Ġhas Ġbeen Ġupdated Ġin Ġthe Ġlast Ġ 3 6 Ġhours ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= Ġlast Updated . plus Hours ( 3 6 ). plus Seconds (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" and Ġthe Ġversion Ġin Ġthe Ġcached Ġupdate Ġinformation Ġmatches Ġthe Ġcurrent Ġversion ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( version Info . version ). thenReturn ( Version ( 0 , Ġ 3 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġprint Ġanything Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( console ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġtrigger Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater , Ġnever ()). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" and Ġthe Ġversion Ġin Ġthe Ġcached Ġupdate Ġinformation Ġis Ġolder Ġthan Ġthe Ġcurrent Ġversion ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( version Info . version ). thenReturn ( Version ( 0 , Ġ 4 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġprint Ġanything Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( console ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġtrigger Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater , Ġnever ()). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" and Ġthe Ġversion Ġin Ġthe Ġcached Ġupdate Ġinformation Ġis Ġnewer Ġthan Ġthe Ġcurrent Ġversion ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( version Info . version ). thenReturn ( Version ( 0 , Ġ 2 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" prints Ġa Ġmessage Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Order ( console ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( console ). println (" Version Ġ 0 . 3 Ġof Ġb ate ct Ġis Ġnow Ġavailable Ġ( you Ġhave Ġ 0 . 2 ). ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( console ). println (" To Ġupgrade Ġto Ġthe Ġlatest Ġversion , Ġrun Ġ'./ b ate ct Ġ-- upgrade '. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( console ). println (" For Ġmore Ġinformation , Ġvisit Ġhttps :// something . com / b ate ct / 0 . 3 .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( console ). println () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġtrigger Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater , Ġnever ()). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescribe (" and Ġit Ġhas Ġnot Ġbeen Ġupdated Ġin Ġthe Ġlast Ġ 3 6 Ġhours ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcurrentTime Ġ= Ġlast Updated . plus Hours ( 3 6 ). plus Seconds ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" and Ġthe Ġversion Ġin Ġthe Ġcached Ġupdate Ġinformation Ġmatches Ġthe Ġcurrent Ġversion ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( version Info . version ). thenReturn ( Version ( 0 , Ġ 3 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġprint Ġanything Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( console ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" triggers Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater ). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" and Ġthe Ġversion Ġin Ġthe Ġcached Ġupdate Ġinformation Ġis Ġolder Ġthan Ġthe Ġcurrent Ġversion ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( version Info . version ). thenReturn ( Version ( 0 , Ġ 4 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" does Ġnot Ġprint Ġanything Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( console ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" triggers Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater ). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon (" and Ġthe Ġversion Ġin Ġthe Ġcached Ġupdate Ġinformation Ġis Ġnewer Ġthan Ġthe Ġcurrent Ġversion ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhenever ( version Info . version ). thenReturn ( Version ( 0 , Ġ 2 , Ġ 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Notifier . run () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" prints Ġa Ġmessage Ġto Ġthe Ġconsole ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Order ( console ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( console ). println (" Version Ġ 0 . 3 Ġof Ġb ate ct Ġis Ġnow Ġavailable Ġ( you Ġhave Ġ 0 . 2 ). ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( console ). println (" To Ġupgrade Ġto Ġthe Ġlatest Ġversion , Ġrun Ġ'./ b ate ct Ġ-- upgrade '. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( console ). println (" For Ġmore Ġinformation , Ġvisit Ġhttps :// something . com / b ate ct / 0 . 3 .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( console ). println () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit (" triggers Ġan Ġupdate Ġof Ġthe Ġcached Ġupdate Ġinfo ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( update Info Updater ). update Cached Info () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ