From 04519445228dba7b7cde6edf67a060a9776cbf66 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 4 Mar 2020 13:55:03 -0800 Subject: [PATCH 1/2] itemstats: Fix unarmed attack speed Since the writing of this plugin, the wiki has changed the format for weapon attack speeds[1] and now displays weapon attack speeds in length of game ticks. Hence, since unarmed attacks are at the rate of once every 4 game ticks, this commit updates our definition of the unarmed attack accordingly. [1] https://oldschool.runescape.wiki/w/Unarmed?diff=8467472&oldid=7810087 --- .../plugins/itemstats/ItemStatOverlay.java | 8 +- .../itemstats/ItemStatOverlayTest.java | 81 +++++++++++++++++++ 2 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java index 0fe410c563..3b49d1c6c3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.itemstats; +import com.google.common.annotations.VisibleForTesting; import com.google.inject.Inject; import java.awt.Color; import java.awt.Dimension; @@ -48,10 +49,11 @@ import net.runelite.http.api.item.ItemStats; public class ItemStatOverlay extends Overlay { - // Unarmed attack speed is 6 - private static final ItemStats UNARMED = new ItemStats(false, true, 0, 0, + // Unarmed attack speed is 4 + @VisibleForTesting + static final ItemStats UNARMED = new ItemStats(false, true, 0, 0, ItemEquipmentStats.builder() - .aspeed(6) + .aspeed(4) .build()); @Inject diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java new file mode 100644 index 0000000000..e4ea426dab --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2020 Jordan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.itemstats; + +import net.runelite.api.EquipmentInventorySlot; +import net.runelite.http.api.item.ItemEquipmentStats; +import net.runelite.http.api.item.ItemStats; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class ItemStatOverlayTest +{ + // Weapon definitions + private static final ItemStats ABYSSAL_DAGGER = new ItemStats(false, true, 0.453, 8, + ItemEquipmentStats.builder() + .slot(EquipmentInventorySlot.WEAPON.getSlotIdx()) + .astab(75) + .aslash(40) + .acrush(-4) + .amagic(1) + .dmagic(1) + .str(75) + .aspeed(4) + .build()); + private static final ItemStats KATANA = new ItemStats(false, true, 0, 8, + ItemEquipmentStats.builder() + .slot(EquipmentInventorySlot.WEAPON.getSlotIdx()) + .astab(7) + .aslash(45) + .dstab(3) + .dslash(7) + .dcrush(7) + .drange(-3) + .str(40) + .aspeed(4) + .build()); + private static final ItemStats BLOWPIPE = new ItemStats(false, true, 0, 0, + ItemEquipmentStats.builder() + .slot(EquipmentInventorySlot.WEAPON.getSlotIdx()) + .arange(60) + .rstr(40) + .aspeed(3) + .build()); + private static final ItemStats HEAVY_BALLISTA = new ItemStats(false, true, 4, 8, + ItemEquipmentStats.builder() + .slot(EquipmentInventorySlot.WEAPON.getSlotIdx()) + .arange(110) + .aspeed(7) + .build()); + + @Test + public void testUnarmedAttackSpeed() + { + assertEquals(ItemStatOverlay.UNARMED.getEquipment().getAspeed(), ABYSSAL_DAGGER.getEquipment().getAspeed()); + assertEquals(ItemStatOverlay.UNARMED.getEquipment().getAspeed(), KATANA.getEquipment().getAspeed()); + assertEquals(-1, BLOWPIPE.getEquipment().getAspeed() - ItemStatOverlay.UNARMED.getEquipment().getAspeed()); + assertEquals(3, HEAVY_BALLISTA.getEquipment().getAspeed() - ItemStatOverlay.UNARMED.getEquipment().getAspeed()); + } +} From bb0e693aea5b7be8dc69d0d0812d6ce868aee6cc Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Wed, 4 Mar 2020 15:41:12 -0800 Subject: [PATCH 2/2] itemstats: Add tooltip string method tests This commit adds tests to ensure proper formatting of the tooltip string so as to prevent bugs like the one fixed by 7ca4a929. --- .../plugins/itemstats/ItemStatOverlay.java | 3 +- .../itemstats/ItemStatOverlayTest.java | 90 +++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java index 3b49d1c6c3..38b8a11c17 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatOverlay.java @@ -236,7 +236,8 @@ public class ItemStatOverlay extends Overlay return b.toString(); } - private String buildStatBonusString(ItemStats s) + @VisibleForTesting + String buildStatBonusString(ItemStats s) { ItemStats other = null; final ItemEquipmentStats currentEquipment = s.getEquipment(); diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java index e4ea426dab..b3826df992 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/itemstats/ItemStatOverlayTest.java @@ -24,12 +24,33 @@ */ package net.runelite.client.plugins.itemstats; +import com.google.inject.Guice; +import com.google.inject.Inject; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.awt.Color; +import net.runelite.api.Client; import net.runelite.api.EquipmentInventorySlot; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.ItemContainer; +import net.runelite.client.game.ItemManager; +import net.runelite.client.util.Text; import net.runelite.http.api.item.ItemEquipmentStats; import net.runelite.http.api.item.ItemStats; +import org.apache.commons.lang3.StringUtils; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.mockito.junit.MockitoJUnitRunner; +@RunWith(MockitoJUnitRunner.class) public class ItemStatOverlayTest { // Weapon definitions @@ -70,6 +91,30 @@ public class ItemStatOverlayTest .aspeed(7) .build()); + @Inject + ItemStatOverlay overlay; + + @Mock + @Bind + Client client; + + @Mock + @Bind + ItemStatConfig config; + + @Mock + @Bind + ItemManager itemManager; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + + when(config.colorBetterUncapped()).thenReturn(new Color(0)); + when(config.colorWorse()).thenReturn(new Color(0)); + } + @Test public void testUnarmedAttackSpeed() { @@ -78,4 +123,49 @@ public class ItemStatOverlayTest assertEquals(-1, BLOWPIPE.getEquipment().getAspeed() - ItemStatOverlay.UNARMED.getEquipment().getAspeed()); assertEquals(3, HEAVY_BALLISTA.getEquipment().getAspeed() - ItemStatOverlay.UNARMED.getEquipment().getAspeed()); } + + @Test + public void testBuildStatBonusString() + { + // Empty equipment (fully unarmed) + final ItemContainer equipment = mock(ItemContainer.class); + when(equipment.getItems()).thenReturn(new Item[0]); + when(client.getItemContainer(InventoryID.EQUIPMENT)).thenReturn(equipment); + + String tooltip; + String sanitizedTooltip; + + tooltip = overlay.buildStatBonusString(ABYSSAL_DAGGER); + sanitizedTooltip = Text.sanitizeMultilineText(tooltip); + assertTrue(sanitizedTooltip.contains("Stab: +75")); + assertTrue(sanitizedTooltip.contains("Slash: +40")); + assertTrue(sanitizedTooltip.contains("Crush: -4")); + assertEquals(2, StringUtils.countMatches(sanitizedTooltip, "Magic: +1")); // Attack and defense + assertTrue(sanitizedTooltip.contains("Melee Str: +75")); + assertFalse(sanitizedTooltip.contains("Speed:")); + + tooltip = overlay.buildStatBonusString(KATANA); + sanitizedTooltip = Text.sanitizeMultilineText(tooltip); + assertTrue(sanitizedTooltip.contains("Stab: +7")); + assertTrue(sanitizedTooltip.contains("Slash: +45")); + assertTrue(sanitizedTooltip.contains("Stab: +3")); // Defense + assertTrue(sanitizedTooltip.contains("Slash: +7")); // Defense + assertTrue(sanitizedTooltip.contains("Crush: +7")); // Defense + assertTrue(sanitizedTooltip.contains("Range: -3")); // Defense + assertTrue(sanitizedTooltip.contains("Melee Str: +40")); + assertFalse(sanitizedTooltip.contains("Speed:")); + + tooltip = overlay.buildStatBonusString(BLOWPIPE); + sanitizedTooltip = Text.sanitizeMultilineText(tooltip); + assertTrue(sanitizedTooltip.contains("Range: +60")); + assertTrue(sanitizedTooltip.contains("Range Str: +40")); + assertTrue(sanitizedTooltip.contains("Speed: -1")); + assertFalse(sanitizedTooltip.contains("Stab:")); + + tooltip = overlay.buildStatBonusString(HEAVY_BALLISTA); + sanitizedTooltip = Text.sanitizeMultilineText(tooltip); + assertTrue(sanitizedTooltip.contains("Range: +110")); + assertTrue(sanitizedTooltip.contains("Speed: +3")); + assertFalse(sanitizedTooltip.contains("Stab:")); + } }