From 1ab49d8b0894eac240ffd1e226d98558f7456348 Mon Sep 17 00:00:00 2001 From: OMGiTzPomPom Date: Fri, 29 Mar 2024 12:23:21 +0100 Subject: [PATCH] phone validation --- .../TP1/PhoneValidation/index.test.ts | 35 +++++++++++++++ src/exercises/TP1/PhoneValidation/index.ts | 45 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/exercises/TP1/PhoneValidation/index.test.ts create mode 100644 src/exercises/TP1/PhoneValidation/index.ts diff --git a/src/exercises/TP1/PhoneValidation/index.test.ts b/src/exercises/TP1/PhoneValidation/index.test.ts new file mode 100644 index 0000000..ec966ac --- /dev/null +++ b/src/exercises/TP1/PhoneValidation/index.test.ts @@ -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); + } + ); +}); diff --git a/src/exercises/TP1/PhoneValidation/index.ts b/src/exercises/TP1/PhoneValidation/index.ts new file mode 100644 index 0000000..3f31c08 --- /dev/null +++ b/src/exercises/TP1/PhoneValidation/index.ts @@ -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'; + } +}