using System; using System.Threading.Tasks; using leak_test_project.Infrastructure; using leak_test_project.Services; using Moq; using Xunit; namespace leak_test_project.Tests.Services { public class Board4253ServiceTests { [Fact] public async Task CheckStatusAsync_Success_ReturnsTrue() { // Arrange var mockComm = new Mock(); mockComm.Setup(c => c.IsOpen).Returns(true); var service = new Board4253Service(mockComm.Object); int channel = 1; string expectedCommand = "x00c_001101:owt28006727ea97c7801\r\n"; // Simulate receiving Success message mockComm.Setup(c => c.Write(It.Is(s => s == expectedCommand))) .Callback(cmd => { Task.Run(() => { mockComm.Raise(c => c.DataReceived += null, mockComm.Object, "Response: Success "); }); }); // Act bool result = await service.CheckStatusAsync(channel); // Assert Assert.True(result); mockComm.Verify(c => c.Write(expectedCommand), Times.AtLeastOnce); } [Fact] public async Task CheckStatusAsync_Fail_ReturnsFalse() { // Arrange var mockComm = new Mock(); mockComm.Setup(c => c.IsOpen).Returns(true); var service = new Board4253Service(mockComm.Object); // Simulate receiving Fail message mockComm.Setup(c => c.Write(It.IsAny())) .Callback(cmd => { Task.Run(() => { mockComm.Raise(c => c.DataReceived += null, mockComm.Object, "Response: Fail "); }); }); // Act bool result = await service.CheckStatusAsync(); // 기본값 채널 1 테스트 // Assert Assert.False(result); } [Fact] public async Task ReadIdAsync_ValidId_ReturnsId() { // Arrange var mockComm = new Mock(); mockComm.Setup(c => c.IsOpen).Returns(true); var service = new Board4253Service(mockComm.Object); string expectedId = "ABC1234567890XYZ"; int channel = 2; string expectedCommand = "x00c_002101:ow2800326003e\r\n"; // Simulate receiving ID mockComm.Setup(c => c.Write(It.Is(s => s == expectedCommand))) .Callback(cmd => { Task.Run(() => { mockComm.Raise(c => c.DataReceived += null, mockComm.Object, $"ID: {expectedId} "); }); }); // Act string resultId = await service.ReadIdAsync(channel); // Assert Assert.Equal(expectedId, resultId); mockComm.Verify(c => c.Write(expectedCommand), Times.AtLeastOnce); } [Fact] public async Task ReadIdAsync_Timeout_ReturnsNull() { // Arrange var mockComm = new Mock(); mockComm.Setup(c => c.IsOpen).Returns(true); var service = new Board4253Service(mockComm.Object); service.TimeoutMs = 100; // 타임아웃 테스트 속도를 위해 100ms로 설정 // Act string resultId = await service.ReadIdAsync(); // Assert Assert.Null(resultId); } } }