From 5026ea95c89454e20f70525a2eed87eb96f9c666 Mon Sep 17 00:00:00 2001 From: Hugo1307 Date: Sat, 17 Sep 2022 22:24:09 +0100 Subject: [PATCH 01/19] Feat: Added Dependency Injection pattern. --- pom.xml | 10 +- .../minecraft/devcommand/DevCommand.java | 21 ++- .../devcommand/commands/BukkitDevCommand.java | 3 +- .../executors/DevCommandExecutor.java | 6 +- .../handler}/CommandHandler.java | 36 ++--- .../dependencies/DependencyHandler.java | 20 ++- .../injection/GuiceBinderModule.java | 20 +++ .../devcommand/integration/Integration.java | 4 + .../registry/commands/CommandRegistry.java | 12 +- .../dependencies/DependencyRegistry.java | 11 +- .../devcommand/CommandHandlerTest.java | 96 ------------- .../minecraft/devcommand/IntegrationTest.java | 23 ++-- .../commands/CommandHandlerTest.java | 130 ++++++++++++++++++ .../executors/BukkitDevCommandTest.java | 11 +- .../registry/CommandRegistryTest.java | 2 +- 15 files changed, 228 insertions(+), 177 deletions(-) rename src/main/java/me/hgsoft/minecraft/devcommand/{ => commands/handler}/CommandHandler.java (73%) create mode 100644 src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java delete mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/CommandHandlerTest.java create mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java diff --git a/pom.xml b/pom.xml index 3138f0e..e058927 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,12 @@ 2.18.0 + + com.google.inject + guice + 5.1.0 + + org.junit.jupiter junit-jupiter @@ -63,14 +69,14 @@ org.mockito mockito-core - 4.7.0 + 4.8.0 test org.mockito mockito-junit-jupiter - 4.7.0 + 4.8.0 test diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java b/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java index 95c2627..00e5f3e 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java @@ -1,26 +1,37 @@ package me.hgsoft.minecraft.devcommand; +import com.google.inject.Inject; +import com.google.inject.Injector; import lombok.Getter; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; import me.hgsoft.minecraft.devcommand.dependencies.DependencyHandler; +import me.hgsoft.minecraft.devcommand.injection.GuiceBinderModule; @Getter public final class DevCommand { private static DevCommand instance; - private final CommandHandler commandHandler; - private final DependencyHandler dependencyHandler; + @Inject + private CommandHandler commandHandler; + @Inject + private DependencyHandler dependencyHandler; private DevCommand() { - this.commandHandler = CommandHandler.createOrGetInstance(); - this.dependencyHandler = DependencyHandler.createOrGetInstance(); + initDependencyInjectionModules(); } - public static DevCommand getInstance() { + public static DevCommand getOrCreateInstance() { if (instance == null) { instance = new DevCommand(); } return instance; } + private void initDependencyInjectionModules() { + GuiceBinderModule guiceBinderModule = new GuiceBinderModule(); + Injector injector = guiceBinderModule.createInjector(); + injector.injectMembers(this); + } + } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java index cf40c18..5ae975a 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java @@ -2,6 +2,7 @@ import lombok.Generated; import lombok.Getter; +import me.hgsoft.minecraft.devcommand.DevCommand; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.dependencies.DependencyHandler; import me.hgsoft.minecraft.devcommand.exceptions.ArgumentsConfigException; @@ -91,7 +92,7 @@ public boolean hasValidArgs() { @Override public List getDependencies() { - DependencyHandler dependencyHandler = DependencyHandler.createOrGetInstance(); + DependencyHandler dependencyHandler = DevCommand.getOrCreateInstance().getDependencyHandler(); Integration commandIntegration = commandData.getIntegration(); return Arrays.stream(getCommandData().getDependencies()) diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java index 41c990a..926cf96 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java @@ -1,7 +1,8 @@ package me.hgsoft.minecraft.devcommand.commands.executors; import lombok.NonNull; -import me.hgsoft.minecraft.devcommand.CommandHandler; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; +import me.hgsoft.minecraft.devcommand.DevCommand; import me.hgsoft.minecraft.devcommand.integration.Integration; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -29,7 +30,8 @@ public boolean onCommand(@NonNull CommandSender commandSender, @NonNull Command return false; } - CommandHandler commandHandler = CommandHandler.createOrGetInstance(); + DevCommand devCommand = DevCommand.getOrCreateInstance(); + CommandHandler commandHandler = devCommand.getCommandHandler(); // No arguments for the command. if (args.length == 0) { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/CommandHandler.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java similarity index 73% rename from src/main/java/me/hgsoft/minecraft/devcommand/CommandHandler.java rename to src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java index dea1b4d..c9afa0a 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/CommandHandler.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java @@ -1,5 +1,7 @@ -package me.hgsoft.minecraft.devcommand; +package me.hgsoft.minecraft.devcommand.commands.handler; +import com.google.inject.Inject; +import lombok.NonNull; import lombok.extern.log4j.Log4j2; import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; import me.hgsoft.minecraft.devcommand.discovery.CommandDiscoveryService; @@ -17,22 +19,23 @@ @Log4j2 public class CommandHandler { - private static CommandHandler currentInstance; + private final CommandRegistry commandRegistry; - private CommandHandler() { } + @Inject + public CommandHandler(CommandRegistry commandRegistry) { + this.commandRegistry = commandRegistry; + } public void registerCommand(Integration integration, AbstractCommandData command) { - CommandRegistry.getInstance().add(integration, command); + commandRegistry.add(integration, command); } public boolean executeCommandByAlias(Integration integration, String alias, Object... commandArgs) { IObjectFactory commandFactory = new CommandFactory(commandArgs); - CommandRegistry commandRegistry = CommandRegistry.getInstance(); List registeredCommandsForIntegration = commandRegistry.getValues(integration); if (registeredCommandsForIntegration == null) { - System.out.println("No Commands registered"); return false; } @@ -49,11 +52,9 @@ public boolean executeCommandByAlias(Integration integration, String alias, Obje } - public void initCommandsAutoConfiguration(Integration integration) { - - System.out.println("INTEGRATION VALID: " + integration.toString()); + public void initCommandsAutoConfiguration(@NonNull Integration integration) { - if (!checkIntegrationValidity(integration)) { + if (!integration.isValid()) { throw new InvalidIntegrationException(String.format("The integration %s contained an invalid base package.", integration.getName())); } @@ -80,19 +81,4 @@ public void initCommandsAutoConfiguration(Integration integration) { } - private boolean checkIntegrationValidity(Integration integration) { - if (integration == null || integration.getBasePackage() == null) { - log.warn("Unable to find base package for Integration - Commands Auto-Configuration stopped."); - return false; - } - return true; - } - - public static CommandHandler createOrGetInstance() { - if (currentInstance == null) { - currentInstance = new CommandHandler(); - } - return currentInstance; - } - } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java b/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java index 51cee05..9ad869b 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java @@ -1,19 +1,25 @@ package me.hgsoft.minecraft.devcommand.dependencies; +import com.google.inject.Inject; +import com.google.inject.Singleton; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.dependencies.DependencyRegistry; import java.util.Arrays; import java.util.List; +@Singleton public class DependencyHandler { - private static DependencyHandler instance; + private final DependencyRegistry dependencyRegistry; - private DependencyHandler() { } + @Inject + public DependencyHandler(DependencyRegistry dependencyRegistry) { + this.dependencyRegistry = dependencyRegistry; + } public void registerDependency(Integration integration, Object dependency) { - DependencyRegistry.getInstance().add(integration, dependency); + dependencyRegistry.add(integration, dependency); } public void registerDependencies(Integration integration, Object... dependencies) { Arrays.stream(dependencies).forEach(dependency -> registerDependency(integration, dependency)); @@ -21,7 +27,6 @@ public void registerDependencies(Integration integration, Object... dependencies public Object getDependencyInstance(Integration integration, Class dependencyClass) { - DependencyRegistry dependencyRegistry = DependencyRegistry.getInstance(); List registeredDependencies = dependencyRegistry.getValues(integration); for (Object registeredDependency : registeredDependencies) { @@ -34,11 +39,4 @@ public Object getDependencyInstance(Integration integration, Class dependency } - public static DependencyHandler createOrGetInstance() { - if (instance == null) { - instance = new DependencyHandler(); - } - return instance; - } - } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java b/src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java new file mode 100644 index 0000000..8abbcf3 --- /dev/null +++ b/src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java @@ -0,0 +1,20 @@ +package me.hgsoft.minecraft.devcommand.injection; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; + +public class GuiceBinderModule extends AbstractModule { + + public GuiceBinderModule() {} + + public Injector createInjector() { + return Guice.createInjector(this); + } + + @Override + protected void configure() { + + } + +} diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java b/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java index e9e517e..4894b3a 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java @@ -32,6 +32,10 @@ public static Integration createFromPlugin(JavaPlugin plugin) { return new Integration(getNameFromPlugin(plugin), plugin, getBasePackageFromPlugin(plugin)); } + public boolean isValid() { + return basePackage != null; + } + private static String getNameFromPlugin(JavaPlugin plugin) { return plugin.getName(); } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java b/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java index e10d820..21188a1 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java @@ -1,18 +1,18 @@ package me.hgsoft.minecraft.devcommand.registry.commands; +import com.google.inject.Singleton; import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.IRegistry; import java.util.*; +@Singleton public class CommandRegistry implements IRegistry { - private static CommandRegistry instance; - private final Map> registeredCommands; - private CommandRegistry() { + public CommandRegistry() { this.registeredCommands = new HashMap<>(); } @@ -40,10 +40,4 @@ public void setValues(Integration key, List value) { registeredCommands.put(key, value); } - public static CommandRegistry getInstance() { - if (instance == null) - instance = new CommandRegistry(); - return instance; - } - } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java b/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java index f287246..783e5fe 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java @@ -1,15 +1,15 @@ package me.hgsoft.minecraft.devcommand.registry.dependencies; +import com.google.inject.Singleton; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.IRegistry; import javax.annotation.Nullable; import java.util.*; +@Singleton public class DependencyRegistry implements IRegistry { - private static DependencyRegistry instance; - private final Map> registeredDependencies; private DependencyRegistry() { @@ -40,11 +40,4 @@ public void setValues(Integration key, List value) { registeredDependencies.put(key, value); } - public static DependencyRegistry getInstance() { - if (instance == null) { - instance = new DependencyRegistry(); - } - return instance; - } - } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/CommandHandlerTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/CommandHandlerTest.java deleted file mode 100644 index d79b199..0000000 --- a/src/test/java/me/hgsoft/minecraft/devcommand/CommandHandlerTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package me.hgsoft.minecraft.devcommand; - -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; -import me.hgsoft.minecraft.devcommand.exceptions.InvalidIntegrationException; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; -import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - -class CommandHandlerTest { - - private CommandHandler commandHandler; - private CommandRegistry commandRegistry; - private BukkitCommandData bukkitCommandStub; - private Integration integrationStub; - - @BeforeEach - void setUp() { - commandHandler = CommandHandler.createOrGetInstance(); - commandRegistry = CommandRegistry.getInstance(); - integrationStub = new Integration("myIntegration", "me.hgsoft."); - bukkitCommandStub = new BukkitCommandDataBuilder("test", integrationStub, TestCommandDevCommand.class) - .withDescription("Bukkit Test Command!") - .withPermission("command.bukkit_test") - .withMandatoryArguments(IntegerArgument.class) - .build(); - } - - @AfterEach - void tearDown() { - commandRegistry.setValues(integrationStub, null); - TestCommandDevCommand.called = false; - } - - @Test - void registerCommand() { - - Assertions.assertNull(commandRegistry.getValues(integrationStub)); - - commandHandler.registerCommand(integrationStub, bukkitCommandStub); - - Assertions.assertEquals(1, commandRegistry.getValues(integrationStub).size()); - Assertions.assertEquals(bukkitCommandStub, commandRegistry.getValues(integrationStub).get(0)); - - } - - @Test - void executeCommandByAlias_CommandNotRegistered() { - - boolean commandSuccessfullyExecuted = commandHandler.executeCommandByAlias(integrationStub, bukkitCommandStub.getAlias(), null, "1"); - - assertFalse(commandSuccessfullyExecuted); - assertFalse(TestCommandDevCommand.called); - - } - - @Test - void executeCommandByAliasForBukkitCommand() { - - commandHandler.registerCommand(integrationStub, bukkitCommandStub); - boolean commandSuccessfullyExecuted = commandHandler.executeCommandByAlias(integrationStub, bukkitCommandStub.getAlias(), null, "good", "afternoon"); - - assertTrue(commandSuccessfullyExecuted); - assertTrue(TestCommandDevCommand.called); - - } - - @Test - void initCommandsAutoConfiguration() { - - commandHandler.initCommandsAutoConfiguration(integrationStub); - - assertThat(commandRegistry.getValues(integrationStub)) - .isNotNull() - .hasSize(2) - .contains(bukkitCommandStub); - - } - - @Test - void initCommandsAutoConfigurationWithInvalidIntegration() { - - Integration invalidIntegration = new Integration("MyPlugin", null); - assertThrows(InvalidIntegrationException.class, () -> commandHandler.initCommandsAutoConfiguration(invalidIntegration)); - - } - -} \ No newline at end of file diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java index 70f8303..2985098 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java @@ -1,29 +1,30 @@ package me.hgsoft.minecraft.devcommand; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; import org.junit.jupiter.api.*; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.*; +@ExtendWith(MockitoExtension.class) class IntegrationTest { - - private static CommandHandler commandHandler; - private static CommandRegistry commandRegistry; - private static Integration pluginIntegration; - - @BeforeAll - static void initialSetUp() { - commandHandler = CommandHandler.createOrGetInstance(); - commandRegistry = CommandRegistry.getInstance(); - pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand"); - } + @Mock + private CommandRegistry commandRegistry; + @InjectMocks + private CommandHandler commandHandler; + private Integration pluginIntegration; @BeforeEach void setUp() { + pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand"); TestCommandDevCommand.called = false; } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java new file mode 100644 index 0000000..ad308e7 --- /dev/null +++ b/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java @@ -0,0 +1,130 @@ +package me.hgsoft.minecraft.devcommand.commands; + +import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; +import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; +import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; +import me.hgsoft.minecraft.devcommand.exceptions.InvalidIntegrationException; +import me.hgsoft.minecraft.devcommand.integration.Integration; +import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; +import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; +import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class CommandHandlerTest { + + @Mock + private CommandRegistry commandRegistry; + @Mock + private Integration integration; + @InjectMocks + private CommandHandler commandHandler; + + private BukkitCommandData bukkitCommandStub; + + @BeforeEach + void setUp() { + + bukkitCommandStub = new BukkitCommandDataBuilder("test", integration, TestCommandDevCommand.class) + .withDescription("Bukkit Test Command!") + .withPermission("command.bukkit_test") + .withMandatoryArguments(IntegerArgument.class) + .build(); + + } + + @AfterEach + void tearDown() { + commandRegistry.setValues(integration, null); + TestCommandDevCommand.called = false; + } + + @Test + @DisplayName("Test CommandHandler registerCommand()") + void registerCommand() { + + commandHandler.registerCommand(integration, bukkitCommandStub); + verify(commandRegistry, times(1)).add(integration, bukkitCommandStub); + + } + + @Test + @DisplayName("Test if command is executed when there are no commands registered.") + void executeCommandByAlias_NoCommandsRegistered() { + + when(commandRegistry.getValues(integration)).thenReturn(null); + + boolean commandExecuted = commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, null); + + assertFalse(commandExecuted); + + verify(commandRegistry, times(1)).getValues(integration); + + } + + @Test + @DisplayName("Test if the command is executed when it is not registered.") + void executeCommandByAlias_CommandNotRegistered() { + + AbstractCommandData abstractCommandDataMock = mock(AbstractCommandData.class); + + when(commandRegistry.getValues(integration)).thenReturn(List.of(abstractCommandDataMock)); + when(abstractCommandDataMock.getAlias()).thenReturn("not_registered_alias"); + + assertFalse(commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, null)); + + verify(commandRegistry, times(1)).getValues(integration); + + } + + @Test + @DisplayName("Test if command is executed successfully by its alias.") + void executeCommandByAlias() { + + commandHandler.registerCommand(integration, bukkitCommandStub); + + when(commandRegistry.getValues(integration)).thenReturn(List.of(bukkitCommandStub)); + + assertTrue(commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, "good", "afternoon")); + + verify(commandRegistry, times(1)).getValues(integration); + + } + + @Test + @DisplayName("Test method to initiate commands autoconfiguration.") + void initCommandsAutoConfiguration() { + + commandHandler.initCommandsAutoConfiguration(integration); + + assertThat(commandRegistry.getValues(integration)) + .isNotNull() + .hasSize(2) + .contains(bukkitCommandStub); + + } + + @Test + @DisplayName("Test method to initiate commands autoconfiguration with Invalid integration.") + void initCommandsAutoConfigurationWithInvalidIntegration() { + + Integration invalidIntegration = new Integration("MyPlugin", null); + assertThrows(InvalidIntegrationException.class, () -> commandHandler.initCommandsAutoConfiguration(invalidIntegration)); + + } + +} \ No newline at end of file diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java index d923069..70ed29b 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java @@ -1,6 +1,6 @@ package me.hgsoft.minecraft.devcommand.executors; -import me.hgsoft.minecraft.devcommand.CommandHandler; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.exceptions.ArgumentsConfigException; @@ -18,6 +18,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -27,18 +28,18 @@ @ExtendWith(MockitoExtension.class) class BukkitDevCommandTest { + @Mock + private CommandRegistry commandRegistry; @Mock private CommandSender commandSender; + @InjectMocks + private CommandHandler commandHandler; private Integration integration; - private CommandHandler commandHandler; - private CommandRegistry commandRegistry; @BeforeEach void setUp() { integration = new Integration("MyPlugin", "me"); - commandHandler = CommandHandler.createOrGetInstance(); - commandRegistry = CommandRegistry.getInstance(); } @AfterEach diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java index f991629..4b7be81 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java @@ -18,7 +18,7 @@ class CommandRegistryTest { @BeforeEach void setUp() { integrationStub = new Integration("myIntegration", null); - commandRegistry = CommandRegistry.getInstance(); + commandRegistry = new CommandRegistry(); bukkitCommand = new BukkitCommandDataBuilder("test", integrationStub, TestCommandDevCommand.class).build(); } From 3dfc16ce078e5efd8d0f03d51432333f9664b29a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Tue, 20 Sep 2022 23:54:26 +0100 Subject: [PATCH 02/19] Fix: Fixed unit tests and small bugs/issues. --- .../devcommand/commands/BukkitDevCommand.java | 3 + .../commands/handler/CommandHandler.java | 36 ++- .../discovery/CommandDiscoveryService.java | 33 +- .../devcommand/validators/DoubleArgument.java | 2 +- ...rationTest.java => IntegrationTestIT.java} | 57 ++-- .../commands/CommandHandlerTest.java | 69 ++-- .../CommandDiscoveryServiceTest.java | 175 +++++++++++ .../executors/BukkitDevCommandTest.java | 295 ++++++++++-------- .../factory/CommandFactoryTest.java | 6 +- .../registry/CommandRegistryTest.java | 46 ++- .../test_classes/invalid/TestCommandCopy.java | 32 ++ .../valid/ArgumentTestCommand.java} | 6 +- .../valid}/InvalidTestCommand.java | 2 +- .../valid/NoAnnotationTestCommand.java} | 6 +- .../valid/TestCommand.java} | 6 +- 15 files changed, 531 insertions(+), 243 deletions(-) rename src/test/java/me/hgsoft/minecraft/devcommand/{IntegrationTest.java => IntegrationTestIT.java} (60%) create mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java create mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java rename src/test/java/me/hgsoft/minecraft/devcommand/utils/{arguments/ArgumentDevCommandTestCommand.java => test_classes/valid/ArgumentTestCommand.java} (79%) rename src/test/java/me/hgsoft/minecraft/devcommand/utils/{ => test_classes/valid}/InvalidTestCommand.java (66%) rename src/test/java/me/hgsoft/minecraft/devcommand/utils/{arguments/NoAnnotationArgumentTestCommandDevCommand.java => test_classes/valid/NoAnnotationTestCommand.java} (69%) rename src/test/java/me/hgsoft/minecraft/devcommand/utils/{TestCommandDevCommand.java => test_classes/valid/TestCommand.java} (81%) diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java index 5ae975a..c3f604f 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java @@ -33,10 +33,13 @@ public BukkitDevCommand(BukkitCommandData commandData, CommandSender commandSend @Override public boolean hasPermissionToExecuteCommand() { + if (commandData.getPermission() == null) { throw new PermissionConfigException(String.format("Unable to find the permission for the command %s. Have you configured any permission at all?", commandData.getName())); } + return commandSender.hasPermission(commandData.getPermission()); + } @Override diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java index c9afa0a..4fac08c 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java @@ -54,31 +54,35 @@ public boolean executeCommandByAlias(Integration integration, String alias, Obje public void initCommandsAutoConfiguration(@NonNull Integration integration) { - if (!integration.isValid()) { - throw new InvalidIntegrationException(String.format("The integration %s contained an invalid base package.", integration.getName())); - } + validateIntegration(integration); - CommandDiscoveryService commandDiscoveryService = new CommandDiscoveryService(integration); + initCommandsAutoConfiguration(integration, new CommandDiscoveryService(integration)); - List discoveredAbstractCommandDataList = commandDiscoveryService.getCommandExecutorClasses() - .stream() - .map(commandDiscoveryService::executorClassToCommand) - .collect(Collectors.toList()); + } + + public void initCommandsAutoConfiguration(@NonNull Integration integration, CommandDiscoveryService commandDiscoveryService) { - boolean hasRepeatedAliases = discoveredAbstractCommandDataList.stream() - .map(AbstractCommandData::getAlias) - .distinct() - .count() != discoveredAbstractCommandDataList.size(); + validateIntegration(integration); - if (hasRepeatedAliases) { + if (commandDiscoveryService.containsCommandsWithRepeatedAliases()) { throw new AutoConfigurationException("Unable to autoconfigure commands as there are commands with repeated aliases."); } - discoveredAbstractCommandDataList.forEach(abstractCommand -> { - registerCommand(integration, abstractCommand); - log.info(String.format("Loaded command '%s' from '%s'.", abstractCommand.getAlias(), integration.getName())); + commandDiscoveryService.getDiscoveredCommandsData().forEach(abstractCommand -> { + if (abstractCommand != null) { + registerCommand(integration, abstractCommand); + log.info(String.format("Loaded command '%s' from '%s'.", abstractCommand.getAlias(), integration.getName())); + } else { + log.info("Failed to load at least one of the commands..."); + } }); } + private void validateIntegration(Integration integration) { + if (!integration.isValid()) { + throw new InvalidIntegrationException(String.format("The integration %s contained an invalid base package.", integration.getName())); + } + } + } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java b/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java index e8a0a76..0ff0e18 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java @@ -11,6 +11,7 @@ import me.hgsoft.minecraft.devcommand.validators.CommandArgument; import org.reflections.Reflections; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -21,20 +22,31 @@ public class CommandDiscoveryService { private final Reflections reflectionUtils; public CommandDiscoveryService(Integration integration) { + this(integration, new Reflections(integration.getBasePackage())); + } + + public CommandDiscoveryService(Integration integration, Reflections reflectionUtils) { this.integration = integration; - this.reflectionUtils = new Reflections(integration.getBasePackage()); + this.reflectionUtils = reflectionUtils; } - public Set> getCommandExecutorClasses() { + public Set> getCommandClasses() { return reflectionUtils.getTypesAnnotatedWith(Command.class) .stream() .filter(this::containsCommandAnnotation) .filter(this::isValidCommandClass) - .map(this::getCommandExecutor) + .map(this::getCommandClass) .collect(Collectors.toSet()); } - public AbstractCommandData executorClassToCommand(Class commandExecutorClass) { + public List getDiscoveredCommandsData() { + return getCommandClasses() + .stream() + .map(this::commandClassToCommandData) + .collect(Collectors.toList()); + } + + public AbstractCommandData commandClassToCommandData(Class commandExecutorClass) { Class>[] argsValidationTypes = null; Class[] commandDependencies = null; @@ -64,6 +76,17 @@ public AbstractCommandData executorClassToCommand(Class c } + public boolean containsCommandsWithRepeatedAliases() { + + List commandDataObjectsGenerated = getDiscoveredCommandsData(); + + return getDiscoveredCommandsData().stream() + .map(AbstractCommandData::getAlias) + .distinct() + .count() != commandDataObjectsGenerated.size(); + + } + private Command getCommandAnnotation(Class classToGetAnnotationFrom) { return classToGetAnnotationFrom.getAnnotation(Command.class); } @@ -89,7 +112,7 @@ private boolean containsDependenciesAnnotation(Class classToCheck) { } @SuppressWarnings("unchecked") - private Class getCommandExecutor(Class classToCheck) { + private Class getCommandClass(Class classToCheck) { return isValidCommandClass(classToCheck) ? (Class) classToCheck : null; } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java b/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java index b3a9268..15998a0 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java @@ -13,7 +13,7 @@ public DoubleArgument(String argument) { @Override public boolean isValid() { - return getArgument().matches("\\d*\\.\\d+"); + return getArgument().matches("[-+]?\\d*\\.\\d+"); } @Override diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java similarity index 60% rename from src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java rename to src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java index 2985098..b1c6a0e 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java @@ -1,62 +1,61 @@ package me.hgsoft.minecraft.devcommand; -import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; +import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; -import org.junit.jupiter.api.*; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; -@ExtendWith(MockitoExtension.class) -class IntegrationTest { - @Mock +@SuppressWarnings("all") +class IntegrationTestIT { + private CommandRegistry commandRegistry; - @InjectMocks private CommandHandler commandHandler; private Integration pluginIntegration; @BeforeEach void setUp() { - pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand"); - TestCommandDevCommand.called = false; + commandRegistry = new CommandRegistry(); + commandHandler = new CommandHandler(commandRegistry); + pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand.utils.test_classes.valid"); + TestCommand.called = false; } @AfterEach void tearDown() { - TestCommandDevCommand.called = false; - TestCommandDevCommand.args = null; - TestCommandDevCommand.command = null; - TestCommandDevCommand.sender = null; + TestCommand.called = false; + TestCommand.args = null; + TestCommand.command = null; + TestCommand.sender = null; commandRegistry.setValues(pluginIntegration, null); } @Test void registerAndExecuteBukkitCommand() { - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("help bukkit", pluginIntegration, TestCommandDevCommand.class) + BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", pluginIntegration, TestCommand.class) .withDescription("Help Command") .withPermission("dev_commands.commands.help") .build(); commandHandler.registerCommand(pluginIntegration, bukkitCommand); - commandHandler.executeCommandByAlias(pluginIntegration, "help bukkit", null, "1"); + commandHandler.executeCommandByAlias(pluginIntegration, "test", null, "1"); // The command was successfully called - assertTrue(TestCommandDevCommand.called); + assertTrue(TestCommand.called); // The sender is the same - assertNull(TestCommandDevCommand.sender); + assertNull(TestCommand.sender); // The args are also correct - assertArrayEquals(new String[] {"1"}, TestCommandDevCommand.args); + assertArrayEquals(new String[] {"1"}, TestCommand.args); - assertEquals(bukkitCommand, TestCommandDevCommand.command); + assertEquals(bukkitCommand, TestCommand.command); } @@ -67,16 +66,16 @@ void autoCommandDiscoveryAndExecuteBukkitCommand() { commandHandler.executeCommandByAlias(pluginIntegration, "test", null, "good", "afternoon"); // The command was successfully called - assertTrue(TestCommandDevCommand.called); + assertTrue(TestCommand.called); // The sender is the same - assertNull(TestCommandDevCommand.sender); + assertNull(TestCommand.sender); // The args are also correct - assertArrayEquals(new String[] {"good", "afternoon"}, TestCommandDevCommand.args); + assertArrayEquals(new String[] {"good", "afternoon"}, TestCommand.args); // The command alias is also correct - assertNotNull(TestCommandDevCommand.command); - assertEquals(TestCommandDevCommand.command.getAlias(), "test"); + assertNotNull(TestCommand.command); + assertEquals(TestCommand.command.getAlias(), "test"); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java index ad308e7..99fe713 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java @@ -4,10 +4,12 @@ import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; +import me.hgsoft.minecraft.devcommand.discovery.CommandDiscoveryService; +import me.hgsoft.minecraft.devcommand.exceptions.AutoConfigurationException; import me.hgsoft.minecraft.devcommand.exceptions.InvalidIntegrationException; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -20,7 +22,6 @@ import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -28,9 +29,9 @@ class CommandHandlerTest { @Mock - private CommandRegistry commandRegistry; + private CommandRegistry commandRegistryMock; @Mock - private Integration integration; + private Integration integrationMock; @InjectMocks private CommandHandler commandHandler; @@ -39,7 +40,7 @@ class CommandHandlerTest { @BeforeEach void setUp() { - bukkitCommandStub = new BukkitCommandDataBuilder("test", integration, TestCommandDevCommand.class) + bukkitCommandStub = new BukkitCommandDataBuilder("test", integrationMock, TestCommand.class) .withDescription("Bukkit Test Command!") .withPermission("command.bukkit_test") .withMandatoryArguments(IntegerArgument.class) @@ -49,16 +50,16 @@ void setUp() { @AfterEach void tearDown() { - commandRegistry.setValues(integration, null); - TestCommandDevCommand.called = false; + commandRegistryMock.setValues(integrationMock, null); + TestCommand.called = false; } @Test @DisplayName("Test CommandHandler registerCommand()") void registerCommand() { - commandHandler.registerCommand(integration, bukkitCommandStub); - verify(commandRegistry, times(1)).add(integration, bukkitCommandStub); + commandHandler.registerCommand(integrationMock, bukkitCommandStub); + verify(commandRegistryMock, times(1)).add(integrationMock, bukkitCommandStub); } @@ -66,13 +67,13 @@ void registerCommand() { @DisplayName("Test if command is executed when there are no commands registered.") void executeCommandByAlias_NoCommandsRegistered() { - when(commandRegistry.getValues(integration)).thenReturn(null); + when(commandRegistryMock.getValues(integrationMock)).thenReturn(null); - boolean commandExecuted = commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, null); + boolean commandExecuted = commandHandler.executeCommandByAlias(integrationMock, bukkitCommandStub.getAlias(), null, null); assertFalse(commandExecuted); - verify(commandRegistry, times(1)).getValues(integration); + verify(commandRegistryMock, times(1)).getValues(integrationMock); } @@ -82,12 +83,12 @@ void executeCommandByAlias_CommandNotRegistered() { AbstractCommandData abstractCommandDataMock = mock(AbstractCommandData.class); - when(commandRegistry.getValues(integration)).thenReturn(List.of(abstractCommandDataMock)); + when(commandRegistryMock.getValues(integrationMock)).thenReturn(List.of(abstractCommandDataMock)); when(abstractCommandDataMock.getAlias()).thenReturn("not_registered_alias"); - assertFalse(commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, null)); + assertFalse(commandHandler.executeCommandByAlias(integrationMock, bukkitCommandStub.getAlias(), null, null)); - verify(commandRegistry, times(1)).getValues(integration); + verify(commandRegistryMock, times(1)).getValues(integrationMock); } @@ -95,26 +96,44 @@ void executeCommandByAlias_CommandNotRegistered() { @DisplayName("Test if command is executed successfully by its alias.") void executeCommandByAlias() { - commandHandler.registerCommand(integration, bukkitCommandStub); + commandHandler.registerCommand(integrationMock, bukkitCommandStub); - when(commandRegistry.getValues(integration)).thenReturn(List.of(bukkitCommandStub)); + when(commandRegistryMock.getValues(integrationMock)).thenReturn(List.of(bukkitCommandStub)); - assertTrue(commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, "good", "afternoon")); + assertTrue(commandHandler.executeCommandByAlias(integrationMock, bukkitCommandStub.getAlias(), null, "good", "afternoon")); - verify(commandRegistry, times(1)).getValues(integration); + verify(commandRegistryMock, times(1)).getValues(integrationMock); } @Test - @DisplayName("Test method to initiate commands autoconfiguration.") + @DisplayName("Test autoconfiguration method.") void initCommandsAutoConfiguration() { - commandHandler.initCommandsAutoConfiguration(integration); + CommandDiscoveryService commandDiscoveryServiceMock = mock(CommandDiscoveryService.class); - assertThat(commandRegistry.getValues(integration)) - .isNotNull() - .hasSize(2) - .contains(bukkitCommandStub); + when(commandDiscoveryServiceMock.containsCommandsWithRepeatedAliases()).thenReturn(false); + when(commandDiscoveryServiceMock.getDiscoveredCommandsData()).thenReturn(List.of(mock(AbstractCommandData.class))); + when(integrationMock.isValid()).thenReturn(true); + + assertDoesNotThrow(() -> commandHandler.initCommandsAutoConfiguration(integrationMock, commandDiscoveryServiceMock)); + + verify(commandRegistryMock, times(1)).add(any(), any()); + + } + + @Test + @DisplayName("Test autoconfiguration with duplicated command aliases.") + void initCommandsAutoConfiguration_withDuplicatedAliases() { + + CommandDiscoveryService commandDiscoveryServiceMock = mock(CommandDiscoveryService.class); + + when(commandDiscoveryServiceMock.containsCommandsWithRepeatedAliases()).thenReturn(true); + when(integrationMock.isValid()).thenReturn(true); + + assertThrows(AutoConfigurationException.class, () -> commandHandler.initCommandsAutoConfiguration(integrationMock, commandDiscoveryServiceMock)); + + verify(commandDiscoveryServiceMock, times(1)).containsCommandsWithRepeatedAliases(); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java new file mode 100644 index 0000000..c580593 --- /dev/null +++ b/src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java @@ -0,0 +1,175 @@ +package me.hgsoft.minecraft.devcommand.discovery; + +import me.hgsoft.minecraft.devcommand.annotations.Command; +import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; +import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; +import me.hgsoft.minecraft.devcommand.integration.Integration; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.ArgumentTestCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.NoAnnotationTestCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.invalid.TestCommandCopy; +import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.reflections.Reflections; + +import java.util.Set; + +import static org.mockito.Mockito.when; +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(MockitoExtension.class) +class CommandDiscoveryServiceTest { + + @Mock + private Reflections reflectionsUtilsMock; + + @Mock + private Integration integrationMock; + + @InjectMocks + private CommandDiscoveryService commandDiscoveryService; + + @Test + @DisplayName("Test method to get classes annotated with @Command") + void getCommandClasses() { + + when(reflectionsUtilsMock.getTypesAnnotatedWith(Command.class)).thenReturn(Set.of(TestCommand.class, NoAnnotationTestCommand.class)); + + // Contains Only TestCommand cause the other one does not contain the @Command annotation. + assertThat(commandDiscoveryService.getCommandClasses()) + .isNotNull() + .isNotEmpty() + .hasSize(1) + .containsOnly(TestCommand.class); + + } + + @Test + @DisplayName("Test method to generate command data for all the detected commands.") + void getDiscoveredCommandsData() { + + when(reflectionsUtilsMock.getTypesAnnotatedWith(Command.class)).thenReturn(Set.of(TestCommand.class)); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .isNotNull() + .isNotEmpty() + .hasSize(1); + + // Below: + // Check if the values from @Command annotation in TestCommand class were successfully introduced + // in the command data class generated. + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .extracting(AbstractCommandData::getName) + .containsOnlyNulls(); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .extracting(AbstractCommandData::getAlias) + .containsExactly("test"); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .extracting(AbstractCommandData::getDescription) + .containsExactly("Bukkit Test Command!"); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .extracting(AbstractCommandData::getExecutor) + .first() + .isEqualTo(TestCommand.class); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .first() + .isInstanceOf(BukkitCommandData.class); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .first() + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData).extracting(BukkitCommandData::getPermission).isEqualTo("command.bukkit_test") + ); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .first() + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData) + .extracting(BukkitCommandData::getMandatoryArguments) + .extracting(classes -> + assertThat(classes).containsExactlyInAnyOrder(IntegerArgument.class) + ).isNotNull() + ); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .first() + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData).extracting(BukkitCommandData::getOptionalArguments).isNull() + ); + + } + + @Test + @DisplayName("Test method to convert from command class to command data object.") + void commandClassToCommandData() { + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .isNotNull() + .isInstanceOf(BukkitCommandData.class); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .extracting(AbstractCommandData::getName) + .isNull(); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .extracting(AbstractCommandData::getAlias) + .isEqualTo("test"); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .extracting(AbstractCommandData::getDescription) + .isEqualTo("Bukkit Test Command!"); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .extracting(AbstractCommandData::getExecutor) + .isEqualTo(TestCommand.class); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData).extracting(BukkitCommandData::getPermission).isEqualTo("command.bukkit_test") + ); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData) + .extracting(BukkitCommandData::getMandatoryArguments) + .extracting(classes -> + assertThat(classes).containsExactlyInAnyOrder(IntegerArgument.class) + ).isNotNull() + ); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData).extracting(BukkitCommandData::getOptionalArguments).isNull() + ); + + } + + @Test + @DisplayName("Test if commands with repeated aliases are detected successfully.") + void containsCommandsWithRepeatedAliases() { + + // Both TestCommand and TestCommandCopy have the same alias + when(reflectionsUtilsMock.getTypesAnnotatedWith(Command.class)) + .thenReturn(Set.of(TestCommand.class, TestCommandCopy.class)); + + assertThat(commandDiscoveryService.containsCommandsWithRepeatedAliases()).isTrue(); + + // TestCommand and ArgumentTestCommand have different aliases + when(reflectionsUtilsMock.getTypesAnnotatedWith(Command.class)) + .thenReturn(Set.of(TestCommand.class, ArgumentTestCommand.class)); + + assertThat(commandDiscoveryService.containsCommandsWithRepeatedAliases()).isFalse(); + + } + +} \ No newline at end of file diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java index 70ed29b..3ed22e6 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java @@ -1,248 +1,283 @@ package me.hgsoft.minecraft.devcommand.executors; -import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; +import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.exceptions.ArgumentsConfigException; import me.hgsoft.minecraft.devcommand.exceptions.PermissionConfigException; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.arguments.ArgumentDevCommandTestCommand; -import me.hgsoft.minecraft.devcommand.utils.arguments.NoAnnotationArgumentTestCommandDevCommand; import me.hgsoft.minecraft.devcommand.validators.BooleanArgument; import me.hgsoft.minecraft.devcommand.validators.DoubleArgument; import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; import me.hgsoft.minecraft.devcommand.validators.StringArgument; import org.bukkit.command.CommandSender; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.when; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class BukkitDevCommandTest { @Mock - private CommandRegistry commandRegistry; + private CommandSender commandSenderMock; @Mock - private CommandSender commandSender; - @InjectMocks - private CommandHandler commandHandler; + private BukkitCommandData bukkitCommandDataMock; - private Integration integration; + private BukkitDevCommand bukkitDevCommandStub; @BeforeEach void setUp() { - integration = new Integration("MyPlugin", "me"); - } - - @AfterEach - void tearDown() { - NoAnnotationArgumentTestCommandDevCommand.called = false; - NoAnnotationArgumentTestCommandDevCommand.hasPermission = false; - NoAnnotationArgumentTestCommandDevCommand.hasValidArgs = false; - commandRegistry.setValues(integration, null); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, null) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; } @Test + @DisplayName("Test the hasPermissionToExecuteCommand method when player HAS permission.") void hasPermissionToExecuteCommand() { String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .build(); - when(commandSender.hasPermission(bukkitCommand.getPermission())).thenReturn(true); + when(bukkitCommandDataMock.getPermission()).thenReturn(commandPermission); + when(commandSenderMock.hasPermission(commandPermission)).thenReturn(true); + + assertThat(bukkitDevCommandStub.hasPermissionToExecuteCommand()).isTrue(); + + verify(bukkitCommandDataMock, times(2)).getPermission(); + verify(commandSenderMock, times(1)).hasPermission(commandPermission); - commandHandler.registerCommand(integration, bukkitCommand); + } + + @Test + @DisplayName("Test the hasPermissionToExecuteCommand method when player DOES NOT HAVE permission.") + void hasPermissionToExecuteCommand_noPermission() { - try { - commandHandler.executeCommandByAlias(integration, "test", commandSender); - } catch (ArgumentsConfigException e) { - // Ignored exception - } + String commandPermission = "commands.no_annotation_test"; - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasPermission); + when(bukkitCommandDataMock.getPermission()).thenReturn(commandPermission); + when(commandSenderMock.hasPermission(commandPermission)).thenReturn(false); + + assertThat(bukkitDevCommandStub.hasPermissionToExecuteCommand()).isFalse(); + + verify(bukkitCommandDataMock, times(2)).getPermission(); + verify(commandSenderMock, times(1)).hasPermission(commandPermission); } @Test - void hasPermissionToExecuteCommand_NotConfiguredException() { + @DisplayName("Test the behaviour when the method is called when the permission is null a.k.a. not defined.") + void hasPermissionToExecuteCommand_withUndefinedPermission() { - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .build(); + when(bukkitCommandDataMock.getPermission()).thenReturn(null); - commandHandler.registerCommand(integration, bukkitCommand); + assertThrows(PermissionConfigException.class, () -> bukkitDevCommandStub.hasPermissionToExecuteCommand(), + String.format("Unable to find the permission for the command %s. Have you configured any permission at all?", bukkitCommandDataMock.getName())); - assertThrows(PermissionConfigException.class, - () -> commandHandler.executeCommandByAlias(integration, "test", commandSender), - String.format("Unable to find the permission for the command %s. Have you configured any permission at all?", bukkitCommand.getName())); + verify(bukkitCommandDataMock, times(1)).getPermission(); + verify(commandSenderMock, never()).hasPermission(anyString()); } @Test + @DisplayName("Test command mandatory arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Mandatory() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(IntegerArgument.class, DoubleArgument.class, StringArgument.class, BooleanArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"1", "hey"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "1", "22.222", "hey", "true"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[]{IntegerArgument.class, StringArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } @Test + @DisplayName("Test invalid mandatory arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Mandatory_InvalidArguments() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(IntegerArgument.class, DoubleArgument.class, StringArgument.class, BooleanArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"1", "notADouble"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "Hello!", ".22aa", "Valid!", "ash"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[]{IntegerArgument.class, DoubleArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertFalse(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + // Fails cause second argument is not a double. + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); + + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[]{DoubleArgument.class, StringArgument.class}); + + // Fails cause the first argument is an Integer, not a Double. + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); } @Test + @DisplayName("Test validation for optional arguments.") + @SuppressWarnings("unchecked") void hasValidArgs_Optional() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withOptionalArguments(IntegerArgument.class, DoubleArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"Some String"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "1"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[0]); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[]{StringArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } @Test + @DisplayName("Test invalid optional arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Optional_InvalidArguments() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withOptionalArguments(IntegerArgument.class, DoubleArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"notAInteger"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; + + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[0]); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {IntegerArgument.class}); - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "Hey", ".22"); + // Fails cause the optional argument (first argument) is not an Integer - is a String + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertFalse(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[0]); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {BooleanArgument.class}); + + // Fails cause the optional argument (first argument) is not a Boolean - is a String + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); } @Test + @DisplayName("Test mandatory AND optional arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Mandatory_And_Optional() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(BooleanArgument.class) - .withOptionalArguments(IntegerArgument.class, DoubleArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"1","mandatoryArgument","1.2"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "True", "22"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {IntegerArgument.class, StringArgument.class}); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {DoubleArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } @Test + @DisplayName("Test invalid mandatory AND optional arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Mandatory_And_Optional_Invalid() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(BooleanArgument.class) - .withOptionalArguments(IntegerArgument.class, DoubleArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"1","true","1.2"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; + + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {IntegerArgument.class, BooleanArgument.class}); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {BooleanArgument.class}); - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "true", "Boa tarde", ".22"); + // Fails cause although the mandatory arguments are valid the optional arguments are not valid. + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertFalse(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {DoubleArgument.class, IntegerArgument.class}); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {BooleanArgument.class}); + + // Fails cause although the optional arguments are valid the mandatory arguments are not valid + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); } @Test + @DisplayName("Test argument validation for unconventional arguments.") + @SuppressWarnings("unchecked") void hasValidArgs_WeirdArguments() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(IntegerArgument.class, DoubleArgument.class, StringArgument.class, BooleanArgument.class) - .build(); + String[] arguments = new String[] {"-78","yes",".22", "-0.44"}; + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, arguments) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "-78", ".222", "20", "yes"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {IntegerArgument.class, BooleanArgument.class, DoubleArgument.class, DoubleArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } @Test - void hasValidArgs_Mandatory_And_Optional_Annotation() { + @DisplayName("Test argument validation without optional args.") + @SuppressWarnings("unchecked") + void hasValidArgs_OptionalArgs() { - commandHandler.initCommandsAutoConfiguration(integration); - commandHandler.executeCommandByAlias(integration, "test_arg", commandSender, "22"); + String[] arguments = new String[] {"-78","yes"}; + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, arguments) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - assertTrue(ArgumentDevCommandTestCommand.called); - assertTrue(ArgumentDevCommandTestCommand.hasValidArgs); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {IntegerArgument.class, BooleanArgument.class}); + // Request validation for optional argument - not present in this case + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {StringArgument.class}); - } - - @Test - void hasValidArgs_Mandatory_And_Optional_Annotation_Invalid() { - - commandHandler.initCommandsAutoConfiguration(integration); - commandHandler.executeCommandByAlias(integration, "test_arg", commandSender, "true"); - - assertTrue(ArgumentDevCommandTestCommand.called); - assertFalse(ArgumentDevCommandTestCommand.hasValidArgs); + // The argument validation passes cause the argument missing is optional + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } + @Test + @DisplayName("Test for call of argument validation without configuration.") void argumentsConfigExceptionTest() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .build(); + String[] arguments = new String[] {"-78","yes",".22", "-0.44"}; + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, arguments) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(null); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(null); assertThrows(ArgumentsConfigException.class, - () -> commandHandler.executeCommandByAlias(integration, "test", commandSender), - String.format("Unable to find arguments configuration for the command %s. Have you added configured any arguments for the command?", bukkitCommand.getName())); + () -> bukkitDevCommandStub.hasValidArgs(), + String.format("Unable to find arguments configuration for the command %s. Have you added configured any arguments for the command?", bukkitCommandDataMock.getName())); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java index 6a42395..489a470 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java @@ -7,7 +7,7 @@ import me.hgsoft.minecraft.devcommand.factories.CommandFactory; import me.hgsoft.minecraft.devcommand.factories.IObjectFactory; import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,7 +27,7 @@ class CommandFactoryTest { @BeforeEach void setUp() { bukkitCommandFactory = new CommandFactory(null, "good", "afternoon"); - bukkitCommand = new BukkitCommandDataBuilder("test", integrationMock, TestCommandDevCommand.class) + bukkitCommand = new BukkitCommandDataBuilder("test", integrationMock, TestCommand.class) .withName("Test Command") .withDescription("Bukkit Test Command") .build(); @@ -36,7 +36,7 @@ void setUp() { @Test void generateExecutorForBukkitCommand() { IDevCommand generatedBukkitCommandExecutor = bukkitCommandFactory.generate(bukkitCommand); - Assertions.assertTrue(generatedBukkitCommandExecutor instanceof TestCommandDevCommand); + Assertions.assertTrue(generatedBukkitCommandExecutor instanceof TestCommand); } } \ No newline at end of file diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java index 4b7be81..4d5867c 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java @@ -1,53 +1,51 @@ package me.hgsoft.minecraft.devcommand.registry; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.spy; + +@ExtendWith(MockitoExtension.class) class CommandRegistryTest { - private BukkitCommandData bukkitCommand; - private CommandRegistry commandRegistry; + @Mock private Integration integrationStub; - - @BeforeEach - void setUp() { - integrationStub = new Integration("myIntegration", null); - commandRegistry = new CommandRegistry(); - bukkitCommand = new BukkitCommandDataBuilder("test", integrationStub, TestCommandDevCommand.class).build(); - } - - @AfterEach - void tearDown() { - commandRegistry.setValues(integrationStub, null); - } + @Mock + private BukkitCommandData bukkitCommand; @Test void add() { - Assertions.assertNull(commandRegistry.getValues(integrationStub)); + CommandRegistry commandRegistry = spy(CommandRegistry.class); + + assertNull(commandRegistry.getValues(integrationStub)); commandRegistry.add(integrationStub, bukkitCommand); - Assertions.assertNotNull(commandRegistry.getValues(integrationStub)); - Assertions.assertEquals(1, commandRegistry.getValues(integrationStub).size()); - Assertions.assertEquals(bukkitCommand, commandRegistry.getValues(integrationStub).get(0)); + assertNotNull(commandRegistry.getValues(integrationStub)); + assertEquals(1, commandRegistry.getValues(integrationStub).size()); + assertEquals(bukkitCommand, commandRegistry.getValues(integrationStub).get(0)); } @Test void remove() { + CommandRegistry commandRegistry = spy(CommandRegistry.class); + commandRegistry.setValues(integrationStub, List.of(bukkitCommand)); - Assertions.assertNotNull(commandRegistry.getValues(integrationStub)); - Assertions.assertEquals(1, commandRegistry.getValues(integrationStub).size()); - Assertions.assertEquals(bukkitCommand, commandRegistry.getValues(integrationStub).get(0)); + assertNotNull(commandRegistry.getValues(integrationStub)); + assertEquals(1, commandRegistry.getValues(integrationStub).size()); + assertEquals(bukkitCommand, commandRegistry.getValues(integrationStub).get(0)); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java new file mode 100644 index 0000000..81ae787 --- /dev/null +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java @@ -0,0 +1,32 @@ +package me.hgsoft.minecraft.devcommand.utils.test_classes.invalid; + +import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; +import me.hgsoft.minecraft.devcommand.annotations.Command; +import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; +import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; +import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import org.bukkit.command.CommandSender; + +@Command(alias = "test", description = "Bukkit Test Command!", permission = "command.bukkit_test") +@ArgsValidation(argsTypes = {IntegerArgument.class}) +public class TestCommandCopy extends BukkitDevCommand { + + public static boolean called; + public static BukkitCommandData command; + public static CommandSender sender; + public static String[] args; + + public TestCommandCopy(BukkitCommandData command, CommandSender commandSender, String[] args) { + super(command, commandSender, args); + } + + @Override + public void execute() { + System.out.println("Bukkit Test Command executed!"); + called = true; + command = this.getCommandData(); + sender = getCommandSender(); + args = getArgs(); + } + +} diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/ArgumentDevCommandTestCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java similarity index 79% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/ArgumentDevCommandTestCommand.java rename to src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java index bf4c205..bcea161 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/ArgumentDevCommandTestCommand.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.utils.arguments; +package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; import me.hgsoft.minecraft.devcommand.annotations.Command; @@ -9,13 +9,13 @@ @Command(alias = "test_arg", description = "Argument Test Command!", permission = "command.bukkit_test") @ArgsValidation(argsTypes = {IntegerArgument.class}) -public class ArgumentDevCommandTestCommand extends BukkitDevCommand { +public class ArgumentTestCommand extends BukkitDevCommand { public static boolean called; public static boolean hasPermission; public static boolean hasValidArgs; - public ArgumentDevCommandTestCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { + public ArgumentTestCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { super(command, commandSender, args); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/InvalidTestCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java similarity index 66% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/InvalidTestCommand.java rename to src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java index c39e05e..4159fab 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/InvalidTestCommand.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.utils; +package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; import me.hgsoft.minecraft.devcommand.annotations.Command; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/NoAnnotationArgumentTestCommandDevCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java similarity index 69% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/NoAnnotationArgumentTestCommandDevCommand.java rename to src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java index f3e5108..2794398 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/NoAnnotationArgumentTestCommandDevCommand.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java @@ -1,16 +1,16 @@ -package me.hgsoft.minecraft.devcommand.utils.arguments; +package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; import org.bukkit.command.CommandSender; -public class NoAnnotationArgumentTestCommandDevCommand extends BukkitDevCommand { +public class NoAnnotationTestCommand extends BukkitDevCommand { public static boolean called; public static boolean hasPermission; public static boolean hasValidArgs; - public NoAnnotationArgumentTestCommandDevCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { + public NoAnnotationTestCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { super(command, commandSender, args); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/TestCommandDevCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java similarity index 81% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/TestCommandDevCommand.java rename to src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java index f76f668..6637900 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/TestCommandDevCommand.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.utils; +package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; import me.hgsoft.minecraft.devcommand.annotations.Command; @@ -9,14 +9,14 @@ @Command(alias = "test", description = "Bukkit Test Command!", permission = "command.bukkit_test") @ArgsValidation(argsTypes = {IntegerArgument.class}) -public class TestCommandDevCommand extends BukkitDevCommand { +public class TestCommand extends BukkitDevCommand { public static boolean called; public static BukkitCommandData command; public static CommandSender sender; public static String[] args; - public TestCommandDevCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { + public TestCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { super(command, commandSender, args); } From c08b4e259056c206cf9b264d8a368627b167ffc0 Mon Sep 17 00:00:00 2001 From: Hugo1307 Date: Sat, 1 Apr 2023 20:41:24 +0100 Subject: [PATCH 03/19] Feat: Added distribution management in POM. --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index e058927..aa79ffe 100644 --- a/pom.xml +++ b/pom.xml @@ -126,4 +126,13 @@ + + + github + GitHub Packages + https://maven.pkg.github.com/Hugo1307/DevCommand + + + + \ No newline at end of file From 32fa10c7e5cc3cd1cdf903561882710f7209521b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Thu, 24 Aug 2023 11:24:21 +0100 Subject: [PATCH 04/19] Fix: Fixed dependency injection issue. --- .../devcommand/registry/dependencies/DependencyRegistry.java | 3 +-- .../minecraft/devcommand/executors/BukkitDevCommandTest.java | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java b/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java index 783e5fe..0a2c22d 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java @@ -4,7 +4,6 @@ import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.IRegistry; -import javax.annotation.Nullable; import java.util.*; @Singleton @@ -12,7 +11,7 @@ public class DependencyRegistry implements IRegistry { private final Map> registeredDependencies; - private DependencyRegistry() { + public DependencyRegistry() { this.registeredDependencies = new HashMap<>(); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java index 3ed22e6..6593f97 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java @@ -47,7 +47,7 @@ void hasPermissionToExecuteCommand() { String commandPermission = "commands.no_annotation_test"; when(bukkitCommandDataMock.getPermission()).thenReturn(commandPermission); - when(commandSenderMock.hasPermission(commandPermission)).thenReturn(true); + when(commandSenderMock.hasPermission(commandPermission)).thenReturn(Boolean.TRUE); assertThat(bukkitDevCommandStub.hasPermissionToExecuteCommand()).isTrue(); @@ -63,7 +63,7 @@ void hasPermissionToExecuteCommand_noPermission() { String commandPermission = "commands.no_annotation_test"; when(bukkitCommandDataMock.getPermission()).thenReturn(commandPermission); - when(commandSenderMock.hasPermission(commandPermission)).thenReturn(false); + when(commandSenderMock.hasPermission(commandPermission)).thenReturn(Boolean.FALSE); assertThat(bukkitDevCommandStub.hasPermissionToExecuteCommand()).isFalse(); From 176e160ea8814c551e06b4f32f7d8589ed00dd9a Mon Sep 17 00:00:00 2001 From: Hugo1307 Date: Sat, 17 Sep 2022 22:24:09 +0100 Subject: [PATCH 05/19] Feat: Added Dependency Injection pattern. --- pom.xml | 10 +- .../minecraft/devcommand/DevCommand.java | 21 ++- .../devcommand/commands/BukkitDevCommand.java | 3 +- .../executors/DevCommandExecutor.java | 6 +- .../handler}/CommandHandler.java | 36 ++--- .../dependencies/DependencyHandler.java | 20 ++- .../injection/GuiceBinderModule.java | 20 +++ .../devcommand/integration/Integration.java | 4 + .../registry/commands/CommandRegistry.java | 12 +- .../dependencies/DependencyRegistry.java | 11 +- .../devcommand/CommandHandlerTest.java | 96 ------------- .../minecraft/devcommand/IntegrationTest.java | 23 ++-- .../commands/CommandHandlerTest.java | 130 ++++++++++++++++++ .../executors/BukkitDevCommandTest.java | 11 +- .../registry/CommandRegistryTest.java | 2 +- 15 files changed, 228 insertions(+), 177 deletions(-) rename src/main/java/me/hgsoft/minecraft/devcommand/{ => commands/handler}/CommandHandler.java (73%) create mode 100644 src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java delete mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/CommandHandlerTest.java create mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java diff --git a/pom.xml b/pom.xml index 3138f0e..e058927 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,12 @@ 2.18.0 + + com.google.inject + guice + 5.1.0 + + org.junit.jupiter junit-jupiter @@ -63,14 +69,14 @@ org.mockito mockito-core - 4.7.0 + 4.8.0 test org.mockito mockito-junit-jupiter - 4.7.0 + 4.8.0 test diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java b/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java index 95c2627..00e5f3e 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java @@ -1,26 +1,37 @@ package me.hgsoft.minecraft.devcommand; +import com.google.inject.Inject; +import com.google.inject.Injector; import lombok.Getter; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; import me.hgsoft.minecraft.devcommand.dependencies.DependencyHandler; +import me.hgsoft.minecraft.devcommand.injection.GuiceBinderModule; @Getter public final class DevCommand { private static DevCommand instance; - private final CommandHandler commandHandler; - private final DependencyHandler dependencyHandler; + @Inject + private CommandHandler commandHandler; + @Inject + private DependencyHandler dependencyHandler; private DevCommand() { - this.commandHandler = CommandHandler.createOrGetInstance(); - this.dependencyHandler = DependencyHandler.createOrGetInstance(); + initDependencyInjectionModules(); } - public static DevCommand getInstance() { + public static DevCommand getOrCreateInstance() { if (instance == null) { instance = new DevCommand(); } return instance; } + private void initDependencyInjectionModules() { + GuiceBinderModule guiceBinderModule = new GuiceBinderModule(); + Injector injector = guiceBinderModule.createInjector(); + injector.injectMembers(this); + } + } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java index cf40c18..5ae975a 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java @@ -2,6 +2,7 @@ import lombok.Generated; import lombok.Getter; +import me.hgsoft.minecraft.devcommand.DevCommand; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.dependencies.DependencyHandler; import me.hgsoft.minecraft.devcommand.exceptions.ArgumentsConfigException; @@ -91,7 +92,7 @@ public boolean hasValidArgs() { @Override public List getDependencies() { - DependencyHandler dependencyHandler = DependencyHandler.createOrGetInstance(); + DependencyHandler dependencyHandler = DevCommand.getOrCreateInstance().getDependencyHandler(); Integration commandIntegration = commandData.getIntegration(); return Arrays.stream(getCommandData().getDependencies()) diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java index 41c990a..926cf96 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java @@ -1,7 +1,8 @@ package me.hgsoft.minecraft.devcommand.commands.executors; import lombok.NonNull; -import me.hgsoft.minecraft.devcommand.CommandHandler; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; +import me.hgsoft.minecraft.devcommand.DevCommand; import me.hgsoft.minecraft.devcommand.integration.Integration; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -29,7 +30,8 @@ public boolean onCommand(@NonNull CommandSender commandSender, @NonNull Command return false; } - CommandHandler commandHandler = CommandHandler.createOrGetInstance(); + DevCommand devCommand = DevCommand.getOrCreateInstance(); + CommandHandler commandHandler = devCommand.getCommandHandler(); // No arguments for the command. if (args.length == 0) { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/CommandHandler.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java similarity index 73% rename from src/main/java/me/hgsoft/minecraft/devcommand/CommandHandler.java rename to src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java index dea1b4d..c9afa0a 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/CommandHandler.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java @@ -1,5 +1,7 @@ -package me.hgsoft.minecraft.devcommand; +package me.hgsoft.minecraft.devcommand.commands.handler; +import com.google.inject.Inject; +import lombok.NonNull; import lombok.extern.log4j.Log4j2; import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; import me.hgsoft.minecraft.devcommand.discovery.CommandDiscoveryService; @@ -17,22 +19,23 @@ @Log4j2 public class CommandHandler { - private static CommandHandler currentInstance; + private final CommandRegistry commandRegistry; - private CommandHandler() { } + @Inject + public CommandHandler(CommandRegistry commandRegistry) { + this.commandRegistry = commandRegistry; + } public void registerCommand(Integration integration, AbstractCommandData command) { - CommandRegistry.getInstance().add(integration, command); + commandRegistry.add(integration, command); } public boolean executeCommandByAlias(Integration integration, String alias, Object... commandArgs) { IObjectFactory commandFactory = new CommandFactory(commandArgs); - CommandRegistry commandRegistry = CommandRegistry.getInstance(); List registeredCommandsForIntegration = commandRegistry.getValues(integration); if (registeredCommandsForIntegration == null) { - System.out.println("No Commands registered"); return false; } @@ -49,11 +52,9 @@ public boolean executeCommandByAlias(Integration integration, String alias, Obje } - public void initCommandsAutoConfiguration(Integration integration) { - - System.out.println("INTEGRATION VALID: " + integration.toString()); + public void initCommandsAutoConfiguration(@NonNull Integration integration) { - if (!checkIntegrationValidity(integration)) { + if (!integration.isValid()) { throw new InvalidIntegrationException(String.format("The integration %s contained an invalid base package.", integration.getName())); } @@ -80,19 +81,4 @@ public void initCommandsAutoConfiguration(Integration integration) { } - private boolean checkIntegrationValidity(Integration integration) { - if (integration == null || integration.getBasePackage() == null) { - log.warn("Unable to find base package for Integration - Commands Auto-Configuration stopped."); - return false; - } - return true; - } - - public static CommandHandler createOrGetInstance() { - if (currentInstance == null) { - currentInstance = new CommandHandler(); - } - return currentInstance; - } - } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java b/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java index 51cee05..9ad869b 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java @@ -1,19 +1,25 @@ package me.hgsoft.minecraft.devcommand.dependencies; +import com.google.inject.Inject; +import com.google.inject.Singleton; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.dependencies.DependencyRegistry; import java.util.Arrays; import java.util.List; +@Singleton public class DependencyHandler { - private static DependencyHandler instance; + private final DependencyRegistry dependencyRegistry; - private DependencyHandler() { } + @Inject + public DependencyHandler(DependencyRegistry dependencyRegistry) { + this.dependencyRegistry = dependencyRegistry; + } public void registerDependency(Integration integration, Object dependency) { - DependencyRegistry.getInstance().add(integration, dependency); + dependencyRegistry.add(integration, dependency); } public void registerDependencies(Integration integration, Object... dependencies) { Arrays.stream(dependencies).forEach(dependency -> registerDependency(integration, dependency)); @@ -21,7 +27,6 @@ public void registerDependencies(Integration integration, Object... dependencies public Object getDependencyInstance(Integration integration, Class dependencyClass) { - DependencyRegistry dependencyRegistry = DependencyRegistry.getInstance(); List registeredDependencies = dependencyRegistry.getValues(integration); for (Object registeredDependency : registeredDependencies) { @@ -34,11 +39,4 @@ public Object getDependencyInstance(Integration integration, Class dependency } - public static DependencyHandler createOrGetInstance() { - if (instance == null) { - instance = new DependencyHandler(); - } - return instance; - } - } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java b/src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java new file mode 100644 index 0000000..8abbcf3 --- /dev/null +++ b/src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java @@ -0,0 +1,20 @@ +package me.hgsoft.minecraft.devcommand.injection; + +import com.google.inject.AbstractModule; +import com.google.inject.Guice; +import com.google.inject.Injector; + +public class GuiceBinderModule extends AbstractModule { + + public GuiceBinderModule() {} + + public Injector createInjector() { + return Guice.createInjector(this); + } + + @Override + protected void configure() { + + } + +} diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java b/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java index e9e517e..4894b3a 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java @@ -32,6 +32,10 @@ public static Integration createFromPlugin(JavaPlugin plugin) { return new Integration(getNameFromPlugin(plugin), plugin, getBasePackageFromPlugin(plugin)); } + public boolean isValid() { + return basePackage != null; + } + private static String getNameFromPlugin(JavaPlugin plugin) { return plugin.getName(); } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java b/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java index e10d820..21188a1 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java @@ -1,18 +1,18 @@ package me.hgsoft.minecraft.devcommand.registry.commands; +import com.google.inject.Singleton; import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.IRegistry; import java.util.*; +@Singleton public class CommandRegistry implements IRegistry { - private static CommandRegistry instance; - private final Map> registeredCommands; - private CommandRegistry() { + public CommandRegistry() { this.registeredCommands = new HashMap<>(); } @@ -40,10 +40,4 @@ public void setValues(Integration key, List value) { registeredCommands.put(key, value); } - public static CommandRegistry getInstance() { - if (instance == null) - instance = new CommandRegistry(); - return instance; - } - } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java b/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java index f287246..783e5fe 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java @@ -1,15 +1,15 @@ package me.hgsoft.minecraft.devcommand.registry.dependencies; +import com.google.inject.Singleton; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.IRegistry; import javax.annotation.Nullable; import java.util.*; +@Singleton public class DependencyRegistry implements IRegistry { - private static DependencyRegistry instance; - private final Map> registeredDependencies; private DependencyRegistry() { @@ -40,11 +40,4 @@ public void setValues(Integration key, List value) { registeredDependencies.put(key, value); } - public static DependencyRegistry getInstance() { - if (instance == null) { - instance = new DependencyRegistry(); - } - return instance; - } - } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/CommandHandlerTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/CommandHandlerTest.java deleted file mode 100644 index d79b199..0000000 --- a/src/test/java/me/hgsoft/minecraft/devcommand/CommandHandlerTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package me.hgsoft.minecraft.devcommand; - -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; -import me.hgsoft.minecraft.devcommand.exceptions.InvalidIntegrationException; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; -import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; - -class CommandHandlerTest { - - private CommandHandler commandHandler; - private CommandRegistry commandRegistry; - private BukkitCommandData bukkitCommandStub; - private Integration integrationStub; - - @BeforeEach - void setUp() { - commandHandler = CommandHandler.createOrGetInstance(); - commandRegistry = CommandRegistry.getInstance(); - integrationStub = new Integration("myIntegration", "me.hgsoft."); - bukkitCommandStub = new BukkitCommandDataBuilder("test", integrationStub, TestCommandDevCommand.class) - .withDescription("Bukkit Test Command!") - .withPermission("command.bukkit_test") - .withMandatoryArguments(IntegerArgument.class) - .build(); - } - - @AfterEach - void tearDown() { - commandRegistry.setValues(integrationStub, null); - TestCommandDevCommand.called = false; - } - - @Test - void registerCommand() { - - Assertions.assertNull(commandRegistry.getValues(integrationStub)); - - commandHandler.registerCommand(integrationStub, bukkitCommandStub); - - Assertions.assertEquals(1, commandRegistry.getValues(integrationStub).size()); - Assertions.assertEquals(bukkitCommandStub, commandRegistry.getValues(integrationStub).get(0)); - - } - - @Test - void executeCommandByAlias_CommandNotRegistered() { - - boolean commandSuccessfullyExecuted = commandHandler.executeCommandByAlias(integrationStub, bukkitCommandStub.getAlias(), null, "1"); - - assertFalse(commandSuccessfullyExecuted); - assertFalse(TestCommandDevCommand.called); - - } - - @Test - void executeCommandByAliasForBukkitCommand() { - - commandHandler.registerCommand(integrationStub, bukkitCommandStub); - boolean commandSuccessfullyExecuted = commandHandler.executeCommandByAlias(integrationStub, bukkitCommandStub.getAlias(), null, "good", "afternoon"); - - assertTrue(commandSuccessfullyExecuted); - assertTrue(TestCommandDevCommand.called); - - } - - @Test - void initCommandsAutoConfiguration() { - - commandHandler.initCommandsAutoConfiguration(integrationStub); - - assertThat(commandRegistry.getValues(integrationStub)) - .isNotNull() - .hasSize(2) - .contains(bukkitCommandStub); - - } - - @Test - void initCommandsAutoConfigurationWithInvalidIntegration() { - - Integration invalidIntegration = new Integration("MyPlugin", null); - assertThrows(InvalidIntegrationException.class, () -> commandHandler.initCommandsAutoConfiguration(invalidIntegration)); - - } - -} \ No newline at end of file diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java index 70f8303..2985098 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java @@ -1,29 +1,30 @@ package me.hgsoft.minecraft.devcommand; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; import org.junit.jupiter.api.*; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import static org.junit.jupiter.api.Assertions.*; +@ExtendWith(MockitoExtension.class) class IntegrationTest { - - private static CommandHandler commandHandler; - private static CommandRegistry commandRegistry; - private static Integration pluginIntegration; - - @BeforeAll - static void initialSetUp() { - commandHandler = CommandHandler.createOrGetInstance(); - commandRegistry = CommandRegistry.getInstance(); - pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand"); - } + @Mock + private CommandRegistry commandRegistry; + @InjectMocks + private CommandHandler commandHandler; + private Integration pluginIntegration; @BeforeEach void setUp() { + pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand"); TestCommandDevCommand.called = false; } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java new file mode 100644 index 0000000..ad308e7 --- /dev/null +++ b/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java @@ -0,0 +1,130 @@ +package me.hgsoft.minecraft.devcommand.commands; + +import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; +import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; +import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; +import me.hgsoft.minecraft.devcommand.exceptions.InvalidIntegrationException; +import me.hgsoft.minecraft.devcommand.integration.Integration; +import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; +import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; +import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class CommandHandlerTest { + + @Mock + private CommandRegistry commandRegistry; + @Mock + private Integration integration; + @InjectMocks + private CommandHandler commandHandler; + + private BukkitCommandData bukkitCommandStub; + + @BeforeEach + void setUp() { + + bukkitCommandStub = new BukkitCommandDataBuilder("test", integration, TestCommandDevCommand.class) + .withDescription("Bukkit Test Command!") + .withPermission("command.bukkit_test") + .withMandatoryArguments(IntegerArgument.class) + .build(); + + } + + @AfterEach + void tearDown() { + commandRegistry.setValues(integration, null); + TestCommandDevCommand.called = false; + } + + @Test + @DisplayName("Test CommandHandler registerCommand()") + void registerCommand() { + + commandHandler.registerCommand(integration, bukkitCommandStub); + verify(commandRegistry, times(1)).add(integration, bukkitCommandStub); + + } + + @Test + @DisplayName("Test if command is executed when there are no commands registered.") + void executeCommandByAlias_NoCommandsRegistered() { + + when(commandRegistry.getValues(integration)).thenReturn(null); + + boolean commandExecuted = commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, null); + + assertFalse(commandExecuted); + + verify(commandRegistry, times(1)).getValues(integration); + + } + + @Test + @DisplayName("Test if the command is executed when it is not registered.") + void executeCommandByAlias_CommandNotRegistered() { + + AbstractCommandData abstractCommandDataMock = mock(AbstractCommandData.class); + + when(commandRegistry.getValues(integration)).thenReturn(List.of(abstractCommandDataMock)); + when(abstractCommandDataMock.getAlias()).thenReturn("not_registered_alias"); + + assertFalse(commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, null)); + + verify(commandRegistry, times(1)).getValues(integration); + + } + + @Test + @DisplayName("Test if command is executed successfully by its alias.") + void executeCommandByAlias() { + + commandHandler.registerCommand(integration, bukkitCommandStub); + + when(commandRegistry.getValues(integration)).thenReturn(List.of(bukkitCommandStub)); + + assertTrue(commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, "good", "afternoon")); + + verify(commandRegistry, times(1)).getValues(integration); + + } + + @Test + @DisplayName("Test method to initiate commands autoconfiguration.") + void initCommandsAutoConfiguration() { + + commandHandler.initCommandsAutoConfiguration(integration); + + assertThat(commandRegistry.getValues(integration)) + .isNotNull() + .hasSize(2) + .contains(bukkitCommandStub); + + } + + @Test + @DisplayName("Test method to initiate commands autoconfiguration with Invalid integration.") + void initCommandsAutoConfigurationWithInvalidIntegration() { + + Integration invalidIntegration = new Integration("MyPlugin", null); + assertThrows(InvalidIntegrationException.class, () -> commandHandler.initCommandsAutoConfiguration(invalidIntegration)); + + } + +} \ No newline at end of file diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java index d923069..70ed29b 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java @@ -1,6 +1,6 @@ package me.hgsoft.minecraft.devcommand.executors; -import me.hgsoft.minecraft.devcommand.CommandHandler; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.exceptions.ArgumentsConfigException; @@ -18,6 +18,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -27,18 +28,18 @@ @ExtendWith(MockitoExtension.class) class BukkitDevCommandTest { + @Mock + private CommandRegistry commandRegistry; @Mock private CommandSender commandSender; + @InjectMocks + private CommandHandler commandHandler; private Integration integration; - private CommandHandler commandHandler; - private CommandRegistry commandRegistry; @BeforeEach void setUp() { integration = new Integration("MyPlugin", "me"); - commandHandler = CommandHandler.createOrGetInstance(); - commandRegistry = CommandRegistry.getInstance(); } @AfterEach diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java index f991629..4b7be81 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java @@ -18,7 +18,7 @@ class CommandRegistryTest { @BeforeEach void setUp() { integrationStub = new Integration("myIntegration", null); - commandRegistry = CommandRegistry.getInstance(); + commandRegistry = new CommandRegistry(); bukkitCommand = new BukkitCommandDataBuilder("test", integrationStub, TestCommandDevCommand.class).build(); } From 84ec70758c9d40bba546dd4b9ab08f1d7743a0e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Tue, 20 Sep 2022 23:54:26 +0100 Subject: [PATCH 06/19] Fix: Fixed unit tests and small bugs/issues. --- .../devcommand/commands/BukkitDevCommand.java | 3 + .../commands/handler/CommandHandler.java | 36 ++- .../discovery/CommandDiscoveryService.java | 33 +- .../devcommand/validators/DoubleArgument.java | 2 +- ...rationTest.java => IntegrationTestIT.java} | 57 ++-- .../commands/CommandHandlerTest.java | 69 ++-- .../CommandDiscoveryServiceTest.java | 175 +++++++++++ .../executors/BukkitDevCommandTest.java | 295 ++++++++++-------- .../factory/CommandFactoryTest.java | 6 +- .../registry/CommandRegistryTest.java | 46 ++- .../test_classes/invalid/TestCommandCopy.java | 32 ++ .../valid/ArgumentTestCommand.java} | 6 +- .../valid}/InvalidTestCommand.java | 2 +- .../valid/NoAnnotationTestCommand.java} | 6 +- .../valid/TestCommand.java} | 6 +- 15 files changed, 531 insertions(+), 243 deletions(-) rename src/test/java/me/hgsoft/minecraft/devcommand/{IntegrationTest.java => IntegrationTestIT.java} (60%) create mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java create mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java rename src/test/java/me/hgsoft/minecraft/devcommand/utils/{arguments/ArgumentDevCommandTestCommand.java => test_classes/valid/ArgumentTestCommand.java} (79%) rename src/test/java/me/hgsoft/minecraft/devcommand/utils/{ => test_classes/valid}/InvalidTestCommand.java (66%) rename src/test/java/me/hgsoft/minecraft/devcommand/utils/{arguments/NoAnnotationArgumentTestCommandDevCommand.java => test_classes/valid/NoAnnotationTestCommand.java} (69%) rename src/test/java/me/hgsoft/minecraft/devcommand/utils/{TestCommandDevCommand.java => test_classes/valid/TestCommand.java} (81%) diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java index 5ae975a..c3f604f 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java @@ -33,10 +33,13 @@ public BukkitDevCommand(BukkitCommandData commandData, CommandSender commandSend @Override public boolean hasPermissionToExecuteCommand() { + if (commandData.getPermission() == null) { throw new PermissionConfigException(String.format("Unable to find the permission for the command %s. Have you configured any permission at all?", commandData.getName())); } + return commandSender.hasPermission(commandData.getPermission()); + } @Override diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java b/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java index c9afa0a..4fac08c 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java @@ -54,31 +54,35 @@ public boolean executeCommandByAlias(Integration integration, String alias, Obje public void initCommandsAutoConfiguration(@NonNull Integration integration) { - if (!integration.isValid()) { - throw new InvalidIntegrationException(String.format("The integration %s contained an invalid base package.", integration.getName())); - } + validateIntegration(integration); - CommandDiscoveryService commandDiscoveryService = new CommandDiscoveryService(integration); + initCommandsAutoConfiguration(integration, new CommandDiscoveryService(integration)); - List discoveredAbstractCommandDataList = commandDiscoveryService.getCommandExecutorClasses() - .stream() - .map(commandDiscoveryService::executorClassToCommand) - .collect(Collectors.toList()); + } + + public void initCommandsAutoConfiguration(@NonNull Integration integration, CommandDiscoveryService commandDiscoveryService) { - boolean hasRepeatedAliases = discoveredAbstractCommandDataList.stream() - .map(AbstractCommandData::getAlias) - .distinct() - .count() != discoveredAbstractCommandDataList.size(); + validateIntegration(integration); - if (hasRepeatedAliases) { + if (commandDiscoveryService.containsCommandsWithRepeatedAliases()) { throw new AutoConfigurationException("Unable to autoconfigure commands as there are commands with repeated aliases."); } - discoveredAbstractCommandDataList.forEach(abstractCommand -> { - registerCommand(integration, abstractCommand); - log.info(String.format("Loaded command '%s' from '%s'.", abstractCommand.getAlias(), integration.getName())); + commandDiscoveryService.getDiscoveredCommandsData().forEach(abstractCommand -> { + if (abstractCommand != null) { + registerCommand(integration, abstractCommand); + log.info(String.format("Loaded command '%s' from '%s'.", abstractCommand.getAlias(), integration.getName())); + } else { + log.info("Failed to load at least one of the commands..."); + } }); } + private void validateIntegration(Integration integration) { + if (!integration.isValid()) { + throw new InvalidIntegrationException(String.format("The integration %s contained an invalid base package.", integration.getName())); + } + } + } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java b/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java index e8a0a76..0ff0e18 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java @@ -11,6 +11,7 @@ import me.hgsoft.minecraft.devcommand.validators.CommandArgument; import org.reflections.Reflections; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -21,20 +22,31 @@ public class CommandDiscoveryService { private final Reflections reflectionUtils; public CommandDiscoveryService(Integration integration) { + this(integration, new Reflections(integration.getBasePackage())); + } + + public CommandDiscoveryService(Integration integration, Reflections reflectionUtils) { this.integration = integration; - this.reflectionUtils = new Reflections(integration.getBasePackage()); + this.reflectionUtils = reflectionUtils; } - public Set> getCommandExecutorClasses() { + public Set> getCommandClasses() { return reflectionUtils.getTypesAnnotatedWith(Command.class) .stream() .filter(this::containsCommandAnnotation) .filter(this::isValidCommandClass) - .map(this::getCommandExecutor) + .map(this::getCommandClass) .collect(Collectors.toSet()); } - public AbstractCommandData executorClassToCommand(Class commandExecutorClass) { + public List getDiscoveredCommandsData() { + return getCommandClasses() + .stream() + .map(this::commandClassToCommandData) + .collect(Collectors.toList()); + } + + public AbstractCommandData commandClassToCommandData(Class commandExecutorClass) { Class>[] argsValidationTypes = null; Class[] commandDependencies = null; @@ -64,6 +76,17 @@ public AbstractCommandData executorClassToCommand(Class c } + public boolean containsCommandsWithRepeatedAliases() { + + List commandDataObjectsGenerated = getDiscoveredCommandsData(); + + return getDiscoveredCommandsData().stream() + .map(AbstractCommandData::getAlias) + .distinct() + .count() != commandDataObjectsGenerated.size(); + + } + private Command getCommandAnnotation(Class classToGetAnnotationFrom) { return classToGetAnnotationFrom.getAnnotation(Command.class); } @@ -89,7 +112,7 @@ private boolean containsDependenciesAnnotation(Class classToCheck) { } @SuppressWarnings("unchecked") - private Class getCommandExecutor(Class classToCheck) { + private Class getCommandClass(Class classToCheck) { return isValidCommandClass(classToCheck) ? (Class) classToCheck : null; } diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java b/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java index b3a9268..15998a0 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java @@ -13,7 +13,7 @@ public DoubleArgument(String argument) { @Override public boolean isValid() { - return getArgument().matches("\\d*\\.\\d+"); + return getArgument().matches("[-+]?\\d*\\.\\d+"); } @Override diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java similarity index 60% rename from src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java rename to src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java index 2985098..b1c6a0e 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java @@ -1,62 +1,61 @@ package me.hgsoft.minecraft.devcommand; -import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; +import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; +import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; -import org.junit.jupiter.api.*; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; -@ExtendWith(MockitoExtension.class) -class IntegrationTest { - @Mock +@SuppressWarnings("all") +class IntegrationTestIT { + private CommandRegistry commandRegistry; - @InjectMocks private CommandHandler commandHandler; private Integration pluginIntegration; @BeforeEach void setUp() { - pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand"); - TestCommandDevCommand.called = false; + commandRegistry = new CommandRegistry(); + commandHandler = new CommandHandler(commandRegistry); + pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand.utils.test_classes.valid"); + TestCommand.called = false; } @AfterEach void tearDown() { - TestCommandDevCommand.called = false; - TestCommandDevCommand.args = null; - TestCommandDevCommand.command = null; - TestCommandDevCommand.sender = null; + TestCommand.called = false; + TestCommand.args = null; + TestCommand.command = null; + TestCommand.sender = null; commandRegistry.setValues(pluginIntegration, null); } @Test void registerAndExecuteBukkitCommand() { - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("help bukkit", pluginIntegration, TestCommandDevCommand.class) + BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", pluginIntegration, TestCommand.class) .withDescription("Help Command") .withPermission("dev_commands.commands.help") .build(); commandHandler.registerCommand(pluginIntegration, bukkitCommand); - commandHandler.executeCommandByAlias(pluginIntegration, "help bukkit", null, "1"); + commandHandler.executeCommandByAlias(pluginIntegration, "test", null, "1"); // The command was successfully called - assertTrue(TestCommandDevCommand.called); + assertTrue(TestCommand.called); // The sender is the same - assertNull(TestCommandDevCommand.sender); + assertNull(TestCommand.sender); // The args are also correct - assertArrayEquals(new String[] {"1"}, TestCommandDevCommand.args); + assertArrayEquals(new String[] {"1"}, TestCommand.args); - assertEquals(bukkitCommand, TestCommandDevCommand.command); + assertEquals(bukkitCommand, TestCommand.command); } @@ -67,16 +66,16 @@ void autoCommandDiscoveryAndExecuteBukkitCommand() { commandHandler.executeCommandByAlias(pluginIntegration, "test", null, "good", "afternoon"); // The command was successfully called - assertTrue(TestCommandDevCommand.called); + assertTrue(TestCommand.called); // The sender is the same - assertNull(TestCommandDevCommand.sender); + assertNull(TestCommand.sender); // The args are also correct - assertArrayEquals(new String[] {"good", "afternoon"}, TestCommandDevCommand.args); + assertArrayEquals(new String[] {"good", "afternoon"}, TestCommand.args); // The command alias is also correct - assertNotNull(TestCommandDevCommand.command); - assertEquals(TestCommandDevCommand.command.getAlias(), "test"); + assertNotNull(TestCommand.command); + assertEquals(TestCommand.command.getAlias(), "test"); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java index ad308e7..99fe713 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java @@ -4,10 +4,12 @@ import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; +import me.hgsoft.minecraft.devcommand.discovery.CommandDiscoveryService; +import me.hgsoft.minecraft.devcommand.exceptions.AutoConfigurationException; import me.hgsoft.minecraft.devcommand.exceptions.InvalidIntegrationException; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -20,7 +22,6 @@ import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; @@ -28,9 +29,9 @@ class CommandHandlerTest { @Mock - private CommandRegistry commandRegistry; + private CommandRegistry commandRegistryMock; @Mock - private Integration integration; + private Integration integrationMock; @InjectMocks private CommandHandler commandHandler; @@ -39,7 +40,7 @@ class CommandHandlerTest { @BeforeEach void setUp() { - bukkitCommandStub = new BukkitCommandDataBuilder("test", integration, TestCommandDevCommand.class) + bukkitCommandStub = new BukkitCommandDataBuilder("test", integrationMock, TestCommand.class) .withDescription("Bukkit Test Command!") .withPermission("command.bukkit_test") .withMandatoryArguments(IntegerArgument.class) @@ -49,16 +50,16 @@ void setUp() { @AfterEach void tearDown() { - commandRegistry.setValues(integration, null); - TestCommandDevCommand.called = false; + commandRegistryMock.setValues(integrationMock, null); + TestCommand.called = false; } @Test @DisplayName("Test CommandHandler registerCommand()") void registerCommand() { - commandHandler.registerCommand(integration, bukkitCommandStub); - verify(commandRegistry, times(1)).add(integration, bukkitCommandStub); + commandHandler.registerCommand(integrationMock, bukkitCommandStub); + verify(commandRegistryMock, times(1)).add(integrationMock, bukkitCommandStub); } @@ -66,13 +67,13 @@ void registerCommand() { @DisplayName("Test if command is executed when there are no commands registered.") void executeCommandByAlias_NoCommandsRegistered() { - when(commandRegistry.getValues(integration)).thenReturn(null); + when(commandRegistryMock.getValues(integrationMock)).thenReturn(null); - boolean commandExecuted = commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, null); + boolean commandExecuted = commandHandler.executeCommandByAlias(integrationMock, bukkitCommandStub.getAlias(), null, null); assertFalse(commandExecuted); - verify(commandRegistry, times(1)).getValues(integration); + verify(commandRegistryMock, times(1)).getValues(integrationMock); } @@ -82,12 +83,12 @@ void executeCommandByAlias_CommandNotRegistered() { AbstractCommandData abstractCommandDataMock = mock(AbstractCommandData.class); - when(commandRegistry.getValues(integration)).thenReturn(List.of(abstractCommandDataMock)); + when(commandRegistryMock.getValues(integrationMock)).thenReturn(List.of(abstractCommandDataMock)); when(abstractCommandDataMock.getAlias()).thenReturn("not_registered_alias"); - assertFalse(commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, null)); + assertFalse(commandHandler.executeCommandByAlias(integrationMock, bukkitCommandStub.getAlias(), null, null)); - verify(commandRegistry, times(1)).getValues(integration); + verify(commandRegistryMock, times(1)).getValues(integrationMock); } @@ -95,26 +96,44 @@ void executeCommandByAlias_CommandNotRegistered() { @DisplayName("Test if command is executed successfully by its alias.") void executeCommandByAlias() { - commandHandler.registerCommand(integration, bukkitCommandStub); + commandHandler.registerCommand(integrationMock, bukkitCommandStub); - when(commandRegistry.getValues(integration)).thenReturn(List.of(bukkitCommandStub)); + when(commandRegistryMock.getValues(integrationMock)).thenReturn(List.of(bukkitCommandStub)); - assertTrue(commandHandler.executeCommandByAlias(integration, bukkitCommandStub.getAlias(), null, "good", "afternoon")); + assertTrue(commandHandler.executeCommandByAlias(integrationMock, bukkitCommandStub.getAlias(), null, "good", "afternoon")); - verify(commandRegistry, times(1)).getValues(integration); + verify(commandRegistryMock, times(1)).getValues(integrationMock); } @Test - @DisplayName("Test method to initiate commands autoconfiguration.") + @DisplayName("Test autoconfiguration method.") void initCommandsAutoConfiguration() { - commandHandler.initCommandsAutoConfiguration(integration); + CommandDiscoveryService commandDiscoveryServiceMock = mock(CommandDiscoveryService.class); - assertThat(commandRegistry.getValues(integration)) - .isNotNull() - .hasSize(2) - .contains(bukkitCommandStub); + when(commandDiscoveryServiceMock.containsCommandsWithRepeatedAliases()).thenReturn(false); + when(commandDiscoveryServiceMock.getDiscoveredCommandsData()).thenReturn(List.of(mock(AbstractCommandData.class))); + when(integrationMock.isValid()).thenReturn(true); + + assertDoesNotThrow(() -> commandHandler.initCommandsAutoConfiguration(integrationMock, commandDiscoveryServiceMock)); + + verify(commandRegistryMock, times(1)).add(any(), any()); + + } + + @Test + @DisplayName("Test autoconfiguration with duplicated command aliases.") + void initCommandsAutoConfiguration_withDuplicatedAliases() { + + CommandDiscoveryService commandDiscoveryServiceMock = mock(CommandDiscoveryService.class); + + when(commandDiscoveryServiceMock.containsCommandsWithRepeatedAliases()).thenReturn(true); + when(integrationMock.isValid()).thenReturn(true); + + assertThrows(AutoConfigurationException.class, () -> commandHandler.initCommandsAutoConfiguration(integrationMock, commandDiscoveryServiceMock)); + + verify(commandDiscoveryServiceMock, times(1)).containsCommandsWithRepeatedAliases(); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java new file mode 100644 index 0000000..c580593 --- /dev/null +++ b/src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java @@ -0,0 +1,175 @@ +package me.hgsoft.minecraft.devcommand.discovery; + +import me.hgsoft.minecraft.devcommand.annotations.Command; +import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; +import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; +import me.hgsoft.minecraft.devcommand.integration.Integration; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.ArgumentTestCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.NoAnnotationTestCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.invalid.TestCommandCopy; +import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.reflections.Reflections; + +import java.util.Set; + +import static org.mockito.Mockito.when; +import static org.assertj.core.api.Assertions.assertThat; + +@ExtendWith(MockitoExtension.class) +class CommandDiscoveryServiceTest { + + @Mock + private Reflections reflectionsUtilsMock; + + @Mock + private Integration integrationMock; + + @InjectMocks + private CommandDiscoveryService commandDiscoveryService; + + @Test + @DisplayName("Test method to get classes annotated with @Command") + void getCommandClasses() { + + when(reflectionsUtilsMock.getTypesAnnotatedWith(Command.class)).thenReturn(Set.of(TestCommand.class, NoAnnotationTestCommand.class)); + + // Contains Only TestCommand cause the other one does not contain the @Command annotation. + assertThat(commandDiscoveryService.getCommandClasses()) + .isNotNull() + .isNotEmpty() + .hasSize(1) + .containsOnly(TestCommand.class); + + } + + @Test + @DisplayName("Test method to generate command data for all the detected commands.") + void getDiscoveredCommandsData() { + + when(reflectionsUtilsMock.getTypesAnnotatedWith(Command.class)).thenReturn(Set.of(TestCommand.class)); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .isNotNull() + .isNotEmpty() + .hasSize(1); + + // Below: + // Check if the values from @Command annotation in TestCommand class were successfully introduced + // in the command data class generated. + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .extracting(AbstractCommandData::getName) + .containsOnlyNulls(); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .extracting(AbstractCommandData::getAlias) + .containsExactly("test"); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .extracting(AbstractCommandData::getDescription) + .containsExactly("Bukkit Test Command!"); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .extracting(AbstractCommandData::getExecutor) + .first() + .isEqualTo(TestCommand.class); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .first() + .isInstanceOf(BukkitCommandData.class); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .first() + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData).extracting(BukkitCommandData::getPermission).isEqualTo("command.bukkit_test") + ); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .first() + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData) + .extracting(BukkitCommandData::getMandatoryArguments) + .extracting(classes -> + assertThat(classes).containsExactlyInAnyOrder(IntegerArgument.class) + ).isNotNull() + ); + + assertThat(commandDiscoveryService.getDiscoveredCommandsData()) + .first() + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData).extracting(BukkitCommandData::getOptionalArguments).isNull() + ); + + } + + @Test + @DisplayName("Test method to convert from command class to command data object.") + void commandClassToCommandData() { + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .isNotNull() + .isInstanceOf(BukkitCommandData.class); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .extracting(AbstractCommandData::getName) + .isNull(); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .extracting(AbstractCommandData::getAlias) + .isEqualTo("test"); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .extracting(AbstractCommandData::getDescription) + .isEqualTo("Bukkit Test Command!"); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .extracting(AbstractCommandData::getExecutor) + .isEqualTo(TestCommand.class); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData).extracting(BukkitCommandData::getPermission).isEqualTo("command.bukkit_test") + ); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData) + .extracting(BukkitCommandData::getMandatoryArguments) + .extracting(classes -> + assertThat(classes).containsExactlyInAnyOrder(IntegerArgument.class) + ).isNotNull() + ); + + assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) + .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> + assertThat(bukkitCommandData).extracting(BukkitCommandData::getOptionalArguments).isNull() + ); + + } + + @Test + @DisplayName("Test if commands with repeated aliases are detected successfully.") + void containsCommandsWithRepeatedAliases() { + + // Both TestCommand and TestCommandCopy have the same alias + when(reflectionsUtilsMock.getTypesAnnotatedWith(Command.class)) + .thenReturn(Set.of(TestCommand.class, TestCommandCopy.class)); + + assertThat(commandDiscoveryService.containsCommandsWithRepeatedAliases()).isTrue(); + + // TestCommand and ArgumentTestCommand have different aliases + when(reflectionsUtilsMock.getTypesAnnotatedWith(Command.class)) + .thenReturn(Set.of(TestCommand.class, ArgumentTestCommand.class)); + + assertThat(commandDiscoveryService.containsCommandsWithRepeatedAliases()).isFalse(); + + } + +} \ No newline at end of file diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java index 70ed29b..3ed22e6 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java @@ -1,248 +1,283 @@ package me.hgsoft.minecraft.devcommand.executors; -import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; +import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.exceptions.ArgumentsConfigException; import me.hgsoft.minecraft.devcommand.exceptions.PermissionConfigException; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.arguments.ArgumentDevCommandTestCommand; -import me.hgsoft.minecraft.devcommand.utils.arguments.NoAnnotationArgumentTestCommandDevCommand; import me.hgsoft.minecraft.devcommand.validators.BooleanArgument; import me.hgsoft.minecraft.devcommand.validators.DoubleArgument; import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; import me.hgsoft.minecraft.devcommand.validators.StringArgument; import org.bukkit.command.CommandSender; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.when; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) class BukkitDevCommandTest { @Mock - private CommandRegistry commandRegistry; + private CommandSender commandSenderMock; @Mock - private CommandSender commandSender; - @InjectMocks - private CommandHandler commandHandler; + private BukkitCommandData bukkitCommandDataMock; - private Integration integration; + private BukkitDevCommand bukkitDevCommandStub; @BeforeEach void setUp() { - integration = new Integration("MyPlugin", "me"); - } - - @AfterEach - void tearDown() { - NoAnnotationArgumentTestCommandDevCommand.called = false; - NoAnnotationArgumentTestCommandDevCommand.hasPermission = false; - NoAnnotationArgumentTestCommandDevCommand.hasValidArgs = false; - commandRegistry.setValues(integration, null); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, null) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; } @Test + @DisplayName("Test the hasPermissionToExecuteCommand method when player HAS permission.") void hasPermissionToExecuteCommand() { String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .build(); - when(commandSender.hasPermission(bukkitCommand.getPermission())).thenReturn(true); + when(bukkitCommandDataMock.getPermission()).thenReturn(commandPermission); + when(commandSenderMock.hasPermission(commandPermission)).thenReturn(true); + + assertThat(bukkitDevCommandStub.hasPermissionToExecuteCommand()).isTrue(); + + verify(bukkitCommandDataMock, times(2)).getPermission(); + verify(commandSenderMock, times(1)).hasPermission(commandPermission); - commandHandler.registerCommand(integration, bukkitCommand); + } + + @Test + @DisplayName("Test the hasPermissionToExecuteCommand method when player DOES NOT HAVE permission.") + void hasPermissionToExecuteCommand_noPermission() { - try { - commandHandler.executeCommandByAlias(integration, "test", commandSender); - } catch (ArgumentsConfigException e) { - // Ignored exception - } + String commandPermission = "commands.no_annotation_test"; - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasPermission); + when(bukkitCommandDataMock.getPermission()).thenReturn(commandPermission); + when(commandSenderMock.hasPermission(commandPermission)).thenReturn(false); + + assertThat(bukkitDevCommandStub.hasPermissionToExecuteCommand()).isFalse(); + + verify(bukkitCommandDataMock, times(2)).getPermission(); + verify(commandSenderMock, times(1)).hasPermission(commandPermission); } @Test - void hasPermissionToExecuteCommand_NotConfiguredException() { + @DisplayName("Test the behaviour when the method is called when the permission is null a.k.a. not defined.") + void hasPermissionToExecuteCommand_withUndefinedPermission() { - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .build(); + when(bukkitCommandDataMock.getPermission()).thenReturn(null); - commandHandler.registerCommand(integration, bukkitCommand); + assertThrows(PermissionConfigException.class, () -> bukkitDevCommandStub.hasPermissionToExecuteCommand(), + String.format("Unable to find the permission for the command %s. Have you configured any permission at all?", bukkitCommandDataMock.getName())); - assertThrows(PermissionConfigException.class, - () -> commandHandler.executeCommandByAlias(integration, "test", commandSender), - String.format("Unable to find the permission for the command %s. Have you configured any permission at all?", bukkitCommand.getName())); + verify(bukkitCommandDataMock, times(1)).getPermission(); + verify(commandSenderMock, never()).hasPermission(anyString()); } @Test + @DisplayName("Test command mandatory arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Mandatory() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(IntegerArgument.class, DoubleArgument.class, StringArgument.class, BooleanArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"1", "hey"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "1", "22.222", "hey", "true"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[]{IntegerArgument.class, StringArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } @Test + @DisplayName("Test invalid mandatory arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Mandatory_InvalidArguments() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(IntegerArgument.class, DoubleArgument.class, StringArgument.class, BooleanArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"1", "notADouble"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "Hello!", ".22aa", "Valid!", "ash"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[]{IntegerArgument.class, DoubleArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertFalse(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + // Fails cause second argument is not a double. + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); + + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[]{DoubleArgument.class, StringArgument.class}); + + // Fails cause the first argument is an Integer, not a Double. + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); } @Test + @DisplayName("Test validation for optional arguments.") + @SuppressWarnings("unchecked") void hasValidArgs_Optional() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withOptionalArguments(IntegerArgument.class, DoubleArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"Some String"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "1"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[0]); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[]{StringArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } @Test + @DisplayName("Test invalid optional arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Optional_InvalidArguments() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withOptionalArguments(IntegerArgument.class, DoubleArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"notAInteger"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; + + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[0]); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {IntegerArgument.class}); - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "Hey", ".22"); + // Fails cause the optional argument (first argument) is not an Integer - is a String + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertFalse(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[0]); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {BooleanArgument.class}); + + // Fails cause the optional argument (first argument) is not a Boolean - is a String + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); } @Test + @DisplayName("Test mandatory AND optional arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Mandatory_And_Optional() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(BooleanArgument.class) - .withOptionalArguments(IntegerArgument.class, DoubleArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"1","mandatoryArgument","1.2"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "True", "22"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {IntegerArgument.class, StringArgument.class}); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {DoubleArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } @Test + @DisplayName("Test invalid mandatory AND optional arguments validation.") + @SuppressWarnings("unchecked") void hasValidArgs_Mandatory_And_Optional_Invalid() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(BooleanArgument.class) - .withOptionalArguments(IntegerArgument.class, DoubleArgument.class) - .build(); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, new String[] {"1","true","1.2"}) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; + + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {IntegerArgument.class, BooleanArgument.class}); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {BooleanArgument.class}); - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "true", "Boa tarde", ".22"); + // Fails cause although the mandatory arguments are valid the optional arguments are not valid. + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertFalse(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {DoubleArgument.class, IntegerArgument.class}); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {BooleanArgument.class}); + + // Fails cause although the optional arguments are valid the mandatory arguments are not valid + assertThat(bukkitDevCommandStub.hasValidArgs()).isFalse(); } @Test + @DisplayName("Test argument validation for unconventional arguments.") + @SuppressWarnings("unchecked") void hasValidArgs_WeirdArguments() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .withMandatoryArguments(IntegerArgument.class, DoubleArgument.class, StringArgument.class, BooleanArgument.class) - .build(); + String[] arguments = new String[] {"-78","yes",".22", "-0.44"}; + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, arguments) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); - commandHandler.executeCommandByAlias(integration, "test", commandSender, "-78", ".222", "20", "yes"); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {IntegerArgument.class, BooleanArgument.class, DoubleArgument.class, DoubleArgument.class}); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.called); - assertTrue(NoAnnotationArgumentTestCommandDevCommand.hasValidArgs); + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } @Test - void hasValidArgs_Mandatory_And_Optional_Annotation() { + @DisplayName("Test argument validation without optional args.") + @SuppressWarnings("unchecked") + void hasValidArgs_OptionalArgs() { - commandHandler.initCommandsAutoConfiguration(integration); - commandHandler.executeCommandByAlias(integration, "test_arg", commandSender, "22"); + String[] arguments = new String[] {"-78","yes"}; + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, arguments) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - assertTrue(ArgumentDevCommandTestCommand.called); - assertTrue(ArgumentDevCommandTestCommand.hasValidArgs); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(new Class[] {IntegerArgument.class, BooleanArgument.class}); + // Request validation for optional argument - not present in this case + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(new Class[] {StringArgument.class}); - } - - @Test - void hasValidArgs_Mandatory_And_Optional_Annotation_Invalid() { - - commandHandler.initCommandsAutoConfiguration(integration); - commandHandler.executeCommandByAlias(integration, "test_arg", commandSender, "true"); - - assertTrue(ArgumentDevCommandTestCommand.called); - assertFalse(ArgumentDevCommandTestCommand.hasValidArgs); + // The argument validation passes cause the argument missing is optional + assertThat(bukkitDevCommandStub.hasValidArgs()).isTrue(); } + @Test + @DisplayName("Test for call of argument validation without configuration.") void argumentsConfigExceptionTest() { - String commandPermission = "commands.no_annotation_test"; - BukkitCommandData bukkitCommand = new BukkitCommandDataBuilder("test", integration, NoAnnotationArgumentTestCommandDevCommand.class) - .withPermission(commandPermission) - .build(); + String[] arguments = new String[] {"-78","yes",".22", "-0.44"}; + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, commandSenderMock, arguments) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; - commandHandler.registerCommand(integration, bukkitCommand); + when(bukkitCommandDataMock.getMandatoryArguments()).thenReturn(null); + when(bukkitCommandDataMock.getOptionalArguments()).thenReturn(null); assertThrows(ArgumentsConfigException.class, - () -> commandHandler.executeCommandByAlias(integration, "test", commandSender), - String.format("Unable to find arguments configuration for the command %s. Have you added configured any arguments for the command?", bukkitCommand.getName())); + () -> bukkitDevCommandStub.hasValidArgs(), + String.format("Unable to find arguments configuration for the command %s. Have you added configured any arguments for the command?", bukkitCommandDataMock.getName())); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java index 6a42395..489a470 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java @@ -7,7 +7,7 @@ import me.hgsoft.minecraft.devcommand.factories.CommandFactory; import me.hgsoft.minecraft.devcommand.factories.IObjectFactory; import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; +import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,7 +27,7 @@ class CommandFactoryTest { @BeforeEach void setUp() { bukkitCommandFactory = new CommandFactory(null, "good", "afternoon"); - bukkitCommand = new BukkitCommandDataBuilder("test", integrationMock, TestCommandDevCommand.class) + bukkitCommand = new BukkitCommandDataBuilder("test", integrationMock, TestCommand.class) .withName("Test Command") .withDescription("Bukkit Test Command") .build(); @@ -36,7 +36,7 @@ void setUp() { @Test void generateExecutorForBukkitCommand() { IDevCommand generatedBukkitCommandExecutor = bukkitCommandFactory.generate(bukkitCommand); - Assertions.assertTrue(generatedBukkitCommandExecutor instanceof TestCommandDevCommand); + Assertions.assertTrue(generatedBukkitCommandExecutor instanceof TestCommand); } } \ No newline at end of file diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java index 4b7be81..4d5867c 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java @@ -1,53 +1,51 @@ package me.hgsoft.minecraft.devcommand.registry; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.TestCommandDevCommand; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import java.util.List; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.spy; + +@ExtendWith(MockitoExtension.class) class CommandRegistryTest { - private BukkitCommandData bukkitCommand; - private CommandRegistry commandRegistry; + @Mock private Integration integrationStub; - - @BeforeEach - void setUp() { - integrationStub = new Integration("myIntegration", null); - commandRegistry = new CommandRegistry(); - bukkitCommand = new BukkitCommandDataBuilder("test", integrationStub, TestCommandDevCommand.class).build(); - } - - @AfterEach - void tearDown() { - commandRegistry.setValues(integrationStub, null); - } + @Mock + private BukkitCommandData bukkitCommand; @Test void add() { - Assertions.assertNull(commandRegistry.getValues(integrationStub)); + CommandRegistry commandRegistry = spy(CommandRegistry.class); + + assertNull(commandRegistry.getValues(integrationStub)); commandRegistry.add(integrationStub, bukkitCommand); - Assertions.assertNotNull(commandRegistry.getValues(integrationStub)); - Assertions.assertEquals(1, commandRegistry.getValues(integrationStub).size()); - Assertions.assertEquals(bukkitCommand, commandRegistry.getValues(integrationStub).get(0)); + assertNotNull(commandRegistry.getValues(integrationStub)); + assertEquals(1, commandRegistry.getValues(integrationStub).size()); + assertEquals(bukkitCommand, commandRegistry.getValues(integrationStub).get(0)); } @Test void remove() { + CommandRegistry commandRegistry = spy(CommandRegistry.class); + commandRegistry.setValues(integrationStub, List.of(bukkitCommand)); - Assertions.assertNotNull(commandRegistry.getValues(integrationStub)); - Assertions.assertEquals(1, commandRegistry.getValues(integrationStub).size()); - Assertions.assertEquals(bukkitCommand, commandRegistry.getValues(integrationStub).get(0)); + assertNotNull(commandRegistry.getValues(integrationStub)); + assertEquals(1, commandRegistry.getValues(integrationStub).size()); + assertEquals(bukkitCommand, commandRegistry.getValues(integrationStub).get(0)); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java new file mode 100644 index 0000000..81ae787 --- /dev/null +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java @@ -0,0 +1,32 @@ +package me.hgsoft.minecraft.devcommand.utils.test_classes.invalid; + +import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; +import me.hgsoft.minecraft.devcommand.annotations.Command; +import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; +import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; +import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import org.bukkit.command.CommandSender; + +@Command(alias = "test", description = "Bukkit Test Command!", permission = "command.bukkit_test") +@ArgsValidation(argsTypes = {IntegerArgument.class}) +public class TestCommandCopy extends BukkitDevCommand { + + public static boolean called; + public static BukkitCommandData command; + public static CommandSender sender; + public static String[] args; + + public TestCommandCopy(BukkitCommandData command, CommandSender commandSender, String[] args) { + super(command, commandSender, args); + } + + @Override + public void execute() { + System.out.println("Bukkit Test Command executed!"); + called = true; + command = this.getCommandData(); + sender = getCommandSender(); + args = getArgs(); + } + +} diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/ArgumentDevCommandTestCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java similarity index 79% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/ArgumentDevCommandTestCommand.java rename to src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java index bf4c205..bcea161 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/ArgumentDevCommandTestCommand.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.utils.arguments; +package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; import me.hgsoft.minecraft.devcommand.annotations.Command; @@ -9,13 +9,13 @@ @Command(alias = "test_arg", description = "Argument Test Command!", permission = "command.bukkit_test") @ArgsValidation(argsTypes = {IntegerArgument.class}) -public class ArgumentDevCommandTestCommand extends BukkitDevCommand { +public class ArgumentTestCommand extends BukkitDevCommand { public static boolean called; public static boolean hasPermission; public static boolean hasValidArgs; - public ArgumentDevCommandTestCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { + public ArgumentTestCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { super(command, commandSender, args); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/InvalidTestCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java similarity index 66% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/InvalidTestCommand.java rename to src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java index c39e05e..4159fab 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/InvalidTestCommand.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.utils; +package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; import me.hgsoft.minecraft.devcommand.annotations.Command; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/NoAnnotationArgumentTestCommandDevCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java similarity index 69% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/NoAnnotationArgumentTestCommandDevCommand.java rename to src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java index f3e5108..2794398 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/arguments/NoAnnotationArgumentTestCommandDevCommand.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java @@ -1,16 +1,16 @@ -package me.hgsoft.minecraft.devcommand.utils.arguments; +package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; import org.bukkit.command.CommandSender; -public class NoAnnotationArgumentTestCommandDevCommand extends BukkitDevCommand { +public class NoAnnotationTestCommand extends BukkitDevCommand { public static boolean called; public static boolean hasPermission; public static boolean hasValidArgs; - public NoAnnotationArgumentTestCommandDevCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { + public NoAnnotationTestCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { super(command, commandSender, args); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/TestCommandDevCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java similarity index 81% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/TestCommandDevCommand.java rename to src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java index f76f668..6637900 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/TestCommandDevCommand.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.utils; +package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; import me.hgsoft.minecraft.devcommand.annotations.Command; @@ -9,14 +9,14 @@ @Command(alias = "test", description = "Bukkit Test Command!", permission = "command.bukkit_test") @ArgsValidation(argsTypes = {IntegerArgument.class}) -public class TestCommandDevCommand extends BukkitDevCommand { +public class TestCommand extends BukkitDevCommand { public static boolean called; public static BukkitCommandData command; public static CommandSender sender; public static String[] args; - public TestCommandDevCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { + public TestCommand(BukkitCommandData command, CommandSender commandSender, String[] args) { super(command, commandSender, args); } From 7f6620c829669cdb0334bd1f9215e51fdd18abab Mon Sep 17 00:00:00 2001 From: Hugo1307 Date: Sat, 1 Apr 2023 20:41:24 +0100 Subject: [PATCH 07/19] Feat: Added distribution management in POM. --- pom.xml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pom.xml b/pom.xml index e058927..aa79ffe 100644 --- a/pom.xml +++ b/pom.xml @@ -126,4 +126,13 @@ + + + github + GitHub Packages + https://maven.pkg.github.com/Hugo1307/DevCommand + + + + \ No newline at end of file From 7d0a0ac2d71097b5aa09d95d6d44c74df632d2d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Thu, 24 Aug 2023 11:24:21 +0100 Subject: [PATCH 08/19] Fix: Fixed dependency injection issue. --- .../devcommand/registry/dependencies/DependencyRegistry.java | 3 +-- .../minecraft/devcommand/executors/BukkitDevCommandTest.java | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java b/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java index 783e5fe..0a2c22d 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java +++ b/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java @@ -4,7 +4,6 @@ import me.hgsoft.minecraft.devcommand.integration.Integration; import me.hgsoft.minecraft.devcommand.registry.IRegistry; -import javax.annotation.Nullable; import java.util.*; @Singleton @@ -12,7 +11,7 @@ public class DependencyRegistry implements IRegistry { private final Map> registeredDependencies; - private DependencyRegistry() { + public DependencyRegistry() { this.registeredDependencies = new HashMap<>(); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java index 3ed22e6..6593f97 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java +++ b/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java @@ -47,7 +47,7 @@ void hasPermissionToExecuteCommand() { String commandPermission = "commands.no_annotation_test"; when(bukkitCommandDataMock.getPermission()).thenReturn(commandPermission); - when(commandSenderMock.hasPermission(commandPermission)).thenReturn(true); + when(commandSenderMock.hasPermission(commandPermission)).thenReturn(Boolean.TRUE); assertThat(bukkitDevCommandStub.hasPermissionToExecuteCommand()).isTrue(); @@ -63,7 +63,7 @@ void hasPermissionToExecuteCommand_noPermission() { String commandPermission = "commands.no_annotation_test"; when(bukkitCommandDataMock.getPermission()).thenReturn(commandPermission); - when(commandSenderMock.hasPermission(commandPermission)).thenReturn(false); + when(commandSenderMock.hasPermission(commandPermission)).thenReturn(Boolean.FALSE); assertThat(bukkitDevCommandStub.hasPermissionToExecuteCommand()).isFalse(); From 42b21259a63e7ffa5a31e90ea570675ac1014159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Thu, 24 Aug 2023 12:44:47 +0100 Subject: [PATCH 09/19] Refactor: Changed project's group id. --- pom.xml | 4 +-- .../minecraft/dev_command}/DevCommand.java | 8 +++--- .../annotations/ArgsValidation.java | 4 +-- .../dev_command}/annotations/Command.java | 2 +- .../annotations/Dependencies.java | 2 +- .../commands/BukkitDevCommand.java | 20 +++++++------- .../dev_command}/commands/IDevCommand.java | 2 +- .../builder/BukkitCommandDataBuilder.java | 10 +++---- .../commands/builder/ICommandBuilder.java | 4 +-- .../commands/data/AbstractCommandData.java | 6 ++--- .../commands/data/BukkitCommandData.java | 8 +++--- .../executors/DevCommandExecutor.java | 8 +++--- .../commands/handler/CommandHandler.java | 21 +++++++-------- .../dependencies/DependencyHandler.java | 6 ++--- .../discovery/CommandDiscoveryService.java | 20 +++++++------- .../exceptions/ArgumentsConfigException.java | 2 +- .../AutoConfigurationException.java | 2 +- .../InvalidIntegrationException.java | 2 +- .../exceptions/PermissionConfigException.java | 2 +- .../factories/ArgumentFactory.java | 4 +-- .../factories/CommandFactory.java | 8 +++--- .../factories/IObjectFactory.java | 2 +- .../injection/GuiceBinderModule.java | 2 +- .../dev_command}/integration/Integration.java | 2 +- .../dev_command}/registry/IRegistry.java | 2 +- .../registry/commands/CommandRegistry.java | 8 +++--- .../dependencies/DependencyRegistry.java | 6 ++--- .../validators/BooleanArgument.java | 2 +- .../validators/CommandArgument.java | 2 +- .../validators/DoubleArgument.java | 2 +- .../validators/ICommandArgument.java | 2 +- .../validators/IntegerArgument.java | 2 +- .../validators/StringArgument.java | 2 +- .../dev_command}/IntegrationTestIT.java | 21 ++++++++------- .../commands/CommandHandlerTest.java | 26 +++++++++---------- .../dependencies/DependencyHandlerTest.java | 2 +- .../CommandDiscoveryServiceTest.java | 22 ++++++++-------- .../executors/BukkitDevCommandTest.java | 20 +++++++------- .../factory/CommandFactoryTest.java | 18 ++++++------- .../registry/CommandRegistryTest.java | 8 +++--- .../test_classes/invalid/TestCommandCopy.java | 12 ++++----- .../valid/ArgumentTestCommand.java | 12 ++++----- .../valid/InvalidTestCommand.java | 7 +++++ .../valid/NoAnnotationTestCommand.java | 6 ++--- .../utils/test_classes/valid/TestCommand.java | 12 ++++----- .../valid/InvalidTestCommand.java | 7 ----- 46 files changed, 176 insertions(+), 176 deletions(-) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/DevCommand.java (76%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/annotations/ArgsValidation.java (74%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/annotations/Command.java (86%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/annotations/Dependencies.java (84%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/BukkitDevCommand.java (85%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/IDevCommand.java (79%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/builder/BukkitCommandDataBuilder.java (88%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/builder/ICommandBuilder.java (68%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/data/AbstractCommandData.java (72%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/data/BukkitCommandData.java (79%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/executors/DevCommandExecutor.java (86%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/handler/CommandHandler.java (78%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/dependencies/DependencyHandler.java (85%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/discovery/CommandDiscoveryService.java (88%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/exceptions/ArgumentsConfigException.java (75%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/exceptions/AutoConfigurationException.java (75%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/exceptions/InvalidIntegrationException.java (75%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/exceptions/PermissionConfigException.java (75%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/factories/ArgumentFactory.java (86%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/factories/CommandFactory.java (83%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/factories/IObjectFactory.java (57%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/injection/GuiceBinderModule.java (87%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/integration/Integration.java (97%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/registry/IRegistry.java (79%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/registry/commands/CommandRegistry.java (80%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/registry/dependencies/DependencyRegistry.java (84%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/validators/BooleanArgument.java (95%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/validators/CommandArgument.java (85%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/validators/DoubleArgument.java (90%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/validators/ICommandArgument.java (61%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/validators/IntegerArgument.java (90%) rename src/main/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/validators/StringArgument.java (88%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/IntegrationTestIT.java (77%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/commands/CommandHandlerTest.java (85%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/dependencies/DependencyHandlerTest.java (80%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/discovery/CommandDiscoveryServiceTest.java (90%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/executors/BukkitDevCommandTest.java (94%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/factory/CommandFactoryTest.java (63%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/registry/CommandRegistryTest.java (83%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/utils/test_classes/invalid/TestCommandCopy.java (66%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/utils/test_classes/valid/ArgumentTestCommand.java (66%) create mode 100644 src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/InvalidTestCommand.java rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/utils/test_classes/valid/NoAnnotationTestCommand.java (75%) rename src/test/java/{me/hgsoft/minecraft/devcommand => dev/hugog/minecraft/dev_command}/utils/test_classes/valid/TestCommand.java (66%) delete mode 100644 src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java diff --git a/pom.xml b/pom.xml index aa79ffe..ba69727 100644 --- a/pom.xml +++ b/pom.xml @@ -4,8 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - me.hgsoft.minecraft.devcommand - DevCommand + dev.hugog.minecraft + dev-command 0.0.2-SNAPSHOT diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/DevCommand.java similarity index 76% rename from src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java rename to src/main/java/dev/hugog/minecraft/dev_command/DevCommand.java index 00e5f3e..f9b9776 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/DevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/DevCommand.java @@ -1,11 +1,11 @@ -package me.hgsoft.minecraft.devcommand; +package dev.hugog.minecraft.dev_command; import com.google.inject.Inject; import com.google.inject.Injector; import lombok.Getter; -import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; -import me.hgsoft.minecraft.devcommand.dependencies.DependencyHandler; -import me.hgsoft.minecraft.devcommand.injection.GuiceBinderModule; +import dev.hugog.minecraft.dev_command.commands.handler.CommandHandler; +import dev.hugog.minecraft.dev_command.dependencies.DependencyHandler; +import dev.hugog.minecraft.dev_command.injection.GuiceBinderModule; @Getter public final class DevCommand { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/annotations/ArgsValidation.java b/src/main/java/dev/hugog/minecraft/dev_command/annotations/ArgsValidation.java similarity index 74% rename from src/main/java/me/hgsoft/minecraft/devcommand/annotations/ArgsValidation.java rename to src/main/java/dev/hugog/minecraft/dev_command/annotations/ArgsValidation.java index 117d689..078b78d 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/annotations/ArgsValidation.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/annotations/ArgsValidation.java @@ -1,6 +1,6 @@ -package me.hgsoft.minecraft.devcommand.annotations; +package dev.hugog.minecraft.dev_command.annotations; -import me.hgsoft.minecraft.devcommand.validators.CommandArgument; +import dev.hugog.minecraft.dev_command.validators.CommandArgument; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/annotations/Command.java b/src/main/java/dev/hugog/minecraft/dev_command/annotations/Command.java similarity index 86% rename from src/main/java/me/hgsoft/minecraft/devcommand/annotations/Command.java rename to src/main/java/dev/hugog/minecraft/dev_command/annotations/Command.java index 1964fb8..080064f 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/annotations/Command.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/annotations/Command.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.annotations; +package dev.hugog.minecraft.dev_command.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/annotations/Dependencies.java b/src/main/java/dev/hugog/minecraft/dev_command/annotations/Dependencies.java similarity index 84% rename from src/main/java/me/hgsoft/minecraft/devcommand/annotations/Dependencies.java rename to src/main/java/dev/hugog/minecraft/dev_command/annotations/Dependencies.java index 24f1a34..ec40292 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/annotations/Dependencies.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/annotations/Dependencies.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.annotations; +package dev.hugog.minecraft.dev_command.annotations; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java similarity index 85% rename from src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java rename to src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java index c3f604f..4f5f7d7 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/BukkitDevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java @@ -1,16 +1,16 @@ -package me.hgsoft.minecraft.devcommand.commands; +package dev.hugog.minecraft.dev_command.commands; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; import lombok.Generated; import lombok.Getter; -import me.hgsoft.minecraft.devcommand.DevCommand; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.dependencies.DependencyHandler; -import me.hgsoft.minecraft.devcommand.exceptions.ArgumentsConfigException; -import me.hgsoft.minecraft.devcommand.exceptions.PermissionConfigException; -import me.hgsoft.minecraft.devcommand.factories.ArgumentFactory; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.validators.CommandArgument; -import me.hgsoft.minecraft.devcommand.validators.ICommandArgument; +import dev.hugog.minecraft.dev_command.DevCommand; +import dev.hugog.minecraft.dev_command.dependencies.DependencyHandler; +import dev.hugog.minecraft.dev_command.exceptions.ArgumentsConfigException; +import dev.hugog.minecraft.dev_command.exceptions.PermissionConfigException; +import dev.hugog.minecraft.dev_command.factories.ArgumentFactory; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.validators.CommandArgument; +import dev.hugog.minecraft.dev_command.validators.ICommandArgument; import org.bukkit.command.CommandSender; import java.util.Arrays; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/IDevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java similarity index 79% rename from src/main/java/me/hgsoft/minecraft/devcommand/commands/IDevCommand.java rename to src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java index fabea92..fa6c304 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/IDevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.commands; +package dev.hugog.minecraft.dev_command.commands; import java.util.List; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/builder/BukkitCommandDataBuilder.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/builder/BukkitCommandDataBuilder.java similarity index 88% rename from src/main/java/me/hgsoft/minecraft/devcommand/commands/builder/BukkitCommandDataBuilder.java rename to src/main/java/dev/hugog/minecraft/dev_command/commands/builder/BukkitCommandDataBuilder.java index f2b7555..b431e37 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/builder/BukkitCommandDataBuilder.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/builder/BukkitCommandDataBuilder.java @@ -1,9 +1,9 @@ -package me.hgsoft.minecraft.devcommand.commands.builder; +package dev.hugog.minecraft.dev_command.commands.builder; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.IDevCommand; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.validators.CommandArgument; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.validators.CommandArgument; public class BukkitCommandDataBuilder implements ICommandBuilder { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/builder/ICommandBuilder.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/builder/ICommandBuilder.java similarity index 68% rename from src/main/java/me/hgsoft/minecraft/devcommand/commands/builder/ICommandBuilder.java rename to src/main/java/dev/hugog/minecraft/dev_command/commands/builder/ICommandBuilder.java index 103c354..6c8f51d 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/builder/ICommandBuilder.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/builder/ICommandBuilder.java @@ -1,6 +1,6 @@ -package me.hgsoft.minecraft.devcommand.commands.builder; +package dev.hugog.minecraft.dev_command.commands.builder; -import me.hgsoft.minecraft.devcommand.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.commands.IDevCommand; public interface ICommandBuilder, C> { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/data/AbstractCommandData.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/data/AbstractCommandData.java similarity index 72% rename from src/main/java/me/hgsoft/minecraft/devcommand/commands/data/AbstractCommandData.java rename to src/main/java/dev/hugog/minecraft/dev_command/commands/data/AbstractCommandData.java index a2d71ca..541766c 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/data/AbstractCommandData.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/data/AbstractCommandData.java @@ -1,11 +1,11 @@ -package me.hgsoft.minecraft.devcommand.commands.data; +package dev.hugog.minecraft.dev_command.commands.data; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; -import me.hgsoft.minecraft.devcommand.commands.IDevCommand; -import me.hgsoft.minecraft.devcommand.integration.Integration; +import dev.hugog.minecraft.dev_command.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.integration.Integration; @Getter @RequiredArgsConstructor diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/data/BukkitCommandData.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/data/BukkitCommandData.java similarity index 79% rename from src/main/java/me/hgsoft/minecraft/devcommand/commands/data/BukkitCommandData.java rename to src/main/java/dev/hugog/minecraft/dev_command/commands/data/BukkitCommandData.java index 7d49096..9488e0e 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/data/BukkitCommandData.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/data/BukkitCommandData.java @@ -1,11 +1,11 @@ -package me.hgsoft.minecraft.devcommand.commands.data; +package dev.hugog.minecraft.dev_command.commands.data; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; -import me.hgsoft.minecraft.devcommand.commands.IDevCommand; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.validators.CommandArgument; +import dev.hugog.minecraft.dev_command.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.validators.CommandArgument; @Getter @ToString(callSuper = true) diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/executors/DevCommandExecutor.java similarity index 86% rename from src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java rename to src/main/java/dev/hugog/minecraft/dev_command/commands/executors/DevCommandExecutor.java index 926cf96..655b8c3 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/executors/DevCommandExecutor.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/executors/DevCommandExecutor.java @@ -1,9 +1,9 @@ -package me.hgsoft.minecraft.devcommand.commands.executors; +package dev.hugog.minecraft.dev_command.commands.executors; +import dev.hugog.minecraft.dev_command.DevCommand; +import dev.hugog.minecraft.dev_command.commands.handler.CommandHandler; +import dev.hugog.minecraft.dev_command.integration.Integration; import lombok.NonNull; -import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; -import me.hgsoft.minecraft.devcommand.DevCommand; -import me.hgsoft.minecraft.devcommand.integration.Integration; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java similarity index 78% rename from src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java rename to src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java index 4fac08c..42e005f 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/commands/handler/CommandHandler.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java @@ -1,20 +1,19 @@ -package me.hgsoft.minecraft.devcommand.commands.handler; +package dev.hugog.minecraft.dev_command.commands.handler; import com.google.inject.Inject; +import dev.hugog.minecraft.dev_command.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.commands.data.AbstractCommandData; import lombok.NonNull; import lombok.extern.log4j.Log4j2; -import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; -import me.hgsoft.minecraft.devcommand.discovery.CommandDiscoveryService; -import me.hgsoft.minecraft.devcommand.exceptions.AutoConfigurationException; -import me.hgsoft.minecraft.devcommand.exceptions.InvalidIntegrationException; -import me.hgsoft.minecraft.devcommand.commands.IDevCommand; -import me.hgsoft.minecraft.devcommand.factories.IObjectFactory; -import me.hgsoft.minecraft.devcommand.factories.CommandFactory; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; +import dev.hugog.minecraft.dev_command.discovery.CommandDiscoveryService; +import dev.hugog.minecraft.dev_command.exceptions.AutoConfigurationException; +import dev.hugog.minecraft.dev_command.exceptions.InvalidIntegrationException; +import dev.hugog.minecraft.dev_command.factories.IObjectFactory; +import dev.hugog.minecraft.dev_command.factories.CommandFactory; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.registry.commands.CommandRegistry; import java.util.*; -import java.util.stream.Collectors; @Log4j2 public class CommandHandler { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java b/src/main/java/dev/hugog/minecraft/dev_command/dependencies/DependencyHandler.java similarity index 85% rename from src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java rename to src/main/java/dev/hugog/minecraft/dev_command/dependencies/DependencyHandler.java index 9ad869b..c1ef99c 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandler.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/dependencies/DependencyHandler.java @@ -1,9 +1,9 @@ -package me.hgsoft.minecraft.devcommand.dependencies; +package dev.hugog.minecraft.dev_command.dependencies; import com.google.inject.Inject; import com.google.inject.Singleton; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.dependencies.DependencyRegistry; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.registry.dependencies.DependencyRegistry; import java.util.Arrays; import java.util.List; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java b/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java similarity index 88% rename from src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java rename to src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java index 0ff0e18..4f18f1a 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryService.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java @@ -1,14 +1,14 @@ -package me.hgsoft.minecraft.devcommand.discovery; - +package dev.hugog.minecraft.dev_command.discovery; + +import dev.hugog.minecraft.dev_command.annotations.ArgsValidation; +import dev.hugog.minecraft.dev_command.annotations.Command; +import dev.hugog.minecraft.dev_command.annotations.Dependencies; +import dev.hugog.minecraft.dev_command.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.commands.builder.BukkitCommandDataBuilder; +import dev.hugog.minecraft.dev_command.commands.data.AbstractCommandData; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.validators.CommandArgument; import lombok.Getter; -import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; -import me.hgsoft.minecraft.devcommand.annotations.Command; -import me.hgsoft.minecraft.devcommand.annotations.Dependencies; -import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; -import me.hgsoft.minecraft.devcommand.commands.IDevCommand; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.validators.CommandArgument; import org.reflections.Reflections; import java.util.List; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/exceptions/ArgumentsConfigException.java b/src/main/java/dev/hugog/minecraft/dev_command/exceptions/ArgumentsConfigException.java similarity index 75% rename from src/main/java/me/hgsoft/minecraft/devcommand/exceptions/ArgumentsConfigException.java rename to src/main/java/dev/hugog/minecraft/dev_command/exceptions/ArgumentsConfigException.java index d353cc1..aa47227 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/exceptions/ArgumentsConfigException.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/exceptions/ArgumentsConfigException.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.exceptions; +package dev.hugog.minecraft.dev_command.exceptions; public class ArgumentsConfigException extends RuntimeException { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/exceptions/AutoConfigurationException.java b/src/main/java/dev/hugog/minecraft/dev_command/exceptions/AutoConfigurationException.java similarity index 75% rename from src/main/java/me/hgsoft/minecraft/devcommand/exceptions/AutoConfigurationException.java rename to src/main/java/dev/hugog/minecraft/dev_command/exceptions/AutoConfigurationException.java index 88cdc52..3b8a3e4 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/exceptions/AutoConfigurationException.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/exceptions/AutoConfigurationException.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.exceptions; +package dev.hugog.minecraft.dev_command.exceptions; public class AutoConfigurationException extends RuntimeException { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/exceptions/InvalidIntegrationException.java b/src/main/java/dev/hugog/minecraft/dev_command/exceptions/InvalidIntegrationException.java similarity index 75% rename from src/main/java/me/hgsoft/minecraft/devcommand/exceptions/InvalidIntegrationException.java rename to src/main/java/dev/hugog/minecraft/dev_command/exceptions/InvalidIntegrationException.java index 789cd44..f98aeee 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/exceptions/InvalidIntegrationException.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/exceptions/InvalidIntegrationException.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.exceptions; +package dev.hugog.minecraft.dev_command.exceptions; public class InvalidIntegrationException extends RuntimeException { public InvalidIntegrationException(String message) { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/exceptions/PermissionConfigException.java b/src/main/java/dev/hugog/minecraft/dev_command/exceptions/PermissionConfigException.java similarity index 75% rename from src/main/java/me/hgsoft/minecraft/devcommand/exceptions/PermissionConfigException.java rename to src/main/java/dev/hugog/minecraft/dev_command/exceptions/PermissionConfigException.java index 262aab0..636e38a 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/exceptions/PermissionConfigException.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/exceptions/PermissionConfigException.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.exceptions; +package dev.hugog.minecraft.dev_command.exceptions; public class PermissionConfigException extends RuntimeException { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/factories/ArgumentFactory.java b/src/main/java/dev/hugog/minecraft/dev_command/factories/ArgumentFactory.java similarity index 86% rename from src/main/java/me/hgsoft/minecraft/devcommand/factories/ArgumentFactory.java rename to src/main/java/dev/hugog/minecraft/dev_command/factories/ArgumentFactory.java index 2319975..1e3eae2 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/factories/ArgumentFactory.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/factories/ArgumentFactory.java @@ -1,6 +1,6 @@ -package me.hgsoft.minecraft.devcommand.factories; +package dev.hugog.minecraft.dev_command.factories; -import me.hgsoft.minecraft.devcommand.validators.ICommandArgument; +import dev.hugog.minecraft.dev_command.validators.ICommandArgument; import java.lang.reflect.Constructor; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/factories/CommandFactory.java b/src/main/java/dev/hugog/minecraft/dev_command/factories/CommandFactory.java similarity index 83% rename from src/main/java/me/hgsoft/minecraft/devcommand/factories/CommandFactory.java rename to src/main/java/dev/hugog/minecraft/dev_command/factories/CommandFactory.java index a9a459f..f5e8b8d 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/factories/CommandFactory.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/factories/CommandFactory.java @@ -1,8 +1,8 @@ -package me.hgsoft.minecraft.devcommand.factories; +package dev.hugog.minecraft.dev_command.factories; -import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.commands.data.AbstractCommandData; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; import org.bukkit.command.CommandSender; import java.lang.reflect.Constructor; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/factories/IObjectFactory.java b/src/main/java/dev/hugog/minecraft/dev_command/factories/IObjectFactory.java similarity index 57% rename from src/main/java/me/hgsoft/minecraft/devcommand/factories/IObjectFactory.java rename to src/main/java/dev/hugog/minecraft/dev_command/factories/IObjectFactory.java index 5bfbcf7..803d4d8 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/factories/IObjectFactory.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/factories/IObjectFactory.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.factories; +package dev.hugog.minecraft.dev_command.factories; public interface IObjectFactory { T generate(C command); diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java b/src/main/java/dev/hugog/minecraft/dev_command/injection/GuiceBinderModule.java similarity index 87% rename from src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java rename to src/main/java/dev/hugog/minecraft/dev_command/injection/GuiceBinderModule.java index 8abbcf3..daee060 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/injection/GuiceBinderModule.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/injection/GuiceBinderModule.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.injection; +package dev.hugog.minecraft.dev_command.injection; import com.google.inject.AbstractModule; import com.google.inject.Guice; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java b/src/main/java/dev/hugog/minecraft/dev_command/integration/Integration.java similarity index 97% rename from src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java rename to src/main/java/dev/hugog/minecraft/dev_command/integration/Integration.java index 4894b3a..7c28bd6 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/integration/Integration.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/integration/Integration.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.integration; +package dev.hugog.minecraft.dev_command.integration; import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/IRegistry.java b/src/main/java/dev/hugog/minecraft/dev_command/registry/IRegistry.java similarity index 79% rename from src/main/java/me/hgsoft/minecraft/devcommand/registry/IRegistry.java rename to src/main/java/dev/hugog/minecraft/dev_command/registry/IRegistry.java index c300c28..2416f2c 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/IRegistry.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/registry/IRegistry.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.registry; +package dev.hugog.minecraft.dev_command.registry; import java.util.List; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java b/src/main/java/dev/hugog/minecraft/dev_command/registry/commands/CommandRegistry.java similarity index 80% rename from src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java rename to src/main/java/dev/hugog/minecraft/dev_command/registry/commands/CommandRegistry.java index 21188a1..67cbc69 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/commands/CommandRegistry.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/registry/commands/CommandRegistry.java @@ -1,9 +1,9 @@ -package me.hgsoft.minecraft.devcommand.registry.commands; +package dev.hugog.minecraft.dev_command.registry.commands; import com.google.inject.Singleton; -import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.IRegistry; +import dev.hugog.minecraft.dev_command.commands.data.AbstractCommandData; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.registry.IRegistry; import java.util.*; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java b/src/main/java/dev/hugog/minecraft/dev_command/registry/dependencies/DependencyRegistry.java similarity index 84% rename from src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java rename to src/main/java/dev/hugog/minecraft/dev_command/registry/dependencies/DependencyRegistry.java index 0a2c22d..eb7e91d 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/registry/dependencies/DependencyRegistry.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/registry/dependencies/DependencyRegistry.java @@ -1,8 +1,8 @@ -package me.hgsoft.minecraft.devcommand.registry.dependencies; +package dev.hugog.minecraft.dev_command.registry.dependencies; import com.google.inject.Singleton; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.IRegistry; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.registry.IRegistry; import java.util.*; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/validators/BooleanArgument.java b/src/main/java/dev/hugog/minecraft/dev_command/validators/BooleanArgument.java similarity index 95% rename from src/main/java/me/hgsoft/minecraft/devcommand/validators/BooleanArgument.java rename to src/main/java/dev/hugog/minecraft/dev_command/validators/BooleanArgument.java index e622a7e..9539fdd 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/validators/BooleanArgument.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/validators/BooleanArgument.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.validators; +package dev.hugog.minecraft.dev_command.validators; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/validators/CommandArgument.java b/src/main/java/dev/hugog/minecraft/dev_command/validators/CommandArgument.java similarity index 85% rename from src/main/java/me/hgsoft/minecraft/devcommand/validators/CommandArgument.java rename to src/main/java/dev/hugog/minecraft/dev_command/validators/CommandArgument.java index 3dd69ad..aa4ba2c 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/validators/CommandArgument.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/validators/CommandArgument.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.validators; +package dev.hugog.minecraft.dev_command.validators; import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java b/src/main/java/dev/hugog/minecraft/dev_command/validators/DoubleArgument.java similarity index 90% rename from src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java rename to src/main/java/dev/hugog/minecraft/dev_command/validators/DoubleArgument.java index 15998a0..8dfe09c 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/validators/DoubleArgument.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/validators/DoubleArgument.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.validators; +package dev.hugog.minecraft.dev_command.validators; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/validators/ICommandArgument.java b/src/main/java/dev/hugog/minecraft/dev_command/validators/ICommandArgument.java similarity index 61% rename from src/main/java/me/hgsoft/minecraft/devcommand/validators/ICommandArgument.java rename to src/main/java/dev/hugog/minecraft/dev_command/validators/ICommandArgument.java index 3b86390..88d221c 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/validators/ICommandArgument.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/validators/ICommandArgument.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.validators; +package dev.hugog.minecraft.dev_command.validators; public interface ICommandArgument { diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/validators/IntegerArgument.java b/src/main/java/dev/hugog/minecraft/dev_command/validators/IntegerArgument.java similarity index 90% rename from src/main/java/me/hgsoft/minecraft/devcommand/validators/IntegerArgument.java rename to src/main/java/dev/hugog/minecraft/dev_command/validators/IntegerArgument.java index fe3b0c4..51d627e 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/validators/IntegerArgument.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/validators/IntegerArgument.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.validators; +package dev.hugog.minecraft.dev_command.validators; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/src/main/java/me/hgsoft/minecraft/devcommand/validators/StringArgument.java b/src/main/java/dev/hugog/minecraft/dev_command/validators/StringArgument.java similarity index 88% rename from src/main/java/me/hgsoft/minecraft/devcommand/validators/StringArgument.java rename to src/main/java/dev/hugog/minecraft/dev_command/validators/StringArgument.java index dd12236..3b2c525 100644 --- a/src/main/java/me/hgsoft/minecraft/devcommand/validators/StringArgument.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/validators/StringArgument.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.validators; +package dev.hugog.minecraft.dev_command.validators; import lombok.EqualsAndHashCode; import lombok.ToString; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java b/src/test/java/dev/hugog/minecraft/dev_command/IntegrationTestIT.java similarity index 77% rename from src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java rename to src/test/java/dev/hugog/minecraft/dev_command/IntegrationTestIT.java index b1c6a0e..cc31237 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/IntegrationTestIT.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/IntegrationTestIT.java @@ -1,12 +1,13 @@ -package me.hgsoft.minecraft.devcommand; - -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; +package dev.hugog.minecraft.dev_command; + +import dev.hugog.minecraft.dev_command.commands.builder.BukkitCommandDataBuilder; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.utils.test_classes.valid.TestCommand; +import dev.hugog.minecraft.dev_command.commands.handler.CommandHandler; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.registry.commands.CommandRegistry; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -55,7 +56,7 @@ void registerAndExecuteBukkitCommand() { // The args are also correct assertArrayEquals(new String[] {"1"}, TestCommand.args); - assertEquals(bukkitCommand, TestCommand.command); + Assertions.assertEquals(bukkitCommand, TestCommand.command); } @@ -75,7 +76,7 @@ void autoCommandDiscoveryAndExecuteBukkitCommand() { // The command alias is also correct assertNotNull(TestCommand.command); - assertEquals(TestCommand.command.getAlias(), "test"); + Assertions.assertEquals(TestCommand.command.getAlias(), "test"); } diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java b/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java similarity index 85% rename from src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java rename to src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java index 99fe713..2843e56 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/commands/CommandHandlerTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java @@ -1,16 +1,16 @@ -package me.hgsoft.minecraft.devcommand.commands; - -import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; -import me.hgsoft.minecraft.devcommand.commands.handler.CommandHandler; -import me.hgsoft.minecraft.devcommand.discovery.CommandDiscoveryService; -import me.hgsoft.minecraft.devcommand.exceptions.AutoConfigurationException; -import me.hgsoft.minecraft.devcommand.exceptions.InvalidIntegrationException; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; -import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; -import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +package dev.hugog.minecraft.dev_command.commands; + +import dev.hugog.minecraft.dev_command.commands.builder.BukkitCommandDataBuilder; +import dev.hugog.minecraft.dev_command.commands.data.AbstractCommandData; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.utils.test_classes.valid.TestCommand; +import dev.hugog.minecraft.dev_command.commands.handler.CommandHandler; +import dev.hugog.minecraft.dev_command.discovery.CommandDiscoveryService; +import dev.hugog.minecraft.dev_command.exceptions.AutoConfigurationException; +import dev.hugog.minecraft.dev_command.exceptions.InvalidIntegrationException; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.registry.commands.CommandRegistry; +import dev.hugog.minecraft.dev_command.validators.IntegerArgument; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandlerTest.java b/src/test/java/dev/hugog/minecraft/dev_command/dependencies/DependencyHandlerTest.java similarity index 80% rename from src/test/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandlerTest.java rename to src/test/java/dev/hugog/minecraft/dev_command/dependencies/DependencyHandlerTest.java index c84e348..fbd13db 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/dependencies/DependencyHandlerTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/dependencies/DependencyHandlerTest.java @@ -1,4 +1,4 @@ -package me.hgsoft.minecraft.devcommand.dependencies; +package dev.hugog.minecraft.dev_command.dependencies; import org.junit.jupiter.api.Test; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java b/src/test/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryServiceTest.java similarity index 90% rename from src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java rename to src/test/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryServiceTest.java index c580593..f25e64b 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/discovery/CommandDiscoveryServiceTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryServiceTest.java @@ -1,14 +1,14 @@ -package me.hgsoft.minecraft.devcommand.discovery; - -import me.hgsoft.minecraft.devcommand.annotations.Command; -import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.ArgumentTestCommand; -import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.NoAnnotationTestCommand; -import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; -import me.hgsoft.minecraft.devcommand.utils.test_classes.invalid.TestCommandCopy; -import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +package dev.hugog.minecraft.dev_command.discovery; + +import dev.hugog.minecraft.dev_command.commands.data.AbstractCommandData; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.utils.test_classes.invalid.TestCommandCopy; +import dev.hugog.minecraft.dev_command.utils.test_classes.valid.ArgumentTestCommand; +import dev.hugog.minecraft.dev_command.utils.test_classes.valid.NoAnnotationTestCommand; +import dev.hugog.minecraft.dev_command.utils.test_classes.valid.TestCommand; +import dev.hugog.minecraft.dev_command.annotations.Command; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.validators.IntegerArgument; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java b/src/test/java/dev/hugog/minecraft/dev_command/executors/BukkitDevCommandTest.java similarity index 94% rename from src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java rename to src/test/java/dev/hugog/minecraft/dev_command/executors/BukkitDevCommandTest.java index 6593f97..6669bcf 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/executors/BukkitDevCommandTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/executors/BukkitDevCommandTest.java @@ -1,13 +1,13 @@ -package me.hgsoft.minecraft.devcommand.executors; - -import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.exceptions.ArgumentsConfigException; -import me.hgsoft.minecraft.devcommand.exceptions.PermissionConfigException; -import me.hgsoft.minecraft.devcommand.validators.BooleanArgument; -import me.hgsoft.minecraft.devcommand.validators.DoubleArgument; -import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; -import me.hgsoft.minecraft.devcommand.validators.StringArgument; +package dev.hugog.minecraft.dev_command.executors; + +import dev.hugog.minecraft.dev_command.commands.BukkitDevCommand; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.exceptions.ArgumentsConfigException; +import dev.hugog.minecraft.dev_command.exceptions.PermissionConfigException; +import dev.hugog.minecraft.dev_command.validators.BooleanArgument; +import dev.hugog.minecraft.dev_command.validators.DoubleArgument; +import dev.hugog.minecraft.dev_command.validators.IntegerArgument; +import dev.hugog.minecraft.dev_command.validators.StringArgument; import org.bukkit.command.CommandSender; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java b/src/test/java/dev/hugog/minecraft/dev_command/factory/CommandFactoryTest.java similarity index 63% rename from src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java rename to src/test/java/dev/hugog/minecraft/dev_command/factory/CommandFactoryTest.java index 489a470..a2c1bf8 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/factory/CommandFactoryTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/factory/CommandFactoryTest.java @@ -1,13 +1,13 @@ -package me.hgsoft.minecraft.devcommand.factory; +package dev.hugog.minecraft.dev_command.factory; -import me.hgsoft.minecraft.devcommand.commands.data.AbstractCommandData; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.builder.BukkitCommandDataBuilder; -import me.hgsoft.minecraft.devcommand.commands.IDevCommand; -import me.hgsoft.minecraft.devcommand.factories.CommandFactory; -import me.hgsoft.minecraft.devcommand.factories.IObjectFactory; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.utils.test_classes.valid.TestCommand; +import dev.hugog.minecraft.dev_command.commands.IDevCommand; +import dev.hugog.minecraft.dev_command.commands.builder.BukkitCommandDataBuilder; +import dev.hugog.minecraft.dev_command.commands.data.AbstractCommandData; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.factories.CommandFactory; +import dev.hugog.minecraft.dev_command.factories.IObjectFactory; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.utils.test_classes.valid.TestCommand; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java b/src/test/java/dev/hugog/minecraft/dev_command/registry/CommandRegistryTest.java similarity index 83% rename from src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java rename to src/test/java/dev/hugog/minecraft/dev_command/registry/CommandRegistryTest.java index 4d5867c..61636c8 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/registry/CommandRegistryTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/registry/CommandRegistryTest.java @@ -1,8 +1,8 @@ -package me.hgsoft.minecraft.devcommand.registry; +package dev.hugog.minecraft.dev_command.registry; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.integration.Integration; -import me.hgsoft.minecraft.devcommand.registry.commands.CommandRegistry; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.integration.Integration; +import dev.hugog.minecraft.dev_command.registry.commands.CommandRegistry; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/invalid/TestCommandCopy.java similarity index 66% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java rename to src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/invalid/TestCommandCopy.java index 81ae787..178b879 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/invalid/TestCommandCopy.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/invalid/TestCommandCopy.java @@ -1,10 +1,10 @@ -package me.hgsoft.minecraft.devcommand.utils.test_classes.invalid; +package dev.hugog.minecraft.dev_command.utils.test_classes.invalid; -import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; -import me.hgsoft.minecraft.devcommand.annotations.Command; -import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import dev.hugog.minecraft.dev_command.commands.BukkitDevCommand; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.annotations.ArgsValidation; +import dev.hugog.minecraft.dev_command.annotations.Command; +import dev.hugog.minecraft.dev_command.validators.IntegerArgument; import org.bukkit.command.CommandSender; @Command(alias = "test", description = "Bukkit Test Command!", permission = "command.bukkit_test") diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/ArgumentTestCommand.java similarity index 66% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java rename to src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/ArgumentTestCommand.java index bcea161..c919b3a 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/ArgumentTestCommand.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/ArgumentTestCommand.java @@ -1,10 +1,10 @@ -package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; +package dev.hugog.minecraft.dev_command.utils.test_classes.valid; -import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; -import me.hgsoft.minecraft.devcommand.annotations.Command; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; -import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import dev.hugog.minecraft.dev_command.commands.BukkitDevCommand; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.annotations.ArgsValidation; +import dev.hugog.minecraft.dev_command.annotations.Command; +import dev.hugog.minecraft.dev_command.validators.IntegerArgument; import org.bukkit.command.CommandSender; @Command(alias = "test_arg", description = "Argument Test Command!", permission = "command.bukkit_test") diff --git a/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/InvalidTestCommand.java b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/InvalidTestCommand.java new file mode 100644 index 0000000..b5e6fad --- /dev/null +++ b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/InvalidTestCommand.java @@ -0,0 +1,7 @@ +package dev.hugog.minecraft.dev_command.utils.test_classes.valid; + +import dev.hugog.minecraft.dev_command.annotations.Command; + +@Command(alias = "invalid_cmd") +public class InvalidTestCommand { +} diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/NoAnnotationTestCommand.java similarity index 75% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java rename to src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/NoAnnotationTestCommand.java index 2794398..76cbf0d 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/NoAnnotationTestCommand.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/NoAnnotationTestCommand.java @@ -1,7 +1,7 @@ -package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; +package dev.hugog.minecraft.dev_command.utils.test_classes.valid; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; +import dev.hugog.minecraft.dev_command.commands.BukkitDevCommand; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; import org.bukkit.command.CommandSender; public class NoAnnotationTestCommand extends BukkitDevCommand { diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/TestCommand.java similarity index 66% rename from src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java rename to src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/TestCommand.java index 6637900..45ad539 100644 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/TestCommand.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/TestCommand.java @@ -1,10 +1,10 @@ -package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; +package dev.hugog.minecraft.dev_command.utils.test_classes.valid; -import me.hgsoft.minecraft.devcommand.annotations.ArgsValidation; -import me.hgsoft.minecraft.devcommand.annotations.Command; -import me.hgsoft.minecraft.devcommand.commands.data.BukkitCommandData; -import me.hgsoft.minecraft.devcommand.commands.BukkitDevCommand; -import me.hgsoft.minecraft.devcommand.validators.IntegerArgument; +import dev.hugog.minecraft.dev_command.commands.BukkitDevCommand; +import dev.hugog.minecraft.dev_command.commands.data.BukkitCommandData; +import dev.hugog.minecraft.dev_command.annotations.ArgsValidation; +import dev.hugog.minecraft.dev_command.annotations.Command; +import dev.hugog.minecraft.dev_command.validators.IntegerArgument; import org.bukkit.command.CommandSender; @Command(alias = "test", description = "Bukkit Test Command!", permission = "command.bukkit_test") diff --git a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java b/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java deleted file mode 100644 index 4159fab..0000000 --- a/src/test/java/me/hgsoft/minecraft/devcommand/utils/test_classes/valid/InvalidTestCommand.java +++ /dev/null @@ -1,7 +0,0 @@ -package me.hgsoft.minecraft.devcommand.utils.test_classes.valid; - -import me.hgsoft.minecraft.devcommand.annotations.Command; - -@Command(alias = "invalid_cmd") -public class InvalidTestCommand { -} From 0bf52c88efd9b079e6d300b908c20ea3430694ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Thu, 24 Aug 2023 12:54:08 +0100 Subject: [PATCH 10/19] Fix: Fixed Maven build warnings. Updated Maven plugin's versions and defined the project encoding. --- pom.xml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index ba69727..01ccee1 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ 11 11 + UTF-8 @@ -95,15 +96,16 @@ maven-clean-plugin - 3.1.0 + 3.3.1 maven-resources-plugin - 3.0.2 + 3.3.1 org.apache.maven.plugins maven-compiler-plugin + 3.11.0 11 11 @@ -111,15 +113,15 @@ maven-surefire-plugin - 2.22.1 + 3.1.2 maven-jar-plugin - 3.0.2 + 3.3.0 maven-install-plugin - 2.5.2 + 3.1.1 From 76275d05c2511a39cb452b70def2ed638b003d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Fri, 25 Aug 2023 16:59:55 +0100 Subject: [PATCH 11/19] Feat: Added dependency getter by class. --- .../dev_command/commands/BukkitDevCommand.java | 11 +++++++++++ .../minecraft/dev_command/commands/IDevCommand.java | 1 + 2 files changed, 12 insertions(+) diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java index 4f5f7d7..61cdbdb 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java @@ -61,6 +61,11 @@ public boolean hasValidArgs() { for (int mandatoryArgumentIdx = 0; mandatoryArgumentIdx < mandatoryArguments.length; mandatoryArgumentIdx++) { String currentArgument = mandatoryArguments[mandatoryArgumentIdx]; + + if (commandData.getMandatoryArguments() == null) { + continue; + } + Class> expectedCommandArgumentClass = commandData.getMandatoryArguments()[mandatoryArgumentIdx]; ICommandArgument expectedCommandArgument = new ArgumentFactory(currentArgument).generate(expectedCommandArgumentClass); @@ -104,4 +109,10 @@ public List getDependencies() { } + @Override + public Object getDependency(Class dependencyClass) { + DependencyHandler dependencyHandler = DevCommand.getOrCreateInstance().getDependencyHandler(); + return dependencyHandler.getDependencyInstance(commandData.getIntegration(), dependencyClass); + } + } \ No newline at end of file diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java index fa6c304..2911d83 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java @@ -8,5 +8,6 @@ public interface IDevCommand { boolean hasPermissionToExecuteCommand(); boolean hasValidArgs(); List getDependencies(); + Object getDependency(Class dependencyClass); } From 45c43e6e52407d48d74fee019dace061e0a8a6cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Fri, 25 Aug 2023 20:26:09 +0100 Subject: [PATCH 12/19] Feat: Added command player only check. Now it is possible to define a command as 'playerOnly' and use the canExecuteCommand() function in the BukkitDevCommand to check if the sender can execute the command depending on if it is a player. --- .../dev_command/annotations/Command.java | 1 + .../commands/BukkitDevCommand.java | 8 +++++ .../dev_command/commands/IDevCommand.java | 1 + .../builder/BukkitCommandDataBuilder.java | 8 ++++- .../commands/data/BukkitCommandData.java | 4 ++- .../executors/DevCommandExecutor.java | 2 +- .../discovery/CommandDiscoveryService.java | 6 ++-- .../dev_command/factories/CommandFactory.java | 4 +-- .../commands/CommandHandlerTest.java | 2 +- .../executors/BukkitDevCommandTest.java | 36 +++++++++++++++++++ .../factory/CommandFactoryTest.java | 2 +- 11 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/hugog/minecraft/dev_command/annotations/Command.java b/src/main/java/dev/hugog/minecraft/dev_command/annotations/Command.java index 080064f..0e25cdc 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/annotations/Command.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/annotations/Command.java @@ -12,5 +12,6 @@ String alias(); String description() default ""; String permission() default ""; + boolean isPlayerOnly() default false; } diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java index 61cdbdb..c963515 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/BukkitDevCommand.java @@ -12,6 +12,7 @@ import dev.hugog.minecraft.dev_command.validators.CommandArgument; import dev.hugog.minecraft.dev_command.validators.ICommandArgument; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import java.util.Arrays; import java.util.List; @@ -42,6 +43,13 @@ public boolean hasPermissionToExecuteCommand() { } + @Override + public boolean canSenderExecuteCommand() { + if (commandData.isPlayerOnly()) + return commandSender instanceof Player; + return true; + } + @Override public boolean hasValidArgs() { diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java index 2911d83..22c4e4d 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/IDevCommand.java @@ -7,6 +7,7 @@ public interface IDevCommand { void execute(); boolean hasPermissionToExecuteCommand(); boolean hasValidArgs(); + boolean canSenderExecuteCommand(); List getDependencies(); Object getDependency(Class dependencyClass); diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/builder/BukkitCommandDataBuilder.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/builder/BukkitCommandDataBuilder.java index b431e37..e2dae25 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/builder/BukkitCommandDataBuilder.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/builder/BukkitCommandDataBuilder.java @@ -14,6 +14,7 @@ public class BukkitCommandDataBuilder implements ICommandBuilder executor; private Class[] dependencies; private String permission; + private boolean isPlayerOnly; private Class>[] mandatoryArguments; private Class>[] optionalArguments; @@ -74,8 +75,13 @@ public final BukkitCommandDataBuilder withIntegration(Integration integration) { return this; } + public final BukkitCommandDataBuilder withPlayerOnly(boolean isPlayerOnly) { + this.isPlayerOnly = isPlayerOnly; + return this; + } + public BukkitCommandData build() { - return new BukkitCommandData(name, alias, description, integration, dependencies, executor, permission, mandatoryArguments, optionalArguments); + return new BukkitCommandData(name, alias, description, integration, dependencies, executor, permission, isPlayerOnly, mandatoryArguments, optionalArguments); } } diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/data/BukkitCommandData.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/data/BukkitCommandData.java index 9488e0e..70bf626 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/data/BukkitCommandData.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/data/BukkitCommandData.java @@ -13,12 +13,14 @@ public class BukkitCommandData extends AbstractCommandData { private final String permission; + private final boolean isPlayerOnly; private final Class>[] mandatoryArguments; private final Class>[] optionalArguments; - public BukkitCommandData(String name, String alias, String description, Integration integration, Class[] dependencies, Class executor, String permission, Class>[] mandatoryArguments, Class>[] optionalArguments) { + public BukkitCommandData(String name, String alias, String description, Integration integration, Class[] dependencies, Class executor, String permission, boolean isPlayerOnly, Class>[] mandatoryArguments, Class>[] optionalArguments) { super(name, alias, description, integration, executor, dependencies); this.permission = permission; + this.isPlayerOnly = isPlayerOnly; this.mandatoryArguments = mandatoryArguments; this.optionalArguments = optionalArguments; } diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/executors/DevCommandExecutor.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/executors/DevCommandExecutor.java index 655b8c3..59435a8 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/executors/DevCommandExecutor.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/executors/DevCommandExecutor.java @@ -41,7 +41,7 @@ public boolean onCommand(@NonNull CommandSender commandSender, @NonNull Command commandHandler.executeCommandByAlias(integration, args[0], commandSender); return true; } else { - commandHandler.executeCommandByAlias(integration, args[0], commandSender, Arrays.copyOfRange(args, 1, args.length)); + commandHandler.executeCommandByAlias(integration, args[0], commandSender, Arrays.copyOfRange(args, 1, args.length, String[].class)); return true; } diff --git a/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java b/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java index 4f18f1a..511cd5d 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java @@ -64,12 +64,14 @@ public AbstractCommandData commandClassToCommandData(Class { @@ -29,7 +28,8 @@ public IDevCommand generate(AbstractCommandData abstractCommandData) { if (abstractCommandData instanceof BukkitCommandData) { executorConstructor = executor.getConstructor(BukkitCommandData.class, CommandSender.class, String[].class); - executorInstance = executorConstructor.newInstance(abstractCommandData, executorArgs[0], Arrays.copyOfRange(executorArgs, 1, executorArgs.length, String[].class)); + String[] remainingArgs = (String[]) executorArgs[1]; + executorInstance = executorConstructor.newInstance(abstractCommandData, executorArgs[0], remainingArgs); } else { executorInstance = null; } diff --git a/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java b/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java index 2843e56..9eab861 100644 --- a/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java @@ -100,7 +100,7 @@ void executeCommandByAlias() { when(commandRegistryMock.getValues(integrationMock)).thenReturn(List.of(bukkitCommandStub)); - assertTrue(commandHandler.executeCommandByAlias(integrationMock, bukkitCommandStub.getAlias(), null, "good", "afternoon")); + assertTrue(commandHandler.executeCommandByAlias(integrationMock, bukkitCommandStub.getAlias(), null, new String[] {"good", "afternoon" } )); verify(commandRegistryMock, times(1)).getValues(integrationMock); diff --git a/src/test/java/dev/hugog/minecraft/dev_command/executors/BukkitDevCommandTest.java b/src/test/java/dev/hugog/minecraft/dev_command/executors/BukkitDevCommandTest.java index 6669bcf..6948536 100644 --- a/src/test/java/dev/hugog/minecraft/dev_command/executors/BukkitDevCommandTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/executors/BukkitDevCommandTest.java @@ -9,6 +9,7 @@ import dev.hugog.minecraft.dev_command.validators.IntegerArgument; import dev.hugog.minecraft.dev_command.validators.StringArgument; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -86,6 +87,41 @@ void hasPermissionToExecuteCommand_withUndefinedPermission() { } + @Test + @DisplayName("Test the canExecuteCommand method when the command is player only and the sender is a player.") + void canExecuteCommand() { + + Player playerMock = mock(Player.class); + bukkitDevCommandStub = new BukkitDevCommand(bukkitCommandDataMock, playerMock, null) { + @Override + public void execute() { + System.out.println("Command Executed"); + } + }; + + when(bukkitCommandDataMock.isPlayerOnly()).thenReturn(true); + assertThat(bukkitDevCommandStub.canSenderExecuteCommand()).isTrue(); + + } + + @Test + @DisplayName("Test the canExecuteCommand method when the command is not player only and the sender is not a player.") + void canExecuteCommand_withoutPlayerOnlyFlag() { + + when(bukkitCommandDataMock.isPlayerOnly()).thenReturn(false); + assertThat(bukkitDevCommandStub.canSenderExecuteCommand()).isTrue(); + + } + + @Test + @DisplayName("Test the canExecuteCommand method when the command player only and the sender is not a player.") + void canExecuteCommand__withPlayerOnlyFlag() { + + when(bukkitCommandDataMock.isPlayerOnly()).thenReturn(true); + assertThat(bukkitDevCommandStub.canSenderExecuteCommand()).isFalse(); + + } + @Test @DisplayName("Test command mandatory arguments validation.") @SuppressWarnings("unchecked") diff --git a/src/test/java/dev/hugog/minecraft/dev_command/factory/CommandFactoryTest.java b/src/test/java/dev/hugog/minecraft/dev_command/factory/CommandFactoryTest.java index a2c1bf8..ce7dccc 100644 --- a/src/test/java/dev/hugog/minecraft/dev_command/factory/CommandFactoryTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/factory/CommandFactoryTest.java @@ -26,7 +26,7 @@ class CommandFactoryTest { @BeforeEach void setUp() { - bukkitCommandFactory = new CommandFactory(null, "good", "afternoon"); + bukkitCommandFactory = new CommandFactory(null, new String[] {"good", "afternoon"}); bukkitCommand = new BukkitCommandDataBuilder("test", integrationMock, TestCommand.class) .withName("Test Command") .withDescription("Bukkit Test Command") From a4b9a120390323ce85325f54b1a3799a3835bc96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Wed, 30 Aug 2023 18:26:50 +0100 Subject: [PATCH 13/19] Fix: Fixed arguments parsing in CommandFactory. --- .../dev_command/factories/CommandFactory.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/hugog/minecraft/dev_command/factories/CommandFactory.java b/src/main/java/dev/hugog/minecraft/dev_command/factories/CommandFactory.java index 1a77bc9..2e8b460 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/factories/CommandFactory.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/factories/CommandFactory.java @@ -28,8 +28,23 @@ public IDevCommand generate(AbstractCommandData abstractCommandData) { if (abstractCommandData instanceof BukkitCommandData) { executorConstructor = executor.getConstructor(BukkitCommandData.class, CommandSender.class, String[].class); - String[] remainingArgs = (String[]) executorArgs[1]; + + if (executorArgs.length == 0) { + throw new IllegalArgumentException("You must provide a CommandSender and a String[] as arguments for the BukkitCommandData executor."); + } + + if (executorArgs[0] != null && !(executorArgs[0] instanceof CommandSender)) { + throw new IllegalArgumentException("The first argument for the BukkitCommandData executor must be a CommandSender."); + } + + String[] remainingArgs = new String[0]; + + if (executorArgs.length > 1) { + remainingArgs = (String[]) executorArgs[1]; + } + executorInstance = executorConstructor.newInstance(abstractCommandData, executorArgs[0], remainingArgs); + } else { executorInstance = null; } From 785ea791d9e257b23fddfe127814600f256dab47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Fri, 1 Sep 2023 12:03:07 +0100 Subject: [PATCH 14/19] Feat: Added optional and mandatory arguments to validation. --- .../dev_command/annotations/ArgsValidation.java | 4 ++-- .../discovery/CommandDiscoveryService.java | 9 ++++++--- .../discovery/CommandDiscoveryServiceTest.java | 12 ++++-------- .../utils/test_classes/invalid/TestCommandCopy.java | 2 +- .../test_classes/valid/ArgumentTestCommand.java | 2 +- .../utils/test_classes/valid/TestCommand.java | 2 +- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/dev/hugog/minecraft/dev_command/annotations/ArgsValidation.java b/src/main/java/dev/hugog/minecraft/dev_command/annotations/ArgsValidation.java index 078b78d..c176449 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/annotations/ArgsValidation.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/annotations/ArgsValidation.java @@ -10,7 +10,7 @@ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface ArgsValidation { - Class>[] argsTypes(); - int mandatory() default 0; + Class>[] mandatoryArgs() default {}; + Class>[] optionalArgs() default {}; } diff --git a/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java b/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java index 511cd5d..adfe98b 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/discovery/CommandDiscoveryService.java @@ -48,12 +48,14 @@ public List getDiscoveredCommandsData() { public AbstractCommandData commandClassToCommandData(Class commandExecutorClass) { - Class>[] argsValidationTypes = null; + Class>[] mandatoryArgsValidationTypes = null; + Class>[] optionalArgsValidationTypes = null; Class[] commandDependencies = null; if (containsArgsValidator(commandExecutorClass)) { ArgsValidation executorArgsValidationAnnotation = getArgsValidationAnnotation(commandExecutorClass); - argsValidationTypes = executorArgsValidationAnnotation.argsTypes(); + mandatoryArgsValidationTypes = executorArgsValidationAnnotation.mandatoryArgs(); + optionalArgsValidationTypes = executorArgsValidationAnnotation.optionalArgs(); } if (containsDependenciesAnnotation(commandExecutorClass)) { @@ -72,7 +74,8 @@ public AbstractCommandData commandClassToCommandData(Class - assertThat(bukkitCommandData).extracting(BukkitCommandData::getOptionalArguments).isNull() + assertThat(bukkitCommandData.getOptionalArguments()).isEmpty() ); } @@ -149,7 +145,7 @@ void commandClassToCommandData() { assertThat(commandDiscoveryService.commandClassToCommandData(TestCommand.class)) .isInstanceOfSatisfying(BukkitCommandData.class, bukkitCommandData -> - assertThat(bukkitCommandData).extracting(BukkitCommandData::getOptionalArguments).isNull() + assertThat(bukkitCommandData.getOptionalArguments()).isEmpty() ); } diff --git a/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/invalid/TestCommandCopy.java b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/invalid/TestCommandCopy.java index 178b879..3732000 100644 --- a/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/invalid/TestCommandCopy.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/invalid/TestCommandCopy.java @@ -8,7 +8,7 @@ import org.bukkit.command.CommandSender; @Command(alias = "test", description = "Bukkit Test Command!", permission = "command.bukkit_test") -@ArgsValidation(argsTypes = {IntegerArgument.class}) +@ArgsValidation(mandatoryArgs = {IntegerArgument.class}) public class TestCommandCopy extends BukkitDevCommand { public static boolean called; diff --git a/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/ArgumentTestCommand.java b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/ArgumentTestCommand.java index c919b3a..7bb7cc2 100644 --- a/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/ArgumentTestCommand.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/ArgumentTestCommand.java @@ -8,7 +8,7 @@ import org.bukkit.command.CommandSender; @Command(alias = "test_arg", description = "Argument Test Command!", permission = "command.bukkit_test") -@ArgsValidation(argsTypes = {IntegerArgument.class}) +@ArgsValidation(mandatoryArgs = {IntegerArgument.class}) public class ArgumentTestCommand extends BukkitDevCommand { public static boolean called; diff --git a/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/TestCommand.java b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/TestCommand.java index 45ad539..4bd037c 100644 --- a/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/TestCommand.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/utils/test_classes/valid/TestCommand.java @@ -8,7 +8,7 @@ import org.bukkit.command.CommandSender; @Command(alias = "test", description = "Bukkit Test Command!", permission = "command.bukkit_test") -@ArgsValidation(argsTypes = {IntegerArgument.class}) +@ArgsValidation(mandatoryArgs = {IntegerArgument.class}) public class TestCommand extends BukkitDevCommand { public static boolean called; From 67aa030bf474e8b33e97f71e87e01a145b02cda6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Sat, 2 Sep 2023 14:58:01 +0100 Subject: [PATCH 15/19] Feat: Added registered commands' getter. --- pom.xml | 12 ++++++++++++ .../commands/handler/CommandHandler.java | 12 ++++++++---- .../minecraft/dev_command/IntegrationTestIT.java | 7 +++---- .../dev_command/commands/CommandHandlerTest.java | 14 ++++++++++++++ 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 01ccee1..90d1b21 100644 --- a/pom.xml +++ b/pom.xml @@ -115,6 +115,18 @@ maven-surefire-plugin 3.1.2 + + maven-failsafe-plugin + 3.1.2 + + + + integration-test + verify + + + + maven-jar-plugin 3.3.0 diff --git a/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java b/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java index 42e005f..b80a810 100644 --- a/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java +++ b/src/main/java/dev/hugog/minecraft/dev_command/commands/handler/CommandHandler.java @@ -3,17 +3,17 @@ import com.google.inject.Inject; import dev.hugog.minecraft.dev_command.commands.IDevCommand; import dev.hugog.minecraft.dev_command.commands.data.AbstractCommandData; -import lombok.NonNull; -import lombok.extern.log4j.Log4j2; import dev.hugog.minecraft.dev_command.discovery.CommandDiscoveryService; import dev.hugog.minecraft.dev_command.exceptions.AutoConfigurationException; import dev.hugog.minecraft.dev_command.exceptions.InvalidIntegrationException; -import dev.hugog.minecraft.dev_command.factories.IObjectFactory; import dev.hugog.minecraft.dev_command.factories.CommandFactory; +import dev.hugog.minecraft.dev_command.factories.IObjectFactory; import dev.hugog.minecraft.dev_command.integration.Integration; import dev.hugog.minecraft.dev_command.registry.commands.CommandRegistry; +import lombok.NonNull; +import lombok.extern.log4j.Log4j2; -import java.util.*; +import java.util.List; @Log4j2 public class CommandHandler { @@ -78,6 +78,10 @@ public void initCommandsAutoConfiguration(@NonNull Integration integration, Comm } + public List getRegisteredCommands(Integration integration) { + return commandRegistry.getValues(integration); + } + private void validateIntegration(Integration integration) { if (!integration.isValid()) { throw new InvalidIntegrationException(String.format("The integration %s contained an invalid base package.", integration.getName())); diff --git a/src/test/java/dev/hugog/minecraft/dev_command/IntegrationTestIT.java b/src/test/java/dev/hugog/minecraft/dev_command/IntegrationTestIT.java index cc31237..4686d4d 100644 --- a/src/test/java/dev/hugog/minecraft/dev_command/IntegrationTestIT.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/IntegrationTestIT.java @@ -13,7 +13,6 @@ import static org.junit.jupiter.api.Assertions.*; -@SuppressWarnings("all") class IntegrationTestIT { private CommandRegistry commandRegistry; @@ -24,7 +23,7 @@ class IntegrationTestIT { void setUp() { commandRegistry = new CommandRegistry(); commandHandler = new CommandHandler(commandRegistry); - pluginIntegration = new Integration("myPlugin", "me.hgsoft.minecraft.devcommand.utils.test_classes.valid"); + pluginIntegration = new Integration("myPlugin", "dev.hugog.minecraft.dev_command.utils.test_classes.valid"); TestCommand.called = false; } @@ -46,7 +45,7 @@ void registerAndExecuteBukkitCommand() { .build(); commandHandler.registerCommand(pluginIntegration, bukkitCommand); - commandHandler.executeCommandByAlias(pluginIntegration, "test", null, "1"); + commandHandler.executeCommandByAlias(pluginIntegration, "test", null, new String[] {"1"}); // The command was successfully called assertTrue(TestCommand.called); @@ -64,7 +63,7 @@ void registerAndExecuteBukkitCommand() { void autoCommandDiscoveryAndExecuteBukkitCommand() { commandHandler.initCommandsAutoConfiguration(pluginIntegration); - commandHandler.executeCommandByAlias(pluginIntegration, "test", null, "good", "afternoon"); + commandHandler.executeCommandByAlias(pluginIntegration, "test", null, new String[]{"good", "afternoon"}); // The command was successfully called assertTrue(TestCommand.called); diff --git a/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java b/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java index 9eab861..5832a93 100644 --- a/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java +++ b/src/test/java/dev/hugog/minecraft/dev_command/commands/CommandHandlerTest.java @@ -146,4 +146,18 @@ void initCommandsAutoConfigurationWithInvalidIntegration() { } + @Test + @DisplayName("Test method to get registered commands.") + void getRegisteredCommands() { + + when(commandRegistryMock.getValues(integrationMock)).thenReturn(List.of(bukkitCommandStub)); + + commandHandler.registerCommand(integrationMock, bukkitCommandStub); + + assertEquals(commandHandler.getRegisteredCommands(integrationMock), List.of(bukkitCommandStub)); + + verify(commandRegistryMock, times(1)).getValues(integrationMock); + + } + } \ No newline at end of file From ff4c48b53ca23b340e28e1ff64af9d404bff40a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Thu, 9 May 2024 23:19:40 +0100 Subject: [PATCH 16/19] Created GitHub Action to deploy to Maven registry on new release. --- .github/workflows/maven-deploy.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 .github/workflows/maven-deploy.yml diff --git a/.github/workflows/maven-deploy.yml b/.github/workflows/maven-deploy.yml new file mode 100644 index 0000000..44ddb92 --- /dev/null +++ b/.github/workflows/maven-deploy.yml @@ -0,0 +1,20 @@ +name: Publish package to GitHub Packages +on: + release: + types: [created] +jobs: + publish: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + - name: Publish package + run: mvn --batch-mode deploy + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file From c0eb1f4040be029415dbbbea73caf3332596c7f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Thu, 9 May 2024 23:20:11 +0100 Subject: [PATCH 17/19] Updated dependencies & project version. --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 90d1b21..64311b5 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ dev.hugog.minecraft dev-command - 0.0.2-SNAPSHOT + 0.0.3 11 @@ -26,7 +26,7 @@ org.spigotmc spigot-api - 1.19.2-R0.1-SNAPSHOT + 1.20.6-R0.1-SNAPSHOT provided @@ -142,8 +142,8 @@ - github - GitHub Packages + dev-command-depository + GitHub Packages DevCommand Repository https://maven.pkg.github.com/Hugo1307/DevCommand From 87a4854f6bb790b1cd1f3e74ca19bdd7c7dbce6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Thu, 9 May 2024 23:22:13 +0100 Subject: [PATCH 18/19] Updated Java version for maven deployment action. --- .github/workflows/maven-deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven-deploy.yml b/.github/workflows/maven-deploy.yml index 44ddb92..25604e8 100644 --- a/.github/workflows/maven-deploy.yml +++ b/.github/workflows/maven-deploy.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: - java-version: '17' + java-version: '11' distribution: 'temurin' - name: Publish package run: mvn --batch-mode deploy From 78e9f5c95ec38974043f5249a1c0508152bffbb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20Gon=C3=A7alves?= Date: Thu, 9 May 2024 23:23:17 +0100 Subject: [PATCH 19/19] Updated Java version for GitHub Actions. --- .github/workflows/continuous-integration.yml | 6 +++--- .github/workflows/maven-deploy.yml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index f496ae8..9653356 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -18,10 +18,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 11 - uses: actions/setup-java@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '17' distribution: 'temurin' cache: maven diff --git a/.github/workflows/maven-deploy.yml b/.github/workflows/maven-deploy.yml index 25604e8..44ddb92 100644 --- a/.github/workflows/maven-deploy.yml +++ b/.github/workflows/maven-deploy.yml @@ -12,7 +12,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '17' distribution: 'temurin' - name: Publish package run: mvn --batch-mode deploy