Skip to content

Commit 6deb8d1

Browse files
committed
feat(tiered_pricing): 🔵 add Subscriptions concept
Also add parallel change for priceFor method
1 parent 8dc3f56 commit 6deb8d1

File tree

4 files changed

+43
-12
lines changed

4 files changed

+43
-12
lines changed

exercises/graduated_tiered_prices/solutions/adrianliz/src/Tier.ts renamed to exercises/graduated_tiered_prices/solutions/adrianliz/src/GraduatedTier.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export default class Tier {
1+
export default class GraduatedTier {
22
constructor(
33
private readonly from: number,
44
private readonly to: number,
Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
1+
import GraduatedTier from "./GraduatedTier";
12
import NumberOfSubscriptionsNotAllowed from "./NumberOfSubscriptionsNotAllowed";
2-
import Tier from "./Tier";
3+
import Subscriptions from "./Subscriptions";
34

45
export default class GraduatedTieredPricing {
6+
private tiers(): GraduatedTier[] {
7+
return [
8+
new GraduatedTier(1, 2, 299),
9+
new GraduatedTier(3, 10, 239),
10+
new GraduatedTier(11, 25, 219),
11+
new GraduatedTier(26, 50, 199),
12+
new GraduatedTier(51, Number.MAX_SAFE_INTEGER, 149),
13+
];
14+
}
15+
516
priceFor(subscriptions: number): number {
617
if (subscriptions < 1) {
718
throw new NumberOfSubscriptionsNotAllowed();
819
}
920

10-
const tiers = [
11-
new Tier(1, 2, 299),
12-
new Tier(3, 10, 239),
13-
new Tier(11, 25, 219),
14-
new Tier(26, 50, 199),
15-
new Tier(51, Number.MAX_SAFE_INTEGER, 149),
16-
];
21+
const tiers = this.tiers();
1722

1823
return (
1924
tiers[0].totalFor(subscriptions) +
@@ -23,4 +28,8 @@ export default class GraduatedTieredPricing {
2328
tiers[4].totalFor(subscriptions)
2429
);
2530
}
31+
32+
priceFor2(subscriptions: Subscriptions): number {
33+
return subscriptions.priceFor(this.tiers());
34+
}
2635
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import GraduatedTier from "./GraduatedTier";
2+
import NumberOfSubscriptionsNotAllowed from "./NumberOfSubscriptionsNotAllowed";
3+
4+
export default class Subscriptions {
5+
constructor(private readonly subscriptions: number) {
6+
if (subscriptions < 1) {
7+
throw new NumberOfSubscriptionsNotAllowed();
8+
}
9+
}
10+
11+
priceFor(tiers: GraduatedTier[]): number {
12+
return tiers.reduce(
13+
(total, tier) => total + tier.totalFor(this.subscriptions),
14+
0
15+
);
16+
}
17+
}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ import each from "jest-each";
22

33
import GraduatedTieredPricing from "../src/GraduatedTieredPricing";
44
import NumberOfSubscriptionsNotAllowed from "../src/NumberOfSubscriptionsNotAllowed";
5+
import Subscriptions from "../src/Subscriptions";
56

67
describe("Graduated tiered pricing should", () => {
7-
it("calculate the price for 0 subscriptions", () => {
8+
it("throw number of subscriptions not allowed for 0 subscriptions", () => {
89
const pricing = new GraduatedTieredPricing();
9-
expect(() => pricing.priceFor(0)).toThrow(NumberOfSubscriptionsNotAllowed);
10+
expect(() => pricing.priceFor2(new Subscriptions(0))).toThrow(
11+
NumberOfSubscriptionsNotAllowed
12+
);
1013
});
1114

1215
each([
@@ -21,7 +24,9 @@ describe("Graduated tiered pricing should", () => {
2124
"calculate the price for %i subscriptions",
2225
(subscriptions: number, expectedPrice: number) => {
2326
const pricing = new GraduatedTieredPricing();
24-
expect(pricing.priceFor(subscriptions)).toBe(expectedPrice);
27+
expect(pricing.priceFor2(new Subscriptions(subscriptions))).toBe(
28+
expectedPrice
29+
);
2530
}
2631
);
2732
});

0 commit comments

Comments
 (0)