using MeterVault.Core.Normalization.Expressions; namespace MeterVault.Core.Tests; public sealed class ExpressionEvaluatorTests { private static readonly Dictionary Vars = new() { ["m1"] = 411, ["m2"] = 416, }; [Theory] [InlineData("1 + 2 * 3", 7)] [InlineData("(1 + 2) * 3", 9)] [InlineData("-5", -5)] [InlineData("10 / 4", 2.5)] [InlineData("2 - 3 - 4", -5)] // left-associative [InlineData("m1 - m2", -5)] [InlineData("m1 + m2", 827)] [InlineData("unknown + 1", 1)] // unknown identifiers resolve to 0 public void Evaluates_arithmetic(string expression, double expected) { var result = ExpressionEvaluator.Compile(expression).Evaluate(Vars); Assert.Equal(expected, result, 6); } [Theory] [InlineData("1 +")] [InlineData("(1 + 2")] [InlineData("1 2")] [InlineData("")] public void Rejects_malformed_expressions(string expression) => Assert.ThrowsAny(() => ExpressionEvaluator.Compile(expression)); }