diff --git a/HILFE.Tests/Framework/Reflection/TypenameFunctionTest.cs b/HILFE.Tests/Framework/Reflection/TypenameFunctionTest.cs new file mode 100644 index 00000000..f8bdd6b9 --- /dev/null +++ b/HILFE.Tests/Framework/Reflection/TypenameFunctionTest.cs @@ -0,0 +1,56 @@ +using HILFE.Framework.Reflection; +using HILFE.Interpreting; +using HILFE.Parsing.Expressions; +using HILFE.Tokenizing; + +namespace HILFE.Tests.Framework.Reflection; + +public class TypenameFunctionTest +{ + [Theory] + [ClassData(typeof(TypenameData))] + public async Task TestEvaluateAsync(string typeName, ExpressionResult arg) + { + const string varName = "a"; + var interpreter = new Interpreter(); + interpreter.CurrentScope.SetVariable(varName, arg); + + var function = new TypenameFunction(); + var result = await function.EvaluateAsync(interpreter, new []{ new VariableExpression(new(TokenType.Identifier, varName)) }); + + Assert.Equal("string", result.ValueType); + Assert.Equal(typeName, result.Value as string); + } + + [Fact] + public async Task TestEvaluateAsyncThrowsForNonVariableExpression() + { + var interpreter = new Interpreter(); + var function = new TypenameFunction(); + + await Assert.ThrowsAsync(() => function.EvaluateAsync(interpreter, new []{ ConstantExpression.String("abc") })); + } + + [Fact] + public async Task TestEvaluateAsyncThrowsForInvalidArgCounts() + { + var interpreter = new Interpreter(); + var function = new TypenameFunction(); + + await Assert.ThrowsAsync(() => function.EvaluateAsync(interpreter, new []{ ConstantExpression.String("abc"), ConstantExpression.String("abc") })); + await Assert.ThrowsAsync(() => function.EvaluateAsync(interpreter, Array.Empty())); + } + + private class TypenameData : TheoryData + { + public TypenameData() + { + Add("null", ExpressionResult.Null); + Add("void", ExpressionResult.Void); + Add("bool", ExpressionResult.True); + Add("number", ExpressionResult.Number(123)); + Add("string", ExpressionResult.String("test")); + Add("function", ExpressionResult.Function(new TypenameFunction())); + } + } +} \ No newline at end of file diff --git a/HILFE/Parsing/Expressions/ExpressionResult.cs b/HILFE/Parsing/Expressions/ExpressionResult.cs index 65eb6103..fdb5dc40 100644 --- a/HILFE/Parsing/Expressions/ExpressionResult.cs +++ b/HILFE/Parsing/Expressions/ExpressionResult.cs @@ -11,6 +11,14 @@ public record ExpressionResult(string ValueType, dynamic? Value = null, bool IsV public static ExpressionResult True { get; } = new("bool", true); public static ExpressionResult False { get; } = new("bool", false); + + public static ExpressionResult Number(double value) => new("number", value); + + public static ExpressionResult String(string value) => new("string", value); + + public static ExpressionResult Bool(bool value) => new("bool", value); + + public static ExpressionResult Function(FunctionDefinition definition) => new("function", definition); /// public virtual bool Equals(ExpressionResult? other)