mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-01 17:01:56 +01:00
efc1f99846
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: 69c7ce23 PR-990: Use Mockito instead of InvocationHandler for test mocking 997de31d PR-893: Add a stream method to Registry to make it easier to use and to avoid unnecessary wrapping 6a8ce581 Fix malformed javadoc in previous commit 26c74f6d PR-890: Add more Sculk API (bloom, shriek, bloom event) aa067abf PR-895: Load GameEvent and MusicInstrument from registry CraftBukkit Changes: 78796c9de Add support for Java 21 ddc9a2dad SPIGOT-7475: Don't fire SculkBloomEvent during world generation caee2311a PR-1245: Add a stream method to Registry to make it easier to use and to avoid unnecessary wrapping de421cf56 PR-1242: Add more Sculk API (bloom, shriek, bloom event) 00f5a80fb PR-1252: Fix error when generating a tree in water 10219df3a PR-1248: Load GameEvent and MusicInstrument from registry
280 lines
12 KiB
Diff
280 lines
12 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Jake Potrebic <jake.m.potrebic@gmail.com>
|
|
Date: Mon, 13 Feb 2023 14:14:56 -0800
|
|
Subject: [PATCH] Test changes
|
|
|
|
|
|
diff --git a/build.gradle.kts b/build.gradle.kts
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/build.gradle.kts
|
|
+++ b/build.gradle.kts
|
|
@@ -0,0 +0,0 @@ dependencies {
|
|
implementation("org.apache.logging.log4j:log4j-iostreams:2.19.0") // Paper - remove exclusion
|
|
implementation("org.ow2.asm:asm:9.5")
|
|
implementation("org.ow2.asm:asm-commons:9.5") // Paper - ASM event executor generation
|
|
+ testImplementation("org.mockito:mockito-core:4.9.0") // Paper - switch to mockito
|
|
implementation("commons-lang:commons-lang:2.6")
|
|
runtimeOnly("org.xerial:sqlite-jdbc:3.42.0.0")
|
|
runtimeOnly("com.mysql:mysql-connector-j:8.0.33")
|
|
diff --git a/src/test/java/io/papermc/paper/testing/DummyServer.java b/src/test/java/io/papermc/paper/testing/DummyServer.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
|
--- /dev/null
|
|
+++ b/src/test/java/io/papermc/paper/testing/DummyServer.java
|
|
@@ -0,0 +0,0 @@
|
|
+package io.papermc.paper.testing;
|
|
+
|
|
+import java.util.logging.Logger;
|
|
+import org.bukkit.Bukkit;
|
|
+import org.bukkit.Material;
|
|
+import org.bukkit.NamespacedKey;
|
|
+import org.bukkit.Server;
|
|
+import org.bukkit.command.SimpleCommandMap;
|
|
+import org.bukkit.craftbukkit.CraftRegistry;
|
|
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
|
|
+import org.bukkit.craftbukkit.inventory.CraftItemFactory;
|
|
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
|
|
+import org.bukkit.craftbukkit.util.CraftNamespacedKey;
|
|
+import org.bukkit.plugin.PluginManager;
|
|
+import org.bukkit.plugin.SimplePluginManager;
|
|
+import org.bukkit.support.AbstractTestingBase;
|
|
+import org.mockito.Mockito;
|
|
+
|
|
+import static org.mockito.Mockito.any;
|
|
+import static org.mockito.Mockito.mock;
|
|
+import static org.mockito.Mockito.when;
|
|
+
|
|
+public final class DummyServer {
|
|
+
|
|
+ @SuppressWarnings({"deprecation", "removal"})
|
|
+ public static void setup() {
|
|
+ //noinspection ConstantValue
|
|
+ if (Bukkit.getServer() != null) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ final Server dummyServer = mock(Server.class, Mockito.withSettings().stubOnly());
|
|
+
|
|
+ final Logger logger = Logger.getLogger(DummyServer.class.getCanonicalName());
|
|
+ when(dummyServer.getLogger()).thenReturn(logger);
|
|
+ when(dummyServer.getName()).thenReturn(DummyServer.class.getSimpleName());
|
|
+ when(dummyServer.getVersion()).thenReturn("Version_" + DummyServer.class.getPackage().getImplementationVersion());
|
|
+ when(dummyServer.getBukkitVersion()).thenReturn("BukkitVersion_" + DummyServer.class.getPackage().getImplementationVersion());
|
|
+
|
|
+ final Thread currentThread = Thread.currentThread();
|
|
+ when(dummyServer.isPrimaryThread()).thenAnswer(ignored -> Thread.currentThread().equals(currentThread));
|
|
+
|
|
+ when(dummyServer.getItemFactory()).thenReturn(CraftItemFactory.instance());
|
|
+
|
|
+ when(dummyServer.getUnsafe()).thenAnswer(ignored -> CraftMagicNumbers.INSTANCE); // lambda for lazy load
|
|
+
|
|
+ when(dummyServer.createBlockData(any(Material.class))).thenAnswer(invocation -> {
|
|
+ return CraftBlockData.newData(invocation.getArgument(0, Material.class), null);
|
|
+ });
|
|
+
|
|
+ when(dummyServer.getLootTable(any(NamespacedKey.class))).thenAnswer(invocation -> {
|
|
+ final NamespacedKey key = invocation.getArgument(0, NamespacedKey.class);
|
|
+ return new org.bukkit.craftbukkit.CraftLootTable(key, AbstractTestingBase.DATA_PACK.getLootData().getLootTable(CraftNamespacedKey.toMinecraft(key)));
|
|
+ });
|
|
+
|
|
+ when(dummyServer.getRegistry(any())).thenAnswer(invocation -> {
|
|
+ // LazyRegistry because the vanilla data hasn't been bootstrapped yet.
|
|
+ return new LazyRegistry(() -> CraftRegistry.createRegistry(invocation.getArgument(0, Class.class), AbstractTestingBase.REGISTRY_CUSTOM));
|
|
+ });
|
|
+
|
|
+ final PluginManager pluginManager = new SimplePluginManager(dummyServer, new SimpleCommandMap(dummyServer));
|
|
+ when(dummyServer.getPluginManager()).thenReturn(pluginManager);
|
|
+
|
|
+ Bukkit.setServer(dummyServer);
|
|
+
|
|
+ }
|
|
+}
|
|
diff --git a/src/test/java/io/papermc/paper/testing/LazyRegistry.java b/src/test/java/io/papermc/paper/testing/LazyRegistry.java
|
|
new file mode 100644
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
|
--- /dev/null
|
|
+++ b/src/test/java/io/papermc/paper/testing/LazyRegistry.java
|
|
@@ -0,0 +0,0 @@
|
|
+package io.papermc.paper.testing;
|
|
+
|
|
+import java.util.Iterator;
|
|
+import java.util.function.Supplier;
|
|
+import java.util.stream.Stream;
|
|
+import java.util.stream.StreamSupport;
|
|
+import org.bukkit.Keyed;
|
|
+import org.bukkit.NamespacedKey;
|
|
+import org.bukkit.Registry;
|
|
+import org.jetbrains.annotations.NotNull;
|
|
+import org.jetbrains.annotations.Nullable;
|
|
+
|
|
+public record LazyRegistry(Supplier<Registry<Keyed>> supplier) implements Registry<Keyed> {
|
|
+
|
|
+ @NotNull
|
|
+ @Override
|
|
+ public Iterator<Keyed> iterator() {
|
|
+ return this.supplier().get().iterator();
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public @Nullable Keyed get(@NotNull final NamespacedKey key) {
|
|
+ return this.supplier().get().get(key);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public @NotNull Stream<Keyed> stream() {
|
|
+ return StreamSupport.stream(this.supplier.get().spliterator(), false);
|
|
+ }
|
|
+}
|
|
diff --git a/src/test/java/org/bukkit/support/AbstractTestingBase.java b/src/test/java/org/bukkit/support/AbstractTestingBase.java
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
|
|
--- a/src/test/java/org/bukkit/support/AbstractTestingBase.java
|
|
+++ b/src/test/java/org/bukkit/support/AbstractTestingBase.java
|
|
@@ -0,0 +0,0 @@ public abstract class AbstractTestingBase {
|
|
LayeredRegistryAccess<RegistryLayer> layers = RegistryLayer.createRegistryAccess();
|
|
layers = WorldLoader.loadAndReplaceLayer(resourceManager, layers, RegistryLayer.WORLDGEN, RegistryDataLoader.WORLDGEN_REGISTRIES);
|
|
REGISTRY_CUSTOM = layers.compositeAccess().freeze();
|
|
+ io.papermc.paper.testing.DummyServer.setup(); // Paper
|
|
// Register vanilla pack
|
|
DATA_PACK = ReloadableServerResources.loadResources(resourceManager, REGISTRY_CUSTOM, FeatureFlags.REGISTRY.allFlags(), Commands.CommandSelection.DEDICATED, 0, MoreExecutors.directExecutor(), MoreExecutors.directExecutor()).join();
|
|
// Bind tags
|
|
@@ -0,0 +0,0 @@ public abstract class AbstractTestingBase {
|
|
// Biome shortcut
|
|
BIOMES = REGISTRY_CUSTOM.registryOrThrow(Registries.BIOME);
|
|
|
|
- DummyServer.setup();
|
|
DummyEnchantments.setup();
|
|
|
|
CraftRegistry.setMinecraftRegistry(REGISTRY_CUSTOM);
|
|
diff --git a/src/test/java/org/bukkit/support/DummyServer.java b/src/test/java/org/bukkit/support/DummyServer.java
|
|
deleted file mode 100644
|
|
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000
|
|
--- a/src/test/java/org/bukkit/support/DummyServer.java
|
|
+++ /dev/null
|
|
@@ -0,0 +0,0 @@
|
|
-package org.bukkit.support;
|
|
-
|
|
-import java.lang.reflect.InvocationHandler;
|
|
-import java.lang.reflect.Method;
|
|
-import java.lang.reflect.Proxy;
|
|
-import java.util.HashMap;
|
|
-import java.util.logging.Logger;
|
|
-import org.bukkit.Bukkit;
|
|
-import org.bukkit.Material;
|
|
-import org.bukkit.NamespacedKey;
|
|
-import org.bukkit.Server;
|
|
-import org.bukkit.craftbukkit.CraftLootTable;
|
|
-import org.bukkit.craftbukkit.CraftRegistry;
|
|
-import org.bukkit.craftbukkit.block.data.CraftBlockData;
|
|
-import org.bukkit.craftbukkit.inventory.CraftItemFactory;
|
|
-import org.bukkit.craftbukkit.util.CraftMagicNumbers;
|
|
-import org.bukkit.craftbukkit.util.CraftNamespacedKey;
|
|
-import org.bukkit.craftbukkit.util.Versioning;
|
|
-
|
|
-public final class DummyServer implements InvocationHandler {
|
|
- private static interface MethodHandler {
|
|
- Object handle(DummyServer server, Object[] args);
|
|
- }
|
|
- private static final HashMap<Method, MethodHandler> methods = new HashMap<Method, MethodHandler>();
|
|
- static {
|
|
- try {
|
|
- methods.put(
|
|
- Server.class.getMethod("getItemFactory"),
|
|
- new MethodHandler() {
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- return CraftItemFactory.instance();
|
|
- }
|
|
- }
|
|
- );
|
|
- methods.put(
|
|
- Server.class.getMethod("getName"),
|
|
- new MethodHandler() {
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- return DummyServer.class.getName();
|
|
- }
|
|
- }
|
|
- );
|
|
- methods.put(
|
|
- Server.class.getMethod("getVersion"),
|
|
- new MethodHandler() {
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- return DummyServer.class.getPackage().getImplementationVersion();
|
|
- }
|
|
- }
|
|
- );
|
|
- methods.put(
|
|
- Server.class.getMethod("getBukkitVersion"),
|
|
- new MethodHandler() {
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- return Versioning.getBukkitVersion();
|
|
- }
|
|
- }
|
|
- );
|
|
- methods.put(
|
|
- Server.class.getMethod("getLogger"),
|
|
- new MethodHandler() {
|
|
- final Logger logger = Logger.getLogger(DummyServer.class.getCanonicalName());
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- return logger;
|
|
- }
|
|
- }
|
|
- );
|
|
- methods.put(
|
|
- Server.class.getMethod("getUnsafe"),
|
|
- new MethodHandler() {
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- return CraftMagicNumbers.INSTANCE;
|
|
- }
|
|
- }
|
|
- );
|
|
- methods.put(
|
|
- Server.class.getMethod("createBlockData", Material.class),
|
|
- new MethodHandler() {
|
|
- final Logger logger = Logger.getLogger(DummyServer.class.getCanonicalName());
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- return CraftBlockData.newData((Material) args[0], null);
|
|
- }
|
|
- }
|
|
- );
|
|
- methods.put(Server.class.getMethod("getLootTable", NamespacedKey.class),
|
|
- new MethodHandler() {
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- NamespacedKey key = (NamespacedKey) args[0];
|
|
- return new CraftLootTable(key, AbstractTestingBase.DATA_PACK.getLootData().getLootTable(CraftNamespacedKey.toMinecraft(key)));
|
|
- }
|
|
- }
|
|
- );
|
|
- methods.put(Server.class.getMethod("getRegistry", Class.class),
|
|
- new MethodHandler() {
|
|
- @Override
|
|
- public Object handle(DummyServer server, Object[] args) {
|
|
- return CraftRegistry.createRegistry((Class) args[0], AbstractTestingBase.REGISTRY_CUSTOM);
|
|
- }
|
|
- }
|
|
- );
|
|
- Bukkit.setServer(Proxy.getProxyClass(Server.class.getClassLoader(), Server.class).asSubclass(Server.class).getConstructor(InvocationHandler.class).newInstance(new DummyServer()));
|
|
- } catch (Throwable t) {
|
|
- throw new Error(t);
|
|
- }
|
|
- }
|
|
-
|
|
- public static void setup() {}
|
|
-
|
|
- private DummyServer() {};
|
|
-
|
|
- @Override
|
|
- public Object invoke(Object proxy, Method method, Object[] args) {
|
|
- MethodHandler handler = DummyServer.methods.get(method);
|
|
- if (handler != null) {
|
|
- return handler.handle(this, args);
|
|
- }
|
|
- throw new UnsupportedOperationException(String.valueOf(method));
|
|
- }
|
|
-}
|