Skip to content

Commit 8f65fb8

Browse files
CopilotYoussef1313
andauthored
Add better error messages for dotnet test with solution/project/directory/dll arguments in Microsoft.Testing.Platform (MTP) (#50108)
Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: Youssef1313 <[email protected]> Co-authored-by: Youssef1313 <[email protected]>
1 parent 70d234c commit 8f65fb8

17 files changed

+410
-3
lines changed

src/Cli/dotnet/Commands/CliCommandStrings.resx

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2618,4 +2618,16 @@ Proceed?</value>
26182618
<value>Tool package download needs confirmation. Run in interactive mode or use the "--yes" command-line option to confirm.</value>
26192619
<comment>{Locked="--yes"}</comment>
26202620
</data>
2621-
</root>
2621+
<data name="TestCommandUseSolution" xml:space="preserve">
2622+
<value>Specifying a solution for 'dotnet test' should be via '--solution'.</value>
2623+
</data>
2624+
<data name="TestCommandUseProject" xml:space="preserve">
2625+
<value>Specifying a project for 'dotnet test' should be via '--project'.</value>
2626+
</data>
2627+
<data name="TestCommandUseDirectory" xml:space="preserve">
2628+
<value>Specifying a directory for 'dotnet test' should be via '--directory'.</value>
2629+
</data>
2630+
<data name="TestCommandUseTestModules" xml:space="preserve">
2631+
<value>Specifying dlls or executables for 'dotnet test' should be via '--test-modules'.</value>
2632+
</data>
2633+
</root>

src/Cli/dotnet/Commands/Test/TestingPlatformCommand.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,13 @@
66
using System.CommandLine;
77
using Microsoft.DotNet.Cli.Commands.Test.Terminal;
88
using Microsoft.DotNet.Cli.Extensions;
9+
using Microsoft.DotNet.Cli.Utils;
910
using Microsoft.TemplateEngine.Cli.Commands;
1011
using Microsoft.TemplateEngine.Cli.Help;
1112

1213
namespace Microsoft.DotNet.Cli.Commands.Test;
1314

14-
internal partial class TestingPlatformCommand : Command, ICustomHelp
15+
internal partial class TestingPlatformCommand : System.CommandLine.Command, ICustomHelp
1516
{
1617
private MSBuildHandler _msBuildHandler;
1718
private TerminalTestReporter _output;
@@ -45,7 +46,8 @@ public int Run(ParseResult parseResult)
4546
private int RunInternal(ParseResult parseResult)
4647
{
4748
ValidationUtility.ValidateMutuallyExclusiveOptions(parseResult);
48-
49+
ValidationUtility.ValidateSolutionOrProjectOrDirectoryOrModulesArePassedCorrectly(parseResult);
50+
4951
PrepareEnvironment(parseResult, out TestOptions testOptions, out int degreeOfParallelism);
5052

5153
InitializeOutput(degreeOfParallelism, parseResult, testOptions.IsHelp);

src/Cli/dotnet/Commands/Test/ValidationUtility.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ static void ValidateOptionsIrrelevantToModulesFilter(ParseResult parseResult)
5353
}
5454
}
5555
}
56+
5657
public static bool ValidateBuildPathOptions(BuildOptions buildPathOptions, TerminalTestReporter output)
5758
{
5859
PathOptions pathOptions = buildPathOptions.PathOptions;
@@ -76,6 +77,47 @@ public static bool ValidateBuildPathOptions(BuildOptions buildPathOptions, Termi
7677
return true;
7778
}
7879

80+
/// <summary>
81+
/// Validates that arguments requiring specific command-line switches are used correctly for Microsoft.Testing.Platform.
82+
/// Provides helpful error messages when users provide file/directory arguments without proper switches.
83+
/// </summary>
84+
public static void ValidateSolutionOrProjectOrDirectoryOrModulesArePassedCorrectly(ParseResult parseResult)
85+
{
86+
if (Environment.GetEnvironmentVariable("DOTNET_TEST_DISABLE_SWITCH_VALIDATION") is "true" or "1")
87+
{
88+
// In case there is a valid case, users can opt-out.
89+
// Note that the validation here is added to have a "better" error message for scenarios that will already fail.
90+
// So, disabling validation is okay if the user scenario is valid.
91+
return;
92+
}
93+
94+
foreach (string token in parseResult.UnmatchedTokens)
95+
{
96+
// Check for .sln files
97+
if ((token.EndsWith(".sln", StringComparison.OrdinalIgnoreCase) ||
98+
token.EndsWith(".slnx", StringComparison.OrdinalIgnoreCase)) && File.Exists(token))
99+
{
100+
throw new GracefulException(CliCommandStrings.TestCommandUseSolution);
101+
}
102+
else if ((token.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase) ||
103+
token.EndsWith(".vbproj", StringComparison.OrdinalIgnoreCase) ||
104+
token.EndsWith(".fsproj", StringComparison.OrdinalIgnoreCase)) && File.Exists(token))
105+
{
106+
throw new GracefulException(CliCommandStrings.TestCommandUseProject);
107+
}
108+
else if (Directory.Exists(token))
109+
{
110+
throw new GracefulException(CliCommandStrings.TestCommandUseDirectory);
111+
}
112+
else if ((token.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) ||
113+
token.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) &&
114+
File.Exists(token))
115+
{
116+
throw new GracefulException(CliCommandStrings.TestCommandUseTestModules);
117+
}
118+
}
119+
}
120+
79121
private static bool ValidateSolutionFilePath(string filePath, TerminalTestReporter output)
80122
{
81123
if (!CliConstants.SolutionExtensions.Contains(Path.GetExtension(filePath)))

src/Cli/dotnet/Commands/xlf/CliCommandStrings.cs.xlf

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/Commands/xlf/CliCommandStrings.de.xlf

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/Commands/xlf/CliCommandStrings.es.xlf

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/Commands/xlf/CliCommandStrings.fr.xlf

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/Commands/xlf/CliCommandStrings.it.xlf

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/Commands/xlf/CliCommandStrings.ja.xlf

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Cli/dotnet/Commands/xlf/CliCommandStrings.ko.xlf

Lines changed: 20 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)