From 70c77cb5fb349302d712c5b4b8ee2fedab357b12 Mon Sep 17 00:00:00 2001 From: jzitnik-dev Date: Sat, 8 Mar 2025 12:50:38 +0100 Subject: [PATCH] test: Added some tests for annotations --- .../entities/items/ItemBlockSupplier.java | 2 +- .../entities/items/ItemBlockSupplierTest.java | 50 +++++++++++++++++++ .../pickup/PickupHandlerProviderTest.java | 34 +++++++++++++ .../game/handlers/place/PlaceHandlerTest.java | 13 +++++ .../RightClickHandlerProviderTest.java | 23 +++++++++ .../game/logic/CustomLogicProviderTest.java | 24 +++++++++ .../services/saplings/SaplingLogicTest.java | 24 +++++++++ .../game/mobs/EntityHurtAnimationTest.java | 16 ++++++ .../cz/jzitnik/game/mobs/EntityKillTest.java | 16 ++++++ .../game/mobs/EntityLogicProviderTest.java | 17 +++++++ 10 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 src/test/java/cz/jzitnik/game/entities/items/ItemBlockSupplierTest.java create mode 100644 src/test/java/cz/jzitnik/game/handlers/pickup/PickupHandlerProviderTest.java create mode 100644 src/test/java/cz/jzitnik/game/handlers/rightclick/RightClickHandlerProviderTest.java create mode 100644 src/test/java/cz/jzitnik/game/logic/CustomLogicProviderTest.java create mode 100644 src/test/java/cz/jzitnik/game/logic/services/saplings/SaplingLogicTest.java diff --git a/src/main/java/cz/jzitnik/game/entities/items/ItemBlockSupplier.java b/src/main/java/cz/jzitnik/game/entities/items/ItemBlockSupplier.java index e4e2cd8..54214b7 100644 --- a/src/main/java/cz/jzitnik/game/entities/items/ItemBlockSupplier.java +++ b/src/main/java/cz/jzitnik/game/entities/items/ItemBlockSupplier.java @@ -81,7 +81,7 @@ public class ItemBlockSupplier { if (dropsList.get(key).equals(item.getId())) { block.setDrops(List.of(item)); } else { - block.setDrops(List.of(getItem(dropsList.get(key), block))); // Todo: Add block reference + block.setDrops(List.of(getItem(dropsList.get(key), block))); } return block; diff --git a/src/test/java/cz/jzitnik/game/entities/items/ItemBlockSupplierTest.java b/src/test/java/cz/jzitnik/game/entities/items/ItemBlockSupplierTest.java new file mode 100644 index 0000000..d9cbb68 --- /dev/null +++ b/src/test/java/cz/jzitnik/game/entities/items/ItemBlockSupplierTest.java @@ -0,0 +1,50 @@ +package cz.jzitnik.game.entities.items; + +import cz.jzitnik.game.annotations.BlockRegistry; +import cz.jzitnik.game.annotations.EntityRegistry; +import cz.jzitnik.game.annotations.ItemRegistry; +import cz.jzitnik.game.entities.Block; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +import java.util.Set; +import static org.junit.jupiter.api.Assertions.*; + +class ItemBlockSupplierTest { + @Test + @DisplayName("All classes annotated with @BlockRegistry must extend class Block") + void allBlocksMustExtendBlock() { + Reflections reflections = new Reflections("cz.jzitnik.game.entities.items.registry"); + Set> blockClasses = reflections.getTypesAnnotatedWith(BlockRegistry.class); + + for (Class clazz : blockClasses) { + var extendsClass = Block.class.isAssignableFrom(clazz); + assertTrue(extendsClass, "Class " + clazz.getName() + " annotated with @BlockRegistry does not extend " + Block.class.getName()); + } + } + + @Test + @DisplayName("All classes annotated with @EntityRegistry must extend class Block") + void allEntitiesMustExtendBlock() { + Reflections reflections = new Reflections("cz.jzitnik.game.entities.items.registry"); + Set> blockClasses = reflections.getTypesAnnotatedWith(EntityRegistry.class); + + for (Class clazz : blockClasses) { + var extendsClass = Block.class.isAssignableFrom(clazz); + assertTrue(extendsClass, "Class " + clazz.getName() + " annotated with @EntityRegistry does not extend " + Block.class.getName()); + } + } + + @Test + @DisplayName("All classes annotated with @ItemRegistry must extend class Item") + void allItemsMustExtendItem() { + Reflections reflections = new Reflections("cz.jzitnik.game.entities.items.registry"); + Set> blockClasses = reflections.getTypesAnnotatedWith(ItemRegistry.class); + + for (Class clazz : blockClasses) { + var extendsClass = Item.class.isAssignableFrom(clazz); + assertTrue(extendsClass, "Class " + clazz.getName() + " annotated with @ItemRegistry does not extend " + Item.class.getName()); + } + } +} \ No newline at end of file diff --git a/src/test/java/cz/jzitnik/game/handlers/pickup/PickupHandlerProviderTest.java b/src/test/java/cz/jzitnik/game/handlers/pickup/PickupHandlerProviderTest.java new file mode 100644 index 0000000..16da536 --- /dev/null +++ b/src/test/java/cz/jzitnik/game/handlers/pickup/PickupHandlerProviderTest.java @@ -0,0 +1,34 @@ +package cz.jzitnik.game.handlers.pickup; + +import cz.jzitnik.game.annotations.PickupHandler; +import cz.jzitnik.game.entities.items.ItemBlockSupplier; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +import java.util.Set; +import static org.junit.jupiter.api.Assertions.*; + +class PickupHandlerProviderTest { + @Test + @DisplayName("All classes annotated with @PickupHandler must implement CustomPickupHandler") + void allClassesPickupImplementHandler() { + Reflections reflections = new Reflections("cz.jzitnik.game.handlers.pickup.handlers"); + Set> handlerClasses = reflections.getTypesAnnotatedWith(PickupHandler.class); + + for (Class clazz : handlerClasses) { + boolean implementsClass = CustomPickupHandler.class.isAssignableFrom(clazz); + assertTrue(implementsClass, "Class " + clazz.getName() + " annotated with @PickupHandler does not implement CustomPickupHandler."); + } + } + + @Test + @DisplayName("All items in annotation @PickupHandler must exist") + void allBlocksMustExist() { + PickupHandlerProvider pickupHandlerProvider = new PickupHandlerProvider(); + + for (String id : pickupHandlerProvider.pickupList.keySet()) { + assertDoesNotThrow(() -> ItemBlockSupplier.getItem(id), "Item " + id + " does not exist but is in annotation @PickupHandler"); + } + } +} \ No newline at end of file diff --git a/src/test/java/cz/jzitnik/game/handlers/place/PlaceHandlerTest.java b/src/test/java/cz/jzitnik/game/handlers/place/PlaceHandlerTest.java index 510a963..b7b2b25 100644 --- a/src/test/java/cz/jzitnik/game/handlers/place/PlaceHandlerTest.java +++ b/src/test/java/cz/jzitnik/game/handlers/place/PlaceHandlerTest.java @@ -14,6 +14,19 @@ import java.util.Set; import static org.junit.jupiter.api.Assertions.*; class PlaceHandlerTest { + @Test + @DisplayName("All classes annotated with @PlaceHandler must implement CustomPlaceHandler") + void allClassesPickupImplementHandler() { + Reflections reflections = new Reflections("cz.jzitnik.game.handlers.pickup.handlers"); + Set> handlerClasses = reflections.getTypesAnnotatedWith(cz.jzitnik.game.annotations.PlaceHandler.class); + + for (Class clazz : handlerClasses) { + boolean implementsClass = CustomPlaceHandler.class.isAssignableFrom(clazz); + assertTrue(implementsClass, "Class " + clazz.getName() + " annotated with @PlaceHandler does not implement CustomPlaceHandler."); + } + } + + @Test @DisplayName("All blocks in annotation @PlaceHandler must exist") void allBlocksMustExist() { diff --git a/src/test/java/cz/jzitnik/game/handlers/rightclick/RightClickHandlerProviderTest.java b/src/test/java/cz/jzitnik/game/handlers/rightclick/RightClickHandlerProviderTest.java new file mode 100644 index 0000000..7ed1b97 --- /dev/null +++ b/src/test/java/cz/jzitnik/game/handlers/rightclick/RightClickHandlerProviderTest.java @@ -0,0 +1,23 @@ +package cz.jzitnik.game.handlers.rightclick; + +import cz.jzitnik.game.annotations.RightClickLogic; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +import java.util.Set; +import static org.junit.jupiter.api.Assertions.*; + +class RightClickHandlerProviderTest { + @Test + @DisplayName("All classes annotated with @RightClickLogic must implement RightClickHandler") + void allClassesPickupImplementHandler() { + Reflections reflections = new Reflections("cz.jzitnik.game"); + Set> handlerClasses = reflections.getTypesAnnotatedWith(RightClickLogic.class); + + for (Class clazz : handlerClasses) { + boolean implementsClass = RightClickHandler.class.isAssignableFrom(clazz); + assertTrue(implementsClass, "Class " + clazz.getName() + " annotated with @RightClickLogic does not implement RightClickHandler."); + } + } +} diff --git a/src/test/java/cz/jzitnik/game/logic/CustomLogicProviderTest.java b/src/test/java/cz/jzitnik/game/logic/CustomLogicProviderTest.java new file mode 100644 index 0000000..9bf2ab9 --- /dev/null +++ b/src/test/java/cz/jzitnik/game/logic/CustomLogicProviderTest.java @@ -0,0 +1,24 @@ +package cz.jzitnik.game.logic; + +import cz.jzitnik.game.annotations.CustomLogic; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +import java.util.Set; +import static org.junit.jupiter.api.Assertions.*; + +class CustomLogicProviderTest { + @Test + @DisplayName("All classes annotated with @CustomLogic must implement CustomLogicInterface") + void allClassesLogicImplementLogic() { + Reflections reflections = new Reflections("cz.jzitnik.game.logic.services"); + Set> handlerClasses = reflections.getTypesAnnotatedWith(CustomLogic.class); + + for (Class clazz : handlerClasses) { + boolean implementsClass = CustomLogicInterface.class.isAssignableFrom(clazz); + assertTrue(implementsClass, "Class " + clazz.getName() + " annotated with @CustomLogic does not implement CustomLogicInterface."); + } + } + +} diff --git a/src/test/java/cz/jzitnik/game/logic/services/saplings/SaplingLogicTest.java b/src/test/java/cz/jzitnik/game/logic/services/saplings/SaplingLogicTest.java new file mode 100644 index 0000000..4a6c200 --- /dev/null +++ b/src/test/java/cz/jzitnik/game/logic/services/saplings/SaplingLogicTest.java @@ -0,0 +1,24 @@ +package cz.jzitnik.game.logic.services.saplings; + +import cz.jzitnik.game.annotations.BlockRegistry; +import cz.jzitnik.game.annotations.Sapling; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +import java.util.Set; +import static org.junit.jupiter.api.Assertions.*; + +class SaplingLogicTest { + @Test + @DisplayName("All blocks annoteted with @Sapling must be annotated with @BlockRegistry") + void allBlocksMustExist() { + Reflections reflections = new Reflections("cz.jzitnik.game.entities.items.registry.blocks"); + Set> handlerClasses = reflections.getTypesAnnotatedWith(Sapling.class); + + for (Class clazz : handlerClasses) { + var hasClass = clazz.isAnnotationPresent(BlockRegistry.class); + assertTrue(hasClass, "Class " + clazz.getName() + " annotated with @Sapling is not annotated with @BlockRegistry."); + } + } +} \ No newline at end of file diff --git a/src/test/java/cz/jzitnik/game/mobs/EntityHurtAnimationTest.java b/src/test/java/cz/jzitnik/game/mobs/EntityHurtAnimationTest.java index 1cc7276..8ec4a59 100644 --- a/src/test/java/cz/jzitnik/game/mobs/EntityHurtAnimationTest.java +++ b/src/test/java/cz/jzitnik/game/mobs/EntityHurtAnimationTest.java @@ -1,12 +1,28 @@ package cz.jzitnik.game.mobs; +import cz.jzitnik.game.annotations.EntityHurtAnimationHandler; import cz.jzitnik.game.entities.items.ItemBlockSupplier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +import java.util.Set; import static org.junit.jupiter.api.Assertions.*; class EntityHurtAnimationTest { + @Test + @DisplayName("All classes annotated with @EntityHurtAnimationHandler must implement EntityHurtAnimationChanger") + void allEntityHurtImplement() { + Reflections reflections = new Reflections("cz.jzitnik.game.mobs.services"); + Set> handlerClasses = reflections.getTypesAnnotatedWith(EntityHurtAnimationHandler.class); + + for (Class clazz : handlerClasses) { + boolean implementsClass = EntityHurtAnimationChanger.class.isAssignableFrom(clazz); + assertTrue(implementsClass, "Class " + clazz.getName() + " annotated with @EntityHurtAnimationHandler does not implement EntityHurtAnimationChanger."); + } + } + @Test @DisplayName("Test that entities exists for all entity spawn handlers") void allEntitiesExists() { diff --git a/src/test/java/cz/jzitnik/game/mobs/EntityKillTest.java b/src/test/java/cz/jzitnik/game/mobs/EntityKillTest.java index 2ceaf95..fbced32 100644 --- a/src/test/java/cz/jzitnik/game/mobs/EntityKillTest.java +++ b/src/test/java/cz/jzitnik/game/mobs/EntityKillTest.java @@ -1,12 +1,28 @@ package cz.jzitnik.game.mobs; +import cz.jzitnik.game.annotations.EntityKillHandler; import cz.jzitnik.game.entities.items.ItemBlockSupplier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +import java.util.Set; import static org.junit.jupiter.api.Assertions.*; class EntityKillTest { + @Test + @DisplayName("All classes annotated with @EntityKillHandler must implement EntityKillInterface") + void allEntityKillImplement() { + Reflections reflections = new Reflections("cz.jzitnik.game.mobs.services"); + Set> handlerClasses = reflections.getTypesAnnotatedWith(EntityKillHandler.class); + + for (Class clazz : handlerClasses) { + boolean implementsClass = EntityKillInterface.class.isAssignableFrom(clazz); + assertTrue(implementsClass, "Class " + clazz.getName() + " annotated with @EntityKillHandler does not implement EntityKillInterface."); + } + } + @Test @DisplayName("Test that entities exists for all entity spawn handlers") void allEntitiesExists() { diff --git a/src/test/java/cz/jzitnik/game/mobs/EntityLogicProviderTest.java b/src/test/java/cz/jzitnik/game/mobs/EntityLogicProviderTest.java index e45cdaf..da0338b 100644 --- a/src/test/java/cz/jzitnik/game/mobs/EntityLogicProviderTest.java +++ b/src/test/java/cz/jzitnik/game/mobs/EntityLogicProviderTest.java @@ -1,11 +1,28 @@ package cz.jzitnik.game.mobs; +import cz.jzitnik.game.annotations.EntityLogic; import cz.jzitnik.game.entities.items.ItemBlockSupplier; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.reflections.Reflections; + +import java.util.Set; + import static org.junit.jupiter.api.Assertions.*; class EntityLogicProviderTest { + @Test + @DisplayName("All classes annotated with @EntityLogic must implement EntityLogicInterface") + void allEntityKillImplement() { + Reflections reflections = new Reflections("cz.jzitnik.game.mobs.services"); + Set> handlerClasses = reflections.getTypesAnnotatedWith(EntityLogic.class); + + for (Class clazz : handlerClasses) { + boolean implementsClass = EntityLogicInterface.class.isAssignableFrom(clazz); + assertTrue(implementsClass, "Class " + clazz.getName() + " annotated with @EntityLogic does not implement EntityLogicInterface."); + } + } + @Test @DisplayName("Test that entities exists for all entity spawn handlers") void allEntitiesExists() {