package Ġcom . kin . eco system . core . data . blockchain Ċ Ċ import Ġcom . kin . eco system . common . Observer Ċ import Ġcom . kin . eco system . common . exception . Blockchain Exception Ċ import Ġcom . kin . eco system . common . model . Balance Ċ import Ġcom . kin . eco system . core . bi . Event Logger Ċ import Ġcom . kin . eco system . core . bi . events . S pend Transaction Broadcast To Blockchain Failed Ċ import Ġcom . kin . eco system . core . bi . events . S pend Transaction Broadcast To Blockchain Succeeded Ċ import Ġcom . kin . eco system . core . data . auth . Auth DataSource Ċ import Ġcom . n ha ar man . mock it ok otlin 2 .* Ċ import Ġkin . eco system . test . base . Base TestClass Ċ import Ġkin . sdk . migration . Migration Manager Ċ import Ġkin . sdk . migration . common . Kin Sdk Version Ċ import Ġkin . sdk . migration . common . interfaces .* Ċ import Ġkin . utils . Request Ċ import Ġkin . utils . Result Callback Ċ 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 . ro bo lectric . annotation . Config Ċ import Ġjava . math . BigDecimal Ċ Ċ @ Config ( manifest Ġ= ĠConfig . NONE ) Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ class ĠBlock chain Source Impl Test () Ġ: ĠBase TestClass () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠK IN _ USER _ ID _ A Ġ= Ġ" kin _ user _ id _ A " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPUBLIC _ ADDRESS _ A Ġ= Ġ" public _ address _ A " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠK IN _ USER _ ID _ B Ġ= Ġ" kin _ user _ id _ B " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠPUBLIC _ ADDRESS _ B Ġ= Ġ" public _ address _ B " ĊĊĠĠĠĠĠĠĠ Ġconst Ġval ĠAPP _ ID Ġ= Ġ" app ID " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠORDER _ ID Ġ= Ġ" order ID " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠME MO _ EXAMPLE Ġ= Ġ" 1 -$ APP _ ID -$ ORDER _ ID " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġevent Logger : ĠEvent Logger Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġlocal : ĠBlock chain Source . Local Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġaccount Index Ġ} Ġdo Answer Ġ{ ĠBlock chain Source Local . NOT _ EXIST Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġremote : ĠBlock chain Source . Remote Ġ= Ġmock Ġ{} ĊĊĠĠĠ Ġprivate Ġval Ġauth Repository : ĠAuth DataSource Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġecosystem UserID Ġ} Ġdo Answer Ġ{ ĠK IN _ USER _ ID _ A Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġget Balance Req : ĠRequest < IB alance > Ġ= Ġmock () ĊĠĠĠ Ġprivate Ġval Ġkin Account A : ĠIK in Account Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġbalance Ġ} Ġdo Answer Ġ{ Ġget Balance Req Ġ} ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġpublic Address Ġ} Ġdo Answer Ġ{ ĠPUBLIC _ ADDRESS _ A Ġ} ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġactivate Sync () Ġ} Ġdo Answer Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġkin Account B : ĠIK in Account Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġbalance Ġ} Ġdo Answer Ġ{ Ġget Balance Req Ġ} ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġpublic Address Ġ} Ġdo Answer Ġ{ ĠPUBLIC _ ADDRESS _ B Ġ} ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġactivate Sync () Ġ} Ġdo Answer Ġ{} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġval Ġkin Client : ĠIK in Client Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġadd Account () Ġ} Ġdo Answer Ġ{ Ġkin Account A Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġmigration Manager : ĠMigration Manager Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġget Kin Client ( Ġany OrNull ()) Ġ} Ġdo Answer Ġ{ Ġkin Client Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbalance Obj : ĠI Balance Ġ= Ġmock () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġblockchain Source : ĠBlock chain Source Impl ĊĠĠĠ Ġprivate Ġvar Ġbalance : ĠBalance ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġoverride Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setUp () ĊĠĠĠĠĠĠĠ Ġreset Instance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġreset Instance () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinstance Ġ= ĠBlock chain Source Impl :: class . java . getDeclared Field (" instance ") ĊĠĠĠĠĠĠĠ Ġinstance . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġinstance . set ( null , Ġnull ) ĊĠĠĠĠĠĠĠ ĠBlock chain Source Impl . init ( event Logger , Ġlocal , Ġremote , Ġauth Repository ) ĊĠĠĠĠĠĠĠ ĠBlock chain Source Impl . getInstance (). set Migration Manager ( migration Manager ) ĊĠĠĠĠĠĠĠ Ġblockchain Source Ġ= ĠBlock chain Source Impl . getInstance () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġload Account ( kin Account : ĠIK in Account , Ġpublic Address : ĠString , Ġkin UserId : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( local . getLast Wallet Address ( kin UserId )) Ġdo Answer Ġ{ Ġpublic Address Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . get Account ( 0 )) Ġdo Answer Ġ{ Ġkin Account Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . account Count ) Ġdo Answer Ġ{ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . has Account ()). do Return ( true ) ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . load Account ( kin UserId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` kin Client Ġhas Ġno Ġaccount Ġdo Ġnot Ġinit Ġaccount `() Ġ{ ĊĠĠĠĠĠĠĠ Ġkin Client . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( it , Ġnever ()). has Account () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( it , Ġnever ()). get Account ( any ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` account Index Ġnot Ġexists , Ġskip Ġmigrate , Ġkin Client Ġdon 't Ġhave Ġwallet s , Ġcreate Ġnew Ġaccount `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( local . getLast Wallet Address ( K IN _ USER _ ID _ A )) Ġdo Answer Ġ{ Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . has Account ()). do Return ( false ) ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . load Account ( K IN _ USER _ ID _ A ) ĊĊĠĠĠĠĠĠĠ Ġverify ( kin Client ). add Account () ĊĠĠĠĠĠĠĠ Ġverify ( local ). setActive User Wallet ( K IN _ USER _ ID _ A , ĠPUBLIC _ ADDRESS _ A ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` account Index Ġexists , Ġmigrate To Multiple Users , Ġfound Ġaccount , Ġload Ġrelevant Ġaccount `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( local . account Index ) Ġdo Answer Ġ{ Ġ 0 Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( local . getLast Wallet Address ( K IN _ USER _ ID _ A )) Ġdo Answer Ġ{ ĠPUBLIC _ ADDRESS _ A Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . get Account ( 0 )) Ġdo Answer Ġ{ Ġkin Account A Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . account Count ) Ġdo Answer Ġ{ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . has Account ()). do Return ( true ) ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . load Account ( K IN _ USER _ ID _ A ) ĊĊĠĠĠĠĠĠĠ Ġverify ( kin Client , Ġnever ()). add Account () ĊĠĠĠĠĠĠĠ Ġverify ( local , Ġtimes ( 2 )). setActive User Wallet ( K IN _ USER _ ID _ A , ĠPUBLIC _ ADDRESS _ A ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` account Index Ġnot Ġexists , Ġswitching Ġuser Ġwith Ġno Ġlast Wallet Address , Ġcreate Ġnew Ġaccount `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( local . getLast Wallet Address ( K IN _ USER _ ID _ B )) Ġdo Answer Ġ{ ĠPUBLIC _ ADDRESS _ B Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . get Account ( 0 )) Ġdo Answer Ġ{ Ġkin Account A Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . account Count ) Ġdo Answer Ġ{ Ġ 1 Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . has Account ()). do Return ( true ) ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . add Account ()) Ġdo Answer Ġ{ Ġkin Account B Ġ} ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . load Account ( K IN _ USER _ ID _ B ) ĊĊĠĠĠĠĠĠĠ Ġverify ( kin Client ). add Account () ĊĠĠĠĠĠĠĠ Ġverify ( local ). setActive User Wallet ( K IN _ USER _ ID _ B , ĠPUBLIC _ ADDRESS _ B ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` load Ġlast Ġactive Ġaccount `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkin Account C : ĠIK in Account Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġbalance Ġ} Ġdo Answer Ġ{ Ġget Balance Req Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġpublic Address Ġ} Ġdo Answer Ġ{ Ġ" some _ other _ address " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ġ{ Ġactivate Sync () Ġ} Ġdo Answer Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( local . getLast Wallet Address ( K IN _ USER _ ID _ A )) Ġdo Answer Ġ{ ĠPUBLIC _ ADDRESS _ A Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . get Account ( 0 )) Ġdo Answer Ġ{ Ġkin Account B Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . get Account ( 1 )) Ġdo Answer Ġ{ Ġkin Account C Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . get Account ( 2 )) Ġdo Answer Ġ{ Ġkin Account A Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . account Count ) Ġdo Answer Ġ{ Ġ 3 Ġ} ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Client . has Account ()). do Return ( true ) ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . load Account ( K IN _ USER _ ID _ A ) ĊĊĠĠĠĠĠĠĠ Ġverify ( kin Client , Ġnever ()). add Account () ĊĠĠĠĠĠĠĠ Ġverify ( local ). setActive User Wallet ( K IN _ USER _ ID _ A , ĠPUBLIC _ ADDRESS _ A ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( Blockchain Exception :: class ) ĊĠĠĠ Ġfun Ġ` get Ġpublic Ġaddress `() Ġ{ ĊĠĠĠĠĠĠĠ Ġload Account ( kin Account A , ĠPUBLIC _ ADDRESS _ A , ĠK IN _ USER _ ID _ A ) ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġblockchain Source . public Address ĊĠĠĠĠĠĠĠ ĠassertEquals ( PUBLIC _ ADDRESS _ A , Ġaddress ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` extract Ġorder Ġid `() Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwithout Ġapp Ġid Ġset ĊĠĠĠĠĠĠĠ ĠassertNull ( blockchain Source . extract OrderId (" 1 2 3 ")) ĊĠĠĠĠĠĠĠ ĠassertNull ( blockchain Source . extract OrderId ( ME MO _ EXAMPLE )) ĊĊĠĠĠĠĠĠĠ Ġ// Ġwith Ġapp Ġid ĊĠĠĠĠĠĠĠ Ġwhenever ( auth Repository . app ID ). thenReturn ( APP _ ID ); ĊĠĠĠĠĠĠĠ ĠassertEquals ( ORDER _ ID , Ġblockchain Source . extract OrderId ( ME MO _ EXAMPLE )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` send Ġtransaction Ġsucceeded `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( auth Repository . app ID ). thenReturn ( APP _ ID ); ĊĠĠĠĠĠĠĠ Ġload Account ( kin Account A , ĠPUBLIC _ ADDRESS _ A , ĠK IN _ USER _ ID _ A ) ĊĠĠĠĠĠĠĠ Ġval Ġto Address Ġ= Ġ" some _ pub _ address " ĊĠĠĠĠĠĠĠ Ġval Ġamount Ġ= ĠBigDecimal ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġorder ID Ġ= Ġ" some ID " ĊĠĠĠĠĠĠĠ Ġval Ġtransaction ID Ġ= Ġ" transaction ID " ĊĊĠĠĠĠĠĠĠ Ġval Ġtransaction Request : ĠRequest < IT rans action Id > Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġresult Callback Argument Captor Ġ= Ġargument Captor < Result Callback < IT rans action Id >>() ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Account A . send Transaction ( any (), Ġany (), Ġany (), Ġany ())). thenReturn ( transaction Request ) ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . send Transaction ( to Address , Ġamount , Ġorder ID , Ġ" offer ID ") ĊĠĠĠĠĠĠĠ Ġverify ( transaction Request ). run ( result Callback Argument Captor . capture ()) ĊĠĠĠĠĠĠĠ Ġresult Callback Argument Captor . first Value . on Result ( IT rans action Id Ġ{ Ġtransaction ID Ġ}) ĊĠĠĠĠĠĠĠ Ġverify ( event Logger ). send ( any < S pend Transaction Broadcast To Blockchain Succeeded >()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` send Ġtransaction Ġfailed `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( auth Repository . app ID ). thenReturn ( APP _ ID ); ĊĠĠĠĠĠĠĠ Ġload Account ( kin Account A , ĠPUBLIC _ ADDRESS _ A , ĠK IN _ USER _ ID _ A ) ĊĠĠĠĠĠĠĠ Ġval Ġto Address Ġ= Ġ" some _ pub _ address " ĊĠĠĠĠĠĠĠ Ġval Ġamount Ġ= ĠBigDecimal ( 1 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġorder ID Ġ= Ġ" some ID " ĊĊĠĠĠĠĠĠĠ Ġval Ġtransaction Request : ĠRequest < IT rans action Id > Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġval Ġresult Callback Argument Captor Ġ= Ġargument Captor < Result Callback < IT rans action Id >>() ĊĠĠĠĠĠĠĠ Ġwhenever ( kin Account A . send Transaction ( any (), Ġany (), Ġany (), Ġany ())). thenReturn ( transaction Request ) ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . send Transaction ( to Address , Ġamount , Ġorder ID , Ġ" offer ID ") ĊĠĠĠĠĠĠĠ Ġverify ( transaction Request ). run ( result Callback Argument Captor . capture ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġexception Ġ= ĠException (" failed ") ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . add Payment Observable ( object Ġ: ĠObserver < Payment >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( value : ĠPayment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( value . is Suc ceed ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( order ID , Ġvalue . order ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( exception , Ġvalue . exception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( Payment . UNKNOWN . to Long (), Ġvalue . type . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġresult Callback Argument Captor . first Value . onError ( exception ) ĊĠĠĠĠĠĠĠ Ġverify ( event Logger ). send ( any < S pend Transaction Broadcast To Blockchain Failed >()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` add Ġbalance Ġobserver , Ġget ĠonChanged Ġvalue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġwhenever ( local . balance ). thenReturn ( 2 0 ) ĊĠĠĠĠĠĠĠ Ġload Account ( kin Account A , ĠPUBLIC _ ADDRESS _ A , ĠK IN _ USER _ ID _ A ) ĊĠĠĠĠĠĠĠ Ġval Ġinner Balance : Ġkin . sdk . migration . common . interfaces . IB alance Ġ= Ġmock () ĊĠĠĠĠĠĠĠ Ġblockchain Source . add Balance Observer ( object Ġ: ĠObserver < Balance >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( value : ĠBalance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġfalse ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( BigDecimal ( 2 0 ), Ġbalance ?. amount ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġvalue Ġ= ĠBigDecimal ( 2 5 ) ĊĠĠĠĠĠĠĠ Ġwhenever ( inner Balance . value ()). thenReturn ( value ) ĊĠĠĠĠĠĠĠ Ġblockchain Source . set Balance ( inner Balance ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( value , Ġbalance ?. amount ) ĊĊĠĠĠĠĠĠĠ Ġvalue Ġ= ĠBigDecimal ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġwhenever ( inner Balance . value ()). thenReturn ( value ) ĊĠĠĠĠĠĠĠ Ġblockchain Source . set Balance ( inner Balance ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( value , Ġbalance ?. amount ) ĊĊĠĠĠĠĠĠĠ Ġvalue Ġ= ĠBigDecimal ( 5 0 ) ĊĠĠĠĠĠĠĠ Ġwhenever ( inner Balance . value ()). thenReturn ( value ) ĊĠĠĠĠĠĠĠ Ġblockchain Source . set Balance ( inner Balance ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( value , Ġbalance ?. amount ) ĊĊĠĠĠĠĠĠĠ Ġin Order ( local ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local ). balance Ġ= Ġ 2 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local ). balance Ġ= Ġ 5 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify ( local , Ġnever ()). balance ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` add Ġbalance Ġobserver Ġand Ġstart Ġlisten `() Ġ{ ĊĠĠĠĠĠĠĠ Ġload Account ( kin Account A , ĠPUBLIC _ ADDRESS _ A , ĠK IN _ USER _ ID _ A ) ĊĠĠĠĠĠĠĠ Ġval Ġbalance EventListener Ġ= Ġargument Captor < I EventListener < IB alance >>() ĊĊĠĠĠĠĠĠĠ Ġblockchain Source . add Balance Observer ( object Ġ: ĠObserver < Balance >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonChanged ( value : ĠBalance ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbalance Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġverify ( kin Account A ). add Balance Listener ( balance EventListener . capture ()) ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= ĠBigDecimal ( 1 2 3 ) ĊĊĠĠĠĠĠĠĠ Ġwhenever ( balance Obj . value ()). thenReturn ( value ) ĊĠĠĠĠĠĠĠ Ġbalance EventListener . first Value . on Event ( balance Obj ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( value , Ġbalance ?. amount ) ĊĠĠĠĠĠĠĠ Ġverify ( local ). balance Ġ= Ġvalue . toInt () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` get ĠKey Store Provider Ġis Ġnot Ġnull `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertNotNull ( blockchain Source . key Store Provider ) ĊĠĠĠ Ġ} Ċ }