|
1 | 1 | using System;
|
| 2 | +using System.Globalization; |
2 | 3 | using System.Text.RegularExpressions;
|
3 | 4 |
|
4 | 5 | namespace Xunit.Runner.VisualStudio;
|
@@ -94,8 +95,28 @@ public static RunSettings Parse(string? settingsXml)
|
94 | 95 | result.LongRunningTestSeconds = longRunningTestSeconds;
|
95 | 96 |
|
96 | 97 | var maxParallelThreadsString = xunitElement.Element(Constants.Xunit.MaxParallelThreads)?.Value;
|
97 |
| - if (int.TryParse(maxParallelThreadsString, out var maxParallelThreads) && maxParallelThreads >= -1) |
98 |
| - result.MaxParallelThreads = maxParallelThreads; |
| 98 | + if (maxParallelThreadsString is not null) |
| 99 | + switch (maxParallelThreadsString) |
| 100 | + { |
| 101 | + case "default": |
| 102 | + result.MaxParallelThreads = 0; |
| 103 | + break; |
| 104 | + |
| 105 | + case "unlimited": |
| 106 | + result.MaxParallelThreads = -1; |
| 107 | + break; |
| 108 | + |
| 109 | + default: |
| 110 | + var match = ConfigUtility.MultiplierStyleMaxParallelThreadsRegex.Match(maxParallelThreadsString); |
| 111 | + // Use invariant format and convert ',' to '.' so we can always support both formats, regardless of locale |
| 112 | + // If we stick to locale-only parsing, we could break people when moving from one locale to another (for example, |
| 113 | + // from people running tests on their desktop in a comma locale vs. running them in CI with a decimal locale). |
| 114 | + if (match.Success && decimal.TryParse(match.Groups[1].Value.Replace(',', '.'), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var maxThreadMultiplier)) |
| 115 | + result.MaxParallelThreads = (int)(maxThreadMultiplier * Environment.ProcessorCount); |
| 116 | + else if (int.TryParse(maxParallelThreadsString, out var threadValue) && threadValue >= -1) |
| 117 | + result.MaxParallelThreads = threadValue; |
| 118 | + break; |
| 119 | + } |
99 | 120 |
|
100 | 121 | var methodDisplayString = xunitElement.Element(Constants.Xunit.MethodDisplay)?.Value;
|
101 | 122 | if (Enum.TryParse<TestMethodDisplay>(methodDisplayString, ignoreCase: true, out var methodDisplay))
|
|
0 commit comments