From 7321edf1873e1842c8da9cc9302e030d949e5385 Mon Sep 17 00:00:00 2001 From: Darkwyng <51367023+Darkwyng@users.noreply.github.com> Date: Sat, 31 Dec 2022 14:24:54 +0100 Subject: [PATCH] implement design creation incl. persistence --- .../pim/stars/design/DesignConfiguration.java | 9 +- .../java/com/pim/stars/design/api/Design.java | 4 +- .../pim/stars/design/api/DesignDefiner.java | 7 +- .../stars/design/api/types/DesignType.java | 6 - .../stars/design/imp/DesignDefinerImp.java | 114 +++++++++++++++++ .../design/imp/persistence/DesignEntity.java | 42 ++++--- .../imp/persistence/DesignRepository.java | 2 + .../pim/stars/gadget/api/hull/GadgetSlot.java | 2 +- .../stars/gadget/imp/GadgetProperties.java | 2 + .../stars/gadget/imp/GadgetProviderImp.java | 8 +- .../stars/gadget/imp/hull/GadgetSlotImp.java | 2 +- .../stars/design/DesignTestConfiguration.java | 12 +- .../design/imp/DesignDefinerImpTest.java | 118 ++++++++++++++++++ .../imp/GadgetProviderImpComponentTest.java | 10 +- .../gadget/imp/GadgetProviderImpTest.java | 10 +- .../game/imp/GameInitializerImpTest.java | 8 ++ parent/pom.xml | 14 ++- parent/versions-maven-plugin-rules.xml | 18 +++ 18 files changed, 341 insertions(+), 47 deletions(-) delete mode 100644 parent/addons/src/main/java/com/pim/stars/design/api/types/DesignType.java create mode 100644 parent/addons/src/main/java/com/pim/stars/design/imp/DesignDefinerImp.java create mode 100644 parent/addons/src/test/java/com/pim/stars/design/imp/DesignDefinerImpTest.java create mode 100644 parent/versions-maven-plugin-rules.xml diff --git a/parent/addons/src/main/java/com/pim/stars/design/DesignConfiguration.java b/parent/addons/src/main/java/com/pim/stars/design/DesignConfiguration.java index 8e3a0b2..9929da8 100644 --- a/parent/addons/src/main/java/com/pim/stars/design/DesignConfiguration.java +++ b/parent/addons/src/main/java/com/pim/stars/design/DesignConfiguration.java @@ -7,6 +7,8 @@ import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import com.pim.stars.design.imp.persistence.DesignRepository; +import com.pim.stars.id.IdConfiguration; +import com.pim.stars.id.api.IdCreator; public interface DesignConfiguration { @@ -19,8 +21,13 @@ public static class Provided { } @Configuration - @Import({ Provided.class }) + @Import({ Provided.class, IdConfiguration.Complete.class }) public static class Complete { } + + public static interface Required { + + public IdCreator idCreator(); + } } \ No newline at end of file diff --git a/parent/addons/src/main/java/com/pim/stars/design/api/Design.java b/parent/addons/src/main/java/com/pim/stars/design/api/Design.java index 5957896..a5b5bd4 100644 --- a/parent/addons/src/main/java/com/pim/stars/design/api/Design.java +++ b/parent/addons/src/main/java/com/pim/stars/design/api/Design.java @@ -1,6 +1,6 @@ package com.pim.stars.design.api; -import com.pim.stars.design.api.types.DesignType; +import com.pim.stars.gadget.api.types.HullType; public interface Design { @@ -10,5 +10,5 @@ public interface Design { public String getOwnerId(); - public DesignType getDesignType(); + public HullType getHullType(); } diff --git a/parent/addons/src/main/java/com/pim/stars/design/api/DesignDefiner.java b/parent/addons/src/main/java/com/pim/stars/design/api/DesignDefiner.java index ccd7d37..5f52b8a 100644 --- a/parent/addons/src/main/java/com/pim/stars/design/api/DesignDefiner.java +++ b/parent/addons/src/main/java/com/pim/stars/design/api/DesignDefiner.java @@ -1,7 +1,6 @@ package com.pim.stars.design.api; import com.pim.stars.gadget.api.Gadget; -import com.pim.stars.gadget.api.hull.GadgetSlot; import com.pim.stars.gadget.api.hull.Hull; import com.pim.stars.game.api.Game; import com.pim.stars.race.api.Race; @@ -10,13 +9,9 @@ public interface DesignDefiner { public DesignBuilder start(Game game, Race race, Hull hull); - public DesignBuilder start(Game game, String raceId, String hullId); - public interface DesignBuilder { - public DesignBuilder fillSlot(GadgetSlot slot, Gadget gadget, int numberOfGadgets); - - public DesignBuilder fillSlot(String slotId, String gadgetId, int numberOfGadgets); + public DesignBuilder fillSlot(String slotId, Gadget gadget, int numberOfGadgets); public Design build(String designName); } diff --git a/parent/addons/src/main/java/com/pim/stars/design/api/types/DesignType.java b/parent/addons/src/main/java/com/pim/stars/design/api/types/DesignType.java deleted file mode 100644 index 4552d61..0000000 --- a/parent/addons/src/main/java/com/pim/stars/design/api/types/DesignType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.pim.stars.design.api.types; - -public interface DesignType { - - public String getId(); -} diff --git a/parent/addons/src/main/java/com/pim/stars/design/imp/DesignDefinerImp.java b/parent/addons/src/main/java/com/pim/stars/design/imp/DesignDefinerImp.java new file mode 100644 index 0000000..5e10c64 --- /dev/null +++ b/parent/addons/src/main/java/com/pim/stars/design/imp/DesignDefinerImp.java @@ -0,0 +1,114 @@ +package com.pim.stars.design.imp; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import com.pim.stars.design.api.Design; +import com.pim.stars.design.api.DesignDefiner; +import com.pim.stars.design.imp.persistence.DesignEntity; +import com.pim.stars.design.imp.persistence.DesignEntity.DesignEntityId; +import com.pim.stars.design.imp.persistence.DesignEntity.DesignEntityStatus; +import com.pim.stars.design.imp.persistence.DesignEntity.FilledGadgetSlot; +import com.pim.stars.design.imp.persistence.DesignRepository; +import com.pim.stars.gadget.api.Gadget; +import com.pim.stars.gadget.api.hull.GadgetSlot; +import com.pim.stars.gadget.api.hull.Hull; +import com.pim.stars.gadget.api.types.HullType; +import com.pim.stars.game.api.Game; +import com.pim.stars.id.api.IdCreator; +import com.pim.stars.race.api.Race; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Component +public class DesignDefinerImp implements DesignDefiner { + + @Autowired + private IdCreator idCreator; + @Autowired + private DesignRepository designRepository; + + @Override + public DesignBuilder start(final Game game, final Race race, final Hull hull) { + return new DesignBuilderImp(game, race.getId(), hull); + } + + private class DesignBuilderImp implements DesignBuilder { + + private final DesignEntity entity = new DesignEntity(); + private final Hull hull; + + public DesignBuilderImp(final Game game, final String ownerId, final Hull hull) { + entity.setEntityId(new DesignEntityId(idCreator.createId(), game.getId(), game.getYear())); + entity.setOwnerId(ownerId); + entity.setHullId(hull.getId()); + this.hull = hull; + } + + @Override + public DesignBuilder fillSlot(final String slotId, final Gadget gadget, final int numberOfGadgets) { + final GadgetSlot slot = hull.getGadgetSlots().stream() + .filter(candidate -> candidate.getSlotId().equals(slotId)).findFirst() + .orElseThrow(() -> incorrectSlotException(hull.getId(), slotId)); + return fillSlot(slot, gadget, numberOfGadgets); + } + + private DesignBuilder fillSlot(final GadgetSlot slot, final Gadget gadget, final int numberOfGadgets) { + final String slotId = slot.getSlotId(); + ensureSlotNotAlreadyFilled(slotId); + ensureGadgetAllowedInSlot(slot, gadget, numberOfGadgets); + + entity.getFilledGadgetSlots().add(new FilledGadgetSlot(slotId, gadget.getId(), numberOfGadgets)); + + return this; + } + + private void ensureSlotNotAlreadyFilled(final String slotId) { + final boolean slotIsAlreadyFilled = entity.getFilledGadgetSlots().stream() + .anyMatch(candidate -> candidate.getSlotId().equals(slotId)); + if (slotIsAlreadyFilled) { + throw new IllegalArgumentException("The slot with ID " + slotId + " has already been filled."); + } + } + + private void ensureGadgetAllowedInSlot(final GadgetSlot slot, final Gadget gadget, final int numberOfGadgets) { + if (!slot.getAllowedGadgetTypes().stream() + .anyMatch(type -> type.getId().equals(gadget.getGadgetType().getId()))) { + throw new IllegalArgumentException("The slot with ID " + slot.getSlotId() + + " does not allow gadget with ID " + gadget.getId() + ", because type " + + gadget.getGadgetType() + " is not contained in the list of allowed gadget types: " + + slot.getAllowedGadgetTypes()); + } else if ((slot.getMinimumNumberOfGadgets() > numberOfGadgets) + || (slot.getMaximumNumberOfGadgets() < numberOfGadgets)) { + throw new IllegalArgumentException("The slot with ID " + slot.getSlotId() + " does not allow to add " + + numberOfGadgets + ". It must be between " + slot.getMinimumNumberOfGadgets() + " and " + + slot.getMaximumNumberOfGadgets() + "."); + } + } + + @Override + public Design build(final String designName) { + entity.setName(designName); + entity.setHullTypeId(hull.getHullType().getId()); + entity.setStatus(DesignEntityStatus.EDITABLE.getId()); + designRepository.save(entity); + return new DesignImp(entity.getEntityId().getId(), entity.getName(), entity.getOwnerId(), + hull.getHullType()); + } + + private IllegalArgumentException incorrectSlotException(final String hullId, final String slotId) { + return new IllegalArgumentException("The hull with the ID " + hullId + " has no slot with ID " + slotId); + } + } + + @Getter + @AllArgsConstructor + private class DesignImp implements Design { + + private final String id; + private final String name; + private final String ownerId; + private final HullType hullType; + } +} diff --git a/parent/addons/src/main/java/com/pim/stars/design/imp/persistence/DesignEntity.java b/parent/addons/src/main/java/com/pim/stars/design/imp/persistence/DesignEntity.java index 0431365..6b9b6b1 100644 --- a/parent/addons/src/main/java/com/pim/stars/design/imp/persistence/DesignEntity.java +++ b/parent/addons/src/main/java/com/pim/stars/design/imp/persistence/DesignEntity.java @@ -6,6 +6,7 @@ import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; +import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; @@ -17,33 +18,38 @@ public class DesignEntity { @Id private DesignEntityId entityId; private String ownerId; - private String designTypeId; private String name; private String status; private String hullId; + private String hullTypeId; private Collection filledGadgetSlots = new ArrayList<>(); -} -@Getter -@Setter -class FilledGadgetSlot { + @Getter + @AllArgsConstructor + public static class FilledGadgetSlot { - private String slotId; - private String gadgetId; - private int numberOfGadgets; -} + private final String slotId; + private final String gadgetId; + private final int numberOfGadgets; + } -@Getter -@Setter -class DesignEntityId { + @Getter + @AllArgsConstructor + public static class DesignEntityId { + + private final String id; + private final String gameId; + private final int year; + } + + public static enum DesignEntityStatus { - private String id; - private String gameId; - private int year; -} + EDITABLE, ACTIVE, DELETED; -enum DesignEntityStatus { - EDITABLE, ACTIVE, DELETED; + public String getId() { + return name(); + } + } } \ No newline at end of file diff --git a/parent/addons/src/main/java/com/pim/stars/design/imp/persistence/DesignRepository.java b/parent/addons/src/main/java/com/pim/stars/design/imp/persistence/DesignRepository.java index 6e5d540..2c60325 100644 --- a/parent/addons/src/main/java/com/pim/stars/design/imp/persistence/DesignRepository.java +++ b/parent/addons/src/main/java/com/pim/stars/design/imp/persistence/DesignRepository.java @@ -3,6 +3,8 @@ import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; +import com.pim.stars.design.imp.persistence.DesignEntity.DesignEntityId; + @Repository public interface DesignRepository extends MongoRepository { diff --git a/parent/addons/src/main/java/com/pim/stars/gadget/api/hull/GadgetSlot.java b/parent/addons/src/main/java/com/pim/stars/gadget/api/hull/GadgetSlot.java index b28cf7f..9f735af 100644 --- a/parent/addons/src/main/java/com/pim/stars/gadget/api/hull/GadgetSlot.java +++ b/parent/addons/src/main/java/com/pim/stars/gadget/api/hull/GadgetSlot.java @@ -6,7 +6,7 @@ public interface GadgetSlot { - public String getId(); + public String getSlotId(); public int getMinimumNumberOfGadgets(); diff --git a/parent/addons/src/main/java/com/pim/stars/gadget/imp/GadgetProperties.java b/parent/addons/src/main/java/com/pim/stars/gadget/imp/GadgetProperties.java index 35e3460..fdb5f8d 100644 --- a/parent/addons/src/main/java/com/pim/stars/gadget/imp/GadgetProperties.java +++ b/parent/addons/src/main/java/com/pim/stars/gadget/imp/GadgetProperties.java @@ -19,4 +19,6 @@ public class GadgetProperties { private List gadgetFilePaths = Arrays.asList("com/pim/stars/gadget/imp/gadgets.xml"); private List hullFilePaths = Arrays.asList("com/pim/stars/gadget/imp/hulls.xml"); + + private String markerForVeryFlexibleSlot = "Any"; } diff --git a/parent/addons/src/main/java/com/pim/stars/gadget/imp/GadgetProviderImp.java b/parent/addons/src/main/java/com/pim/stars/gadget/imp/GadgetProviderImp.java index 22cf085..d2bebfd 100644 --- a/parent/addons/src/main/java/com/pim/stars/gadget/imp/GadgetProviderImp.java +++ b/parent/addons/src/main/java/com/pim/stars/gadget/imp/GadgetProviderImp.java @@ -31,8 +31,6 @@ @Component public class GadgetProviderImp implements GadgetProvider { - private static final String MARKER_FOR_VERY_FLEXIBLE_SLOT = "Any"; - private Collection gadgets = null; private Collection hulls = null; @@ -136,7 +134,7 @@ protected Collection getGadgetTypesOfSlot(final String hullId, final final String allowedGadgetTypeIds = slot.getAllowedGadgetTypeIds(); if (allowedGadgetTypeIds == null || Strings.isNullOrEmpty(allowedGadgetTypeIds.trim())) { throw gadgetTypeParsingError(hullId, slot, "The list of types is empty."); - } else if (MARKER_FOR_VERY_FLEXIBLE_SLOT.equals(allowedGadgetTypeIds)) { + } else if (gadgetProperties.getMarkerForVeryFlexibleSlot().equals(allowedGadgetTypeIds)) { return getGadgetTypesForVeryFlexibleSlot(); } else { final Collection unknownTypeIds = new ArrayList<>(); @@ -159,7 +157,7 @@ protected Collection getGadgetTypesOfSlot(final String hullId, final } } - private Collection getGadgetTypesForVeryFlexibleSlot() { + protected Collection getGadgetTypesForVeryFlexibleSlot() { if (gadgetTypesForVeryFlexibleSlot == null) { gadgetTypesForVeryFlexibleSlot = gadgetTypeByIdMap.values().stream() .filter(type -> !type.getId().equals("Engine")).collect(Collectors.toUnmodifiableList()); @@ -172,7 +170,7 @@ private IllegalArgumentException gadgetTypeParsingError(final String hullId, fin final String errorMessage) { return new IllegalArgumentException("The alllowedGadgetTypeIds '" + slot.getAllowedGadgetTypeIds() + "' of slot '" + slot.getId() + "' of hull '" + hullId + "' could not be parsed." - + " It is expected to be either '" + MARKER_FOR_VERY_FLEXIBLE_SLOT + + " It is expected to be either '" + gadgetProperties.getMarkerForVeryFlexibleSlot() + "' or a comma separated list of IDs of gadget types. " + errorMessage); } diff --git a/parent/addons/src/main/java/com/pim/stars/gadget/imp/hull/GadgetSlotImp.java b/parent/addons/src/main/java/com/pim/stars/gadget/imp/hull/GadgetSlotImp.java index 6603af9..936468a 100644 --- a/parent/addons/src/main/java/com/pim/stars/gadget/imp/hull/GadgetSlotImp.java +++ b/parent/addons/src/main/java/com/pim/stars/gadget/imp/hull/GadgetSlotImp.java @@ -14,7 +14,7 @@ @ToString public class GadgetSlotImp implements GadgetSlot { - private final String id; + private final String slotId; private final int minimumNumberOfGadgets; private final int maximumNumberOfGadgets; diff --git a/parent/addons/src/test/java/com/pim/stars/design/DesignTestConfiguration.java b/parent/addons/src/test/java/com/pim/stars/design/DesignTestConfiguration.java index 65505ba..26def4a 100644 --- a/parent/addons/src/test/java/com/pim/stars/design/DesignTestConfiguration.java +++ b/parent/addons/src/test/java/com/pim/stars/design/DesignTestConfiguration.java @@ -1,15 +1,25 @@ package com.pim.stars.design; +import static org.mockito.Mockito.mock; + import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Profile; import com.pim.stars.design.imp.persistence.DesignRepository; +import com.pim.stars.id.api.IdCreator; + +public class DesignTestConfiguration implements DesignConfiguration.Required { -public class DesignTestConfiguration { + @Bean + @Override + public IdCreator idCreator() { + return mock(IdCreator.class); + } @Configuration @Import({ DesignTestConfiguration.class, DesignConfiguration.Provided.class }) diff --git a/parent/addons/src/test/java/com/pim/stars/design/imp/DesignDefinerImpTest.java b/parent/addons/src/test/java/com/pim/stars/design/imp/DesignDefinerImpTest.java new file mode 100644 index 0000000..3b66a4e --- /dev/null +++ b/parent/addons/src/test/java/com/pim/stars/design/imp/DesignDefinerImpTest.java @@ -0,0 +1,118 @@ +package com.pim.stars.design.imp; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.notNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.Collections; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import com.pim.stars.design.api.Design; +import com.pim.stars.design.api.DesignDefiner.DesignBuilder; +import com.pim.stars.design.imp.persistence.DesignRepository; +import com.pim.stars.gadget.api.hull.Hull; +import com.pim.stars.gadget.api.types.HullType; +import com.pim.stars.gadget.imp.gadget.GadgetImp; +import com.pim.stars.gadget.imp.hull.GadgetSlotImp; +import com.pim.stars.gadget.imp.hull.HullImp; +import com.pim.stars.gadget.imp.types.GadgetTypeImp; +import com.pim.stars.game.api.Game; +import com.pim.stars.id.api.IdCreator; +import com.pim.stars.race.api.Race; + +class DesignDefinerImpTest { + + @Mock + private IdCreator idCreator; + @Mock + private DesignRepository designRepository; + @InjectMocks + private DesignDefinerImp testee; + + private Hull hull; + + @BeforeEach + public void setUp() { + MockitoAnnotations.initMocks(this); + when(idCreator.createId()).thenReturn("myId"); + hull = new HullImp("myId", Collections.emptyList(), mock(HullType.class), + Arrays.asList( + new GadgetSlotImp("1", 0, 3, + Arrays.asList(new GadgetTypeImp("Armor"), new GadgetTypeImp("Shield"))), + new GadgetSlotImp("2", 2, 2, Arrays.asList(new GadgetTypeImp("Engine"))))); + } + + @Test + void testThatAllSlotsCanBeFilled() { + final Design design = testee.start(mockGame("17", 2405), mockRace("myRace"), hull) + .fillSlot("1", new GadgetImp("myArmor", Collections.emptyList(), new GadgetTypeImp("Armor")), 3) + .fillSlot("2", new GadgetImp("myEngine", Collections.emptyList(), new GadgetTypeImp("Engine")), 2) + .build("myName"); + assertThat(design.getName(), is("myName")); + assertThat(design.getId(), is("myId")); + assertThat(design.getOwnerId(), is("myRace")); + verify(idCreator, times(1)).createId(); + verify(designRepository).save(notNull()); + } + + @Test + void testThatOnlyEngineSlotCanBeFilled() { + testee.start(mockGame("17", 2405), mockRace("myRace"), hull) + .fillSlot("2", new GadgetImp("myEngine", Collections.emptyList(), new GadgetTypeImp("Engine")), 2) + .build("myName"); + } + + @ParameterizedTest + @ValueSource(ints = { -1, 0, 1, 3 }) + void testThatOutOfBoundsNumberIsRejected(final int number) { + assertThrows(Exception.class, () -> testee.start(mockGame("17", 2405), mockRace("myRace"), hull).fillSlot("2", + new GadgetImp("myEngine", Collections.emptyList(), new GadgetTypeImp("Engine")), number)); + } + + @Test + void testThatWrongSlotIdIsRejected() { + assertThrows(Exception.class, + () -> testee.start(mockGame("17", 2405), mockRace("myRace"), hull).fillSlot("wrongId", + new GadgetImp("myEngine", Collections.emptyList(), new GadgetTypeImp("Engine")), 2)); + } + + @Test + void testThatWrongGadgetTypeIsRejected() { + assertThrows(Exception.class, () -> testee.start(mockGame("17", 2405), mockRace("myRace"), hull).fillSlot("2", + new GadgetImp("myEngine", Collections.emptyList(), new GadgetTypeImp("NotAnEngine")), 2)); + } + + @Test + void testThatFillingSlotTwiceIsRejected() { + final DesignBuilder builder = testee.start(mockGame("17", 2405), mockRace("myRace"), hull).fillSlot("2", + new GadgetImp("myEngine", Collections.emptyList(), new GadgetTypeImp("Engine")), 2); + assertThrows(Exception.class, () -> builder.fillSlot("2", + new GadgetImp("myEngine", Collections.emptyList(), new GadgetTypeImp("Engine")), 2)); + } + + private Game mockGame(final String gameId, final int year) { + final Game game = mock(Game.class); + when(game.getId()).thenReturn(gameId); + when(game.getYear()).thenReturn(year); + return game; + } + + private Race mockRace(final String raceId) { + final Race race = mock(Race.class); + when(race.getId()).thenReturn(raceId); + return race; + } +} diff --git a/parent/addons/src/test/java/com/pim/stars/gadget/imp/GadgetProviderImpComponentTest.java b/parent/addons/src/test/java/com/pim/stars/gadget/imp/GadgetProviderImpComponentTest.java index 88143df..78630a4 100644 --- a/parent/addons/src/test/java/com/pim/stars/gadget/imp/GadgetProviderImpComponentTest.java +++ b/parent/addons/src/test/java/com/pim/stars/gadget/imp/GadgetProviderImpComponentTest.java @@ -97,9 +97,9 @@ public void testThatHullsAreLoadedFromXml() { assertThrows(IllegalArgumentException.class, () -> testee.getHullById("Whrgl")); // Check slots: - assertThat(frigate.getGadgetSlots(), hasItems(withId("1"), withId("2"), withId("3"))); + assertThat(frigate.getGadgetSlots(), hasItems(withSlotId("1"), withSlotId("2"), withSlotId("3"))); for (final GadgetSlot slot : frigate.getGadgetSlots()) { - switch (slot.getId()) { + switch (slot.getSlotId()) { case "1": assertThat(slot.getAllowedGadgetTypes(), containsInAnyOrder(withId("Engine"))); assertThat(slot.getMinimumNumberOfGadgets(), is(1)); @@ -123,7 +123,7 @@ public void testThatHullsAreLoadedFromXml() { assertThat(slot.getMaximumNumberOfGadgets(), is(2)); break; default: - fail("Unexpected slot ID: " + slot.getId()); + fail("Unexpected slot ID: " + slot.getSlotId()); } } } @@ -131,4 +131,8 @@ public void testThatHullsAreLoadedFromXml() { private Matcher withId(final String id) { return hasProperty("id", is(id)); } + + private Matcher withSlotId(final String id) { + return hasProperty("slotId", is(id)); + } } \ No newline at end of file diff --git a/parent/addons/src/test/java/com/pim/stars/gadget/imp/GadgetProviderImpTest.java b/parent/addons/src/test/java/com/pim/stars/gadget/imp/GadgetProviderImpTest.java index fefdf35..5ce5ed8 100644 --- a/parent/addons/src/test/java/com/pim/stars/gadget/imp/GadgetProviderImpTest.java +++ b/parent/addons/src/test/java/com/pim/stars/gadget/imp/GadgetProviderImpTest.java @@ -16,6 +16,9 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.InjectMocks; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; import com.pim.stars.gadget.api.types.GadgetType; import com.pim.stars.gadget.imp.hull.input.GadgetSlotFromXml; @@ -23,10 +26,15 @@ public class GadgetProviderImpTest { - private final GadgetProviderImp testee = new GadgetProviderImp(); + @Spy + private GadgetProperties gadgetProperties; + + @InjectMocks + private GadgetProviderImp testee; @BeforeEach private void setUp() { + MockitoAnnotations.initMocks(this); testee.gadgetTypeByIdMap.put("Engine", new GadgetTypeImp("Engine")); testee.gadgetTypeByIdMap.put("Scanner", new GadgetTypeImp("Scanner")); testee.gadgetTypeByIdMap.put("Armor", new GadgetTypeImp("Armor")); diff --git a/parent/base/src/test/java/com/pim/stars/game/imp/GameInitializerImpTest.java b/parent/base/src/test/java/com/pim/stars/game/imp/GameInitializerImpTest.java index a8545c8..5aac5e7 100644 --- a/parent/base/src/test/java/com/pim/stars/game/imp/GameInitializerImpTest.java +++ b/parent/base/src/test/java/com/pim/stars/game/imp/GameInitializerImpTest.java @@ -82,6 +82,14 @@ public void testThatApplicationContextStarts() { assertThat(gameInitializationPolicy, not(nullValue())); } + @Test + public void testThatGameObjectIsCreated() { + final Game game = gameProvider.getGame("myId", 2525); + assertThat(game.getId(), is("myId")); + assertThat(game.getYear(), is(2525)); + + } + @Test public void testThatNewGameInitializationDataIsCreated() { assertThat(gameInitializer.createNewGameInitializationData(), not(nullValue())); diff --git a/parent/pom.xml b/parent/pom.xml index 0c57ef7..61e517b 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -259,10 +259,13 @@ + + org.codehaus.mojo versions-maven-plugin 2.7 + file:///${project.basedir}/versions-maven-plugin-rules.xml false @@ -304,7 +307,7 @@ org.jacoco jacoco-maven-plugin - 0.8.4 + 0.8.5 @@ -330,12 +333,19 @@ - + + org.jacoco jacoco-maven-plugin + + + + org.apache.maven.plugins + maven-enforcer-plugin + \ No newline at end of file diff --git a/parent/versions-maven-plugin-rules.xml b/parent/versions-maven-plugin-rules.xml new file mode 100644 index 0000000..ab824ab --- /dev/null +++ b/parent/versions-maven-plugin-rules.xml @@ -0,0 +1,18 @@ + + + + + (?i).*Alpha(?:-?\d+)? + (?i).*a(?:-?\d+)? + (?i).*Beta(?:-?\d+)? + (?i).*-B(?:-?\d+)? + (?i).*RC(?:-?\d+)? + (?i).*CR(?:-?\d+)? + (?i).*M(?:-?\d+)? + + + +