diff --git a/src/Platform/Microsoft.Testing.Platform/Builder/ITestApplicationBuilder.cs b/src/Platform/Microsoft.Testing.Platform/Builder/ITestApplicationBuilder.cs index 7ad9101abb..c10f371795 100644 --- a/src/Platform/Microsoft.Testing.Platform/Builder/ITestApplicationBuilder.cs +++ b/src/Platform/Microsoft.Testing.Platform/Builder/ITestApplicationBuilder.cs @@ -6,6 +6,7 @@ using Microsoft.Testing.Platform.Configurations; using Microsoft.Testing.Platform.Extensions.TestFramework; using Microsoft.Testing.Platform.Logging; +using Microsoft.Testing.Platform.OutputDevice; using Microsoft.Testing.Platform.TestHost; using Microsoft.Testing.Platform.TestHostControllers; using Microsoft.Testing.Platform.TestHostOrchestrator; @@ -50,6 +51,12 @@ public interface ITestApplicationBuilder [Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")] ILoggingManager Logging { get; } + /// + /// Gets the output device manager that allows registering a custom output device. + /// + [Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")] + IOutputDeviceManager OutputDevice { get; } + /// /// Registers a test framework with the application builder. /// diff --git a/src/Platform/Microsoft.Testing.Platform/Builder/TestApplicationBuilder.cs b/src/Platform/Microsoft.Testing.Platform/Builder/TestApplicationBuilder.cs index 318ee9236d..fcd7378bbc 100644 --- a/src/Platform/Microsoft.Testing.Platform/Builder/TestApplicationBuilder.cs +++ b/src/Platform/Microsoft.Testing.Platform/Builder/TestApplicationBuilder.cs @@ -10,6 +10,7 @@ using Microsoft.Testing.Platform.Helpers; using Microsoft.Testing.Platform.Hosts; using Microsoft.Testing.Platform.Logging; +using Microsoft.Testing.Platform.OutputDevice; using Microsoft.Testing.Platform.Resources; using Microsoft.Testing.Platform.Services; using Microsoft.Testing.Platform.Telemetry; @@ -68,6 +69,9 @@ internal TestApplicationBuilder( [Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")] public ILoggingManager Logging => _testHostBuilder.Logging; + [Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")] + public IOutputDeviceManager OutputDevice => _testHostBuilder.OutputDevice; + internal ITelemetryManager Telemetry => _testHostBuilder.Telemetry; internal IToolsManager Tools => _testHostBuilder.Tools; diff --git a/src/Platform/Microsoft.Testing.Platform/Hosts/ITestHostBuilder.cs b/src/Platform/Microsoft.Testing.Platform/Hosts/ITestHostBuilder.cs index b21500548c..fbc9f88d69 100644 --- a/src/Platform/Microsoft.Testing.Platform/Hosts/ITestHostBuilder.cs +++ b/src/Platform/Microsoft.Testing.Platform/Hosts/ITestHostBuilder.cs @@ -7,6 +7,7 @@ using Microsoft.Testing.Platform.Configurations; using Microsoft.Testing.Platform.Helpers; using Microsoft.Testing.Platform.Logging; +using Microsoft.Testing.Platform.OutputDevice; using Microsoft.Testing.Platform.Telemetry; using Microsoft.Testing.Platform.TestHost; using Microsoft.Testing.Platform.TestHostControllers; @@ -31,6 +32,8 @@ internal interface ITestHostBuilder ITestHostOrchestratorManager TestHostOrchestrator { get; } + IOutputDeviceManager OutputDevice { get; } + ITelemetryManager Telemetry { get; } IToolsManager Tools { get; } diff --git a/src/Platform/Microsoft.Testing.Platform/Hosts/TestHostBuilder.cs b/src/Platform/Microsoft.Testing.Platform/Hosts/TestHostBuilder.cs index 3ae70c9be3..7e8804cfde 100644 --- a/src/Platform/Microsoft.Testing.Platform/Hosts/TestHostBuilder.cs +++ b/src/Platform/Microsoft.Testing.Platform/Hosts/TestHostBuilder.cs @@ -47,6 +47,8 @@ internal sealed partial class TestHostBuilder(IFileSystem fileSystem, IRuntimeFe public IToolsManager Tools { get; } = new ToolsManager(); + public IOutputDeviceManager OutputDevice => _outputDisplay; + private readonly TestHostOrchestratorManager _testHostOrchestratorManager = new Extensions.TestHostOrchestrator.TestHostOrchestratorManager(); public ITestHostOrchestratorManager TestHostOrchestrator => _testHostOrchestratorManager; diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/CustomOutputDeviceAdapter.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/CustomOutputDeviceAdapter.cs new file mode 100644 index 0000000000..5fca54be92 --- /dev/null +++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/CustomOutputDeviceAdapter.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Microsoft.Testing.Platform.Extensions.OutputDevice; + +namespace Microsoft.Testing.Platform.OutputDevice; + +internal sealed class CustomOutputDeviceAdapter : IPlatformOutputDevice +{ + private readonly ICustomOutputDevice _customOutputDevice; + + public CustomOutputDeviceAdapter(ICustomOutputDevice customOutputDevice) + => _customOutputDevice = customOutputDevice ?? throw new ArgumentNullException(nameof(customOutputDevice)); + + public string Uid => _customOutputDevice.Uid; + + public string Version => _customOutputDevice.Version; + + public string DisplayName => _customOutputDevice.DisplayName; + + public string Description => _customOutputDevice.Description; + + public Task IsEnabledAsync() => _customOutputDevice.IsEnabledAsync(); + + public Task DisplayBannerAsync(string? bannerMessage, CancellationToken cancellationToken) + => _customOutputDevice.DisplayBannerAsync(bannerMessage, cancellationToken); + + public Task DisplayBeforeSessionStartAsync(CancellationToken cancellationToken) + => _customOutputDevice.DisplayBeforeSessionStartAsync(cancellationToken); + + public Task DisplayAfterSessionEndRunAsync(CancellationToken cancellationToken) + => _customOutputDevice.DisplayAfterSessionEndRunAsync(cancellationToken); + + public Task DisplayAsync(IOutputDeviceDataProducer producer, IOutputDeviceData data, CancellationToken cancellationToken) + => _customOutputDevice.DisplayAsync(producer, data, cancellationToken); + + public Task HandleProcessRoleAsync(TestProcessRole processRole, CancellationToken cancellationToken) + => Task.CompletedTask; +} diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/ICustomOutputDevice.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/ICustomOutputDevice.cs new file mode 100644 index 0000000000..274b2a24b2 --- /dev/null +++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/ICustomOutputDevice.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Microsoft.Testing.Platform.Extensions; +using Microsoft.Testing.Platform.Extensions.OutputDevice; + +namespace Microsoft.Testing.Platform.OutputDevice; + +/// +/// Represents a custom output device that can be registered via +/// +/// to replace the default terminal output of Microsoft.Testing.Platform. +/// +/// +/// When server mode (JSON-RPC) is active, the platform still routes server output through its +/// built-in server output device in parallel with the custom output device. +/// +[Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")] +public interface ICustomOutputDevice : IExtension +{ + /// + /// Displays the platform banner. + /// + /// An optional banner message. If , the implementation may render its own banner. + /// The cancellation token. + /// A task representing the asynchronous operation. + Task DisplayBannerAsync(string? bannerMessage, CancellationToken cancellationToken); + + /// + /// Called before the test session starts. + /// + /// The cancellation token. + /// A task representing the asynchronous operation. + Task DisplayBeforeSessionStartAsync(CancellationToken cancellationToken); + + /// + /// Called after the test session ends. + /// + /// The cancellation token. + /// A task representing the asynchronous operation. + Task DisplayAfterSessionEndRunAsync(CancellationToken cancellationToken); + + /// + /// Displays the output data asynchronously. + /// + /// The data producer. + /// The output data. + /// The cancellation token. + /// A task representing the asynchronous operation. + Task DisplayAsync(IOutputDeviceDataProducer producer, IOutputDeviceData data, CancellationToken cancellationToken); +} diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/IOutputDeviceManager.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/IOutputDeviceManager.cs new file mode 100644 index 0000000000..94bfffba26 --- /dev/null +++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/IOutputDeviceManager.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Microsoft.Testing.Platform.OutputDevice; + +/// +/// Manages the registration of a custom output device for Microsoft.Testing.Platform. +/// +/// +/// Only one custom output device can be registered. Calling +/// +/// more than once throws . +/// +[Experimental("TPEXP", UrlFormat = "https://aka.ms/testingplatform/diagnostics#{0}")] +public interface IOutputDeviceManager +{ + /// + /// Sets the custom output device factory. The factory is invoked once when the test host is built. + /// + /// A factory that builds the from the service provider. + /// + /// If the resolved reports itself as disabled via + /// , the platform falls back + /// to its default terminal output device. + /// + void SetOutputDevice(Func outputDeviceFactory); +} diff --git a/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs b/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs index 74158f1b1f..d3c7feae77 100644 --- a/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs +++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs @@ -2,20 +2,40 @@ // Licensed under the MIT license. See LICENSE file in the project root for full license information. using Microsoft.Testing.Platform.Logging; -#if !NET7_0_OR_GREATER using Microsoft.Testing.Platform.Resources; -#endif using Microsoft.Testing.Platform.ServerMode; using Microsoft.Testing.Platform.Services; namespace Microsoft.Testing.Platform.OutputDevice; -internal sealed class PlatformOutputDeviceManager +internal sealed class PlatformOutputDeviceManager : IOutputDeviceManager { private Func? _platformOutputDeviceFactory; public void SetPlatformOutputDevice(Func platformOutputDeviceFactory) - => _platformOutputDeviceFactory = platformOutputDeviceFactory ?? throw new ArgumentNullException(nameof(platformOutputDeviceFactory)); + { + if (platformOutputDeviceFactory is null) + { + throw new ArgumentNullException(nameof(platformOutputDeviceFactory)); + } + + if (_platformOutputDeviceFactory is not null) + { + throw new InvalidOperationException(PlatformResources.PlatformOutputDeviceAlreadyRegisteredErrorMessage); + } + + _platformOutputDeviceFactory = platformOutputDeviceFactory; + } + + public void SetOutputDevice(Func outputDeviceFactory) + { + if (outputDeviceFactory is null) + { + throw new ArgumentNullException(nameof(outputDeviceFactory)); + } + + SetPlatformOutputDevice(serviceProvider => new CustomOutputDeviceAdapter(outputDeviceFactory(serviceProvider))); + } internal async Task BuildAsync(ServiceProvider serviceProvider, bool useServerModeOutputDevice, bool isPipeProtocol) { diff --git a/src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt b/src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt index 7dc5c58110..66cb69af28 100644 --- a/src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt +++ b/src/Platform/Microsoft.Testing.Platform/PublicAPI/PublicAPI.Unshipped.txt @@ -1 +1,9 @@ #nullable enable +Microsoft.Testing.Platform.Builder.ITestApplicationBuilder.OutputDevice.get -> Microsoft.Testing.Platform.OutputDevice.IOutputDeviceManager! +[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice +[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice.DisplayAfterSessionEndRunAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice.DisplayAsync(Microsoft.Testing.Platform.Extensions.OutputDevice.IOutputDeviceDataProducer! producer, Microsoft.Testing.Platform.OutputDevice.IOutputDeviceData! data, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice.DisplayBannerAsync(string? bannerMessage, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +[TPEXP]Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice.DisplayBeforeSessionStartAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +[TPEXP]Microsoft.Testing.Platform.OutputDevice.IOutputDeviceManager +[TPEXP]Microsoft.Testing.Platform.OutputDevice.IOutputDeviceManager.SetOutputDevice(System.Func! outputDeviceFactory) -> void diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx b/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx index 6d0728af08..a96646c4c2 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx +++ b/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx @@ -826,4 +826,7 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Waiting for debugger to attach (TESTINGPLATFORM_WAIT_ATTACH_DEBUGGER=1) is not supported on wasi. {Locked="TESTINGPLATFORM_WAIT_ATTACH_DEBUGGER=1"}{Locked="wasi"} + + A custom output device has already been registered. + diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf index a9b0fbe502..980dc71c55 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Dalším stisknutím kombinace kláves Ctrl+C vynutíte ukončení. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value Proces měl být ukončen před tím, než jsme mohli určit tuto hodnotu. diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf index 4a3289c03d..67e617489d 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf @@ -663,6 +663,11 @@ Verwendet ein Argument als Zeitwert mit einem expliziten Einheitensuffix. Akzept Drücken Sie erneut Ctrl+C, um das Beenden zu erzwingen. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value Der Prozess hätte beendet werden müssen, bevor dieser Wert ermittelt werden kann diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf index adb2809ee8..9dbf86a505 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Presione Ctrl+C de nuevo para forzar la salida. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value El proceso debería haberse terminado para poder determinar este valor diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf index 73449fc7ba..37d44c2f9d 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Appuyez de nouveau sur Ctrl+C pour forcer la fermeture. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value Le processus aurait dû s’arrêter avant que nous puissions déterminer cette valeur diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf index fed4ca092e..66bbe57ca0 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Premere di nuovo Ctrl+C per forzare l'uscita. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value Il processo dovrebbe essere terminato prima di poter determinare questo valore diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf index 8b9d711f3d..d8c6475f35 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf @@ -664,6 +664,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix 強制終了するには、Ctrl+C キーをもう一度押してください。 {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value この値を決定する前にプロセスを終了する必要があります diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf index de0fce2e9d..745cf14184 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix 강제 종료하려면 Ctrl+C를 한 번 더 누르세요. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value 이 값을 결정하려면 프로세스가 종료되어야 합니다. diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf index 39e6793c0d..c4ee06274b 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Naciśnij ponownie klawisze Ctrl+C, aby wymusić wyjście. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value Proces powinien zakończyć się przed ustaleniem tej wartości diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf index 2d8ebfedc7..77c27c3916 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Pressione Ctrl+C de novo para forçar a saída. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value O processo deve ter sido encerrado antes que possamos determinar esse valor diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf index e4353902c8..5e8f6b501c 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Нажмите Ctrl+C еще раз, чтобы выполнить принудительный выход. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value Процесс должен быть завершен, прежде чем мы сможем определить это значение diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf index c14460f934..977b1aa776 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix Çıkmayı zorlamak için Ctrl+C tuşlarına yeniden basın. {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value Bu değeri belirleyebilmemiz için süreçten çıkılmış olması gerekir diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf index 52fe96d4d2..b48c9bd552 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix 再次按 Ctrl+C 强制退出。 {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value 在我们确定此值之前,流程应该已退出 diff --git a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf index 87a7ed0d2d..7bbf5f492e 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf @@ -663,6 +663,11 @@ Takes one argument as a time value with an explicit unit suffix. Accepted suffix 再次按 Ctrl+C 以強制離開。 {Locked="Ctrl+C"} + + A custom output device has already been registered. + A custom output device has already been registered. + + Process should have exited before we can determine this value 在我們確定此值之前,流程應已結束