diff --git a/cache/src/test/java/net/runelite/cache/FramemapDumper.java b/cache/src/test/java/net/runelite/cache/FramemapDumper.java index f95e92c9fa..8feef1f814 100644 --- a/cache/src/test/java/net/runelite/cache/FramemapDumper.java +++ b/cache/src/test/java/net/runelite/cache/FramemapDumper.java @@ -36,6 +36,7 @@ import net.runelite.cache.fs.Archive; import net.runelite.cache.fs.Index; import net.runelite.cache.fs.Storage; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -52,6 +53,7 @@ public class FramemapDumper private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Test + @Ignore public void extract() throws IOException { File base = StoreLocation.LOCATION, diff --git a/cache/src/test/java/net/runelite/cache/InterfaceManagerTest.java b/cache/src/test/java/net/runelite/cache/InterfaceManagerTest.java index 060aae5d57..f26ff06b21 100644 --- a/cache/src/test/java/net/runelite/cache/InterfaceManagerTest.java +++ b/cache/src/test/java/net/runelite/cache/InterfaceManagerTest.java @@ -28,6 +28,7 @@ package net.runelite.cache; import java.io.File; import java.io.IOException; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -42,6 +43,7 @@ public class InterfaceManagerTest public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); @Test + @Ignore public void test() throws IOException { File dumpDir = folder.newFolder(), diff --git a/cache/src/test/java/net/runelite/cache/ItemManagerTest.java b/cache/src/test/java/net/runelite/cache/ItemManagerTest.java index e3ac0b3324..e9f74f0c0d 100644 --- a/cache/src/test/java/net/runelite/cache/ItemManagerTest.java +++ b/cache/src/test/java/net/runelite/cache/ItemManagerTest.java @@ -28,6 +28,7 @@ package net.runelite.cache; import java.io.File; import java.io.IOException; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -42,6 +43,7 @@ public class ItemManagerTest public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); @Test + @Ignore public void test() throws IOException { File dumpDir = folder.newFolder(), diff --git a/cache/src/test/java/net/runelite/cache/ModelDumperTest.java b/cache/src/test/java/net/runelite/cache/ModelDumperTest.java index bfd4bd9dba..fb0f704247 100644 --- a/cache/src/test/java/net/runelite/cache/ModelDumperTest.java +++ b/cache/src/test/java/net/runelite/cache/ModelDumperTest.java @@ -33,6 +33,7 @@ import net.runelite.cache.fs.Archive; import net.runelite.cache.fs.Index; import net.runelite.cache.fs.Storage; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -47,6 +48,7 @@ public class ModelDumperTest public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); @Test + @Ignore public void test() throws IOException { File modelDir = folder.newFolder("models"); diff --git a/cache/src/test/java/net/runelite/cache/NpcManagerTest.java b/cache/src/test/java/net/runelite/cache/NpcManagerTest.java index cdccac0cfb..bb80e5d0d2 100644 --- a/cache/src/test/java/net/runelite/cache/NpcManagerTest.java +++ b/cache/src/test/java/net/runelite/cache/NpcManagerTest.java @@ -27,6 +27,7 @@ package net.runelite.cache; import java.io.File; import java.io.IOException; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -41,6 +42,7 @@ public class NpcManagerTest public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); @Test + @Ignore public void test() throws IOException { File dumpDir = folder.newFolder(), diff --git a/cache/src/test/java/net/runelite/cache/ObjectManagerTest.java b/cache/src/test/java/net/runelite/cache/ObjectManagerTest.java index f50196734e..da6f4de579 100644 --- a/cache/src/test/java/net/runelite/cache/ObjectManagerTest.java +++ b/cache/src/test/java/net/runelite/cache/ObjectManagerTest.java @@ -27,6 +27,7 @@ package net.runelite.cache; import java.io.File; import java.io.IOException; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -41,6 +42,7 @@ public class ObjectManagerTest public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); @Test + @Ignore public void test() throws IOException { File dumpDir = folder.newFolder(), diff --git a/cache/src/test/java/net/runelite/cache/SequenceDumper.java b/cache/src/test/java/net/runelite/cache/SequenceDumper.java index 485bd3d84f..b03bed7f03 100644 --- a/cache/src/test/java/net/runelite/cache/SequenceDumper.java +++ b/cache/src/test/java/net/runelite/cache/SequenceDumper.java @@ -38,6 +38,7 @@ import net.runelite.cache.fs.FSFile; import net.runelite.cache.fs.Index; import net.runelite.cache.fs.Storage; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -54,6 +55,7 @@ public class SequenceDumper private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Test + @Ignore public void extract() throws IOException { File base = StoreLocation.LOCATION, diff --git a/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java b/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java index 402049ebd9..0aa1e4d123 100644 --- a/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java +++ b/cache/src/test/java/net/runelite/cache/SoundEffectsDumperTest.java @@ -43,6 +43,7 @@ import net.runelite.cache.fs.Archive; import net.runelite.cache.fs.Index; import net.runelite.cache.fs.Storage; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -59,6 +60,7 @@ public class SoundEffectsDumperTest public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); @Test + @Ignore public void test() throws IOException { File dumpDir = folder.newFolder(); diff --git a/cache/src/test/java/net/runelite/cache/SpotanimDumperTest.java b/cache/src/test/java/net/runelite/cache/SpotanimDumperTest.java index 93de3d66f4..31c837debd 100644 --- a/cache/src/test/java/net/runelite/cache/SpotanimDumperTest.java +++ b/cache/src/test/java/net/runelite/cache/SpotanimDumperTest.java @@ -39,6 +39,7 @@ import net.runelite.cache.fs.FSFile; import net.runelite.cache.fs.Index; import net.runelite.cache.fs.Storage; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -52,6 +53,7 @@ public class SpotanimDumperTest public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); @Test + @Ignore public void test() throws IOException { File dumpDir = folder.newFolder("spotanims"); diff --git a/cache/src/test/java/net/runelite/cache/SpriteManagerTest.java b/cache/src/test/java/net/runelite/cache/SpriteManagerTest.java index f8a103ccb8..b9564f4d41 100644 --- a/cache/src/test/java/net/runelite/cache/SpriteManagerTest.java +++ b/cache/src/test/java/net/runelite/cache/SpriteManagerTest.java @@ -27,6 +27,7 @@ package net.runelite.cache; import java.io.File; import java.io.IOException; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -41,6 +42,7 @@ public class SpriteManagerTest public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); @Test + @Ignore public void test() throws IOException { File dumpDir = folder.newFolder(); diff --git a/cache/src/test/java/net/runelite/cache/TitleDumper.java b/cache/src/test/java/net/runelite/cache/TitleDumper.java index e6cbe138d2..5be95c7563 100644 --- a/cache/src/test/java/net/runelite/cache/TitleDumper.java +++ b/cache/src/test/java/net/runelite/cache/TitleDumper.java @@ -47,8 +47,8 @@ public class TitleDumper @Test public void extract() throws IOException { - File base = StoreLocation.LOCATION; - File outFile = folder.newFile(); + File base = StoreLocation.LOCATION, + outFile = folder.newFile(); try (Store store = new Store(base)) { diff --git a/cache/src/test/java/net/runelite/cache/VarbitDumper.java b/cache/src/test/java/net/runelite/cache/VarbitDumper.java index 9bcdcf9237..73bc9d41b1 100644 --- a/cache/src/test/java/net/runelite/cache/VarbitDumper.java +++ b/cache/src/test/java/net/runelite/cache/VarbitDumper.java @@ -38,6 +38,7 @@ import net.runelite.cache.fs.FSFile; import net.runelite.cache.fs.Index; import net.runelite.cache.fs.Storage; import net.runelite.cache.fs.Store; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -54,6 +55,7 @@ public class VarbitDumper private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); @Test + @Ignore public void extract() throws IOException { File base = StoreLocation.LOCATION, diff --git a/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java b/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java index a1f8a7e056..94e26d6812 100644 --- a/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java +++ b/runelite-api/src/main/java/net/runelite/api/ChatLineBuffer.java @@ -46,7 +46,11 @@ public interface ChatLineBuffer int getLength(); /** - * Removes a message node + * Removes a message node. + * + * This method modifies the underlying MessageNode array. If removing multiple MessageNodes at a time, + * clone the original {@link #getLines()} array; as items in the array will get modified and be left in an + * inconsistent state. * * @param node the {@link MessageNode} to remove */ diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index fe4fc32221..4895dcc57d 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -578,6 +578,12 @@ public class WidgetID { static final int PARENT = 0; static final int BUTTONS = 1; + static final int TAB_ALL = 4; + static final int TAB_GAME = 8; + static final int TAB_PUBLIC = 13; + static final int TAB_PRIVATE = 18; + static final int TAB_CLAN = 23; + static final int TAB_TRADE = 28; static final int REPORT_TEXT = 36; static final int FRAME = 37; static final int TRANSPARENT_BACKGROUND = 38; diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index 89a2d73399..cd1bef47e7 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -439,6 +439,12 @@ public enum WidgetInfo CHATBOX_TRANSPARENT_LINES(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TRANSPARENT_BACKGROUND_LINES), CHATBOX_MESSAGE_LINES(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.MESSAGE_LINES), CHATBOX_FIRST_MESSAGE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.FIRST_MESSAGE), + CHATBOX_TAB_ALL(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_ALL), + CHATBOX_TAB_GAME(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_GAME), + CHATBOX_TAB_PUBLIC(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_PUBLIC), + CHATBOX_TAB_PRIVATE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_PRIVATE), + CHATBOX_TAB_CLAN(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_CLAN), + CHATBOX_TAB_TRADE(WidgetID.CHATBOX_GROUP_ID, WidgetID.Chatbox.TAB_TRADE), BA_HEAL_WAVE_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.CURRENT_WAVE), BA_HEAL_CALL_TEXT(WidgetID.BA_HEALER_GROUP_ID, WidgetID.BarbarianAssault.TO_CALL), diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java index c97562c258..68c561b137 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemManager.java @@ -267,18 +267,20 @@ public class ItemManager */ public int getItemPrice(int itemID, boolean ignoreUntradeableMap) { - if (itemID == ItemID.COINS_995) + final int realId = canonicalize(itemID); + + if (realId == ItemID.COINS_995) { return 1; } - if (itemID == ItemID.PLATINUM_TOKEN) + if (realId == ItemID.PLATINUM_TOKEN) { return 1000; } if (!ignoreUntradeableMap) { - UntradeableItemMapping p = UntradeableItemMapping.map(ItemVariationMapping.map(itemID)); + UntradeableItemMapping p = UntradeableItemMapping.map(ItemVariationMapping.map(realId)); if (p != null) { return getItemPrice(p.getPriceID()) * p.getQuantity(); @@ -286,7 +288,7 @@ public class ItemManager } int price = 0; - for (int mappedID : ItemMapping.map(itemID)) + for (int mappedID : ItemMapping.map(realId)) { ItemPrice ip = itemPrices.get(mappedID); if (ip != null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java index c9b8001fa7..ae926ae338 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/Plugin.java @@ -123,4 +123,9 @@ public abstract class Plugin implements Module, ExtensionPoint public void resetConfiguration() { } + + public String getName() + { + return getClass().getAnnotation(PluginDescriptor.class).name(); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java index f5e9299117..ad59a1f6b6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/ConfigPlugin.java @@ -144,14 +144,13 @@ public class ConfigPlugin extends Plugin } // Expand config panel for plugin - PluginDescriptor descriptor = plugin.getClass().getAnnotation(PluginDescriptor.class); SwingUtilities.invokeLater(() -> { if (!navButton.isSelected()) { navButton.getOnSelect().run(); } - pluginListPanel.openConfigurationPanel(descriptor.name()); + pluginListPanel.openConfigurationPanel(plugin.getName()); }); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/HotkeyButton.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/HotkeyButton.java index 2146c9f9fa..1575d51cab 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/HotkeyButton.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/HotkeyButton.java @@ -26,6 +26,8 @@ package net.runelite.client.plugins.config; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import javax.inject.Singleton; import javax.swing.JButton; import lombok.AccessLevel; @@ -42,8 +44,15 @@ class HotkeyButton extends JButton HotkeyButton(Keybind value, boolean modifierless) { setValue(value); - addActionListener(e -> - setValue(Keybind.NOT_SET)); + addMouseListener(new MouseAdapter() + { + @Override + public void mouseReleased(MouseEvent e) + { + // We have to use a mouse adapter instead of an action listener so the press action key (space) can be bound + setValue(Keybind.NOT_SET); + } + }); addKeyListener(new KeyAdapter() { @Override diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java index fab945c11b..777bb9d634 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java @@ -26,6 +26,7 @@ package net.runelite.client.ui.overlay.infobox; import java.awt.Color; import java.awt.image.BufferedImage; +import javax.annotation.Nonnull; import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @@ -33,6 +34,7 @@ import net.runelite.client.plugins.Plugin; public abstract class InfoBox { + @Nonnull @Getter(AccessLevel.PACKAGE) private final Plugin plugin; @@ -52,7 +54,7 @@ public abstract class InfoBox @Setter private String tooltip; - public InfoBox(BufferedImage image, Plugin plugin) + public InfoBox(BufferedImage image, @Nonnull Plugin plugin) { this.plugin = plugin; setImage(image); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java index 47141ed69e..764a141952 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java @@ -27,11 +27,10 @@ package net.runelite.client.ui.overlay.infobox; import com.google.common.collect.ComparisonChain; import java.awt.Graphics; import java.awt.image.BufferedImage; -import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Predicate; import javax.inject.Inject; import javax.inject.Singleton; @@ -39,14 +38,13 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.eventbus.EventBus; import net.runelite.client.events.ConfigChanged; -import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.util.AsyncBufferedImage; @Singleton @Slf4j public class InfoBoxManager { - private final List infoBoxes = new ArrayList<>(); + private final List infoBoxes = new CopyOnWriteArrayList<>(); private final RuneLiteConfig runeLiteConfig; @Inject @@ -71,8 +69,19 @@ public class InfoBoxManager log.debug("Adding InfoBox {}", infoBox); updateInfoBoxImage(infoBox); - infoBoxes.add(infoBox); - refreshInfoBoxes(); + + synchronized (this) + { + int idx = Collections.binarySearch(infoBoxes, infoBox, (b1, b2) -> ComparisonChain + .start() + .compare(b1.getPriority(), b2.getPriority()) + .compare(b1.getPlugin().getName(), b2.getPlugin().getName()) + .result()); + if (idx < 0) + { + infoBoxes.add(-idx - 1, infoBox); + } + } BufferedImage image = infoBox.getImage(); @@ -83,21 +92,19 @@ public class InfoBoxManager } } - public void removeInfoBox(InfoBox infoBox) + public synchronized void removeInfoBox(InfoBox infoBox) { if (infoBoxes.remove(infoBox)) { log.debug("Removed InfoBox {}", infoBox); - refreshInfoBoxes(); } } - public void removeIf(Predicate filter) + public synchronized void removeIf(Predicate filter) { if (infoBoxes.removeIf(filter)) { log.debug("Removed InfoBoxes for filter {}", filter); - refreshInfoBoxes(); } } @@ -106,25 +113,9 @@ public class InfoBoxManager return Collections.unmodifiableList(infoBoxes); } - public void cull() + public synchronized void cull() { - boolean culled = false; - for (Iterator it = infoBoxes.iterator(); it.hasNext(); ) - { - InfoBox box = it.next(); - - if (box.cull()) - { - log.debug("Culling InfoBox {}", box); - it.remove(); - culled = true; - } - } - - if (culled) - { - refreshInfoBoxes(); - } + infoBoxes.removeIf(InfoBox::cull); } public void updateInfoBoxImage(final InfoBox infoBox) @@ -163,13 +154,4 @@ public class InfoBoxManager infoBox.setScaledImage(resultImage); } - - private void refreshInfoBoxes() - { - infoBoxes.sort((b1, b2) -> ComparisonChain - .start() - .compare(b1.getPriority(), b2.getPriority()) - .compare(b1.getPlugin().getClass().getAnnotation(PluginDescriptor.class).name(), b2.getPlugin().getClass().getAnnotation(PluginDescriptor.class).name()) - .result()); - } } diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/infobox/InfoBoxManagerTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/infobox/InfoBoxManagerTest.java new file mode 100644 index 0000000000..a69283f0bc --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/infobox/InfoBoxManagerTest.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2020, Adam + * 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.ui.overlay.infobox; + +import com.google.inject.Guice; +import com.google.inject.testing.fieldbinder.Bind; +import com.google.inject.testing.fieldbinder.BoundFieldModule; +import java.awt.Color; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import javax.inject.Inject; +import net.runelite.client.config.OpenOSRSConfig; +import net.runelite.client.config.RuneLiteConfig; +import net.runelite.client.plugins.Plugin; +import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import org.mockito.junit.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class InfoBoxManagerTest +{ + @Inject + private InfoBoxManager infoBoxManager; + + @Mock + @Bind + private RuneLiteConfig runeLiteConfig; + + @Mock + @Bind + private OpenOSRSConfig openOSRSConfig; + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + } + + private static class TestInfobox extends InfoBox + { + public TestInfobox(InfoBoxPriority infoBoxPriority) + { + super(null, mock(Plugin.class)); + setPriority(infoBoxPriority); + } + + @Override + public String getText() + { + return null; + } + + @Override + public Color getTextColor() + { + return null; + } + } + + @Test + public void testSorting() + { + infoBoxManager.addInfoBox(new TestInfobox(InfoBoxPriority.LOW)); + infoBoxManager.addInfoBox(new TestInfobox(InfoBoxPriority.HIGH)); + infoBoxManager.addInfoBox(new TestInfobox(InfoBoxPriority.MED)); + + List order = infoBoxManager.getInfoBoxes().stream().map(InfoBox::getPriority).collect(Collectors.toList()); + assertEquals(Arrays.asList(InfoBoxPriority.HIGH, InfoBoxPriority.MED, InfoBoxPriority.LOW), order); + } +} \ No newline at end of file