/** Ċ Ġ* ĠThe ĠMIT ĠLicense Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 7 ĠV ik tar ĠD z mit ry ien ka Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ċ Ġ* Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN Ċ Ġ* ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ import Ġcom . n ha ar man . mockito _ kotlin . mock Ċ import Ġcom . n ha ar man . mockito _ kotlin . verify Ċ import Ġcom . n ha ar man . mockito _ kotlin . verify Zero Interactions Ċ import Ġcom . q vid mi . observer .* Ċ import Ġorg . am sh ove . k lu ent .` should Ġequal Ġto ` Ċ import Ġorg . jetbrains . spe k . api . Spe k Ċ import Ġorg . jetbrains . spe k . api . dsl . describe Ċ import Ġorg . jetbrains . spe k . api . dsl . it Ċ Ċ /** Ċ Ġ* Ċ Ġ* ĠThe ĠObserver Ġpattern Ġis Ġa Ġsoftware Ġdesign Ġpattern Ġin Ġwhich Ġan Ġobject , Ġcalled Ġthe Ġsubject , Ċ Ġ* Ġmaintains Ġa Ġlist Ġof Ġits Ġdepend ents , Ġcalled Ġob servers , Ġand Ġnot ifies Ġthem Ġautomatically Ġof Ġany Ċ Ġ* Ġstate Ġchanges , Ġusually Ġby Ġcalling Ġone Ġof Ġtheir Ġmethods . ĠIt Ġis Ġmainly Ġused Ġto Ġimplement Ċ Ġ* Ġdistributed Ġevent Ġhandling Ġsystems . ĠThe ĠObserver Ġpattern Ġis Ġalso Ġa Ġkey Ġpart Ġin Ġthe Ġfamiliar Ċ Ġ* Ġmodel âĢĵ view âĢĵ controller Ġ( MVC ) Ġarchitect ural Ġpattern . ĠThe ĠObserver Ġpattern Ġis Ġimplemented Ġin Ċ Ġ* Ġnumero us Ġprogramming Ġlibraries Ġand Ġsystems , Ġincluding Ġalmost Ġall ĠGUI Ġtool k its . Ċ Ġ* Ġ< p > Ċ Ġ* ĠIn Ġthis Ġexample Ġ{@ link ĠWeather } Ġhas Ġa Ġstate Ġthat Ġcan Ġbe Ġobserved . ĠThe Ġ{@ link ĠO rc s } Ġand Ċ Ġ* Ġ{@ link ĠH ob bits } Ġregister Ġas Ġob servers Ġand Ġreceive Ġnotifications Ġwhen Ġthe Ġ{@ link ĠWeather } Ġchanges . Ċ Ġ* Ċ Ġ*/ Ċ class ĠObserver Spec Ġ: ĠSpe k ({ ĊĠĠĠ Ġvar Ġlogger : ĠIn Memory Appender Ġ= ĠIn Memory Appender () ĊĊĠĠĠ ĠbeforeEach Test Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger Ġ= ĠIn Memory Appender () ĊĠĠĠ Ġ} ĊĠĠĠ Ġdescribe (" When Ġit 's Ġr aining ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" m akes ĠO rc s Ġw et ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Action ( logger , ĠO rc s (), ĠWeather Type . R AIN Y , ĠO rc s . R AIN Y _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" m akes ĠH ob bits Ġlook Ġfor Ġcover ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Action ( logger , ĠH ob bits (), ĠWeather Type . W IND Y , ĠH ob bits . W IND Y _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġdescribe (" When Ġit 's Ġsun ny ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" m akes ĠO rc s ' Ġeyes Ġh urt ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Action ( logger , ĠO rc s (), ĠWeather Type . SUN NY , ĠO rc s . SUN NY _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" m akes ĠH ob bits Ġhappy ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Action ( logger , ĠH ob bits (), ĠWeather Type . W IND Y , ĠH ob bits . W IND Y _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġdescribe (" When Ġit 's Ġcold ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" m akes ĠO rc s Ġfreeze ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Action ( logger , ĠO rc s (), ĠWeather Type . COL D , ĠO rc s . COL D _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" m akes ĠH ob bits Ġsh iver ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Action ( logger , ĠH ob bits (), ĠWeather Type . W IND Y , ĠH ob bits . W IND Y _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġdescribe (" When Ġit 's Ġwind y ") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" m akes ĠO rc s ' Ġs mell Ġalmost Ġvan ish ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Action ( logger , ĠO rc s (), ĠWeather Type . W IND Y , ĠO rc s . W IND Y _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" m akes ĠH ob bits Ġhold Ġtheir Ġh ats Ġtight ly ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Action ( logger , ĠH ob bits (), ĠWeather Type . W IND Y , ĠH ob bits . W IND Y _ ACTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescribe (" The ĠObserver Ġ( Weather )") Ġ{ ĊĠĠĠĠĠĠĠ Ġit (" m akes ĠObservable Ġ( O rc s Ġand ĠH ob bits ) Ġreact Ġon Ġchanges Ġwhen Ġthey Ġdo Ġcare ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġor cs : ĠO rc s Ġ= Ġmock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh ob bits : ĠH ob bits Ġ= Ġmock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweather Ġ= ĠWeather ( Weather Type . SUN NY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . add Observer ( or cs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . add Observer ( h ob bits ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( or cs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( h ob bits ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . changes ( Weather Type . R AIN Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( or cs ). update ( weather , ĠWeather Type . R AIN Y ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( h ob bits ). update ( weather , ĠWeather Type . R AIN Y ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Size Ġ` should Ġequal Ġto ` Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġit (" m akes ĠObservable Ġ( O rc s Ġand ĠH ob bits ) Ġignore Ġchanges Ġwhen Ġthey Ġdon 't Ġcare ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġor cs : ĠO rc s Ġ= Ġmock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġh ob bits : ĠH ob bits Ġ= Ġmock () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġweather Ġ= ĠWeather ( Weather Type . SUN NY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . add Observer ( or cs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . add Observer ( h ob bits ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( or cs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( h ob bits ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . remove Observer ( or cs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . remove Observer ( h ob bits ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . time P asses () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . time P asses () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweather . time P asses () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( or cs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Zero Interactions ( h ob bits ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . log Size Ġ` should Ġequal Ġto ` Ġ 3 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠafterEach Test Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . stop () ĊĠĠĠ Ġ} Ċ }) Ċ Ċ private Ġfun Ġverify Action ( logger : ĠIn Memory Appender , Ġrace : ĠRace , Ġweather Change : ĠWeather Type , Ġexpected Action : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġweather Ġ= ĠWeather ( Weather Type . SUN NY ) ĊĠĠĠ Ġweather . add Observer ( race ) ĊĠĠĠ Ġweather . changes ( weather Change ) ĊĠĠĠ Ġlogger . last Message Ġ` should Ġequal Ġto ` Ġexpected Action Ċ }