using Upsilon.BaseTypes; using Upsilon.BaseTypes.Number; using Upsilon.Evaluator; using Xunit; namespace UpsilonTests { public class FunctionTests { [Fact] public void BasicFunctionTest() { const string input = @" function testFunc () a = 100 end a = 50 testFunc() "; var script = new Script(input); Assert.Empty(script.Diagnostics.Messages); script.Evaluate(); Assert.Empty(script.Diagnostics.Messages); Assert.True(script.Scope.TryGet("testFunc", out var func)); Assert.IsType(func); Assert.True(script.Scope.TryGet("a", out var a)); Assert.Equal(100, (long)(NumberLong)a); } [Fact] public void ParameterTest() { const string input = @" function testFunc (var1) a = var1 end a = 50 testFunc(100) "; var script = new Script(input); Assert.Empty(script.Diagnostics.Messages); script.Evaluate(); Assert.Empty(script.Diagnostics.Messages); Assert.True(script.Scope.TryGet("testFunc", out var func)); Assert.IsType(func); Assert.True(script.Scope.TryGet("a", out var a)); Assert.Equal(100, (long)(NumberLong)a); } [Fact] public void ParameterBindTest() { const string input = @" function testFunc (var1) var1 == true end testFunc(100) "; var script = new Script(input); Assert.Empty(script.Diagnostics.Messages); script.Evaluate(); Assert.Single(script.Diagnostics.Messages); Assert.True(script.Scope.TryGet("testFunc", out var func)); Assert.IsType(func); } [Fact] public void BindUnusedFunctions() { const string input = @" function testFunc (var1) var1 == true end "; var script = new Script(input); Assert.Empty(script.Diagnostics.Messages); script.Evaluate(); Assert.Empty(script.Diagnostics.Messages); Assert.True(script.Scope.TryGet("testFunc", out var func)); var castType = Assert.IsType(func); Assert.NotNull(castType.Block); } } }