package Ġa mat ere k . movie . data . fake Ċ Ċ import Ġa mat ere k . base . test . Coroutine Test Ċ import Ġa mat ere k . movie . domain . common . Failure Cause Ċ import Ġa mat ere k . movie . domain . common . QueryResult Ċ import Ġa mat ere k . movie . data . fake . Fake Movie Repository . Companion . movies Ċ import Ġa mat ere k . movie . data . fake . Fake Movie Repository . Companion . movies PerPage Ċ import Ġa mat ere k . movie . domain . model .* Ċ import Ġa mat ere k . movie . domain . model . Movie Query . Type Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . spy k Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠFake Movie Repository Test Ġ: ĠCor outine Test () Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġsubject : ĠFake Movie Repository ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġsubject Ġ= Ġspy k ( Fake Movie Repository ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġget Movie List Ġis Ġcalled ĠT THEN Ġreturns Ġfiltered Ġmovie Ġresult `() Ġ= Ġrun Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= Ġmock k < Movie Query >() ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġmock k < Type >() ĊĠĠĠĠĠĠĠ Ġval Ġmovies ByType Ġ= Ġmock k < List < Movie >>() ĊĠĠĠĠĠĠĠ Ġval Ġgen res Ġ= Ġmock k < Set < Movie Genre >>() ĊĠĠĠĠĠĠĠ Ġval Ġmovies By Genre Ġ= Ġmock k < List < Movie >>() ĊĠĠĠĠĠĠĠ Ġval Ġquery Result Ġ= Ġmock k < QueryResult < Movie List >>() ĊĠĠĠĠĠĠĠ Ġval Ġpage Ġ= Ġ 1 2 3 4 5 6 7 ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġquery . type Ġ} Ġreturns Ġtype ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġquery . genres Ġ} Ġreturns Ġgen res ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġget Movies By Search Type ( type ) Ġ} Ġreturns Ġmovies ByType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmovies ByType . filter By Gen res ( genres ) Ġ} Ġreturns Ġmovies By Genre ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevery Ġ{ Ġmovies By Genre . page d Result ( page ) Ġ} Ġreturns Ġquery Result ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( query Result , Ġsubject . get Movie List Page ( query , Ġpage )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġget Movies By Search Type Ġis Ġcalled Ġwith Ġtype ĠBy Category ĠT THEN Ġreturns Ġresult Ġof Ġget Movies By Category `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġby Category Movies Ġ= Ġmock k < List < Movie >>() ĊĠĠĠĠĠĠĠ Ġval Ġby Category Ġ= Ġmock k < Type . By Category >() ĊĠĠĠĠĠĠĠ Ġval Ġcategory Ġ= Ġmock k < Movie Category >() ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġby Category . category Ġ} Ġreturns Ġcategory ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsubject . get Movies By Category ( category ) Ġ} Ġreturns Ġby Category Movies ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( by Category Movies , Ġsubject . get Movies By Search Type ( by Category )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġget Movies By Search Type Ġis Ġcalled Ġwith Ġtype ĠBy Phrase ĠTHEN Ġreturns Ġresult Ġof Ġget Movies By Phrase `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġby Phrase Movies Ġ= Ġmock k < List < Movie >>() ĊĠĠĠĠĠĠĠ Ġval Ġby Phrase Ġ= Ġmock k < Type . By Phrase >() ĊĠĠĠĠĠĠĠ Ġval Ġphrase Ġ= Ġ" query Ġphrase " ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġby Phrase . phrase Ġ} Ġreturns Ġphrase ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsubject . get Movies By Phrase ( phrase ) Ġ} Ġreturns Ġby Phrase Movies ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( by Phrase Movies , Ġsubject . get Movies By Search Type ( by Phrase )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġget Movies By Category Ġis Ġcalled Ġwith Ġcategory ĠALL ĠTHEN Ġreturns Ġall Ġmovies `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( movies , Ġsubject . get Movies By Category ( Movie Category . ALL )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġget Movies By Category Ġis Ġcalled Ġwith Ġcategory ĠF AV OR ITE ĠTHEN Ġreturns Ġfavour ite Ġmovies `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmovies . filter Ġ{ Ġit . is Favorite Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubject . get Movies By Category ( Movie Category . FA V OR ITE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġget Movies By Phrase Ġis Ġcalled Ġwith Ġphrase Ġ'' ĠTHEN Ġreturns Ġfiltered Ġmovies `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( movies , Ġsubject . get Movies By Phrase ("")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġfilter By Gen res Ġis Ġcalled Ġwith ĠMovie Genre All ĠTHEN Ġreturns Ġall Ġmovies `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( movies , Ġmovies . filter By Gen res ( empty Set ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġfilter By Gen res Ġis Ġcalled Ġwith Ġspecific Ġgenre ĠTHEN Ġreturns Ġfiltered Ġmovies `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenum Values < Movie Genre >(). forEach Ġ{ Ġgenre Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies . filter Ġ{ Ġit . genres . contains ( genre ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies . filter By Gen res ( set Of ( genre )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġpage Ġ 0 Ġon Ġnon Ġempty ĠTHEN Ġreturns ĠFailure Ġwith ĠError Ġcause Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Failure ( Failure Cause . Error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies . page d Result ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġpage Ġ 0 Ġon Ġempty Ġmovies ĠTHEN Ġreturns ĠSuccess Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Pages Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List < Movie >(). page d Result ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġpage Ġ 1 Ġon Ġnon Ġempty Ġmovies ĠTHEN Ġreturns ĠSuccess Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġmovies . sub List ( 0 , Ġmovies PerPage ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Pages Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ= Ġpages ( movies . size ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies . page d Result ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġpage Ġ 2 Ġon Ġnon Ġempty Ġmovies ĠTHEN Ġreturns ĠSuccess Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġmovies . sub List ( movies PerPage , Ġmovies PerPage Ġ* Ġ 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Pages Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ= Ġpages ( movies . size ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmovies . page d Result ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġpage Ġ 1 Ġon Ġ 1 Ġelements Ġlist ĠTHEN Ġreturns ĠSuccess Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Movies Ġ= Ġmovies . sub List ( 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġtest Movies . sub List ( 0 , Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Pages Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Movies . page d Result ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġpage Ġ 1 Ġon Ġmovies PerPage Ġelements Ġlist ĠTHEN Ġreturns ĠSuccess Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Movies Ġ= Ġmovies . sub List ( 0 , Ġmovies PerPage ) ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġtest Movies . sub List ( 0 , Ġmovies PerPage ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Pages Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Movies . page d Result ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġpage Ġ 2 Ġon Ġmovies PerPage Ġ+ Ġ 1 Ġelements Ġlist ĠTHEN Ġreturns ĠSuccess Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Movies Ġ= Ġmovies . sub List ( 0 , Ġmovies PerPage Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Success ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMovie List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems Ġ= Ġtest Movies . sub List ( movies PerPage , Ġmovies PerPage Ġ+ Ġ 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloaded Pages Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Pages Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Movies . page d Result ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġpage Ġ 1 Ġon Ġempty Ġlist ĠTHEN Ġreturns ĠFailure Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Movies Ġ= Ġempty List < Movie >() ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Failure ( cause Ġ= ĠFailure Cause . Error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Movies . page d Result ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` WHEN Ġpage d Result Ġis Ġcalled Ġwith Ġtotal Ġpage Ġ+ Ġ 1 Ġon Ġnon Ġempty Ġlist ĠTHEN Ġreturns ĠFailure Ġresult `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtest Movies Ġ= Ġmovies ĊĠĠĠĠĠĠĠ Ġwith ( subject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQuery Result . Failure ( cause Ġ= ĠFailure Cause . Error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Movies . page d Result ( pages ( test Movies . size ) Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpages ( items Count : ĠInt ) Ġ= Ġ( items Count Ġ- Ġ 1 ) Ġ/ Ġmovies PerPage Ġ+ Ġ 1 Ċ }