using Flyshot.Runtime.Common;
using Flyshot.Runtime.Fanuc;
using Flyshot.Runtime.Fanuc.Protocol;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
namespace Flyshot.Core.Tests;
///
/// 验证 FANUC 运行时通过依赖注入解析时,能够稳定拿到日志依赖。
///
public sealed class FanucControllerRuntimeLoggingRegistrationTests
{
///
/// 验证宿主按 IControllerRuntime 解析 FANUC 运行时时,不会因为可选日志参数而退回到无日志实例。
///
[Fact]
public void ServiceProvider_Resolves_FanucControllerRuntime_WithAllClientLoggers()
{
var services = new ServiceCollection();
services.AddLogging();
services.AddSingleton();
using var serviceProvider = services.BuildServiceProvider();
var runtime = serviceProvider.GetRequiredService();
var concreteRuntime = Assert.IsType(runtime);
var loggerField = typeof(FanucControllerRuntime).GetField("_logger", BindingFlags.Instance | BindingFlags.NonPublic);
Assert.NotNull(loggerField);
Assert.NotNull(loggerField!.GetValue(concreteRuntime));
AssertClientLoggerIsInjected(concreteRuntime, "_commandClient");
AssertClientLoggerIsInjected(concreteRuntime, "_stateClient");
AssertClientLoggerIsInjected(concreteRuntime, "_j519Client");
}
///
/// 断言运行时持有的底层协议客户端已注入对应类型的日志记录器。
///
/// 待检查的协议客户端类型。
/// 已经通过依赖注入解析出的 FANUC 运行时。
/// 运行时内部保存该客户端实例的字段名。
private static void AssertClientLoggerIsInjected(FanucControllerRuntime runtime, string clientFieldName)
{
var clientField = typeof(FanucControllerRuntime).GetField(clientFieldName, BindingFlags.Instance | BindingFlags.NonPublic);
Assert.NotNull(clientField);
var client = Assert.IsType(clientField!.GetValue(runtime));
var loggerField = typeof(TClient).GetField("_logger", BindingFlags.Instance | BindingFlags.NonPublic);
Assert.NotNull(loggerField);
Assert.NotNull(loggerField!.GetValue(client));
}
}