Tweaks for tests, allow for grabbing global scope variables

This commit is contained in:
Deukhoofd 2018-11-14 17:04:04 +01:00
parent 7e1edbe3f1
commit d6057ae954
No known key found for this signature in database
GPG Key ID: B4C087AC81641654
7 changed files with 52 additions and 25 deletions

View File

@ -82,5 +82,18 @@ namespace Upsilon.BaseTypes.Number
#endregion #endregion
public static explicit operator double(Number n)
{
if (n.IsFloat)
return ((NumberDouble) n);
return ((NumberLong) n).Value;
}
public static explicit operator long(Number n)
{
if (n.IsFloat)
return (long)((NumberDouble) n).Value;
return ((NumberLong) n).Value;
}
} }
} }

View File

@ -51,5 +51,22 @@ namespace Upsilon.Evaluator
return true; return true;
return false; return false;
} }
public bool TryGet(string variable, out LuaType obj)
{
foreach (var luaType in _variables)
{
if (luaType.Key.Name == variable)
{
obj = luaType.Value;
return true;
};
}
if (_parentScope != null)
if (_parentScope.TryGet(variable, out obj))
return true;
obj = null;
return false;
}
} }
} }

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using Upsilon.BaseTypes; using Upsilon.BaseTypes;
using Upsilon.BaseTypes.Number; using Upsilon.BaseTypes.Number;
using Upsilon.Binder; using Upsilon.Binder;
@ -12,13 +11,7 @@ namespace Upsilon.Evaluator
private LuaType _value; private LuaType _value;
private readonly EvaluationScope _scope; private readonly EvaluationScope _scope;
public Evaluator(Diagnostics diagnostics, Dictionary<VariableSymbol, LuaType> vars) internal Evaluator(Diagnostics diagnostics, EvaluationScope parentScope)
{
_diagnostics = diagnostics;
_scope = new EvaluationScope(vars);
}
private Evaluator(Diagnostics diagnostics, EvaluationScope parentScope)
{ {
_diagnostics = diagnostics; _diagnostics = diagnostics;
_scope = new EvaluationScope(parentScope); _scope = new EvaluationScope(parentScope);

View File

@ -13,6 +13,7 @@ namespace Upsilon.Evaluator
private readonly BlockStatementSyntax _parsed; private readonly BlockStatementSyntax _parsed;
public Diagnostics Diagnostics { get; } public Diagnostics Diagnostics { get; }
private Binder.Binder Binder { get; } private Binder.Binder Binder { get; }
public EvaluationScope Scope { get; }
public Script(string scriptString, Dictionary<VariableSymbol, LuaType> variables = null) public Script(string scriptString, Dictionary<VariableSymbol, LuaType> variables = null)
{ {
@ -22,7 +23,8 @@ namespace Upsilon.Evaluator
if (variables == null) if (variables == null)
variables = new Dictionary<VariableSymbol, LuaType>(); variables = new Dictionary<VariableSymbol, LuaType>();
Binder = new Binder.Binder(new BoundScope(variables, null), Diagnostics); Binder = new Binder.Binder(new BoundScope(variables, null), Diagnostics);
Evaluator = new Evaluator( Diagnostics, variables); Scope = new EvaluationScope(variables);
Evaluator = new Evaluator( Diagnostics, Scope);
} }
public BoundScript Bind() public BoundScript Bind()

View File

@ -17,8 +17,8 @@ namespace UpsilonTests
[InlineData("0.005 + 2.2", 2.205)] [InlineData("0.005 + 2.2", 2.205)]
public void Addition(string input, double expectedOutput) public void Addition(string input, double expectedOutput)
{ {
var actual = new Script(input).Evaluate<NumberDouble>(); var actual = new Script(input).Evaluate<Number>();
Assert.Equal(expectedOutput, actual, 8); Assert.Equal(expectedOutput, (double)actual, 8);
} }
[Theory] [Theory]
@ -30,8 +30,8 @@ namespace UpsilonTests
[InlineData("10.256-2.8546", 7.4014)] [InlineData("10.256-2.8546", 7.4014)]
public void Subtraction(string input, double expectedOutput) public void Subtraction(string input, double expectedOutput)
{ {
var actual = new Script(input).Evaluate<NumberDouble>(); var actual = new Script(input).Evaluate<Number>();
Assert.Equal(expectedOutput, actual, 8); Assert.Equal(expectedOutput, (double)actual, 8);
} }
[Theory] [Theory]
@ -40,18 +40,19 @@ namespace UpsilonTests
[InlineData("21312 * 41684", 888369408)] [InlineData("21312 * 41684", 888369408)]
public void Multiplication(string input, double expectedOutput) public void Multiplication(string input, double expectedOutput)
{ {
var actual = new Script(input).Evaluate<NumberDouble>(); var actual = new Script(input).Evaluate<Number>();
Assert.Equal(expectedOutput, actual, 8); Assert.Equal(expectedOutput, (double)actual, 8);
} }
[Theory] [Theory]
[InlineData("1/1", 1)] [InlineData("1/1", 1)]
[InlineData("1000 / 10", 100)] [InlineData("1000 / 10", 100)]
[InlineData("656486 / 5146", 127.57209483)] [InlineData("656486 / 5146", 127)]
[InlineData("656486 / 5146.0", 127.57209483)]
public void Divison(string input, double expectedOutput) public void Divison(string input, double expectedOutput)
{ {
var actual = new Script(input).Evaluate<NumberDouble>(); var actual = new Script(input).Evaluate<Number>();
Assert.Equal(expectedOutput, actual, 8); Assert.Equal(expectedOutput, (double)actual, 8);
} }
} }

View File

@ -12,7 +12,7 @@ namespace UpsilonTests
[InlineData("(10 + 5) * 5", 75)] [InlineData("(10 + 5) * 5", 75)]
public void Parenthesis(string input, double expectedOutput) public void Parenthesis(string input, double expectedOutput)
{ {
var actual = new Script(input).Evaluate<NumberDouble>(); var actual = new Script(input).Evaluate<NumberLong>();
Assert.Equal(expectedOutput, actual, 8); Assert.Equal(expectedOutput, actual, 8);
} }
@ -21,7 +21,7 @@ namespace UpsilonTests
[InlineData("5 + 10 * 5", 55)] [InlineData("5 + 10 * 5", 55)]
public void MultiplicationBeforeAddition(string input, double expectedOutput) public void MultiplicationBeforeAddition(string input, double expectedOutput)
{ {
var actual = new Script(input).Evaluate<NumberDouble>(); var actual = new Script(input).Evaluate<NumberLong>();
Assert.Equal(expectedOutput, actual, 8); Assert.Equal(expectedOutput, actual, 8);
} }

View File

@ -14,13 +14,13 @@ a = 10
if true then if true then
local a = 100 local a = 100
end end
b = a
"; ";
var script = new Script(input); var script = new Script(input);
Assert.Empty(script.Diagnostics.Messages); Assert.Empty(script.Diagnostics.Messages);
var evaluate = script.Evaluate<NumberLong>(); script.Evaluate();
Assert.Empty(script.Diagnostics.Messages); Assert.Empty(script.Diagnostics.Messages);
Assert.Equal((long)10, evaluate); Assert.True(script.Scope.TryGet("a", out var obj));
Assert.Equal((long)10, (NumberLong)obj);
} }
[Fact] [Fact]
@ -35,9 +35,10 @@ b = a
"; ";
var script = new Script(input); var script = new Script(input);
Assert.Empty(script.Diagnostics.Messages); Assert.Empty(script.Diagnostics.Messages);
var evaluate = script.Evaluate<NumberLong>(); script.Evaluate();
Assert.Empty(script.Diagnostics.Messages); Assert.Empty(script.Diagnostics.Messages);
Assert.Equal((long)100, evaluate); Assert.True(script.Scope.TryGet("a", out var obj));
Assert.Equal((long)100, (NumberLong)obj);
} }
} }