using Strata.SqlTools.SqlBreakdown.Classes; using Strata.SqlTools.SqlBreakdown.Expressions; using Strata.SqlTools.SqlBreakdown.Expressions.Functions.Aggregate; using Strata.SqlTools.SqlBreakdown.Expressions.Functions.Conditional; namespace Strata.SqlTools.SqlBreakdown.Tests.ExpressionTests; [TestFixture] public class ConditionalExpressionTests : ExpressionTestsBase { private static IEnumerable ConditionalExpressionTestCases() { var testCases = new[] { new ExpressionTestCase { Name = "CaseExpression_{m}", Arrange = new Dictionary(), Act = (columns, visitor) => { var table = new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES"); var nameCol = new RegisteredTableColumnExpression(1, "DEPARTMENT_NAME", table); var revenueCol = new RegisteredTableColumnExpression(2, "NET_REVENUE", table); var caseExp = new CaseExpression(nameCol == "department 1", revenueCol, 0); return caseExp.Accept(visitor); }, Assertions = result => { var sql = (string)result; Assert.That(sql, Does.Contain("CASE")); Assert.That(sql, Does.Contain("WHEN")); Assert.That(sql, Does.Contain("THEN")); Assert.That(sql, Does.Contain("ELSE")); Assert.That(sql, Does.Contain("END")); return true; } }, new ExpressionTestCase { Name = "CaseExpressionWithSum_{m}", Arrange = new Dictionary(), Act = (columns, visitor) => { var table = new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES"); var nameCol = new RegisteredTableColumnExpression(1, "DEPARTMENT_NAME", table); var revenueCol = new RegisteredTableColumnExpression(2, "NET_REVENUE", table); var caseExp = new CaseExpression(nameCol == "department 1", revenueCol, 0); var sumCaseExp = new SumFunction(caseExp); return sumCaseExp.Accept(visitor); }, Assertions = result => { var sql = (string)result; Assert.That(sql, Does.Contain("SUM")); Assert.That(sql, Does.Contain("CASE")); Assert.That(sql, Does.Contain("WHEN")); Assert.That(sql, Is.EqualTo("SUM(CASE\n WHEN PES.DEPARTMENT_NAME = 'department 1' THEN PES.NET_REVENUE\n ELSE 0\nEND)")); return true; } }, new ExpressionTestCase { Name = "CaseExpressionWithSumInSelectColumn_{m}", Arrange = new Dictionary(), Act = (columns, visitor) => { var table = new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES"); var nameCol = new RegisteredTableColumnExpression(1, "DEPARTMENT_NAME", table); var revenueCol = new RegisteredTableColumnExpression(2, "NET_REVENUE", table); var caseExp = new CaseExpression(nameCol == "department 1", revenueCol, 0); var sumCaseExp = new SumFunction(caseExp); var column = new SelectClauseColumn(sumCaseExp, "mySumCaseCol"); return column.Accept(visitor); }, Assertions = result => { var sql = (string)result; Assert.That(sql, Does.Contain("SUM")); Assert.That(sql, Does.Contain("CASE")); Assert.That(sql, Does.Contain("mySumCaseCol")); Assert.That(sql, Is.EqualTo("SUM(CASE\n WHEN PES.DEPARTMENT_NAME = 'department 1' THEN PES.NET_REVENUE\n ELSE 0\nEND) AS mySumCaseCol")); return true; } }, new ExpressionTestCase { Name = "IfThenElseExpression_{m}", Arrange = new Dictionary(), Act = (columns, visitor) => { var table = new RegisteredTableSource(101, "CLIENT_DSS", "DEPT", "PES"); var nameCol = new RegisteredTableColumnExpression(1, "DEPARTMENT_NAME", table); var revenueCol = new RegisteredTableColumnExpression(2, "NET_REVENUE", table); var costCol = new RegisteredTableColumnExpression(3, "COST", table); var ifElseExp = new IfThenElseExpression(nameCol == "myDeptName", revenueCol, costCol); return ifElseExp.Accept(visitor); }, Assertions = result => { var sql = (string)result; Assert.That(sql, Does.Contain("IFF")); Assert.That(sql, Is.EqualTo("IFF(PES.DEPARTMENT_NAME = 'myDeptName', PES.NET_REVENUE, PES.COST)")); return true; } } }; foreach (var testCase in testCases) { yield return new TestCaseData(testCase).SetName(testCase.Name); } } [TestCaseSource(nameof(ConditionalExpressionTestCases))] public void ConditionalExpression_GeneratesCorrectSql(ExpressionTestCase testCase) => ExecuteExpressionTest(testCase); }