package Ġcom . github . ash ut osh g ng wr . no ice . repository Ċ Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġcom . github . ash ut osh g ng wr . no ice . model . Preset Ċ import Ġcom . github . ash ut osh g ng wr . no ice . model . Sound Ċ import Ġcom . github . ash ut osh g ng wr . no ice . playback . Player Ċ import Ġio . mock k . Mock K Annotations Ċ import Ġio . mock k . every Ċ import Ġio . mock k . impl . annotations . Injection Lookup Type Ċ import Ġio . mock k . impl . annotations . Override Mock Ks Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . mock k Static Ċ import Ġio . mock k . slot Ċ import Ġio . mock k . un mock k All Ċ import Ġio . mock k . verify Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . sky sc ream er . json assert . JSON Assert Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . util .* Ċ import Ġkotlin . math . round ToInt Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ class ĠP reset Repository Test Ġ{ ĊĊĠ Ġprivate Ġlateinit Ġvar Ġprefs : ĠSharedPreferences ĊĠ Ġprivate Ġlateinit Ġvar Ġprefs Editor : ĠSharedPreferences . Editor ĊĊĠ Ġ@ Override Mock Ks ( Injection Lookup Type . BY _ NAME ) ĊĠ Ġprivate Ġlateinit Ġvar Ġrepository : ĠP reset Repository ĊĊĠ Ġ@ Before ĊĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠ Ġprefs Editor Ġ= Ġmock k Ġ{ ĊĠĠĠĠĠ Ġevery Ġ{ Ġput String ( Preset Repository . PREFER ENCE _ KEY , Ġany ()) Ġ} Ġreturns Ġthis ĊĠĠĠĠĠ Ġevery Ġ{ Ġcommit () Ġ} Ġreturns Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprefs Ġ= Ġmock k Ġ{ ĊĠĠĠĠĠ Ġevery Ġ{ Ġedit () Ġ} Ġreturns Ġprefs Editor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġrepository Ġ= ĠP reset Repository . newInstance ( Application Provider . getApplicationContext ()) ĊĠĠĠ ĠMock K Annotations . init ( this ) ĊĠ Ġ} ĊĊĠ Ġ@ After ĊĠ Ġfun Ġteardown () Ġ{ ĊĠĠĠ Ġun mock k All () ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Create () Ġ{ ĊĠĠĠ Ġval Ġpreset 1 Ġ= Ġ""" { ĊĠĠĠĠĠ Ġ" id ": Ġ" test - id - 1 ", ĊĠĠĠĠĠ Ġ" name ": Ġ" test - 1 ", ĊĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠ Ġ" volume ": Ġ 1 7 , ĊĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 4 5 ĊĠĠĠĠĠ Ġ}] ĊĠĠĠ Ġ} """. trim Indent () ĊĊĠĠĠ Ġval Ġpreset 2 Ġ= Ġ""" { ĊĠĠĠĠĠ Ġ" id ": Ġ" test - id - 2 ", ĊĠĠĠĠĠ Ġ" name ": Ġ" test - 2 ", ĊĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠ Ġ" volume ": Ġ 1 7 , ĊĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 4 5 ĊĠĠĠĠĠ Ġ}] ĊĠĠĠ Ġ} """. trim Indent () ĊĊĠĠĠ Ġevery Ġ{ Ġprefs . getString ( Preset Repository . PREFER ENCE _ KEY , Ġany ()) Ġ} Ġreturns Ġ" [$ preset 1 ]" ĊĠĠĠ Ġrepository . create ( mock k Ġ{ ĊĠĠĠĠĠ Ġevery Ġ{ Ġid Ġ} Ġreturns Ġ" test - id - 2 " ĊĠĠĠĠĠ Ġevery Ġ{ Ġname Ġ} Ġreturns Ġ" test - 2 " ĊĠĠĠĠĠ Ġevery Ġ{ Ġplayer States Ġ} Ġreturns ĠarrayOf ( mock k Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsound Key Ġ} Ġreturns Ġ" test - 1 " ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġvolume Ġ} Ġreturns Ġ 1 7 ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġtime Period Ġ} Ġreturns Ġ 4 5 ĊĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġval Ġjson Slot Ġ= Ġslot < String >() ĊĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġprefs Editor . putString ( Preset Repository . PREFER ENCE _ KEY , Ġcapture ( json Slot )) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠJSON Assert . assertEquals (" [$ preset 1 , Ġ$ preset 2 ]", Ġjson Slot . captured , Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest List () Ġ{ ĊĠĠĠ Ġevery Ġ{ Ġprefs . getString ( Preset Repository . PREFER ENCE _ KEY , Ġany ()) Ġ} Ġreturns Ġ""" ĊĠĠĠĠĠĠĠ Ġ[{ ĊĠĠĠĠĠĠĠĠĠ Ġ" id ": Ġ" test - id - 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" name ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 6 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" volume ": Ġ 1 5 ĊĠĠĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠ Ġ""" ĊĊĠĠĠ Ġval Ġpresets Ġ= Ġrepository . list () ĊĠĠĠ ĠassertEquals ( 1 , Ġpresets . size ) ĊĠĠĠ ĠassertEquals (" test - id - 1 ", Ġpresets [ 0 ]. id ) ĊĠĠĠ ĠassertEquals (" test - 1 ", Ġpresets [ 0 ]. name ) ĊĠĠĠ ĠassertEquals ( 1 , Ġpresets [ 0 ]. player States . size ) ĊĠĠĠ ĠassertEquals ( presets [ 0 ]. player States [ 0 ], ĠP reset . Player State (" test - 1 ", Ġ 1 5 , Ġ 6 0 )) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun ĠtestGet () Ġ{ ĊĠĠĠ Ġevery Ġ{ Ġprefs . getString ( Preset Repository . PREFER ENCE _ KEY , Ġany ()) Ġ} Ġreturns Ġ""" ĊĠĠĠĠĠ Ġ[{ ĊĠĠĠĠĠĠĠ Ġ" id ": Ġ" test - id - 1 ", ĊĠĠĠĠĠĠĠ Ġ" name ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 3 0 , ĊĠĠĠĠĠĠĠĠĠ Ġ" volume ": Ġ 1 5 ĊĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġ" id ": Ġ" test - id - 2 ", ĊĠĠĠĠĠĠĠ Ġ" name ": Ġ" test - 2 ", ĊĠĠĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 3 0 , ĊĠĠĠĠĠĠĠĠĠ Ġ" volume ": Ġ 1 5 ĊĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠ Ġ}] ĊĠĠĠ Ġ""" ĊĊĠĠĠ ĠassertNull ( repository . get (" test - id - 0 ")) ĊĠĠĠ ĠassertNotNull ( repository . get (" test - id - 1 ")) ĊĠĠĠ ĠassertNotNull ( repository . get (" test - id - 2 ")) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Random () Ġ{ ĊĠĠĠ Ġfor Ġ( tag Ġin ĠarrayOf ( null , ĠSound . Tag . FOCUS , ĠSound . Tag . REL AX )) Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( intensity Ġin ĠarrayOf ( 2 Ġuntil Ġ 5 , Ġ 6 Ġuntil Ġ 9 , Ġ 1 Ġuntil Ġ 3 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpreset Ġ= Ġrepository . random ( tag , Ġintensity ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠ Ġ" should Ġhave Ġexpected Ġintensity ", ĊĠĠĠĠĠĠĠĠĠ Ġpreset . player States . size Ġin Ġintensity ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġpreset . player States . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" should Ġhave Ġexpected Ġsound Ġtags ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ== Ġnull Ġ|| ĠSound . get ( it . sound Key ). tags . contains ( tag ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Update () Ġ{ ĊĠĠĠ Ġevery Ġ{ Ġprefs . getString ( Preset Repository . PREFER ENCE _ KEY , Ġany ()) Ġ} Ġreturns Ġ""" [{ ĊĠĠĠĠĠ Ġ" id ": Ġ" test - id - 1 ", ĊĠĠĠĠĠ Ġ" name ": Ġ" test - 1 ", ĊĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 3 0 , ĊĠĠĠĠĠĠĠ Ġ" volume ": Ġ 1 5 ĊĠĠĠĠĠ Ġ}] ĊĠĠĠ Ġ}] """. trim Indent () ĊĊĠĠĠ Ġrepository . update ( mock k Ġ{ ĊĠĠĠĠĠ Ġevery Ġ{ Ġid Ġ} Ġreturns Ġ" test - id - 1 " ĊĠĠĠĠĠ Ġevery Ġ{ Ġname Ġ} Ġreturns Ġ" updated - name " ĊĠĠĠĠĠ Ġevery Ġ{ Ġplayer States Ġ} Ġreturns Ġempty Array () ĊĠĠĠ Ġ}) ĊĊĠĠĠ Ġval Ġjson Slot Ġ= Ġslot < String >() ĊĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġprefs Editor . putString ( Preset Repository . PREFER ENCE _ KEY , Ġcapture ( json Slot )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġexpected JSON Ġ= Ġ""" [{ ĊĠĠĠĠĠ Ġ" id ": Ġ" test - id - 1 ", ĊĠĠĠĠĠ Ġ" name ": Ġ" updated - name ", ĊĠĠĠĠĠ Ġ" player States ": Ġ[] ĊĠĠĠ Ġ}] """. trim Indent () ĊĊĠĠĠ ĠJSON Assert . assertEquals ( expected JSON , Ġjson Slot . captured , Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Delete () Ġ{ ĊĠĠĠ Ġval Ġpreset 1 Ġ= Ġ""" { ĊĠĠĠĠĠ Ġ" id ": Ġ" test - id - 1 ", ĊĠĠĠĠĠ Ġ" name ": Ġ" test - 1 ", ĊĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 3 0 , ĊĠĠĠĠĠĠĠ Ġ" volume ": Ġ 1 5 ĊĠĠĠĠĠ Ġ}] ĊĠĠĠ Ġ} """. trim Indent () ĊĊĠĠĠ Ġval Ġpreset 2 Ġ= Ġ""" { ĊĠĠĠĠĠ Ġ" id ": Ġ" test - id - 2 ", ĊĠĠĠĠĠ Ġ" name ": Ġ" test - 2 ", ĊĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 3 0 , ĊĠĠĠĠĠĠĠ Ġ" volume ": Ġ 1 5 ĊĠĠĠĠĠ Ġ}] ĊĠĠĠ Ġ} """. trim Indent () ĊĊĠĠĠ Ġevery Ġ{ ĊĠĠĠĠĠ Ġprefs . getString ( Preset Repository . PREFER ENCE _ KEY , Ġany ()) ĊĠĠĠ Ġ} Ġreturns Ġ" [$ preset 1 , Ġ$ preset 2 ]" ĊĊĠĠĠ Ġrepository . delete (" test - id - 1 ") ĊĊĠĠĠ Ġval Ġjson Slot Ġ= Ġslot < String >() ĊĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġprefs Editor . putString ( Preset Repository . PREFER ENCE _ KEY , Ġcapture ( json Slot )) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠJSON Assert . assertEquals (" [$ preset 2 ]", Ġjson Slot . captured , Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Export To () Ġ{ ĊĠĠĠ Ġval Ġpre setData Ġ= Ġ" test - data " ĊĠĠĠ Ġevery Ġ{ Ġprefs . getString ( Preset Repository . PREFER ENCE _ KEY , Ġany ()) Ġ} Ġreturns Ġpre setData ĊĠĠĠ Ġval Ġstream Ġ= ĠByteArrayOutputStream () ĊĠĠĠ Ġrepository . export To ( stream ) ĊĊĠĠĠ Ġval Ġexpected Output Ġ= Ġ""" { ĊĠĠĠĠĠ Ġ"${ Preset Repository . EXPORT _ VERSION _ KEY } ": Ġ"${ Preset Repository . PREFER ENCE _ KEY }", ĊĠĠĠĠĠ Ġ"${ Preset Repository . EXPORT _ DATA _ KEY } ": Ġ"$ pre setData " ĊĠĠĠ Ġ} """. trim Indent () ĊĠĠĠ ĠJSON Assert . assertEquals ( expected Output , Ġstream . toString (), Ġtrue ) ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġimport From () Ġ{ ĊĠĠĠ Ġval Ġpre setData Ġ= Ġ" test - data " ĊĠĠĠ Ġval Ġinput Ġ= Ġ""" { ĊĠĠĠĠĠ Ġ"${ Preset Repository . EXPORT _ VERSION _ KEY } ": Ġ"${ Preset Repository . PREFER ENCE _ KEY }", ĊĠĠĠĠĠ Ġ"${ Preset Repository . EXPORT _ DATA _ KEY } ": Ġ"$ pre setData " ĊĠĠĠ Ġ} """ ĊĊĠĠĠ Ġevery Ġ{ Ġprefs . getString ( any (), Ġany ()) Ġ} Ġreturns Ġnull ĊĠĠĠ Ġrepository . import From ( ByteArray InputStream ( input . toByteArray ())) ĊĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġprefs Editor . putString ( Preset Repository . PREFER ENCE _ KEY , Ġpre setData ) Ġ} ĊĠ Ġ} ĊĊĠ Ġ@ Test ĊĠ Ġfun Ġtest Migrate To V 1 () Ġ{ ĊĠĠĠ Ġevery Ġ{ Ġprefs Editor . remove ( Preset Repository . PRE F _ V 0 ) Ġ} Ġreturns Ġprefs Editor ĊĠĠĠ Ġevery Ġ{ Ġprefs . getString ( Preset Repository . PRE F _ V 0 , Ġany ()) Ġ} Ġreturns Ġ""" ĊĠĠĠĠĠĠĠ Ġ[{ ĊĠĠĠĠĠĠĠĠĠ Ġ" a ": Ġ" test ", ĊĠĠĠĠĠĠĠĠĠ Ġ" b ": Ġ[{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" a ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" c ": Ġ 3 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" b ": Ġ 0 . 7 5 ĊĠĠĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠ Ġ""" ĊĊĠĠĠ Ġ// Ġmock ĠUUID Ġclasses Ġsince Ġid Ġwill Ġget Ġgenerated Ġon Ġmigration ĊĠĠĠ Ġval Ġmock UUID Ġ= Ġmock k < UUID >( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġevery Ġ{ Ġmock UUID . toString () Ġ} Ġreturns Ġ" test - id " ĊĠĠĠ Ġmock k Static ( UUID :: class ) ĊĠĠĠ Ġevery Ġ{ ĠUUID . randomUUID () Ġ} Ġreturns Ġmock UUID ĊĊĠĠĠ Ġval Ġexpected V 1 JSON Ġ= Ġ""" ĊĠĠĠĠĠ Ġ[{ ĊĠĠĠĠĠĠĠ Ġ" id ": Ġ" test - id ", ĊĠĠĠĠĠĠĠ Ġ" name ": Ġ" test ", ĊĠĠĠĠĠĠĠ Ġ" player States ": Ġ[{ ĊĠĠĠĠĠĠĠĠĠ Ġ" sound Key ": Ġ" test - 1 ", ĊĠĠĠĠĠĠĠĠĠ Ġ" time Period ": Ġ 6 0 , ĊĠĠĠĠĠĠĠĠĠ Ġ" volume ": Ġ${ ( 0 . 7 5 f Ġ* ĠPlayer . MAX _ VOLUME ). round ToInt ()} ĊĠĠĠĠĠĠĠ Ġ}] ĊĠĠĠĠĠ Ġ}] ĊĠĠĠ Ġ""" ĊĊĠĠĠ Ġrepository . migrate To V 1 () ĊĊĠĠĠ Ġval Ġjson Slot Ġ= Ġslot < String >() ĊĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġprefs Editor . remove ( Preset Repository . PRE F _ V 0 ) ĊĠĠĠĠĠ Ġprefs Editor . putString ( Preset Repository . PRE F _ V 1 , Ġcapture ( json Slot )) ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠJSON Assert . assertEquals ( expected V 1 JSON , Ġjson Slot . captured , Ġtrue ) ĊĠ Ġ} Ċ } Ċ