package Ġcom . github . alf ab r avo 2 0 1 3 . mar vel characters . domain . characters Ċ Ċ import Ġcom . github . alf ab r avo 2 0 1 3 . mar vel characters . Cor outines Test Extension Ċ import Ġcom . github . alf ab r avo 2 0 1 3 . mar vel characters . Instant Executor Extension Ċ import Ġcom . github . alf ab r avo 2 0 1 3 . mar vel characters . networking . Mar vel Api Ċ import Ġcom . github . alf ab r avo 2 0 1 3 . mar vel characters . networking . model . Character Data Container Ċ import Ġcom . github . alf ab r avo 2 0 1 3 . mar vel characters . networking . model . Character Data Wrapper Ċ import Ġcom . github . alf ab r avo 2 0 1 3 . mar vel characters . networking . model . ImageUrl Ċ import Ġcom . github . alf ab r avo 2 0 1 3 . mar vel characters . networking . model . Mar vel Character Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . mock k Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . DisplayName Ċ import Ġorg . junit . jupiter . api . Nested Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ import Ġorg . junit . jupiter . api . extension . Extend With Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNull Ċ import Ġkotlin . test . assertTrue Ċ Ċ @ Experimental Cor outines Api Ċ @ Extend With ( Instant Executor Extension :: class , ĠCor outines Test Extension :: class ) Ċ @ DisplayName (" Characters ĠRemote ĠData ĠSource ĠTests ") Ċ internal Ġclass ĠChar acters Local DataSource Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmar vel Api Ġ= Ġmock k < Mar vel Api >() ĊĠĠĠ Ġprivate Ġval Ġcharacters Remote DataSource Ġ= ĠChar acters Remote DataSource ( mar vel Api ) ĊĊĠĠĠ Ġprivate Ġval ĠpageSize Ġ= Ġ 2 ĊĠĠĠ Ġprivate Ġval Ġtotal Ġ= Ġ 4 ĊĠĠĠ Ġprivate Ġval Ġmar vel Character Ġ= ĠMar vel Character ( ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" name ", ĊĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ" description ", ĊĠĠĠĠĠĠĠ Ġthumbnail Ġ= ĠImage Url ( path Ġ= Ġ" path ", Ġextension Ġ= Ġ" extension ") ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġpage Results Ġ= ĠlistOf ( mar vel Character , Ġmar vel Character ) ĊĠĠĠ Ġprivate Ġval Ġpartial Results Ġ= ĠlistOf ( mar vel Character ) ĊĊĠĠĠ Ġprivate Ġval Ġfirst Page Container Ġ= ĠCharacter Data Container ( ĊĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġlimit Ġ= ĠpageSize , ĊĠĠĠĠĠĠĠ Ġtotal Ġ= Ġtotal , ĊĠĠĠĠĠĠĠ Ġcount Ġ= Ġpage Results . size , ĊĠĠĠĠĠĠĠ Ġresults Ġ= Ġpage Results ĊĠĠĠ Ġ) ĊĠĠĠ Ġprivate Ġval Ġfirst Page Wrapper Ġ= ĠCharacter Data Wrapper ( ĊĠĠĠĠĠĠĠ Ġcode Ġ= Ġ 2 0 0 , ĊĠĠĠĠĠĠĠ Ġstatus Ġ= Ġ" Ok ", ĊĠĠĠĠĠĠĠ Ġdata Ġ= Ġfirst Page Container ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġsecond Page Container Ġ= Ġfirst Page Container . copy ( offset Ġ= ĠpageSize ) ĊĠĠĠ Ġprivate Ġval Ġsecond Page Wrapper Ġ= Ġfirst Page Wrapper . copy ( data Ġ= Ġsecond Page Container ) ĊĊĠĠĠ Ġprivate Ġval Ġbad Response Ġ= ĠCharacter Data Wrapper ( ĊĠĠĠĠĠĠĠ Ġcode Ġ= Ġ 4 0 9 , ĊĠĠĠĠĠĠĠ Ġstatus Ġ= Ġ" bad ", ĊĠĠĠĠĠĠĠ Ġdata Ġ= ĠCharacter Data Container ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠpageSize , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ= Ġtotal , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ= Ġempty List () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( or ( less ( 0 ), Ġmore ( total )), Ġany ()) ĊĠĠĠĠĠĠĠ Ġ} Ġreturns Ġbad Response ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ DisplayName (" When Ġrequesting Ġany Ġpage ") ĊĠĠĠ Ġinner Ġclass ĠApi Method Calls Tests Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġquery Text Ġis Ġempty , Ġthen Ġapi Ġcalled Ġwithout Ġquery ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Page No Query () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} Ġreturns Ġfirst Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Remote DataSource . getFirst Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġquery Text Ġis Ġnot Ġempty , Ġthen Ġapi Ġcalled Ġwith Ġquery ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Page With Query () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize , Ġ" query ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġfirst Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Remote DataSource . update Query Text (" query ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Remote DataSource . getFirst Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize , Ġ" query ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ DisplayName (" When Ġrequesting Ġfirst Ġpage ") ĊĠĠĠ Ġinner Ġclass ĠFirst Page Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given ĠpageSize Ġ== Ġ 2 , Ġthen Ġreturn Ġlist . size Ġ== Ġ 2 ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest First Page List Size () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} Ġreturns Ġfirst Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getFirst Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( page Results . size , Ġresult . characters . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġany Ġoffset , Ġthen Ġprev Offset Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest First Page Prev Offset () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} Ġreturns Ġfirst Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getFirst Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . prev Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġany Ġoffset , Ġthen Ġnext Offset Ġ== ĠpageSize ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest First Page Next Offset () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} Ġreturns Ġfirst Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getFirst Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( pageSize , Ġresult . next Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġresults . size Ġ< ĠpageSize , Ġthen Ġnext Offset Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest First Page Partial List () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġfirst Page Wrapper . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġfirst Page Container . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġpartial Results . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ= Ġpartial Results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getFirst Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( partial Results . size , Ġresult . characters . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . next Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġresults . size Ġ== Ġtotal , Ġthen Ġnext Offset Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest First Page All F etched () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġfirst Page Wrapper . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġfirst Page Container . copy ( results Ġ= Ġpage Results Ġ+ Ġpage Results ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getFirst Page ( pageSize Ġ* Ġ 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( total , Ġresult . characters . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . next Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize Ġ* Ġ 2 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ DisplayName (" When Ġrequesting Ġnext Ġpage ") ĊĠĠĠ Ġinner Ġclass ĠNext Page Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given ĠpageSize Ġ== Ġ 2 , Ġthen Ġreturn Ġpage . size Ġ== Ġ 2 ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Second Page List Size () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( pageSize , ĠpageSize ) Ġ} Ġreturns Ġsecond Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getNext Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( pageSize , Ġresult . characters . size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( pageSize , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġoffset Ġ== Ġ 0 , Ġthen Ġprev Offset Ġ== Ġ 0 ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Second Page Prev Offset () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( pageSize , ĠpageSize ) Ġ} Ġreturns Ġsecond Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getNext Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġresult . prev Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( pageSize , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġoffset Ġ== Ġ 0 , Ġthen Ġnext Offset Ġ== ĠpageSize Ġ* Ġ 2 ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Second Page Next Offset () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( pageSize , ĠpageSize ) Ġ} Ġreturns Ġsecond Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getNext Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( pageSize Ġ* Ġ 2 , Ġresult . next Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( pageSize , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġresults . size Ġ< ĠpageSize , Ġthen Ġnext Offset Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Second Page Partial List () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( pageSize , ĠpageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġsecond Page Wrapper . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġsecond Page Container . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġpartial Results . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ= Ġpartial Results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getNext Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( result . characters . size Ġ< ĠpageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( partial Results . size , Ġresult . characters . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . next Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmar vel Api . get Characters Page ( pageSize , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġoffset Ġ+ ĠpageSize Ġ> Ġtotal , Ġthen Ġnext Offset Ġis Ġnull ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Second Page B ey ond Total () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( total Ġ- Ġ 1 , ĠpageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġsecond Page Wrapper . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= Ġsecond Page Container . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġtotal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= ĠpageSize , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ= Ġtotal , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġpartial Results . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ= Ġpartial Results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . getNext Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( partial Results . size , Ġresult . characters . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . next Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( total Ġ- ĠpageSize , Ġresult . prev Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmar vel Api . get Characters Page ( total Ġ- Ġ 1 , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ DisplayName (" When Ġrequesting Ġprevious Ġpage ") ĊĠĠĠ Ġinner Ġclass ĠPre v Page Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġoffset Ġ== Ġ 0 , Ġthen Ġreturn Ġempty Ġlist ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Prev Page From Offset Zero () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( range ( 0 , Ġtotal ), Ġless ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġbad Response ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Mar vel Api . BadRequest Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Remote DataSource . get Prev Page ( pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmar vel Api . get Characters Page ( 0 , Ġ 0 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġoffset Ġ== Ġ 3 Ġand ĠpageSize Ġ== Ġ 4 , Ġreturn Ġlist . size Ġ== Ġ 3 ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Prev Page From Offset One () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( 1 , Ġ 1 ) Ġ} Ġreturns Ġsecond Page Wrapper . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠCharacter Data Container ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ= Ġ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ= Ġpartial Results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( 0 , Ġ 1 ) Ġ} Ġreturns Ġfirst Page Wrapper . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠCharacter Data Container ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlimit Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Ġ= Ġ 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresults Ġ= Ġpartial Results ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Remote DataSource . getNext Page ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . get Prev Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( partial Results . size , Ġresult . characters . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . prev Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġresult . next Offset ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( 1 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( 0 , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġoffset Ġ== Ġ 2 Ġand ĠpageSize Ġ== Ġ 2 , Ġreturn Ġlist Ġof Ġtwo ") ĊĠĠĠĠĠĠĠ Ġfun Ġrequest Previous Page After Next Page () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( 2 , ĠpageSize ) Ġ} Ġreturns Ġsecond Page Wrapper ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} Ġreturns Ġfirst Page Wrapper ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Remote DataSource . getNext Page ( pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcharacters Remote DataSource . get Prev Page ( pageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( pageSize , Ġresult . characters . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( result . prev Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( result . next Offset , ĠpageSize ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( 2 , ĠpageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Nested ĊĠĠĠ Ġ@ DisplayName (" Bad Ġresponses ") ĊĠĠĠ Ġinner Ġclass ĠBad Response Tests Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġcode Ġ 4 0 9 , Ġthen Ġthrow ĠMar vel Api . BadRequest Exception ") ĊĠĠĠĠĠĠĠ Ġfun Ġbad Request Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġmar vel Api . get Characters Page ( any (), Ġany ()) Ġ} Ġreturns Ġbad Response ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Mar vel Api . BadRequest Exception > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Remote DataSource . getFirst Page ( pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Test ĊĠĠĠĠĠĠĠ Ġ@ DisplayName (" Given Ġcode Ġis Ġnot Ġ 2 0 0 Ġor Ġ 4 0 9 , Ġthen Ġthrow ĠMar vel Api . ApiException ") ĊĠĠĠĠĠĠĠ Ġfun Ġapi Error Test () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Every Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmar vel Api . get Characters Page ( any (), Ġany ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġreturns Ġbad Response . copy ( code Ġ= Ġ 5 0 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThrows < Mar vel Api . ApiException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharacters Remote DataSource . getFirst Page ( pageSize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġmar vel Api . get Characters Page ( 0 , ĠpageSize ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ