diff --git a/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/ScriptCompileSurface.cs b/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/ScriptCompileSurface.cs index 77e4fecf..03390ae1 100644 --- a/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/ScriptCompileSurface.cs +++ b/src/ZB.MOM.WW.ScadaBridge.ScriptAnalysis/ScriptCompileSurface.cs @@ -185,6 +185,14 @@ public sealed class ScriptCompileSurface /// Mirrors AttributeAccessor.Resolve. public string Resolve(string key) => throw new NotSupportedException(CompileOnly); + + /// Mirrors AttributeAccessor.WaitAsync. + public Task WaitAsync(string key, object? targetValue, TimeSpan timeout, bool requireGoodQuality = false) => throw new NotSupportedException(CompileOnly); + public Task WaitAsync(string key, Func predicate, TimeSpan timeout, bool requireGoodQuality = false) => throw new NotSupportedException(CompileOnly); + + /// Mirrors AttributeAccessor.WaitForAsync. + public Task WaitForAsync(string key, object? targetValue, TimeSpan timeout, bool requireGoodQuality = false) => throw new NotSupportedException(CompileOnly); + public Task WaitForAsync(string key, Func predicate, TimeSpan timeout, bool requireGoodQuality = false) => throw new NotSupportedException(CompileOnly); } /// Compile-only mirror of ChildrenAccessor. diff --git a/tests/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.Tests/RoslynScriptCompilerTests.cs b/tests/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.Tests/RoslynScriptCompilerTests.cs index e6545685..71ce7812 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.Tests/RoslynScriptCompilerTests.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.ScriptAnalysis.Tests/RoslynScriptCompilerTests.cs @@ -69,4 +69,24 @@ public class RoslynScriptCompilerTests var diagnostics = RoslynScriptCompiler.Compile(expr, typeof(TriggerCompileSurface)); Assert.Empty(diagnostics); } + + [Fact] + public void Compile_Empty_ForWaitAsyncAndWaitForAsync() + { + // Covers all four overloads: value + predicate for both WaitAsync and + // WaitForAsync, on both root scope and composed/child scope. + const string code = """ + // Root scope — value overload + var matched = await Attributes.WaitAsync("Flag", true, System.TimeSpan.FromSeconds(5)); + // Root scope — predicate overload with requireGoodQuality + var matched2 = await Attributes.WaitAsync("Flag", v => v != null, System.TimeSpan.FromSeconds(5), true); + // Root scope — WaitForAsync value overload + var r = await Attributes.WaitForAsync("Flag", true, System.TimeSpan.FromSeconds(5)); + // Composed/child scope — value overload + var childMatched = await Children["LeftMESReceiver"].Attributes.WaitAsync("MoveInCompleteFlag", true, System.TimeSpan.FromSeconds(5)); + """; + + var diagnostics = RoslynScriptCompiler.Compile(code, typeof(ScriptCompileSurface)); + Assert.Empty(diagnostics); + } }