package Ġpro . mez ent se v . currencies . currency . use cases Ċ Ċ import Ġorg . junit . Test Ċ import Ġpro . mez ent se v . currencies . model . Rate Ċ import Ġjava . math . BigDecimal Ċ import Ġkotlin . test . assertEquals Ċ Ċ class ĠConvert Currency Interactor Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġunder Test : ĠConvert Currency Interactor Ġ= ĠConvert Currency Interactor () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` apply Ġnew Ġcurrency Ġfor Ġexisted Ġlist Ġthen Ġchange Ġtyped Ġvalue `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrates Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRate (" EUR ", Ġ 2 . to BigDecimal (), Ġ" 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRate (" R UB ", Ġ 3 . to BigDecimal (), Ġ" 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRate (" USD ", Ġ 4 . to BigDecimal (), Ġ" 4 ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġmultiply Ġ= Ġ" 9 " ĊĠĠĠĠĠĠĠ Ġval Ġmultiply Decimal Ġ= Ġmultiply . to BigDecimal () ĊĠĠĠĠĠĠĠ Ġval Ġnew Rate Ġ= ĠRate (" DN M ", Ġ 1 . to BigDecimal (), Ġmultiply ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrency Ġ= Ġunder Test . convert (" EUR ", Ġrates , Ġnew Rate ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( new Rate . base , Ġcurrency . base ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġcurrency . rates . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( new Rate . typed Value , Ġcurrency . rates [ 0 ]. typed Value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( new Rate . base , Ġcurrency . rates [ 0 ]. base ) ĊĊĠĠĠĠĠĠĠ Ġcheck Rates ( rates , Ġcurrency . rates . drop ( 1 ), Ġmultiply Decimal ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġchange Ġtyped Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġsecond Multiply Ġ= Ġ" 1 9 " ĊĠĠĠĠĠĠĠ Ġval Ġsecond Multiply Decimal Ġ= Ġ" 1 9 ". to BigDecimal () ĊĠĠĠĠĠĠĠ Ġval Ġsecond Rate Ġ= ĠRate (" DN M ", Ġ 1 . 0 . to BigDecimal (), Ġsecond Multiply ) ĊĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġunder Test . convert (" EUR ", Ġcurrency . rates , Ġsecond Rate ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 4 , Ġcurrency . rates . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( second Rate . typed Value , Ġcurrency . rates [ 0 ]. typed Value ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( second Rate . base , Ġcurrency . rates [ 0 ]. base ) ĊĊĠĠĠĠĠĠĠ Ġcheck Rates ( rates , Ġcurrency . rates . drop ( 1 ), Ġsecond Multiply Decimal ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` keep Ġthe Ġsave Ġrates Ġafter ĠN Ġconvert Ġoperations `() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval ĠEUR Ġ= ĠRate (" EUR ", Ġ 1 . to BigDecimal (), Ġ" 1 ") ĊĠĠĠĠĠĠĠ Ġval ĠR UB Ġ= ĠRate (" R UB ", Ġ 3 . to BigDecimal (), Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġval ĠUSD Ġ= ĠRate (" USD ", Ġ 4 . to BigDecimal (), Ġ" 4 ") ĊĊĠĠĠĠĠĠĠ Ġval Ġrates Ġ= ĠlistOf ( EUR , ĠR UB , ĠUSD ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinit Rate Ġ= ĠEUR ĊĠĠĠĠĠĠĠ Ġval Ġanother Rate Ġ= ĠUSD ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrency Ġ= Ġunder Test . convert (" EUR ", Ġrates , Ġinit Rate ) ĊĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġunder Test . convert (" EUR ", Ġcurrency . rates , Ġanother Rate ) ĊĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġunder Test . convert (" USD ", Ġcurrency . rates , Ġinit Rate ) ĊĊĠĠĠĠĠĠĠ Ġcheck Rates ( rates , Ġcurrency . rates , Ġinit Rate . value ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` clean Ġall Ġamounts `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠEUR Ġ= ĠRate (" EUR ", Ġ 1 . to BigDecimal (), Ġ" 1 ") ĊĠĠĠĠĠĠĠ Ġval ĠR UB Ġ= ĠRate (" R UB ", Ġ 3 . to BigDecimal (), Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġval ĠUSD Ġ= ĠRate (" USD ", Ġ 4 . to BigDecimal (), Ġ" 4 ") ĊĊĠĠĠĠĠĠĠ Ġval ĠZERO _ EUR _ AMOUNT Ġ= ĠEUR . copy ( typed Value Ġ= Ġ"") ĊĊĠĠĠĠĠĠĠ Ġval Ġrates Ġ= ĠlistOf ( EUR , ĠR UB , ĠUSD ) ĊĊĠĠĠĠĠĠĠ Ġval Ġinit Rate Ġ= ĠEUR ĊĠĠĠĠĠĠĠ Ġval Ġanother Rate Ġ= ĠZERO _ EUR _ AMOUNT ĊĊĠĠĠĠĠĠĠ Ġvar Ġcurrency Ġ= Ġunder Test . convert (" EUR ", Ġrates , Ġinit Rate ) ĊĠĠĠĠĠĠĠ Ġcurrency Ġ= Ġunder Test . convert (" EUR ", Ġcurrency . rates , Ġanother Rate ) ĊĊĠĠĠĠĠĠĠ Ġcheck Rates ( rates , Ġcurrency . rates , ĠBigDecimal . ZERO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` new Ġcurrency Ġwith Ġwrong Ġtyped Ġvalue `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠEUR Ġ= ĠRate (" EUR ", Ġ 1 . to BigDecimal (), Ġ" 1 ") ĊĠĠĠĠĠĠĠ Ġval ĠR UB Ġ= ĠRate (" R UB ", Ġ 3 . to BigDecimal (), Ġ" 3 ") ĊĠĠĠĠĠĠĠ Ġval ĠUSD Ġ= ĠRate (" USD ", Ġ 4 . to BigDecimal (), Ġ" 4 ") ĊĠĠĠĠĠĠĠ Ġval ĠWR ONG _ CUR RE NCY Ġ= ĠRate (" PPC ", ĠBigDecimal . ZERO , Ġ"$ #$ # ") ĊĊĠĠĠĠĠĠĠ Ġval Ġrates Ġ= ĠlistOf ( EUR , ĠR UB , ĠUSD ) ĊĠĠĠĠĠĠĠ Ġval Ġexpected Rates Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWR ONG _ CUR RE NCY . copy ( value Ġ= ĠBigDecimal . ONE , Ġtyped Value Ġ= Ġ""), ĠEUR , ĠR UB , ĠUSD ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrency Ġ= Ġunder Test . convert ( EUR . base , Ġrates , ĠWR ONG _ CUR RE NCY ) ĊĊĠĠĠĠĠĠĠ Ġcheck Rates ( expected Rates , Ġcurrency . rates , ĠBigDecimal . ZERO ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Rates ( expected Rates : ĠList < Rate >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Rates : ĠList < Rate >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtyped Value Decimal : ĠBigDecimal ) Ġ{ ĊĠĠĠĠĠĠĠ Ġactual Rates . forEach Indexed Ġ{ Ġindex , Ġrate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Rates [ index ]. base , Ġrate . base ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Rates [ index ]. value . compareTo ( rate . value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġdecimal Ġ'${ expected Rates [ index ]. value }' Ġbut Ġgot Ġ'${ rate . value } '" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Typed Value Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Rates [ index ]. typed Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( typed Value Decimal ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Typed Value Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrate . typed Value . to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal . ZERO ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Typed Value . compareTo ( actual Typed Value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġdecimal Ġ'$ expected Typed Value ' Ġbut Ġgot Ġ'$ actual Typed Value '" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ