From afb7a65a665e648a330ac44e800fe23f0003e22a Mon Sep 17 00:00:00 2001 From: Jordan Wages Date: Wed, 20 Aug 2025 05:45:22 -0500 Subject: [PATCH] Function registry fix. --- src/core/ICodedFunction.cs | 1 + src/core/InputInterpreter.cs | 4 +- src/stdlib/Constants.cs | 4 +- src/stdlib/Functions.cs | 26 +++++++ src/stdlib/functions/AbsoluteValue.cs | 8 ++ src/stdlib/functions/Max.cs | 8 ++ src/stdlib/functions/Min.cs | 8 ++ src/stdlib/functions/Sign.cs | 8 ++ src/tests/StdlibFunctionsTests.cs | 103 +++----------------------- 9 files changed, 74 insertions(+), 96 deletions(-) create mode 100644 src/stdlib/Functions.cs diff --git a/src/core/ICodedFunction.cs b/src/core/ICodedFunction.cs index 4baf142..b5df526 100644 --- a/src/core/ICodedFunction.cs +++ b/src/core/ICodedFunction.cs @@ -10,6 +10,7 @@ namespace csmic { #region Properties + string Name { get; } IEnumerable ExpectedArguments { get; } FunctionValue ReturnValue { get; } diff --git a/src/core/InputInterpreter.cs b/src/core/InputInterpreter.cs index a38ca53..a306ac1 100644 --- a/src/core/InputInterpreter.cs +++ b/src/core/InputInterpreter.cs @@ -173,9 +173,9 @@ namespace csmic #region Functions - internal void RegisterFunction(string name, ICodedFunction function) + public void RegisterFunction(ICodedFunction function) { - functions[name] = function; + functions[function.Name] = function; } internal FunctionValue ExecuteFunction(string name, params FunctionArgument[] args) diff --git a/src/stdlib/Constants.cs b/src/stdlib/Constants.cs index 1d332f0..c599ae1 100644 --- a/src/stdlib/Constants.cs +++ b/src/stdlib/Constants.cs @@ -1,8 +1,8 @@ namespace csmic.stdlib { - public class Constants + public static class Constants { - public void Initialize(InputInterpreter inputInterpreter) + public static void Initialize(InputInterpreter inputInterpreter) { if(inputInterpreter == null) { diff --git a/src/stdlib/Functions.cs b/src/stdlib/Functions.cs new file mode 100644 index 0000000..75b64c5 --- /dev/null +++ b/src/stdlib/Functions.cs @@ -0,0 +1,26 @@ +using csmic; +using stdlib.functions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace stdlib +{ + public static class Functions + { + public static void Initialize(InputInterpreter inputInterpreter) + { + if (inputInterpreter == null) + { + throw new ArgumentNullException("inputInterpreter", "Cannot initialize a null InputInterpreter."); + } + + inputInterpreter.RegisterFunction(new AbsoluteValue()); + inputInterpreter.RegisterFunction(new Sign()); + inputInterpreter.RegisterFunction(new Min()); + inputInterpreter.RegisterFunction(new Max()); + } + } +} diff --git a/src/stdlib/functions/AbsoluteValue.cs b/src/stdlib/functions/AbsoluteValue.cs index 14762fe..61e2d08 100644 --- a/src/stdlib/functions/AbsoluteValue.cs +++ b/src/stdlib/functions/AbsoluteValue.cs @@ -5,6 +5,14 @@ namespace stdlib.functions { public class AbsoluteValue : FunctionBase, ICodedFunction { + public string Name + { + get + { + return "abs"; + } + } + public override IEnumerable ExpectedArguments { get diff --git a/src/stdlib/functions/Max.cs b/src/stdlib/functions/Max.cs index df3ba64..9c60d85 100644 --- a/src/stdlib/functions/Max.cs +++ b/src/stdlib/functions/Max.cs @@ -9,6 +9,14 @@ namespace stdlib.functions { public class Max : FunctionBase, ICodedFunction { + public string Name + { + get + { + return "max"; + } + } + public override IEnumerable ExpectedArguments { get diff --git a/src/stdlib/functions/Min.cs b/src/stdlib/functions/Min.cs index 18ca33e..94d2faf 100644 --- a/src/stdlib/functions/Min.cs +++ b/src/stdlib/functions/Min.cs @@ -9,6 +9,14 @@ namespace stdlib.functions { public class Min : FunctionBase, ICodedFunction { + public string Name + { + get + { + return "min"; + } + } + public override IEnumerable ExpectedArguments { get diff --git a/src/stdlib/functions/Sign.cs b/src/stdlib/functions/Sign.cs index f6578d5..c1910d9 100644 --- a/src/stdlib/functions/Sign.cs +++ b/src/stdlib/functions/Sign.cs @@ -8,6 +8,14 @@ namespace stdlib.functions public const decimal POSITIVE = 1; public const decimal NEGATIVE = -1; + public string Name + { + get + { + return "sign"; + } + } + public override IEnumerable ExpectedArguments { get diff --git a/src/tests/StdlibFunctionsTests.cs b/src/tests/StdlibFunctionsTests.cs index a8030c8..1121ba2 100644 --- a/src/tests/StdlibFunctionsTests.cs +++ b/src/tests/StdlibFunctionsTests.cs @@ -1,105 +1,24 @@ using csmic; +using csmic.stdlib; using NUnit.Framework; +using stdlib; using stdlib.functions; +using System.Globalization; +using System.Reflection.Metadata; namespace tests; public class StdlibFunctionsTests { - private static FunctionArgument NumArg(decimal d) => new FunctionArgument("value", new FunctionValue(FunctionValueType.Numeric, d)); + private InputInterpreter _interp = null!; - [Test] - public void AbsoluteValue_Positive_ReturnsSame() + [SetUp] + public void Setup() { - var fn = new AbsoluteValue(); - var result = fn.Execute(NumArg(5m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(5m)); - } - - [Test] - public void AbsoluteValue_Negative_ReturnsPositive() - { - var fn = new AbsoluteValue(); - var result = fn.Execute(NumArg(-12.5m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(12.5m)); - } - - [Test] - public void AbsoluteValue_Zero_ReturnsZero() - { - var fn = new AbsoluteValue(); - var result = fn.Execute(NumArg(0m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(0m)); - } - - [Test] - public void AbsoluteValue_InvalidArgType_ReturnsNone() - { - var fn = new AbsoluteValue(); - var badArg = new FunctionArgument("value", FunctionValue.STRING); - var result = fn.Execute(badArg); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.None)); - Assert.That(result.Value, Is.Null); - } - - [Test] - public void AbsoluteValue_WrongArgCount_ReturnsNone() - { - var fn = new AbsoluteValue(); - var result0 = fn.Execute(); - var result2 = fn.Execute(NumArg(1m), NumArg(2m)); - Assert.That(result0.Type, Is.EqualTo(FunctionValueType.None)); - Assert.That(result2.Type, Is.EqualTo(FunctionValueType.None)); - } - - [Test] - public void Sign_Negative_ReturnsNegativeOne() - { - var fn = new Sign(); - var result = fn.Execute(NumArg(-1m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(Sign.NEGATIVE)); - } - - [Test] - public void Sign_Zero_ReturnsPositiveOne() - { - var fn = new Sign(); - var result = fn.Execute(NumArg(0m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(Sign.POSITIVE)); - } - - [Test] - public void Sign_Positive_ReturnsPositiveOne() - { - var fn = new Sign(); - var result = fn.Execute(NumArg(99.99m)); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.Numeric)); - Assert.That(result.Value, Is.EqualTo(Sign.POSITIVE)); - } - - [Test] - public void Sign_InvalidArgType_ReturnsNone() - { - var fn = new Sign(); - var badArg = new FunctionArgument("value", FunctionValue.STRING); - var result = fn.Execute(badArg); - Assert.That(result.Type, Is.EqualTo(FunctionValueType.None)); - Assert.That(result.Value, Is.Null); - } - - [Test] - public void Sign_WrongArgCount_ReturnsNone() - { - var fn = new Sign(); - var result0 = fn.Execute(); - var result2 = fn.Execute(NumArg(1m), NumArg(2m)); - Assert.That(result0.Type, Is.EqualTo(FunctionValueType.None)); - Assert.That(result2.Type, Is.EqualTo(FunctionValueType.None)); + CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; + _interp = new InputInterpreter(); + Constants.Initialize(_interp); + Functions.Initialize(_interp); ; } }