using Microsoft.CodeAnalysis.CSharp.Scripting; using Microsoft.CodeAnalysis.Scripting; using Microsoft.Extensions.DependencyInjection; using Moq; using RobotNet10.Script; using RobotNet10.ScriptEngine; using RobotNet10.ScriptEngine.HubContexts; using RobotNet10.ScriptEngine.Models; using RobotNet10.ScriptEngine.Shared; using RobotNet10.ScriptEngine.Test.Helpers; using RobotNet10.Shared; namespace RobotNet10.ScriptEngine.Test; [TestFixture] public class ScriptEngineGlobalsTests { private Mock _mockLogger = null!; private Mock _mockScopeFactory = null!; private Mock _mockServiceProvider = null!; private Mock _mockScope = null!; private ScriptEngineGlobals _scriptEngineGlobals = null!; private VariableManager _variableManager = null!; private TaskManager _taskManager = null!; private MissionManager _missionManager = null!; [SetUp] public void SetUp() { _mockLogger = TestHelpers.CreateMockScriptLogger(); _mockServiceProvider = new Mock(); _mockScope = new Mock(); _mockScope.Setup(x => x.ServiceProvider).Returns(_mockServiceProvider.Object); _mockScopeFactory = new Mock(); _mockScopeFactory.Setup(x => x.CreateScope()).Returns(_mockScope.Object); var mockScriptResource = TestHelpers.CreateMockScriptResource(); var mockConsoleHubContext = TestHelpers.CreateMockConsoleHubContext(); var mockLoggerGlobals = TestHelpers.CreateMockLogger(); var configuration = TestHelpers.CreateMockConfiguration(); _variableManager = new VariableManager(); _taskManager = new TaskManager( _variableManager, mockScriptResource.Object, mockLoggerGlobals.Object, _mockScopeFactory.Object, mockConsoleHubContext.Object, configuration); _missionManager = new MissionManager( _mockScopeFactory.Object, _variableManager, mockScriptResource.Object, mockLoggerGlobals.Object, mockConsoleHubContext.Object, configuration); _mockServiceProvider.Setup(x => x.GetRequiredService()).Returns(_missionManager); _mockServiceProvider.Setup(x => x.GetRequiredService()).Returns(_taskManager); _scriptEngineGlobals = new ScriptEngineGlobals(_mockLogger.Object, _mockScopeFactory.Object); } [Test] public void Logger_ShouldReturnProvidedLogger() { // Act var logger = _scriptEngineGlobals.Logger; // Assert Assert.That(logger, Is.EqualTo(_mockLogger.Object)); } [Test] public void CreateMission_WithValidMission_ShouldReturnMissionId() { // Arrange var script = CSharpScript.Create>( "yield return new MissionStatus(100, \"Success\");", ScriptOptions.Default, typeof(ScriptGlobals)); var runner = script.CreateDelegate(); var missionModel = new ScriptMissionModel( "TestMission", new List(), "code", 100, false, false, runner); _missionManager.Load([missionModel]); _missionManager.Start(); // Act var missionId = _scriptEngineGlobals.CreateMission("TestMission"); // Assert Assert.That(missionId, Is.Not.EqualTo(Guid.Empty)); } [Test] public void CreateMission_WithNonExistentMission_ShouldThrowInvalidOperationException() { // Act & Assert Assert.Throws(() => _scriptEngineGlobals.CreateMission("NonExistentMission")); } [Test] public void CancelMission_WithExistingMission_ShouldReturnTrue() { // Arrange var script = CSharpScript.Create>( "yield return new MissionStatus(100, \"Success\");", ScriptOptions.Default, typeof(ScriptGlobals)); var runner = script.CreateDelegate(); var missionModel = new ScriptMissionModel( "TestMission", new List(), "code", 100, false, false, runner); _missionManager.Load([missionModel]); _missionManager.Start(); var missionId = _missionManager.CreateMission("TestMission", Array.Empty()).Data; // Act var result = _scriptEngineGlobals.CancelMission(missionId, "Test reason"); // Assert Assert.That(result, Is.True); } [Test] public void CancelMission_WithNonExistentMission_ShouldReturnFalse() { // Act var result = _scriptEngineGlobals.CancelMission(Guid.NewGuid(), "Test reason"); // Assert Assert.That(result, Is.False); } [Test] public void EnableTask_WithExistingTask_ShouldSucceed() { // Arrange var script = CSharpScript.Create( "await Task.Delay(10);", ScriptOptions.Default, typeof(ScriptGlobals)); var runner = script.CreateDelegate(); var taskModel = new ScriptTaskModel( "TestTask", 1000, false, "code", runner); _taskManager.Load([taskModel]); _taskManager.Start(); // Act & Assert Assert.DoesNotThrow(() => _scriptEngineGlobals.EnableTask("TestTask")); } [Test] public void EnableTask_WithNonExistentTask_ShouldThrowInvalidOperationException() { // Act & Assert Assert.Throws(() => _scriptEngineGlobals.EnableTask("NonExistentTask")); } [Test] public void DisableTask_WithExistingTask_ShouldSucceed() { // Arrange var script = CSharpScript.Create( "await Task.Delay(10);", ScriptOptions.Default, typeof(ScriptGlobals)); var runner = script.CreateDelegate(); var taskModel = new ScriptTaskModel( "TestTask", 1000, false, "code", runner); _taskManager.Load([taskModel]); _taskManager.Start(); _taskManager.EnableTask("TestTask"); // Act & Assert Assert.DoesNotThrow(() => _scriptEngineGlobals.DisableTask("TestTask")); } [Test] public void DisableTask_WithNonExistentTask_ShouldThrowInvalidOperationException() { // Act & Assert Assert.Throws(() => _scriptEngineGlobals.DisableTask("NonExistentTask")); } [TearDown] public void TearDown() { _taskManager?.Dispose(); _missionManager?.Dispose(); } }