118 lines
5.6 KiB
C#
118 lines
5.6 KiB
C#
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<TestCaseData> ConditionalExpressionTestCases()
|
|
{
|
|
var testCases = new[]
|
|
{
|
|
new ExpressionTestCase
|
|
{
|
|
Name = "CaseExpression_{m}",
|
|
Arrange = new Dictionary<string, Expression>(),
|
|
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<string, Expression>(),
|
|
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<string, Expression>(),
|
|
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<string, Expression>(),
|
|
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);
|
|
}
|