using Strata.SqlTools.SqlBreakdown.Classes; using Strata.SqlTools.SqlBreakdown.Expressions; using Strata.SqlTools.SqlBreakdown.Expressions.Functions.Aggregate; using Strata.SqlTools.SqlBreakdown.Expressions.Literals; namespace Strata.SqlTools.SqlBreakdown.Tests.ExpressionTests; [TestFixture] public class ArithmeticExpressionTests : ExpressionTestsBase { private static IEnumerable ArithmeticExpressionTestCases() { var testCases = new[] { new ExpressionTestCase { Name = "WithSum_{m}", Arrange = new Dictionary { ["revenue"] = new RegisteredTableColumnExpression(2, "NET_REVENUE", new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES")), ["cost"] = new RegisteredTableColumnExpression(3, "COST", new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES")) }, Act = (columns, visitor) => { var revenue = columns["revenue"]; var cost = columns["cost"]; var addExp = new SumFunction(revenue - cost - 1001); return addExp.Accept(visitor); }, Assertions = result => { var sql = (string)result; Assert.That(sql, Does.Contain("SUM")); Assert.That(sql, Does.Contain("-")); Assert.That(sql, Does.Contain("1001")); Assert.That(sql, Is.EqualTo("SUM(PES.NET_REVENUE - PES.COST - 1001)")); return true; } }, new ExpressionTestCase { Name = "Addition_{m}", Arrange = new Dictionary { ["revenue"] = new RegisteredTableColumnExpression(2, "NET_REVENUE", new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES")) }, Act = (columns, visitor) => { var revenue = columns["revenue"]; var result = revenue + new NumberLiteralExpression(1000); return result.Accept(visitor); }, Assertions = result => { var sql = (string)result; Assert.That(sql, Does.Contain("NET_REVENUE")); Assert.That(sql, Does.Contain("+")); Assert.That(sql, Does.Contain("1000")); return true; } }, new ExpressionTestCase { Name = "Multiplication_{m}", Arrange = new Dictionary { ["cost"] = new RegisteredTableColumnExpression(3, "COST", new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES")) }, Act = (columns, visitor) => { var cost = columns["cost"]; var result = cost * new NumberLiteralExpression(1.5m); return result.Accept(visitor); }, Assertions = result => { var sql = (string)result; Assert.That(sql, Does.Contain("COST")); Assert.That(sql, Does.Contain("*")); Assert.That(sql, Does.Contain("1.5")); return true; } }, new ExpressionTestCase { Name = "Division_{m}", Arrange = new Dictionary { ["revenue"] = new RegisteredTableColumnExpression(2, "NET_REVENUE", new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES")) }, Act = (columns, visitor) => { var revenue = columns["revenue"]; var result = revenue / new NumberLiteralExpression(2); return result.Accept(visitor); }, Assertions = result => { var sql = (string)result; Assert.That(sql, Does.Contain("NET_REVENUE")); Assert.That(sql, Does.Contain("/")); Assert.That(sql, Does.Contain("2")); return true; } } }; foreach (var testCase in testCases) { yield return new TestCaseData(testCase).SetName(testCase.Name); } } [TestCaseSource(nameof(ArithmeticExpressionTestCases))] public void ArithmeticExpression_GeneratesCorrectSql(ExpressionTestCase testCase) => ExecuteExpressionTest(testCase); }