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));
72 Exception exception = assertThrows(IllegalArgumentException.class, () -> {
73 engine.cultivate(BigDecimal.valueOf(1000L).longValue());
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 }