#nullable enable using System.Collections.Generic; using System.Linq; using Content.Server.Preferences.Managers; using Content.Shared.Preferences; using Content.Shared.Roles; using Robust.Shared.EntitySerialization; using Robust.Shared.EntitySerialization.Systems; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Network; using Robust.Shared.Prototypes; using Robust.Shared.Utility; namespace Content.IntegrationTests.Pair; // Contains misc helper functions to make writing tests easier. public sealed partial class TestPair { public Task CreateTestMap(bool initialized = true) => CreateTestMap(initialized, "Plating"); /// /// Loads a test map and returns a representing it. /// /// The to the test map to load. /// Whether to initialize the map on load. /// A representing the loaded map. public async Task LoadTestMap(ResPath testMapPath, bool initialized = true) { TestMapData mapData = new(); var deserializationOptions = DeserializationOptions.Default with { InitializeMaps = initialized }; var mapLoaderSys = Server.EntMan.System(); var mapSys = Server.System(); // Load our test map in and assert that it exists. await Server.WaitAssertion(() => { Assert.That(mapLoaderSys.TryLoadMap(testMapPath, out var map, out var gridSet, deserializationOptions), $"Failed to load map {testMapPath}."); Assert.That(gridSet, Is.Not.Empty, "There were no grids loaded from the map!"); mapData.MapUid = map!.Value.Owner; mapData.MapId = map!.Value.Comp.MapId; mapData.Grid = gridSet!.First(); mapData.GridCoords = new EntityCoordinates(mapData.Grid, 0, 0); mapData.MapCoords = new MapCoordinates(0, 0, mapData.MapId); mapData.Tile = mapSys.GetAllTiles(mapData.Grid.Owner, mapData.Grid.Comp).First(); }); await RunTicksSync(10); mapData.CMapUid = ToClientUid(mapData.MapUid); mapData.CGridUid = ToClientUid(mapData.Grid); mapData.CGridCoords = new EntityCoordinates(mapData.CGridUid, 0, 0); return mapData; } /// /// Set a user's antag preferences. Modified preferences are automatically reset at the end of the test. /// public async Task SetAntagPreference(ProtoId id, bool value, NetUserId? user = null) { user ??= Client.User!.Value; if (user is not { } userId) return; var prefMan = Server.ResolveDependency(); var prefs = prefMan.GetPreferences(userId); // Automatic preference resetting only resets slot 0. Assert.That(prefs.SelectedCharacterIndex, Is.EqualTo(0)); var profile = (HumanoidCharacterProfile)prefs.Characters[0]; var newProfile = profile.WithAntagPreference(id, value); _modifiedProfiles.Add(userId); await Server.WaitPost(() => prefMan.SetProfile(userId, 0, newProfile).Wait()); } /// /// Set a user's job preferences. Modified preferences are automatically reset at the end of the test. /// public async Task SetJobPriority(ProtoId id, JobPriority value, NetUserId? user = null) { user ??= Client.User!.Value; if (user is { } userId) await SetJobPriorities(userId, (id, value)); } /// public async Task SetJobPriorities(params (ProtoId, JobPriority)[] priorities) => await SetJobPriorities(Client.User!.Value, priorities); /// public async Task SetJobPriorities(NetUserId user, params (ProtoId, JobPriority)[] priorities) { var highCount = priorities.Count(x => x.Item2 == JobPriority.High); Assert.That(highCount, Is.LessThanOrEqualTo(1), "Cannot have more than one high priority job"); var prefMan = Server.ResolveDependency(); var prefs = prefMan.GetPreferences(user); var profile = (HumanoidCharacterProfile)prefs.Characters[0]; var dictionary = new Dictionary, JobPriority>(profile.JobPriorities); // Automatic preference resetting only resets slot 0. Assert.That(prefs.SelectedCharacterIndex, Is.EqualTo(0)); if (highCount != 0) { foreach (var (key, priority) in dictionary) { if (priority == JobPriority.High) dictionary[key] = JobPriority.Medium; } } foreach (var (job, priority) in priorities) { if (priority == JobPriority.Never) dictionary.Remove(job); else dictionary[job] = priority; } var newProfile = profile.WithJobPriorities(dictionary); _modifiedProfiles.Add(user); await Server.WaitPost(() => prefMan.SetProfile(user, 0, newProfile).Wait()); } }