From d26e3ec7b2f6a0fc1ec471a290c5a7ed12c78eed Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 9 Feb 2021 22:58:27 -0800 Subject: [PATCH] opponent info: Add simple interaction tests --- .../opponentinfo/OpponentInfoPlugin.java | 3 + .../opponentinfo/OpponentInfoPluginTest.java | 180 ++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 runelite-client/src/test/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPluginTest.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java index 801148c447..65fcf0af05 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPlugin.java @@ -25,6 +25,7 @@ */ package net.runelite.client.plugins.opponentinfo; +import com.google.common.annotations.VisibleForTesting; import com.google.inject.Provides; import java.time.Duration; import java.time.Instant; @@ -80,6 +81,8 @@ public class OpponentInfoPlugin extends Plugin @Getter(AccessLevel.PACKAGE) private Actor lastOpponent; + @Getter(AccessLevel.PACKAGE) + @VisibleForTesting private Instant lastTime; @Provides diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPluginTest.java new file mode 100644 index 0000000000..4b213bde95 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/opponentinfo/OpponentInfoPluginTest.java @@ -0,0 +1,180 @@ +/* + * Copyright (c) 2021, Jordan Atwood + * 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.opponentinfo; + +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 net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.events.InteractingChanged; +import net.runelite.api.NPC; +import net.runelite.api.Player; +import net.runelite.client.ui.overlay.OverlayManager; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import org.junit.Before; +import org.junit.runner.RunWith; +import org.junit.Test; +import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.Mock; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class OpponentInfoPluginTest +{ + @Mock + @Bind + Client client; + + @Mock + @Bind + OverlayManager overlayManager; + + @Mock + @Bind + OpponentInfoConfig config; + + @Mock + @Bind + OpponentInfoOverlay opponentInfoOverlay; + + @Mock + @Bind + PlayerComparisonOverlay playerComparisonOverlay; + + @Inject + OpponentInfoPlugin plugin; + + private final Player localPlayer = mock(Player.class); + + @Before + public void before() + { + Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this); + + when(client.getLocalPlayer()).thenReturn(localPlayer); + } + + @Test + public void testNpcInteractions() + { + final NPC npc = mock(NPC.class); + + interactingChanged(npc, localPlayer); + + assertNull(plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(npc, null); + + assertNull(plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(localPlayer, npc); + + assertSame(npc, plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(npc, localPlayer); + + assertSame(npc, plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(localPlayer, null); + + // last opponent is remembered for 5 seconds + assertSame(npc, plugin.getLastOpponent()); + assertNotNull(plugin.getLastTime()); + } + + @Test + public void testOtherPlayerInteractions() + { + final Player otherPlayer = mock(Player.class); + + interactingChanged(otherPlayer, localPlayer); + + assertNull(plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(otherPlayer, null); + + assertNull(plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(localPlayer, otherPlayer); + + assertSame(otherPlayer, plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(otherPlayer, localPlayer); + + assertSame(otherPlayer, plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(localPlayer, null); + + // last opponent is remembered for 5 seconds + assertSame(otherPlayer, plugin.getLastOpponent()); + assertNotNull(plugin.getLastTime()); + } + + @Test + public void testNonLocalPlayerInteractions() + { + final Player otherPlayer = mock(Player.class); + final NPC npc = mock(NPC.class); + + interactingChanged(otherPlayer, npc); + + assertNull(plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(npc, otherPlayer); + + assertNull(plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(otherPlayer, null); + + assertNull(plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + + interactingChanged(npc, null); + + assertNull(plugin.getLastOpponent()); + assertNull(plugin.getLastTime()); + } + + private void interactingChanged(final Actor source, final Actor target) + { + when(source.getInteracting()).thenReturn(target); + plugin.onInteractingChanged(new InteractingChanged(source, target)); + } +}