mirror of
https://github.com/par274/sharpemu.git
synced 2026-07-22 19:06:15 +08:00
PerGameSettings Null toggles (#453)
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user