zcash-android-wallet-poc/zcash-android-wallet-app/app/src/test/java/cash/z/android/wallet/ui/presenter/SendPresenterTest.kt

110 lines
4.6 KiB
Kotlin

package cash.z.android.wallet.ui.presenter
import cash.z.wallet.sdk.data.Synchronizer
import cash.z.wallet.sdk.ext.convertZatoshiToZecString
import cash.z.wallet.sdk.ext.safelyConvertToBigDecimal
import com.nhaarman.mockitokotlin2.*
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.ArgumentMatchers.anyString
import org.mockito.Mock
import org.mockito.junit.jupiter.MockitoExtension
import java.math.BigDecimal
import java.math.RoundingMode
@ExtendWith(MockitoExtension::class)
internal class SendPresenterTest {
@Mock val view: SendPresenter.SendView = mock()
lateinit var presenter: SendPresenter
@BeforeEach
fun setUp(@Mock synchronizer: Synchronizer) {
presenter = SendPresenter(view, synchronizer)
}
@AfterEach
fun tearDown() {
}
@Test
fun headerUpdating_leadingZeros() {
presenter.headerUpdating("007")
verify(view).setSubheaderValue("0.14", true)
}
@Test
fun headerUpdating_commas() {
presenter.headerUpdating("1,000")
verify(view).setSubheaderValue("20.38", true)
}
@Test
fun headerUpdating_badInputCommas() {
presenter.headerUpdating("34,5")
assertTrue(presenter.sendUiModel.isUsdSelected)
verify(view).setSubheaderValue("7.03", true)
}
@Test
fun headerValidated_roundDown() {
presenter.toggleCurrency()
assertTrue(!presenter.sendUiModel.isUsdSelected, "zec should be selected to avoid testing conversions")
presenter.headerValidated("1.1234561".safelyConvertToBigDecimal()!!)
verify(view, atLeastOnce()).setHeaders(eq(false), eq("1.123456"), eq("55.13"))
}
@Test
fun headerValidated_usdConversion() {
assertTrue(presenter.sendUiModel.isUsdSelected, "expecting USD for this test")
presenter.headerValidated("1000.045".safelyConvertToBigDecimal()!!)
verify(view).setHeaders(eq(true), eq("1,000.04"), eq("20.379967"))
}
@Test
fun headerValidated_roundUp() {
presenter.toggleCurrency()
assertTrue(!presenter.sendUiModel.isUsdSelected, "zec should be selected to avoid testing conversions")
presenter.headerValidated("1.1234556".safelyConvertToBigDecimal()!!)
verify(view).setHeaders(eq(false), eq("1.123456"), eq("55.13"))
}
@Test
fun headerValidated_roundUpBankersRounding() {
// banker's rounding follows odd up, even down
// We'll encourage using that since it has good statistical properties and this rounding only happens in the UI
presenter.toggleCurrency()
assertTrue(!presenter.sendUiModel.isUsdSelected, "zec should be selected to avoid testing conversions")
presenter.headerValidated("1.1234535".safelyConvertToBigDecimal()!!)
assertEquals(112345350, presenter.sendUiModel.zecValue)
assertEquals("1.123454", presenter.sendUiModel.zecValue.convertZatoshiToZecString(), "5 is odd, we should round up")
presenter.headerValidated("1.1234565".safelyConvertToBigDecimal()!!)
assertEquals(112345650, presenter.sendUiModel.zecValue)
assertEquals("1.123456", presenter.sendUiModel.zecValue.convertZatoshiToZecString(), "6 is even, we should round down")
}
@Test
fun parseSafely_commas() {
assertEquals("3124", "3,124".safelyConvertToBigDecimal().toString())
}
@Test
fun parseSafely_commasBad() {
assertEquals("3124", ",3124".safelyConvertToBigDecimal().toString())
assertEquals("3124", "3,124".safelyConvertToBigDecimal().toString())
assertEquals("3124", "31,24".safelyConvertToBigDecimal().toString())
assertEquals("3124", "312,4".safelyConvertToBigDecimal().toString())
assertEquals("3124", "3124,".safelyConvertToBigDecimal().toString())
assertEquals("3124", ",3,1,2,4,".safelyConvertToBigDecimal().toString())
}
@Test
fun parseSafely_spaces() {
assertEquals("3124", " 3124".safelyConvertToBigDecimal().toString())
assertEquals("3124", "3 124".safelyConvertToBigDecimal().toString())
assertEquals("3124", "31 24".safelyConvertToBigDecimal().toString())
assertEquals("3124", "312 4".safelyConvertToBigDecimal().toString())
assertEquals("3124", "3124 ".safelyConvertToBigDecimal().toString())
assertEquals("3124", " 3 1 2 4 ".safelyConvertToBigDecimal().toString())
assertEquals("3124", " 3 12 4 ".safelyConvertToBigDecimal().toString())
}
}