using ZB.MOM.WW.ScadaBridge.ScriptAnalysis; namespace ZB.MOM.WW.ScadaBridge.ScriptAnalysis.Tests; /// /// M3.1: parse + compile gate tests. The "representative real script" corpus is /// the PRIMARY guard that faithfully mirrors /// the runtime ScriptGlobals surface — if a member or signature drifts, /// the corpus stops binding and this test fails. /// public class RoslynScriptCompilerTests { [Fact] public void ParseDiagnostics_NonEmpty_ForSyntaxError() { Assert.NotEmpty(RoslynScriptCompiler.ParseDiagnostics("var x = ;")); } [Fact] public void ParseDiagnostics_Empty_ForValidSyntax() { Assert.Empty(RoslynScriptCompiler.ParseDiagnostics("var x = 1;")); } [Fact] public void Compile_NonEmpty_ForUndefinedSymbol() { var code = "var x = NoSuchThing.Foo();"; Assert.NotEmpty(RoslynScriptCompiler.Compile(code, typeof(ScriptCompileSurface))); } [Fact] public void Compile_Empty_ForRepresentativeRealScript() { const string code = """ var temp = Attributes["Temperature"]; Attributes["Setpoint"] = 42; var r = await ExternalSystem.Call("erp", "sync"); var op = await Database.CachedWrite("hist", "INSERT ..."); await Notify.To("ops").Send("subj", "msg"); var shared = await Scripts.CallShared("Helper"); var child = Children["Pump"].Attributes["Speed"]; // Widen coverage across the rest of the surface. var attr = await Instance.GetAttribute("Temperature"); await Instance.SetAttribute("Setpoint", "43"); var track = await Instance.Tracking.Status(op); var parentSpeed = Parent?.Attributes["Speed"]; var alarmName = Alarm?.Name; var p = Parameters; var ct = CancellationToken; var status = await Notify.Status("notif-id"); var cachedCall = await ExternalSystem.CachedCall("erp", "ping"); var resolved = Attributes.Resolve("Temperature"); var conn = await Database.Connection("hist"); var scope = Scope; """; var diagnostics = RoslynScriptCompiler.Compile(code, typeof(ScriptCompileSurface)); Assert.Empty(diagnostics); } [Fact] public void Compile_Empty_ForTriggerExpression() { const string expr = "Attributes[\"Temp\"] != null && (int)(Children[\"P\"].Attributes[\"S\"] ?? 0) > 5"; var diagnostics = RoslynScriptCompiler.Compile(expr, typeof(TriggerCompileSurface)); Assert.Empty(diagnostics); } }