Skip to content

Commit

Permalink
Fix forcemap not bypassing requirements (#29426)
Browse files Browse the repository at this point in the history
* Fix forcemap not bypassing requirements

* Add integration test for forcemap
  • Loading branch information
Tayrtahn authored Jun 24, 2024
1 parent 0822284 commit 8aea47a
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 2 deletions.
80 changes: 80 additions & 0 deletions Content.IntegrationTests/Tests/Commands/ForceMapTest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
using Content.Shared.CCVar;
using Robust.Shared.Configuration;
using Robust.Shared.Console;

namespace Content.IntegrationTests.Tests.Commands;

[TestFixture]
public sealed class ForceMapTest
{
private const string DefaultMapName = "Empty";
private const string BadMapName = "asdf_asd-fa__sdfAsd_f"; // Hopefully no one ever names a map this...
private const string TestMapEligibleName = "ForceMapTestEligible";
private const string TestMapIneligibleName = "ForceMapTestIneligible";

[TestPrototypes]
private static readonly string TestMaps = @$"
- type: gameMap
id: {TestMapIneligibleName}
mapName: {TestMapIneligibleName}
mapPath: /Maps/Test/empty.yml
minPlayers: 20
maxPlayers: 80
stations:
Empty:
stationProto: StandardNanotrasenStation
components:
- type: StationNameSetup
mapNameTemplate: ""Empty""
- type: gameMap
id: {TestMapEligibleName}
mapName: {TestMapEligibleName}
mapPath: /Maps/Test/empty.yml
minPlayers: 0
stations:
Empty:
stationProto: StandardNanotrasenStation
components:
- type: StationNameSetup
mapNameTemplate: ""Empty""
";

[Test]
public async Task TestForceMapCommand()
{
await using var pair = await PoolManager.GetServerClient();
var server = pair.Server;

var entMan = server.EntMan;
var configManager = server.ResolveDependency<IConfigurationManager>();
var consoleHost = server.ResolveDependency<IConsoleHost>();

await server.WaitAssertion(() =>
{
// Make sure we're set to the default map
Assert.That(configManager.GetCVar(CCVars.GameMap), Is.EqualTo(DefaultMapName),
$"Test didn't start on expected map ({DefaultMapName})!");

// Try changing to a map that doesn't exist
consoleHost.ExecuteCommand($"forcemap {BadMapName}");
Assert.That(configManager.GetCVar(CCVars.GameMap), Is.EqualTo(DefaultMapName),
$"Forcemap succeeded with a map that does not exist ({BadMapName})!");

// Try changing to a valid map
consoleHost.ExecuteCommand($"forcemap {TestMapEligibleName}");
Assert.That(configManager.GetCVar(CCVars.GameMap), Is.EqualTo(TestMapEligibleName),
$"Forcemap failed with a valid map ({TestMapEligibleName})");

// Try changing to a map that exists but is ineligible
consoleHost.ExecuteCommand($"forcemap {TestMapIneligibleName}");
Assert.That(configManager.GetCVar(CCVars.GameMap), Is.EqualTo(TestMapIneligibleName),
$"Forcemap failed with valid but ineligible map ({TestMapIneligibleName})!");
});

// Cleanup
configManager.SetCVar(CCVars.GameMap, DefaultMapName);

await pair.CleanReturnAsync();
}
}
4 changes: 2 additions & 2 deletions Content.Server/GameTicking/Commands/ForceMapCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ public void Execute(IConsoleShell shell, string argStr, string[] args)
var gameMap = IoCManager.Resolve<IGameMapManager>();
var name = args[0];

if (!gameMap.TrySelectMapIfEligible(name))
if (!gameMap.CheckMapExists(name))
{
shell.WriteLine($"No eligible map exists with name {name}.");
shell.WriteLine(Loc.GetString("forcemap-command-map-not-found", ("map", name)));
return;
}

Expand Down
1 change: 1 addition & 0 deletions Resources/Locale/en-US/game-ticking/forcemap-command.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@
forcemap-command-description = Forces the game to start with a given map next round.
forcemap-command-help = forcemap <map ID>
forcemap-command-need-one-argument = forcemap takes one argument, the path to the map file.
forcemap-command-map-not-found = No eligible map exists with name { $map }.
forcemap-command-success = Forced the game to start with map { $map } next round.
forcemap-command-arg-map = <map ID>

0 comments on commit 8aea47a

Please sign in to comment.