private void ProcessOption(string option) { string opt = option; int pos = opt.IndexOfAny(new char[] { ':', '=' }); string val = string.Empty; if (pos >= 0) { val = opt.Substring(pos + 1); opt = opt.Substring(0, pos); } opt = opt.StartsWith("--") ? opt.Substring(2) : opt.Substring(1); switch (opt) { case "wait": Wait = true; break; case "noheader": case "noh": NoHeader = true; break; case "help": case "h": ShowHelp = true; break; case "test": Tests.AddRange(TestNameParser.Parse(val)); break; case "full": Full = true; break; case "teamcity": DisplayTeamCityServiceMessages = true; break; case "explore": Explore = true; if (val != null && val.Length > 0) { ExploreOutputSpecifications.Add(new OutputSpecification(val)); } break; case "result": if (val == null || val.Length == 0) { val = "TestResult.xml"; } ResultOutputSpecifications.Add(new OutputSpecification(val)); break; case "work": WorkDirectory = RequiredValue(val, option); break; case "output": case "out": OutFile = RequiredValue(val, option); break; case "err": ErrFile = RequiredValue(val, option); break; case "labels": case "l": DisplayTestLabels = RequiredValue(val, option, "Off", "On", "All"); break; case "include": Include = val; break; case "exclude": Exclude = val; break; case "seed": _randomSeed = RequiredInt(val, option); break; case "timeout": DefaultTimeout = RequiredInt(val, option); break; case "trace": InternalTraceLevel = RequiredValue(val, option, "Off", "Error", "Warning", "Info", "Debug", "Verbose"); break; default: InvalidOption(option); break; } }
protected virtual void ConfigureOptions() { // NOTE: The order in which patterns are added // determines the display order for the help. // Select Tests this.Add("test=", "Comma-separated list of {NAMES} of tests to run or explore. This option may be repeated.", v => ((List <string>)TestList).AddRange(TestNameParser.Parse(RequiredValue(v, "--test")))); #if !PORTABLE this.Add("testlist=", "File {PATH} containing a list of tests to run, one per line. This option may be repeated.", v => { string testListFile = RequiredValue(v, "--testlist"); var fullTestListPath = ExpandToFullPath(testListFile); if (!File.Exists(fullTestListPath)) { ErrorMessages.Add("Unable to locate file: " + testListFile); } else { try { using (var rdr = new StreamReader(fullTestListPath)) { while (!rdr.EndOfStream) { var line = rdr.ReadLine().Trim(); if (line[0] != '#') { ((List <string>)TestList).Add(line); } } } } catch (IOException) { ErrorMessages.Add("Unable to read file: " + testListFile); } } }); #endif this.Add("where=", "Test selection {EXPRESSION} indicating what tests will be run. See description below.", v => WhereClause = RequiredValue(v, "--where")); this.Add("timeout=", "Set timeout for each test case in {MILLISECONDS}.", v => defaultTimeout = RequiredInt(v, "--timeout")); this.Add("seed=", "Set the random {SEED} used to generate test cases.", v => randomSeed = RequiredInt(v, "--seed")); #if !PORTABLE this.Add("workers=", "Specify the {NUMBER} of worker threads to be used in running tests. If not specified, defaults to 2 or the number of processors, whichever is greater.", v => numWorkers = RequiredInt(v, "--workers")); #endif this.Add("stoponerror", "Stop run immediately upon any test failure or error.", v => StopOnError = v != null); this.Add("wait", "Wait for input before closing console window.", v => WaitBeforeExit = v != null); #if !PORTABLE // Output Control this.Add("work=", "{PATH} of the directory to use for output files. If not specified, defaults to the current directory.", v => workDirectory = RequiredValue(v, "--work")); this.Add("output|out=", "File {PATH} to contain text output from the tests.", v => OutFile = RequiredValue(v, "--output")); this.Add("err=", "File {PATH} to contain error output from the tests.", v => ErrFile = RequiredValue(v, "--err")); this.Add("full", "Prints full report of all test results.", v => Full = v != null); this.Add("result=", "An output {SPEC} for saving the test results.\nThis option may be repeated.", v => resultOutputSpecifications.Add(new OutputSpecification(RequiredValue(v, "--resultxml")))); this.Add("explore:", "Display or save test info rather than running tests. Optionally provide an output {SPEC} for saving the test info. This option may be repeated.", v => { Explore = true; if (v != null) { ExploreOutputSpecifications.Add(new OutputSpecification(v)); } }); this.Add("noresult", "Don't save any test results.", v => noresult = v != null); #endif this.Add("labels=", "Specify whether to write test case names to the output. Values: Off, On, All", v => DisplayTestLabels = RequiredValue(v, "--labels", "Off", "On", "All")); #if !PORTABLE this.Add("trace=", "Set internal trace {LEVEL}.\nValues: Off, Error, Warning, Info, Verbose (Debug)", v => InternalTraceLevel = RequiredValue(v, "--trace", "Off", "Error", "Warning", "Info", "Verbose", "Debug")); #if !NETCF this.Add("teamcity", "Turns on use of TeamCity service messages.", v => TeamCity = v != null); #endif this.Add("noheader|noh", "Suppress display of program information at start of run.", v => NoHeader = v != null); this.Add("nocolor|noc", "Displays console output without color.", v => NoColor = v != null); #endif this.Add("verbose|v", "Display additional information as the test runs.", v => Verbose = v != null); this.Add("help|h", "Display this message and exit.", v => ShowHelp = v != null); this.Add("version|V", "Display the header and exit.", v => ShowVersion = v != null); // Default this.Add("<>", v => { #if PORTABLE if (v.StartsWith("-") || v.StartsWith("/") && Environment.NewLine == "\r\n") #else if (v.StartsWith("-") || v.StartsWith("/") && Path.DirectorySeparatorChar != '/') #endif { ErrorMessages.Add("Invalid argument: " + v); } else { InputFiles.Add(v); } }); }
public ConsoleOptions(params string[] args) { // NOTE: The order in which patterns are added // determines the display order for the help. // Old Options no longer supported: // fixture // xmlConsole // noshadow // nothread // nodots // Options to be added: // teamcity // workers // Select Tests this.Add("test=", "Comma-separated list of {NAMES} of tests to run or explore. This option may be repeated.", v => ((List <string>)TestList).AddRange(TestNameParser.Parse(RequiredValue(v, "--test")))); this.Add("include=", "Test {CATEGORIES} to be included. May be a single category, a comma-separated list of categories or a category expression.", v => Include = RequiredValue(v, "--include")); this.Add("exclude=", "Test {CATEGORIES} to be excluded. May be a single category, a comma-separated list of categories or a category expression.", v => Exclude = RequiredValue(v, "--exclude")); this.Add("config=", "{NAME} of a project configuration to load (e.g.: Debug).", v => ActiveConfig = RequiredValue(v, "--config")); // Where to Run Tests this.Add("process=", "{PROCESS} isolation for test assemblies.\nValues: Single, Separate, Multiple", v => ProcessModel = RequiredValue(v, "--process", "Single", "Separate", "Multiple")); this.Add("domain=", "{DOMAIN} isolation for test assemblies.\nValues: None, Single, Multiple", v => DomainUsage = RequiredValue(v, "--domain", "None", "Single", "Multiple")); // How to Run Tests this.Add("framework=", "{FRAMEWORK} type/version to use for tests.\nExamples: mono, net-3.5, v4.0, 2.0, mono-4.0", v => Framework = RequiredValue(v, "--framework")); this.Add("x86", "Run tests in an x86 process on 64 bit systems", v => RunAsX86 = v != null); this.Add("dispose-runners", "Dispose each test runner after it has finished running its tests.", v => DisposeRunners = v != null); this.Add("timeout=", "Set timeout for each test case in {MILLISECONDS}.", v => defaultTimeout = RequiredInt(v, "--timeout")); this.Add("seed=", "Set the random {SEED} used to generate test cases.", v => randomSeed = RequiredInt(v, "--seed")); this.Add("workers=", "Specify the {NUMBER} of worker threads to be used in running tests.", v => numWorkers = RequiredInt(v, "--workers")); this.Add("stoponerror", "Stop run immediately upon any test failure or error.", v => StopOnError = v != null); this.Add("wait", "Wait for input before closing console window.", v => WaitBeforeExit = v != null); this.Add("pause", "Pause before run to allow debugging.", v => PauseBeforeRun = v != null); // Output Control this.Add("work=", "{PATH} of the directory to use for output files.", v => WorkDirectory = RequiredValue(v, "--work")); this.Add("output|out=", "File {PATH} to contain text output from the tests.", v => OutFile = RequiredValue(v, "--output")); this.Add("err=", "File {PATH} to contain error output from the tests.", v => ErrFile = RequiredValue(v, "--err")); this.Add("result=", "An output {SPEC} for saving the test results.\nThis option may be repeated.", v => resultOutputSpecifications.Add(new OutputSpecification(RequiredValue(v, "--resultxml")))); this.Add("explore:", "Display or save test info rather than running tests. Optionally provide an output {SPEC} for saving the test info. This option may be repeated.", v => { Explore = true; if (v != null) { ExploreOutputSpecifications.Add(new OutputSpecification(v)); } }); this.Add("noresult", "Don't save any test results.", v => noresult = v != null); this.Add("labels=", "Specify whether to write test case names to the output. Values: Off, On, All", v => DisplayTestLabels = RequiredValue(v, "--labels", "Off", "On", "All")); this.Add("trace=", "Set internal trace {LEVEL}.\nValues: Off, Error, Warning, Info, Verbose (Debug)", v => InternalTraceLevel = RequiredValue(v, "--trace", "Off", "Error", "Warning", "Info", "Verbose", "Debug")); this.Add("teamcity", "Turns on use of TeamCity service messages.", v => TeamCity = v != null); this.Add("noheader|noh", "Suppress display of program information at start of run.", v => NoHeader = v != null); this.Add("nocolor|noc", "Displays console output without color.", v => NoColor = v != null); this.Add("verbose|v", "Display additional information as the test runs.", v => Verbose = v != null); this.Add("help|h", "Display this message and exit.", v => ShowHelp = v != null); // Default this.Add("<>", v => { if (v.StartsWith("-") || v.StartsWith("/") && Path.DirectorySeparatorChar != '/') { ErrorMessages.Add("Invalid argument: " + v); } else { InputFiles.Add(v); } }); if (args != null) { this.Parse(args); } }
private void ConfigureOptions() { var parser = new OptionParser(s => ErrorMessages.Add(s)); // NOTE: The order in which patterns are added // determines the display order for the help. this.Add("test=", "Comma-separated list of {NAMES} of tests to run or explore. This option may be repeated.", v => ((List <string>)TestList).AddRange(TestNameParser.Parse(parser.RequiredValue(v, "--test")))); this.Add("testlist=", "File {PATH} containing a list of tests to run, one per line. This option may be repeated.", v => { string testListFile = parser.RequiredValue(v, "--testlist"); var fullTestListPath = ExpandToFullPath(testListFile); if (!File.Exists(fullTestListPath)) { ErrorMessages.Add("Unable to locate file: " + testListFile); } else { try { using (var rdr = new StreamReader(fullTestListPath)) { while (!rdr.EndOfStream) { var line = rdr.ReadLine().Trim(); if (!string.IsNullOrEmpty(line) && line[0] != '#') { ((List <string>)TestList).Add(line); } } } } catch (IOException) { ErrorMessages.Add("Unable to read file: " + testListFile); } } }); this.Add("where=", "Test selection {EXPRESSION} indicating what tests will be run. See description below.", v => WhereClause = parser.RequiredValue(v, "--where")); this.Add("params|p=", "Deprecated and will be removed in a future release. Please use --testparam instead.", v => { const string deprecationWarning = "--params is deprecated and will be removed in a future release. Please use --testparam instead."; if (!WarningMessages.Contains(deprecationWarning)) { WarningMessages.Add(deprecationWarning); } string parameters = parser.RequiredValue(v, "--params"); foreach (string param in parameters.Split(new[] { ';' })) { var valuePair = parser.RequiredKeyValue(param); if (valuePair.HasValue) { TestParameters[valuePair.Value.Key] = valuePair.Value.Value; } } }); this.Add("testparam|tp=", "Followed by a key-value pair separated by an equals sign. Test code can access the value by name.", v => { var valuePair = parser.RequiredKeyValue(parser.RequiredValue(v, "--testparam")); if (valuePair.HasValue) { TestParameters[valuePair.Value.Key] = valuePair.Value.Value; } }); this.Add("timeout=", "Set timeout for each test case in {MILLISECONDS}.", v => DefaultTimeout = parser.RequiredInt(v, "--timeout")); this.Add("seed=", "Set the random {SEED} used to generate test cases.", v => RandomSeed = parser.RequiredInt(v, "--seed")); this.Add("workers=", "Specify the {NUMBER} of worker threads to be used in running tests. If not specified, defaults to 2 or the number of processors, whichever is greater.", v => NumberOfTestWorkers = parser.RequiredInt(v, "--workers")); this.Add("stoponerror", "Stop run immediately upon any test failure or error.", v => StopOnError = v != null); this.Add("wait", "Wait for input before closing console window.", v => WaitBeforeExit = v != null); // Output Control this.Add("work=", "{PATH} of the directory to use for output files. If not specified, defaults to the current directory.", v => workDirectory = parser.RequiredValue(v, "--work")); this.Add("output|out=", "File {PATH} to contain text output from the tests.", v => OutFile = parser.RequiredValue(v, "--output")); this.Add("result=", "An output {SPEC} for saving the test results.\nThis option may be repeated.", v => { var spec = parser.ResolveOutputSpecification(parser.RequiredValue(v, "--resultxml"), resultOutputSpecifications, _fileSystem, CURRENT_DIRECTORY_ON_ENTRY); if (spec != null) { resultOutputSpecifications.Add(spec); } }); this.Add("explore:", "Display or save test info rather than running tests. Optionally provide an output {SPEC} for saving the test info. This option may be repeated.", v => { Explore = true; var spec = parser.ResolveOutputSpecification(v, ExploreOutputSpecifications, _fileSystem, CURRENT_DIRECTORY_ON_ENTRY); if (spec != null) { ExploreOutputSpecifications.Add(spec); } }); this.Add("noresult", "Don't save any test results.", v => noresult = v != null); this.Add("labels=", "Specify whether to write test case names to the output. Values: Off, On, Before, After, BeforeAndAfter, All", v => DisplayTestLabels = parser.RequiredValue(v, "--labels", "Off", "On", "Before", "After", "BeforeAndAfter", "All")); this.Add("test-name-format=", "Non-standard naming pattern to use in generating test names.", v => DefaultTestNamePattern = parser.RequiredValue(v, "--test-name-format")); this.Add("trace=", "Set internal trace {LEVEL}.\nValues: Off, Error, Warning, Info, Verbose (Debug)", v => InternalTraceLevel = parser.RequiredValue(v, "--trace", "Off", "Error", "Warning", "Info", "Verbose", "Debug")); this.Add("teamcity", "Turns on use of TeamCity service messages. TeamCity engine extension is required.", v => TeamCity = v != null); this.Add("noheader|noh", "Suppress display of program information at start of run.", v => NoHeader = v != null); this.Add("nocolor|noc", "Displays console output without color.", v => NoColor = v != null); this.Add("help|h", "Display this message and exit.", v => ShowHelp = v != null); this.Add("version|V", "Display the header and exit.", v => ShowVersion = v != null); this.Add("encoding=", "Specifies the encoding to use for Console standard output, for example utf-8, ascii, unicode.", v => ConsoleEncoding = parser.RequiredValue(v, "--encoding")); // Default this.Add("<>", v => { if (v.StartsWith("-") || v.StartsWith("/") && Path.DirectorySeparatorChar != '/') { ErrorMessages.Add("Invalid argument: " + v); } else { InputFiles.Add(v); } }); this.Add("config=", "{NAME} of a project configuration to load (e.g.: Debug).", v => ActiveConfig = parser.RequiredValue(v, "--config")); this.AddNetFxOnlyOption("configfile=", "{NAME} of configuration file to use for this run.", NetFxOnlyOption("configfile=", v => ConfigurationFile = parser.RequiredValue(v, "--configfile"))); // Where to Run Tests this.AddNetFxOnlyOption("process=", "{PROCESS} isolation for test assemblies.\nValues: InProcess, Separate, Multiple. If not specified, defaults to Separate for a single assembly or Multiple for more than one.", NetFxOnlyOption("process=", v => { ProcessModel = parser.RequiredValue(v, "--process", "Single", "InProcess", "Separate", "Multiple"); // Change so it displays correctly even though it isn't absolutely needed if (ProcessModel.ToLower() == "single") { ProcessModel = "InProcess"; } })); this.AddNetFxOnlyOption("inprocess", "Synonym for --process:InProcess", NetFxOnlyOption("inprocess", v => ProcessModel = "InProcess")); this.AddNetFxOnlyOption("domain=", "{DOMAIN} isolation for test assemblies.\nValues: None, Single, Multiple. If not specified, defaults to Single for a single assembly or Multiple for more than one.", NetFxOnlyOption("domain=", v => DomainUsage = parser.RequiredValue(v, "--domain", "None", "Single", "Multiple"))); // How to Run Tests this.AddNetFxOnlyOption("framework=", "{FRAMEWORK} type/version to use for tests.\nExamples: mono, net-3.5, v4.0, 2.0, mono-4.0. If not specified, tests will run under the framework they are compiled with.", NetFxOnlyOption("framework=", v => Framework = parser.RequiredValue(v, "--framework"))); this.AddNetFxOnlyOption("x86", "Run tests in an x86 process on 64 bit systems", NetFxOnlyOption("x86", v => RunAsX86 = v != null)); this.Add("dispose-runners", "Dispose each test runner after it has finished running its tests.", v => DisposeRunners = v != null); this.AddNetFxOnlyOption("shadowcopy", "Shadow copy test files", NetFxOnlyOption("shadowcopy", v => ShadowCopyFiles = v != null)); this.AddNetFxOnlyOption("loaduserprofile", "Load user profile in test runner processes", NetFxOnlyOption("loaduserprofile", v => LoadUserProfile = v != null)); this.Add("skipnontestassemblies", "Skip any non-test assemblies specified, without error.", v => SkipNonTestAssemblies = v != null); this.AddNetFxOnlyOption("agents=", "Specify the maximum {NUMBER} of test assembly agents to run at one time. If not specified, there is no limit.", NetFxOnlyOption("agents=", v => _maxAgents = parser.RequiredInt(v, "--agents"))); this.AddNetFxOnlyOption("debug", "Launch debugger to debug tests.", NetFxOnlyOption("debug", v => DebugTests = v != null)); this.AddNetFxOnlyOption("pause", "Pause before running to allow attaching a debugger.", NetFxOnlyOption("pause", v => PauseBeforeRun = v != null)); this.Add("list-extensions", "List all extension points and the extensions for each.", v => ListExtensions = v != null); this.AddNetFxOnlyOption("set-principal-policy=", "Set PrincipalPolicy for the test domain.", NetFxOnlyOption("set-principal-policy=", v => PrincipalPolicy = parser.RequiredValue(v, "--set-principal-policy", "UnauthenticatedPrincipal", "NoPrincipal", "WindowsPrincipal"))); #if DEBUG this.AddNetFxOnlyOption("debug-agent", "Launch debugger in nunit-agent when it starts.", NetFxOnlyOption("debug-agent", v => DebugAgent = v != null)); #endif }
void ConfigureOptions() { // NOTE: The order in which patterns are added // determines the display order for the help. // Select Tests this.Add("test=", "Comma-separated list of {NAMES} of tests to run or explore. This option may be repeated.", v => ((List <string>)TestList).AddRange(TestNameParser.Parse(RequiredValue(v, "--test")))); this.Add("where=", "Test selection {EXPRESSION} indicating what tests will be run. See description below.", v => WhereClause = RequiredValue(v, "--where")); this.Add("timeout=", "Set timeout for each test case in {MILLISECONDS}.", v => DefaultTimeout = RequiredInt(v, "--timeout")); this.Add("seed=", "Set the random {SEED} used to generate test cases.", v => RandomSeed = RequiredInt(v, "--seed")); #if false this.Add("workers=", "Specify the {NUMBER} of worker threads to be used in running tests. If not specified, defaults to 2 or the number of processors, whichever is greater.", v => numWorkers = RequiredInt(v, "--workers")); #endif this.Add("stoponerror", "Stop run immediately upon any test failure or error.", v => StopOnError = v != null); this.Add("wait", "Wait for input before closing console window.", v => WaitBeforeExit = v != null); // Output Control this.Add("work=", "{PATH} of the directory to use for output files. If not specified, defaults to the current directory.", v => workDirectory = RequiredValue(v, "--work")); this.Add("output|out=", "File {PATH} to contain text output from the tests.", v => OutFile = RequiredValue(v, "--output")); this.Add("err=", "File {PATH} to contain error output from the tests.", v => ErrFile = RequiredValue(v, "--err")); this.Add("full", "Prints full report of all test results.", v => Full = v != null); this.Add("result=", "An output {SPEC} for saving the test results.\nThis option may be repeated.", v => resultOutputSpecifications.Add(new OutputSpecification(RequiredValue(v, "--resultxml")))); this.Add("explore:", "Display or save test info rather than running tests. Optionally provide an output {SPEC} for saving the test info. This option may be repeated.", v => { Explore = true; if (v != null) { ExploreOutputSpecifications.Add(new OutputSpecification(v)); } }); this.Add("noresult", "Don't save any test results.", v => noresult = v != null); this.Add("labels=", "Specify whether to write test case names to the output. Values: Off, On, All", v => DisplayTestLabels = RequiredValue(v, "--labels", "Off", "On", "All")); this.Add("trace=", "Set internal trace {LEVEL}.\nValues: Off, Error, Warning, Info, Verbose (Debug)", v => InternalTraceLevel = RequiredValue(v, "--trace", "Off", "Error", "Warning", "Info", "Verbose", "Debug")); this.Add("noheader|noh", "Suppress display of program information at start of run.", v => NoHeader = v != null); this.Add("nocolor|noc", "Displays console output without color.", v => NoColor = v != null); this.Add("verbose|v", "Display additional information as the test runs.", v => Verbose = v != null); this.Add("help|h", "Display this message and exit.", v => ShowHelp = v != null); this.Add("version|V", "Display the header and exit.", v => ShowVersion = v != null); #if NET451 this.Add("debug", "Attaches the debugger on launch", v => Debug = v != null); #endif // .NET Core runner options this.Add("designtime", "Used to indicate that the runner is being launched by an IDE", v => DesignTime = v != null); this.Add("port=", "Used by IDEs to specify a port number to listen for a connection", v => Port = RequiredInt(v, "--port")); this.Add("wait-command", "Used by IDEs to indicate that the runner should connect to the port and wait for commands, instead of going ahead and executing the tests", v => WaitCommand = v != null); this.Add("list", "Used by IDEs to request a list of tests that can be run", v => List = v != null); this.Add("parentProcessId", "Used by IDEs to indicate the Parent PID", v => ParentProcessId = RequiredInt(v, "--parentProcessId")); // Default this.Add("<>", v => { if (v.StartsWith("-", StringComparison.Ordinal) || v.StartsWith("/", StringComparison.Ordinal) && Path.DirectorySeparatorChar != '/') { ErrorMessages.Add("Invalid argument: " + v); } else { InputFiles.Add(v); } }); }
protected virtual void ConfigureOptions() { // NOTE: The order in which patterns are added // determines the display order for the help. // Select Tests this.Add("test=", "Comma-separated list of {NAMES} of tests to run or explore. This option may be repeated.", v => ((List <string>)TestList).AddRange(TestNameParser.Parse(RequiredValue(v, "--test")))); this.Add("testlist=", "File {PATH} containing a list of tests to run, one per line. This option may be repeated.", v => { string testListFile = RequiredValue(v, "--testlist"); var fullTestListPath = ExpandToFullPath(testListFile); if (!File.Exists(fullTestListPath)) { ErrorMessages.Add("Unable to locate file: " + testListFile); } else { try { using (var rdr = new StreamReader(fullTestListPath)) { while (!rdr.EndOfStream) { var line = rdr.ReadLine().Trim(); if (!string.IsNullOrEmpty(line) && line[0] != '#') { ((List <string>)TestList).Add(line); } } } } catch (IOException) { ErrorMessages.Add("Unable to read file: " + testListFile); } } }); this.Add("where=", "Test selection {EXPRESSION} indicating what tests will be run. See description below.", v => WhereClause = RequiredValue(v, "--where")); this.Add("params|p=", "Define a test parameter.", v => { string parameters = RequiredValue(v, "--params"); // This can be changed without breaking backwards compatibility with frameworks. foreach (string param in parameters.Split(new[] { ';' })) { int eq = param.IndexOf("="); if (eq == -1 || eq == param.Length - 1) { ErrorMessages.Add("Invalid format for test parameter. Use NAME=VALUE."); } else { string name = param.Substring(0, eq); string val = param.Substring(eq + 1); TestParameters[name] = val; } } }); this.Add("timeout=", "Set timeout for each test case in {MILLISECONDS}.", v => defaultTimeout = RequiredInt(v, "--timeout")); this.Add("seed=", "Set the random {SEED} used to generate test cases.", v => randomSeed = RequiredInt(v, "--seed")); this.Add("workers=", "Specify the {NUMBER} of worker threads to be used in running tests. If not specified, defaults to 2 or the number of processors, whichever is greater.", v => numWorkers = RequiredInt(v, "--workers")); this.Add("stoponerror", "Stop run immediately upon any test failure or error.", v => StopOnError = v != null); this.Add("wait", "Wait for input before closing console window.", v => WaitBeforeExit = v != null); // Output Control this.Add("work=", "{PATH} of the directory to use for output files. If not specified, defaults to the current directory.", v => workDirectory = RequiredValue(v, "--work")); this.Add("output|out=", "File {PATH} to contain text output from the tests.", v => OutFile = RequiredValue(v, "--output")); this.Add("err=", "File {PATH} to contain error output from the tests.", v => ErrFile = RequiredValue(v, "--err")); this.Add("result=", "An output {SPEC} for saving the test results.\nThis option may be repeated.", v => resultOutputSpecifications.Add(new OutputSpecification(RequiredValue(v, "--resultxml")))); this.Add("explore:", "Display or save test info rather than running tests. Optionally provide an output {SPEC} for saving the test info. This option may be repeated.", v => { Explore = true; if (v != null) { ExploreOutputSpecifications.Add(new OutputSpecification(v)); } }); this.Add("noresult", "Don't save any test results.", v => noresult = v != null); this.Add("labels=", "Specify whether to write test case names to the output. Values: Off, On, Before, After, All", v => DisplayTestLabels = RequiredValue(v, "--labels", "Off", "On", "Before", "After", "All")); this.Add("test-name-format=", "Non-standard naming pattern to use in generating test names.", v => DefaultTestNamePattern = RequiredValue(v, "--test-name-format")); this.Add("trace=", "Set internal trace {LEVEL}.\nValues: Off, Error, Warning, Info, Verbose (Debug)", v => InternalTraceLevel = RequiredValue(v, "--trace", "Off", "Error", "Warning", "Info", "Verbose", "Debug")); this.Add("teamcity", "Turns on use of TeamCity service messages. TeamCity engine extension is required.", v => TeamCity = v != null); this.Add("noheader|noh", "Suppress display of program information at start of run.", v => NoHeader = v != null); this.Add("nocolor|noc", "Displays console output without color.", v => NoColor = v != null); this.Add("help|h", "Display this message and exit.", v => ShowHelp = v != null); this.Add("version|V", "Display the header and exit.", v => ShowVersion = v != null); this.Add("encoding=", "Specifies the encoding to use for Console standard output, for example utf-8, ascii, unicode.", v => ConsoleEncoding = RequiredValue(v, "--encoding")); // Default this.Add("<>", v => { if (v.StartsWith("-") || v.StartsWith("/") && Path.DirectorySeparatorChar != '/') { ErrorMessages.Add("Invalid argument: " + v); } else { InputFiles.Add(v); } }); }