Skip to content

Commit f9eb4e2

Browse files
committed
feat(tiered_pricing): 🔴 add GraduatedTier named constructors
1 parent 483cbcf commit f9eb4e2

File tree

4 files changed

+64
-12
lines changed

4 files changed

+64
-12
lines changed

exercises/graduated_tiered_prices/solutions/adrianliz/src/GraduatedTier.ts

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,51 @@
1+
import InvalidTier from "./InvalidTier";
12
import Subscriptions from "./Subscriptions";
23

34
export default class GraduatedTier {
4-
constructor(
5+
private constructor(
56
private readonly from: number,
67
private readonly to: number,
7-
private readonly price: number
8-
) {}
8+
private readonly singleSubscriptionPrice: number
9+
) {
10+
if (to > Number.MAX_SAFE_INTEGER) {
11+
throw new InvalidTier();
12+
}
13+
}
14+
15+
static firstTier(
16+
numberOfSubscriptionsIn: number,
17+
singleSubscriptionPrice: number
18+
): GraduatedTier {
19+
return new GraduatedTier(
20+
1,
21+
numberOfSubscriptionsIn,
22+
singleSubscriptionPrice
23+
);
24+
}
25+
26+
static fromTier(
27+
from: GraduatedTier,
28+
numberOfSubscriptionsIn: number,
29+
singleSubscriptionPrice: number
30+
): GraduatedTier {
31+
const newFrom = from.to + 1;
32+
const newTo = newFrom + (numberOfSubscriptionsIn - 1);
33+
return new GraduatedTier(newFrom, newTo, singleSubscriptionPrice);
34+
}
35+
36+
static lastTier(
37+
from: GraduatedTier,
38+
singleSubscriptionPrice: number
39+
): GraduatedTier {
40+
return new GraduatedTier(
41+
from.to + 1,
42+
Number.MAX_SAFE_INTEGER,
43+
singleSubscriptionPrice
44+
);
45+
}
946

1047
private total(): number {
11-
return this.size() * this.price;
48+
return this.size() * this.singleSubscriptionPrice;
1249
}
1350

1451
size(): number {
@@ -36,6 +73,9 @@ export default class GraduatedTier {
3673
return 0;
3774
}
3875

39-
return subscriptions.numberOfSubscriptionsInTier(this) * this.price;
76+
return (
77+
subscriptions.numberOfSubscriptionsInTier(this) *
78+
this.singleSubscriptionPrice
79+
);
4080
}
4181
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export default class InvalidTier extends Error {
2+
constructor() {
3+
super("Invalid tier");
4+
}
5+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import GraduatedTier from "../src/GraduatedTier";
2+
import InvalidTier from "../src/InvalidTier";
3+
4+
describe("Graduated tiered should", () => {
5+
it("throw number of subscriptions not allowed for 0 subscriptions", () => {
6+
expect(() => GraduatedTier.firstTier(0, 199)).toThrow(InvalidTier);
7+
});
8+
});

exercises/graduated_tiered_prices/solutions/adrianliz/tests/GraduatedTieredPricing.test.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,12 @@ import Subscriptions from "../src/Subscriptions";
77

88
describe("Graduated tiered pricing should", () => {
99
const defaultTiers = (): GraduatedTier[] => {
10-
return [
11-
new GraduatedTier(1, 2, 299),
12-
new GraduatedTier(3, 10, 239),
13-
new GraduatedTier(11, 25, 219),
14-
new GraduatedTier(26, 50, 199),
15-
new GraduatedTier(51, Number.MAX_SAFE_INTEGER, 149),
16-
];
10+
const firstTier = GraduatedTier.firstTier(2, 299);
11+
const secondTier = GraduatedTier.fromTier(firstTier, 8, 239);
12+
const thirdTier = GraduatedTier.fromTier(secondTier, 15, 219);
13+
const fourthTier = GraduatedTier.fromTier(thirdTier, 25, 199);
14+
const lastTier = GraduatedTier.lastTier(fourthTier, 149);
15+
return [firstTier, secondTier, thirdTier, fourthTier, lastTier];
1716
};
1817

1918
it("throw number of subscriptions not allowed for 0 subscriptions", () => {

0 commit comments

Comments
 (0)