Skip to content

Commit 82bc50a

Browse files
Sanchita AgarwalSaket Narayan
authored andcommitted
Change phone number validation in patient entry and registration
Phone numbers must be between 6 to 12 digits
1 parent 6613787 commit 82bc50a

File tree

16 files changed

+209
-95
lines changed

16 files changed

+209
-95
lines changed

app/src/androidTest/java/org/simple/clinic/TestData.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ class TestData @Inject constructor(private val faker: Faker) {
348348
colony: String = faker.address.streetName(),
349349
district: String = faker.address.city(),
350350
state: String = faker.address.state(),
351-
phone: String? = faker.phoneNumber.phoneNumber()
351+
phone: String? = faker.number.number(10)
352352
): OngoingPatientEntry {
353353
val ongoingPersonalDetails = OngoingPatientEntry.PersonalDetails(fullName, dateOfBirth, age, gender)
354354
val ongoingAddress = OngoingPatientEntry.Address(colony, district, state)

app/src/androidTest/java/org/simple/clinic/patient/PatientRepositoryAndroidTest.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class PatientRepositoryAndroidTest {
7171
fun when_a_patient_with_phone_numbers_is_saved_then_it_should_be_correctly_stored_in_the_database() {
7272
val ongoingAddress = OngoingPatientEntry.Address("HSR Layout", "Bangalore South", "Karnataka")
7373
val ongoingPersonalDetails = OngoingPatientEntry.PersonalDetails("Ashok Kumar", "08/04/1985", null, Gender.TRANSGENDER)
74-
val ongoingPhoneNumber = OngoingPatientEntry.PhoneNumber(number = "2277", type = PatientPhoneNumberType.LANDLINE)
74+
val ongoingPhoneNumber = OngoingPatientEntry.PhoneNumber(number = "227788", type = PatientPhoneNumberType.LANDLINE)
7575

7676
val personalDetailsOnlyEntry = OngoingPatientEntry(personalDetails = ongoingPersonalDetails)
7777

@@ -91,7 +91,7 @@ class PatientRepositoryAndroidTest {
9191
assertThat(search2.first().age).isNull()
9292
assertThat(search2.first().dateOfBirth).isEqualTo(LocalDate.parse("1985-04-08"))
9393
assertThat(search2.first().phoneNumber).isNotEmpty()
94-
assertThat(search2.first().phoneNumber).isEqualTo("2277")
94+
assertThat(search2.first().phoneNumber).isEqualTo("227788")
9595
}
9696

9797
@Test
@@ -211,23 +211,23 @@ class PatientRepositoryAndroidTest {
211211
fun when_patients_with_date_of_birth_are_present_and_age_filter_is_applied_then_search_should_correctly_find_them() {
212212
val ongoingPersonalDetails = OngoingPatientEntry.PersonalDetails("Abhay Kumar", "15/08/1950", null, Gender.TRANSGENDER)
213213
val ongoingAddress = OngoingPatientEntry.Address("Arambol", "Arambol", "Goa")
214-
val ongoingPhoneNumber = OngoingPatientEntry.PhoneNumber("3.14159", PatientPhoneNumberType.MOBILE, active = true)
214+
val ongoingPhoneNumber = OngoingPatientEntry.PhoneNumber("3914159", PatientPhoneNumberType.MOBILE, active = true)
215215
val ongoingPatientEntry = OngoingPatientEntry(ongoingPersonalDetails, ongoingAddress, ongoingPhoneNumber)
216216
patientRepository.saveOngoingEntry(ongoingPatientEntry)
217217
.andThen(patientRepository.saveOngoingEntryAsPatient())
218218
.subscribe()
219219

220220
val opd2 = OngoingPatientEntry.PersonalDetails("Alok Kumar", "15/08/1940", null, Gender.TRANSGENDER)
221221
val opa2 = OngoingPatientEntry.Address("Arambol", "Arambol", "Goa")
222-
val opn2 = OngoingPatientEntry.PhoneNumber("34159", PatientPhoneNumberType.MOBILE, active = true)
222+
val opn2 = OngoingPatientEntry.PhoneNumber("3418959", PatientPhoneNumberType.MOBILE, active = true)
223223
val ope2 = OngoingPatientEntry(opd2, opa2, opn2)
224224
patientRepository.saveOngoingEntry(ope2)
225225
.andThen(patientRepository.saveOngoingEntryAsPatient())
226226
.subscribe()
227227

228228
val opd3 = OngoingPatientEntry.PersonalDetails("Abhishek Kumar", "1/01/1949", null, Gender.TRANSGENDER)
229229
val opa3 = OngoingPatientEntry.Address("Arambol", "Arambol", "Goa")
230-
val opn3 = OngoingPatientEntry.PhoneNumber("99159", PatientPhoneNumberType.MOBILE, active = true)
230+
val opn3 = OngoingPatientEntry.PhoneNumber("9989159", PatientPhoneNumberType.MOBILE, active = true)
231231
val ope3 = OngoingPatientEntry(opd3, opa3, opn3)
232232
patientRepository.saveOngoingEntry(ope3)
233233
.andThen(patientRepository.saveOngoingEntryAsPatient())
@@ -249,7 +249,7 @@ class PatientRepositoryAndroidTest {
249249
assertThat(search1).hasSize(1)
250250
assertThat(person1.fullName).isEqualTo("Alok Kumar")
251251
assertThat(person1.dateOfBirth).isEqualTo(LocalDate.parse("1940-08-15"))
252-
assertThat(person1.phoneNumber).isEqualTo("34159")
252+
assertThat(person1.phoneNumber).isEqualTo("3418959")
253253

254254
val search2 = patientRepository.search("ab", 68, includeFuzzyNameSearch = false).blockingFirst()
255255
assertThat(search2).hasSize(3)
@@ -265,23 +265,23 @@ class PatientRepositoryAndroidTest {
265265
fun when_patients_with_age_are_present_and_age_filter_is_applied_then_search_should_correctly_find_them() {
266266
val ongoingPersonalDetails = OngoingPatientEntry.PersonalDetails("Abhay Kumar", null, "20", Gender.TRANSGENDER)
267267
val ongoingAddress = OngoingPatientEntry.Address("Arambol", "Arambol", "Goa")
268-
val ongoingPhoneNumber = OngoingPatientEntry.PhoneNumber("3.14159", PatientPhoneNumberType.MOBILE, active = true)
268+
val ongoingPhoneNumber = OngoingPatientEntry.PhoneNumber("34314159", PatientPhoneNumberType.MOBILE, active = true)
269269
val ongoingPatientEntry = OngoingPatientEntry(ongoingPersonalDetails, ongoingAddress, ongoingPhoneNumber)
270270
patientRepository.saveOngoingEntry(ongoingPatientEntry)
271271
.andThen(patientRepository.saveOngoingEntryAsPatient())
272272
.subscribe()
273273

274274
val opd2 = OngoingPatientEntry.PersonalDetails("Alok Kumar", null, "17", Gender.FEMALE)
275275
val opa2 = OngoingPatientEntry.Address("Arambol", "Arambol", "Goa")
276-
val opn2 = OngoingPatientEntry.PhoneNumber("34159", PatientPhoneNumberType.MOBILE, active = true)
276+
val opn2 = OngoingPatientEntry.PhoneNumber("3413459", PatientPhoneNumberType.MOBILE, active = true)
277277
val ope2 = OngoingPatientEntry(opd2, opa2, opn2)
278278
patientRepository.saveOngoingEntry(ope2)
279279
.andThen(patientRepository.saveOngoingEntryAsPatient())
280280
.subscribe()
281281

282282
val opd3 = OngoingPatientEntry.PersonalDetails("Abhishek Kumar", null, "26", Gender.FEMALE)
283283
val opa3 = OngoingPatientEntry.Address("Arambol", "Arambol", "Goa")
284-
val opn3 = OngoingPatientEntry.PhoneNumber("99159", PatientPhoneNumberType.MOBILE, active = true)
284+
val opn3 = OngoingPatientEntry.PhoneNumber("9913459", PatientPhoneNumberType.MOBILE, active = true)
285285
val ope3 = OngoingPatientEntry(opd3, opa3, opn3)
286286
patientRepository.saveOngoingEntry(ope3)
287287
.andThen(patientRepository.saveOngoingEntryAsPatient())
@@ -303,7 +303,7 @@ class PatientRepositoryAndroidTest {
303303
assertThat(search1).hasSize(1)
304304
assertThat(person1.fullName).isEqualTo("Abhishek Kumar")
305305
assertThat(person1.age!!.value).isEqualTo(26)
306-
assertThat(person1.phoneNumber).isEqualTo("99159")
306+
assertThat(person1.phoneNumber).isEqualTo("9913459")
307307

308308
val search2 = patientRepository.search("ab", 18, includeFuzzyNameSearch = false).blockingFirst()
309309
assertThat(search2).hasSize(2)

app/src/androidTest/java/org/simple/clinic/patient/PatientSyncAndroidTest.kt

Lines changed: 8 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -73,42 +73,20 @@ class PatientSyncAndroidTest {
7373
val withDOB = Observable.range(0, count)
7474
.flatMapCompletable {
7575
repository.saveOngoingEntry(
76-
OngoingPatientEntry(
77-
personalDetails = OngoingPatientEntry.PersonalDetails(
78-
faker.name.name(),
79-
oldDateFormatter.format(faker.date.between("1947-08-15", "2001-02-25")),
80-
null,
81-
genders.first()),
82-
address = OngoingPatientEntry.Address(
83-
faker.address.streetAddress(),
84-
faker.address.city(),
85-
faker.address.state()),
86-
phoneNumber = OngoingPatientEntry.PhoneNumber(
87-
faker.phoneNumber.cellPhone(),
88-
PatientPhoneNumberType.LANDLINE,
89-
faker.bool.bool(0.77f)
90-
))
76+
testData.ongoingPatientEntry(
77+
dateOfBirth = oldDateFormatter.format(faker.date.between("1947-08-15", "2001-02-25")),
78+
age = null
79+
)
9180
).andThen(repository.saveOngoingEntryAsPatient().toCompletable())
9281
}
9382

9483
val withoutDOB = Observable.range(0, count)
9584
.flatMapCompletable {
9685
repository
97-
.saveOngoingEntry(OngoingPatientEntry(
98-
personalDetails = OngoingPatientEntry.PersonalDetails(
99-
faker.name.name(),
100-
null,
101-
faker.number.number(2).toString(),
102-
genders.first()),
103-
address = OngoingPatientEntry.Address(
104-
faker.address.streetAddress(),
105-
faker.address.city(),
106-
faker.address.state()),
107-
phoneNumber = OngoingPatientEntry.PhoneNumber(
108-
faker.phoneNumber.cellPhone(),
109-
PatientPhoneNumberType.MOBILE,
110-
faker.bool.bool(0.77f)
111-
)))
86+
.saveOngoingEntry(testData.ongoingPatientEntry(
87+
dateOfBirth = null,
88+
age = faker.number.number(2).toString()
89+
))
11290
.andThen(repository.saveOngoingEntryAsPatient().toCompletable())
11391
}
11492

app/src/main/java/org/simple/clinic/newentry/PatientEntryScreen.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,22 @@ class PatientEntryScreen(context: Context, attrs: AttributeSet) : RelativeLayout
276276
}
277277
}
278278

279+
fun showLengthTooShortPhoneNumberError(show: Boolean) {
280+
if (show) {
281+
phoneNumberInputLayout.error = context.getString(R.string.patiententry_error_phonenumber_length_less)
282+
} else {
283+
phoneNumberInputLayout.error = null
284+
}
285+
}
286+
287+
fun showLengthTooLongPhoneNumberError(show: Boolean) {
288+
if (show) {
289+
phoneNumberInputLayout.error = context.getString(R.string.patiententry_error_phonenumber_length_more)
290+
} else {
291+
phoneNumberInputLayout.error = null
292+
}
293+
}
294+
279295
fun showMissingGenderError(show: Boolean) {
280296
if (show) {
281297
genderErrorTextView.visibility = View.VISIBLE

app/src/main/java/org/simple/clinic/newentry/PatientEntryScreenController.kt

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@ import org.simple.clinic.patient.PatientEntryValidationError.INVALID_DATE_OF_BIR
2828
import org.simple.clinic.patient.PatientEntryValidationError.MISSING_GENDER
2929
import org.simple.clinic.patient.PatientEntryValidationError.PERSONAL_DETAILS_EMPTY
3030
import org.simple.clinic.patient.PatientEntryValidationError.PHONE_NUMBER_EMPTY
31+
import org.simple.clinic.patient.PatientEntryValidationError.PHONE_NUMBER_LENGTH_TOO_LONG
32+
import org.simple.clinic.patient.PatientEntryValidationError.PHONE_NUMBER_LENGTH_TOO_SHORT
3133
import org.simple.clinic.patient.PatientEntryValidationError.PHONE_NUMBER_NON_NULL_BUT_BLANK
3234
import org.simple.clinic.patient.PatientEntryValidationError.STATE_EMPTY
3335
import org.simple.clinic.patient.PatientRepository
36+
import org.simple.clinic.registration.phone.PhoneNumberValidator
3437
import org.simple.clinic.user.UserSession
3538
import org.simple.clinic.util.Just
3639
import org.simple.clinic.util.None
@@ -47,7 +50,8 @@ class PatientEntryScreenController @Inject constructor(
4750
private val patientRepository: PatientRepository,
4851
private val facilityRepository: FacilityRepository,
4952
private val userSession: UserSession,
50-
private val dobValidator: DateOfBirthFormatValidator
53+
private val dobValidator: DateOfBirthFormatValidator,
54+
private val numberValidator: PhoneNumberValidator
5155
) : ObservableTransformer<UiEvent, UiChange> {
5256

5357
override fun apply(events: Observable<UiEvent>): ObservableSource<UiChange> {
@@ -263,7 +267,7 @@ class PatientEntryScreenController @Inject constructor(
263267
val errorsFromDataValidation = events
264268
.ofType<PatientEntrySaveClicked>()
265269
.withLatestFrom(events.ofType<OngoingPatientEntryChanged>().map { it.entry })
266-
.map { (_, ongoingEntry) -> ongoingEntry.validationErrors(dobValidator) }
270+
.map { (_, ongoingEntry) -> ongoingEntry.validationErrors(dobValidator, numberValidator) }
267271

268272
val errors = Observables.zip(phoneNumberErrors, colonyErrors, errorsFromDataValidation) { phoneError, colonyError, otherErrors ->
269273
phoneError + colonyError + otherErrors
@@ -276,6 +280,8 @@ class PatientEntryScreenController @Inject constructor(
276280
val change: UiChange = when (it) {
277281
FULL_NAME_EMPTY -> { ui: Ui -> ui.showEmptyFullNameError(true) }
278282
PHONE_NUMBER_EMPTY -> { ui: Ui -> ui.showEmptyPhoneNumberError(true) }
283+
PHONE_NUMBER_LENGTH_TOO_SHORT -> { ui: Ui -> ui.showLengthTooShortPhoneNumberError(true) }
284+
PHONE_NUMBER_LENGTH_TOO_LONG -> { ui: Ui -> ui.showLengthTooLongPhoneNumberError(true) }
279285
BOTH_DATEOFBIRTH_AND_AGE_ABSENT -> { ui: Ui -> ui.showEmptyDateOfBirthAndAgeError(true) }
280286
INVALID_DATE_OF_BIRTH -> { ui: Ui -> ui.showInvalidDateOfBirthError(true) }
281287
DATE_OF_BIRTH_IN_FUTURE -> { ui: Ui -> ui.showDateOfBirthIsInFutureError(true) }
@@ -324,10 +330,18 @@ class PatientEntryScreenController @Inject constructor(
324330
.ofType<PatientGenderChanged>()
325331
.map { { ui: Ui -> ui.showMissingGenderError(false) } }
326332

327-
val phoneErrorResets = Observable
333+
val noPhoneErrorResets = Observable
328334
.merge(events.ofType<PatientPhoneNumberTextChanged>(), events.ofType<PatientNoPhoneNumberToggled>())
329335
.map { { ui: Ui -> ui.showEmptyPhoneNumberError(false) } }
330336

337+
val lessPhoneLengthResets = Observable
338+
.merge(events.ofType<PatientPhoneNumberTextChanged>(), events.ofType<PatientNoPhoneNumberToggled>())
339+
.map { { ui: Ui -> ui.showLengthTooShortPhoneNumberError(false) } }
340+
341+
val morePhoneLengthResets = Observable
342+
.merge(events.ofType<PatientPhoneNumberTextChanged>(), events.ofType<PatientNoPhoneNumberToggled>())
343+
.map { { ui: Ui -> ui.showLengthTooLongPhoneNumberError(false) } }
344+
331345
val colonyErrorResets = Observable
332346
.merge(events.ofType<PatientColonyOrVillageTextChanged>(), events.ofType<PatientNoColonyOrVillageToggled>())
333347
.map { { ui: Ui -> ui.showEmptyColonyOrVillageError(false) } }
@@ -345,7 +359,9 @@ class PatientEntryScreenController @Inject constructor(
345359
dateOfBirthErrorResets,
346360
ageErrorResets,
347361
genderErrorResets,
348-
phoneErrorResets,
362+
noPhoneErrorResets,
363+
lessPhoneLengthResets,
364+
morePhoneLengthResets,
349365
colonyErrorResets,
350366
districtErrorResets,
351367
stateErrorResets)
@@ -373,7 +389,7 @@ class PatientEntryScreenController @Inject constructor(
373389

374390
val canPatientBeSaved = Observables
375391
.combineLatest(
376-
ongoingEntryChanges.map { it.validationErrors(dobValidator).isEmpty() },
392+
ongoingEntryChanges.map { it.validationErrors(dobValidator, numberValidator).isEmpty() },
377393
isPhoneNumberValid,
378394
isColonyValid)
379395
.map { it.first.and(it.second).and(it.third) }

app/src/main/java/org/simple/clinic/patient/OngoingPatientEntry.kt

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,15 @@ import org.simple.clinic.patient.PatientEntryValidationError.FULL_NAME_EMPTY
1414
import org.simple.clinic.patient.PatientEntryValidationError.INVALID_DATE_OF_BIRTH
1515
import org.simple.clinic.patient.PatientEntryValidationError.MISSING_GENDER
1616
import org.simple.clinic.patient.PatientEntryValidationError.PERSONAL_DETAILS_EMPTY
17+
import org.simple.clinic.patient.PatientEntryValidationError.PHONE_NUMBER_LENGTH_TOO_LONG
18+
import org.simple.clinic.patient.PatientEntryValidationError.PHONE_NUMBER_LENGTH_TOO_SHORT
1719
import org.simple.clinic.patient.PatientEntryValidationError.PHONE_NUMBER_NON_NULL_BUT_BLANK
1820
import org.simple.clinic.patient.PatientEntryValidationError.STATE_EMPTY
21+
import org.simple.clinic.registration.phone.PhoneNumberValidator
22+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Result.BLANK
23+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Result.LENGTH_TOO_LONG
24+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Result.LENGTH_TOO_SHORT
25+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Type.LANDLINE_OR_MOBILE
1926

2027
/**
2128
* Represents user input on the UI, which is why every field is a String.
@@ -28,7 +35,7 @@ data class OngoingPatientEntry(
2835
val phoneNumber: PhoneNumber? = null
2936
) {
3037

31-
fun validationErrors(dobValidator: DateOfBirthFormatValidator): ArrayList<PatientEntryValidationError> {
38+
fun validationErrors(dobValidator: DateOfBirthFormatValidator, numberValidator: PhoneNumberValidator): ArrayList<PatientEntryValidationError> {
3239
val errors = ArrayList<PatientEntryValidationError>()
3340

3441
if (personalDetails == null) {
@@ -58,8 +65,13 @@ data class OngoingPatientEntry(
5865
}
5966
}
6067

61-
if (phoneNumber != null && phoneNumber.number.isBlank()) {
62-
errors += PHONE_NUMBER_NON_NULL_BUT_BLANK
68+
if (phoneNumber != null) {
69+
errors += when (numberValidator.validate(phoneNumber.number, LANDLINE_OR_MOBILE)) {
70+
BLANK -> listOf(PHONE_NUMBER_NON_NULL_BUT_BLANK)
71+
LENGTH_TOO_SHORT -> listOf(PHONE_NUMBER_LENGTH_TOO_SHORT)
72+
LENGTH_TOO_LONG -> listOf(PHONE_NUMBER_LENGTH_TOO_LONG)
73+
PhoneNumberValidator.Result.VALID -> listOf()
74+
}
6375
}
6476

6577
if (address == null) {

app/src/main/java/org/simple/clinic/patient/PatientEntryValidationError.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ enum class PatientEntryValidationError(val analyticsName: String) {
55
FULL_NAME_EMPTY("Patient Entry:Name is empty"),
66
PHONE_NUMBER_NON_NULL_BUT_BLANK("Patient Entry:Phone Number is empty"),
77
PHONE_NUMBER_EMPTY("Patient Entry:Phone Number is empty"),
8+
PHONE_NUMBER_LENGTH_TOO_SHORT("Patient Entry:Phone Number is less than 6 digits"),
9+
PHONE_NUMBER_LENGTH_TOO_LONG("Patient Entry:Phone Number is more than 12 digits"),
810
BOTH_DATEOFBIRTH_AND_AGE_ABSENT("Patient Entry:Age and DOB are both absent"),
911
BOTH_DATEOFBIRTH_AND_AGE_PRESENT("Patient Entry:Age and DOB are both present"),
1012
INVALID_DATE_OF_BIRTH("Patient Entry:Invalid DOB"),

app/src/main/java/org/simple/clinic/patient/PatientRepository.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.simple.clinic.newentry.DateOfBirthFormatValidator
1414
import org.simple.clinic.patient.SyncStatus.DONE
1515
import org.simple.clinic.patient.SyncStatus.PENDING
1616
import org.simple.clinic.patient.sync.PatientPayload
17+
import org.simple.clinic.registration.phone.PhoneNumberValidator
1718
import org.simple.clinic.user.UserSession
1819
import org.simple.clinic.util.Just
1920
import org.simple.clinic.util.None
@@ -37,7 +38,8 @@ class PatientRepository @Inject constructor(
3738
private val database: AppDatabase,
3839
private val dobValidator: DateOfBirthFormatValidator,
3940
private val facilityRepository: FacilityRepository,
40-
private val userSession: UserSession
41+
private val userSession: UserSession,
42+
private val numberValidator: PhoneNumberValidator
4143
) {
4244

4345
private val ageFuzziness: Int = 5
@@ -219,7 +221,7 @@ class PatientRepository @Inject constructor(
219221

220222
val validation = cachedOngoingEntry
221223
.flatMapCompletable {
222-
val validationErrors = it.validationErrors(dobValidator)
224+
val validationErrors = it.validationErrors(dobValidator, numberValidator)
223225
if (validationErrors.isEmpty()) {
224226
Completable.complete()
225227
} else {
Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,47 @@
11
package org.simple.clinic.registration.phone
22

3+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Result
4+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Result.LENGTH_TOO_LONG
5+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Result.LENGTH_TOO_SHORT
6+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Result.VALID
7+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Type.LANDLINE_OR_MOBILE
8+
import org.simple.clinic.registration.phone.PhoneNumberValidator.Type.MOBILE
9+
310
interface PhoneNumberValidator {
4-
fun isValid(number: String): Boolean
11+
enum class Type {
12+
LANDLINE_OR_MOBILE,
13+
MOBILE
14+
}
15+
16+
enum class Result {
17+
VALID,
18+
LENGTH_TOO_SHORT,
19+
LENGTH_TOO_LONG,
20+
BLANK
21+
}
22+
23+
fun validate(number: String, type: Type): Result
524
}
625

726
class IndianPhoneNumberValidator : PhoneNumberValidator {
8-
9-
override fun isValid(number: String): Boolean {
10-
return number.length == 10
27+
override fun validate(number: String, type: PhoneNumberValidator.Type): Result {
28+
return when (type) {
29+
MOBILE -> {
30+
when {
31+
number.isBlank() -> Result.BLANK
32+
number.length < 10 -> LENGTH_TOO_SHORT
33+
number.length > 10 -> LENGTH_TOO_LONG
34+
else -> VALID
35+
}
36+
}
37+
LANDLINE_OR_MOBILE -> {
38+
when {
39+
number.isBlank() -> Result.BLANK
40+
number.length < 6 -> LENGTH_TOO_SHORT
41+
number.length > 12 -> LENGTH_TOO_LONG
42+
else -> VALID
43+
}
44+
}
45+
}
1146
}
1247
}

0 commit comments

Comments
 (0)