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 }