Skip to content

Instantly share code, notes, and snippets.

@guillaumevincent
Last active December 23, 2020 16:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guillaumevincent/9be57e32015b7252d36a8f04f89861f8 to your computer and use it in GitHub Desktop.
Save guillaumevincent/9be57e32015b7252d36a8f04f89861f8 to your computer and use it in GitHub Desktop.
ES Typescript Kata
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