diff --git a/library/src/main/java/co/kyash/vtl/validators/MinLengthValidator.kt b/library/src/main/java/co/kyash/vtl/validators/MinLengthValidator.kt new file mode 100644 index 0000000..df149da --- /dev/null +++ b/library/src/main/java/co/kyash/vtl/validators/MinLengthValidator.kt @@ -0,0 +1,52 @@ +package co.kyash.vtl.validators + +import android.content.Context +import co.kyash.vtl.VtlValidationFailureException +import io.reactivex.Completable +import io.reactivex.schedulers.Schedulers + +/** + * Validation error when the text length is shorter + */ +class MinLengthValidator( + private val errorMessage: String, + private val minLength: Int, + private val trim: Boolean = true +) : VtlValidator { + + /** + * Validate and return completable + * + * @param context + * @param text + * @return Completable + * @throws Exception which contains the error message + */ + override fun validateAsCompletable(context: Context, text: String?): Completable { + return Completable.fromRunnable { + if (!validate(text)) { + throw VtlValidationFailureException(errorMessage) + } + }.subscribeOn(Schedulers.computation()) + } + + /** + * Validate immediately + * + * @param text + * @return result + */ + override fun validate(text: String?): Boolean { + return text?.let { + if (trim) it.trim() else it + }?.length ?: 0 >= minLength + } + + /** + * @return error message + */ + override fun getErrorMessage(): String { + return errorMessage + } + +} \ No newline at end of file diff --git a/library/src/main/java/co/kyash/vtl/validators/RequiredValidator.kt b/library/src/main/java/co/kyash/vtl/validators/RequiredValidator.kt index a624091..c46d3e5 100644 --- a/library/src/main/java/co/kyash/vtl/validators/RequiredValidator.kt +++ b/library/src/main/java/co/kyash/vtl/validators/RequiredValidator.kt @@ -10,7 +10,8 @@ import io.reactivex.schedulers.Schedulers * Validation error when the text is empty. */ class RequiredValidator( - private val errorMessage: String + private val errorMessage: String, + private val trim: Boolean = true ) : VtlValidator { /** @@ -36,7 +37,7 @@ class RequiredValidator( * @return result */ override fun validate(text: String?): Boolean { - return !TextUtils.isEmpty(text) + return !TextUtils.isEmpty(text?.let { if (trim) it.trim() else it }) } /** diff --git a/library/src/test/java/co/kyash/vtl/validators/MinLengthValidatorTest.kt b/library/src/test/java/co/kyash/vtl/validators/MinLengthValidatorTest.kt new file mode 100644 index 0000000..d41c54f --- /dev/null +++ b/library/src/test/java/co/kyash/vtl/validators/MinLengthValidatorTest.kt @@ -0,0 +1,71 @@ +package co.kyash.vtl.validators + +import android.content.Context +import co.kyash.vtl.testing.RxImmediateSchedulerRule +import junit.framework.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.robolectric.ParameterizedRobolectricTestRunner +import org.robolectric.RuntimeEnvironment + +@Suppress("unused") +@RunWith(ParameterizedRobolectricTestRunner::class) +class MinLengthValidatorTest( + private val text: String?, + private val trim: Boolean, + private val result: Boolean, + private val errorMessage: String? +) { + + companion object { + private val MIN_LENGTH = 5 + private val ERROR_MESSAGE = "This field has error" + + @JvmStatic + @ParameterizedRobolectricTestRunner.Parameters + fun data(): List> { + return listOf( + // Failure + arrayOf(null, true, false, ERROR_MESSAGE), + arrayOf("", true, false, ERROR_MESSAGE), + arrayOf(" ", true, false, ERROR_MESSAGE), + arrayOf("abcd", true, false, ERROR_MESSAGE), + + // Success + arrayOf(" ", false, true, null), + arrayOf("abcde", true, true, null), + arrayOf("abcdef", true, true, null) + ) + } + } + + @get:Rule + val rxImmediateSchedulerRule = RxImmediateSchedulerRule() + + private lateinit var subject: VtlValidator + + private val context: Context = RuntimeEnvironment.application + + @Before + @Throws(Exception::class) + fun setUp() { + subject = MinLengthValidator(ERROR_MESSAGE, MIN_LENGTH, trim) + } + + @Test + fun validate() { + assertEquals(result, subject.validate(text)) + } + + @Test + fun validateAsCompletable() { + if (errorMessage == null) { + subject.validateAsCompletable(context, text).test().assertNoErrors().assertComplete() + } else { + subject.validateAsCompletable(context, text).test().assertErrorMessage(errorMessage) + } + } + +} \ No newline at end of file diff --git a/library/src/test/java/co/kyash/vtl/validators/RequiredValidatorTest.kt b/library/src/test/java/co/kyash/vtl/validators/RequiredValidatorTest.kt index 01aef9e..1cade35 100644 --- a/library/src/test/java/co/kyash/vtl/validators/RequiredValidatorTest.kt +++ b/library/src/test/java/co/kyash/vtl/validators/RequiredValidatorTest.kt @@ -14,6 +14,7 @@ import org.robolectric.RuntimeEnvironment @RunWith(ParameterizedRobolectricTestRunner::class) class RequiredValidatorTest( private val text: String?, + private val trim: Boolean, private val result: Boolean, private val errorMessage: String? ) { @@ -25,9 +26,16 @@ class RequiredValidatorTest( @ParameterizedRobolectricTestRunner.Parameters fun data(): List> { return listOf( - arrayOf(null, false, ERROR_MESSAGE), - arrayOf("", false, ERROR_MESSAGE), - arrayOf("konifar", true, null) + // Failure + arrayOf(null, true, false, ERROR_MESSAGE), + arrayOf("", true, false, ERROR_MESSAGE), + arrayOf(" ", true, false, ERROR_MESSAGE), + arrayOf(" ", true, false, ERROR_MESSAGE), + + // Success + arrayOf(" ", false, true, null), + arrayOf(" ", false, true, null), + arrayOf("konifar", true, true, null) ) } } @@ -42,7 +50,7 @@ class RequiredValidatorTest( @Before @Throws(Exception::class) fun setUp() { - subject = RequiredValidator(ERROR_MESSAGE) + subject = RequiredValidator(ERROR_MESSAGE, trim) } @Test