PerGameSettings Null toggles (#453)

This commit is contained in:
kadu04t
2026-07-19 19:30:13 -03:00
committed by GitHub
parent 327018e80a
commit 184e24fbb6
2 changed files with 73 additions and 1 deletions
+13 -1
View File
@@ -49,7 +49,7 @@ public sealed class PerGameSettings
var path = PathFor(titleId); var path = PathFor(titleId);
if (File.Exists(path)) if (File.Exists(path))
{ {
return JsonSerializer.Deserialize<PerGameSettings>(File.ReadAllText(path), SerializerOptions); return NormalizeFromJson(File.ReadAllText(path));
} }
} }
catch (Exception) catch (Exception)
@@ -59,6 +59,18 @@ public sealed class PerGameSettings
return null; return null;
} }
// A null list inherits global settings; only entries in a present list are sanitized.
internal static PerGameSettings? NormalizeFromJson(string json)
{
var settings = JsonSerializer.Deserialize<PerGameSettings>(json, SerializerOptions);
if (settings?.EnvironmentToggles is { } toggles)
{
settings.EnvironmentToggles = toggles.Where(entry => !string.IsNullOrEmpty(entry)).ToList();
}
return settings;
}
public void Save(string titleId) public void Save(string titleId)
{ {
if (string.IsNullOrWhiteSpace(titleId)) if (string.IsNullOrWhiteSpace(titleId))
@@ -0,0 +1,60 @@
// Copyright (C) 2026 SharpEmu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
using SharpEmu.GUI;
using Xunit;
namespace SharpEmu.Libs.Tests.GUI;
public sealed class PerGameSettingsTests
{
// Invalid entries must not reach Environment.SetEnvironmentVariable.
[Fact]
public void NormalizeFromJson_NullOrEmptyToggleEntries_AreFilteredOut()
{
const string json = """
{ "EnvironmentToggles": [null, "SHARPEMU_TRACE", ""] }
""";
var settings = PerGameSettings.NormalizeFromJson(json);
Assert.NotNull(settings);
Assert.Equal(["SHARPEMU_TRACE"], settings.EnvironmentToggles);
}
// A null list means that the global setting should be inherited.
[Fact]
public void NormalizeFromJson_NullToggleList_StaysNull()
{
const string json = """{ "EnvironmentToggles": null }""";
var settings = PerGameSettings.NormalizeFromJson(json);
Assert.NotNull(settings);
Assert.Null(settings.EnvironmentToggles);
}
[Fact]
public void NormalizeFromJson_EmptyToggleList_StaysEmpty()
{
const string json = """{ "EnvironmentToggles": [] }""";
var settings = PerGameSettings.NormalizeFromJson(json);
Assert.NotNull(settings);
Assert.Empty(Assert.IsType<List<string>>(settings.EnvironmentToggles));
}
[Fact]
public void NormalizeFromJson_ValidToggles_ArePreserved()
{
const string json = """
{ "EnvironmentToggles": ["SHARPEMU_TRACE", "SHARPEMU_NO_JIT"] }
""";
var settings = PerGameSettings.NormalizeFromJson(json);
Assert.NotNull(settings);
Assert.Equal(["SHARPEMU_TRACE", "SHARPEMU_NO_JIT"], settings.EnvironmentToggles);
}
}