View Javadoc
1   package de.aikiit.game.kaiser;
2   
3   import org.junit.jupiter.api.BeforeEach;
4   import org.junit.jupiter.api.Test;
5   
6   import java.math.BigDecimal;
7   import java.math.RoundingMode;
8   
9   import static org.assertj.core.api.Assertions.assertThat;
10  import static org.junit.jupiter.api.Assertions.assertThrows;
11  
12  public class KaiserEngineCultivateTest {
13      private KaiserEngine engine;
14  
15      @BeforeEach
16      void createNewEngineUnderTest() {
17          this.engine = new KaiserEngine();
18      }
19  
20      @Test
21      void cultivateZeroChangesCostForNextRound() {
22          BigDecimal costB4 = engine.getCost();
23  
24          engine.cultivate(0L);
25  
26          assertThat(engine.getCost()).isNotEqualTo(costB4);
27      }
28  
29      @Test
30      void cultivateNegativeInputDoesNotChangeCost() {
31          BigDecimal costB4 = engine.getCost();
32  
33          engine.cultivate(-1234L);
34  
35          assertThat(engine.getCost()).isEqualTo(costB4);
36      }
37  
38      @Test
39      void youCanNotCultivateMoreThanYourArea() {
40          BigDecimal areaB4 = engine.getArea();
41  
42          Exception exception = assertThrows(IllegalArgumentException.class, () -> engine.cultivate(Long.MAX_VALUE));
43  
44          String expectedMessage = "You cannot cultivate more area than you have.";
45          assertThat(exception.getMessage()).contains(expectedMessage);
46          assertThat(engine.getArea()).isEqualTo(areaB4);
47      }
48  
49      @Test
50      void youNeedToHaveEnoughSupplies() {
51          engine.setArea(BigDecimal.valueOf(Long.MAX_VALUE));
52          engine.setSupplies(BigDecimal.valueOf(Long.MAX_VALUE).divide(BigDecimal.valueOf(3), RoundingMode.HALF_UP));
53          BigDecimal suppliesB4 = engine.getSupplies();
54          BigDecimal areaB4 = engine.getArea();
55  
56          Exception exception = assertThrows(IllegalArgumentException.class, () -> engine.cultivate(Long.MAX_VALUE));
57  
58          String expectedMessage = "You cannot cultivate more than you have.";
59          assertThat(exception.getMessage()).contains(expectedMessage);
60          assertThat(engine.getSupplies()).isEqualTo(suppliesB4);
61          assertThat(engine.getArea()).isEqualTo(areaB4);
62      }
63  
64      @Test
65      void youNeedWorkersForCultivation() {
66          engine.setArea(BigDecimal.valueOf(Long.MAX_VALUE));
67          engine.setSupplies(BigDecimal.valueOf(Long.MAX_VALUE).divide(BigDecimal.valueOf(3), RoundingMode.HALF_UP));
68          BigDecimal suppliesB4 = engine.getSupplies();
69          BigDecimal areaB4 = engine.getArea();
70  
71          assertThat(engine.getPopulation()).isEqualTo(BigDecimal.valueOf(95L)); // is default value
72          Exception exception = assertThrows(IllegalArgumentException.class, () -> {
73              engine.cultivate(BigDecimal.valueOf(1000L).longValue()); // is 10 times more than population
74          });
75  
76          String expectedMessage = "Not enough workers available.";
77          assertThat(exception.getMessage()).contains(expectedMessage);
78          assertThat(engine.getSupplies()).isEqualTo(suppliesB4);
79          assertThat(engine.getArea()).isEqualTo(areaB4);
80      }
81  
82      @Test
83      void cultivateRegularUseCaseAndSetPriceToOneAfterwards() {
84          BigDecimal supplyB4 = engine.getSupplies();
85          BigDecimal costB4 = engine.getCost();
86          engine.cultivate(4L);
87  
88          assertThat(engine.getSupplies()).isNotEqualTo(supplyB4);
89          assertThat(engine.getCost()).isNotEqualTo(costB4);
90      }
91  }