import Ġen chant . flare .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlin . random . Random Ċ import Ġkotlin . test .* Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ class ĠFire store Test : ĠFl are Test () Ġ{ ĊĊĠĠĠ Ġval Ġfire store Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( use Local ) ĠLocal Fire store () Ġelse ĠFirebase Fire store . instance ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Get Once () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / set Get Once / eth an ", Ġeth an ) ĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠDog Ġ= Ġfire store . getDocument Once (" test /$ test Id / set Get Once / eth an "). data () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Once Null () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠDog ? Ġ= Ġfire store . getDocument Once OrNull (" test / data ") ?. data () ĊĠĠĠĠĠĠĠ ĠassertNull ( data ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġset Get Once All Types () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / get Set All / my Data ", Ġmy Data ) ĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠMy Data Ġ= Ġfire store . getDocument Once (" test /$ test Id / get Set All / my Data "). data () ĊĠĠĠĠĠĠĠ ĠassertEquals ( my Data . map , Ġdata . map ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmy Data . toString (). replace (" map = \\ { .* \\ )\\ }, ". to Regex (), Ġ""), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . toString (). replace (" map = \\ { .* \\ )\\ }, ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Set Multiple () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / get Set Multiple / me gan ", Ġme gan ) ĊĠĠĠĠĠĠĠ Ġvar Ġupdates Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfire store . getDocument (" test /$ test Id / get Set Multiple / me gan "). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdates ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdog : ĠDog Ġ= Ġit . data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( dog . name , Ġ" Me gan ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / get Set Multiple / me gan ", Ġme gan ) ĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġupdates ) ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / get Set Multiple / me gan ", Ġme gan . copy ( age Ġ= Ġ 3 )) ĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġupdates ) ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġupdate (): ĠUnit Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / update / me gan ", Ġme gan ) ĊĠĠĠĠĠĠĠ Ġfire store . update Document (" test /$ test Id / update / me gan ", Ġmap Of (" age " Ġto Ġ 5 L )) ĊĠĠĠĠĠĠĠ Ġval Ġage Ġ= Ġfire store . getDocument Once (" test /$ test Id / update / me gan "). data < Dog >(). age ĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġage ) ĊĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfire store . update Document (" test /$ test Id / update / invalid ", Ġmap Ġ= Ġmap Of < String , ĠAny >()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠFire store Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdelete (): ĠUnit Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / delete / me gan ", Ġme gan ) ĊĠĠĠĠĠĠĠ Ġfire store . delete Document (" test /$ test Id / delete / me gan ") ĊĠĠĠĠĠĠĠ Ġdelay ( 5 0 0 ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfire store . getDocument Once (" test /$ test Id / delete / me gan ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfail () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠFire store Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Collection Once () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ ĠlistOf ( ha iley , Ġm ichael , Ġj erry ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / dog s /${ it . name }", Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdo gs : ĠList < Dog > Ġ= Ġfire store . get Collection Once (" test /$ test Id / dog s "). data () ĊĠĠĠĠĠĠĠ ĠlistOf ( ha iley , Ġm ichael , Ġj erry ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Contains ( dog s , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Collection () Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġupdates Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfire store . get Collection (" test /${ test Id }/ dog s "). collect Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdates ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdo gs : ĠList < Dog > Ġ= Ġit . data () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( updates , Ġdo gs . size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( dog s . all Ġ{ Ġit . name Ġin Ġset Of (" Ha iley ", Ġ" Michael ", Ġ" J erry ") Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / dog s / Ha iley ", Ġha iley . copy ( age Ġ= ĠRandom . nextInt ())) ĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / dog s / Michael ", Ġm ichael . copy ( age Ġ= ĠRandom . nextInt ())) ĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ Ġfire store . set Document (" test /$ test Id / dog s / J erry ", Ġj erry . copy ( age Ġ= ĠRandom . nextInt ())) ĊĠĠĠĠĠĠĠ Ġyield () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġupdates ) ĊĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdoes Throw (): ĠUnit Ġ= Ġrun Test Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfire store . delete Document (" test /${ test Id }/ blank k / hi ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠDog ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġage : ĠInt , ĊĠĠĠĠĠĠĠ Ġval Ġfriends : ĠList < Dog >? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġval Ġha iley Ġ= ĠDog (" Ha iley ", Ġ 1 ) ĊĠĠĠ Ġval Ġm ichael Ġ= ĠDog (" Michael ", Ġ 9 ) ĊĠĠĠ Ġval Ġj erry Ġ= ĠDog (" J erry ", Ġ 3 ) ĊĠĠĠ Ġval Ġme gan Ġ= ĠDog (" Me gan ", Ġ 2 ) ĊĠĠĠ Ġval Ġmark Ġ= ĠDog (" Mark ", ĠInt . MAX _ VALUE ) ĊĊĠĠĠ Ġval Ġk ate Ġ= ĠDog (" K ate ", Ġ 4 , ĠlistOf ( ha iley , Ġm ichael )) ĊĠĠĠ Ġval Ġk el ley Ġ= ĠDog (" Kel ley ", Ġ 8 ) ĊĠĠĠ Ġval Ġray Ġ= ĠDog (" Ray ", Ġ 4 , ĠlistOf ( j erry , Ġme gan , Ġmark )) ĊĊĠĠĠ Ġval Ġeth an Ġ= ĠDog (" E than ", Ġ 1 0 , ĠlistOf ( k ate , Ġk el ley , Ġray )) Ċ } ĊĊ