Skip to content

Commit

Permalink
Finish Paper test impls
Browse files Browse the repository at this point in the history
  • Loading branch information
DerEchtePilz committed May 14, 2024
1 parent d3732b7 commit c357912
Show file tree
Hide file tree
Showing 31 changed files with 3,046 additions and 855 deletions.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import be.seeseemelk.mockbukkit.help.HelpMapMock;
import com.mojang.brigadier.tree.CommandNode;
import dev.jorel.commandapi.SafeVarHandle;
import dev.jorel.commandapi.test.exception.UnimplementedMethodException;
import net.minecraft.commands.Commands;
import org.bukkit.Bukkit;
import org.bukkit.Color;
Expand Down Expand Up @@ -273,11 +274,6 @@ public boolean isVanillaCommandWrapper(Command command) {
return baseNMS.isVanillaCommandWrapper(command);
}

@Override
public Command wrapToVanillaCommandWrapper(CommandNode<CommandSourceStack> node) {
return baseNMS.wrapToVanillaCommandWrapper(node);
}

@Override
public boolean isBukkitCommandWrapper(CommandNode<CommandSourceStack> node) {
return baseNMS.isBukkitCommandWrapper(node);
Expand Down Expand Up @@ -397,152 +393,9 @@ public List<NamespacedKey> getAllRecipes() {
return recipeManager.getRecipeIds().map(k -> new NamespacedKey(k.getNamespace(), k.getPath())).toList();
}

@SuppressWarnings("unchecked")
@Override
public <T> T getMinecraftServer() {
if (minecraftServerMock != null) {
return (T) minecraftServerMock;
}
minecraftServerMock = Mockito.mock(MinecraftServer.class);

// LootTableArgument
Mockito.when(minecraftServerMock.getLootTables()).thenAnswer(invocation -> {
LootTables lootTables = Mockito.mock(LootTables.class);
Mockito.when(lootTables.get(any(ResourceLocation.class))).thenAnswer(i -> {
if (BuiltInLootTables.all().contains(i.getArgument(0))) {
return net.minecraft.world.level.storage.loot.LootTable.EMPTY;
} else {
return null;
}
});
Mockito.when(lootTables.getIds()).thenAnswer(i -> {
return Streams
.concat(
Arrays.stream(getEntityTypes())
.filter(e -> !e.equals(EntityType.UNKNOWN))
// TODO? These entity types don't have corresponding
// loot table entries! Did Spigot miss them out?
.filter(e -> !e.equals(EntityType.ALLAY))
.filter(e -> !e.equals(EntityType.FROG))
.filter(e -> !e.equals(EntityType.TADPOLE))
.filter(e -> !e.equals(EntityType.WARDEN))
.filter(e -> e.isAlive())
.map(EntityType::getKey)
.map(k -> new ResourceLocation("minecraft", "entities/" + k.getKey())),
BuiltInLootTables.all().stream())
.collect(Collectors.toSet());
});
return lootTables;
});

// AdvancementArgument
Mockito.when(minecraftServerMock.getAdvancements()).thenAnswer(i -> advancementDataWorld);

// TeamArgument
ServerScoreboard scoreboardServerMock = Mockito.mock(ServerScoreboard.class);
Mockito.when(scoreboardServerMock.getPlayerTeam(anyString())).thenAnswer(invocation -> { // Scoreboard#getPlayerTeam
String teamName = invocation.getArgument(0);
Team team = Bukkit.getScoreboardManager().getMainScoreboard().getTeam(teamName);
if (team == null) {
return null;
} else {
return new PlayerTeam(scoreboardServerMock, teamName);
}
});
Mockito.when(scoreboardServerMock.getObjective(anyString())).thenAnswer(invocation -> { // Scoreboard#getObjective
String objectiveName = invocation.getArgument(0);
org.bukkit.scoreboard.Objective bukkitObjective = Bukkit.getScoreboardManager().getMainScoreboard().getObjective(objectiveName);
if (bukkitObjective == null) {
return null;
} else {
return new Objective(scoreboardServerMock, objectiveName, ObjectiveCriteria.byName(bukkitObjective.getCriteria()).get(), net.minecraft.network.chat.Component.literal(bukkitObjective.getDisplayName()), switch(bukkitObjective.getRenderType()) {
case HEARTS:
yield RenderType.HEARTS;
case INTEGER:
yield RenderType.INTEGER;
});
}
});
Mockito.when(minecraftServerMock.getScoreboard()).thenReturn(scoreboardServerMock); // MinecraftServer#getScoreboard

// WorldArgument (Dimension)
Mockito.when(minecraftServerMock.getLevel(any(ResourceKey.class))).thenAnswer(invocation -> {
// Get the ResourceKey<World> and extract the world name from it
ResourceKey<Level> resourceKey = invocation.getArgument(0);
String worldName = resourceKey.location().getPath();

// Get the world via Bukkit (returns a WorldMock) and create a
// CraftWorld clone of it for WorldServer.getWorld()
World world = Bukkit.getServer().getWorld(worldName);
if (world == null) {
return null;
} else {
CraftWorld craftWorldMock = Mockito.mock(CraftWorld.class);
Mockito.when(craftWorldMock.getName()).thenReturn(world.getName());
Mockito.when(craftWorldMock.getUID()).thenReturn(world.getUID());

// Create our return WorldServer object
ServerLevel bukkitWorldServerMock = Mockito.mock(ServerLevel.class);
Mockito.when(bukkitWorldServerMock.getWorld()).thenReturn(craftWorldMock);
return bukkitWorldServerMock;
}
});

// Player lists
Mockito.when(minecraftServerMock.getPlayerList()).thenAnswer(i -> playerListMock);
Mockito.when(minecraftServerMock.getPlayerList().getPlayers()).thenAnswer(i -> players);

// PlayerArgument
GameProfileCache userCacheMock = Mockito.mock(GameProfileCache.class);
Mockito.when(userCacheMock.get(anyString())).thenAnswer(invocation -> {
String playerName = invocation.getArgument(0);
for (ServerPlayer onlinePlayer : players) {
if (onlinePlayer.getBukkitEntity().getName().equals(playerName)) {
return Optional.of(new GameProfile(onlinePlayer.getBukkitEntity().getUniqueId(), playerName));
}
}
return Optional.empty();
});
Mockito.when(minecraftServerMock.getProfileCache()).thenReturn(userCacheMock);

// RecipeArgument
Mockito.when(minecraftServerMock.getRecipeManager()).thenAnswer(i -> this.recipeManager);

// FunctionArgument
// We're using 2 as the function compilation level.
Mockito.when(minecraftServerMock.getFunctionCompilationLevel()).thenReturn(2);
Mockito.when(minecraftServerMock.getFunctions()).thenAnswer(i -> {
ServerFunctionLibrary serverFunctionLibrary = Mockito.mock(ServerFunctionLibrary.class);

// Functions
Mockito.when(serverFunctionLibrary.getFunction(any())).thenAnswer(invocation -> Optional.ofNullable(functions.get(invocation.getArgument(0))));
Mockito.when(serverFunctionLibrary.getFunctions()).thenAnswer(invocation -> functions);

// Tags
Mockito.when(serverFunctionLibrary.getTag(any())).thenAnswer(invocation -> tags.getOrDefault(invocation.getArgument(0), List.of()));
Mockito.when(serverFunctionLibrary.getAvailableTags()).thenAnswer(invocation -> tags.keySet());

return new ServerFunctionManager(minecraftServerMock, serverFunctionLibrary) {

// Make sure we don't use ServerFunctionManager#getDispatcher!
// That method accesses MinecraftServer.vanillaCommandDispatcher
// directly (boo) and that causes all sorts of nonsense.
@Override
public CommandDispatcher<CommandSourceStack> getDispatcher() {
return Brigadier.getCommandDispatcher();
}
};
});

Mockito.when(minecraftServerMock.getGameRules()).thenAnswer(i -> new GameRules());
Mockito.when(minecraftServerMock.getProfiler()).thenAnswer(i -> InactiveMetricsRecorder.INSTANCE.getProfiler());

// Commands object, used when creating VanillaCommandWrappers in NMS#wrapToVanillaCommandWrapper
Commands commands = new Commands();
MockPlatform.setField(commands.getClass(), "g", "dispatcher", commands, getBrigadierDispatcher());
minecraftServerMock.vanillaCommandDispatcher = commands;

return (T) minecraftServerMock;
throw new UnimplementedMethodException("This method should not be accessed here. Please use a platform-specific version of this method.");
}

@SuppressWarnings("unchecked")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,16 +90,6 @@
<version>1.0.17</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>dev.jorel</groupId>
<artifactId>commandapi-test-bukkit-impl</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>dev.jorel</groupId>
<artifactId>commandapi-paper-shade</artifactId>
<version>${project.version}</version>
</dependency>

<!-- Version-specific dependencies -->
<dependency>
Expand All @@ -119,6 +109,18 @@
<artifactId>paper-api</artifactId>
<version>${paper.version}</version>
</dependency> -->

<!-- CommandAPI stuff -->
<dependency>
<groupId>dev.jorel</groupId>
<artifactId>commandapi-test-bukkit-impl</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>dev.jorel</groupId>
<artifactId>commandapi-paper-shade</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>

<build>
Expand Down
Loading

0 comments on commit c357912

Please sign in to comment.