tdd-java-demo
tdd java demo with micro-commits
git clone https://9o.is/git/tdd-java-demo.git
DiscountTest.java
(3538B)
1 package takehome.model;
2
3 import org.junit.jupiter.api.Test;
4
5 import java.time.LocalDate;
6 import java.util.HashMap;
7 import java.util.Map;
8
9 import static org.hamcrest.MatcherAssert.assertThat;
10 import static org.hamcrest.Matchers.is;
11
12 class DiscountTest {
13
14 public static final Item APPLE = new Item("apple", 0.10);
15 public static final Item SOUP = new Item("soup", 0.65);
16 public static final Item BREAD = new Item("bread", 0.80);
17
18 public static final Discount APPLE_DISCOUNT = new Discount(0.01, APPLE);
19 public static final Discount BREAD_DISCOUNT = new Discount(0.40, SOUP, SOUP, BREAD);
20
21 public static final LocalDate TODAY = LocalDate.now();
22 public static final LocalDate TOMORROW = TODAY.plusDays(1);
23 public static final LocalDate YESTERDAY = TODAY.minusDays(1);
24
25 @Test
26 void getAmount() {
27 assertThat(APPLE_DISCOUNT.getAmount(), is(0.01));
28 }
29
30 @Test
31 void noDiscount() {
32 Basket basket = createBasketWithApples(0);
33 assertThat(APPLE_DISCOUNT.getDiscount(basket), is(0d));
34 }
35
36 @Test
37 void oneDiscount() {
38 Basket basket = createBasketWithApples(1);
39 assertThat(APPLE_DISCOUNT.getDiscount(basket), is(0.01));
40 }
41
42 @Test
43 void multipleDiscounts() {
44 Basket basket = createBasketWithApples(2);
45 assertThat(APPLE_DISCOUNT.getDiscount(basket), is(0.02));
46 }
47
48 @Test
49 void multipleItemsEmptyBasket() {
50 Basket basket = createBasketWithSoupBread(0, 0);
51 assertThat(BREAD_DISCOUNT.getDiscount(basket), is(0d));
52 }
53
54 @Test
55 void multipleItemsNoDiscount() {
56 Basket basket = createBasketWithSoupBread(1, 1);
57 assertThat(BREAD_DISCOUNT.getDiscount(basket), is(0d));
58 }
59
60 @Test
61 void multipleItemsOneDiscount() {
62 Basket basket = createBasketWithSoupBread(2, 1);
63 assertThat(BREAD_DISCOUNT.getDiscount(basket), is(0.40));
64 }
65
66 @Test
67 void multipleItemsMultipleDiscounts() {
68 Basket basket = createBasketWithSoupBread(4, 2);
69 assertThat(BREAD_DISCOUNT.getDiscount(basket), is(0.80));
70 }
71
72 @Test
73 void isInvalidBeforeStartDate() {
74 Discount discount = discountByDate(TODAY, TOMORROW);
75 assertThat(discount.isValid(YESTERDAY), is(false));
76 }
77
78 @Test
79 void isValidOnStartDate() {
80 Discount discount = discountByDate(TODAY, TOMORROW);
81 assertThat(discount.isValid(TODAY), is(true));
82 }
83
84 @Test
85 void isValidOnEndDate() {
86 Discount discount = discountByDate(TODAY, TOMORROW);
87 assertThat(discount.isValid(TOMORROW), is(true));
88 }
89
90 @Test
91 void isValidBetweenStartEndDates() {
92 Discount discount = discountByDate(YESTERDAY, TOMORROW);
93 assertThat(discount.isValid(TODAY), is(true));
94 }
95
96 @Test
97 void isInvalidAfterEndDate() {
98 Discount discount = discountByDate(YESTERDAY, TODAY);
99 assertThat(discount.isValid(TOMORROW), is(false));
100 }
101
102 private Discount discountByDate(LocalDate startDate, LocalDate endDate) {
103 return new Discount(0.01, startDate, endDate, APPLE);
104 }
105
106 private Basket createBasketWithApples(int amount) {
107 Map<Item, Integer> amounts = new HashMap<>();
108 amounts.put(APPLE, amount);
109 return new Basket(amounts);
110 }
111
112 private Basket createBasketWithSoupBread(int soupAmount, int breadAmount) {
113 Map<Item, Integer> amounts = new HashMap<>();
114 amounts.put(SOUP, soupAmount);
115 amounts.put(BREAD, breadAmount);
116 return new Basket(amounts);
117 }
118 }