Skip to content
14 changes: 13 additions & 1 deletion src/Cli/dotnet/Commands/CliCommandStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -2605,4 +2605,16 @@ Proceed?</value>
<value>Tool package download needs confirmation. Run in interactive mode or use the "--yes" command-line option to confirm.</value>
<comment>{Locked="--yes"}</comment>
</data>
</root>
<data name="TestCommandUseSolution" xml:space="preserve">
<value>Specifying a solution for 'dotnet test' should be via '--solution'.</value>
</data>
<data name="TestCommandUseProject" xml:space="preserve">
<value>Specifying a project for 'dotnet test' should be via '--project'.</value>
</data>
<data name="TestCommandUseDirectory" xml:space="preserve">
<value>Specifying a directory for 'dotnet test' should be via '--directory'.</value>
</data>
<data name="TestCommandUseTestModules" xml:space="preserve">
<value>Specifying dlls or executables for 'dotnet test' should be via '--test-modules'.</value>
</data>
</root>
6 changes: 4 additions & 2 deletions src/Cli/dotnet/Commands/Test/TestingPlatformCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@
using System.CommandLine;
using Microsoft.DotNet.Cli.Commands.Test.Terminal;
using Microsoft.DotNet.Cli.Extensions;
using Microsoft.DotNet.Cli.Utils;
using Microsoft.TemplateEngine.Cli.Commands;
using Microsoft.TemplateEngine.Cli.Help;

namespace Microsoft.DotNet.Cli.Commands.Test;

internal partial class TestingPlatformCommand : Command, ICustomHelp
internal partial class TestingPlatformCommand : System.CommandLine.Command, ICustomHelp
{
private MSBuildHandler _msBuildHandler;
private TerminalTestReporter _output;
Expand Down Expand Up @@ -45,7 +46,8 @@ public int Run(ParseResult parseResult)
private int RunInternal(ParseResult parseResult)
{
ValidationUtility.ValidateMutuallyExclusiveOptions(parseResult);

ValidationUtility.ValidateSolutionOrProjectOrDirectoryOrModulesArePassedCorrectly(parseResult);

PrepareEnvironment(parseResult, out TestOptions testOptions, out int degreeOfParallelism);

InitializeOutput(degreeOfParallelism, parseResult, testOptions.IsHelp);
Expand Down
42 changes: 42 additions & 0 deletions src/Cli/dotnet/Commands/Test/ValidationUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ static void ValidateOptionsIrrelevantToModulesFilter(ParseResult parseResult)
}
}
}

public static bool ValidateBuildPathOptions(BuildOptions buildPathOptions, TerminalTestReporter output)
{
PathOptions pathOptions = buildPathOptions.PathOptions;
Expand All @@ -76,6 +77,47 @@ public static bool ValidateBuildPathOptions(BuildOptions buildPathOptions, Termi
return true;
}

/// <summary>
/// Validates that arguments requiring specific command-line switches are used correctly for Microsoft.Testing.Platform.
/// Provides helpful error messages when users provide file/directory arguments without proper switches.
/// </summary>
public static void ValidateSolutionOrProjectOrDirectoryOrModulesArePassedCorrectly(ParseResult parseResult)
{
if (Environment.GetEnvironmentVariable("DOTNET_TEST_DISABLE_SWITCH_VALIDATION") is "true" or "1")
{
// In case there is a valid case, users can opt-out.
// Note that the validation here is added to have a "better" error message for scenarios that will already fail.
// So, disabling validation is okay if the user scenario is valid.
return;
}

foreach (string token in parseResult.UnmatchedTokens)
{
// Check for .sln files
if ((token.EndsWith(".sln", StringComparison.OrdinalIgnoreCase) ||
token.EndsWith(".slnx", StringComparison.OrdinalIgnoreCase)) && File.Exists(token))
{
throw new GracefulException(CliCommandStrings.TestCommandUseSolution);
}
else if ((token.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase) ||
token.EndsWith(".vbproj", StringComparison.OrdinalIgnoreCase) ||
token.EndsWith(".fsproj", StringComparison.OrdinalIgnoreCase)) && File.Exists(token))
{
throw new GracefulException(CliCommandStrings.TestCommandUseProject);
}
else if (Directory.Exists(token))
{
throw new GracefulException(CliCommandStrings.TestCommandUseDirectory);
}
else if ((token.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) ||
token.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) &&
File.Exists(token))
{
throw new GracefulException(CliCommandStrings.TestCommandUseTestModules);
}
}
}

private static bool ValidateSolutionFilePath(string filePath, TerminalTestReporter output)
{
if (!CliConstants.SolutionExtensions.Contains(Path.GetExtension(filePath)))
Expand Down
20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.cs.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.de.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.es.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.fr.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.it.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.ja.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.ko.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.pl.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

20 changes: 20 additions & 0 deletions src/Cli/dotnet/Commands/xlf/CliCommandStrings.pt-BR.xlf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading