diff --git a/src/SharpEmu.Logging/SharpEmuLog.cs b/src/SharpEmu.Logging/SharpEmuLog.cs index f778bb69..f3ed3877 100644 --- a/src/SharpEmu.Logging/SharpEmuLog.cs +++ b/src/SharpEmu.Logging/SharpEmuLog.cs @@ -110,7 +110,8 @@ public static class SharpEmuLog } var normalized = text.Trim(); - if (Enum.TryParse(normalized, ignoreCase: true, out level)) + if (Enum.TryParse(normalized, ignoreCase: true, out level) && + Enum.IsDefined(level)) { return true; } @@ -127,6 +128,7 @@ public static class SharpEmuLog return true; } + level = default; return false; } diff --git a/tests/SharpEmu.Libs.Tests/Logging/SharpEmuLogTests.cs b/tests/SharpEmu.Libs.Tests/Logging/SharpEmuLogTests.cs new file mode 100644 index 00000000..786c6d3a --- /dev/null +++ b/tests/SharpEmu.Libs.Tests/Logging/SharpEmuLogTests.cs @@ -0,0 +1,39 @@ +// Copyright (C) 2026 SharpEmu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +using SharpEmu.Logging; +using Xunit; + +namespace SharpEmu.Libs.Tests.Logging; + +public sealed class SharpEmuLogTests +{ + [Theory] + [InlineData("Trace", LogLevel.Trace)] + [InlineData("debug", LogLevel.Debug)] + [InlineData(" Info ", LogLevel.Info)] + [InlineData("WARNING", LogLevel.Warning)] + [InlineData("Error", LogLevel.Error)] + [InlineData("critical", LogLevel.Critical)] + [InlineData("None", LogLevel.None)] + [InlineData("warn", LogLevel.Warning)] + [InlineData("fatal", LogLevel.Critical)] + public void TryParseLevelAcceptsDefinedNamesAndAliases(string text, LogLevel expected) + { + Assert.True(SharpEmuLog.TryParseLevel(text, out var actual)); + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + [InlineData("unknown")] + [InlineData("999")] + [InlineData("-1")] + public void TryParseLevelRejectsInvalidValues(string? text) + { + Assert.False(SharpEmuLog.TryParseLevel(text, out var level)); + Assert.Equal(default, level); + } +}