<?xml version="1.0" encoding="UTF-8"?>


<dsl-extension kind="buildStep" type="dotnet" generateDslJar="true" applicable="params['command'] == 'vstest'">
    <class name="DotnetVsTestStep">
        <description>
            A [.NET vstest step](https://github.com/JetBrains/teamcity-dotnet-plugin) to run .NET VSTest
        </description>
    </class>
    <function name="dotnetVsTest" yamlName="dotnet-vstest">
        <description>
            Adds a [.NET vstest step](https://github.com/JetBrains/teamcity-dotnet-plugin) to run .NET VSTest
            @see DotnetVsTestStep
        </description>
    </function>
    <init>
        <param name="command" value="vstest"/>
    </init>
    <params>
        <param name="paths" dslName="assemblies">
            <description>Specify paths to test assemblies. Wildcards are supported.</description>
        </param>
        <param name="excludedPaths" dslName="excludedAssemblies">
            <description>Specify paths to excluded test assemblies. Wildcards are supported.</description>
        </param>
        <param name="teamcity.build.workingDir" dslName="workingDir" yamlName="working-directory">
            <description>
                [Build working directory](https://www.jetbrains.com/help/teamcity/?Build+Working+Directory) for
                script,
                specify it if it is different from the [checkout
                directory](https://www.jetbrains.com/help/teamcity/?Build+Checkout+Directory).
            </description>
        </param>
        <param name="vstest.version" dslName="version" type="VSTestVersion">
            <description>
                VSTest version to use
                @see VSTestVersion
            </description>
        </param>
        <param name="test.filter" dslName="filter" type="compound" yamlName="test-filter">
            <description>
                The filter type used while test run
            </description>
            <option name="testName" value="name">
                <param name="test.names" dslName="names">
                    <description>Specify the list of test names to run.</description>
                </param>
            </option>
            <option name="testCaseFilter" value="filter">
                <param name="test.testCaseFilter" dslName="filter">
                    <description>Run tests that match the given expression.</description>
                </param>
            </option>
        </param>
        <param name="framework">
            <description>The target .NET Framework version to be used for test execution.</description>
        </param>
        <param name="test.settingsFile" dslName="settingsFile">
            <description>The path to the run settings configuration file.</description>
        </param>
        <param name="test.retry.maxRetries" dslName="maxRetries">
            <description>Rerun failed tests until they pass or until the maximum number of attempts is reached.</description>
        </param>
        <param name="args">
            <description>Enter additional command line parameters for dotnet vstest.</description>
        </param>
        <param name="verbosity" dslName="logging" type="Verbosity">
            <description>
                Specify logging verbosity
                @see Verbosity
            </description>
        </param>
        <param name="vstest.InIsolation" dslName="runInIsolation" type="boolean" trueValue="true" falseValue="">
            <description>
                Whether TeamCity should run tests in an isolated process
            </description>
        </param>
        <param name="singleSession" dslName="singleSession" type="boolean" trueValue="true" falseValue="">
            <description>
                Whether TeamCity should run tests in a single session
            </description>
        </param>
        <param name="platform" dslName="platform" type="Platform">
            <description>
                Target platform architecture to be used for test execution
                @see Platform
            </description>
        </param>
        <param name="required.sdk" dslName="sdk">
            <description>.NET SDK versions separated by semicolon to be required on agents.</description>
        </param>
    </params>
    <types>
        <enum name="Verbosity">
            <description>
                Logging verbosity
            </description>
            <option name="Quiet" value="Quiet"/>
            <option name="Minimal" value="Minimal"/>
            <option name="Normal" value="Normal"/>
            <option name="Detailed" value="Detailed"/>
            <option name="Diagnostic" value="Diagnostic"/>
        </enum>
        <enum name="VSTestVersion">
            <description>VSTest version</description>
            <option name="CrossPlatform" value="VSTest_CrossPlatform">
                <description>Cross-platform VSTest</description>
            </option>
            <option name="V18" value="VSTest_18_Windows">
                <description>VSTest 2026</description>
            </option>
            <option name="V17" value="VSTest_17_Windows">
                <description>VSTest 2022</description>
            </option>
            <option name="V16" value="VSTest_16_Windows">
                <description>VSTest 2019</description>
            </option>
            <option name="V15" value="VSTest_15_Windows">
                <description>VSTest 2017</description>
            </option>
            <option name="V14" value="VSTest_14_Windows">
                <description>VSTest 2015</description>
            </option>
            <option name="V12" value="VSTest_12_Windows">
                <description>VSTest 2013</description>
            </option>
        </enum>
        <enum name="Platform">
            <description>Platform bitness</description>
            <option name="Auto" value="auto"/>
            <option name="x86" value="x86"/>
            <option name="x64" value="x64"/>
            <option name="ARM" value="ARM"/>
        </enum>
    </types>
    <examples>
        <example>
            <description>
                Runs [`dotnet vstest`](https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-vstest) command to run selected tests by names from the specified assemblies
            </description>
            <code>
                dotnetVsTest {
                    assemblies = "path\to\assemblies\*.dll"
                    excludedAssemblies = "path\to\assemblies\ExcludedTests.dll"
                    version = DotnetVsTestStep.VSTestVersion.V17
                    filter = testName {
                        names = """
                            Test0
                            Test1
                            Test2
                        """.trimIndent()
                    }
                    settingsFile = "MyProjectTestsSettings.runsettings"
                    logging = DotnetVsTestStep.Verbosity.Normal
                    runInIsolation = true
                    platform = DotnetVsTestStep.Platform.x64
                }
            </code>
        </example>
    </examples>
</dsl-extension>