using Serilog; using Serilog.Core; using ZB.MOM.WW.OtOpcUa.Core.Abstractions; using ZB.MOM.WW.OtOpcUa.Core.Scripting; namespace ZB.MOM.WW.OtOpcUa.Core.Scripting.Tests; /// /// In-memory for tests. Holds a tag dictionary + a write /// log + a deterministic clock. Concrete subclasses in production will wire /// GetTag/SetVirtualTag through the virtual-tag engine + driver dispatch; here they /// hit a plain dictionary. /// public sealed class FakeScriptContext : ScriptContext { public Dictionary Tags { get; } = new(StringComparer.Ordinal); public List<(string Path, object? Value)> Writes { get; } = []; public override DateTime Now { get; } = new DateTime(2026, 1, 1, 12, 0, 0, DateTimeKind.Utc); public override ILogger Logger { get; } = new LoggerConfiguration().CreateLogger(); public override DataValueSnapshot GetTag(string path) { return Tags.TryGetValue(path, out var v) ? v : new DataValueSnapshot(null, 0x80340000u, null, Now); // BadNodeIdUnknown } public override void SetVirtualTag(string path, object? value) { Writes.Add((path, value)); } public FakeScriptContext Seed(string path, object? value, uint statusCode = 0u, DateTime? sourceTs = null) { Tags[path] = new DataValueSnapshot(value, statusCode, sourceTs ?? Now, Now); return this; } }