Upsilon/UpsilonTests/GeneralTests/FunctionTests.cs

204 lines
5.4 KiB
C#
Raw Normal View History

2018-11-15 14:51:05 +00:00
using Upsilon.Evaluator;
using Xunit;
2018-11-23 13:38:45 +00:00
namespace UpsilonTests.GeneralTests
2018-11-15 14:51:05 +00:00
{
2018-11-23 11:55:28 +00:00
public class FunctionTests : TestClass
2018-11-15 14:51:05 +00:00
{
2018-11-23 11:55:28 +00:00
public FunctionTests(StaticScriptFixture fix) : base(fix)
{
}
2018-11-15 14:51:05 +00:00
[Fact]
public void BasicFunctionTest()
{
const string input = @"
function testFunc ()
a = 100
end
a = 50
testFunc()
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
2018-11-15 14:51:05 +00:00
Assert.Empty(script.Diagnostics.Messages);
script.Evaluate();
Assert.Empty(script.Diagnostics.Messages);
var a = script.GetVariable<long>("a");
Assert.Equal(100, a);
2018-11-15 14:51:05 +00:00
}
2018-11-15 19:13:53 +00:00
[Fact]
public void ParameterTest()
{
const string input = @"
function testFunc (var1)
a = var1
end
a = 50
testFunc(100)
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
2018-11-15 19:13:53 +00:00
Assert.Empty(script.Diagnostics.Messages);
script.Evaluate();
Assert.Empty(script.Diagnostics.Messages);
var a = script.GetVariable<long>("a");
Assert.Equal(100, a);
2018-11-15 19:13:53 +00:00
}
[Fact]
public void ParameterBindTest()
{
const string input = @"
function testFunc (var1)
var1 == true
2018-11-15 19:13:53 +00:00
end
testFunc(100)
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
2018-11-15 19:13:53 +00:00
Assert.Empty(script.Diagnostics.Messages);
2018-11-19 11:49:48 +00:00
script.Evaluate();
Assert.Single(script.Diagnostics.Messages);
Assert.True(script.HasVariable("testFunc"));
2018-11-15 19:13:53 +00:00
}
[Fact]
public void BindUnusedFunctions()
{
const string input = @"
function testFunc (var1)
var1 == true
end
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
Assert.Empty(script.Diagnostics.Messages);
var val = script.Evaluate();
Assert.Empty(script.Diagnostics.Messages);
Assert.True(script.HasVariable("testFunc"));
}
2018-11-16 12:45:03 +00:00
[Fact]
public void ReturnFromFunction()
{
const string input = @"
function testFunc ()
return 5
end
a = testFunc()
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
2018-11-16 12:45:03 +00:00
Assert.Empty(script.Diagnostics.Messages);
script.Evaluate();
Assert.Empty(script.Diagnostics.Messages);
var a = script.GetVariable<long>("a");
Assert.Equal(5, a);
2018-11-16 12:45:03 +00:00
}
[Fact]
public void ReturnFromFunctionOnce()
{
const string input = @"
function testFunc ()
return 5
return 10
end
a = testFunc()
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
2018-11-16 12:45:03 +00:00
Assert.Empty(script.Diagnostics.Messages);
script.Evaluate();
Assert.Empty(script.Diagnostics.Messages);
var a = script.GetVariable<long>("a");
Assert.Equal(5, a);
2018-11-16 12:45:03 +00:00
}
[Fact]
public void ReturnFromFunctionNested()
{
const string input = @"
function testFunc ()
if true then
return 5
end
return 10
end
a = testFunc()
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
2018-11-16 12:45:03 +00:00
Assert.Empty(script.Diagnostics.Messages);
script.Evaluate();
Assert.Empty(script.Diagnostics.Messages);
var a = script.GetVariable<long>("a");
Assert.Equal(5, a);
2018-11-16 12:45:03 +00:00
}
[Fact]
public void ReturnFromScriptAsFunction()
{
const string input = @"
a = 100
return 60
a = 87
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
2018-11-16 12:45:03 +00:00
Assert.Empty(script.Diagnostics.Messages);
var result = script.Evaluate<long>();
2018-11-16 12:45:03 +00:00
Assert.Empty(script.Diagnostics.Messages);
Assert.Equal(60, result);
2018-11-16 12:45:03 +00:00
}
[Fact]
public void ReturnFromCSharpCall()
{
const string input = @"
function testFunc ()
return 100
end
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
Assert.Empty(script.Diagnostics.Messages);
var result = script.EvaluateFunction<long>("testFunc");
Assert.Empty(script.Diagnostics.Messages);
Assert.Equal(100, result);
}
[Fact]
public void ReturnFromCSharpCallWithParameter()
{
const string input = @"
function testFunc (b)
if b then
return 100
else
return 50
end
end
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
Assert.Empty(script.Diagnostics.Messages);
var result = script.EvaluateFunction<long>("testFunc", new object[] {true});
Assert.Empty(script.Diagnostics.Messages);
Assert.Equal(100, result);
var result2 = script.EvaluateFunction<long>("testFunc", new object[] {false});
Assert.Empty(script.Diagnostics.Messages);
Assert.Equal(50, result2);
}
[Fact]
public void ReturnFromCSharpCallWithParameters()
{
const string input = @"
function add (a, b)
return a + b
end
";
2018-11-23 11:55:28 +00:00
var script = new Script(input, BoundScope, StaticScope);
Assert.Empty(script.Diagnostics.Messages);
var result = script.EvaluateFunction<long>("add", new object[] {400, 128});
Assert.Empty(script.Diagnostics.Messages);
Assert.Equal(528, result);
}
2018-11-15 14:51:05 +00:00
}
}