From 67c6d88db0093fc1460e2c88a0a9e7262ae07393 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Fri, 8 Mar 2024 14:21:32 +0000 Subject: [PATCH 1/2] replace String length with indices use indexing operator instead of get call added tests --- .../android/wallet/utils/LnInvoiceUtils.kt | 6 +- .../wallet/utils/LnInvoiceUtilsTest.kt | 60 +++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 app/src/test/kotlin/net/primal/android/wallet/utils/LnInvoiceUtilsTest.kt 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) + + } +} From c82b44e6b29334c1b11741159a4caf92e3782483 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sat, 9 Mar 2024 13:37:01 +0100 Subject: [PATCH 2/2] shorter lines --- .../wallet/utils/LnInvoiceUtilsTest.kt | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) 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 index 355c7de30..8751922fa 100644 --- a/app/src/test/kotlin/net/primal/android/wallet/utils/LnInvoiceUtilsTest.kt +++ b/app/src/test/kotlin/net/primal/android/wallet/utils/LnInvoiceUtilsTest.kt @@ -5,24 +5,28 @@ 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" + private val validLnInvoice = + "lnbc123450n1pj7welppp53umfyxp6jn9uvkt463hydtq2zpfvz78hxhpfv9wqx6v4uwdw2rnqdzqg3hkuct5v56zu3n4dcsxgmmwv96x" + + "jmmwyp6x7gzqgpc8ymmrv4h8ghmrwfuhqar0cqzpgxqrrsssp5tntqjpngx6l8y9va9tzd7fmtemtyp5vvsqphw8f8yqjjrr26x5qs9" + + "qyyssqyyv7tqp5kpsmv6s5825kcq8fxsn4ag2h5uj2j6lnsnclyyq6844khayzqrl7yue46nwlukfr4uftqcwzxzh8krqg9rqsg9tg6x" + + "ggszcp0gyjcd" + + private val invoiceInvalidCharacter = + "lnbc123450n1pj7welpp 53umfyxp6jn9uvkt463hydtq2zpfvz78hxhpfv9wqx6v4uwdw2rnqdzqg3hkuct5v56zu3n4dcsxgmmwv96x" + + "jmmwyp6x7gzqgpc8ymmrv4h8ghmrwfuhqar0cqzpgxqrrsssp5tntqjpngx6l8y9va9tzd7fmtemtyp5vvsqphw8f8yqjjrr26x5qs9" + + "qyyssqyyv7tqp5kpsmv6s5825kcq8fxsn4ag2h5uj2j6lnsnclyyq6844khayzqrl7yue46nwlukfr4uftqcwzxzh8krqg9rqsg9tg6" + + "xggszcp0gyjcd" + + private val invalidLnInvoice = + "lnbc123450n1pj7welppp53umfyxp6jn9uvkt463hydtq2zpfvz78hxhpfv9wqx6v4uwdw2rnqdzqg3hkuct5v56zu3n4dcsxgmmwv96x" + + "jmmwyp6x7gzqgpc8ymmrv4h8ghmrwXuhqar0cqzpgxqrrsssp5tntqjpngx6l8y9va9tzd7fmtemtyp5vvsqphw8f8yqjjrr26x5qs9" + + "qyyssqyyv7tqp5kpsmv6s5825kcq8fxsn4ag2h5uj2j6lnsnclyyq6844khayzqrl7yue46nwlukfr4uftqcwzxzh8krqg9rqsg9tg6x" + + "ggszcp0gyjcd" + + private val validLnInvoiceNoAmount = + "lnbc1pvjluezpp5qqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqqqsyqcyq5rqwzqfqypqdpl2pkx2ctnv5sxxmmwwd5kgetjypeh2ursdae8g" + + "6twvus8g6rfwvs8qun0dfjkxaq8rkx3yf5tcsyz3d73gafnh3cax9rn449d9p5uxz9ezhhypd0elx87sjle52x86fux2ypatgddc6k6" + + "3n7erqz25le42c4u4ecky03ylcqca784w" @Test fun getAmountInSatsValidInvoice() {