using GFramework.Core.Abstractions.Logging; using GFramework.Core.Logging; using NUnit.Framework; namespace GFramework.Core.Tests.Logging; /// /// 测试Logger功能的单元测试类 /// [TestFixture] public class LoggerTests { /// /// 在每个测试方法执行前设置测试环境 /// 创建一个新的TestLogger实例,名称为"TestLogger",最小日志级别为Info /// [SetUp] public void SetUp() { _logger = new TestLogger("TestLogger"); } private TestLogger _logger = null!; /// /// 验证Name方法是否正确返回Logger的名称 /// [Test] public void Name_Should_ReturnLoggerName() { var name = _logger.Name(); Assert.That(name, Is.EqualTo("TestLogger")); } /// /// 验证当使用默认名称时,Name方法是否返回根Logger名称"ROOT" /// [Test] public void Name_WithDefaultName_Should_ReturnRootLoggerName() { var defaultLogger = new TestLogger(); Assert.That(defaultLogger.Name(), Is.EqualTo("ROOT")); } /// /// 验证当最小日志级别为Info时,IsTraceEnabled方法是否返回false /// [Test] public void IsTraceEnabled_WithInfoMinLevel_Should_ReturnFalse() { Assert.That(_logger.IsTraceEnabled(), Is.False); } /// /// 验证当最小日志级别为Info时,IsDebugEnabled方法是否返回false /// [Test] public void IsDebugEnabled_WithInfoMinLevel_Should_ReturnFalse() { Assert.That(_logger.IsDebugEnabled(), Is.False); } /// /// 验证当最小日志级别为Info时,IsInfoEnabled方法是否返回true /// [Test] public void IsInfoEnabled_WithInfoMinLevel_Should_ReturnTrue() { Assert.That(_logger.IsInfoEnabled(), Is.True); } /// /// 验证当最小日志级别为Info时,IsWarnEnabled方法是否返回true /// [Test] public void IsWarnEnabled_WithInfoMinLevel_Should_ReturnTrue() { Assert.That(_logger.IsWarnEnabled(), Is.True); } /// /// 验证当最小日志级别为Info时,IsErrorEnabled方法是否返回true /// [Test] public void IsErrorEnabled_WithInfoMinLevel_Should_ReturnTrue() { Assert.That(_logger.IsErrorEnabled(), Is.True); } /// /// 验证当最小日志级别为Info时,IsFatalEnabled方法是否返回true /// [Test] public void IsFatalEnabled_WithInfoMinLevel_Should_ReturnTrue() { Assert.That(_logger.IsFatalEnabled(), Is.True); } /// /// 验证IsEnabledForLevel方法对于不同日志级别的返回值是否正确 /// [Test] public void IsEnabledForLevel_WithValidLevel_Should_ReturnCorrectResult() { Assert.That(_logger.IsEnabledForLevel(LogLevel.Trace), Is.False); Assert.That(_logger.IsEnabledForLevel(LogLevel.Debug), Is.False); Assert.That(_logger.IsEnabledForLevel(LogLevel.Info), Is.True); Assert.That(_logger.IsEnabledForLevel(LogLevel.Warning), Is.True); Assert.That(_logger.IsEnabledForLevel(LogLevel.Error), Is.True); Assert.That(_logger.IsEnabledForLevel(LogLevel.Fatal), Is.True); } /// /// 验证当传入无效的日志级别时,IsEnabledForLevel方法是否会抛出ArgumentException异常 /// [Test] public void IsEnabledForLevel_WithInvalidLevel_Should_ThrowArgumentException() { Assert.Throws(() => _logger.IsEnabledForLevel((LogLevel)999)); } /// /// 验证当Trace级别被禁用时,Trace方法不会写入日志 /// [Test] public void Trace_ShouldNotWrite_WhenTraceDisabled() { _logger.Trace("Trace message"); Assert.That(_logger.Logs.Count, Is.EqualTo(0)); } /// /// 验证当Trace级别被禁用时,带格式化参数的Trace方法不会写入日志 /// [Test] public void Trace_WithFormat_ShouldNotWrite_WhenTraceDisabled() { _logger.Trace("Formatted {0}", "message"); Assert.That(_logger.Logs.Count, Is.EqualTo(0)); } /// /// 验证当Trace级别被禁用时,带两个参数的Trace方法不会写入日志 /// [Test] public void Trace_WithTwoArgs_ShouldNotWrite_WhenTraceDisabled() { _logger.Trace("Formatted {0} and {1}", "arg1", "arg2"); Assert.That(_logger.Logs.Count, Is.EqualTo(0)); } /// /// 验证当Trace级别被禁用时,带异常参数的Trace方法不会写入日志 /// [Test] public void Trace_WithException_ShouldNotWrite_WhenTraceDisabled() { var exception = new Exception("Test exception"); _logger.Trace("Trace message", exception); Assert.That(_logger.Logs.Count, Is.EqualTo(0)); } /// /// 验证当Debug级别被禁用时,Debug方法不会写入日志 /// [Test] public void Debug_ShouldNotWrite_WhenDebugDisabled() { _logger.Debug("Debug message"); Assert.That(_logger.Logs.Count, Is.EqualTo(0)); } /// /// 验证当Debug级别被禁用时,带格式化参数的Debug方法不会写入日志 /// [Test] public void Debug_WithFormat_ShouldNotWrite_WhenDebugDisabled() { _logger.Debug("Formatted {0}", "message"); Assert.That(_logger.Logs.Count, Is.EqualTo(0)); } /// /// 验证当Info级别启用时,Info方法会正确写入日志 /// [Test] public void Info_ShouldWrite_WhenInfoEnabled() { _logger.Info("Info message"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Level, Is.EqualTo(LogLevel.Info)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Info message")); Assert.That(_logger.Logs[0].Exception, Is.Null); } /// /// 验证带格式化参数的Info方法会正确写入格式化后的消息 /// [Test] public void Info_WithFormat_ShouldWriteFormattedMessage() { _logger.Info("Formatted {0}", "message"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Formatted message")); } /// /// 验证带两个参数的Info方法会正确写入格式化后的消息 /// [Test] public void Info_WithTwoArgs_ShouldWriteFormattedMessage() { _logger.Info("Formatted {0} and {1}", "arg1", "arg2"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Formatted arg1 and arg2")); } /// /// 验证带多个参数的Info方法会正确写入格式化后的消息 /// [Test] public void Info_WithMultipleArgs_ShouldWriteFormattedMessage() { _logger.Info("Formatted {0}, {1}, {2}", "arg1", "arg2", "arg3"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Formatted arg1, arg2, arg3")); } /// /// 验证带异常参数的Info方法会正确写入消息和异常 /// [Test] public void Info_WithException_ShouldWriteMessageAndException() { var exception = new Exception("Test exception"); _logger.Info("Info message", exception); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Info message")); Assert.That(_logger.Logs[0].Exception, Is.SameAs(exception)); } /// /// 验证当Warn级别启用时,Warn方法会正确写入日志 /// [Test] public void Warn_ShouldWrite_WhenWarnEnabled() { _logger.Warn("Warn message"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Level, Is.EqualTo(LogLevel.Warning)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Warn message")); } /// /// 验证带格式化参数的Warn方法会正确写入格式化后的消息 /// [Test] public void Warn_WithFormat_ShouldWriteFormattedMessage() { _logger.Warn("Formatted {0}", "message"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Formatted message")); } /// /// 验证带异常参数的Warn方法会正确写入消息和异常 /// [Test] public void Warn_WithException_ShouldWriteMessageAndException() { var exception = new Exception("Test exception"); _logger.Warn("Warn message", exception); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Exception, Is.SameAs(exception)); } /// /// 验证当Error级别启用时,Error方法会正确写入日志 /// [Test] public void Error_ShouldWrite_WhenErrorEnabled() { _logger.Error("Error message"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Level, Is.EqualTo(LogLevel.Error)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Error message")); } /// /// 验证带格式化参数的Error方法会正确写入格式化后的消息 /// [Test] public void Error_WithFormat_ShouldWriteFormattedMessage() { _logger.Error("Formatted {0}", "message"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Formatted message")); } /// /// 验证带异常参数的Error方法会正确写入消息和异常 /// [Test] public void Error_WithException_ShouldWriteMessageAndException() { var exception = new Exception("Test exception"); _logger.Error("Error message", exception); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Exception, Is.SameAs(exception)); } /// /// 验证当Fatal级别启用时,Fatal方法会正确写入日志 /// [Test] public void Fatal_ShouldWrite_WhenFatalEnabled() { _logger.Fatal("Fatal message"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Level, Is.EqualTo(LogLevel.Fatal)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Fatal message")); } /// /// 验证带格式化参数的Fatal方法会正确写入格式化后的消息 /// [Test] public void Fatal_WithFormat_ShouldWriteFormattedMessage() { _logger.Fatal("Formatted {0}", "message"); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Formatted message")); } /// /// 验证带异常参数的Fatal方法会正确写入消息和异常 /// [Test] public void Fatal_WithException_ShouldWriteMessageAndException() { var exception = new Exception("Test exception"); _logger.Fatal("Fatal message", exception); Assert.That(_logger.Logs.Count, Is.EqualTo(1)); Assert.That(_logger.Logs[0].Exception, Is.SameAs(exception)); } /// /// 验证多次调用日志方法会累积日志条目 /// [Test] public void MultipleLogCalls_ShouldAccumulateLogs() { _logger.Info("Message 1"); _logger.Warn("Message 2"); _logger.Error("Message 3"); Assert.That(_logger.Logs.Count, Is.EqualTo(3)); Assert.That(_logger.Logs[0].Message, Is.EqualTo("Message 1")); Assert.That(_logger.Logs[1].Message, Is.EqualTo("Message 2")); Assert.That(_logger.Logs[2].Message, Is.EqualTo("Message 3")); } /// /// 验证当最小日志级别设置为Trace时,所有级别的日志都会被启用 /// [Test] public void Logger_WithTraceMinLevel_ShouldEnableAllLevels() { var traceLogger = new TestLogger("TraceLogger", LogLevel.Trace); traceLogger.Trace("Trace"); traceLogger.Debug("Debug"); traceLogger.Info("Info"); traceLogger.Warn("Warn"); traceLogger.Error("Error"); traceLogger.Fatal("Fatal"); Assert.That(traceLogger.Logs.Count, Is.EqualTo(6)); } /// /// 验证当最小日志级别设置为Fatal时,只有Fatal级别的日志会被启用 /// [Test] public void Logger_WithFatalMinLevel_ShouldDisableAllButFatal() { var fatalLogger = new TestLogger("FatalLogger", LogLevel.Fatal); fatalLogger.Trace("Trace"); fatalLogger.Debug("Debug"); fatalLogger.Info("Info"); fatalLogger.Warn("Warn"); fatalLogger.Error("Error"); fatalLogger.Fatal("Fatal"); Assert.That(fatalLogger.Logs.Count, Is.EqualTo(1)); Assert.That(fatalLogger.Logs[0].Level, Is.EqualTo(LogLevel.Fatal)); } } /// /// 测试用的日志记录器实现类,继承自AbstractLogger /// public sealed class TestLogger : AbstractLogger { /// /// 初始化TestLogger的新实例 /// /// 日志记录器的名称,默认为null /// 最小日志级别,默认为LogLevel.Info public TestLogger(string? name = null, LogLevel minLevel = LogLevel.Info) : base(name, minLevel) { } /// /// 获取记录的日志条目列表 /// public List Logs { get; } = new(); /// /// 将日志信息写入内部存储 /// /// 日志级别 /// 日志消息 /// 相关异常(可选) protected override void Write(LogLevel level, string message, Exception? exception) { Logs.Add(new LogEntry(level, message, exception)); } /// /// 表示单个日志条目的记录类型 /// /// 日志级别 /// 日志消息 /// 相关异常(可选) public sealed record LogEntry(LogLevel Level, string Message, Exception? Exception); }