Skip to content

Commit c676360

Browse files
committed
Add support for configuring maximum print lengths in assertion messages
1 parent c157d6f commit c676360

File tree

3 files changed

+138
-2
lines changed

3 files changed

+138
-2
lines changed

Versions.props

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
<NerdbankGitVersioningVersion>3.7.115</NerdbankGitVersioningVersion>
1111
<NSubstituteVersion>5.3.0</NSubstituteVersion>
1212
<TunnelVisionLabsReferenceAssemblyAnnotatorVersion>1.0.0-alpha.160</TunnelVisionLabsReferenceAssemblyAnnotatorVersion>
13-
<XunitAnalyzersVersion>1.19.0</XunitAnalyzersVersion>
13+
<XunitAnalyzersVersion>1.20.0-pre.4</XunitAnalyzersVersion>
1414
<XunitV2Version>2.9.3</XunitV2Version>
15-
<XunitV3Version>1.0.2-pre.4</XunitV3Version>
15+
<XunitV3Version>1.1.0-pre.3</XunitV3Version>
1616
</PropertyGroup>
1717

1818
</Project>

src/xunit.runner.visualstudio/Utility/RunSettings.cs

+40
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Xunit.Runner.VisualStudio;
99
internal class RunSettings
1010
{
1111
public AppDomainSupport? AppDomain { get; set; }
12+
public int? AssertEquivalentMaxDepth { get; set; }
1213
public string? Culture { get; set; }
1314
public bool DesignMode { get; set; } = false;
1415
public bool? DiagnosticMessages { get; set; }
@@ -25,6 +26,10 @@ internal class RunSettings
2526
public bool? ParallelizeAssembly { get; set; }
2627
public bool? ParallelizeTestCollections { get; set; }
2728
public bool? PreEnumerateTheories { get; set; }
29+
public int? PrintMaxEnumerableLength { get; set; }
30+
public int? PrintMaxObjectDepth { get; set; }
31+
public int? PrintMaxObjectMemberCount { get; set; }
32+
public int? PrintMaxStringLength { get; set; }
2833
public string? ReporterSwitch { get; set; }
2934
public int? Seed { get; set; }
3035
public bool? ShadowCopy { get; set; }
@@ -36,6 +41,8 @@ public void CopyTo(TestAssemblyConfiguration configuration)
3641
{
3742
if (AppDomain.HasValue)
3843
configuration.AppDomain = AppDomain;
44+
if (AssertEquivalentMaxDepth.HasValue)
45+
configuration.AssertEquivalentMaxDepth = AssertEquivalentMaxDepth;
3946
if (Culture is not null)
4047
configuration.Culture = Culture.ToUpperInvariant() switch
4148
{
@@ -69,6 +76,14 @@ public void CopyTo(TestAssemblyConfiguration configuration)
6976
configuration.ParallelizeTestCollections = ParallelizeTestCollections;
7077
if (PreEnumerateTheories.HasValue)
7178
configuration.PreEnumerateTheories = PreEnumerateTheories;
79+
if (PrintMaxEnumerableLength.HasValue)
80+
configuration.PrintMaxEnumerableLength = PrintMaxEnumerableLength;
81+
if (PrintMaxObjectDepth.HasValue)
82+
configuration.PrintMaxObjectDepth = PrintMaxObjectDepth;
83+
if (PrintMaxObjectMemberCount.HasValue)
84+
configuration.PrintMaxObjectMemberCount = PrintMaxObjectMemberCount;
85+
if (PrintMaxStringLength.HasValue)
86+
configuration.PrintMaxStringLength = PrintMaxStringLength;
7287
if (Seed.HasValue)
7388
configuration.Seed = Seed;
7489
if (ShadowCopy.HasValue)
@@ -99,6 +114,10 @@ public static RunSettings Parse(string? settingsXml)
99114
if (Enum.TryParse<AppDomainSupport>(appDomainString, ignoreCase: true, out var appDomain))
100115
result.AppDomain = appDomain;
101116

117+
var assertEquivalentMaxDepthString = xunitElement.Element(Constants.Xunit.AssertEquivalentMaxDepth)?.Value;
118+
if (int.TryParse(assertEquivalentMaxDepthString, out var assertEquivalentMaxDepth) && assertEquivalentMaxDepth >= 1)
119+
result.AssertEquivalentMaxDepth = assertEquivalentMaxDepth;
120+
102121
result.Culture = xunitElement.Element(Constants.Xunit.Culture)?.Value;
103122

104123
var diagnosticMessagesString = xunitElement.Element(Constants.Xunit.DiagnosticMessages)?.Value;
@@ -177,6 +196,22 @@ public static RunSettings Parse(string? settingsXml)
177196
if (bool.TryParse(preEnumerateTheoriesString, out var preEnumerateTheories))
178197
result.PreEnumerateTheories = preEnumerateTheories;
179198

199+
var printMaxEnumerableLengthString = xunitElement.Element(Constants.Xunit.PrintMaxEnumerableLength)?.Value;
200+
if (int.TryParse(printMaxEnumerableLengthString, out var printMaxEnumerableLength) && printMaxEnumerableLength >= 0)
201+
result.PrintMaxEnumerableLength = printMaxEnumerableLength;
202+
203+
var printMaxObjectDepthString = xunitElement.Element(Constants.Xunit.PrintMaxObjectDepth)?.Value;
204+
if (int.TryParse(printMaxObjectDepthString, out var printMaxObjectDepth) && printMaxObjectDepth >= 0)
205+
result.PrintMaxObjectDepth = printMaxObjectDepth;
206+
207+
var printMaxObjectMemberCountString = xunitElement.Element(Constants.Xunit.PrintMaxObjectMemberCount)?.Value;
208+
if (int.TryParse(printMaxObjectMemberCountString, out var printMaxObjectMemberCount) && printMaxObjectMemberCount >= 0)
209+
result.PrintMaxObjectMemberCount = printMaxObjectMemberCount;
210+
211+
var printMaxStringLengthString = xunitElement.Element(Constants.Xunit.PrintMaxStringLength)?.Value;
212+
if (int.TryParse(printMaxStringLengthString, out var printMaxStringLength) && printMaxStringLength >= 0)
213+
result.PrintMaxStringLength = printMaxStringLength;
214+
180215
var reporterSwitchString = xunitElement.Element(Constants.Xunit.ReporterSwitch)?.Value;
181216
if (reporterSwitchString is not null)
182217
result.ReporterSwitch = reporterSwitchString;
@@ -263,6 +298,7 @@ public static class RunConfiguration
263298
public static class Xunit
264299
{
265300
public const string AppDomain = nameof(AppDomain);
301+
public const string AssertEquivalentMaxDepth = nameof(AssertEquivalentMaxDepth);
266302
public const string Culture = nameof(Culture);
267303
public const string DiagnosticMessages = nameof(DiagnosticMessages);
268304
public const string Explicit = nameof(Explicit);
@@ -278,6 +314,10 @@ public static class Xunit
278314
public const string ParallelizeAssembly = nameof(ParallelizeAssembly);
279315
public const string ParallelizeTestCollections = nameof(ParallelizeTestCollections);
280316
public const string PreEnumerateTheories = nameof(PreEnumerateTheories);
317+
public const string PrintMaxEnumerableLength = nameof(PrintMaxEnumerableLength);
318+
public const string PrintMaxObjectDepth = nameof(PrintMaxObjectDepth);
319+
public const string PrintMaxObjectMemberCount = nameof(PrintMaxObjectMemberCount);
320+
public const string PrintMaxStringLength = nameof(PrintMaxStringLength);
281321
public const string Seed = nameof(Seed);
282322
public const string ReporterSwitch = nameof(ReporterSwitch);
283323
public const string ShadowCopy = nameof(ShadowCopy);

test/test.xunit.runner.visualstudio/RunSettingsTests.cs

+96
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
extern alias VSTestAdapter;
22

33
using System;
4+
using System.Collections.Generic;
45
using Xunit;
56
using Xunit.Runner.Common;
67
using Xunit.Sdk;
@@ -11,6 +12,7 @@ public class RunSettingsTests
1112
void AssertDefaultValues(RunSettings runSettings)
1213
{
1314
Assert.Null(runSettings.AppDomain);
15+
Assert.Null(runSettings.AssertEquivalentMaxDepth);
1416
Assert.False(runSettings.DesignMode);
1517
Assert.Null(runSettings.DiagnosticMessages);
1618
Assert.Null(runSettings.FailSkips);
@@ -24,6 +26,10 @@ void AssertDefaultValues(RunSettings runSettings)
2426
Assert.Null(runSettings.ParallelizeAssembly);
2527
Assert.Null(runSettings.ParallelizeTestCollections);
2628
Assert.Null(runSettings.PreEnumerateTheories);
29+
Assert.Null(runSettings.PrintMaxEnumerableLength);
30+
Assert.Null(runSettings.PrintMaxObjectDepth);
31+
Assert.Null(runSettings.PrintMaxObjectMemberCount);
32+
Assert.Null(runSettings.PrintMaxStringLength);
2733
Assert.Null(runSettings.ReporterSwitch);
2834
Assert.Null(runSettings.ShadowCopy);
2935
Assert.Null(runSettings.ShowLiveOutput);
@@ -169,6 +175,26 @@ public void AppDomain(string value, AppDomainSupport? expected)
169175
Assert.Equal(expected, runSettings.AppDomain);
170176
}
171177

178+
[Theory]
179+
[InlineData("blarch", null)]
180+
[InlineData("0", null)]
181+
[InlineData("1", 1)]
182+
[InlineData("42", 42)]
183+
public void AssertEquivalentMaxDepth(string value, int? expected)
184+
{
185+
string settingsXml =
186+
$@"<?xml version=""1.0"" encoding=""utf-8""?>
187+
<RunSettings>
188+
<xUnit>
189+
<AssertEquivalentMaxDepth>{value}</AssertEquivalentMaxDepth>
190+
</xUnit>
191+
</RunSettings>";
192+
193+
var runSettings = RunSettings.Parse(settingsXml);
194+
195+
Assert.Equal(expected, runSettings.AssertEquivalentMaxDepth);
196+
}
197+
172198
[Theory]
173199
[InlineData(0, null)]
174200
[InlineData(1, 1)]
@@ -260,6 +286,76 @@ public void MethodDisplayOptions(string value, TestMethodDisplayOptions? expecte
260286
Assert.Equal(expected, runSettings.MethodDisplayOptions);
261287
}
262288

289+
public static IEnumerable<TheoryDataRow<string, int?>> ZeroOrMore = [("blarch", null), ("-1", null), ("0", 0), ("42", 42)];
290+
291+
[Theory]
292+
[MemberData(nameof(ZeroOrMore))]
293+
public void PrintMaxEnumerableLength(string value, int? expected)
294+
{
295+
string settingsXml =
296+
$@"<?xml version=""1.0"" encoding=""utf-8""?>
297+
<RunSettings>
298+
<xUnit>
299+
<PrintMaxEnumerableLength>{value}</PrintMaxEnumerableLength>
300+
</xUnit>
301+
</RunSettings>";
302+
303+
var runSettings = RunSettings.Parse(settingsXml);
304+
305+
Assert.Equal(expected, runSettings.PrintMaxEnumerableLength);
306+
}
307+
308+
[Theory]
309+
[MemberData(nameof(ZeroOrMore))]
310+
public void PrintMaxObjectDepth(string value, int? expected)
311+
{
312+
string settingsXml =
313+
$@"<?xml version=""1.0"" encoding=""utf-8""?>
314+
<RunSettings>
315+
<xUnit>
316+
<PrintMaxObjectDepth>{value}</PrintMaxObjectDepth>
317+
</xUnit>
318+
</RunSettings>";
319+
320+
var runSettings = RunSettings.Parse(settingsXml);
321+
322+
Assert.Equal(expected, runSettings.PrintMaxObjectDepth);
323+
}
324+
325+
[Theory]
326+
[MemberData(nameof(ZeroOrMore))]
327+
public void PrintMaxObjectMemberCount(string value, int? expected)
328+
{
329+
string settingsXml =
330+
$@"<?xml version=""1.0"" encoding=""utf-8""?>
331+
<RunSettings>
332+
<xUnit>
333+
<PrintMaxObjectMemberCount>{value}</PrintMaxObjectMemberCount>
334+
</xUnit>
335+
</RunSettings>";
336+
337+
var runSettings = RunSettings.Parse(settingsXml);
338+
339+
Assert.Equal(expected, runSettings.PrintMaxObjectMemberCount);
340+
}
341+
342+
[Theory]
343+
[MemberData(nameof(ZeroOrMore))]
344+
public void PrintMaxStringLength(string value, int? expected)
345+
{
346+
string settingsXml =
347+
$@"<?xml version=""1.0"" encoding=""utf-8""?>
348+
<RunSettings>
349+
<xUnit>
350+
<PrintMaxStringLength>{value}</PrintMaxStringLength>
351+
</xUnit>
352+
</RunSettings>";
353+
354+
var runSettings = RunSettings.Parse(settingsXml);
355+
356+
Assert.Equal(expected, runSettings.PrintMaxStringLength);
357+
}
358+
263359
[Theory]
264360
[InlineData(false)]
265361
[InlineData(true)]

0 commit comments

Comments
 (0)