From 841da37cb7296237d53de4767b08299757b41863 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 18 Mar 2024 18:34:34 +0100 Subject: [PATCH] made Chicken an enum --- README.md | 1 - .../ch/stephan/chickenfarm/dto/Chicken.java | 27 ++++- .../chickenfarm/registry/ChickenService.java | 10 +- .../registry/ChickenServiceTest.java | 20 ++-- .../services/MeasureControllerTest.java | 8 +- .../chickenfarm/timer/ScaleObserverTest.java | 110 +++++++++--------- 6 files changed, 95 insertions(+), 81 deletions(-) diff --git a/README.md b/README.md index 23269f0..5160eac 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,6 @@ This code will run on a Raspberry PI in a chicken barn. There are scales under t ### Epic v1: Chicken scale recognizes weight change and sends message about state (which chicken, an egg) via Messenger -* make ChickenService.initBoxes() resiliant for new Chickens (convert to enum, initBoxes using enum list) * check logs; observer and service log twice * log messures to file or Prometheus * write tests and mocks for mqtt client diff --git a/src/main/java/ch/stephan/chickenfarm/dto/Chicken.java b/src/main/java/ch/stephan/chickenfarm/dto/Chicken.java index ef29dce..0d22dc6 100644 --- a/src/main/java/ch/stephan/chickenfarm/dto/Chicken.java +++ b/src/main/java/ch/stephan/chickenfarm/dto/Chicken.java @@ -1,8 +1,25 @@ package ch.stephan.chickenfarm.dto; -public record Chicken(String name, int weight) { - public static final Chicken HEIDI = new Chicken("Heidi", 2200); - public static final Chicken KLARA = new Chicken("Klara", 2850); - public static final Chicken LILI = new Chicken("Lili", 2851); - public static final Chicken LULU = new Chicken("Lulu", 3450); +public enum Chicken { + HEIDI("Heidi", 2200), // + KLARA("Klara", 2850), // + LILI("Lili", 2851), // + LULU("Lulu", 3450); + + private String name; + private int weight; + + private Chicken(String name, int weight) { + this.name = name; + this.weight = weight; + } + + public String getName() { + return name; + } + + public int getWeight() { + return weight; + } + } diff --git a/src/main/java/ch/stephan/chickenfarm/registry/ChickenService.java b/src/main/java/ch/stephan/chickenfarm/registry/ChickenService.java index 4ef4f35..1ccb4a2 100644 --- a/src/main/java/ch/stephan/chickenfarm/registry/ChickenService.java +++ b/src/main/java/ch/stephan/chickenfarm/registry/ChickenService.java @@ -1,6 +1,6 @@ package ch.stephan.chickenfarm.registry; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.springframework.stereotype.Service; @@ -23,7 +23,7 @@ public Chicken guessChicken(int weight) { } private Chicken betterMatching(Chicken chicken, Chicken another, int weight) { - if (Math.abs(weight - chicken.weight()) <= Math.abs(weight - another.weight())) { + if (Math.abs(weight - chicken.getWeight()) <= Math.abs(weight - another.getWeight())) { return chicken; } else { return another; @@ -32,11 +32,7 @@ private Chicken betterMatching(Chicken chicken, Chicken another, int weight) { @PostConstruct public void initBoxes() { - sChickens = new ArrayList<>(); - sChickens.add(Chicken.HEIDI); - sChickens.add(Chicken.KLARA); - sChickens.add(Chicken.LILI); - sChickens.add(Chicken.LULU); + sChickens = Arrays.asList(Chicken.values()); } } diff --git a/src/test/java/ch/stephan/chickenfarm/registry/ChickenServiceTest.java b/src/test/java/ch/stephan/chickenfarm/registry/ChickenServiceTest.java index bc4abce..4535edf 100644 --- a/src/test/java/ch/stephan/chickenfarm/registry/ChickenServiceTest.java +++ b/src/test/java/ch/stephan/chickenfarm/registry/ChickenServiceTest.java @@ -19,39 +19,39 @@ private void setup() { @Test void testEqualWeight() { - Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.weight()); + Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.getWeight()); assertEquals(Chicken.HEIDI, chicken); - chicken = chickenService.guessChicken(Chicken.KLARA.weight()); + chicken = chickenService.guessChicken(Chicken.KLARA.getWeight()); assertEquals(Chicken.KLARA, chicken); - chicken = chickenService.guessChicken(Chicken.LILI.weight()); + chicken = chickenService.guessChicken(Chicken.LILI.getWeight()); assertEquals(Chicken.LILI, chicken); - chicken = chickenService.guessChicken(Chicken.LULU.weight()); + chicken = chickenService.guessChicken(Chicken.LULU.getWeight()); assertEquals(Chicken.LULU, chicken); } @Test void testTenGrammLighter() { - Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.weight() - 10); + Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.getWeight() - 10); assertEquals(Chicken.HEIDI, chicken); - chicken = chickenService.guessChicken(Chicken.KLARA.weight() - 10); + chicken = chickenService.guessChicken(Chicken.KLARA.getWeight() - 10); assertEquals(Chicken.KLARA, chicken); - chicken = chickenService.guessChicken(Chicken.LULU.weight() - 10); + chicken = chickenService.guessChicken(Chicken.LULU.getWeight() - 10); assertEquals(Chicken.LULU, chicken); } @Test void testTenGrammHeavier() { - Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.weight() + 10); + Chicken chicken = chickenService.guessChicken(Chicken.HEIDI.getWeight() + 10); assertEquals(Chicken.HEIDI, chicken); - chicken = chickenService.guessChicken(Chicken.LILI.weight() + 10); + chicken = chickenService.guessChicken(Chicken.LILI.getWeight() + 10); assertEquals(Chicken.LILI, chicken); - chicken = chickenService.guessChicken(Chicken.LULU.weight() + 10); + chicken = chickenService.guessChicken(Chicken.LULU.getWeight() + 10); assertEquals(Chicken.LULU, chicken); } diff --git a/src/test/java/ch/stephan/chickenfarm/services/MeasureControllerTest.java b/src/test/java/ch/stephan/chickenfarm/services/MeasureControllerTest.java index 9f00456..80cc7c8 100644 --- a/src/test/java/ch/stephan/chickenfarm/services/MeasureControllerTest.java +++ b/src/test/java/ch/stephan/chickenfarm/services/MeasureControllerTest.java @@ -54,8 +54,8 @@ class MeasureControllerTest { @Test void testMeasure() throws Exception { - when(scaleService.measureWeight(eq(BOX1.getId()))).thenReturn(CHICKEN1.weight()); - when(scaleService.measureWeight(eq(BOX2.getId()))).thenReturn(CHICKEN2.weight()); + when(scaleService.measureWeight(eq(BOX1.getId()))).thenReturn(CHICKEN1.getWeight()); + when(scaleService.measureWeight(eq(BOX2.getId()))).thenReturn(CHICKEN2.getWeight()); String mockMvcResult = mockMvc.perform(get("/measure").contentType(MediaType.APPLICATION_JSON))// .andExpect(status().isOk())// @@ -69,11 +69,11 @@ void testMeasure() throws Exception { assertThat(measures).hasSize(2); assertThat(measures.get(0).boxId()).isEqualTo(BOX1.getId()); assertThat(measures.get(0).boxDescription()).isEqualTo(BOX1.getDescription()); - assertThat(measures.get(0).currentWeight()).isEqualTo(CHICKEN1.weight()); + assertThat(measures.get(0).currentWeight()).isEqualTo(CHICKEN1.getWeight()); assertThat(measures.get(0).currentChicken()).isEqualTo(CHICKEN1.name()); assertThat(measures.get(1).boxId()).isEqualTo(BOX2.getId()); assertThat(measures.get(1).boxDescription()).isEqualTo(BOX2.getDescription()); - assertThat(measures.get(1).currentWeight()).isEqualTo(CHICKEN2.weight()); + assertThat(measures.get(1).currentWeight()).isEqualTo(CHICKEN2.getWeight()); assertThat(measures.get(1).currentChicken()).isEqualTo(CHICKEN2.name()); } diff --git a/src/test/java/ch/stephan/chickenfarm/timer/ScaleObserverTest.java b/src/test/java/ch/stephan/chickenfarm/timer/ScaleObserverTest.java index d3583b2..403e344 100644 --- a/src/test/java/ch/stephan/chickenfarm/timer/ScaleObserverTest.java +++ b/src/test/java/ch/stephan/chickenfarm/timer/ScaleObserverTest.java @@ -1,11 +1,9 @@ package ch.stephan.chickenfarm.timer; -import ch.stephan.chickenfarm.dto.Box; -import ch.stephan.chickenfarm.dto.Chicken; -import ch.stephan.chickenfarm.messenger.MessengerService; -import ch.stephan.chickenfarm.registry.BoxService; -import ch.stephan.chickenfarm.registry.ChickenService; -import ch.stephan.chickenfarm.scale.ScaleService; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.times; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -13,76 +11,80 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.times; + +import ch.stephan.chickenfarm.dto.Box; +import ch.stephan.chickenfarm.dto.Chicken; +import ch.stephan.chickenfarm.messenger.MessengerService; +import ch.stephan.chickenfarm.registry.BoxService; +import ch.stephan.chickenfarm.registry.ChickenService; +import ch.stephan.chickenfarm.scale.ScaleService; @ExtendWith(MockitoExtension.class) class ScaleObserverTest { - private ScaleObserver scaleObserver; + private ScaleObserver scaleObserver; + + @InjectMocks + private BoxService boxService; + + @Mock + private ScaleService mockedScaleService; - @InjectMocks - private BoxService boxService; + @Mock + private MessengerService mockMessengerService; - @Mock - private ScaleService mockedScaleService; + @InjectMocks + private ChickenService chickenService; - @Mock - private MessengerService mockMessengerService; + @BeforeEach + void setUp() throws Exception { + boxService.initBoxes(); + chickenService.initBoxes(); - @InjectMocks - private ChickenService chickenService; + scaleObserver = new ScaleObserver(boxService, mockedScaleService, mockMessengerService, chickenService); + } - @BeforeEach - void setUp() throws Exception { - boxService.initBoxes(); - chickenService.initBoxes(); + @Test + void testMeasureWeights() { + // Step 1: Two chickens are in the house + Box vorne = Box.VORNE; + Box hinten = Box.HINTEN; + Chicken heidi = Chicken.HEIDI; + Chicken klara = Chicken.KLARA; - scaleObserver = new ScaleObserver(boxService, mockedScaleService, mockMessengerService, chickenService); - } + Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(klara.getWeight() + 13); + Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(heidi.getWeight() + 17); - @Test - void testMeasureWeights() { - // Step 1: Two chickens are in the house - Box vorne = Box.VORNE; - Box hinten = Box.HINTEN; - Chicken heidi = Chicken.HEIDI; - Chicken klara = Chicken.KLARA; + scaleObserver.measureWeights(); - Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(klara.weight() + 13); - Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(heidi.weight() + 17); + Mockito.verify(mockMessengerService, times(2)).sendNotification(anyString()); - scaleObserver.measureWeights(); + // measure again, no new message + scaleObserver.measureWeights(); - Mockito.verify(mockMessengerService, times(2)).sendNotification(anyString()); + Mockito.verify(mockMessengerService, times(2)).sendNotification(anyString()); - // measure again, no new message - scaleObserver.measureWeights(); + // Step 2: Chickens laid eggs and left the house + Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(67); + Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(64); - Mockito.verify(mockMessengerService, times(2)).sendNotification(anyString()); + scaleObserver.measureWeights(); - // Step 2: Chickens laid eggs and left the house - Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(67); - Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(64); + Mockito.verify(mockMessengerService, times(4)).sendNotification(anyString()); - scaleObserver.measureWeights(); + // measure again, no new message + scaleObserver.measureWeights(); - Mockito.verify(mockMessengerService, times(4)).sendNotification(anyString()); + Mockito.verify(mockMessengerService, times(4)).sendNotification(anyString()); - // measure again, no new message - scaleObserver.measureWeights(); - - Mockito.verify(mockMessengerService, times(4)).sendNotification(anyString()); - - // Step 3: Pamela removed the eggs - Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(2); - Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(-3); + // Step 3: Pamela removed the eggs + Mockito.when(mockedScaleService.measureWeight(eq(hinten.getId()))).thenReturn(2); + Mockito.when(mockedScaleService.measureWeight(eq(vorne.getId()))).thenReturn(-3); - scaleObserver.measureWeights(); + scaleObserver.measureWeights(); - Mockito.verify(mockMessengerService, times(6)).sendNotification(anyString()); + Mockito.verify(mockMessengerService, times(6)).sendNotification(anyString()); - } + } }