diff --git a/Content.IntegrationTests/Tests/ConfigPresetTests.cs b/Content.IntegrationTests/Tests/ConfigPresetTests.cs new file mode 100644 index 0000000000..9defdcee99 --- /dev/null +++ b/Content.IntegrationTests/Tests/ConfigPresetTests.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; +using System.IO; +using Content.Server.Entry; +using Robust.Shared.Configuration; +using Robust.Shared.ContentPack; + +namespace Content.IntegrationTests.Tests; + +[TestFixture] +public sealed class ConfigPresetTests +{ + [Test] + public async Task TestLoadAll() + { + var pair = await PoolManager.GetServerClient(); + var server = pair.Server; + + var resources = server.ResolveDependency(); + var config = server.ResolveDependency(); + + await server.WaitPost(() => + { + var originalCVars = new List<(string, object)>(); + foreach (var cvar in config.GetRegisteredCVars()) + { + var value = config.GetCVar(cvar); + originalCVars.Add((cvar, value)); + } + + var originalCvarsStream = new MemoryStream(); + config.SaveToTomlStream(originalCvarsStream, config.GetRegisteredCVars()); + originalCvarsStream.Position = 0; + + var presets = resources.ContentFindFiles(EntryPoint.ConfigPresetsDir); + Assert.Multiple(() => + { + foreach (var preset in presets) + { + var stream = resources.ContentFileRead(preset); + Assert.DoesNotThrow(() => config.LoadDefaultsFromTomlStream(stream)); + } + }); + + config.LoadDefaultsFromTomlStream(originalCvarsStream); + + foreach (var originalCVar in originalCVars) + { + var (name, originalValue) = originalCVar; + var newValue = config.GetCVar(name); + var originalValueType = originalValue.GetType(); + var newValueType = newValue.GetType(); + if (originalValueType.IsEnum || newValueType.IsEnum) + { + originalValue = Enum.ToObject(originalValueType, originalValue); + newValue = Enum.ToObject(originalValueType, newValue); + } + + if (originalValueType == typeof(float) || newValueType == typeof(float)) + { + originalValue = Convert.ToSingle(originalValue); + newValue = Convert.ToSingle(newValue); + } + + if (!Equals(newValue, originalValue)) + Assert.Fail($"CVar {name} was not reset to its original value."); + } + }); + + await pair.CleanReturnAsync(); + } +} diff --git a/Content.Server/AssemblyInfo.cs b/Content.Server/AssemblyInfo.cs index 54b2cd50ac..513ab37ab2 100644 --- a/Content.Server/AssemblyInfo.cs +++ b/Content.Server/AssemblyInfo.cs @@ -1,3 +1,4 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Content.Tests")] +[assembly: InternalsVisibleTo("Content.IntegrationTests")] diff --git a/Content.Server/Entry/EntryPoint.cs b/Content.Server/Entry/EntryPoint.cs index 41b6963332..d71225116c 100644 --- a/Content.Server/Entry/EntryPoint.cs +++ b/Content.Server/Entry/EntryPoint.cs @@ -21,20 +21,20 @@ using Content.Server.ServerUpdates; using Content.Server.Voting.Managers; using Content.Shared.CCVar; using Content.Shared.Kitchen; +using Content.Shared.Localizations; using Robust.Server; -using Robust.Shared.Configuration; using Robust.Server.ServerStatus; +using Robust.Shared.Configuration; using Robust.Shared.ContentPack; using Robust.Shared.Prototypes; using Robust.Shared.Timing; using Robust.Shared.Utility; -using Content.Shared.Localizations; namespace Content.Server.Entry { public sealed class EntryPoint : GameServer { - private const string ConfigPresetsDir = "/ConfigPresets/"; + internal const string ConfigPresetsDir = "/ConfigPresets/"; private const string ConfigPresetsDirBuild = $"{ConfigPresetsDir}Build/"; private EuiManager _euiManager = default!;