From 4fe5dddb51ee83c3a09c7e7447496143b2dda378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amaury=20Lev=C3=A9?= Date: Mon, 25 May 2026 23:57:14 +0200 Subject: [PATCH] Expose experimental API for custom output devices in MTP Adds a new experimental public API allowing users to plug a custom output device into Microsoft.Testing.Platform. New public types (TPEXP): - Microsoft.Testing.Platform.OutputDevice.ICustomOutputDevice - Microsoft.Testing.Platform.OutputDevice.IOutputDeviceManager - ITestApplicationBuilder.OutputDevice property Design notes: - ICustomOutputDevice is a minimal user-facing interface that does not expose the internal IPlatformOutputDevice or TestProcessRole. An internal CustomOutputDeviceAdapter bridges to the existing pipeline. - IOutputDeviceManager.SetOutputDevice throws InvalidOperationException if called more than once (consistent with RegisterTestFramework). - Server-mode ServerModePerCallOutputDevice and hot-reload behavior are preserved unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Builder/ITestApplicationBuilder.cs | 7 +++ .../Builder/TestApplicationBuilder.cs | 4 ++ .../Hosts/ITestHostBuilder.cs | 3 ++ .../Hosts/TestHostBuilder.cs | 2 + .../OutputDevice/CustomOutputDeviceAdapter.cs | 39 ++++++++++++++ .../OutputDevice/ICustomOutputDevice.cs | 51 +++++++++++++++++++ .../OutputDevice/IOutputDeviceManager.cs | 27 ++++++++++ .../OutputDevice/OutputDeviceManager.cs | 30 ++++++++--- .../PublicAPI/PublicAPI.Unshipped.txt | 8 +++ .../Resources/PlatformResources.resx | 3 ++ .../Resources/xlf/PlatformResources.cs.xlf | 5 ++ .../Resources/xlf/PlatformResources.de.xlf | 5 ++ .../Resources/xlf/PlatformResources.es.xlf | 5 ++ .../Resources/xlf/PlatformResources.fr.xlf | 5 ++ .../Resources/xlf/PlatformResources.it.xlf | 5 ++ .../Resources/xlf/PlatformResources.ja.xlf | 5 ++ .../Resources/xlf/PlatformResources.ko.xlf | 5 ++ .../Resources/xlf/PlatformResources.pl.xlf | 5 ++ .../Resources/xlf/PlatformResources.pt-BR.xlf | 5 ++ .../Resources/xlf/PlatformResources.ru.xlf | 5 ++ .../Resources/xlf/PlatformResources.tr.xlf | 5 ++ .../xlf/PlatformResources.zh-Hans.xlf | 5 ++ .../xlf/PlatformResources.zh-Hant.xlf | 5 ++ 23 files changed, 233 insertions(+), 6 deletions(-) create mode 100644 src/Platform/Microsoft.Testing.Platform/OutputDevice/CustomOutputDeviceAdapter.cs create mode 100644 src/Platform/Microsoft.Testing.Platform/OutputDevice/ICustomOutputDevice.cs create mode 100644 src/Platform/Microsoft.Testing.Platform/OutputDevice/IOutputDeviceManager.cs 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 f63eb424cb..7ab2450ae7 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 b487d11f1c..35c050887e 100644 --- a/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs +++ b/src/Platform/Microsoft.Testing.Platform/OutputDevice/OutputDeviceManager.cs @@ -2,25 +2,43 @@ // 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) { - // TODO: SetPlatformOutputDevice isn't public yet. - // Before exposing it, do we want to pass the "useServerModeOutputDevice" info to it? IPlatformOutputDevice nonServerOutputDevice = _platformOutputDeviceFactory is null ? GetDefaultTerminalOutputDevice(serviceProvider) : _platformOutputDeviceFactory(serviceProvider); 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 942c03e448..5af906eb4b 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx +++ b/src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx @@ -794,4 +794,7 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Waiting for debugger to attach (TESTINGPLATFORM_WAIT_ATTACH_DEBUGGER=1) is not supported on 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 b025a84e67..351c7ffead 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Může mít jenom jeden argument jako řetězec ve formátu <value>[h|m|s], kde value je hodnota datového typu float. + + 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 4e4540fd19..a3052fe7db 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Nimmt ein Argument als Zeichenfolge im Format <value>[h|m|s], wobei "value" auf "float" festgelegt ist. + + 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 90f8df9670..d02bb0cbe5 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Toma un argumento como cadena con el formato <value>[h|m|s] donde 'value' es float. + + 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 e85b3dd053..35529cdcc6 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Prend un argument sous forme de chaîne au format <value>[h|m|s] où « value » est float. + + 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 dab5720fb9..295014bd4b 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Acquisisce un argomento come stringa nel formato <value>[h|m|s] dove 'value' è float. + + 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 89044004aa..b119f57a56 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf @@ -686,6 +686,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is 1 つの引数を文字列として <value>[h|m|s] の形式で使用します。この場合、'value' は float です。 + + 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 e16040049c..ed6309e0ed 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is 'value'가 float인 <value>[h|m|s] 형식의 문자열로 인수 하나를 사용합니다. + + 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 1cdea07349..829a8b7e0d 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Pobiera jeden argument jako ciąg w formacie <value>[h|m|s], gdzie element „value” ma wartość zmiennoprzecinkową. + + 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 f4128481d8..2ea86dfaed 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 @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Recebe um argumento como cadeia de caracteres no formato <valor>[h|m|s] em que 'valor' é float. + + 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 781042a36c..d75afb47ec 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Принимает один аргумент в виде строки в формате <value>[h|m|s], где "value" — число с плавающей точкой. + + 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 f48a8db2a4..32f957b268 100644 --- a/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf +++ b/src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is Bir bağımsız değişkeni, 'value' değerinin kayan olduğu <value>[h|m|s] biçiminde dize olarak alır. + + 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 0924db6031..97dc2e6c05 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 @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is 获取一个字符串形式的参数,格式为 <value>[h|m|s],其中 "value" 为浮点型。 + + 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 5a35249a2d..bd9c0678ee 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 @@ -685,6 +685,11 @@ Takes one argument as string in the format <value>[h|m|s] where 'value' is 將一個引數作為字串,格式為 <value>[h|m|s],其中 'value' 為 float。 + + 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 在我們確定此值之前,流程應已結束