Last active
December 23, 2020 16:39
-
-
Save guillaumevincent/9be57e32015b7252d36a8f04f89861f8 to your computer and use it in GitHub Desktop.
ES Typescript Kata
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
interface IEvenement {} | |
class Depot implements IEvenement { | |
valeur: number; | |
constructor(valeur: number) { | |
this.valeur = valeur; | |
} | |
} | |
class Retrait implements IEvenement { | |
valeur: number; | |
constructor(valeur: number) { | |
this.valeur = valeur; | |
} | |
} | |
class Compte { | |
private _solde = 0; | |
constructor(evenements: IEvenement[] = []) { | |
for (let i = 0; i < evenements.length; i++) { | |
const evenement = evenements[i]; | |
this.appliquer(evenement); | |
} | |
} | |
get solde(): number { | |
return this._solde; | |
} | |
set solde(nouveauSolde: number) { | |
throw new Error("Impossible de changer le solde du compte directement"); | |
} | |
private appliquer(evenement: IEvenement) { | |
if (evenement instanceof Depot) { | |
this._solde += evenement.valeur; | |
} | |
if (evenement instanceof Retrait) { | |
this._solde -= evenement.valeur; | |
} | |
} | |
} | |
class FluxEvenements { | |
private _evenements: IEvenement[] = []; | |
get length(): number { | |
return this._evenements.length; | |
} | |
get evenements(): IEvenement[] { | |
return this._evenements; | |
} | |
set evenements(nouvelleListeEvenements: IEvenement[]) { | |
throw new Error( | |
"Impossible de changer la liste des évènements directement" | |
); | |
} | |
ajouter(evenement: IEvenement) { | |
this._evenements.push(evenement); | |
} | |
} | |
describe("FluxEvenements", () => { | |
test("peut ajouter un evènement", () => { | |
const fluxEvenements = new FluxEvenements(); | |
expect(fluxEvenements.evenements.length).toBe(0); | |
fluxEvenements.ajouter(new Depot(100)); | |
expect(fluxEvenements.evenements.length).toBe(1); | |
}); | |
test("ne récupérer la liste des évènements", () => { | |
const fluxEvenements = new FluxEvenements(); | |
fluxEvenements.ajouter(new Depot(100)); | |
expect(fluxEvenements.evenements[0] instanceof Depot).toBe(true); | |
}); | |
test("ne peut pas changer la liste des évènements", () => { | |
const fluxEvenements = new FluxEvenements(); | |
fluxEvenements.ajouter(new Depot(100)); | |
const supprimerLesEvenements = () => { | |
fluxEvenements.evenements = []; | |
}; | |
expect(supprimerLesEvenements).toThrow(Error); | |
}); | |
}); | |
describe("Compte", () => { | |
test("a un solde à zéro", () => { | |
const compte = new Compte(); | |
expect(compte.solde).toBe(0); | |
}); | |
test("peut déposer de l'argent sur un compte", () => { | |
const fluxEvenements = new FluxEvenements(); | |
fluxEvenements.ajouter(new Depot(100)); | |
const compte = new Compte(fluxEvenements.evenements); | |
expect(compte.solde).toBe(100); | |
}); | |
test("peut déposer et enlever de l'argent sur un compte", () => { | |
const fluxEvenements = new FluxEvenements(); | |
fluxEvenements.ajouter(new Depot(100)); | |
fluxEvenements.ajouter(new Retrait(100)); | |
const compte = new Compte(fluxEvenements.evenements); | |
expect(compte.solde).toBe(0); | |
}); | |
test("ne peut pas modifier le solde d'un compte directement", () => { | |
const changerSolde = () => { | |
const compte = new Compte(); | |
compte.solde = 1_000_000; | |
}; | |
expect(changerSolde).toThrow(Error); | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment