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
16 changes: 16 additions & 0 deletions drugs/dafalgan.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Drug, DrugName } from "./drug";

export class Dafalgan extends Drug {
constructor(expiresIn: number, benefit: number) {
super(DrugName.DAFALGAN, expiresIn, benefit);
}

public updateDrug(): void {
if (this.isExpired) {
this.decreaseBenefit(2);
return;
}
this.decreaseExpiresIn();
this.decreaseBenefit(2);
}
}
16 changes: 16 additions & 0 deletions drugs/doliprane.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Drug, DrugName } from "./drug";

export class Doliprane extends Drug {
constructor(expiresIn: number, benefit: number) {
super(DrugName.DOLIPRANE, expiresIn, benefit);
}

public updateDrug(): void {
if (this.isExpired) {
this.resetBenefit();
return;
}
this.decreaseExpiresIn();
this.decreaseBenefit();
}
}
88 changes: 88 additions & 0 deletions drugs/drug.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { Drug } from "./drug";
import { Fervex } from "./fervex";
import { HerbalTea } from "./herbalTea";
import { MagicPill } from "./magicPill";
import { Dafalgan } from "./dafalgan";
import { Doliprane } from "./doliprane";

describe("Drug", () => {
describe("MagicPill", () => {
it("expiresIn and benefit never change", () => {
const drug = new MagicPill(2, 3);
drug.updateDrug();
expect(drug.expiresIn).toEqual(2);
expect(drug.benefit).toEqual(3);
});
});

describe("Fervex", () => {
it("should increase benefit 2 times when expiresIn is less or equal 10", () => {
const drug = new Fervex(10, 3);
drug.updateDrug();

expect(drug.benefit).toEqual(5);
})

it("should increase benefit 3 times when expiresIn is less or equal 5", () => {
const drug = new Fervex(5, 3);
drug.updateDrug();

expect(drug.benefit).toEqual(6);
})

it("should decrease benefit to 0 when expireIn is 0", () => {
const drug = new Fervex(1, 3);
drug.updateDrug();
drug.updateDrug();

expect(drug.benefit).toEqual(0);
})
});

describe("HerbalTea", () => {
it("should increase benefit and decrease expireIn", () => {
const drug = new HerbalTea(10, 3);
drug.updateDrug();

expect(drug.benefit).toEqual(4);
expect(drug.expiresIn).toEqual(9);
})

it("should increase benefit 2 times when expireIn is 0", () => {
const drug = new HerbalTea(1, 3);

drug.updateDrug();
drug.updateDrug();

expect(drug.benefit).toEqual(6);
expect(drug.expiresIn).toEqual(0);
})

it('benefit can not increase until 50', () => {
const drug = new HerbalTea(0, 50);
drug.updateDrug();

expect(drug.benefit).toEqual(50);
});
});

describe("Doliprane", () => {
it("should decrease decrease expiresIn and benefit", () => {
const drug = new Doliprane(10, 3);
drug.updateDrug();

expect(drug.expiresIn).toEqual(9);
expect(drug.benefit).toEqual(2);
})
});

describe("Dafalgan", () => {
it("should decrease 2 time faster benefit", () => {
const drug = new Dafalgan(10, 3);
drug.updateDrug();

expect(drug.benefit).toEqual(1);
})
});

});
48 changes: 48 additions & 0 deletions drugs/drug.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
export abstract class Drug {
readonly minBenefit: number = 0;
readonly maxBenefit: number = 50;

public name: string;
public expiresIn: number;
public benefit: number;
public isExpired: boolean = false;

constructor(name: string, expiresIn: number, benefit: number) {
this.name = name;
this.expiresIn = expiresIn;
this.benefit = benefit;
}

public decreaseExpiresIn(): void {
this.expiresIn--;
if (this.expiresIn <= 0) {
this.isExpired = true;
}
};

public decreaseBenefit(multiplicator: number = 1): void {
if (this.isExpired) {
this.benefit - multiplicator * 2 <= this.minBenefit ? this.benefit = this.minBenefit : this.benefit -= multiplicator * 2;
} else {
this.benefit - multiplicator <= this.minBenefit ? this.benefit = this.minBenefit : this.benefit -= multiplicator;
}
};

public incrementBenefit(multiplicator: number = 1): void {
this.benefit + multiplicator >= this.maxBenefit ? this.benefit = this.maxBenefit : this.benefit += multiplicator;
};

public resetBenefit(): void {
this.benefit = this.minBenefit;
}

abstract updateDrug(): void;
}

export const DrugName = {
DOLIPRANE: "Doliprane",
HERBAL_TEA: "Herbal Tea",
FERVEX: "Fervex",
MAGIC_PILL: "Magic Pill",
DAFALGAN: "Dafalgan"
};
24 changes: 24 additions & 0 deletions drugs/fervex.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Drug, DrugName } from "./drug";

export class Fervex extends Drug {
constructor(expiresIn: number, benefit: number) {
super(DrugName.FERVEX, expiresIn, benefit);
}

public updateDrug(): void {
if (this.isExpired) {
this.resetBenefit();
return;
}
if (this.expiresIn <= 5) {
this.decreaseExpiresIn();
this.incrementBenefit(3);
return;
}
if (this.expiresIn <= 10) {
this.decreaseExpiresIn();
this.incrementBenefit(2);
return;
}
}
}
17 changes: 17 additions & 0 deletions drugs/herbalTea.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Drug, DrugName } from "./drug";

export class HerbalTea extends Drug {
constructor(expiresIn: number, benefit: number) {
super(DrugName.HERBAL_TEA, expiresIn, benefit);
}

public updateDrug(): void {
if (this.isExpired) {
this.incrementBenefit(2);
return;
}

this.decreaseExpiresIn();
this.incrementBenefit();
}
}
9 changes: 9 additions & 0 deletions drugs/magicPill.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Drug, DrugName } from "./drug";

export class MagicPill extends Drug {
constructor(expiresIn: number, benefit: number) {
super(DrugName.MAGIC_PILL, expiresIn, benefit);
}

public updateDrug(): void {}
}
11 changes: 11 additions & 0 deletions golden-master.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import fs from 'fs';

describe('Golden master test', () => {
it('should expect same result as the initial output', () => {

const initialResult = fs.readFileSync('initial-output.txt').toString();
const newResult = fs.readFileSync('output.txt').toString();

expect(newResult).toEqual(initialResult);
})
});
26 changes: 0 additions & 26 deletions index.js

This file was deleted.

41 changes: 41 additions & 0 deletions index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import fs from "fs";
import { Dafalgan } from "./drugs/dafalgan";
import { Doliprane } from "./drugs/doliprane";
import { Drug } from "./drugs/drug";
import { Fervex } from "./drugs/fervex";
import { HerbalTea } from "./drugs/herbalTea";
import { MagicPill } from "./drugs/magicPill";
import { Pharmacy } from "./pharmacy";

const drugs: Drug[] = [
new Doliprane(20, 30),
new HerbalTea(10, 5),
new Fervex(5, 40),
new MagicPill(15, 40),
new Dafalgan(10, 30)
];

const trial: Pharmacy = new Pharmacy(drugs);

const log: string[] = [];

const replacer = (key: string, value: string): any => {
if ('minBenefit' === key || 'maxBenefit' === key || 'isExpired' === key) {
return undefined;
}
return value;
};

for (let elapsedDays = 0; elapsedDays < 30; elapsedDays++) {
log.push(JSON.stringify(trial.updateBenefitValue(), replacer));
}

/* eslint-disable no-console */
fs.writeFile("output.txt", log.toString(), err => {
if (err) {
console.log("error");
} else {
console.log("success");
}
});
/* eslint-enable no-console */
1 change: 1 addition & 0 deletions initial-output.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
[{"name":"Doliprane","expiresIn":19,"benefit":29},{"name":"Herbal Tea","expiresIn":9,"benefit":6},{"name":"Fervex","expiresIn":4,"benefit":43},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":18,"benefit":28},{"name":"Herbal Tea","expiresIn":8,"benefit":7},{"name":"Fervex","expiresIn":3,"benefit":46},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":17,"benefit":27},{"name":"Herbal Tea","expiresIn":7,"benefit":8},{"name":"Fervex","expiresIn":2,"benefit":49},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":16,"benefit":26},{"name":"Herbal Tea","expiresIn":6,"benefit":9},{"name":"Fervex","expiresIn":1,"benefit":50},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":15,"benefit":25},{"name":"Herbal Tea","expiresIn":5,"benefit":10},{"name":"Fervex","expiresIn":0,"benefit":50},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":14,"benefit":24},{"name":"Herbal Tea","expiresIn":4,"benefit":11},{"name":"Fervex","expiresIn":-1,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":13,"benefit":23},{"name":"Herbal Tea","expiresIn":3,"benefit":12},{"name":"Fervex","expiresIn":-2,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":12,"benefit":22},{"name":"Herbal Tea","expiresIn":2,"benefit":13},{"name":"Fervex","expiresIn":-3,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":11,"benefit":21},{"name":"Herbal Tea","expiresIn":1,"benefit":14},{"name":"Fervex","expiresIn":-4,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":10,"benefit":20},{"name":"Herbal Tea","expiresIn":0,"benefit":15},{"name":"Fervex","expiresIn":-5,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":9,"benefit":19},{"name":"Herbal Tea","expiresIn":-1,"benefit":17},{"name":"Fervex","expiresIn":-6,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":8,"benefit":18},{"name":"Herbal Tea","expiresIn":-2,"benefit":19},{"name":"Fervex","expiresIn":-7,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":7,"benefit":17},{"name":"Herbal Tea","expiresIn":-3,"benefit":21},{"name":"Fervex","expiresIn":-8,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":6,"benefit":16},{"name":"Herbal Tea","expiresIn":-4,"benefit":23},{"name":"Fervex","expiresIn":-9,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":5,"benefit":15},{"name":"Herbal Tea","expiresIn":-5,"benefit":25},{"name":"Fervex","expiresIn":-10,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":4,"benefit":14},{"name":"Herbal Tea","expiresIn":-6,"benefit":27},{"name":"Fervex","expiresIn":-11,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":3,"benefit":13},{"name":"Herbal Tea","expiresIn":-7,"benefit":29},{"name":"Fervex","expiresIn":-12,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":2,"benefit":12},{"name":"Herbal Tea","expiresIn":-8,"benefit":31},{"name":"Fervex","expiresIn":-13,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":1,"benefit":11},{"name":"Herbal Tea","expiresIn":-9,"benefit":33},{"name":"Fervex","expiresIn":-14,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":0,"benefit":10},{"name":"Herbal Tea","expiresIn":-10,"benefit":35},{"name":"Fervex","expiresIn":-15,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-1,"benefit":8},{"name":"Herbal Tea","expiresIn":-11,"benefit":37},{"name":"Fervex","expiresIn":-16,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-2,"benefit":6},{"name":"Herbal Tea","expiresIn":-12,"benefit":39},{"name":"Fervex","expiresIn":-17,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-3,"benefit":4},{"name":"Herbal Tea","expiresIn":-13,"benefit":41},{"name":"Fervex","expiresIn":-18,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-4,"benefit":2},{"name":"Herbal Tea","expiresIn":-14,"benefit":43},{"name":"Fervex","expiresIn":-19,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-5,"benefit":0},{"name":"Herbal Tea","expiresIn":-15,"benefit":45},{"name":"Fervex","expiresIn":-20,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-6,"benefit":0},{"name":"Herbal Tea","expiresIn":-16,"benefit":47},{"name":"Fervex","expiresIn":-21,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-7,"benefit":0},{"name":"Herbal Tea","expiresIn":-17,"benefit":49},{"name":"Fervex","expiresIn":-22,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-8,"benefit":0},{"name":"Herbal Tea","expiresIn":-18,"benefit":50},{"name":"Fervex","expiresIn":-23,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-9,"benefit":0},{"name":"Herbal Tea","expiresIn":-19,"benefit":50},{"name":"Fervex","expiresIn":-24,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}],[{"name":"Doliprane","expiresIn":-10,"benefit":0},{"name":"Herbal Tea","expiresIn":-20,"benefit":50},{"name":"Fervex","expiresIn":-25,"benefit":0},{"name":"Magic Pill","expiresIn":15,"benefit":40}]
Loading