From f9aea0d9582c59548ae3405deef1a0982d50084c Mon Sep 17 00:00:00 2001 From: Adam Date: Sat, 27 Jun 2020 13:52:14 -0400 Subject: [PATCH] examine plugin: fix overflow in computing alch price --- .../client/plugins/examine/ExaminePlugin.java | 10 +++++---- .../plugins/examine/ExaminePluginTest.java | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java index 9bef7571d6..d301bab699 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/examine/ExaminePlugin.java @@ -24,6 +24,7 @@ */ package net.runelite.client.plugins.examine; +import com.google.common.annotations.VisibleForTesting; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import java.time.Instant; @@ -313,11 +314,12 @@ public class ExaminePlugin extends Plugin return null; } - private void getItemPrice(int id, ItemComposition itemComposition, int quantity) + @VisibleForTesting + void getItemPrice(int id, ItemComposition itemComposition, int quantity) { // quantity is at least 1 quantity = Math.max(1, quantity); - final long gePrice = itemManager.getItemPrice(id); + final int gePrice = itemManager.getItemPrice(id); final int alchPrice = itemComposition.getHaPrice(); if (gePrice > 0 || alchPrice > 0) @@ -345,7 +347,7 @@ public class ExaminePlugin extends Plugin .append(ChatColorType.NORMAL) .append(" GE average ") .append(ChatColorType.HIGHLIGHT) - .append(QuantityFormatter.formatNumber(gePrice * quantity)); + .append(QuantityFormatter.formatNumber((long) gePrice * quantity)); if (quantity > 1) { @@ -365,7 +367,7 @@ public class ExaminePlugin extends Plugin .append(ChatColorType.NORMAL) .append(" HA value ") .append(ChatColorType.HIGHLIGHT) - .append(QuantityFormatter.formatNumber(alchPrice * quantity)); + .append(QuantityFormatter.formatNumber((long) alchPrice * quantity)); if (quantity > 1) { diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java index 093beec4f9..e13f926f8b 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/examine/ExaminePluginTest.java @@ -37,11 +37,14 @@ import net.runelite.api.events.ChatMessage; import net.runelite.api.events.MenuOptionClicked; import net.runelite.api.widgets.Widget; import net.runelite.client.chat.ChatMessageManager; +import net.runelite.client.chat.QueuedMessage; import net.runelite.client.game.ItemManager; import net.runelite.http.api.examine.ExamineClient; +import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import org.mockito.Mock; @@ -115,4 +118,23 @@ public class ExaminePluginTest verify(examineClient, never()).submitItem(anyInt(), anyString()); } + + @Test + public void testGetItemPrice() + { + ItemComposition itemComposition = mock(ItemComposition.class); + when(itemComposition.getName()).thenReturn("Abyssal whip"); + when(itemComposition.getHaPrice()).thenReturn(2); + when(itemManager.getItemPrice(ItemID.ABYSSAL_WHIP)).thenReturn(3); + examinePlugin.getItemPrice(ItemID.ABYSSAL_WHIP, itemComposition, 2_000_000_000); + + ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(QueuedMessage.class); + verify(chatMessageManager).queue(argumentCaptor.capture()); + + QueuedMessage queuedMessage = argumentCaptor.getValue(); + assertEquals( + "Price of 2,000,000,000 x Abyssal whip: GE average 6,000,000,000 (3ea) HA value 4,000,000,000 (2ea)", + queuedMessage.getRuneLiteFormattedMessage() + ); + } } \ No newline at end of file