phone validation
This commit is contained in:
parent
98edde4a8f
commit
1ab49d8b08
35
src/exercises/TP1/PhoneValidation/index.test.ts
Normal file
35
src/exercises/TP1/PhoneValidation/index.test.ts
Normal file
@ -0,0 +1,35 @@
|
||||
import { PhoneValidation } from "./index";
|
||||
|
||||
describe("Test PhoneValidation", () => {
|
||||
const phoneValidator = new PhoneValidation();
|
||||
|
||||
it.each([
|
||||
{ input: "0612345678", expected: "0612345678" },
|
||||
{ input: "07.12.34.56.78", expected: "07.12.34.56.78" },
|
||||
{ input: "04 12 34 56 78", expected: "04 12 34 56 78" },
|
||||
{ input: "08/12/34/56/78", expected: "08/12/34/56/78" }
|
||||
])(
|
||||
"should validate phone %s correctly",
|
||||
({ input, expected }) => {
|
||||
const result = phoneValidator.validatePhone(input);
|
||||
expect(result).toEqual(expected);
|
||||
console.log(`Test with input = ${input}, expected = ${expected}, result = ${result}`);
|
||||
}
|
||||
);
|
||||
|
||||
it.each([
|
||||
{ input: "", expectedErrorMsg: "Le numéro ne peut pas être vide" },
|
||||
{ input: "123", expectedErrorMsg: "Le numéro doit contenir exactement 10 chiffres" },
|
||||
{ input: "061234567", expectedErrorMsg: "Le numéro doit contenir exactement 10 chiffres" },
|
||||
{ input: "0912345678", expectedErrorMsg: "Le numéro doit commencer par 04, 06, 07 ou 08" },
|
||||
{ input: "06.123.45.6.78", expectedErrorMsg: "Le numéro doit être composé de 5 paires de deux chiffres séparés par des points, des espaces ou des slashs" },
|
||||
{ input: "06/12/34/56", expectedErrorMsg: "Le numéro doit contenir exactement 10 chiffres" },
|
||||
{ input: "0312345678", expectedErrorMsg: "Le numéro doit commencer par 04, 06, 07 ou 08" },
|
||||
{ input: "05.12.34.56.78", expectedErrorMsg: "Le numéro doit commencer par 04, 06, 07 ou 08" }
|
||||
])(
|
||||
"should throw a validation exception for invalid phone %s",
|
||||
({ input, expectedErrorMsg }) => {
|
||||
expect(() => phoneValidator.validatePhone(input)).toThrowError(expectedErrorMsg);
|
||||
}
|
||||
);
|
||||
});
|
45
src/exercises/TP1/PhoneValidation/index.ts
Normal file
45
src/exercises/TP1/PhoneValidation/index.ts
Normal file
@ -0,0 +1,45 @@
|
||||
export class PhoneValidation {
|
||||
validatePhone(input: string): string {
|
||||
if (input.length === 0) {
|
||||
throw new ValidationException("Le numéro ne peut pas être vide");
|
||||
}
|
||||
|
||||
// digit checker
|
||||
const digitsOnly = input.replace(/[ ./]/g, '');
|
||||
if (!/^\d{10}$/.test(digitsOnly)) {
|
||||
throw new ValidationException("Le numéro doit contenir exactement 10 chiffres");
|
||||
}
|
||||
|
||||
// check number
|
||||
if (!/^(04|06|07|08)/.test(digitsOnly)) {
|
||||
throw new ValidationException("Le numéro doit commencer par 04, 06, 07 ou 08");
|
||||
}
|
||||
|
||||
// separator is '.' or '/' or ' ' and identiques
|
||||
const separators = input.match(/[ ./]/g);
|
||||
if (separators) {
|
||||
if (separators.length !== 4) {
|
||||
throw new ValidationException("Le numéro doit comporter 5 paires de chiffres séparés par des points, des espaces ou des slashs, mais pas en même temps");
|
||||
}
|
||||
|
||||
const separator = separators[0];
|
||||
if (!/^[ .\/]$/.test(separator)) {
|
||||
throw new ValidationException("Les séparateurs acceptés sont seulement des points, des espaces ou des slashs");
|
||||
}
|
||||
|
||||
const parts = input.split(separator);
|
||||
if (parts.length !== 5 || parts.some(part => part.length !== 2 || !/^\d{2}$/.test(part))) {
|
||||
throw new ValidationException("Le numéro doit être composé de 5 paires de deux chiffres séparés par des points, des espaces ou des slashs");
|
||||
}
|
||||
}
|
||||
|
||||
return input;
|
||||
}
|
||||
}
|
||||
|
||||
export class ValidationException extends Error {
|
||||
constructor(message: string) {
|
||||
super(message);
|
||||
this.name = 'ValidationException';
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user