diff --git a/app/src/main/kotlin/net/primal/android/wallet/utils/LnInvoiceUtils.kt b/app/src/main/kotlin/net/primal/android/wallet/utils/LnInvoiceUtils.kt index 85d0558bf..68d608c66 100644 --- a/app/src/main/kotlin/net/primal/android/wallet/utils/LnInvoiceUtils.kt +++ b/app/src/main/kotlin/net/primal/android/wallet/utils/LnInvoiceUtils.kt @@ -72,7 +72,7 @@ object LnInvoiceUtils { private fun decodeUnlimitedLength(invoice: String): Boolean { var lower = false var upper = false - for (i in 0 until invoice.length) { + for (i in invoice.indices) { val c = invoice[i] if (c.code < 33 || c.code > 126) { throw AddressFormatException( @@ -95,12 +95,12 @@ object LnInvoiceUtils { val values = ByteArray(dataPartLength) for (i in 0 until dataPartLength) { val c = invoice[i + pos + 1] - if (CHARSET_REV.get(c.code).toInt() == -1) { + if (CHARSET_REV[c.code].toInt() == -1) { throw AddressFormatException( "Invalid character: " + c + ", pos: " + (i + pos + 1), ) } - values[i] = CHARSET_REV.get(c.code) + values[i] = CHARSET_REV[c.code] } val hrp = invoice.substring(0, pos).lowercase(Locale.ROOT) if (!verifyChecksum(hrp, values)) throw AddressFormatException("Invalid Checksum") diff --git a/app/src/test/kotlin/net/primal/android/wallet/utils/LnInvoiceUtilsTest.kt b/app/src/test/kotlin/net/primal/android/wallet/utils/LnInvoiceUtilsTest.kt new file mode 100644 index 000000000..355c7de30 --- /dev/null +++ b/app/src/test/kotlin/net/primal/android/wallet/utils/LnInvoiceUtilsTest.kt @@ -0,0 +1,60 @@ +package net.primal.android.wallet.utils + +import io.kotest.matchers.shouldBe +import org.junit.Test + +class LnInvoiceUtilsTest { + + private val validLnInvoice = "lnbc123450n1pj7welppp53umfyxp6jn9uvkt463hydtq2zpfvz78hxhpfv9wqx6v4uwdw2rnqdzqg3hkuct5v56zu" + + "3n4dcsxgmmwv96xjmmwyp6x7gzqgpc8ymmrv4h8ghmrwfuhqar0cqzpgxqrrsssp5tntqjpngx6l8y9va9tzd7fmtemtyp5vvsqphw8f8yqjjr" + + "r26x5qs9qyyssqyyv7tqp5kpsmv6s5825kcq8fxsn4ag2h5uj2j6lnsnclyyq6844khayzqrl7yue46nwlukfr4uftqcwzxzh8krqg9rqsg9tg6x" + + "ggszcp0gyjcd" + + private val invoiceInvalidCharacter = "lnbc123450n1pj7welpp 53umfyxp6jn9uvkt463hydtq2zpfvz78hxhpfv9wqx6v4uwdw2rnqdzqg3hkuct5v56zu" + + "3n4dcsxgmmwv96xjmmwyp6x7gzqgpc8ymmrv4h8ghmrwfuhqar0cqzpgxqrrsssp5tntqjpngx6l8y9va9tzd7fmtemtyp5vvsqphw8f8yqjjr" + + "r26x5qs9qyyssqyyv7tqp5kpsmv6s5825kcq8fxsn4ag2h5uj2j6lnsnclyyq6844khayzqrl7yue46nwlukfr4uftqcwzxzh8krqg9rqsg9tg6x" + + "ggszcp0gyjcd" + + private val invalidLnInvoice = "lnbc123450n1pj7welppp53umfyxp6jn9uvkt463hydtq2zpfvz78hxhpfv9wqx6v4uwdw2rnqdzqg3hkuct5v56zu" + + "3n4dcsxgmmwv96xjmmwyp6x7gzqgpc8ymmrv4h8ghmrwXuhqar0cqzpgxqrrsssp5tntqjpngx6l8y9va9tzd7fmtemtyp5vvsqphw8f8yqjjr" + + "r26x5qs9qyyssqyyv7tqp5kpsmv6s5825kcq8fxsn4ag2h5uj2j6lnsnclyyq6844khayzqrl7yue46nwlukfr4uftqcwzxzh8krqg9rqsg9tg6x" + + "ggszcp0gyjcd" + + private val validLnInvoiceNoAmount = "lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqy" + + "pqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafn" + + "h3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k63n7erqz25le42c4u4ecky03ylcqca784w" + + @Test + fun getAmountInSatsValidInvoice() { + val expectedValue = 12345 + + val amount = LnInvoiceUtils.getAmountInSats(validLnInvoice) + + amount.toInt() shouldBe expectedValue + + } + + @Test + fun getAmountInSatsValidInvoiceNoAmount() { + val expectedValue = 0 + + val amount = LnInvoiceUtils.getAmountInSats(validLnInvoiceNoAmount) + + amount.toInt() shouldBe expectedValue + + } + + @Test(expected = IllegalArgumentException::class) + fun getAmountInSatsInvalidInvoice() { + + LnInvoiceUtils.getAmountInSats(invalidLnInvoice) + + } + + @Test(expected = IllegalArgumentException::class) + fun getAmountInSatsInvalidCharacter() { + + LnInvoiceUtils.getAmountInSats(invoiceInvalidCharacter) + + } +}