Driven by `dotnet format analyzers --diagnostics NUnit2045`. The fixer
groups consecutive independent `Assert.That(...)` calls into
`Assert.Multiple(() => { ... })`, so a failing assertion no longer
short-circuits the block — every failure inside the group is reported,
which gives much better diagnostics on multi-property tests.
Audit confirmed no Assert.Throws / Assert.Fail / Assert.Catch / Assert.Pass
/ Assert.DoesNotThrow got pulled inside a Multiple block (those need to
short-circuit). All 1180 tests pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
313 lines
9.9 KiB
C#
313 lines
9.9 KiB
C#
using Strata.SqlTools.Breakdowns.SqlServer;
|
|
|
|
namespace Strata.SqlTools.SqlBreakdown.Tests.SqlServer;
|
|
|
|
[TestFixture]
|
|
public class CommentTests
|
|
{
|
|
[Test]
|
|
public void Parse_WithSingleLineCommentInSelect_PreservesComment()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
ID,
|
|
Name, -- This is a customer name
|
|
Email
|
|
FROM Users";
|
|
|
|
// Act
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
// Assert
|
|
Assert.That(query.SelectClause.Clause, Does.Contain("ID"));
|
|
Assert.That(query.SelectClause.Clause, Does.Contain("Name"));
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(query.SelectClause.Clause, Does.Contain("Email"));
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("-- This is a customer name"));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_WithMultiLineCommentInSelect_PreservesComment()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
ID,
|
|
/* Multi-line comment
|
|
explaining the query */
|
|
Name,
|
|
Email
|
|
FROM Users";
|
|
|
|
// Act
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
// Assert
|
|
Assert.That(query.SelectClause.Clause, Does.Contain("ID"));
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(query.SelectClause.Clause, Does.Contain("Name"));
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("/* Multi-line comment"));
|
|
});
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("explaining the query */"));
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_WithCommentsInMultipleClauses_PreservesAllComments()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
-- Select specific columns
|
|
ID, Name, Email
|
|
FROM Users -- Main user table
|
|
WHERE
|
|
/* Active users only */
|
|
Status = 'Active'
|
|
ORDER BY
|
|
Name -- Sort by name";
|
|
|
|
// Act
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("-- Select specific columns"));
|
|
Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table"));
|
|
Assert.That(query.WhereClause.Comment, Does.Contain("/* Active users only */"));
|
|
Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort by name"));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void GetSql_WithComments_ReturnsCommentsInOutput()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
-- Important columns
|
|
ID, Name
|
|
FROM Users -- User table
|
|
WHERE Status = 'Active'";
|
|
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
// Act
|
|
var result = query.GetSql();
|
|
|
|
// Assert
|
|
Assert.That(result, Does.Contain("-- Important columns"));
|
|
Assert.That(result, Does.Contain("-- User table"));
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_WithNoComments_HasNullCommentProperties()
|
|
{
|
|
// Arrange
|
|
var sql = "SELECT ID, Name FROM Users WHERE Status = 'Active'";
|
|
|
|
// Act
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(query.SelectClause.Comment, Is.Null.Or.Empty);
|
|
Assert.That(query.FromClause.Comment, Is.Null.Or.Empty);
|
|
Assert.That(query.WhereClause.Comment, Is.Null.Or.Empty);
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void Clone_WithComments_PreservesComments()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
-- Select columns
|
|
ID, Name
|
|
FROM Users
|
|
WHERE Status = 'Active'";
|
|
|
|
var original = QueryBreakdown.Parse(sql);
|
|
|
|
// Act
|
|
var cloned = (QueryBreakdown)original.Clone();
|
|
|
|
Assert.Multiple(() =>
|
|
{
|
|
// Assert
|
|
Assert.That(cloned.SelectClause.Comment, Is.EqualTo(original.SelectClause.Comment));
|
|
Assert.That(cloned.FromClause.Comment, Is.EqualTo(original.FromClause.Comment));
|
|
Assert.That(cloned.WhereClause.Comment, Is.EqualTo(original.WhereClause.Comment));
|
|
});
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_WithCommentInGroupBy_PreservesComment()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
Department, COUNT(*) AS EmployeeCount
|
|
FROM Employees
|
|
GROUP BY
|
|
-- Group by department
|
|
Department";
|
|
|
|
// Act
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
// Assert
|
|
Assert.That(query.GroupByClause.Comment, Does.Contain("-- Group by department"));
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_WithCommentInHaving_PreservesComment()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
Department, COUNT(*) AS EmployeeCount
|
|
FROM Employees
|
|
GROUP BY Department
|
|
HAVING
|
|
/* Only departments with more than 10 employees */
|
|
COUNT(*) > 10";
|
|
|
|
// Act
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
// Assert
|
|
Assert.That(query.HavingClause.Comment, Does.Contain("/* Only departments with more than 10 employees */"));
|
|
}
|
|
|
|
[Test]
|
|
public void GetSql_RoundTrip_WithComments_PreservesComments()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
-- Customer details
|
|
ID, Name, Email
|
|
FROM Users
|
|
WHERE Status = 'Active'";
|
|
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
// Act
|
|
var generatedSql = query.GetSql();
|
|
var reparsed = QueryBreakdown.Parse(generatedSql);
|
|
|
|
// Assert
|
|
Assert.That(reparsed.SelectClause.Comment, Does.Contain("-- Customer details"));
|
|
}
|
|
|
|
[Test]
|
|
public void Parse_WithMultipleCommentsInSameClause_PreservesAllComments()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
-- First comment
|
|
ID,
|
|
Name, -- Second comment
|
|
/* Third comment */
|
|
Email
|
|
FROM Users";
|
|
|
|
// Act
|
|
var query = QueryBreakdown.Parse(sql);
|
|
|
|
// Assert
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("-- First comment"));
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("-- Second comment"));
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("/* Third comment */"));
|
|
}
|
|
|
|
[Test]
|
|
public void ExtractSqlComments_WithMultipleCommentTypes_ExtractsAll()
|
|
{
|
|
// Arrange
|
|
var sql = @"SELECT
|
|
ID, -- Single line
|
|
/* Multi
|
|
line */ Name
|
|
FROM Users";
|
|
|
|
// Act
|
|
var parser = new Strata.SqlTools.Statements.SqlServer.StatementParser();
|
|
var cleanSql = parser.ExtractSqlComments(sql, out var comments);
|
|
|
|
// Assert
|
|
Assert.That(comments, Has.Count.EqualTo(2));
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(comments[0], Does.Contain("-- Single line"));
|
|
Assert.That(comments[1], Does.Contain("/* Multi"));
|
|
});
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(comments[1], Does.Contain("line */"));
|
|
Assert.That(cleanSql, Does.Not.Contain("-- Single line"));
|
|
});
|
|
Assert.That(cleanSql, Does.Not.Contain("/*"));
|
|
}
|
|
|
|
[Test]
|
|
public void Demo_CompleteRoundTrip_WithComments()
|
|
{
|
|
// Arrange - SQL with various comment styles
|
|
var originalSql = @"
|
|
SELECT
|
|
-- Primary key
|
|
ID,
|
|
Name, -- Customer name field
|
|
/* Email address for notifications */
|
|
Email,
|
|
Status
|
|
FROM
|
|
Users -- Main user table
|
|
WHERE
|
|
/* Filter for active users only */
|
|
Status = 'Active'
|
|
ORDER BY
|
|
Name -- Sort alphabetically
|
|
";
|
|
|
|
// Act - Parse SQL
|
|
var query = QueryBreakdown.Parse(originalSql);
|
|
|
|
// Assert - Comments are preserved in separate properties
|
|
Assert.That(query.SelectClause.Clause, Does.Contain("ID"));
|
|
Assert.That(query.SelectClause.Clause, Does.Contain("Name"));
|
|
Assert.That(query.SelectClause.Clause, Does.Contain("Email"));
|
|
Assert.That(query.SelectClause.Clause, Does.Not.Contain("--"));
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(query.SelectClause.Clause, Does.Not.Contain("/*"));
|
|
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("-- Primary key"));
|
|
});
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("-- Customer name field"));
|
|
Assert.Multiple(() =>
|
|
{
|
|
Assert.That(query.SelectClause.Comment, Does.Contain("/* Email address for notifications */"));
|
|
|
|
Assert.That(query.FromClause.Comment, Does.Contain("-- Main user table"));
|
|
Assert.That(query.WhereClause.Comment, Does.Contain("/* Filter for active users only */"));
|
|
Assert.That(query.OrderByClause.Comment, Does.Contain("-- Sort alphabetically"));
|
|
});
|
|
|
|
// Act - Generate SQL
|
|
var regeneratedSql = query.GetSql();
|
|
|
|
// Assert - Comments are included in output
|
|
Assert.That(regeneratedSql, Does.Contain("-- Primary key"));
|
|
Assert.That(regeneratedSql, Does.Contain("-- Customer name field"));
|
|
Assert.That(regeneratedSql, Does.Contain("/* Email address for notifications */"));
|
|
Assert.That(regeneratedSql, Does.Contain("-- Main user table"));
|
|
Assert.That(regeneratedSql, Does.Contain("/* Filter for active users only */"));
|
|
Assert.That(regeneratedSql, Does.Contain("-- Sort alphabetically"));
|
|
|
|
// Display the generated SQL
|
|
TestContext.WriteLine("Regenerated SQL:");
|
|
TestContext.WriteLine(regeneratedSql);
|
|
}
|
|
}
|