chore(sonar): wrap independent assertions in Assert.Multiple (NUnit2045)

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>
This commit is contained in:
Thom Lamb
2026-05-27 11:59:47 -05:00
co-authored by Claude Opus 4.7
parent 505ada5017
commit 67512d23e1
47 changed files with 2132 additions and 1113 deletions
@@ -12,8 +12,11 @@ public class MarkdownParserTests
{
var result = Markdown.Parse("42");
Assert.That(result, Is.InstanceOf<NumberLiteral>());
Assert.That(((NumberLiteral)result).Value, Is.EqualTo(42m));
Assert.Multiple(() =>
{
Assert.That(result, Is.InstanceOf<NumberLiteral>());
Assert.That(((NumberLiteral)result).Value, Is.EqualTo(42m));
});
}
[Test]
@@ -21,8 +24,11 @@ public class MarkdownParserTests
{
var result = Markdown.Parse("3.14");
Assert.That(result, Is.InstanceOf<NumberLiteral>());
Assert.That(((NumberLiteral)result).Value, Is.EqualTo(3.14m));
Assert.Multiple(() =>
{
Assert.That(result, Is.InstanceOf<NumberLiteral>());
Assert.That(((NumberLiteral)result).Value, Is.EqualTo(3.14m));
});
}
[Test]
@@ -30,8 +36,11 @@ public class MarkdownParserTests
{
var result = Markdown.Parse("\"hello world\"");
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("hello world"));
Assert.Multiple(() =>
{
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("hello world"));
});
}
[Test]
@@ -39,8 +48,11 @@ public class MarkdownParserTests
{
var result = Markdown.Parse("'test string'");
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("test string"));
Assert.Multiple(() =>
{
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("test string"));
});
}
[Test]
@@ -48,8 +60,11 @@ public class MarkdownParserTests
{
var result = Markdown.Parse("true");
Assert.That(result, Is.InstanceOf<Literal>());
Assert.That(((Literal)result).Value, Is.EqualTo(true));
Assert.Multiple(() =>
{
Assert.That(result, Is.InstanceOf<Literal>());
Assert.That(((Literal)result).Value, Is.EqualTo(true));
});
}
[Test]
@@ -57,8 +72,11 @@ public class MarkdownParserTests
{
var result = Markdown.Parse("false");
Assert.That(result, Is.InstanceOf<Literal>());
Assert.That(((Literal)result).Value, Is.EqualTo(false));
Assert.Multiple(() =>
{
Assert.That(result, Is.InstanceOf<Literal>());
Assert.That(((Literal)result).Value, Is.EqualTo(false));
});
}
#endregion
@@ -72,8 +90,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Property>());
var prop = (Property)result;
Assert.That(prop.PropertyName, Is.EqualTo("PropertyName"));
Assert.That(prop.Expression, Is.Null);
Assert.Multiple(() =>
{
Assert.That(prop.PropertyName, Is.EqualTo("PropertyName"));
Assert.That(prop.Expression, Is.Null);
});
}
[Test]
@@ -83,8 +104,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Property>());
var prop = (Property)result;
Assert.That(prop.PropertyName, Is.EqualTo("Age"));
Assert.That(prop.Expression, Is.InstanceOf<Parameter>());
Assert.Multiple(() =>
{
Assert.That(prop.PropertyName, Is.EqualTo("Age"));
Assert.That(prop.Expression, Is.InstanceOf<Parameter>());
});
}
[Test]
@@ -94,8 +118,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Property>());
var prop = (Property)result;
Assert.That(prop.PropertyName, Is.EqualTo("Department"));
Assert.That(prop.Expression, Is.InstanceOf<Parameter>());
Assert.Multiple(() =>
{
Assert.That(prop.PropertyName, Is.EqualTo("Department"));
Assert.That(prop.Expression, Is.InstanceOf<Parameter>());
});
}
[Test]
@@ -103,8 +130,11 @@ public class MarkdownParserTests
{
var result = Markdown.Parse("\\text{some text}");
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("some text"));
Assert.Multiple(() =>
{
Assert.That(result, Is.InstanceOf<StringLiteral>());
Assert.That(((StringLiteral)result).Value, Is.EqualTo("some text"));
});
}
#endregion
@@ -118,8 +148,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Equal>());
var equal = (Equal)result;
Assert.That(equal.Left, Is.InstanceOf<Property>());
Assert.That(equal.Right, Is.InstanceOf<NumberLiteral>());
Assert.Multiple(() =>
{
Assert.That(equal.Left, Is.InstanceOf<Property>());
Assert.That(equal.Right, Is.InstanceOf<NumberLiteral>());
});
}
[Test]
@@ -129,8 +162,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<NotEqual>());
var notEqual = (NotEqual)result;
Assert.That(notEqual.Left, Is.InstanceOf<Property>());
Assert.That(notEqual.Right, Is.InstanceOf<StringLiteral>());
Assert.Multiple(() =>
{
Assert.That(notEqual.Left, Is.InstanceOf<Property>());
Assert.That(notEqual.Right, Is.InstanceOf<StringLiteral>());
});
}
[Test]
@@ -140,8 +176,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<NotEqual>());
var notEqual = (NotEqual)result;
Assert.That(notEqual.Left, Is.InstanceOf<Property>());
Assert.That(notEqual.Right, Is.InstanceOf<NumberLiteral>());
Assert.Multiple(() =>
{
Assert.That(notEqual.Left, Is.InstanceOf<Property>());
Assert.That(notEqual.Right, Is.InstanceOf<NumberLiteral>());
});
}
[Test]
@@ -151,8 +190,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<GreaterThan>());
var greaterThan = (GreaterThan)result;
Assert.That(greaterThan.Left, Is.InstanceOf<Property>());
Assert.That(greaterThan.Right, Is.InstanceOf<NumberLiteral>());
Assert.Multiple(() =>
{
Assert.That(greaterThan.Left, Is.InstanceOf<Property>());
Assert.That(greaterThan.Right, Is.InstanceOf<NumberLiteral>());
});
}
[Test]
@@ -162,8 +204,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<GreaterThan>());
var greaterThan = (GreaterThan)result;
Assert.That(greaterThan.Left, Is.InstanceOf<Property>());
Assert.That(greaterThan.Right, Is.InstanceOf<NumberLiteral>());
Assert.Multiple(() =>
{
Assert.That(greaterThan.Left, Is.InstanceOf<Property>());
Assert.That(greaterThan.Right, Is.InstanceOf<NumberLiteral>());
});
}
#endregion
@@ -177,8 +222,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<And>());
var and = (And)result;
Assert.That(and.Left, Is.InstanceOf<GreaterThan>());
Assert.That(and.Right, Is.InstanceOf<Equal>());
Assert.Multiple(() =>
{
Assert.That(and.Left, Is.InstanceOf<GreaterThan>());
Assert.That(and.Right, Is.InstanceOf<Equal>());
});
}
[Test]
@@ -188,8 +236,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Or>());
var or = (Or)result;
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
Assert.Multiple(() =>
{
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
});
}
[Test]
@@ -199,8 +250,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<And>());
var and = (And)result;
Assert.That(and.Left, Is.InstanceOf<Equal>());
Assert.That(and.Right, Is.InstanceOf<GreaterThan>());
Assert.Multiple(() =>
{
Assert.That(and.Left, Is.InstanceOf<Equal>());
Assert.That(and.Right, Is.InstanceOf<GreaterThan>());
});
}
[Test]
@@ -210,8 +264,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Or>());
var or = (Or)result;
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
Assert.Multiple(() =>
{
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
});
}
[Test]
@@ -241,8 +298,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Or>());
var or = (Or)result;
Assert.That(or.Left, Is.InstanceOf<And>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
Assert.Multiple(() =>
{
Assert.That(or.Left, Is.InstanceOf<And>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
});
}
[Test]
@@ -252,8 +312,11 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<And>());
var and = (And)result;
Assert.That(and.Left, Is.InstanceOf<Equal>());
Assert.That(and.Right, Is.InstanceOf<Equal>());
Assert.Multiple(() =>
{
Assert.That(and.Left, Is.InstanceOf<Equal>());
Assert.That(and.Right, Is.InstanceOf<Equal>());
});
}
[Test]
@@ -263,12 +326,18 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<And>());
var and = (And)result;
Assert.That(and.Left, Is.InstanceOf<GreaterThan>());
Assert.That(and.Right, Is.InstanceOf<Or>());
Assert.Multiple(() =>
{
Assert.That(and.Left, Is.InstanceOf<GreaterThan>());
Assert.That(and.Right, Is.InstanceOf<Or>());
});
var or = (Or)and.Right;
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
Assert.Multiple(() =>
{
Assert.That(or.Left, Is.InstanceOf<Equal>());
Assert.That(or.Right, Is.InstanceOf<Equal>());
});
}
#endregion
@@ -332,8 +401,11 @@ public class MarkdownParserTests
{
var success = Markdown.TryParse("x.Age = 25", out var expression);
Assert.That(success, Is.True);
Assert.That(expression, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(success, Is.True);
Assert.That(expression, Is.Not.Null);
});
Assert.That(expression, Is.InstanceOf<Equal>());
}
@@ -342,8 +414,11 @@ public class MarkdownParserTests
{
var success = Markdown.TryParse("@#$%", out var expression);
Assert.That(success, Is.False);
Assert.That(expression, Is.Null);
Assert.Multiple(() =>
{
Assert.That(success, Is.False);
Assert.That(expression, Is.Null);
});
}
#endregion
@@ -364,10 +439,13 @@ public class MarkdownParserTests
var greaterThan = (GreaterThan)and.Left;
Assert.That(greaterThan.Left, Is.InstanceOf<Property>());
var userAge = (Property)greaterThan.Left;
Assert.That(userAge.PropertyName, Is.EqualTo("Age"));
Assert.Multiple(() =>
{
Assert.That(userAge.PropertyName, Is.EqualTo("Age"));
// Right side: user.Status = "active"
Assert.That(and.Right, Is.InstanceOf<Equal>());
// Right side: user.Status = "active"
Assert.That(and.Right, Is.InstanceOf<Equal>());
});
var equal = (Equal)and.Right;
Assert.That(equal.Left, Is.InstanceOf<Property>());
var userStatus = (Property)equal.Left;
@@ -387,18 +465,27 @@ public class MarkdownParserTests
Assert.That(result, Is.InstanceOf<Or>());
var or = (Or)result;
Assert.That(or.Left, Is.InstanceOf<And>());
Assert.That(or.Right, Is.InstanceOf<And>());
Assert.Multiple(() =>
{
Assert.That(or.Left, Is.InstanceOf<And>());
Assert.That(or.Right, Is.InstanceOf<And>());
});
// Left AND: TotalCharges > 1000 AND Status = 'pending'
var leftAnd = (And)or.Left;
Assert.That(leftAnd.Left, Is.InstanceOf<GreaterThan>());
Assert.That(leftAnd.Right, Is.InstanceOf<Equal>());
Assert.Multiple(() =>
{
Assert.That(leftAnd.Left, Is.InstanceOf<GreaterThan>());
Assert.That(leftAnd.Right, Is.InstanceOf<Equal>());
});
// Right AND: Priority = 'urgent' AND ApprovedBy != ''
var rightAnd = (And)or.Right;
Assert.That(rightAnd.Left, Is.InstanceOf<Equal>());
Assert.That(rightAnd.Right, Is.InstanceOf<NotEqual>());
Assert.Multiple(() =>
{
Assert.That(rightAnd.Left, Is.InstanceOf<Equal>());
Assert.That(rightAnd.Right, Is.InstanceOf<NotEqual>());
});
}
#endregion