Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-11-17 05:20:14 +01:00
Correct command meta alias removal behavior and add appropriate unit tests.
Apparently @hugmanrique caught the issue but suggested the wrong fix. This is the correct fix, and respects the Javadoc.
Dieser Commit ist enthalten in:
Ursprung
895eb1a424
Commit
0b0c36dcfc
@ -75,6 +75,13 @@ public interface CommandManager {
|
|||||||
*/
|
*/
|
||||||
void unregister(String alias);
|
void unregister(String alias);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters the specified command from the manager, if registered.
|
||||||
|
*
|
||||||
|
* @param meta the command to unregister
|
||||||
|
*/
|
||||||
|
void unregister(CommandMeta meta);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the {@link CommandMeta} from the specified command alias, if registered.
|
* Retrieves the {@link CommandMeta} from the specified command alias, if registered.
|
||||||
* @param alias the command alias to lookup
|
* @param alias the command alias to lookup
|
||||||
|
@ -156,11 +156,23 @@ public class VelocityCommandManager implements CommandManager {
|
|||||||
// The literals of secondary aliases will preserve the children of
|
// The literals of secondary aliases will preserve the children of
|
||||||
// the removed literal in the graph.
|
// the removed literal in the graph.
|
||||||
dispatcher.getRoot().removeChildByName(alias.toLowerCase(Locale.ENGLISH));
|
dispatcher.getRoot().removeChildByName(alias.toLowerCase(Locale.ENGLISH));
|
||||||
|
commandMetas.remove(alias);
|
||||||
|
} finally {
|
||||||
|
lock.writeLock().unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
CommandMeta meta = commandMetas.get(alias);
|
@Override
|
||||||
if (meta != null) {
|
public void unregister(CommandMeta meta) {
|
||||||
for (String metaAlias : meta.getAliases()) {
|
Preconditions.checkNotNull(meta, "meta");
|
||||||
commandMetas.remove(metaAlias, meta);
|
lock.writeLock().lock();
|
||||||
|
try {
|
||||||
|
// The literals of secondary aliases will preserve the children of
|
||||||
|
// the removed literal in the graph.
|
||||||
|
for (String alias : meta.getAliases()) {
|
||||||
|
final String lowercased = alias.toLowerCase(Locale.ENGLISH);
|
||||||
|
if (commandMetas.remove(lowercased, meta)) {
|
||||||
|
dispatcher.getRoot().removeChildByName(lowercased);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -19,6 +19,7 @@ package com.velocitypowered.proxy.command;
|
|||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertNull;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
import static org.junit.jupiter.api.Assertions.fail;
|
import static org.junit.jupiter.api.Assertions.fail;
|
||||||
@ -44,6 +45,7 @@ public class CommandManagerTests extends CommandTestSuite {
|
|||||||
|
|
||||||
assertTrue(manager.hasCommand("hello"));
|
assertTrue(manager.hasCommand("hello"));
|
||||||
assertRegisteredAliases("hello");
|
assertRegisteredAliases("hello");
|
||||||
|
assertEquals(meta, manager.getCommandMeta("hello"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -59,6 +61,10 @@ public class CommandManagerTests extends CommandTestSuite {
|
|||||||
assertTrue(manager.hasCommand("baz"));
|
assertTrue(manager.hasCommand("baz"));
|
||||||
assertTrue(manager.hasCommand("qux"));
|
assertTrue(manager.hasCommand("qux"));
|
||||||
assertRegisteredAliases("foo", "bar", "baz", "qux");
|
assertRegisteredAliases("foo", "bar", "baz", "qux");
|
||||||
|
assertEquals(meta, manager.getCommandMeta("foo"));
|
||||||
|
assertEquals(meta, manager.getCommandMeta("bar"));
|
||||||
|
assertEquals(meta, manager.getCommandMeta("baz"));
|
||||||
|
assertEquals(meta, manager.getCommandMeta("qux"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -90,8 +96,11 @@ public class CommandManagerTests extends CommandTestSuite {
|
|||||||
|
|
||||||
final var oldMeta = manager.metaBuilder("foo").build();
|
final var oldMeta = manager.metaBuilder("foo").build();
|
||||||
manager.register(oldMeta, DummyCommand.INSTANCE); // fails on execution
|
manager.register(oldMeta, DummyCommand.INSTANCE); // fails on execution
|
||||||
|
assertEquals(oldMeta, manager.getCommandMeta("foo"));
|
||||||
|
|
||||||
final var newMeta = manager.metaBuilder("foo").build();
|
final var newMeta = manager.metaBuilder("foo").build();
|
||||||
manager.register(newMeta, (RawCommand) invocation -> called.set(true));
|
manager.register(newMeta, (RawCommand) invocation -> called.set(true));
|
||||||
|
assertEquals(newMeta, manager.getCommandMeta("foo"));
|
||||||
manager.executeAsync(MockCommandSource.INSTANCE, "foo").join();
|
manager.executeAsync(MockCommandSource.INSTANCE, "foo").join();
|
||||||
|
|
||||||
assertTrue(called.get());
|
assertTrue(called.get());
|
||||||
@ -153,9 +162,39 @@ public class CommandManagerTests extends CommandTestSuite {
|
|||||||
|
|
||||||
assertFalse(manager.hasCommand("bar"));
|
assertFalse(manager.hasCommand("bar"));
|
||||||
assertTrue(manager.hasCommand("foo"));
|
assertTrue(manager.hasCommand("foo"));
|
||||||
|
assertEquals(meta, manager.getCommandMeta("foo"));
|
||||||
assertRegisteredAliases("foo");
|
assertRegisteredAliases("foo");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testUnregisterAllAliases() {
|
||||||
|
final var meta = manager.metaBuilder("foo")
|
||||||
|
.aliases("bar")
|
||||||
|
.build();
|
||||||
|
manager.register(meta, DummyCommand.INSTANCE);
|
||||||
|
manager.unregister(meta);
|
||||||
|
|
||||||
|
assertFalse(manager.hasCommand("bar"));
|
||||||
|
assertFalse(manager.hasCommand("foo"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testUnregisterAliasOverlap() {
|
||||||
|
final var meta1 = manager.metaBuilder("foo")
|
||||||
|
.aliases("bar")
|
||||||
|
.build();
|
||||||
|
manager.register(meta1, DummyCommand.INSTANCE);
|
||||||
|
final var meta2 = manager.metaBuilder("bar")
|
||||||
|
.build();
|
||||||
|
manager.register(meta2, DummyCommand.INSTANCE);
|
||||||
|
assertEquals(meta1, manager.getCommandMeta("foo"));
|
||||||
|
assertEquals(meta2, manager.getCommandMeta("bar"));
|
||||||
|
|
||||||
|
manager.unregister(meta1);
|
||||||
|
assertNull(manager.getCommandMeta("foo"));
|
||||||
|
assertEquals(meta2, manager.getCommandMeta("bar"));
|
||||||
|
}
|
||||||
|
|
||||||
// Execution
|
// Execution
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren