mirror of https://github.com/Minestom/Minestom.git
148 lines
6.2 KiB
Java
148 lines
6.2 KiB
Java
package net.minestom.server.command;
|
|
|
|
import net.minestom.server.command.builder.arguments.ArgumentType;
|
|
import org.jetbrains.annotations.NotNull;
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
import java.util.concurrent.atomic.AtomicBoolean;
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
import static net.minestom.server.command.builder.arguments.ArgumentType.Literal;
|
|
import static net.minestom.server.command.builder.arguments.ArgumentType.Word;
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
public class CommandParseTest {
|
|
|
|
@Test
|
|
public void singleParameterlessCommand() {
|
|
final AtomicBoolean b = new AtomicBoolean();
|
|
var foo = Graph.merge(Graph.builder(Literal("foo"), createExecutor(b)).build());
|
|
assertValid(foo, "foo", b);
|
|
assertUnknown(foo, "bar");
|
|
assertSyntaxError(foo, "foo bar baz");
|
|
}
|
|
|
|
@Test
|
|
public void twoParameterlessCommand() {
|
|
final AtomicBoolean b = new AtomicBoolean();
|
|
final AtomicBoolean b1 = new AtomicBoolean();
|
|
var graph = Graph.merge(
|
|
Graph.builder(Literal("foo"), createExecutor(b)).build(),
|
|
Graph.builder(Literal("bar"), createExecutor(b1)).build()
|
|
);
|
|
assertValid(graph, "foo", b);
|
|
assertValid(graph, "bar", b1);
|
|
assertUnknown(graph, "baz");
|
|
assertSyntaxError(graph, "foo bar baz");
|
|
assertSyntaxError(graph, "bar 25");
|
|
}
|
|
|
|
@Test
|
|
public void singleCommandWithMultipleSyntax() {
|
|
final AtomicBoolean add = new AtomicBoolean();
|
|
final AtomicBoolean action = new AtomicBoolean();
|
|
var foo = Graph.merge(Graph.builder(Literal("foo"))
|
|
.append(Literal("add"),
|
|
x -> x.append(Word("name"), createExecutor(add)))
|
|
.append(Word("action").from("inc", "dec"),
|
|
x -> x.append(ArgumentType.Integer("num"), createExecutor(action)))
|
|
.build());
|
|
assertValid(foo, "foo add test", add);
|
|
assertValid(foo, "foo add inc", add);
|
|
assertValid(foo, "foo add 157", add);
|
|
assertValid(foo, "foo inc 157", action);
|
|
assertValid(foo, "foo dec 157", action);
|
|
assertSyntaxError(foo, "foo 15");
|
|
assertSyntaxError(foo, "foo asd");
|
|
assertSyntaxError(foo, "foo inc");
|
|
assertSyntaxError(foo, "foo inc asd");
|
|
assertSyntaxError(foo, "foo inc 15 dec");
|
|
assertSyntaxError(foo, "foo inc 15 20");
|
|
assertUnknown(foo, "bar");
|
|
assertUnknown(foo, "add");
|
|
}
|
|
|
|
@Test
|
|
public void singleCommandOptionalArgs() {
|
|
final AtomicBoolean b = new AtomicBoolean();
|
|
final AtomicReference<String> expectedFirstArg = new AtomicReference<>("T");
|
|
var foo = Graph.merge(Graph.builder(Literal("foo"))
|
|
.append(Word("a").setDefaultValue("A"),
|
|
x -> x.append(Word("b").setDefaultValue("B"),
|
|
x1 -> x1.append(Word("c").setDefaultValue("C"),
|
|
x2 -> x2.append(Word("d").setDefaultValue("D"),
|
|
new GraphImpl.ExecutionImpl(null, null, null,
|
|
(sender, context) -> {
|
|
b.set(true);
|
|
assertEquals(expectedFirstArg.get(), context.get("a"));
|
|
assertEquals("B", context.get("b"));
|
|
assertEquals("C", context.get("c"));
|
|
assertEquals("D", context.get("d"));
|
|
}, null)))))
|
|
.build());
|
|
assertValid(foo, "foo T", b);
|
|
expectedFirstArg.set("A");
|
|
assertValid(foo, "foo", b);
|
|
}
|
|
|
|
@Test
|
|
public void singleCommandSingleEnumArg() {
|
|
enum A {a, b}
|
|
final AtomicBoolean b = new AtomicBoolean();
|
|
var foo = Graph.merge(Graph.builder(Literal("foo"))
|
|
.append(ArgumentType.Enum("test", A.class), createExecutor(b))
|
|
.build());
|
|
assertValid(foo, "foo a", b);
|
|
assertValid(foo, "foo b", b);
|
|
assertSyntaxError(foo, "foo c");
|
|
assertSyntaxError(foo, "foo");
|
|
}
|
|
|
|
@Test
|
|
public void aliasWithoutArgs() {
|
|
final AtomicBoolean b = new AtomicBoolean();
|
|
var foo = Graph.merge(Graph.builder(Word("").from("foo", "bar"), createExecutor(b))
|
|
.build());
|
|
assertValid(foo, "foo", b);
|
|
assertValid(foo, "bar", b);
|
|
assertUnknown(foo, "test");
|
|
}
|
|
|
|
@Test
|
|
public void aliasWithArgs() {
|
|
final AtomicBoolean b = new AtomicBoolean();
|
|
var foo = Graph.merge(Graph.builder(Word("").from("foo", "bar"))
|
|
.append(ArgumentType.Integer("test"), createExecutor(b))
|
|
.build());
|
|
assertValid(foo, "foo 1", b);
|
|
assertValid(foo, "bar 1", b);
|
|
assertSyntaxError(foo, "foo");
|
|
assertSyntaxError(foo, "bar");
|
|
}
|
|
|
|
private static void assertSyntaxError(Graph graph, String input) {
|
|
assertInstanceOf(CommandParser.Result.KnownCommand.Invalid.class, parseCommand(graph, input));
|
|
}
|
|
|
|
private static void assertUnknown(Graph graph, String input) {
|
|
assertInstanceOf(CommandParser.Result.UnknownCommand.class, parseCommand(graph, input));
|
|
}
|
|
|
|
private static void assertValid(Graph graph, String input, AtomicBoolean executorTest) {
|
|
final CommandParser.Result result = parseCommand(graph, input);
|
|
assertInstanceOf(CommandParser.Result.KnownCommand.Valid.class, result);
|
|
result.executable().execute(null);
|
|
assertTrue(executorTest.get(), "Parser returned valid syntax, but with the wrong executor.");
|
|
executorTest.set(false);
|
|
}
|
|
|
|
private static CommandParser.Result parseCommand(Graph graph, String input) {
|
|
return CommandParser.parser().parse(graph, input);
|
|
}
|
|
|
|
@NotNull
|
|
private static Graph.Execution createExecutor(AtomicBoolean atomicBoolean) {
|
|
return new GraphImpl.ExecutionImpl(null, null, null, (sender, context) -> atomicBoolean.set(true), null);
|
|
}
|
|
}
|