From 3a09ec8c0e4af93bfa70a41fff7431a79d98d00f Mon Sep 17 00:00:00 2001 From: Fung Date: Mon, 12 Apr 2021 11:55:33 +0800 Subject: [PATCH] added test cases --- .../validator/lib/ExampleInstrumentedTest.kt | 21 +++++++-- .../validator/lib/HkidValidator.kt | 43 ++++++++++--------- 2 files changed, 39 insertions(+), 25 deletions(-) diff --git a/lib/src/androidTest/java/com/androidfung/validator/lib/ExampleInstrumentedTest.kt b/lib/src/androidTest/java/com/androidfung/validator/lib/ExampleInstrumentedTest.kt index c024a40..ab4d621 100644 --- a/lib/src/androidTest/java/com/androidfung/validator/lib/ExampleInstrumentedTest.kt +++ b/lib/src/androidTest/java/com/androidfung/validator/lib/ExampleInstrumentedTest.kt @@ -1,13 +1,12 @@ package com.androidfung.validator.lib -import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 - +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Test import org.junit.runner.RunWith -import org.junit.Assert.* - /** * Instrumented test, which will execute on an Android device. * @@ -21,4 +20,18 @@ class ExampleInstrumentedTest { val appContext = InstrumentationRegistry.getInstrumentation().targetContext assertEquals("com.androidfung.validator.lib.test", appContext.packageName) } + + @ExperimentalStdlibApi + @Test + fun hkidTest() { + assert(HkidValidator.isValid("A123456", '3')) + assertFalse(HkidValidator.isValid("A123456", '4')) + + assert(HkidValidator.isValid("A654321", '1')) + assertFalse(HkidValidator.isValid("A654321", 'A')) + + assert(HkidValidator.isValid("ZA654321", 'A')) + assertFalse(HkidValidator.isValid("ZA654321", '9')) + + } } \ No newline at end of file diff --git a/lib/src/main/java/com/androidfung/validator/lib/HkidValidator.kt b/lib/src/main/java/com/androidfung/validator/lib/HkidValidator.kt index fb064ca..a44fa9d 100644 --- a/lib/src/main/java/com/androidfung/validator/lib/HkidValidator.kt +++ b/lib/src/main/java/com/androidfung/validator/lib/HkidValidator.kt @@ -1,30 +1,31 @@ package com.androidfung.validator.lib class HkidValidator { - private val acceptedChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ " - private val hkidRegex = Regex("[A-Z]{1,2}\\d{6}") - @ExperimentalStdlibApi - fun isValid(id: String, checksum: Char) : Boolean{ - return try { - calcCheckDigit(id) == checksum - }catch (e : IllegalArgumentException){ - false - } - } - - @ExperimentalStdlibApi - fun calcCheckDigit(input: String): Char { - if (input.matches(hkidRegex)) { - val id = if (input.length == 7) " $input" else input - val sum = id.mapIndexed { index, c -> - (9 - index) * acceptedChars.indexOf(c) - }.sum() + companion object { + private val acceptedChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ " + private val hkidRegex = Regex("[A-Z]{1,2}\\d{6}") - val checksum = ((11 - (sum % 11)) % 11) // = (11 * ceil(sum / 11.0) - sum).toInt() + @ExperimentalStdlibApi + fun isValid(id: String, checksum: Char): Boolean { + return try { + calcCheckDigit(id) == checksum + } catch (e: IllegalArgumentException) { + false + } + } - return checksum.digitToChar(16) + @ExperimentalStdlibApi + fun calcCheckDigit(input: String): Char { + if (input.matches(hkidRegex)) { + val id = if (input.length == 7) " $input" else input + val sum = id.mapIndexed { index, c -> + (9 - index) * acceptedChars.indexOf(c) + }.sum() + val checksum = ((11 - (sum % 11)) % 11) - } else throw IllegalArgumentException() + return checksum.digitToChar(16) + } else throw IllegalArgumentException() + } } } \ No newline at end of file