using Microsoft.Extensions.Logging.Abstractions; using ZB.MOM.WW.ScadaBridge.SiteRuntime.Scripts; namespace ZB.MOM.WW.ScadaBridge.SiteRuntime.Tests.Scripts; /// /// Shared Script Library tests — compile, register, execute inline. /// public class SharedScriptLibraryTests { private readonly ScriptCompilationService _compilationService; private readonly SharedScriptLibrary _library; /// Initializes a new instance of the SharedScriptLibraryTests class. public SharedScriptLibraryTests() { _compilationService = new ScriptCompilationService( NullLogger.Instance); _library = new SharedScriptLibrary( _compilationService, NullLogger.Instance); } /// Verifies that compile and register valid script succeeds. [Fact] public void CompileAndRegister_ValidScript_Succeeds() { var result = _library.CompileAndRegister("add", "1 + 2"); Assert.True(result); Assert.True(_library.Contains("add")); } /// Verifies that compile and register invalid script returns false. [Fact] public void CompileAndRegister_InvalidScript_ReturnsFalse() { var result = _library.CompileAndRegister("bad", "this is not valid {{{"); Assert.False(result); Assert.False(_library.Contains("bad")); } /// Verifies that compile and register forbidden api returns false. [Fact] public void CompileAndRegister_ForbiddenApi_ReturnsFalse() { var result = _library.CompileAndRegister("evil", "System.IO.File.Delete(\"/tmp\")"); Assert.False(result); } /// Verifies that compile and register replaces existing script. [Fact] public void CompileAndRegister_Replaces_ExistingScript() { _library.CompileAndRegister("calc", "1 + 1"); _library.CompileAndRegister("calc", "2 + 2"); Assert.True(_library.Contains("calc")); // Should have only one entry Assert.Equal(1, _library.GetRegisteredScriptNames().Count(n => n == "calc")); } /// Verifies that remove registered script returns true. [Fact] public void Remove_RegisteredScript_ReturnsTrue() { _library.CompileAndRegister("temp", "42"); Assert.True(_library.Remove("temp")); Assert.False(_library.Contains("temp")); } /// Verifies that remove nonexistent script returns false. [Fact] public void Remove_NonexistentScript_ReturnsFalse() { Assert.False(_library.Remove("nonexistent")); } /// Verifies that get registered script names returns all names. [Fact] public void GetRegisteredScriptNames_ReturnsAllNames() { _library.CompileAndRegister("a", "1"); _library.CompileAndRegister("b", "2"); _library.CompileAndRegister("c", "3"); var names = _library.GetRegisteredScriptNames(); Assert.Equal(3, names.Count); Assert.Contains("a", names); Assert.Contains("b", names); Assert.Contains("c", names); } /// Verifies that execute async nonexistent script throws. /// A task that represents the asynchronous operation. [Fact] public async Task ExecuteAsync_NonexistentScript_Throws() { await Assert.ThrowsAsync( () => _library.ExecuteAsync("missing", null!)); } }