From 1ddf1de64b7a7b8e51db84c371539eae06900c88 Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Thu, 27 Oct 2022 14:04:02 +0100 Subject: [PATCH 1/9] Initial template of public test suite Various classes aren't loading correctly, need to figure out why that's the case... --- .../commandapi/test/CustomServerMock.java | 72 +++++++++++ .../java/dev/jorel/commandapi/test/Mut.java | 50 ++++++++ examples/commandtestsuite/README.md | 27 ++++ examples/commandtestsuite/pom.xml | 115 ++++++++++++++++++ .../main/java/io/github/jorelali/Main.java | 33 +++++ .../java/io/github/jorelali/MyCommands.java | 90 ++++++++++++++ .../src/main/resources/plugin.yml | 6 + .../java/io/github/jorelali/TestSuite.java | 78 ++++++++++++ .../src/test/resources/plugin.yml | 6 + 9 files changed, 477 insertions(+) create mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java create mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Mut.java create mode 100644 examples/commandtestsuite/README.md create mode 100644 examples/commandtestsuite/pom.xml create mode 100644 examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java create mode 100644 examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java create mode 100644 examples/commandtestsuite/src/main/resources/plugin.yml create mode 100644 examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java create mode 100644 examples/commandtestsuite/src/test/resources/plugin.yml diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java new file mode 100644 index 0000000000..d4c6978bca --- /dev/null +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java @@ -0,0 +1,72 @@ +package dev.jorel.commandapi.test; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.ParseResults; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestion; +import com.mojang.brigadier.suggestion.Suggestions; + +import be.seeseemelk.mockbukkit.AsyncCatcher; +import be.seeseemelk.mockbukkit.ServerMock; +import dev.jorel.commandapi.Brigadier; + +public class CustomServerMock extends ServerMock { + + @SuppressWarnings("unchecked") + public boolean dispatchThrowableCommand(CommandSender sender, String commandLine) throws CommandSyntaxException{ + String[] commands = commandLine.split(" "); + String commandLabel = commands[0]; + Command command = getCommandMap().getCommand(commandLabel); + + if(command != null) { + return super.dispatchCommand(sender, commandLine); + } else { + AsyncCatcher.catchOp("command dispatch"); + @SuppressWarnings("rawtypes") + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + return dispatcher.execute(commandLine, css) != 0; + } + } + + @Override + public boolean dispatchCommand(CommandSender sender, String commandLine) { + try { + return dispatchThrowableCommand(sender, commandLine); + } catch (CommandSyntaxException e1) { + return false; + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public List getSuggestions(CommandSender sender, String commandLine) { + AsyncCatcher.catchOp("command tabcomplete"); + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + ParseResults parseResults = dispatcher.parse(commandLine, css); + Suggestions suggestions = null; + try { + suggestions = (Suggestions) dispatcher.getCompletionSuggestions(parseResults).get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + + List suggestionsAsStrings = new ArrayList<>(); + for(Suggestion suggestion : suggestions.getList()) { + suggestionsAsStrings.add(suggestion.getText()); + } + + return suggestionsAsStrings; + } + + @Override + public boolean shouldSendChatPreviews() { + return true; + } +} diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Mut.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Mut.java new file mode 100644 index 0000000000..5a8b47b24c --- /dev/null +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Mut.java @@ -0,0 +1,50 @@ +package dev.jorel.commandapi.test; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.NoSuchElementException; +import java.util.Optional; + +/** + * A mutable wrapper of an object, as a list + * + * @param + */ +public class Mut { + + public static Mut of() { + return new Mut(); + } + + public static Mut of(T obj) { + return new Mut(obj); + } + + private final Deque> value; + + private Mut() { + value = new ArrayDeque<>(); + } + + private Mut(T obj) { + this(); + set(obj); + } + + public void set(T obj) { + this.value.add(Optional.ofNullable(obj)); + } + + public T get() { + if(this.value.size() == 0) { + throw new NoSuchElementException(); + } else { + return this.value.remove().orElse(null); + } + } + + @Override + public String toString() { + return String.valueOf(value); + } + +} diff --git a/examples/commandtestsuite/README.md b/examples/commandtestsuite/README.md new file mode 100644 index 0000000000..257519b1ee --- /dev/null +++ b/examples/commandtestsuite/README.md @@ -0,0 +1,27 @@ +# Maven-shaded + +A simple example of shading the CommandAPI with Maven. + +Key points: + +- In `Main.java`, we call `CommandAPI.onLoad()` and `CommandAPI.onEnable()` to set up the CommandAPI +- In `pom.xml`, we use relocation to relocate the CommandAPI to the `io.github.jorelali.commandapi` package. This gives us the following directory structure in our plugin's `.jar` file: + +```text +. +├── io +│ └── github +│ └── jorelali +│ ├── commandapi +│ │ ├── arguments +│ │ │ ├── AdvancementArgument.class +│ │ │ └── ... +│ │ ├── CommandAPI.class +│ │ ├── CommandAPICommand.class +│ │ └── ... +│ ├── Main.class +│ └── MyCommands.class +├── META-INF +│ └── MANIFEST.MF +└── plugin.yml +``` diff --git a/examples/commandtestsuite/pom.xml b/examples/commandtestsuite/pom.xml new file mode 100644 index 0000000000..dc868db906 --- /dev/null +++ b/examples/commandtestsuite/pom.xml @@ -0,0 +1,115 @@ + + 4.0.0 + dev.jorel + commandtestsuite + 0.0.1-SNAPSHOT + + + UTF-8 + + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + + minecraft-libraries + https://libraries.minecraft.net + + + + + + + org.spigotmc + spigot-api + 1.18-R0.1-SNAPSHOT + provided + + + dev.jorel + commandapi-shade + 8.5.1 + + + + + dev.jorel + commandapi-plugin-test + 8.6.0-SNAPSHOT + + + + + com.github.seeseemelk + MockBukkit-v1.19 + 2.29.0 + + + org.junit.jupiter + junit-jupiter-engine + 5.8.2 + test + + + org.mockito + mockito-core + 4.6.1 + + + + com.mojang + brigadier + 1.0.17 + provided + + + + + clean package + + + maven-compiler-plugin + 3.8.1 + + 16 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.0 + + false + + + + org.apache.maven.plugins + maven-shade-plugin + 3.3.0 + + + shade + package + + shade + + + false + + + dev.jorel.commandapi + io.github.jorelali.commandapi + + + + + + + + + \ No newline at end of file diff --git a/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java b/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java new file mode 100644 index 0000000000..d6baf17524 --- /dev/null +++ b/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java @@ -0,0 +1,33 @@ +package io.github.jorelali; + +import java.io.File; + +import org.bukkit.plugin.java.JavaPlugin; + +import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.CommandAPIConfig; + +public class Main extends JavaPlugin { + + @Override + public void onLoad() { + // Load the CommandAPI. We enable verbose logging and allow the CommandAPI + // to generate a file command_registration.json for debugging purposes + CommandAPI.onLoad( + new CommandAPIConfig() + .verboseOutput(true) + .dispatcherFile(new File(getDataFolder(), "command_registration.json")) + ); + } + + @Override + public void onEnable() { + // Enable the CommandAPI + CommandAPI.onEnable(this); + + MyCommands myCommands = new MyCommands(this); + myCommands.registerAllCommands(); + myCommands.registerAllCommandTrees(); + } + +} diff --git a/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java b/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java new file mode 100644 index 0000000000..ac268b1cfb --- /dev/null +++ b/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java @@ -0,0 +1,90 @@ +package io.github.jorelali; + +import dev.jorel.commandapi.CommandTree; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import dev.jorel.commandapi.CommandAPICommand; +import dev.jorel.commandapi.arguments.LocationArgument; +import dev.jorel.commandapi.arguments.LocationType; +import dev.jorel.commandapi.arguments.PlayerArgument; +import dev.jorel.commandapi.arguments.PotionEffectArgument; + +public class MyCommands { + + // Plugin reference in case we need to access anything about the plugin, + // such as its config.yml or something + private Plugin plugin; + + public MyCommands(Plugin plugin) { + this.plugin = plugin; + } + + public void registerAllCommands() { + // /break + // Breaks a block at . Can only be executed by a player + new CommandAPICommand("break") + // We want to target blocks in particular, so use BLOCK_POSITION + .withArguments(new LocationArgument("block", LocationType.BLOCK_POSITION)) + .executesPlayer((player, args) -> { + ((Location) args[0]).getBlock().breakNaturally(); + }) + .register(); + + // /myeffect + // Applies a potion effect to a player. Basically a simple version of + // the /effect command. The potion effect with be a level 1 potion + // effect and the duration will be 5 minutes (300 seconds x 20 ticks) + new CommandAPICommand("myeffect") + .withArguments(new PlayerArgument("target")) + .withArguments(new PotionEffectArgument("potion")) + .executes((sender, args) -> { + Player target = (Player) args[0]; + PotionEffectType potionEffectType = (PotionEffectType) args[1]; + target.addPotionEffect(new PotionEffect(potionEffectType, 300 * 20, 1)); + }) + .register(); + } + + public void registerAllCommandTrees() { + // This is a different method of registering commands + // Just for demonstration purposes I will use the same commands + // that have been registered in registerAllCommands() + + // /break + new CommandTree("break") + .then(new LocationArgument("block", LocationType.BLOCK_POSITION) + .executesPlayer((player, args) -> { + ((Location) args[0]).getBlock().breakNaturally(); + })) + .register(); + + // /myeffect + // This command will be changed a bit to demonstrate + // a way of optional arguments because it is not possible to + // add optional arguments using the CommandAPICommand method + new CommandTree("myeffect") + .then(new PotionEffectArgument("potion") + .executesPlayer((player, args) -> { + // Register /myeffect + // This command just adds the potion effect to the player that + // executes the command + PotionEffectType potionEffectType = (PotionEffectType) args[0]; + player.addPotionEffect(new PotionEffect(potionEffectType, 300 * 20, 1)); + }) + .then(new PlayerArgument("target") + .executes((sender, args) -> { + // Register /myeffect + // This command works exactly the same as the example + // shown in registerAllCommands() + PotionEffectType potionEffectType = (PotionEffectType) args[0]; + Player target = (Player) args[1]; + target.addPotionEffect(new PotionEffect(potionEffectType, 300 * 20, 1)); + }))) + .register(); + } + +} diff --git a/examples/commandtestsuite/src/main/resources/plugin.yml b/examples/commandtestsuite/src/main/resources/plugin.yml new file mode 100644 index 0000000000..b57b948be8 --- /dev/null +++ b/examples/commandtestsuite/src/main/resources/plugin.yml @@ -0,0 +1,6 @@ +name: Example Plugin +main: io.github.jorelali.Main +version: 0.0.1 +author: Skepter +website: https://www.jorel.dev/CommandAPI/ +api-version: 1.13 \ No newline at end of file diff --git a/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java b/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java new file mode 100644 index 0000000000..c9f5158a51 --- /dev/null +++ b/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java @@ -0,0 +1,78 @@ +package io.github.jorelali; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; + +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.entity.PlayerMock; +import dev.jorel.commandapi.CommandAPI; +import dev.jorel.commandapi.CommandAPICommand; +import dev.jorel.commandapi.CommandAPIConfig; +import dev.jorel.commandapi.nms.NMS_1_19_1_R1; +import dev.jorel.commandapi.test.CustomServerMock; +import dev.jorel.commandapi.test.MockNMS; + +public class TestSuite { + + private CustomServerMock server; + private Main plugin; + + private String getDispatcherString() { + try { + return Files.readString(new File("command_registration.json").toPath()); + } catch (IOException e) { + return ""; + } + } + + public void assertInvalidSyntax(CommandSender sender, String command) { + assertThrows(CommandSyntaxException.class, () -> assertTrue(server.dispatchThrowableCommand(sender,command))); + } + + @BeforeEach + public void setUp() { + server = MockBukkit.mock(new CustomServerMock()); + + // Pre-load the CommandAPI, using a specified NMS + // CommandAPI.onLoad(new CommandAPIConfig().setCustomNMS(new MockNMS(new NMS_1_19_R1()))); + + plugin = MockBukkit.load(Main.class); + } + + @AfterEach + public void tearDown() { + Bukkit.getScheduler().cancelTasks(plugin); + if(plugin != null) { + plugin.onDisable(); + } + MockBukkit.unmock(); + } + + @Test + public void executionTest() { + new CommandAPICommand("test") + .executesPlayer((player, args) -> { + player.sendMessage("success"); + }) + .register(); + + PlayerMock player = server.addPlayer(); + boolean commandResult = server.dispatchCommand(player, "test"); + assertTrue(commandResult); + assertEquals("success", player.nextMessage()); + } + +} diff --git a/examples/commandtestsuite/src/test/resources/plugin.yml b/examples/commandtestsuite/src/test/resources/plugin.yml new file mode 100644 index 0000000000..b57b948be8 --- /dev/null +++ b/examples/commandtestsuite/src/test/resources/plugin.yml @@ -0,0 +1,6 @@ +name: Example Plugin +main: io.github.jorelali.Main +version: 0.0.1 +author: Skepter +website: https://www.jorel.dev/CommandAPI/ +api-version: 1.13 \ No newline at end of file From 6e6bbe865310f854ba48e2dea630588ac8a71154 Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Thu, 27 Oct 2022 14:33:08 +0100 Subject: [PATCH 2/9] Fix NMS linking issues. Work on adding a "valid command" test --- .gitignore | 4 ++ .../commandapi/test/CustomServerMock.java | 17 ++++++++ examples/commandtestsuite/pom.xml | 6 ++- .../main/java/io/github/jorelali/Main.java | 12 +++++- .../java/io/github/jorelali/MyCommands.java | 39 ------------------- .../java/io/github/jorelali/TestSuite.java | 22 ++++------- 6 files changed, 43 insertions(+), 57 deletions(-) diff --git a/.gitignore b/.gitignore index c681da171e..ae37c0068e 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,10 @@ target build **/logs/*.log **/logs/*.log.gz +logs/latest.log +**/logs/* +commandapi-plugin/dependency-reduced-pom.xml +commandapi-shade/dependency-reduced-pom.xml .vscode .DS_Store docssrc/src/.markdownlint-cli2.yaml diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java index d4c6978bca..02e39d26ce 100644 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java @@ -44,6 +44,23 @@ public boolean dispatchCommand(CommandSender sender, String commandLine) { } } + public boolean isValidCommandAPICommand(CommandSender sender, String commandLine) { + String[] commands = commandLine.split(" "); + String commandLabel = commands[0]; + Command command = getCommandMap().getCommand(commandLabel); + + if(command != null) { + return false; + } else { + AsyncCatcher.catchOp("command dispatch"); + @SuppressWarnings("rawtypes") + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + ParseResults results = dispatcher.parse(commandLine, css); + return results.getExceptions().size() == 0; + } + } + @SuppressWarnings({ "rawtypes", "unchecked" }) public List getSuggestions(CommandSender sender, String commandLine) { AsyncCatcher.catchOp("command tabcomplete"); diff --git a/examples/commandtestsuite/pom.xml b/examples/commandtestsuite/pom.xml index dc868db906..6b8b65e521 100644 --- a/examples/commandtestsuite/pom.xml +++ b/examples/commandtestsuite/pom.xml @@ -26,8 +26,10 @@ org.spigotmc - spigot-api - 1.18-R0.1-SNAPSHOT + + spigot + + 1.19.2-R0.1-SNAPSHOT provided diff --git a/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java b/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java index d6baf17524..2f049d7e8a 100644 --- a/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java +++ b/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java @@ -2,13 +2,24 @@ import java.io.File; +import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPluginLoader; import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIConfig; public class Main extends JavaPlugin { + // Additional constructors required for MockBukkit + public Main() { + super(); + } + + public Main(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { + super(loader, description, dataFolder, file); + } + @Override public void onLoad() { // Load the CommandAPI. We enable verbose logging and allow the CommandAPI @@ -27,7 +38,6 @@ public void onEnable() { MyCommands myCommands = new MyCommands(this); myCommands.registerAllCommands(); - myCommands.registerAllCommandTrees(); } } diff --git a/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java b/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java index ac268b1cfb..41e103c490 100644 --- a/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java +++ b/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java @@ -1,6 +1,5 @@ package io.github.jorelali; -import dev.jorel.commandapi.CommandTree; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; @@ -49,42 +48,4 @@ public void registerAllCommands() { .register(); } - public void registerAllCommandTrees() { - // This is a different method of registering commands - // Just for demonstration purposes I will use the same commands - // that have been registered in registerAllCommands() - - // /break - new CommandTree("break") - .then(new LocationArgument("block", LocationType.BLOCK_POSITION) - .executesPlayer((player, args) -> { - ((Location) args[0]).getBlock().breakNaturally(); - })) - .register(); - - // /myeffect - // This command will be changed a bit to demonstrate - // a way of optional arguments because it is not possible to - // add optional arguments using the CommandAPICommand method - new CommandTree("myeffect") - .then(new PotionEffectArgument("potion") - .executesPlayer((player, args) -> { - // Register /myeffect - // This command just adds the potion effect to the player that - // executes the command - PotionEffectType potionEffectType = (PotionEffectType) args[0]; - player.addPotionEffect(new PotionEffect(potionEffectType, 300 * 20, 1)); - }) - .then(new PlayerArgument("target") - .executes((sender, args) -> { - // Register /myeffect - // This command works exactly the same as the example - // shown in registerAllCommands() - PotionEffectType potionEffectType = (PotionEffectType) args[0]; - Player target = (Player) args[1]; - target.addPotionEffect(new PotionEffect(potionEffectType, 300 * 20, 1)); - }))) - .register(); - } - } diff --git a/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java b/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java index c9f5158a51..72aa86ad71 100644 --- a/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java +++ b/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java @@ -1,6 +1,6 @@ package io.github.jorelali; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -19,9 +19,8 @@ import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.entity.PlayerMock; import dev.jorel.commandapi.CommandAPI; -import dev.jorel.commandapi.CommandAPICommand; import dev.jorel.commandapi.CommandAPIConfig; -import dev.jorel.commandapi.nms.NMS_1_19_1_R1; +import dev.jorel.commandapi.nms.NMS_1_19_R1; import dev.jorel.commandapi.test.CustomServerMock; import dev.jorel.commandapi.test.MockNMS; @@ -45,13 +44,13 @@ public void assertInvalidSyntax(CommandSender sender, String command) { @BeforeEach public void setUp() { server = MockBukkit.mock(new CustomServerMock()); - + // Pre-load the CommandAPI, using a specified NMS - // CommandAPI.onLoad(new CommandAPIConfig().setCustomNMS(new MockNMS(new NMS_1_19_R1()))); + CommandAPI.onLoad(new CommandAPIConfig().setCustomNMS(new MockNMS(new NMS_1_19_R1()))); plugin = MockBukkit.load(Main.class); } - + @AfterEach public void tearDown() { Bukkit.getScheduler().cancelTasks(plugin); @@ -63,16 +62,9 @@ public void tearDown() { @Test public void executionTest() { - new CommandAPICommand("test") - .executesPlayer((player, args) -> { - player.sendMessage("success"); - }) - .register(); - PlayerMock player = server.addPlayer(); - boolean commandResult = server.dispatchCommand(player, "test"); - assertTrue(commandResult); - assertEquals("success", player.nextMessage()); + assertFalse(server.isValidCommandAPICommand(player, "break ~ ~ ~ ~")); + assertTrue(server.isValidCommandAPICommand(player, "break ~ ~ ~")); } } From 2d35f101bd220e20faacd46205dee013eb9f0d7b Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Tue, 1 Nov 2022 17:45:05 +0000 Subject: [PATCH 3/9] Rename some classes. Adds ArgumentInspector to CommandAPITestCommand --- .../pom.xml | 1 - .../test/{Mut.java => ArgumentInspector.java} | 17 ++--- .../dev/jorel/commandapi/test/Assertions.java | 22 ++++++ ...verMock.java => CommandAPIServerMock.java} | 2 +- .../test/CommandAPITestCommand.java | 69 +++++++++++++++++++ .../java/io/github/jorelali/TestSuite.java | 6 +- 6 files changed, 99 insertions(+), 18 deletions(-) rename commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/{Mut.java => ArgumentInspector.java} (74%) create mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java rename commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/{CustomServerMock.java => CommandAPIServerMock.java} (98%) create mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/pom.xml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/pom.xml index 1ace64eff9..a544f46c2a 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/pom.xml +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-impl-1.16.5/pom.xml @@ -68,7 +68,6 @@ org.junit.jupiter junit-jupiter-engine 5.8.2 - test org.mockito diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Mut.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java similarity index 74% rename from commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Mut.java rename to commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java index 5a8b47b24c..2e25421f25 100644 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Mut.java +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java @@ -9,27 +9,18 @@ * * @param */ -public class Mut { +public class ArgumentInspector { - public static Mut of() { - return new Mut(); - } - - public static Mut of(T obj) { - return new Mut(obj); + public static ArgumentInspector of() { + return new ArgumentInspector(); } private final Deque> value; - private Mut() { + private ArgumentInspector() { value = new ArrayDeque<>(); } - private Mut(T obj) { - this(); - set(obj); - } - public void set(T obj) { this.value.add(Optional.ofNullable(obj)); } diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java new file mode 100644 index 0000000000..ed90b7d5f2 --- /dev/null +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java @@ -0,0 +1,22 @@ +package dev.jorel.commandapi.test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.bukkit.command.CommandSender; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; + +public class Assertions { + + /** + * Checks if the command has invalid syntax (would show up as red in the client) + * @param server the server instance + * @param sender the command sender + * @param command the command that the command sender would run (without the leading {@code /}) + */ + public static void assertInvalidSyntax(CommandAPIServerMock server, CommandSender sender, String command) { + assertThrows(CommandSyntaxException.class, () -> assertTrue(server.dispatchThrowableCommand(sender,command))); + } + +} diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java similarity index 98% rename from commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java rename to commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java index 02e39d26ce..4f427189aa 100644 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CustomServerMock.java +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java @@ -16,7 +16,7 @@ import be.seeseemelk.mockbukkit.ServerMock; import dev.jorel.commandapi.Brigadier; -public class CustomServerMock extends ServerMock { +public class CommandAPIServerMock extends ServerMock { @SuppressWarnings("unchecked") public boolean dispatchThrowableCommand(CommandSender sender, String commandLine) throws CommandSyntaxException{ diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java new file mode 100644 index 0000000000..0fa79369dd --- /dev/null +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java @@ -0,0 +1,69 @@ +package dev.jorel.commandapi.test; + +import java.util.ListIterator; + +import dev.jorel.commandapi.CommandAPICommand; +import dev.jorel.commandapi.CustomCommandExecutor; +import dev.jorel.commandapi.executors.IExecutorNormal; +import dev.jorel.commandapi.executors.IExecutorResulting; + +public class CommandAPITestCommand extends CommandAPICommand { + + @SuppressWarnings("rawtypes") + private final ArgumentInspector listener; + + public CommandAPITestCommand(String commandName) { + this(commandName, null); + } + + public CommandAPITestCommand(String commandName, @SuppressWarnings("rawtypes") ArgumentInspector listener) { + super(commandName); + this.listener = listener; + } + + // Replace all executors with our 'testing' executor + @SuppressWarnings({ "rawtypes", "unchecked" }) + private void mapExecutor(CustomCommandExecutor customCommandExecutor) { + // Do normal executors + { + ListIterator it = customCommandExecutor.getNormalExecutors().listIterator(); + while(it.hasNext()) { + IExecutorNormal executor = (IExecutorNormal) it.next(); + IExecutorNormal newExecutor = (sender, args) -> { + for(Object arg : args) { + listener.set(arg); + } + executor.executeWith(sender, args); + }; + it.set(newExecutor); + } + } + + // And now do resulting executors + { + ListIterator it = customCommandExecutor.getResultingExecutors().listIterator(); + while(it.hasNext()) { + IExecutorResulting executor = (IExecutorResulting) it.next(); + IExecutorResulting newExecutor = (sender, args) -> { + for(Object arg : args) { + listener.set(arg); + } + return executor.executeWith(sender, args); + }; + it.set(newExecutor); + } + } + } + + @Override + public void register() { + if(this.listener != null) { + mapExecutor(this.executor); + for (CommandAPICommand subcommand : this.getSubcommands()) { + mapExecutor(subcommand.getExecutor()); + } + } + super.register(); + } + +} diff --git a/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java b/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java index 72aa86ad71..4626f362fe 100644 --- a/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java +++ b/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java @@ -21,12 +21,12 @@ import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIConfig; import dev.jorel.commandapi.nms.NMS_1_19_R1; -import dev.jorel.commandapi.test.CustomServerMock; +import dev.jorel.commandapi.test.CommandAPIServerMock; import dev.jorel.commandapi.test.MockNMS; public class TestSuite { - private CustomServerMock server; + private CommandAPIServerMock server; private Main plugin; private String getDispatcherString() { @@ -43,7 +43,7 @@ public void assertInvalidSyntax(CommandSender sender, String command) { @BeforeEach public void setUp() { - server = MockBukkit.mock(new CustomServerMock()); + server = MockBukkit.mock(new CommandAPIServerMock()); // Pre-load the CommandAPI, using a specified NMS CommandAPI.onLoad(new CommandAPIConfig().setCustomNMS(new MockNMS(new NMS_1_19_R1()))); From f78da97e2f0de7f38c35c0b176b85e08dffbeaa0 Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Thu, 22 Jun 2023 21:15:02 +0100 Subject: [PATCH 4/9] Yeet the commandapi-plugin-test code into oblivion, we (probably) don't need it anymore --- .../commandapi/test/ArgumentInspector.java | 41 --------- .../dev/jorel/commandapi/test/Assertions.java | 22 ----- .../commandapi/test/CommandAPIServerMock.java | 89 ------------------- .../test/CommandAPITestCommand.java | 69 -------------- 4 files changed, 221 deletions(-) delete mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java delete mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java delete mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java delete mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java deleted file mode 100644 index 2e25421f25..0000000000 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java +++ /dev/null @@ -1,41 +0,0 @@ -package dev.jorel.commandapi.test; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.NoSuchElementException; -import java.util.Optional; - -/** - * A mutable wrapper of an object, as a list - * - * @param - */ -public class ArgumentInspector { - - public static ArgumentInspector of() { - return new ArgumentInspector(); - } - - private final Deque> value; - - private ArgumentInspector() { - value = new ArrayDeque<>(); - } - - public void set(T obj) { - this.value.add(Optional.ofNullable(obj)); - } - - public T get() { - if(this.value.size() == 0) { - throw new NoSuchElementException(); - } else { - return this.value.remove().orElse(null); - } - } - - @Override - public String toString() { - return String.valueOf(value); - } - -} diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java deleted file mode 100644 index ed90b7d5f2..0000000000 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.jorel.commandapi.test; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.bukkit.command.CommandSender; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; - -public class Assertions { - - /** - * Checks if the command has invalid syntax (would show up as red in the client) - * @param server the server instance - * @param sender the command sender - * @param command the command that the command sender would run (without the leading {@code /}) - */ - public static void assertInvalidSyntax(CommandAPIServerMock server, CommandSender sender, String command) { - assertThrows(CommandSyntaxException.class, () -> assertTrue(server.dispatchThrowableCommand(sender,command))); - } - -} diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java deleted file mode 100644 index 4f427189aa..0000000000 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java +++ /dev/null @@ -1,89 +0,0 @@ -package dev.jorel.commandapi.test; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.ParseResults; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestion; -import com.mojang.brigadier.suggestion.Suggestions; - -import be.seeseemelk.mockbukkit.AsyncCatcher; -import be.seeseemelk.mockbukkit.ServerMock; -import dev.jorel.commandapi.Brigadier; - -public class CommandAPIServerMock extends ServerMock { - - @SuppressWarnings("unchecked") - public boolean dispatchThrowableCommand(CommandSender sender, String commandLine) throws CommandSyntaxException{ - String[] commands = commandLine.split(" "); - String commandLabel = commands[0]; - Command command = getCommandMap().getCommand(commandLabel); - - if(command != null) { - return super.dispatchCommand(sender, commandLine); - } else { - AsyncCatcher.catchOp("command dispatch"); - @SuppressWarnings("rawtypes") - CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); - Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); - return dispatcher.execute(commandLine, css) != 0; - } - } - - @Override - public boolean dispatchCommand(CommandSender sender, String commandLine) { - try { - return dispatchThrowableCommand(sender, commandLine); - } catch (CommandSyntaxException e1) { - return false; - } - } - - public boolean isValidCommandAPICommand(CommandSender sender, String commandLine) { - String[] commands = commandLine.split(" "); - String commandLabel = commands[0]; - Command command = getCommandMap().getCommand(commandLabel); - - if(command != null) { - return false; - } else { - AsyncCatcher.catchOp("command dispatch"); - @SuppressWarnings("rawtypes") - CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); - Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); - ParseResults results = dispatcher.parse(commandLine, css); - return results.getExceptions().size() == 0; - } - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public List getSuggestions(CommandSender sender, String commandLine) { - AsyncCatcher.catchOp("command tabcomplete"); - CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); - Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); - ParseResults parseResults = dispatcher.parse(commandLine, css); - Suggestions suggestions = null; - try { - suggestions = (Suggestions) dispatcher.getCompletionSuggestions(parseResults).get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - - List suggestionsAsStrings = new ArrayList<>(); - for(Suggestion suggestion : suggestions.getList()) { - suggestionsAsStrings.add(suggestion.getText()); - } - - return suggestionsAsStrings; - } - - @Override - public boolean shouldSendChatPreviews() { - return true; - } -} diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java deleted file mode 100644 index 0fa79369dd..0000000000 --- a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java +++ /dev/null @@ -1,69 +0,0 @@ -package dev.jorel.commandapi.test; - -import java.util.ListIterator; - -import dev.jorel.commandapi.CommandAPICommand; -import dev.jorel.commandapi.CustomCommandExecutor; -import dev.jorel.commandapi.executors.IExecutorNormal; -import dev.jorel.commandapi.executors.IExecutorResulting; - -public class CommandAPITestCommand extends CommandAPICommand { - - @SuppressWarnings("rawtypes") - private final ArgumentInspector listener; - - public CommandAPITestCommand(String commandName) { - this(commandName, null); - } - - public CommandAPITestCommand(String commandName, @SuppressWarnings("rawtypes") ArgumentInspector listener) { - super(commandName); - this.listener = listener; - } - - // Replace all executors with our 'testing' executor - @SuppressWarnings({ "rawtypes", "unchecked" }) - private void mapExecutor(CustomCommandExecutor customCommandExecutor) { - // Do normal executors - { - ListIterator it = customCommandExecutor.getNormalExecutors().listIterator(); - while(it.hasNext()) { - IExecutorNormal executor = (IExecutorNormal) it.next(); - IExecutorNormal newExecutor = (sender, args) -> { - for(Object arg : args) { - listener.set(arg); - } - executor.executeWith(sender, args); - }; - it.set(newExecutor); - } - } - - // And now do resulting executors - { - ListIterator it = customCommandExecutor.getResultingExecutors().listIterator(); - while(it.hasNext()) { - IExecutorResulting executor = (IExecutorResulting) it.next(); - IExecutorResulting newExecutor = (sender, args) -> { - for(Object arg : args) { - listener.set(arg); - } - return executor.executeWith(sender, args); - }; - it.set(newExecutor); - } - } - } - - @Override - public void register() { - if(this.listener != null) { - mapExecutor(this.executor); - for (CommandAPICommand subcommand : this.getSubcommands()) { - mapExecutor(subcommand.getExecutor()); - } - } - super.register(); - } - -} From 4a4279e2b2be1d6f00f82688ff39b76e58e8af0b Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Thu, 22 Jun 2023 21:30:38 +0100 Subject: [PATCH 5/9] Revert "Yeet the commandapi-plugin-test code into oblivion, we (probably) don't need it anymore" This reverts commit f4fcf2f407a929db253b693815c0a0fd2f2b1abe. --- .../commandapi/test/ArgumentInspector.java | 41 +++++++++ .../dev/jorel/commandapi/test/Assertions.java | 22 +++++ .../commandapi/test/CommandAPIServerMock.java | 89 +++++++++++++++++++ .../test/CommandAPITestCommand.java | 69 ++++++++++++++ 4 files changed, 221 insertions(+) create mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java create mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java create mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java create mode 100644 commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java new file mode 100644 index 0000000000..2e25421f25 --- /dev/null +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java @@ -0,0 +1,41 @@ +package dev.jorel.commandapi.test; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.NoSuchElementException; +import java.util.Optional; + +/** + * A mutable wrapper of an object, as a list + * + * @param + */ +public class ArgumentInspector { + + public static ArgumentInspector of() { + return new ArgumentInspector(); + } + + private final Deque> value; + + private ArgumentInspector() { + value = new ArrayDeque<>(); + } + + public void set(T obj) { + this.value.add(Optional.ofNullable(obj)); + } + + public T get() { + if(this.value.size() == 0) { + throw new NoSuchElementException(); + } else { + return this.value.remove().orElse(null); + } + } + + @Override + public String toString() { + return String.valueOf(value); + } + +} diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java new file mode 100644 index 0000000000..ed90b7d5f2 --- /dev/null +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java @@ -0,0 +1,22 @@ +package dev.jorel.commandapi.test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.bukkit.command.CommandSender; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; + +public class Assertions { + + /** + * Checks if the command has invalid syntax (would show up as red in the client) + * @param server the server instance + * @param sender the command sender + * @param command the command that the command sender would run (without the leading {@code /}) + */ + public static void assertInvalidSyntax(CommandAPIServerMock server, CommandSender sender, String command) { + assertThrows(CommandSyntaxException.class, () -> assertTrue(server.dispatchThrowableCommand(sender,command))); + } + +} diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java new file mode 100644 index 0000000000..4f427189aa --- /dev/null +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java @@ -0,0 +1,89 @@ +package dev.jorel.commandapi.test; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.ParseResults; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestion; +import com.mojang.brigadier.suggestion.Suggestions; + +import be.seeseemelk.mockbukkit.AsyncCatcher; +import be.seeseemelk.mockbukkit.ServerMock; +import dev.jorel.commandapi.Brigadier; + +public class CommandAPIServerMock extends ServerMock { + + @SuppressWarnings("unchecked") + public boolean dispatchThrowableCommand(CommandSender sender, String commandLine) throws CommandSyntaxException{ + String[] commands = commandLine.split(" "); + String commandLabel = commands[0]; + Command command = getCommandMap().getCommand(commandLabel); + + if(command != null) { + return super.dispatchCommand(sender, commandLine); + } else { + AsyncCatcher.catchOp("command dispatch"); + @SuppressWarnings("rawtypes") + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + return dispatcher.execute(commandLine, css) != 0; + } + } + + @Override + public boolean dispatchCommand(CommandSender sender, String commandLine) { + try { + return dispatchThrowableCommand(sender, commandLine); + } catch (CommandSyntaxException e1) { + return false; + } + } + + public boolean isValidCommandAPICommand(CommandSender sender, String commandLine) { + String[] commands = commandLine.split(" "); + String commandLabel = commands[0]; + Command command = getCommandMap().getCommand(commandLabel); + + if(command != null) { + return false; + } else { + AsyncCatcher.catchOp("command dispatch"); + @SuppressWarnings("rawtypes") + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + ParseResults results = dispatcher.parse(commandLine, css); + return results.getExceptions().size() == 0; + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public List getSuggestions(CommandSender sender, String commandLine) { + AsyncCatcher.catchOp("command tabcomplete"); + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + ParseResults parseResults = dispatcher.parse(commandLine, css); + Suggestions suggestions = null; + try { + suggestions = (Suggestions) dispatcher.getCompletionSuggestions(parseResults).get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + + List suggestionsAsStrings = new ArrayList<>(); + for(Suggestion suggestion : suggestions.getList()) { + suggestionsAsStrings.add(suggestion.getText()); + } + + return suggestionsAsStrings; + } + + @Override + public boolean shouldSendChatPreviews() { + return true; + } +} diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java new file mode 100644 index 0000000000..0fa79369dd --- /dev/null +++ b/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java @@ -0,0 +1,69 @@ +package dev.jorel.commandapi.test; + +import java.util.ListIterator; + +import dev.jorel.commandapi.CommandAPICommand; +import dev.jorel.commandapi.CustomCommandExecutor; +import dev.jorel.commandapi.executors.IExecutorNormal; +import dev.jorel.commandapi.executors.IExecutorResulting; + +public class CommandAPITestCommand extends CommandAPICommand { + + @SuppressWarnings("rawtypes") + private final ArgumentInspector listener; + + public CommandAPITestCommand(String commandName) { + this(commandName, null); + } + + public CommandAPITestCommand(String commandName, @SuppressWarnings("rawtypes") ArgumentInspector listener) { + super(commandName); + this.listener = listener; + } + + // Replace all executors with our 'testing' executor + @SuppressWarnings({ "rawtypes", "unchecked" }) + private void mapExecutor(CustomCommandExecutor customCommandExecutor) { + // Do normal executors + { + ListIterator it = customCommandExecutor.getNormalExecutors().listIterator(); + while(it.hasNext()) { + IExecutorNormal executor = (IExecutorNormal) it.next(); + IExecutorNormal newExecutor = (sender, args) -> { + for(Object arg : args) { + listener.set(arg); + } + executor.executeWith(sender, args); + }; + it.set(newExecutor); + } + } + + // And now do resulting executors + { + ListIterator it = customCommandExecutor.getResultingExecutors().listIterator(); + while(it.hasNext()) { + IExecutorResulting executor = (IExecutorResulting) it.next(); + IExecutorResulting newExecutor = (sender, args) -> { + for(Object arg : args) { + listener.set(arg); + } + return executor.executeWith(sender, args); + }; + it.set(newExecutor); + } + } + } + + @Override + public void register() { + if(this.listener != null) { + mapExecutor(this.executor); + for (CommandAPICommand subcommand : this.getSubcommands()) { + mapExecutor(subcommand.getExecutor()); + } + } + super.register(); + } + +} From 5ec7c3b60593ec9b610d7f264d0e52c78c787baf Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Thu, 22 Jun 2023 22:15:25 +0100 Subject: [PATCH 6/9] Tidy everything up and adds the first successful actual test. --- .../java/dev/jorel/commandapi/test/Main.java | 1 - .../commandapi/test/ArgumentInspector.java | 0 .../dev/jorel/commandapi/test/Assertions.java | 0 .../commandapi/test/CommandAPIServerMock.java | 0 .../test/CommandAPITestCommand.java | 0 examples/commandtestsuite/pom.xml | 103 +++++++++--------- .../main/java/io/github/jorelali/Main.java | 18 +-- .../java/io/github/jorelali/MyCommands.java | 6 +- .../commandapi/CommandAPIVersionHandler.java | 44 ++++++++ .../commandapi/test/ArgumentInspector.java | 41 +++++++ .../dev/jorel/commandapi/test/Assertions.java | 22 ++++ .../commandapi/test/CommandAPIServerMock.java | 90 +++++++++++++++ .../test/CommandAPITestCommand.java | 64 +++++++++++ .../jorelali/{TestSuite.java => MyTests.java} | 40 ++++--- 14 files changed, 350 insertions(+), 79 deletions(-) rename {commandapi-plugin-test => commandapi-platforms/commandapi-bukkit/commandapi-plugin-test}/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java (100%) rename {commandapi-plugin-test => commandapi-platforms/commandapi-bukkit/commandapi-plugin-test}/src/main/java/dev/jorel/commandapi/test/Assertions.java (100%) rename {commandapi-plugin-test => commandapi-platforms/commandapi-bukkit/commandapi-plugin-test}/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java (100%) rename {commandapi-plugin-test => commandapi-platforms/commandapi-bukkit/commandapi-plugin-test}/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java (100%) create mode 100644 examples/commandtestsuite/src/test/java/dev/jorel/commandapi/CommandAPIVersionHandler.java create mode 100644 examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/ArgumentInspector.java create mode 100644 examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/Assertions.java create mode 100644 examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPIServerMock.java create mode 100644 examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPITestCommand.java rename examples/commandtestsuite/src/test/java/io/github/jorelali/{TestSuite.java => MyTests.java} (59%) diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/Main.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/Main.java index 5b4aaf4461..43c82c3956 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/Main.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test/commandapi-bukkit-test-tests/src/test/java/dev/jorel/commandapi/test/Main.java @@ -6,7 +6,6 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; -import de.tr7zw.changeme.nbtapi.NBTContainer; import dev.jorel.commandapi.CommandAPI; import dev.jorel.commandapi.CommandAPIBukkitConfig; import dev.jorel.commandapi.CommandAPILogger; diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java b/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java similarity index 100% rename from commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java rename to commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java b/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java similarity index 100% rename from commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java rename to commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java b/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java similarity index 100% rename from commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java rename to commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java diff --git a/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java b/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java similarity index 100% rename from commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java rename to commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java diff --git a/examples/commandtestsuite/pom.xml b/examples/commandtestsuite/pom.xml index 6b8b65e521..283f0927db 100644 --- a/examples/commandtestsuite/pom.xml +++ b/examples/commandtestsuite/pom.xml @@ -6,6 +6,7 @@ UTF-8 + 9.0.3 @@ -14,6 +15,10 @@ spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + papermc + https://repo.papermc.io/repository/maven-public/ + @@ -23,34 +28,10 @@ - - - org.spigotmc - - spigot - - 1.19.2-R0.1-SNAPSHOT - provided - - - dev.jorel - commandapi-shade - 8.5.1 - - - - - dev.jorel - commandapi-plugin-test - 8.6.0-SNAPSHOT - - - - com.github.seeseemelk - MockBukkit-v1.19 - 2.29.0 - + org.junit.jupiter junit-jupiter-engine @@ -62,13 +43,56 @@ mockito-core 4.6.1 - + com.mojang brigadier 1.0.17 provided + + + org.apache.logging.log4j + log4j-api + 2.19.0 + provided + + + + + dev.jorel + commandapi-bukkit-shade + ${commandapi.version} + + + dev.jorel + commandapi-bukkit-test-impl-1.20 + ${commandapi.version} + test + + + + + + org.spigotmc + spigot + 1.20.1-R0.1-SNAPSHOT + provided + + + io.papermc.paper + paper-api + 1.20-R0.1-SNAPSHOT + @@ -89,29 +113,6 @@ false - - org.apache.maven.plugins - maven-shade-plugin - 3.3.0 - - - shade - package - - shade - - - false - - - dev.jorel.commandapi - io.github.jorelali.commandapi - - - - - - \ No newline at end of file diff --git a/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java b/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java index 2f049d7e8a..5f81b1fa61 100644 --- a/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java +++ b/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java @@ -7,7 +7,7 @@ import org.bukkit.plugin.java.JavaPluginLoader; import dev.jorel.commandapi.CommandAPI; -import dev.jorel.commandapi.CommandAPIConfig; +import dev.jorel.commandapi.CommandAPIBukkitConfig; public class Main extends JavaPlugin { @@ -25,19 +25,23 @@ public void onLoad() { // Load the CommandAPI. We enable verbose logging and allow the CommandAPI // to generate a file command_registration.json for debugging purposes CommandAPI.onLoad( - new CommandAPIConfig() + new CommandAPIBukkitConfig(this) .verboseOutput(true) - .dispatcherFile(new File(getDataFolder(), "command_registration.json")) - ); + .dispatcherFile(new File(getDataFolder(), "command_registration.json"))); } - + @Override public void onEnable() { // Enable the CommandAPI - CommandAPI.onEnable(this); - + CommandAPI.onEnable(); + MyCommands myCommands = new MyCommands(this); myCommands.registerAllCommands(); } + @Override + public void onDisable() { + CommandAPI.onDisable(); + } + } diff --git a/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java b/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java index 41e103c490..80230de1ea 100644 --- a/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java +++ b/examples/commandtestsuite/src/main/java/io/github/jorelali/MyCommands.java @@ -29,7 +29,7 @@ public void registerAllCommands() { // We want to target blocks in particular, so use BLOCK_POSITION .withArguments(new LocationArgument("block", LocationType.BLOCK_POSITION)) .executesPlayer((player, args) -> { - ((Location) args[0]).getBlock().breakNaturally(); + ((Location) args.get("block")).getBlock().breakNaturally(); }) .register(); @@ -41,8 +41,8 @@ public void registerAllCommands() { .withArguments(new PlayerArgument("target")) .withArguments(new PotionEffectArgument("potion")) .executes((sender, args) -> { - Player target = (Player) args[0]; - PotionEffectType potionEffectType = (PotionEffectType) args[1]; + Player target = (Player) args.get("target"); + PotionEffectType potionEffectType = (PotionEffectType) args.get("potion"); target.addPotionEffect(new PotionEffect(potionEffectType, 300 * 20, 1)); }) .register(); diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/CommandAPIVersionHandler.java b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/CommandAPIVersionHandler.java new file mode 100644 index 0000000000..8b80c2c062 --- /dev/null +++ b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/CommandAPIVersionHandler.java @@ -0,0 +1,44 @@ +package dev.jorel.commandapi; + +import java.util.concurrent.atomic.AtomicReference; + +import dev.jorel.commandapi.nms.NMS_1_19_4_R3; +import dev.jorel.commandapi.nms.NMS_1_20_R1; +import dev.jorel.commandapi.test.MockNMS; + +/** + * This file handles loading the correct platform implementation. The CommandAPIVersionHandler + * file within the commandapi-core module is NOT used at run time. Instead, the platform modules + * replace this class with their own version that handles loads the correct class for their version + */ +public interface CommandAPIVersionHandler { + + static AtomicReference version = new AtomicReference<>(); + + public static void setVersion(Version version) { + CommandAPIVersionHandler.version.set(version); + } + + public static enum Version { + MINECRAFT_1_20, + MINECRAFT_1_19_4; + } + + // The only important thing we care about. + static CommandAPIPlatform getPlatform() { + if(CommandAPIVersionHandler.version.get() == null) { + System.out.println("Using default version 1.19.4"); + return new MockNMS(new NMS_1_19_4_R3()); + } else { + return new MockNMS(switch(CommandAPIVersionHandler.version.get()) { + case MINECRAFT_1_20 -> new NMS_1_20_R1(); + case MINECRAFT_1_19_4 -> new NMS_1_19_4_R3(); +// case "Minecraft_1_19_2" -> new NMS_1_19_1_R1(); +// case "Minecraft_1_18" -> new NMS_1_18_R1(); +// case "Minecraft_1_17" -> new NMS_1_17(); +// case "Minecraft_1_16_5" -> new NMS_1_16_R3(); + default -> throw new IllegalArgumentException("Unsupported version value: " + CommandAPIVersionHandler.version.get()); + }); + } + } +} diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/ArgumentInspector.java b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/ArgumentInspector.java new file mode 100644 index 0000000000..2e25421f25 --- /dev/null +++ b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/ArgumentInspector.java @@ -0,0 +1,41 @@ +package dev.jorel.commandapi.test; +import java.util.ArrayDeque; +import java.util.Deque; +import java.util.NoSuchElementException; +import java.util.Optional; + +/** + * A mutable wrapper of an object, as a list + * + * @param + */ +public class ArgumentInspector { + + public static ArgumentInspector of() { + return new ArgumentInspector(); + } + + private final Deque> value; + + private ArgumentInspector() { + value = new ArrayDeque<>(); + } + + public void set(T obj) { + this.value.add(Optional.ofNullable(obj)); + } + + public T get() { + if(this.value.size() == 0) { + throw new NoSuchElementException(); + } else { + return this.value.remove().orElse(null); + } + } + + @Override + public String toString() { + return String.valueOf(value); + } + +} diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/Assertions.java b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/Assertions.java new file mode 100644 index 0000000000..ed90b7d5f2 --- /dev/null +++ b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/Assertions.java @@ -0,0 +1,22 @@ +package dev.jorel.commandapi.test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.bukkit.command.CommandSender; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; + +public class Assertions { + + /** + * Checks if the command has invalid syntax (would show up as red in the client) + * @param server the server instance + * @param sender the command sender + * @param command the command that the command sender would run (without the leading {@code /}) + */ + public static void assertInvalidSyntax(CommandAPIServerMock server, CommandSender sender, String command) { + assertThrows(CommandSyntaxException.class, () -> assertTrue(server.dispatchThrowableCommand(sender,command))); + } + +} diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPIServerMock.java b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPIServerMock.java new file mode 100644 index 0000000000..d79f132178 --- /dev/null +++ b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPIServerMock.java @@ -0,0 +1,90 @@ +package dev.jorel.commandapi.test; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutionException; + +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.ParseResults; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestion; +import com.mojang.brigadier.suggestion.Suggestions; + +import be.seeseemelk.mockbukkit.AsyncCatcher; +import be.seeseemelk.mockbukkit.ServerMock; +import dev.jorel.commandapi.Brigadier; + +public class CommandAPIServerMock extends ServerMock { + + @SuppressWarnings("unchecked") + public boolean dispatchThrowableCommand(CommandSender sender, String commandLine) throws CommandSyntaxException{ + String[] commands = commandLine.split(" "); + String commandLabel = commands[0]; + Command command = getCommandMap().getCommand(commandLabel); + + if(command != null) { + return super.dispatchCommand(sender, commandLine); + } else { + AsyncCatcher.catchOp("command dispatch"); + @SuppressWarnings("rawtypes") + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + return dispatcher.execute(commandLine, css) != 0; + } + } + + @Override + public boolean dispatchCommand(CommandSender sender, String commandLine) { + try { + return dispatchThrowableCommand(sender, commandLine); + } catch (CommandSyntaxException e1) { + return false; + } + } + + @Deprecated + public boolean isValidCommandAPICommand(CommandSender sender, String commandLine) { + String[] commands = commandLine.split(" "); + String commandLabel = commands[0]; + Command command = getCommandMap().getCommand(commandLabel); + + if(command != null) { + return false; + } else { + AsyncCatcher.catchOp("command dispatch"); + @SuppressWarnings("rawtypes") + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + ParseResults results = dispatcher.parse(commandLine, css); + return results.getExceptions().size() == 0; + } + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public List getSuggestions(CommandSender sender, String commandLine) { + AsyncCatcher.catchOp("command tabcomplete"); + CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); + Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); + ParseResults parseResults = dispatcher.parse(commandLine, css); + Suggestions suggestions = null; + try { + suggestions = (Suggestions) dispatcher.getCompletionSuggestions(parseResults).get(); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + + List suggestionsAsStrings = new ArrayList<>(); + for(Suggestion suggestion : suggestions.getList()) { + suggestionsAsStrings.add(suggestion.getText()); + } + + return suggestionsAsStrings; + } + + @Override + public boolean shouldSendChatPreviews() { + return true; + } +} diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPITestCommand.java b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPITestCommand.java new file mode 100644 index 0000000000..923f699fc6 --- /dev/null +++ b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPITestCommand.java @@ -0,0 +1,64 @@ +package dev.jorel.commandapi.test; + +import dev.jorel.commandapi.CommandAPICommand; + +public class CommandAPITestCommand extends CommandAPICommand { + + @SuppressWarnings("rawtypes") + private final ArgumentInspector listener; + + public CommandAPITestCommand(String commandName) { + this(commandName, null); + } + + public CommandAPITestCommand(String commandName, @SuppressWarnings("rawtypes") ArgumentInspector listener) { + super(commandName); + this.listener = listener; + } + +// // Replace all executors with our 'testing' executor +// @SuppressWarnings({ "rawtypes", "unchecked" }) +// private void mapExecutor(CustomCommandExecutor customCommandExecutor) { +// // Do normal executors +// { +// ListIterator it = customCommandExecutor.getNormalExecutors().listIterator(); +// while(it.hasNext()) { +// IExecutorNormal executor = (IExecutorNormal) it.next(); +// IExecutorNormal newExecutor = (sender, args) -> { +// for(Object arg : args) { +// listener.set(arg); +// } +// executor.executeWith(sender, args); +// }; +// it.set(newExecutor); +// } +// } +// +// // And now do resulting executors +// { +// ListIterator it = customCommandExecutor.getResultingExecutors().listIterator(); +// while(it.hasNext()) { +// IExecutorResulting executor = (IExecutorResulting) it.next(); +// IExecutorResulting newExecutor = (sender, args) -> { +// for(Object arg : args) { +// listener.set(arg); +// } +// return executor.executeWith(sender, args); +// }; +// it.set(newExecutor); +// } +// } +// } +// +// @Override +// public void register() { +// if(this.listener != null) { +// mapExecutor(this.executor); +// for (CommandAPICommand subcommand : this.getSubcommands()) { +// mapExecutor(subcommand.getExecutor()); +// } +// } +// super.register(); +// } + +} diff --git a/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java b/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java similarity index 59% rename from examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java rename to examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java index 4626f362fe..0687a854ce 100644 --- a/examples/commandtestsuite/src/test/java/io/github/jorelali/TestSuite.java +++ b/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java @@ -1,6 +1,6 @@ package io.github.jorelali; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -18,13 +18,12 @@ import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.entity.PlayerMock; -import dev.jorel.commandapi.CommandAPI; -import dev.jorel.commandapi.CommandAPIConfig; -import dev.jorel.commandapi.nms.NMS_1_19_R1; +import dev.jorel.commandapi.CommandAPIVersionHandler; +import dev.jorel.commandapi.CommandAPIVersionHandler.Version; import dev.jorel.commandapi.test.CommandAPIServerMock; -import dev.jorel.commandapi.test.MockNMS; +import dev.jorel.commandapi.test.MockPlatform; -public class TestSuite { +public class MyTests { private CommandAPIServerMock server; private Main plugin; @@ -43,28 +42,35 @@ public void assertInvalidSyntax(CommandSender sender, String command) { @BeforeEach public void setUp() { + CommandAPIVersionHandler.setVersion(Version.MINECRAFT_1_20); server = MockBukkit.mock(new CommandAPIServerMock()); - - // Pre-load the CommandAPI, using a specified NMS - CommandAPI.onLoad(new CommandAPIConfig().setCustomNMS(new MockNMS(new NMS_1_19_R1()))); - plugin = MockBukkit.load(Main.class); } @AfterEach public void tearDown() { - Bukkit.getScheduler().cancelTasks(plugin); - if(plugin != null) { - plugin.onDisable(); + if(server != null) { + Bukkit.getScheduler().cancelTasks(plugin); + if (plugin != null) { + plugin.onDisable(); + } + MockBukkit.unmock(); } - MockBukkit.unmock(); + server = null; + plugin = null; + MockPlatform.unload(); } @Test public void executionTest() { - PlayerMock player = server.addPlayer(); - assertFalse(server.isValidCommandAPICommand(player, "break ~ ~ ~ ~")); - assertTrue(server.isValidCommandAPICommand(player, "break ~ ~ ~")); + PlayerMock player = server.addPlayer("myname"); + + server.dispatchCommand(player, "myeffect myname speed"); + + assertEquals(1, player.getActivePotionEffects().size()); + +// assertThrows(CommandSyntaxException.class, () -> server.dispatchThrowableCommand(player, "break ~ ~ ~ ~")); +// assertDoesNotThrow(() -> server.dispatchThrowableCommand(player, "break ~ ~ ~")); } } From a87f9b087ac53e93197937c3d7851dc07e0f5747 Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Thu, 22 Jun 2023 22:50:40 +0100 Subject: [PATCH 7/9] Refactor out public test API to commandapi-bukkit-test-toolkit --- .../commandapi-bukkit-test-toolkit/pom.xml | 82 +++++++++++++++++ .../commandapi/CommandAPIVersionHandler.java | 0 .../commandapi/test/ArgumentInspector.java | 0 .../dev/jorel/commandapi/test/Assertions.java | 0 .../commandapi/test/CommandAPIServerMock.java | 0 .../test/CommandAPITestCommand.java | 0 .../test/CommandAPITestCommand.java | 69 -------------- .../commandapi-bukkit/pom.xml | 9 +- examples/commandtestsuite/pom.xml | 4 +- .../commandapi/test/ArgumentInspector.java | 41 --------- .../dev/jorel/commandapi/test/Assertions.java | 22 ----- .../commandapi/test/CommandAPIServerMock.java | 90 ------------------- 12 files changed, 91 insertions(+), 226 deletions(-) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/pom.xml rename {examples/commandtestsuite/src/test => commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main}/java/dev/jorel/commandapi/CommandAPIVersionHandler.java (100%) rename commandapi-platforms/commandapi-bukkit/{commandapi-plugin-test => commandapi-bukkit-test-toolkit}/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java (100%) rename commandapi-platforms/commandapi-bukkit/{commandapi-plugin-test => commandapi-bukkit-test-toolkit}/src/main/java/dev/jorel/commandapi/test/Assertions.java (100%) rename commandapi-platforms/commandapi-bukkit/{commandapi-plugin-test => commandapi-bukkit-test-toolkit}/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java (100%) rename {examples/commandtestsuite/src/test => commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main}/java/dev/jorel/commandapi/test/CommandAPITestCommand.java (100%) delete mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java delete mode 100644 examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/ArgumentInspector.java delete mode 100644 examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/Assertions.java delete mode 100644 examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPIServerMock.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/pom.xml b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/pom.xml new file mode 100644 index 0000000000..129f76748c --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + + commandapi-bukkit + dev.jorel + 9.0.4 + + + commandapi-bukkit-test-toolkit + + + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + + + + papermc + https://repo.papermc.io/repository/maven-public/ + + + + minecraft-libraries + https://libraries.minecraft.net + + + + + + + org.spigotmc + spigot-api + 1.20.1-R0.1-SNAPSHOT + provided + + + + + com.mojang + brigadier + 1.0.17 + provided + + + + + org.junit.jupiter + junit-jupiter-engine + 5.8.2 + provided + + + + + com.github.seeseemelk + MockBukkit-v1.19 + 2.29.0 + provided + + + + + dev.jorel + commandapi-bukkit-test-impl-1.20 + ${project.version} + provided + + + + + dev.jorel + commandapi-bukkit-shade + ${project.version} + + + \ No newline at end of file diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/CommandAPIVersionHandler.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/CommandAPIVersionHandler.java similarity index 100% rename from examples/commandtestsuite/src/test/java/dev/jorel/commandapi/CommandAPIVersionHandler.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/CommandAPIVersionHandler.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java similarity index 100% rename from commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/ArgumentInspector.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/Assertions.java similarity index 100% rename from commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/Assertions.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/Assertions.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java similarity index 100% rename from commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/CommandAPIServerMock.java diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPITestCommand.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java similarity index 100% rename from examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPITestCommand.java rename to commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java b/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java deleted file mode 100644 index 0fa79369dd..0000000000 --- a/commandapi-platforms/commandapi-bukkit/commandapi-plugin-test/src/main/java/dev/jorel/commandapi/test/CommandAPITestCommand.java +++ /dev/null @@ -1,69 +0,0 @@ -package dev.jorel.commandapi.test; - -import java.util.ListIterator; - -import dev.jorel.commandapi.CommandAPICommand; -import dev.jorel.commandapi.CustomCommandExecutor; -import dev.jorel.commandapi.executors.IExecutorNormal; -import dev.jorel.commandapi.executors.IExecutorResulting; - -public class CommandAPITestCommand extends CommandAPICommand { - - @SuppressWarnings("rawtypes") - private final ArgumentInspector listener; - - public CommandAPITestCommand(String commandName) { - this(commandName, null); - } - - public CommandAPITestCommand(String commandName, @SuppressWarnings("rawtypes") ArgumentInspector listener) { - super(commandName); - this.listener = listener; - } - - // Replace all executors with our 'testing' executor - @SuppressWarnings({ "rawtypes", "unchecked" }) - private void mapExecutor(CustomCommandExecutor customCommandExecutor) { - // Do normal executors - { - ListIterator it = customCommandExecutor.getNormalExecutors().listIterator(); - while(it.hasNext()) { - IExecutorNormal executor = (IExecutorNormal) it.next(); - IExecutorNormal newExecutor = (sender, args) -> { - for(Object arg : args) { - listener.set(arg); - } - executor.executeWith(sender, args); - }; - it.set(newExecutor); - } - } - - // And now do resulting executors - { - ListIterator it = customCommandExecutor.getResultingExecutors().listIterator(); - while(it.hasNext()) { - IExecutorResulting executor = (IExecutorResulting) it.next(); - IExecutorResulting newExecutor = (sender, args) -> { - for(Object arg : args) { - listener.set(arg); - } - return executor.executeWith(sender, args); - }; - it.set(newExecutor); - } - } - } - - @Override - public void register() { - if(this.listener != null) { - mapExecutor(this.executor); - for (CommandAPICommand subcommand : this.getSubcommands()) { - mapExecutor(subcommand.getExecutor()); - } - } - super.register(); - } - -} diff --git a/commandapi-platforms/commandapi-bukkit/pom.xml b/commandapi-platforms/commandapi-bukkit/pom.xml index cc382b4b94..638e59d57f 100644 --- a/commandapi-platforms/commandapi-bukkit/pom.xml +++ b/commandapi-platforms/commandapi-bukkit/pom.xml @@ -24,12 +24,17 @@ commandapi-bukkit-vh commandapi-bukkit-mojang-mapped + + commandapi-bukkit-test + commandapi-bukkit-plugin - commandapi-bukkit-test commandapi-bukkit-shade - commandapi-bukkit-plugin-mojang-mapped commandapi-bukkit-shade-mojang-mapped + + + commandapi-bukkit-kotlin + commandapi-bukkit-test-toolkit \ No newline at end of file diff --git a/examples/commandtestsuite/pom.xml b/examples/commandtestsuite/pom.xml index 283f0927db..6e34cdfc3e 100644 --- a/examples/commandtestsuite/pom.xml +++ b/examples/commandtestsuite/pom.xml @@ -6,7 +6,7 @@ UTF-8 - 9.0.3 + 9.0.4 @@ -70,7 +70,7 @@ - commandapi-bukkit-test-impl-1.20 for testing against Minecraft 1.20 --> dev.jorel - commandapi-bukkit-shade + commandapi-bukkit-test-toolkit ${commandapi.version} diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/ArgumentInspector.java b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/ArgumentInspector.java deleted file mode 100644 index 2e25421f25..0000000000 --- a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/ArgumentInspector.java +++ /dev/null @@ -1,41 +0,0 @@ -package dev.jorel.commandapi.test; -import java.util.ArrayDeque; -import java.util.Deque; -import java.util.NoSuchElementException; -import java.util.Optional; - -/** - * A mutable wrapper of an object, as a list - * - * @param - */ -public class ArgumentInspector { - - public static ArgumentInspector of() { - return new ArgumentInspector(); - } - - private final Deque> value; - - private ArgumentInspector() { - value = new ArrayDeque<>(); - } - - public void set(T obj) { - this.value.add(Optional.ofNullable(obj)); - } - - public T get() { - if(this.value.size() == 0) { - throw new NoSuchElementException(); - } else { - return this.value.remove().orElse(null); - } - } - - @Override - public String toString() { - return String.valueOf(value); - } - -} diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/Assertions.java b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/Assertions.java deleted file mode 100644 index ed90b7d5f2..0000000000 --- a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/Assertions.java +++ /dev/null @@ -1,22 +0,0 @@ -package dev.jorel.commandapi.test; - -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import org.bukkit.command.CommandSender; - -import com.mojang.brigadier.exceptions.CommandSyntaxException; - -public class Assertions { - - /** - * Checks if the command has invalid syntax (would show up as red in the client) - * @param server the server instance - * @param sender the command sender - * @param command the command that the command sender would run (without the leading {@code /}) - */ - public static void assertInvalidSyntax(CommandAPIServerMock server, CommandSender sender, String command) { - assertThrows(CommandSyntaxException.class, () -> assertTrue(server.dispatchThrowableCommand(sender,command))); - } - -} diff --git a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPIServerMock.java b/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPIServerMock.java deleted file mode 100644 index d79f132178..0000000000 --- a/examples/commandtestsuite/src/test/java/dev/jorel/commandapi/test/CommandAPIServerMock.java +++ /dev/null @@ -1,90 +0,0 @@ -package dev.jorel.commandapi.test; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutionException; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; - -import com.mojang.brigadier.CommandDispatcher; -import com.mojang.brigadier.ParseResults; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.suggestion.Suggestion; -import com.mojang.brigadier.suggestion.Suggestions; - -import be.seeseemelk.mockbukkit.AsyncCatcher; -import be.seeseemelk.mockbukkit.ServerMock; -import dev.jorel.commandapi.Brigadier; - -public class CommandAPIServerMock extends ServerMock { - - @SuppressWarnings("unchecked") - public boolean dispatchThrowableCommand(CommandSender sender, String commandLine) throws CommandSyntaxException{ - String[] commands = commandLine.split(" "); - String commandLabel = commands[0]; - Command command = getCommandMap().getCommand(commandLabel); - - if(command != null) { - return super.dispatchCommand(sender, commandLine); - } else { - AsyncCatcher.catchOp("command dispatch"); - @SuppressWarnings("rawtypes") - CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); - Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); - return dispatcher.execute(commandLine, css) != 0; - } - } - - @Override - public boolean dispatchCommand(CommandSender sender, String commandLine) { - try { - return dispatchThrowableCommand(sender, commandLine); - } catch (CommandSyntaxException e1) { - return false; - } - } - - @Deprecated - public boolean isValidCommandAPICommand(CommandSender sender, String commandLine) { - String[] commands = commandLine.split(" "); - String commandLabel = commands[0]; - Command command = getCommandMap().getCommand(commandLabel); - - if(command != null) { - return false; - } else { - AsyncCatcher.catchOp("command dispatch"); - @SuppressWarnings("rawtypes") - CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); - Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); - ParseResults results = dispatcher.parse(commandLine, css); - return results.getExceptions().size() == 0; - } - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - public List getSuggestions(CommandSender sender, String commandLine) { - AsyncCatcher.catchOp("command tabcomplete"); - CommandDispatcher dispatcher = Brigadier.getCommandDispatcher(); - Object css = Brigadier.getBrigadierSourceFromCommandSender(sender); - ParseResults parseResults = dispatcher.parse(commandLine, css); - Suggestions suggestions = null; - try { - suggestions = (Suggestions) dispatcher.getCompletionSuggestions(parseResults).get(); - } catch (InterruptedException | ExecutionException e) { - e.printStackTrace(); - } - - List suggestionsAsStrings = new ArrayList<>(); - for(Suggestion suggestion : suggestions.getList()) { - suggestionsAsStrings.add(suggestion.getText()); - } - - return suggestionsAsStrings; - } - - @Override - public boolean shouldSendChatPreviews() { - return true; - } -} From d2622a6ca38178479c9006f4f123f67a3520352a Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Thu, 22 Jun 2023 23:04:14 +0100 Subject: [PATCH 8/9] Move Version to its own class --- .../java/dev/jorel/commandapi/CommandAPIVersionHandler.java | 6 +----- .../src/main/java/dev/jorel/commandapi/test/Version.java | 6 ++++++ .../src/test/java/io/github/jorelali/MyTests.java | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/Version.java diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/CommandAPIVersionHandler.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/CommandAPIVersionHandler.java index 8b80c2c062..1d776c899b 100644 --- a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/CommandAPIVersionHandler.java +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/CommandAPIVersionHandler.java @@ -5,6 +5,7 @@ import dev.jorel.commandapi.nms.NMS_1_19_4_R3; import dev.jorel.commandapi.nms.NMS_1_20_R1; import dev.jorel.commandapi.test.MockNMS; +import dev.jorel.commandapi.test.Version; /** * This file handles loading the correct platform implementation. The CommandAPIVersionHandler @@ -19,11 +20,6 @@ public static void setVersion(Version version) { CommandAPIVersionHandler.version.set(version); } - public static enum Version { - MINECRAFT_1_20, - MINECRAFT_1_19_4; - } - // The only important thing we care about. static CommandAPIPlatform getPlatform() { if(CommandAPIVersionHandler.version.get() == null) { diff --git a/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/Version.java b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/Version.java new file mode 100644 index 0000000000..21448b67e6 --- /dev/null +++ b/commandapi-platforms/commandapi-bukkit/commandapi-bukkit-test-toolkit/src/main/java/dev/jorel/commandapi/test/Version.java @@ -0,0 +1,6 @@ +package dev.jorel.commandapi.test; + +public enum Version { + MINECRAFT_1_20, + MINECRAFT_1_19_4; +} \ No newline at end of file diff --git a/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java b/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java index 0687a854ce..856f24bed6 100644 --- a/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java +++ b/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java @@ -19,9 +19,9 @@ import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.entity.PlayerMock; import dev.jorel.commandapi.CommandAPIVersionHandler; -import dev.jorel.commandapi.CommandAPIVersionHandler.Version; import dev.jorel.commandapi.test.CommandAPIServerMock; import dev.jorel.commandapi.test.MockPlatform; +import dev.jorel.commandapi.test.Version; public class MyTests { From b87f59a9f0820c3f62d362eb0edfb7100af347d1 Mon Sep 17 00:00:00 2001 From: Jorel Ali Date: Thu, 22 Jun 2023 23:08:04 +0100 Subject: [PATCH 9/9] Tidy things up and add some comments for reviewing --- .../main/java/io/github/jorelali/Main.java | 2 + .../test/java/io/github/jorelali/MyTests.java | 55 ++++++++++++------- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java b/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java index 5f81b1fa61..4f24f74bd7 100644 --- a/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java +++ b/examples/commandtestsuite/src/main/java/io/github/jorelali/Main.java @@ -35,12 +35,14 @@ public void onEnable() { // Enable the CommandAPI CommandAPI.onEnable(); + // Register my commands as normal MyCommands myCommands = new MyCommands(this); myCommands.registerAllCommands(); } @Override public void onDisable() { + // Disable the CommandAPI CommandAPI.onDisable(); } diff --git a/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java b/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java index 856f24bed6..f8a4d4d5dd 100644 --- a/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java +++ b/examples/commandtestsuite/src/test/java/io/github/jorelali/MyTests.java @@ -23,22 +23,16 @@ import dev.jorel.commandapi.test.MockPlatform; import dev.jorel.commandapi.test.Version; -public class MyTests { +class MyTests { - private CommandAPIServerMock server; - private Main plugin; + //////////////// + // Test setup // + //////////////// - private String getDispatcherString() { - try { - return Files.readString(new File("command_registration.json").toPath()); - } catch (IOException e) { - return ""; - } - } + private CommandAPIServerMock server; // The server + private Main plugin; // Our plugin - public void assertInvalidSyntax(CommandSender sender, String command) { - assertThrows(CommandSyntaxException.class, () -> assertTrue(server.dispatchThrowableCommand(sender,command))); - } + // Set up a test for Minecraft 1.20 @BeforeEach public void setUp() { @@ -46,10 +40,12 @@ public void setUp() { server = MockBukkit.mock(new CommandAPIServerMock()); plugin = MockBukkit.load(Main.class); } - + + // Teardown our tests. + @AfterEach public void tearDown() { - if(server != null) { + if (server != null) { Bukkit.getScheduler().cancelTasks(plugin); if (plugin != null) { plugin.onDisable(); @@ -61,16 +57,35 @@ public void tearDown() { MockPlatform.unload(); } + /////////// + // Tests // + /////////// + @Test public void executionTest() { PlayerMock player = server.addPlayer("myname"); - + server.dispatchCommand(player, "myeffect myname speed"); - + assertEquals(1, player.getActivePotionEffects().size()); - -// assertThrows(CommandSyntaxException.class, () -> server.dispatchThrowableCommand(player, "break ~ ~ ~ ~")); -// assertDoesNotThrow(() -> server.dispatchThrowableCommand(player, "break ~ ~ ~")); + } + + /////////////////////////////////////////////////////////////////////////// + // Utility methods, probably stuff that the CommandAPI Test Toolkit will // + // include, but I'm including them here for now until I figure out what // + // features we want // + /////////////////////////////////////////////////////////////////////////// + + private String getDispatcherString() { + try { + return Files.readString(new File("command_registration.json").toPath()); + } catch (IOException e) { + return ""; + } + } + + public void assertInvalidSyntax(CommandSender sender, String command) { + assertThrows(CommandSyntaxException.class, () -> assertTrue(server.dispatchThrowableCommand(sender, command))); } }