Skip to content

Commit b54b482

Browse files
committed
test: Enable and enhance VanillaWrapperListener tests for projectile damage
1 parent 8ffc006 commit b54b482

2 files changed

Lines changed: 77 additions & 26 deletions

File tree

Lines changed: 72 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
package studio.magemonkey.divinity.manager.listener.object;
22

33
import org.bukkit.Material;
4-
import org.bukkit.entity.Player;
4+
import org.bukkit.NamespacedKey;
55
import org.bukkit.entity.Trident;
66
import org.bukkit.inventory.ItemStack;
7+
import org.bukkit.inventory.meta.ItemMeta;
8+
import org.bukkit.persistence.PersistentDataType;
79
import org.junit.jupiter.api.BeforeEach;
8-
import org.junit.jupiter.api.Disabled;
910
import org.junit.jupiter.api.Test;
1011
import org.mockbukkit.mockbukkit.entity.PlayerMock;
12+
import studio.magemonkey.divinity.api.event.DivinityDamageEvent.Start;
13+
import studio.magemonkey.divinity.stats.EntityStats;
14+
import studio.magemonkey.divinity.stats.ProjectileStats;
15+
import studio.magemonkey.divinity.stats.items.ItemStats;
16+
import studio.magemonkey.divinity.stats.items.attributes.DamageAttribute;
1117
import studio.magemonkey.divinity.api.event.DivinityDamageEvent;
1218
import studio.magemonkey.divinity.testutil.MockedTest;
1319

1420
import static org.junit.jupiter.api.Assertions.assertEquals;
21+
import static org.junit.jupiter.api.Assertions.assertTrue;
1522

16-
@Disabled("Methods are not implemented yet")
1723
public class VanillaWrapperListenerTest extends MockedTest {
18-
private Player damager;
19-
private Player target;
24+
private PlayerMock damager;
25+
private PlayerMock target;
2026

2127
@BeforeEach
2228
public void setup() {
@@ -28,16 +34,12 @@ public void setup() {
2834
void swordDoesAppropriateDamage() {
2935
final double expectedDamage = 5;
3036
damager.getInventory().setItemInMainHand(new ItemStack(Material.IRON_SWORD));
31-
((PlayerMock) target).simulateDamage(5, damager);
37+
EntityStats.purge(damager);
38+
target.simulateDamage(5, damager);
3239
assertEventFired(DivinityDamageEvent.Start.class, event -> {
33-
double damage = 0;
34-
for (Double value : event.getDamageMap().values()) {
35-
damage += value;
36-
}
37-
3840
assertEquals(target, event.getVictim(), "Event victim is not the target");
3941
assertEquals(damager, event.getDamager(), "Event damager is not the damager");
40-
assertEquals(expectedDamage, damage, 0.001);
42+
assertEquals(expectedDamage, getTotalDamage(event), 0.001);
4143

4244
return true;
4345
});
@@ -46,24 +48,70 @@ void swordDoesAppropriateDamage() {
4648
}
4749

4850
@Test
49-
void tridentDoesAppropriateDamage() {
50-
final double expectedDamage = 9;
51-
Trident trident = target.getWorld().spawn(target.getLocation(), Trident.class);
51+
void tridentUsesSavedVanillaWeaponDamageAfterSwap() {
52+
ItemStack tridentItem = new ItemStack(Material.TRIDENT);
53+
double expectedDamage = DamageAttribute.getVanillaDamage(tridentItem);
54+
Trident trident = target.getWorld().spawn(target.getLocation(), Trident.class);
55+
56+
damager.getInventory().setItemInMainHand(tridentItem);
57+
EntityStats.purge(damager);
58+
5259
trident.setShooter(damager);
53-
((PlayerMock) target).simulateDamage(9, trident);
54-
assertEventFired(DivinityDamageEvent.Start.class, event -> {
55-
double damage = 0;
56-
for (Double value : event.getDamageMap().values()) {
57-
damage += value;
58-
}
60+
trident.setItem(tridentItem);
61+
ProjectileStats.setPower(trident, 1D);
62+
63+
damager.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
64+
EntityStats.purge(damager);
5965

66+
target.simulateDamage(1, trident);
67+
assertEventFired(Start.class, event -> {
6068
assertEquals(target, event.getVictim(), "Event victim is not the target");
6169
assertEquals(damager, event.getDamager(), "Event damager is not the damager");
62-
assertEquals(expectedDamage, damage, 0.001);
70+
assertEquals(Material.TRIDENT, event.getWeapon().getType(), "Projectile weapon should be the trident");
71+
assertEquals(expectedDamage, getTotalDamage(event), 0.001);
6372

6473
return true;
6574
});
75+
}
6676

67-
assertEquals(20 - expectedDamage, target.getHealth(), 0.001);
77+
@Test
78+
void tridentUsesSavedCustomWeaponDamageAfterSwap() {
79+
final double expectedDamage = 13D;
80+
ItemStack customTrident = new ItemStack(Material.TRIDENT);
81+
setLegacyDamage(customTrident, ItemStats.getDamageByDefault(), expectedDamage);
82+
83+
damager.getInventory().setItemInMainHand(customTrident);
84+
EntityStats.purge(damager);
85+
86+
Trident trident = target.getWorld().spawn(target.getLocation(), Trident.class);
87+
trident.setShooter(damager);
88+
trident.setItem(customTrident);
89+
ProjectileStats.setPower(trident, 1D);
90+
91+
damager.getInventory().setItemInMainHand(new ItemStack(Material.AIR));
92+
EntityStats.purge(damager);
93+
94+
target.simulateDamage(1, trident);
95+
assertEventFired(Start.class, event -> {
96+
assertEquals(target, event.getVictim(), "Event victim is not the target");
97+
assertEquals(damager, event.getDamager(), "Event damager is not the damager");
98+
assertEquals(Material.TRIDENT, event.getWeapon().getType(), "Projectile weapon should be the trident");
99+
assertEquals(expectedDamage, getTotalDamage(event), 0.001);
100+
assertTrue(getTotalDamage(event) > 1D, "Projectile damage should come from the saved trident, not raw event damage");
101+
102+
return true;
103+
});
104+
}
105+
106+
private double getTotalDamage(Start event) {
107+
return event.getDamageMap().values().stream().mapToDouble(Double::doubleValue).sum();
108+
}
109+
110+
private void setLegacyDamage(ItemStack item, DamageAttribute attribute, double value) {
111+
ItemMeta meta = item.getItemMeta();
112+
meta.getPersistentDataContainer().set(NamespacedKey.fromString("prorpgitems:item_damage_" + attribute.getId()),
113+
PersistentDataType.DOUBLE,
114+
value);
115+
item.setItemMeta(meta);
68116
}
69-
}
117+
}

src/test/java/studio/magemonkey/divinity/testutil/MockedTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.util.zip.ZipEntry;
2828
import java.util.zip.ZipOutputStream;
2929

30+
import static org.junit.jupiter.api.Assertions.assertTrue;
3031
import static org.mockbukkit.mockbukkit.matcher.plugin.PluginManagerFiredEventClassMatcher.hasFiredEventInstance;
3132
import static org.mockbukkit.mockbukkit.matcher.plugin.PluginManagerFiredEventFilterMatcher.hasFiredFilteredEvent;
3233
import static org.mockito.Mockito.*;
@@ -126,11 +127,13 @@ public PlayerMock genPlayer(String name, boolean op) {
126127
}
127128

128129
public <T extends Event> void assertEventFired(Class<T> clazz) {
129-
hasFiredEventInstance(clazz).matches(server.getPluginManager());
130+
assertTrue(hasFiredEventInstance(clazz).matches(server.getPluginManager()),
131+
"Expected event to fire: " + clazz.getSimpleName());
130132
}
131133

132134
public <T extends Event> void assertEventFired(Class<T> clazz, Predicate<T> predicate) {
133-
hasFiredFilteredEvent(clazz, predicate).matches(server.getPluginManager());
135+
assertTrue(hasFiredFilteredEvent(clazz, predicate).matches(server.getPluginManager()),
136+
"Expected matching event to fire: " + clazz.getSimpleName());
134137
}
135138

136139
public void clearEvents() {

0 commit comments

Comments
 (0)