using System.Threading.Tasks; using Xunit; using XP.Hardware.MotionControl.Abstractions.Enums; using XP.Hardware.MotionControl.Implementations; namespace XplorePlane.Tests.Hardware { public class SimulatedLinearAxisTests { [Fact] public async Task MoveToTarget_SetsStatusToMoving_ThenIdle() { // Arrange - use fast speed for quicker test var axis = new SimulatedLinearAxis(AxisId.StageX, min: 0, max: 100, origin: 0, defaultSpeed: 200); // Act var result = axis.MoveToTarget(50); // Assert - should be Moving immediately after call Assert.True(result.Success); Assert.Equal(AxisStatus.Moving, axis.Status); // Wait for move to complete (50mm at 200mm/s = 250ms, add generous buffer) await Task.Delay(1000); Assert.Equal(AxisStatus.Idle, axis.Status); Assert.Equal(50.0, axis.ActualPosition, precision: 1); } [Fact] public void MoveToTarget_OutOfRange_ReturnsFail() { // Arrange var axis = new SimulatedLinearAxis(AxisId.StageX, min: 0, max: 100, origin: 0); // Act var result = axis.MoveToTarget(150); // Assert Assert.False(result.Success); Assert.NotNull(result.ErrorMessage); } [Fact] public async Task Stop_DuringMove_KeepsCurrentPosition() { // Arrange - use slow speed so we can stop mid-move var axis = new SimulatedLinearAxis(AxisId.StageX, min: 0, max: 100, origin: 0, defaultSpeed: 10); // Act - start a long move (100mm at 10mm/s = 10s) axis.MoveToTarget(100); await Task.Delay(200); // Let it move a bit axis.Stop(); // Assert Assert.Equal(AxisStatus.Idle, axis.Status); Assert.True(axis.ActualPosition > 0, "Position should have moved from 0"); Assert.True(axis.ActualPosition < 100, "Position should not have reached target"); } [Fact] public async Task Home_MovesToZero() { // Arrange - move to 50 first with fast speed var axis = new SimulatedLinearAxis(AxisId.StageX, min: 0, max: 100, origin: 0, defaultSpeed: 200); axis.MoveToTarget(50); await Task.Delay(1000); // Wait for move to complete Assert.Equal(50.0, axis.ActualPosition, precision: 1); // Act axis.Home(); await Task.Delay(1000); // Wait for home to complete // Assert Assert.Equal(0.0, axis.ActualPosition, precision: 1); Assert.Equal(AxisStatus.Idle, axis.Status); } } }