Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .babelrc
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
"presets": ["@babel/preset-env"]
"presets": ["@babel/preset-env", "@babel/preset-typescript"]
}
3 changes: 2 additions & 1 deletion index.js → index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Drug, Pharmacy } from "./pharmacy";
import { Pharmacy } from "./src/pharmacy/pharmacy";
import { Drug } from "./src/drug/drug";
import fs from "fs";

const drugs = [
Expand Down
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"scripts": {
"lint": "eslint .",
"test": "jest",
"start": "babel-node index.js"
"start": "babel-node --extensions \".ts\" index.ts"
},
"devDependencies": {
"@babel/cli": "^7.1.0",
Expand All @@ -28,5 +28,8 @@
"jest": "24.8.0",
"prettier": "^1.14.3",
"regenerator-runtime": "^0.12.1"
},
"dependencies": {
"@babel/preset-typescript": "^7.16.7"
}
}
66 changes: 0 additions & 66 deletions pharmacy.js

This file was deleted.

31 changes: 31 additions & 0 deletions src/drug/drug.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { benefitEvolutionRules, HERBAL_TEA } from "./drug";

describe("Pharmacy", () => {
it("should decrease the benefit according default rule", () => {
expect(benefitEvolutionRules.default(3, 1)).toEqual(2);
expect(benefitEvolutionRules.default(3, -1)).toEqual(1);

/* i could check in my function if the parameters are NaN,
Infinite or other type but it is not the interessting part of the exercise */

expect(benefitEvolutionRules.default(NaN, 1)).toEqual(NaN);
expect(benefitEvolutionRules.default(1, NaN)).toEqual(-1);
expect(benefitEvolutionRules.default(Infinity, 1)).toEqual(Infinity);
expect(benefitEvolutionRules.default("tototo", 1)).toEqual(NaN);
});
it("should check update fervex benefit according its rules", () => {
expect(benefitEvolutionRules.Fervex(20, 11)).toBe(21);
expect(benefitEvolutionRules.Fervex(20, 9)).toBe(22);
expect(benefitEvolutionRules.Fervex(20, 4)).toBe(23);
expect(benefitEvolutionRules.Fervex(20, 0)).toBe(0);
});
it("should check update Herbal Tea benefit according its rules", () => {
expect(benefitEvolutionRules[HERBAL_TEA](20, 1)).toBe(21);
expect(benefitEvolutionRules[HERBAL_TEA](20, 0)).toBe(22);
});
it("should check update dafalgan benefit according its rules", () => {
expect(benefitEvolutionRules.Dafalgan(10, 1)).toBe(8);
expect(benefitEvolutionRules.Dafalgan(10, 0)).toBe(6);
expect(benefitEvolutionRules.Dafalgan(10, -1)).toBe(6);
});
});
71 changes: 71 additions & 0 deletions src/drug/drug.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
export interface DrugInterface {
name: string;
expiresIn: number;
benefit: number;
checkBenefit: () => void;
canUpdateBenefit: () => boolean;
}

export class Drug implements DrugInterface {
name: string;
expiresIn: number;
benefit: number;
constructor(name, expiresIn, benefit) {
this.name = name;
this.expiresIn = expiresIn;
this.benefit = benefit;
}

checkBenefit() {
if (this.benefit > 50) this.benefit = 50;
if (this.benefit < 0) this.benefit = 0;
}

/* cela marche dans le cadre de l'exercice,
cependant ce n'est pas la meilleur façon de faire si de nouveaux cas particuliers arrivent */
canUpdateBenefit() {
return (
(this.benefit < 50 && this.benefit > 0) ||
(this.name === FERVEX && this.benefit !== 0)
);
}
}

export const DEFAULT = "default";
export const MAGIC_PILL = "Magic Pill";
export const HERBAL_TEA = "Herbal Tea";
const FERVEX = "Fervex";
const DAFALGAN = "Dafalgan";

const BENEFIT_CHANGE = 1;

type updateBenefitFunction = (benefit: number, expiresIn?: number) => number;

const getDefaultBenefitUpdate = (expiresIn: number): number =>
expiresIn > 0 ? BENEFIT_CHANGE : BENEFIT_CHANGE * 2;

const updateDefautDrugBenefit: updateBenefitFunction = (benefit, expiresIn) =>
benefit - getDefaultBenefitUpdate(expiresIn);

const updateUpgradingDrugsBenefit: updateBenefitFunction = (
benefit,
expiresIn
): number => benefit + getDefaultBenefitUpdate(expiresIn);

const upgradeDafalganBenefit: updateBenefitFunction = (benefit, expiresIn) =>
benefit - 2 * getDefaultBenefitUpdate(expiresIn);

const updateFervexBenefit: updateBenefitFunction = (benefit, expiresIn) => {
if (expiresIn <= 0) return 0;
if (expiresIn <= 5) return benefit + BENEFIT_CHANGE * 3;
if (expiresIn <= 10) return benefit + BENEFIT_CHANGE * 2;
return benefit + BENEFIT_CHANGE;
};

export const benefitEvolutionRules: { [key: string]: updateBenefitFunction } = {
[DEFAULT]: updateDefautDrugBenefit,
[HERBAL_TEA]: updateUpgradingDrugsBenefit,
[FERVEX]: updateFervexBenefit,
[MAGIC_PILL]: benefit => benefit,
[DAFALGAN]: upgradeDafalganBenefit
};
3 changes: 2 additions & 1 deletion pharmacy.test.js → src/pharmacy/pharmacy.test.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { Drug, Pharmacy } from "./pharmacy";
import { Pharmacy } from "./pharmacy";
import { Drug } from "../drug/drug";

describe("Pharmacy", () => {
it("should decrease the benefit and expiresIn", () => {
Expand Down
31 changes: 31 additions & 0 deletions src/pharmacy/pharmacy.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { benefitEvolutionRules, DEFAULT, Drug, MAGIC_PILL } from "../drug/drug";

interface PharmacyInterface {
drugs: Drug[];
updateBenefitValue: () => Drug[];
}

export class Pharmacy implements PharmacyInterface {
drugs: Drug[];
constructor(drugs = []) {
this.drugs = drugs;
}
updateBenefitValue() {
for (var i = 0; i < this.drugs.length; i++) {
const { expiresIn, benefit, name } = this.drugs[i];

if (name != MAGIC_PILL) {
this.drugs[i].expiresIn = expiresIn - 1;
}

if (this.drugs[i].canUpdateBenefit()) {
const benefitRule =
benefitEvolutionRules[name] || benefitEvolutionRules[DEFAULT];
this.drugs[i].benefit = benefitRule(benefit, expiresIn);
this.drugs[i].checkBenefit();
}
}

return this.drugs;
}
}
Loading