diff --git a/src/MSBuild.UnitTests/NodeStatus_Tests.cs b/src/MSBuild.UnitTests/NodeStatus_SizeChange_Tests.cs similarity index 94% rename from src/MSBuild.UnitTests/NodeStatus_Tests.cs rename to src/MSBuild.UnitTests/NodeStatus_SizeChange_Tests.cs index 42e821c4ae6..ba6e2f50ecd 100644 --- a/src/MSBuild.UnitTests/NodeStatus_Tests.cs +++ b/src/MSBuild.UnitTests/NodeStatus_SizeChange_Tests.cs @@ -19,11 +19,11 @@ namespace Microsoft.Build.CommandLine.UnitTests; [UsesVerify] -public class NodeStatus_Tests +public class NodeStatus_SizeChange_Tests { private readonly NodeStatus _status = new("Namespace.Project", "TargetFramework", "Target", new MockStopwatch()); - public NodeStatus_Tests() + public NodeStatus_SizeChange_Tests() { UseProjectRelativeDirectory("Snapshots"); } diff --git a/src/MSBuild.UnitTests/NodeStatus_Transition_Tests.cs b/src/MSBuild.UnitTests/NodeStatus_Transition_Tests.cs new file mode 100644 index 00000000000..1d1dacae7f0 --- /dev/null +++ b/src/MSBuild.UnitTests/NodeStatus_Transition_Tests.cs @@ -0,0 +1,181 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +using Microsoft.Build.Logging.TerminalLogger; +using Shouldly; +using VerifyTests; +using VerifyXunit; +using Xunit; + +using static VerifyXunit.Verifier; + + +namespace Microsoft.Build.CommandLine.UnitTests; + +[UsesVerify] +public class NodeStatus_Transition_Tests +{ + public NodeStatus_Transition_Tests() + { + UseProjectRelativeDirectory("Snapshots"); + } + + [Fact] + public void NodeStatusTargetThrowsForInputWithAnsi() + { +#if DEBUG + // This is testing a Debug.Assert, which won't throw in Release mode. + Func newNodeStatus = () => new NodeStatus("project", "tfm", AnsiCodes.Colorize("colorized target", TerminalColor.Green), new MockStopwatch()); + newNodeStatus.ShouldThrow().Message.ShouldContain("Target should not contain any escape codes, if you want to colorize target use the other constructor."); +#endif + } + + [Fact] + public async Task NodeTargetChanges() + { + var rendered = Animate( + [ + new("Namespace.Project", "TargetFramework", "Build", new MockStopwatch()) + ], + [ + new("Namespace.Project", "TargetFramework", "Testing", new MockStopwatch()) + ]); + + await VerifyReplay(rendered); + } + + [Fact] + public async Task NodeTargetUpdatesTime() + { + // This test look like there is no change between the frames, but we ask the stopwatch for time they will increase the number. + // We need this because animations check that NodeStatus reference is the same. + // And we cannot use MockStopwatch because we don't know when to call Tick on them, and if we do it right away, the time will update in "both" nodes. + NodeStatus node = new("Namespace.Project", "TargetFramework", "Build", new TickingStopwatch()); + var rendered = Animate( + [ + node, + ], + [ + node, + ]); + + await VerifyReplay(rendered); + } + + [Fact] + public async Task NodeTargetChangesToColoredTarget() + { + var rendered = Animate( + [ + new("Namespace.Project", "TargetFramework", "Testing", new MockStopwatch()) + ], + [ + new("Namespace.Project", "TargetFramework", TerminalColor.Red, "failed", "MyTestName1", new MockStopwatch()) + ]); + + await VerifyReplay(rendered); + } + + [Fact] + public async Task NodeWithColoredTargetUpdatesTime() + { + // This test look like there is no change between the frames, but we ask the stopwatch for time they will increase the number. + // We need this because animations check that NodeStatus reference is the same. + // And we cannot use MockStopwatch because we don't know when to call Tick on them, and if we do it right away, the time will update in "both" nodes. + NodeStatus node = new("Namespace.Project", "TargetFramework", TerminalColor.Green, "passed", "MyTestName1", new TickingStopwatch()); + var rendered = Animate( + [ + node, + ], + [ + node + ]); + + await VerifyReplay(rendered); + } + + /// + /// Chains and renders node status updates and outputs replay able string of all the transitions. + /// + /// Takes array of arrays. The inner array is collection of nodes that are currently running. The outer array is how they update over time. + /// + private string Animate(params NodeStatus[][] nodeStatusesUpdates) + { + var width = 80; + var height = 1; + + NodesFrame previousFrame = new(Array.Empty(), 0, 0); + StringBuilder result = new StringBuilder(); + foreach (var nodeStatuses in nodeStatusesUpdates) + { + NodesFrame currentFrame = new NodesFrame(nodeStatuses, width, height); + result.Append(currentFrame.Render(previousFrame)); + previousFrame = currentFrame; + } + + return result.ToString(); + } + + private async Task VerifyReplay(string rendered) + { + try + { + await Verify(rendered); + } + catch (Exception ex) + { + if (ex.GetType().Name != "VerifyException") + { + throw; + } + + if (!ex.Message.StartsWith("Directory:")) + { + throw; + } + + string? directory = null; + string? received = null; + string? verified = null; + foreach (var line in ex.Message.Split('\n')) + { + var trimmed = line.TrimStart(' ', '-'); + Extract(trimmed, "Directory", ref directory); + Extract(trimmed, "Received", ref received); + Extract(trimmed, "Verified", ref verified); + } + + if (directory == null || received == null || verified == null) + { + throw; + } + + var pipeline = $$""" | % { "`n`n" } { $_ -split "(?=`e)" | % { Write-Host -NoNewline $_; Start-Sleep 0.5 }; Write-Host }"""; + throw new Exception($$""" + {{ex.Message.TrimEnd('\n')}} + + Received replay: + Get-Content {{Path.Combine(directory, received)}} {{pipeline}} + + Verified replay: + Get-Content {{Path.Combine(directory, verified)}} {{pipeline}} + """); + } + + void Extract(string line, string prefix, ref string? output) + { + if (line.StartsWith($"{prefix}: ")) + { + output = line.Substring(prefix.Length + 2); + } + } + } +} diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.EverythingFits.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_SizeChange_Tests.EverythingFits.verified.txt similarity index 100% rename from src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.EverythingFits.verified.txt rename to src/MSBuild.UnitTests/Snapshots/NodeStatus_SizeChange_Tests.EverythingFits.verified.txt diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.GoesToProject.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_SizeChange_Tests.GoesToProject.verified.txt similarity index 100% rename from src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.GoesToProject.verified.txt rename to src/MSBuild.UnitTests/Snapshots/NodeStatus_SizeChange_Tests.GoesToProject.verified.txt diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.NamespaceIsTruncatedNext.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_SizeChange_Tests.NamespaceIsTruncatedNext.verified.txt similarity index 100% rename from src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.NamespaceIsTruncatedNext.verified.txt rename to src/MSBuild.UnitTests/Snapshots/NodeStatus_SizeChange_Tests.NamespaceIsTruncatedNext.verified.txt diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.TargetIsTruncatedFirst.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_SizeChange_Tests.TargetIsTruncatedFirst.verified.txt similarity index 100% rename from src/MSBuild.UnitTests/Snapshots/NodeStatus_Tests.TargetIsTruncatedFirst.verified.txt rename to src/MSBuild.UnitTests/Snapshots/NodeStatus_SizeChange_Tests.TargetIsTruncatedFirst.verified.txt diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetChanges.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetChanges.verified.txt new file mode 100644 index 00000000000..c76bd410799 --- /dev/null +++ b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetChanges.verified.txt @@ -0,0 +1,4 @@ + + Namespace.Project TargetFramework Build (0.0s) + + Namespace.Project TargetFramework Testing (0.0s) diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetChangesToColoredTarget.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetChangesToColoredTarget.verified.txt new file mode 100644 index 00000000000..3be7cd9e970 --- /dev/null +++ b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetChangesToColoredTarget.verified.txt @@ -0,0 +1,4 @@ + + Namespace.Project TargetFramework Testing (0.0s) + + Namespace.Project TargetFramework failed MyTestName1 (0.0s) diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetUpdatesTime.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetUpdatesTime.verified.txt new file mode 100644 index 00000000000..5f7a118d89e --- /dev/null +++ b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeTargetUpdatesTime.verified.txt @@ -0,0 +1,4 @@ + + Namespace.Project TargetFramework Build (0.0s) + +(0.2s) diff --git a/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeWithColoredTargetUpdatesTime.verified.txt b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeWithColoredTargetUpdatesTime.verified.txt new file mode 100644 index 00000000000..70de0fffa5d --- /dev/null +++ b/src/MSBuild.UnitTests/Snapshots/NodeStatus_Transition_Tests.NodeWithColoredTargetUpdatesTime.verified.txt @@ -0,0 +1,4 @@ + + Namespace.Project TargetFramework passed MyTestName1 (0.0s) + +(0.2s) diff --git a/src/MSBuild.UnitTests/StaticStopwatch.cs b/src/MSBuild.UnitTests/StaticStopwatch.cs new file mode 100644 index 00000000000..c1afad3179c --- /dev/null +++ b/src/MSBuild.UnitTests/StaticStopwatch.cs @@ -0,0 +1,23 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Net.Http.Headers; +using Microsoft.Build.Logging.TerminalLogger; + +namespace Microsoft.Build.CommandLine.UnitTests; + +/// +/// Stopwatch that always show the time provided in constructor. +/// +internal sealed class StaticStopwatch : StopwatchAbstraction +{ + public StaticStopwatch(double elapsedSeconds) + { + ElapsedSeconds = elapsedSeconds; + } + + public override double ElapsedSeconds { get; } + + public override void Start() => throw new System.NotImplementedException(); + public override void Stop() => throw new System.NotImplementedException(); +} diff --git a/src/MSBuild.UnitTests/TickingStopwatch.cs b/src/MSBuild.UnitTests/TickingStopwatch.cs new file mode 100644 index 00000000000..e0cd213ebeb --- /dev/null +++ b/src/MSBuild.UnitTests/TickingStopwatch.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using Microsoft.Build.Logging.TerminalLogger; + +namespace Microsoft.Build.CommandLine.UnitTests; + +/// +/// Stopwatch that will increase by 0.1, every time you ask them for time. Useful for animations, because they check that NodeStatus +/// reference stays the same, and also for ensuring we are grabbing the time only once per frame. +/// +internal sealed class TickingStopwatch : StopwatchAbstraction +{ + private double _elapsedSeconds; + + public TickingStopwatch(double elapsedSeconds = 0.0) + { + _elapsedSeconds = elapsedSeconds; + } + + public override double ElapsedSeconds + { + get + { + var elapsed = _elapsedSeconds; + _elapsedSeconds += 0.1; + return elapsed; + } + } + public override void Start() => throw new System.NotImplementedException(); + public override void Stop() => throw new System.NotImplementedException(); +} diff --git a/src/MSBuild/Resources/Strings.resx b/src/MSBuild/Resources/Strings.resx index a8f93e5f609..f9ee2c769cb 100644 --- a/src/MSBuild/Resources/Strings.resx +++ b/src/MSBuild/Resources/Strings.resx @@ -1,6 +1,66 @@  + + @@ -9,9 +69,16 @@ - + + + + + + + + @@ -20,11 +87,10 @@ - - - - - + + + + @@ -38,13 +104,6 @@ - - - - - - - text/microsoft-resx @@ -53,19 +112,19 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + MSBUILD : error MSB1011: Specify which project or solution file to use because this folder contains more than one project or solution file. {StrBegin="MSBUILD : error MSB1011: "}UE: If no project or solution file is explicitly specified on the MSBuild.exe command-line, then the engine searches for a project or solution file in the current directory by looking for *.*PROJ and *.SLN. If more than one file is found that matches this wildcard, we fire this error. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1050: Specify which project or solution file to use because the folder "{0}" contains more than one project or solution file. {StrBegin="MSBUILD : error MSB1050: "}UE: If no project or solution file is explicitly specified on the MSBuild.exe command-line, then the engine searches for a @@ -74,36 +133,35 @@ LOCALIZATION: The prefix "MSB1050 : error MSBxxxx:" should not be localized. - - + MSBUILD : Configuration error {0}: {1} {SubString="Configuration"}UE: This prefixes any error from reading the toolset definitions in msbuild.exe.config or the registry. There's no error code because one was included in the error message. LOCALIZATION: The word "Configuration" should be localized, the words "MSBuild" and "error" should NOT be localized. - + MSBUILD : error MSB1027: The -noAutoResponse switch cannot be specified in the MSBuild.rsp auto-response file, nor in any response file that is referenced by the auto-response file. {StrBegin="MSBUILD : error MSB1027: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-noAutoResponse" and "MSBuild.rsp" should not be localized. - + MSBuild version {0} for {1} LOCALIZATION: {0} contains the DLL version number. {1} contains the name of a runtime, like ".NET Framework", ".NET Core", or "Mono" - + MSBUILD : error MSB1008: Only one project can be specified. {StrBegin="MSBUILD : error MSB1008: "}UE: This happens if the user does something like "msbuild.exe myapp.proj myapp2.proj". This is not allowed. MSBuild.exe will only build a single project. The help topic may link to an article about how to author an MSBuild project that itself launches MSBuild on a number of other projects. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1025: An internal failure occurred while running MSBuild. {StrBegin="MSBUILD : error MSB1025: "}UE: This message is shown when the application has to terminate either because of a bug in the code, or because some FX/CLR method threw an unexpected exception. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" and "MSBuild" should not be localized. - + Syntax: MSBuild.exe [options] [project file | directory] @@ -115,7 +173,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + Description: Builds the specified targets in the project file. If a project file is not specified, MSBuild searches the current working directory for a file that has a file @@ -132,7 +190,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + Switches: Note that you can specify switches using "-switch", "/switch" and "--switch". @@ -145,7 +203,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -help Display this usage message. (Short form: -? or -h) @@ -157,7 +215,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -noLogo Do not display the startup banner and copyright message. @@ -169,7 +227,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -version Display version information only. (Short form: -ver) @@ -181,7 +239,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + @<file> Insert command-line settings from a text file. To specify multiple response files, specify each response file separately. @@ -200,7 +258,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -noAutoResponse Do not auto-include any MSBuild.rsp files. (Short form: -noAutoRsp) @@ -213,7 +271,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -target:<targets> Build these targets in this project. Use a semicolon or a comma to separate multiple targets, or specify each target separately. (Short form: -t) @@ -229,7 +287,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -property:<n>=<v> Set or override these project-level properties. <n> is the property name, and <v> is the property value. Use a semicolon or a comma to separate multiple properties, or @@ -246,7 +304,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -logger:<logger> Use this logger to log events from MSBuild. To specify multiple loggers, specify each logger separately. The <logger> syntax is: @@ -271,7 +329,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -verbosity:<level> Display this amount of information in the event log. The available verbosity levels are: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]. (Short form: -v) @@ -291,7 +349,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -consoleLoggerParameters:<parameters> Parameters to console logger. (Short form: -clp) The available parameters are: @@ -338,7 +396,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -noConsoleLogger Disable the default console logger and do not log events to the console. (Short form: -noConLog) @@ -351,7 +409,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -validate Validate the project against the default schema. (Short form: -val) @@ -369,19 +427,19 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - - -maxCpuCount[:n] Specifies the maximum number of concurrent processes to + + -maxCpuCount[:n] Specifies the maximum number of concurrent processes to build with. If the switch is not used, the default value used is 1. If the switch is used without a value MSBuild will use up to the number of processors on the computer. (Short form: -m[:n]) - + LOCALIZATION: "maxCpuCount" should not be localized. LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + Examples: MSBuild MyApp.sln -t:Rebuild -p:Configuration=Release @@ -397,14 +455,12 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + For switch syntax, type "MSBuild -help" UE: this message is shown when the user makes a syntax error on the command-line for a switch. LOCALIZATION: "MSBuild -help" should not be localized. - - - + -distributedLogger:<central logger>*<forwarding logger> Use this logger to log events from MSBuild, attaching a different logger instance to each node. To specify @@ -432,7 +488,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg chars. - + -ignoreProjectExtensions:<extensions> List of extensions to ignore when determining which project file to build. Use a semicolon or a comma @@ -450,9 +506,8 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - - - -toolsVersion:<version> + + -toolsVersion:<version> The version of the MSBuild Toolset (tasks, targets, etc.) to use during build. This version will override the versions specified by individual projects. (Short form: @@ -469,9 +524,8 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - - - -outputResultsCache:[cacheFile] + + -outputResultsCache:[cacheFile] Output cache file where MSBuild will write the contents of its build result caches at the end of the build. If -isolateProjects is set to False, this sets it to True. @@ -482,9 +536,8 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - - - -inputResultsCaches:<cacheFile>... + + -inputResultsCaches:<cacheFile>... Semicolon separated list of input cache files that MSBuild will read build results from. If -isolateProjects is set to False, this sets it to True. (short form: -irc) @@ -494,8 +547,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - - + -fileLogger[n] Logs the build output to a file. By default the file is in the current directory and named "msbuild[n].log". Events from all nodes are combined into @@ -514,7 +566,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -distributedFileLogger Logs the build output to multiple log files, one log file per MSBuild node. The initial location for these files is @@ -537,7 +589,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -fileLoggerParameters[n]:<parameters> Provides any extra parameters for file loggers. The presence of this switch implies the @@ -576,7 +628,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -nodeReuse:<parameters> Enables or Disables the reuse of MSBuild nodes. The parameters are: @@ -588,7 +640,7 @@ -nr:true - + -preprocess[:file] Creates a single, aggregated project file by inlining all the files that would be imported during a @@ -603,7 +655,7 @@ -pp:out.txt - + -detailedSummary[:True|False] Shows detailed information at the end of the build about the configurations built and how they were @@ -615,7 +667,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -warnAsError[:code[;code2]] List of warning codes to treats as errors. Use a semicolon or a comma to separate multiple warning codes. To treat all @@ -634,7 +686,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -warnAsMessage[:code[;code2]] List of warning codes to treats as low importance messages. Use a semicolon or a comma to separate @@ -649,7 +701,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -binaryLogger[:[LogFile=]output.binlog[;ProjectImports={None,Embed,ZipFile}]] Serializes all build events to a compressed binary file. By default the file is in the current directory and named @@ -701,7 +753,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -restore[:True|False] Runs a target named Restore prior to building other targets and ensures the build for these @@ -726,7 +778,7 @@ format. Otherwise, a tab separated file is produced. - + -restoreProperty:<n>=<v> Set or override these project-level properties only during restore and do not use properties specified @@ -743,7 +795,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -interactive[:True|False] Indicates that actions in the build are allowed to interact with the user. Do not use this argument @@ -758,7 +810,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -isolateProjects[:True|MessageUponIsolationViolation|False] Causes MSBuild to build each project in isolation. @@ -784,7 +836,7 @@ LOCALIZATION: "-isolateProjects" should not be localized. LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -graphBuild[:True|False] Causes MSBuild to construct and build a project graph. @@ -803,10 +855,10 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + For more detailed information, see https://aka.ms/msbuild/docs - + -targets[:file] Prints a list of available targets without executing the actual build process. By default the output is written to @@ -822,7 +874,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -lowPriority[:True|False] Causes MSBuild to run at low process priority. @@ -836,7 +888,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -warnNotAsError[:code[;code2]] List of warning codes to treats not treat as errors. Use a semicolon or a comma to separate @@ -851,7 +903,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -question (Experimental) Question whether there is any build work. MSBuild will error out when it detects a target or task @@ -865,7 +917,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + -reportFileAccesses[:True|False] Causes MSBuild to report file accesses to any configured project cache plugins. @@ -877,7 +929,7 @@ LOCALIZATION: None of the lines should be longer than a standard width console window, eg 80 chars. - + MSBUILD : Configuration error MSB1043: The application could not start. {0} {StrBegin="MSBUILD : Configuration error MSB1043: "} @@ -885,7 +937,7 @@ LOCALIZATION: The prefix "MSBUILD : Configuration error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1019: Logger switch was not correctly formed. {StrBegin="MSBUILD : error MSB1019: "}UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. This error is shown when a user does any of the following: @@ -896,7 +948,7 @@ parameters are optional). LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1030: Maximum CPU count is not valid. {0} {StrBegin="MSBUILD : error MSB1030: "} @@ -905,15 +957,15 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1032: Maximum CPU count is not valid. Value must be an integer greater than zero and no more than 1024. {StrBegin="MSBUILD : error MSB1032: "} UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. This error is shown when a user specifies a CPU value that is zero or less. For example, -m:0 instead of -m:2. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - - + + MSBUILD : error MSB1033: Node number is not valid. {0}. {StrBegin="MSBUILD : error MSB1033: "} @@ -922,7 +974,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1034: Node number is not valid. Value must be an integer greater than zero. {StrBegin="MSBUILD : error MSB1034: "} UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. @@ -930,7 +982,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1006: Property is not valid. {StrBegin="MSBUILD : error MSB1006: "}UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. @@ -941,12 +993,12 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : MSB1046: The schema "{0}" is not valid. {1} {StrBegin="MSBUILD : MSB1046: "}UE: This message is shown when the schema file provided for the validation of a project is itself not valid. LOCALIZATION: "{0}" is the schema file path. "{1}" is a message from an FX exception that describes why the schema file is bad. - + Switch: {0} UE: This is attached to error messages caused by an invalid switch. This message indicates what the invalid arg was. @@ -956,7 +1008,7 @@ LOCALIZATION: {0} contains the invalid switch text. - + MSBUILD : error MSB1040: ToolsVersion is not valid. {0} {StrBegin="MSBUILD : error MSB1040: "} @@ -965,7 +1017,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1018: Verbosity level is not valid. {StrBegin="MSBUILD : error MSB1018: "}UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. @@ -974,31 +1026,31 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1028: The logger failed unexpectedly. {StrBegin="MSBUILD : error MSB1028: "} UE: This error is shown when a logger specified with the -logger switch throws an exception while being initialized. This message is followed by the exception text including the stack trace. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - - MSBUILD : Logger error {0}: {1} - UE: This prefixes the error message emitted by a logger, when a logger fails in a controlled way using a LoggerException. + + MSBUILD : Logger error {0}: {1} + UE: This prefixes the error message emitted by a logger, when a logger fails in a controlled way using a LoggerException. For example, the logger is indicating that it could not create its output file. There's no error code because one was supplied by the logger. LOCALIZATION: The word "Logger" should be localized, the words "MSBuild" and "error" should NOT be localized. - - MSBUILD : Logger error MSB1029: {0} - {SubString="Logger", "{0}"}{StrBegin="MSBUILD : "} + + MSBUILD : Logger error MSB1029: {0} + {SubString="Logger", "{0}"}{StrBegin="MSBUILD : "} UE: This prefixes the error message emitted by a logger, when a logger fails in a controlled way using a LoggerException. For example, the logger is indicating that it could not create its output file. This is like LoggerFailurePrefixNoErrorCode, but the logger didn't supply its own error code, so we have to provide one. LOCALIZATION: The word "Logger" should be localized, the words "MSBuild" and "error" should NOT be localized. - + MSBUILD : error MSB1007: Specify a logger. {StrBegin="MSBUILD : error MSB1007: "}UE: This happens if the user does something like "msbuild.exe -logger". The user must pass in an actual logger class @@ -1006,14 +1058,14 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1031: Specify the maximum number of CPUs. {StrBegin="MSBUILD : error MSB1031: "}UE: This happens if the user does something like "msbuild.exe -m". The user must pass in an actual number like -m:4. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1003: Specify a project or solution file. The current working directory does not contain a project or solution file. {StrBegin="MSBUILD : error MSB1003: "}UE: The user must either specify a project or solution file to build, or there must be a project file in the current directory @@ -1021,7 +1073,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1005: Specify a property and its value. {StrBegin="MSBUILD : error MSB1005: "}UE: This happens if the user does something like "msbuild.exe -property". The user must pass in an actual property @@ -1029,7 +1081,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1012: Specify a response file. {StrBegin="MSBUILD : error MSB1012: "}UE: This error would occur if the user did something like "msbuild.exe @ foo.proj". The at-sign must be followed by a @@ -1037,7 +1089,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1004: Specify the name of the target. {StrBegin="MSBUILD : error MSB1004: "}UE: This happens if the user does something like "msbuild.exe -target". The user must pass in an actual target name @@ -1045,7 +1097,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1010: Must provide a property name for the getProperty switch. {StrBegin="MSBUILD : error MSB1010: "}UE: This happens if the user does something like "msbuild.exe -getProperty". The user must pass in an actual property name @@ -1069,7 +1121,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1017: Must provide a target name for the getTargetResult switch. {StrBegin="MSBUILD : error MSB1017: "}UE: This happens if the user does something like "msbuild.exe -getTargetResult". The user must pass in an actual target name @@ -1077,14 +1129,14 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1063: Cannot access properties or items when building solution files or solution filter files. This feature is only available when building individual projects. {StrBegin="MSBUILD : error MSB1063: "}UE: This happens if the user passes in a solution file when trying to access individual properties or items. The user must pass in a project file. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1039: Specify the version of the toolset. {StrBegin="MSBUILD : error MSB1039: "} @@ -1093,7 +1145,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1016: Specify the verbosity level. {StrBegin="MSBUILD : error MSB1016: "}UE: This happens if the user does something like "msbuild.exe -verbosity". The user must pass in a verbosity level @@ -1101,14 +1153,14 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1024: Only one schema can be specified for validation of the project. {StrBegin="MSBUILD : error MSB1024: "}UE: The user did something like msbuild -validate:foo.xsd -validate:bar.xsd. We only allow one schema to be specified. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + Some command line switches were read from the auto-response file "{0}". To disable this file, use the "-noAutoResponse" switch. UE: This message appears in high verbosity modes when we used some @@ -1116,25 +1168,25 @@ where the switches are coming from. - + MSBUILD : error MSB1009: Project file does not exist. {StrBegin="MSBUILD : error MSB1009: "}UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + Building the projects in this solution one at a time. To enable parallel build, please add the "-m" switch. - + MSBUILD : MSB1045: Stopping because of syntax errors in project file. {StrBegin="MSBUILD : MSB1045: "} - + MSBUILD : error MSB1023: Cannot read the response file. {0} {StrBegin="MSBUILD : error MSB1023: "}UE: This error is shown when the response file cannot be read off disk. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. {0} contains a localized message explaining why the response file could not be read -- this message comes from the CLR/FX. - + MSBUILD : error MSB1013: The response file was specified twice. A response file can be specified only once. Any files named "msbuild.rsp" in the directory of MSBuild.exe or in the directory of the first project or solution built (which if no project or solution is specified is the current working directory) were automatically used as response files. {StrBegin="MSBUILD : error MSB1013: "}UE: Response files are just text files that contain a bunch of command-line switches to be passed to MSBuild.exe. The purpose is so you don't have to type the same switches over and over again ... you can just pass in the response file instead. @@ -1143,54 +1195,54 @@ exact @ switch that resulted in the duplicate response file. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1022: Response file does not exist. {StrBegin="MSBUILD : error MSB1022: "}UE: This message would show if the user did something like "msbuild @bogus.rsp" where bogus.rsp doesn't exist. This message does not need in-line parameters because the exception takes care of displaying the invalid arg. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + Validating project using schema file "{0}". LOCALIZATION: "{0}" is the location of the schema file. - + MSBUILD : MSB1044: Project is not valid. {0} {StrBegin="MSBUILD : MSB1044: "}UE: This error is shown when the user asks his project to be validated against a schema (-val switch for MSBuild.exe), and the project has errors. "{0}" contains a message explaining the problem. LOCALIZATION: "{0}" is a message from the System.XML schema validator and is already localized. - + MSBUILD : error MSB1026: Schema file does not exist. {StrBegin="MSBUILD : error MSB1026: "}UE: This error is shown when the user specifies a schema file using the -validate:<schema> switch, and the file does not exist on disk. This message does not need in-line parameters because the exception takes care of displaying the invalid arg. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1026: Schema file '{0}' does not exist. {StrBegin="MSBUILD : error MSB1026: "}UE: This error is printed if the default schema does not exist or in the extremely unlikely event that an explicit schema file was passed and existed when the command line parameters were checked but was deleted from disk before this check was made. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1002: This switch does not take any parameters. {StrBegin="MSBUILD : error MSB1002: "}UE: For example, if somebody types "msbuild.exe -noLogo:1", they would get this error because the -noLogo switch should not be followed by any parameters ... it stands alone. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1001: Unknown switch. {StrBegin="MSBUILD : error MSB1001: "}UE: This occurs when the user passes in an unrecognized switch on the MSBuild.exe command-line. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1015: MSBuild does not run on this version of the operating system. It is only supported on Windows 7 and later versions. {StrBegin="MSBUILD : error MSB1015: "}LOCALIZATION: The error prefix "MSBUILD : error MSBxxxx:" should not be localized. - + Forcing load of Microsoft.Build.Engine because MSBUILDOLDOM=1... - + MSBUILD : error MSB1035: Specify the project extensions to ignore. {StrBegin="MSBUILD : error MSB1035: "} UE: This happens if the user does something like "msbuild.exe -ignoreProjectExtensions". The user must pass in one or more @@ -1198,11 +1250,11 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1036: There is an invalid extension in the -ignoreProjectExtensions list. Extensions must start with a period ".", have one or more characters after the period and not contain any invalid path characters or wildcards. {StrBegin="MSBUILD : error MSB1036: "}LOCALIZATION: The error prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1037: Specify one or more parameters for the console logger if using the -consoleLoggerParameters switch {StrBegin="MSBUILD : error MSB1037: "} UE: This happens if the user does something like "msbuild.exe -consoleLoggerParameters:". The user must pass in one or more parameters @@ -1210,7 +1262,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1038: Specify one or more parameters for the file logger if using the -fileLoggerParameters switch {StrBegin="MSBUILD : error MSB1038: "} UE: This happens if the user does something like "msbuild.exe -fileLoggerParameters:". The user must pass in one or more parameters @@ -1218,7 +1270,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1066: Specify one or more parameters for the terminal logger if using the -terminalLoggerParameters switch {StrBegin="MSBUILD : error MSB1066: "} @@ -1227,14 +1279,14 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1041: Specify one or more parameters for node reuse if using the -nodeReuse switch {StrBegin="MSBUILD : error MSB1041: "} UE: This happens if the user does something like "msbuild.exe -nodeReuse:" without a true or false LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1042: Node reuse value is not valid. {0}. {StrBegin="MSBUILD : error MSB1042: "} UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. @@ -1242,7 +1294,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1042: Node reuse value is not valid. This version of MSBuild does not support node reuse. If specified, the node reuse switch value must be false. {StrBegin="MSBUILD : error MSB1042: "} UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. @@ -1250,7 +1302,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1052: Restore value is not valid. {0} {StrBegin="MSBUILD : error MSB1052: "} UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. @@ -1258,7 +1310,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1055: Interactive value is not valid. {0} {StrBegin="MSBUILD : error MSB1055: "} @@ -1267,7 +1319,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1056: Isolate projects value is not valid. {0} {StrBegin="MSBUILD : error MSB1056: "} @@ -1277,7 +1329,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1057: Graph build value is not valid. {StrBegin="MSBUILD : error MSB1057: "} @@ -1286,7 +1338,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1061: Detailed summary value is not valid. {0} {StrBegin="MSBUILD : error MSB1061: "} @@ -1295,7 +1347,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1064: Low priority value is not valid. {0} {StrBegin="MSBUILD : error MSB1064: "} @@ -1304,7 +1356,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1065: Terminal logger value is not valid. It should be one of 'auto', 'true', or 'false'. {0} {StrBegin="MSBUILD : error MSB1065: "} @@ -1313,26 +1365,25 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + Attempting to cancel the build... - + MSBUILD : error MSB1047: File to preprocess to is not valid. {0} {StrBegin="MSBUILD : error MSB1047: "} - + MSBUILD : error MSB1059: Targets could not be printed. {0} {StrBegin="MSBUILD : error MSB1059: "} - - + MSBUILD : error MSB1021: Cannot create an instance of the logger. {0} {StrBegin="MSBUILD : error MSB1021: "} UE: This error is shown when a logger cannot be loaded and instantiated from its assembly. LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. {0} contains a message explaining why the logger could not be created -- this message comes from the CLR/FX and is localized. - + MSBUILD : error MSB1020: The logger was not found. Check the following: 1.) The logger name specified is the same as the name of the logger class. 2.) The logger class is "public" and implements the Microsoft.Build.Framework.ILogger interface. 3.) The path to the logger assembly is correct, or the logger can be loaded using only the assembly name provided. {StrBegin="MSBUILD : error MSB1020: "}UE: This message does not need in-line parameters because the exception takes care of displaying the invalid arg. @@ -1341,22 +1392,22 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB4192: The project file "{0}" is in the ".vcproj" or ".dsp" file format, which MSBuild cannot build directly. Please convert the project by opening it in the Visual Studio IDE or running the conversion tool, or, for ".vcproj", use MSBuild to build the solution file containing the project instead. {StrBegin="MSBUILD : error MSB4192: "} LOC: ".vcproj" and ".dsp" should not be localized - + If MSBuild debugging does not work correctly, please verify that the "Just My Code" feature is enabled in Visual Studio, and that you have selected the managed debugger. - + MSBUILD : error MSB1048: Solution files cannot be debugged directly. Run MSBuild first with an environment variable MSBUILDEMITSOLUTION=1 to create a corresponding ".sln.metaproj" file. Then debug that. {StrBegin="MSBUILD : error MSB1048: "} LOC: ".SLN" should not be localized - + MSBUILD : error MSB1049: The {0} parameter must be specified {StrBegin="MSBUILD : error MSB1049: "} - + MSBUILD : error MSB1063: Report file accesses value is not valid. {0} {StrBegin="MSBUILD : error MSB1063: "} @@ -1365,21 +1416,14 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - - - - - - - - + Build started. - + {0} ({1},{2}) A file location to be embedded in a string. - + MSBUILD : error MSB1051: Specify one or more warning codes to treat as low importance messages when using the -warnAsMessage switch. {StrBegin="MSBUILD : error MSB1051: "} @@ -1387,7 +1431,7 @@ LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:" should not be localized. - + MSBUILD : error MSB1060: Specify one or more warning codes when using the -warnNotAsError switch. {StrBegin="MSBUILD : error MSB1060: "} @@ -1401,11 +1445,11 @@ MSBUILD :error MSB1054: A filename must be specified to generate the profiler result. - + MSBUILD : error MSB1058: Only one output results cache can be specified. {StrBegin="MSBUILD : error MSB1058: "} - + The specified logger "{0}" could not be created and will not be used. {1} UE: This error is shown when a logger cannot be loaded and instantiated from its assembly. @@ -1414,7 +1458,7 @@ logger could not be created -- this message comes from the CLR/FX and is localized. - + MSBUILD : error MSB1060: Undefined environment variable passed in as switch. {StrBegin="MSBUILD : error MSB1060: "} @@ -1422,49 +1466,48 @@ but the environment variable is not defined. - + Process = "{0}" - + MSBuild executable path = "{0}" - + Command line arguments = "{0}" - + Current directory = "{0}" - + MSBuild version = "{0}" - + MSBuild logs and debug information will be at "{0}" - + {0} Full command line: '{1}' Switches appended by response files:{2} - + '{0}' came from '{1}' These are response file switches with the location of the response file on disk. - + MSBUILD : error MSB1062: The -warnnotaserror switch cannot be specified unless the -warnaserror switch is also specified and left empty. {StrBegin="MSBUILD : error MSB1062: "}LOCALIZATION: The prefix "MSBUILD : error MSBxxxx:", "-warnnotaserror" and "-warnaserror" should not be localized. - + The '{0}' switch is not supported for solution files. - + MSBUILD : error MSB5016: The name "{0}" contains an invalid character "{1}". {StrBegin="MSBUILD : error MSB5016: "} - Restore complete ({0}s) @@ -1545,9 +1588,9 @@ {0}: VT100 coded hyperlink to project output directory - - ({0:F1}s) - + + ({0:F1}s) + {0}: duration in seconds with 1 decimal point @@ -1563,6 +1606,32 @@ Terminal Logger was not used because the output is being redirected to a file. + + {0}{1} test {2} ({3}s) + + Project finished summary. + {0}: indentation - few spaces to visually indent row + {1}: project name + {2}: BuildResult_{X} + {3}: duration in seconds with 1 decimal point + + + + {0}{1} test {2} {3} ({4}s) + + Project finished summary including target framework information. + {0}: indentation - few spaces to visually indent row + {1}: project name + {2}: target framework + {3}: BuildResult_{X} + {4}: duration in seconds with 1 decimal point + + + + Test run {0}. Total: {1} Failed: {2} Passed: {3} Skipped: {4}, Duration: {5}s + {0} string, localized result e.g. Failed surrounded by ANSI colors. +{1-5} whole number +