From 733a460c5944c300d26e8dd5f5d35963b13f55a2 Mon Sep 17 00:00:00 2001 From: SirSmurfy2 <82696841+TheAbsolutionism@users.noreply.github.com> Date: Thu, 10 Apr 2025 01:54:03 -0400 Subject: [PATCH 1/4] Initial Commit --- .../skript/test/runner/SkriptJUnitTest.java | 80 +++++++++++++++++-- .../syntaxes/effects/EffGoatHornsTest.java | 7 +- .../tests/syntaxes/events/BellEventsTest.java | 26 +----- .../tests/syntaxes/events/EvtBreedTest.java | 3 +- .../syntaxes/events/EvtBucketEntityTest.java | 9 +-- .../syntaxes/events/EvtFireworkTest.java | 4 +- .../tests/syntaxes/events/EvtFishTest.java | 5 +- .../syntaxes/events/EvtPiglinBarterTest.java | 24 ++---- .../events/EvtVehicleCollisionTest.java | 2 +- .../events/PlayerElytraBoostEventTest.java | 33 +++----- .../expressions/ExprAffectedEntitiesTest.java | 2 +- 11 files changed, 105 insertions(+), 90 deletions(-) diff --git a/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java b/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java index 69f2c656218..99ce2f0dbd7 100644 --- a/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java +++ b/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java @@ -1,16 +1,15 @@ package ch.njol.skript.test.runner; -import org.bukkit.Bukkit; -import org.bukkit.GameRule; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; +import ch.njol.skript.Skript; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Pig; +import org.jetbrains.annotations.Nullable; -import ch.njol.skript.Skript; +import java.lang.reflect.Constructor; +import java.util.Arrays; /** * Class that helps the JUnit test communicate with Skript. @@ -84,9 +83,19 @@ public static Location getTestLocation() { * @return Pig that has been spawned. */ public static Pig spawnTestPig() { + return spawnTestEntity(EntityType.PIG); + } + + /** + * Spawns a test {@link Entity} from the provided {@code entityType} + * @param entityType The desired {@link EntityType} to spawn + * @return The spawned {@link Entity} + */ + public static E spawnTestEntity(EntityType entityType) { if (delay <= 0D) delay = 1; // A single tick allows the piggy to spawn before server shutdown. - return (Pig) getTestWorld().spawnEntity(getTestLocation(), EntityType.PIG); + //noinspection unchecked + return (E) getTestWorld().spawnEntity(getTestLocation(), entityType); } /** @@ -132,4 +141,61 @@ public static void clearJUnitTest() { setShutdownDelay(0); } + /** + * Get a {@link Constructor} of the provided {@code clazz} and the parameter types from {@code types}. + * @param clazz The {@link Class} to get the constructor + * @param types The {@link Class}es of the parameter types for the {@link Constructor} + * @return The retrieved {@link Constructor} or {@code null} + * @throws IllegalStateException if unable to get {@link Constructor} + */ + public static Constructor getConstructor(Class clazz, @Nullable Class ... types) { + return getConstructor(clazz, true, types); + } + + /** + * Get a {@link Constructor} of the provided {@code clazz} and the parameter types from {@code types} + * @param clazz The {@link Class} to get the constructor + * @param throwException Whether to throw an exception if unable to get {@link Constructor} + * @param types The {@link Class}es of the parameter types for the {@link Constructor} + * @return The retrieved {@link Constructor} or {@code null} + */ + public static @Nullable Constructor getConstructor(Class clazz, boolean throwException, @Nullable Class ... types) { + try { + return clazz.getConstructor(types); + } catch (NoSuchMethodException ignored) {} + if (!throwException) + return null; + throw new IllegalStateException("There is no constructor for the class '" + clazz.getName() + "'" + + (types == null ? "" : " with the types: " + Arrays.toString(types))); + } + + /** + * Construct an instance from the provided {@link Constructor} using the provided {@link Object}s + * @param constructor The {@link Constructor} to construct + * @param objects The {@link Object}s used to construct + * @return The constructed instance or {@code null} + * @throws IllegalStateException if unable to construct the {@link Constructor} + */ + public static E constructInstance(Constructor constructor, @Nullable Object ... objects) { + return constructInstance(constructor, true, objects); + } + + /** + * Construct an instance from the provided {@link Constructor} using the provided {@link Object}s + * @param constructor The {@link Constructor} to construct + * @param throwException Whether to throw an exception if unable to construct the {@link Constructor} + * @param objects The {@link Object}s used to construct + * @return The constructed instance or {@code null} + */ + public static @Nullable E constructInstance(Constructor constructor, boolean throwException, @Nullable Object ... objects) { + try { + //noinspection unchecked + return (E) constructor.newInstance(objects); + } catch (Exception ignored) {} + if (!throwException) + return null; + throw new IllegalStateException("Unable to construct the provided constructor" + + (objects == null ? "" : " using " + Arrays.toString(objects))); + } + } diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/effects/EffGoatHornsTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/effects/EffGoatHornsTest.java index 11620703805..9098491262a 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/effects/EffGoatHornsTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/effects/EffGoatHornsTest.java @@ -1,12 +1,9 @@ package org.skriptlang.skript.test.tests.syntaxes.effects; import ch.njol.skript.test.runner.SkriptJUnitTest; -import org.bukkit.Bukkit; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Goat; -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.world.WorldLoadEvent; import org.junit.After; -import org.junit.Before; import org.junit.Test; public class EffGoatHornsTest extends SkriptJUnitTest { @@ -19,7 +16,7 @@ public class EffGoatHornsTest extends SkriptJUnitTest { @Test public void test() { - goat = getTestWorld().spawn(getTestWorld().getSpawnLocation(), Goat.class); + goat = spawnTestEntity(EntityType.GOAT); } @After diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/BellEventsTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/BellEventsTest.java index d6e17ac4f1b..5c9bfadd2df 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/BellEventsTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/BellEventsTest.java @@ -1,12 +1,10 @@ package org.skriptlang.skript.test.tests.syntaxes.events; -import ch.njol.skript.Skript; import ch.njol.skript.test.runner.SkriptJUnitTest; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Pillager; import org.bukkit.event.Event; @@ -16,22 +14,16 @@ import org.junit.Test; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; -import java.util.Map; import java.util.Set; public class BellEventsTest extends SkriptJUnitTest { - private static final boolean canRun = Skript.classExists("org.bukkit.block.Bell"); - private Block bell; private LivingEntity pillager; @Before public void setUp() { - if (!canRun) - return; this.bell = setBlock(Material.BELL); this.pillager = getTestWorld().spawn(bell.getLocation().add(0, 1, 0), Pillager.class); setShutdownDelay(1); @@ -39,23 +31,9 @@ public void setUp() { @Test public void testEvents() { - if (!canRun) - return; Set events = new HashSet<>(); - if (Skript.classExists("org.bukkit.event.block.BellRingEvent")) { - events.add(new BellRingEvent(this.bell, BlockFace.EAST, null)); - } else if (Skript.classExists("io.papermc.paper.event.block.BellRingEvent")) { - try { - events.add(io.papermc.paper.event.block.BellRingEvent.class.getConstructor(Block.class, Entity.class) - .newInstance(this.bell, null)); - } catch (ReflectiveOperationException ignored) { - } - - } - - if (Skript.classExists("org.bukkit.event.block.BellResonateEvent")) - events.add(new BellResonateEvent(this.bell, Collections.singletonList(this.pillager))); - + events.add(new BellRingEvent(this.bell, BlockFace.EAST, null)); + events.add(new BellResonateEvent(this.bell, Collections.singletonList(this.pillager))); for (Event event : events) Bukkit.getPluginManager().callEvent(event); } diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtBreedTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtBreedTest.java index be6eb6da784..571ba8ee238 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtBreedTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtBreedTest.java @@ -5,6 +5,7 @@ import org.bukkit.Material; import org.bukkit.entity.Pig; import org.bukkit.entity.Player; +import org.bukkit.event.entity.EntityBreedEvent; import org.bukkit.inventory.ItemStack; import org.easymock.EasyMock; import org.junit.After; @@ -39,7 +40,7 @@ public void before() { @Test public void test() { Bukkit.getPluginManager().callEvent( - new org.bukkit.event.entity.EntityBreedEvent( + new EntityBreedEvent( child, mother, father, player, new ItemStack(Material.CARROT), 0)); } diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtBucketEntityTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtBucketEntityTest.java index 10764efff03..0cd12fa4c49 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtBucketEntityTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtBucketEntityTest.java @@ -3,10 +3,7 @@ import ch.njol.skript.test.runner.SkriptJUnitTest; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.entity.Cod; -import org.bukkit.entity.Fish; -import org.bukkit.entity.Player; -import org.bukkit.entity.Salmon; +import org.bukkit.entity.*; import org.bukkit.event.player.PlayerBucketEntityEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; @@ -26,8 +23,8 @@ public class EvtBucketEntityTest extends SkriptJUnitTest { @Before public void setup() { - salmon = getTestLocation().getWorld().spawn(getTestLocation(), Salmon.class); - cod = getTestLocation().getWorld().spawn(getTestLocation(), Cod.class); + salmon = spawnTestEntity(EntityType.SALMON); + cod = spawnTestEntity(EntityType.COD); } @Test diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtFireworkTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtFireworkTest.java index 75941ff7de6..4b605f10275 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtFireworkTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtFireworkTest.java @@ -20,7 +20,7 @@ public class EvtFireworkTest extends SkriptJUnitTest { private EntityType entityType; - private List fireworkList = new ArrayList<>(); + private final List fireworkList = new ArrayList<>(); @Before public void getEntity() { @@ -35,7 +35,7 @@ public void getEntity() { public void callEvents() { List events = new ArrayList<>(); for (SkriptColor color : SkriptColor.values()) { - Firework firework = (Firework) getTestWorld().spawnEntity(getTestLocation(), entityType); + Firework firework = spawnTestEntity(entityType); FireworkEffect fireworkEffect = FireworkEffect.builder().withColor(color.asDyeColor().getFireworkColor()).build(); FireworkMeta fireworkMeta = firework.getFireworkMeta(); fireworkMeta.addEffects(fireworkEffect); diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtFishTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtFishTest.java index 4e21768cd2b..4af33528bad 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtFishTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtFishTest.java @@ -1,6 +1,5 @@ package org.skriptlang.skript.test.tests.syntaxes.events; -import ch.njol.skript.Skript; import ch.njol.skript.test.runner.SkriptJUnitTest; import org.bukkit.Bukkit; import org.bukkit.entity.*; @@ -22,8 +21,8 @@ public class EvtFishTest extends SkriptJUnitTest { @Before public void setup() { - salmon = getTestLocation().getWorld().spawn(getTestLocation(), Salmon.class); - cod = getTestLocation().getWorld().spawn(getTestLocation(), Cod.class); + salmon = spawnTestEntity(EntityType.SALMON); + cod = spawnTestEntity(EntityType.COD); } @Test diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtPiglinBarterTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtPiglinBarterTest.java index 9752d3f06a4..74a98419e14 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtPiglinBarterTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtPiglinBarterTest.java @@ -1,11 +1,11 @@ package org.skriptlang.skript.test.tests.syntaxes.events; -import ch.njol.skript.Skript; import ch.njol.skript.test.runner.SkriptJUnitTest; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Piglin; +import org.bukkit.event.entity.PiglinBarterEvent; import org.bukkit.inventory.ItemStack; import org.junit.After; import org.junit.Before; @@ -16,8 +16,7 @@ public class EvtPiglinBarterTest extends SkriptJUnitTest { - private Entity piglin; - private static final boolean canRun = Skript.classExists("org.bukkit.event.entity.PiglinBarterEvent"); + private Piglin piglin; static { setShutdownDelay(1); @@ -25,33 +24,20 @@ public class EvtPiglinBarterTest extends SkriptJUnitTest { @Before public void spawn() { - if (!canRun) - return; - - piglin = getTestWorld().spawnEntity(getTestLocation(), EntityType.PIGLIN); + piglin = spawnTestEntity(EntityType.PIGLIN); } @Test public void testCall() { - if (!canRun) - return; - ItemStack input = new ItemStack(Material.GOLD_INGOT); List outcome = new ArrayList<>(); outcome.add(new ItemStack(Material.EMERALD)); - try { - Bukkit.getPluginManager().callEvent( - new org.bukkit.event.entity.PiglinBarterEvent( - (org.bukkit.entity.Piglin) piglin, input, outcome)); - } catch (NoClassDefFoundError ignored) { } + Bukkit.getPluginManager().callEvent(new PiglinBarterEvent(piglin, input, outcome)); } @After public void remove() { - if (!canRun) - return; - piglin.remove(); } diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtVehicleCollisionTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtVehicleCollisionTest.java index bc9c132b4e3..c56334f3099 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtVehicleCollisionTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtVehicleCollisionTest.java @@ -22,7 +22,7 @@ public class EvtVehicleCollisionTest extends SkriptJUnitTest { @Before public void setUp() { pig = spawnTestPig(); - sheep = (Sheep) getTestWorld().spawnEntity(getTestLocation(), EntityType.SHEEP); + sheep = spawnTestEntity(EntityType.SHEEP); old = getBlock().getType(); setBlock(Material.OBSIDIAN); } diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java index 75855937cc6..ccf2b1812d5 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java @@ -30,37 +30,28 @@ public void setUp() { entityType = EntityType.valueOf("FIREWORK_ROCKET"); } assert entityType != null; - firework = (Firework) getTestWorld().spawnEntity(getTestLocation(), entityType); + firework = spawnTestEntity(entityType); firework.setTicksToDetonate(9999999); } @Test public void test() { - Constructor constructor = null; + Constructor constructor = getConstructor(PlayerElytraBoostEvent.class, false, Player.class, ItemStack.class, Firework.class, EquipmentSlot.class); boolean newerConstructor = false; - try { - constructor = PlayerElytraBoostEvent.class.getConstructor(Player.class, ItemStack.class, Firework.class, EquipmentSlot.class); + if (constructor != null) { newerConstructor = true; - } catch (Exception ignored) { - try { - constructor = PlayerElytraBoostEvent.class.getConstructor(Player.class, ItemStack.class, Firework.class); - } catch (NoSuchMethodException e) { - throw new IllegalStateException("No valid constructor for 'PlayerElytraBoostEvent'"); - } + } else { + constructor = getConstructor(PlayerElytraBoostEvent.class, Player.class, ItemStack.class, Firework.class); } - try { - Event event; - if (newerConstructor) { - event = (Event) constructor.newInstance(player, new ItemStack(Material.FIREWORK_ROCKET), firework, EquipmentSlot.HAND); - } else { - event = (Event) constructor.newInstance(player, new ItemStack(Material.FIREWORK_ROCKET), firework); - } - - Bukkit.getPluginManager().callEvent(event); - } catch (Exception e) { - throw new RuntimeException("Unable to construct event."); + ItemStack rocket = new ItemStack(Material.FIREWORK_ROCKET); + Event event; + if (newerConstructor) { + event = constructInstance(constructor, player, rocket, firework, EquipmentSlot.HAND); + } else { + event = constructInstance(constructor, player, rocket, firework); } + Bukkit.getPluginManager().callEvent(event); } @After diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/expressions/ExprAffectedEntitiesTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/expressions/ExprAffectedEntitiesTest.java index ab7c1f073f9..cbef38e5da2 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/expressions/ExprAffectedEntitiesTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/expressions/ExprAffectedEntitiesTest.java @@ -24,7 +24,7 @@ public class ExprAffectedEntitiesTest extends SkriptJUnitTest { public void setUp() { piggy = spawnTestPig(); entityList.add(piggy); - cloud = (AreaEffectCloud) getTestWorld().spawnEntity(getTestLocation(), EntityType.AREA_EFFECT_CLOUD); + cloud = spawnTestEntity(EntityType.AREA_EFFECT_CLOUD); } @Test From fdcf9cb19eb7a4c73c73b76e115f7eb73d9e05d0 Mon Sep 17 00:00:00 2001 From: SirSmurfy2 <82696841+TheAbsolutionism@users.noreply.github.com> Date: Thu, 10 Apr 2025 02:09:39 -0400 Subject: [PATCH 2/4] Update PlayerElytraBoostEventTest.java --- .../syntaxes/events/PlayerElytraBoostEventTest.java | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java index ccf2b1812d5..6baea85145d 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java @@ -37,20 +37,15 @@ public void setUp() { @Test public void test() { Constructor constructor = getConstructor(PlayerElytraBoostEvent.class, false, Player.class, ItemStack.class, Firework.class, EquipmentSlot.class); - boolean newerConstructor = false; - if (constructor != null) { - newerConstructor = true; - } else { - constructor = getConstructor(PlayerElytraBoostEvent.class, Player.class, ItemStack.class, Firework.class); - } - ItemStack rocket = new ItemStack(Material.FIREWORK_ROCKET); Event event; - if (newerConstructor) { + if (constructor != null) { event = constructInstance(constructor, player, rocket, firework, EquipmentSlot.HAND); } else { + constructor = getConstructor(PlayerElytraBoostEvent.class, Player.class, ItemStack.class, Firework.class); event = constructInstance(constructor, player, rocket, firework); } + Bukkit.getPluginManager().callEvent(event); } From 50b4d64f053e475802a00709fa2acf1e76f2b7eb Mon Sep 17 00:00:00 2001 From: SirSmurfy2 <82696841+TheAbsolutionism@users.noreply.github.com> Date: Thu, 10 Apr 2025 16:19:59 -0400 Subject: [PATCH 3/4] Requested Changes --- .../njol/skript/test/runner/SkriptJUnitTest.java | 16 ++++++++-------- .../events/PlayerElytraBoostEventTest.java | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java b/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java index 99ce2f0dbd7..916d8b9c192 100644 --- a/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java +++ b/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java @@ -93,7 +93,7 @@ public static Pig spawnTestPig() { */ public static E spawnTestEntity(EntityType entityType) { if (delay <= 0D) - delay = 1; // A single tick allows the piggy to spawn before server shutdown. + delay = 1; // A single tick allows the entity to spawn before server shutdown. //noinspection unchecked return (E) getTestWorld().spawnEntity(getTestLocation(), entityType); } @@ -170,24 +170,24 @@ public static Constructor getConstructor(Class clazz, @Nullable Class . } /** - * Construct an instance from the provided {@link Constructor} using the provided {@link Object}s + * Construct a new instance from the provided {@link Constructor} using the provided {@link Object}s * @param constructor The {@link Constructor} to construct * @param objects The {@link Object}s used to construct * @return The constructed instance or {@code null} - * @throws IllegalStateException if unable to construct the {@link Constructor} + * @throws IllegalStateException if unable to construct a new instance */ - public static E constructInstance(Constructor constructor, @Nullable Object ... objects) { - return constructInstance(constructor, true, objects); + public static E newInstance(Constructor constructor, @Nullable Object ... objects) { + return newInstance(constructor, true, objects); } /** - * Construct an instance from the provided {@link Constructor} using the provided {@link Object}s + * Construct a new instance from the provided {@link Constructor} using the provided {@link Object}s * @param constructor The {@link Constructor} to construct - * @param throwException Whether to throw an exception if unable to construct the {@link Constructor} + * @param throwException Whether to throw an exception if unable to construct a new instance * @param objects The {@link Object}s used to construct * @return The constructed instance or {@code null} */ - public static @Nullable E constructInstance(Constructor constructor, boolean throwException, @Nullable Object ... objects) { + public static @Nullable E newInstance(Constructor constructor, boolean throwException, @Nullable Object ... objects) { try { //noinspection unchecked return (E) constructor.newInstance(objects); diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java index 6baea85145d..0ee948dcb53 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java @@ -40,10 +40,10 @@ public void test() { ItemStack rocket = new ItemStack(Material.FIREWORK_ROCKET); Event event; if (constructor != null) { - event = constructInstance(constructor, player, rocket, firework, EquipmentSlot.HAND); + event = newInstance(constructor, player, rocket, firework, EquipmentSlot.HAND); } else { constructor = getConstructor(PlayerElytraBoostEvent.class, Player.class, ItemStack.class, Firework.class); - event = constructInstance(constructor, player, rocket, firework); + event = newInstance(constructor, player, rocket, firework); } Bukkit.getPluginManager().callEvent(event); From dbfddaf8993f8ce21b68dba86b8ee6003fbdc43b Mon Sep 17 00:00:00 2001 From: SirSmurfy2 <82696841+TheAbsolutionism@users.noreply.github.com> Date: Sun, 20 Apr 2025 23:31:59 -0400 Subject: [PATCH 4/4] Changes --- .../skript/test/runner/SkriptJUnitTest.java | 61 ------------------- .../events/PlayerElytraBoostEventTest.java | 21 ++++--- 2 files changed, 14 insertions(+), 68 deletions(-) diff --git a/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java b/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java index 916d8b9c192..c4c346f3690 100644 --- a/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java +++ b/src/main/java/ch/njol/skript/test/runner/SkriptJUnitTest.java @@ -6,10 +6,6 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Pig; -import org.jetbrains.annotations.Nullable; - -import java.lang.reflect.Constructor; -import java.util.Arrays; /** * Class that helps the JUnit test communicate with Skript. @@ -141,61 +137,4 @@ public static void clearJUnitTest() { setShutdownDelay(0); } - /** - * Get a {@link Constructor} of the provided {@code clazz} and the parameter types from {@code types}. - * @param clazz The {@link Class} to get the constructor - * @param types The {@link Class}es of the parameter types for the {@link Constructor} - * @return The retrieved {@link Constructor} or {@code null} - * @throws IllegalStateException if unable to get {@link Constructor} - */ - public static Constructor getConstructor(Class clazz, @Nullable Class ... types) { - return getConstructor(clazz, true, types); - } - - /** - * Get a {@link Constructor} of the provided {@code clazz} and the parameter types from {@code types} - * @param clazz The {@link Class} to get the constructor - * @param throwException Whether to throw an exception if unable to get {@link Constructor} - * @param types The {@link Class}es of the parameter types for the {@link Constructor} - * @return The retrieved {@link Constructor} or {@code null} - */ - public static @Nullable Constructor getConstructor(Class clazz, boolean throwException, @Nullable Class ... types) { - try { - return clazz.getConstructor(types); - } catch (NoSuchMethodException ignored) {} - if (!throwException) - return null; - throw new IllegalStateException("There is no constructor for the class '" + clazz.getName() + "'" - + (types == null ? "" : " with the types: " + Arrays.toString(types))); - } - - /** - * Construct a new instance from the provided {@link Constructor} using the provided {@link Object}s - * @param constructor The {@link Constructor} to construct - * @param objects The {@link Object}s used to construct - * @return The constructed instance or {@code null} - * @throws IllegalStateException if unable to construct a new instance - */ - public static E newInstance(Constructor constructor, @Nullable Object ... objects) { - return newInstance(constructor, true, objects); - } - - /** - * Construct a new instance from the provided {@link Constructor} using the provided {@link Object}s - * @param constructor The {@link Constructor} to construct - * @param throwException Whether to throw an exception if unable to construct a new instance - * @param objects The {@link Object}s used to construct - * @return The constructed instance or {@code null} - */ - public static @Nullable E newInstance(Constructor constructor, boolean throwException, @Nullable Object ... objects) { - try { - //noinspection unchecked - return (E) constructor.newInstance(objects); - } catch (Exception ignored) {} - if (!throwException) - return null; - throw new IllegalStateException("Unable to construct the provided constructor" - + (objects == null ? "" : " using " + Arrays.toString(objects))); - } - } diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java index 0ee948dcb53..87bc1eb25ff 100644 --- a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/PlayerElytraBoostEventTest.java @@ -36,15 +36,22 @@ public void setUp() { @Test public void test() { - Constructor constructor = getConstructor(PlayerElytraBoostEvent.class, false, Player.class, ItemStack.class, Firework.class, EquipmentSlot.class); ItemStack rocket = new ItemStack(Material.FIREWORK_ROCKET); - Event event; - if (constructor != null) { - event = newInstance(constructor, player, rocket, firework, EquipmentSlot.HAND); - } else { - constructor = getConstructor(PlayerElytraBoostEvent.class, Player.class, ItemStack.class, Firework.class); - event = newInstance(constructor, player, rocket, firework); + Constructor constructor = null; + Event event = null; + try { + constructor = PlayerElytraBoostEvent.class.getDeclaredConstructor(Player.class, ItemStack.class, Firework.class, EquipmentSlot.class); + event = (Event) constructor.newInstance(player, rocket, firework, EquipmentSlot.HAND); + } catch (Exception ignored) {} + if (constructor == null) { + try { + constructor = PlayerElytraBoostEvent.class.getConstructor(Player.class, ItemStack.class, Firework.class); + event = (Event) constructor.newInstance(player, rocket, firework); + } catch (Exception e) { + throw new RuntimeException("No valid constructor for 'PlayerElytraBoostEvent'"); + } } + assert event != null; Bukkit.getPluginManager().callEvent(event); }