Skip to content

Commit

Permalink
Handle backup camera choice unavailable (#1025)
Browse files Browse the repository at this point in the history
* Create failing test

* Fix backup camera not exiting choice
  • Loading branch information
libraryaddict committed Aug 26, 2022
1 parent 8af45d8 commit 77a3b91
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 3 deletions.
Expand Up @@ -6,6 +6,7 @@
import net.sourceforge.kolmafia.RequestThread;
import net.sourceforge.kolmafia.objectpool.ItemPool;
import net.sourceforge.kolmafia.request.GenericRequest;
import net.sourceforge.kolmafia.session.ChoiceManager;
import net.sourceforge.kolmafia.session.InventoryManager;

public class BackupCameraCommand extends AbstractCommand implements ModeCommand {
Expand Down Expand Up @@ -57,5 +58,10 @@ public void run(final String cmd, final String parameters) {

RequestThread.postRequest(new GenericRequest("inventory.php?action=bcmode"));
RequestThread.postRequest(new GenericRequest("choice.php?whichchoice=1449&option=" + choice));

// If still in choice, call 'Leave it alone' to exit
if (ChoiceManager.handlingChoice && ChoiceManager.lastChoice == 1449) {
RequestThread.postRequest(new GenericRequest("choice.php?whichchoice=1449&option=6"));
}
}
}
@@ -1,20 +1,30 @@
package net.sourceforge.kolmafia.textui.command;

import static internal.helpers.HttpClientWrapper.getRequests;
import static internal.helpers.Networking.assertGetRequest;
import static internal.helpers.Networking.assertPostRequest;
import static internal.helpers.Networking.html;
import static internal.helpers.Player.withItem;
import static internal.helpers.Player.withNextResponse;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.greaterThanOrEqualTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;

import internal.helpers.Cleanups;
import internal.helpers.HttpClientWrapper;
import internal.network.FakeHttpClientBuilder;
import internal.network.FakeHttpResponse;
import java.util.List;
import java.util.Map;
import net.sourceforge.kolmafia.KoLCharacter;
import net.sourceforge.kolmafia.KoLConstants;
import net.sourceforge.kolmafia.StaticEntity;
import net.sourceforge.kolmafia.session.ChoiceManager;
import net.sourceforge.kolmafia.utilities.HttpUtilities;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand Down Expand Up @@ -84,12 +94,43 @@ public void canChangeMode() {

var requests = getRequests();

assertThat(requests, hasSize(2));
assertThat(requests, hasSize(greaterThanOrEqualTo(2)));
assertPostRequest(requests.get(0), "/inventory.php", "action=bcmode");
assertPostRequest(requests.get(1), "/choice.php", "whichchoice=1449&option=3");
}
}

@Test
public void canHandleAlreadySelectedOption() {
// The same page is returned when an invalid option is selected
var cleanups =
new Cleanups(
withItem("backup camera"),
withNextResponse(
new FakeHttpResponse<>(
302, Map.of("location", List.of("choice.php?forceoption=0")), ""),
new FakeHttpResponse<>(
200, html("request/test_command_backupcamera_handles_unavailable_option.html")),
new FakeHttpResponse<>(
200, html("request/test_command_backupcamera_handles_unavailable_option.html")),
new FakeHttpResponse<>(
200, html("request/test_command_backupcamera_leave_choice.html"))));

try (cleanups) {
execute("ml");

var requests =
((FakeHttpClientBuilder) HttpUtilities.getClientBuilder()).client.getRequests();

assertThat(requests, hasSize(4));
assertPostRequest(requests.get(0), "/inventory.php", "action=bcmode");
assertGetRequest(requests.get(1), "/choice.php", "forceoption=0");
assertPostRequest(requests.get(2), "/choice.php", "whichchoice=1449&option=1");
assertPostRequest(requests.get(3), "/choice.php", "whichchoice=1449&option=6");
assertThat(ChoiceManager.handlingChoice, is(false));
}
}

@ParameterizedTest
@ValueSource(strings = {"off", "disable"})
public void canDisableReverser(String disable) {
Expand All @@ -101,7 +142,7 @@ public void canDisableReverser(String disable) {

var requests = getRequests();

assertThat(requests, hasSize(2));
assertThat(requests, hasSize(greaterThanOrEqualTo(2)));
assertPostRequest(requests.get(0), "/inventory.php", "action=bcmode");
assertPostRequest(requests.get(1), "/choice.php", "whichchoice=1449&option=5");
}
Expand All @@ -117,7 +158,7 @@ public void canEnableReverser(String enable) {

var requests = getRequests();

assertThat(requests, hasSize(2));
assertThat(requests, hasSize(greaterThanOrEqualTo(2)));
assertPostRequest(requests.get(0), "/inventory.php", "action=bcmode");
assertPostRequest(requests.get(1), "/choice.php", "whichchoice=1449&option=4");
}
Expand Down
@@ -0,0 +1 @@
<html><head><script language=Javascript><!--if (parent.frames.length == 0) location.href="game.php";//--></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/jquery-1.5.1.js"></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/keybinds.min.2.js"></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/window.20111231.js"></script><script language="javascript">function chatFocus(){if(top.chatpane.document.chatform.graf) top.chatpane.document.chatform.graf.focus();}if (typeof defaultBind != 'undefined') { defaultBind(47, 2, chatFocus); defaultBind(190, 2, chatFocus);defaultBind(191, 2, chatFocus); defaultBind(47, 8, chatFocus);defaultBind(190, 8, chatFocus); defaultBind(191, 8, chatFocus); }</script><script>function switchFocus(){if (top.chatpane.document.chatform.graf.focus)top.chatpane.document.chatform.graf.focus();return false;}function repeat(){var linx = document.getElementsByTagName("A");for (var i = 0; i < linx.length; i++){if (typeof timersfunc != 'undefined') {if (!timersfunc()) {return;}timersfunc = null;}var link = linx[i];if (link.innerHTML.match(/Adventure Again/) || link.innerHTML.match(/Do it again/))location.href = link.href;}}defaultBind(47, CTRL, switchFocus);defaultBind(191, CTRL, switchFocus);defaultBind(47, META, switchFocus);defaultBind(191, META, switchFocus);defaultBind(192, NONE, repeat);defaultBind(220, NONE, repeat);</script><script language="javascript">function updateParseItem(iid, field, info) {var tbl = $('#ic'+iid);var data = parseItem(tbl);if (!data) return;data[field] = info;var out = [];for (i in data) {if (!data.hasOwnProperty(i)) continue;out.push(i+'='+data[i]);}tbl.attr('rel', out.join('&'));}function parseItem(tbl) {tbl = $(tbl);var rel = tbl.attr('rel');var data = {};if (!rel) return data;var parts = rel.split('&');for (i in parts) {if (!parts.hasOwnProperty(i)) continue;var kv = parts[i].split('=');tbl.data(kv[0], kv[1]);data[kv[0]] = kv[1];}return data;}</script><script type="text/javascript" src="https://d2uyhvukfffg5a.cloudfront.net/scripts/pop_query.20130705.js"></script><script type="text/javascript"> function pop_ircm(clicked) { return false; } </script><script>var currentkey = 49;$(document).ready(function () {$('form').each(function () {var form = this;defaultBind(currentkey++, NONE, function () { form.submit(); });return currentkey < 58;});});</script> <link rel="stylesheet" type="text/css" href="https://d2uyhvukfffg5a.cloudfront.net/styles.20151006.css"><style type='text/css'>.faded {zoom: 1;filter: alpha(opacity=35);opacity: 0.35;-khtml-opacity: 0.35;-moz-opacity: 0.35;}</style></head><body><Center><centeR><!--faaaaaaart--><table width=95% cellspacing=0 cellpadding=0><tr><td style="color: white;" align=center bgcolor=blue><b>Set Backup Camera Mode</b></td></tr><tr><td style="padding: 5px; border: 1px solid blue;"><center><table><tr><td>You check out the control panel on your fancy backup camera. Looks like it's got some sort of mode toggle and reverser button.<center><form style='margin: 0px 0px 0px 0px;' name=choiceform2 action=choice.php method=post><input type=hidden name=pwd value='437cd7bb436043737cae11470909a161'><input type=hidden name=whichchoice value=1449><input type=hidden name=option value=2><table><tr><td valign=center><input class=button type=submit value="Toggle to Infrared Spectrum "></td><td valign=center><font color=blue><b>[+50% Meat Drops]</b></font></td></tr></table></form><p><form style='margin: 0px 0px 0px 0px;' name=choiceform3 action=choice.php method=post><input type=hidden name=pwd value='437cd7bb436043737cae11470909a161'><input type=hidden name=whichchoice value=1449><input type=hidden name=option value=3><table><tr><td valign=center><input class=button type=submit value="Toggle to Maximum Framerate "></td><td valign=center><font color=blue><b>[+100% Initiative]</b></font></td></tr></table></form><p><form style='margin: 0px 0px 0px 0px;' name=choiceform5 action=choice.php method=post><input type=hidden name=pwd value='437cd7bb436043737cae11470909a161'><input type=hidden name=whichchoice value=1449><input type=hidden name=option value=5><input class=button type=submit value="Disable Reverser"></form><p><form style='margin: 0px 0px 0px 0px;' name=choiceform6 action=choice.php method=post><input type=hidden name=pwd value='437cd7bb436043737cae11470909a161'><input type=hidden name=whichchoice value=1449><input type=hidden name=option value=6><input class=button type=submit value="Leave it alone"></form><p></center></td></tr></table></center></td></tr><tr><td height=4></td></tr></table></center><!--faaaaaaart--></body></html>
@@ -0,0 +1 @@
<html><head><script language=Javascript><!--if (parent.frames.length == 0) location.href="game.php";//--></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/jquery-1.5.1.js"></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/keybinds.min.2.js"></script><script language=Javascript src="https://d2uyhvukfffg5a.cloudfront.net/scripts/window.20111231.js"></script><script language="javascript">function chatFocus(){if(top.chatpane.document.chatform.graf) top.chatpane.document.chatform.graf.focus();}if (typeof defaultBind != 'undefined') { defaultBind(47, 2, chatFocus); defaultBind(190, 2, chatFocus);defaultBind(191, 2, chatFocus); defaultBind(47, 8, chatFocus);defaultBind(190, 8, chatFocus); defaultBind(191, 8, chatFocus); }</script><script>function switchFocus(){if (top.chatpane.document.chatform.graf.focus)top.chatpane.document.chatform.graf.focus();return false;}function repeat(){var linx = document.getElementsByTagName("A");for (var i = 0; i < linx.length; i++){if (typeof timersfunc != 'undefined') {if (!timersfunc()) {return;}timersfunc = null;}var link = linx[i];if (link.innerHTML.match(/Adventure Again/) || link.innerHTML.match(/Do it again/))location.href = link.href;}}defaultBind(47, CTRL, switchFocus);defaultBind(191, CTRL, switchFocus);defaultBind(47, META, switchFocus);defaultBind(191, META, switchFocus);defaultBind(192, NONE, repeat);defaultBind(220, NONE, repeat);</script><script language="javascript">function updateParseItem(iid, field, info) {var tbl = $('#ic'+iid);var data = parseItem(tbl);if (!data) return;data[field] = info;var out = [];for (i in data) {if (!data.hasOwnProperty(i)) continue;out.push(i+'='+data[i]);}tbl.attr('rel', out.join('&'));}function parseItem(tbl) {tbl = $(tbl);var rel = tbl.attr('rel');var data = {};if (!rel) return data;var parts = rel.split('&');for (i in parts) {if (!parts.hasOwnProperty(i)) continue;var kv = parts[i].split('=');tbl.data(kv[0], kv[1]);data[kv[0]] = kv[1];}return data;}</script><script type="text/javascript" src="https://d2uyhvukfffg5a.cloudfront.net/scripts/pop_query.20130705.js"></script><script type="text/javascript"> function pop_ircm(clicked) { return false; } </script><script>var currentkey = 49;$(document).ready(function () {$('form').each(function () {var form = this;defaultBind(currentkey++, NONE, function () { form.submit(); });return currentkey < 58;});});</script> <link rel="stylesheet" type="text/css" href="https://d2uyhvukfffg5a.cloudfront.net/styles.20151006.css"><style type='text/css'>.faded {zoom: 1;filter: alpha(opacity=35);opacity: 0.35;-khtml-opacity: 0.35;-moz-opacity: 0.35;}</style></head><body><Center><div id="results"><!--faaaaaaart--><table width=95% cellspacing=0 cellpadding=0><tr><td style="color: white;" align=center bgcolor=blue><b>Results:</b></td></tr><tr><td style="padding: 5px; border: 1px solid blue;"><center><table><tr><td><span class='guts'>Ok, all set.</span></td></tr></table></center></td></tr><tr><td height=4></td></tr></table></div><table width=95% cellspacing=0 cellpadding=0><tr><td style="color: white;" align=center bgcolor=blue><b>Adventure Again:</b></td></tr><tr><td style="padding: 5px; border: 1px solid blue;"><center><table><tr><td><center><center><a href="/inventory.php">Back to Inventory</a></center></center></td></tr></table></center></td></tr><tr><td height=4></td></tr></table><!--faaaaaaart--></body></html>

0 comments on commit 77a3b91

Please sign in to comment.