Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for testconfig.json entries in MSTest #3872

Merged
merged 89 commits into from
Oct 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
296e268
flow down config
engyebrahim Sep 26, 2024
cd7822a
fix formating
engyebrahim Sep 26, 2024
4e67acc
Merge branch 'main' into enji/config
engyebrahim Sep 27, 2024
ffeb415
remove static
engyebrahim Sep 27, 2024
ce95524
Merge branch 'enji/config' of https://github.com/microsoft/testfx int…
engyebrahim Sep 27, 2024
84398a3
fix tests
engyebrahim Sep 27, 2024
0299b6a
throw in case of two types of settings
engyebrahim Sep 27, 2024
dbac583
reformating func
engyebrahim Sep 27, 2024
51fc99d
Merge branch 'main' into enji/config
engyebrahim Oct 1, 2024
711e192
added all settings check from json
engyebrahim Oct 1, 2024
0391a16
Merge branch 'main' into enji/config
engyebrahim Oct 1, 2024
ca05a01
Merge branch 'main' into enji/config
engyebrahim Oct 1, 2024
7be3d5a
fix keys
engyebrahim Oct 2, 2024
6ea735b
added proj ref
engyebrahim Oct 3, 2024
a9f7e47
updated adapter settings to use config(have an error it gets only one…
engyebrahim Oct 3, 2024
a4bb90f
Merge branch 'main' into enji/config
engyebrahim Oct 3, 2024
6627a74
Merge branch 'main' into enji/config
engyebrahim Oct 3, 2024
172ce41
updated directory retrieval
engyebrahim Oct 3, 2024
36551f8
Merge branch 'enji/config' of https://github.com/microsoft/testfx int…
engyebrahim Oct 3, 2024
c051c32
update runsettings to use config
engyebrahim Oct 3, 2024
2cbfcca
fixed comment
engyebrahim Oct 3, 2024
42d590b
update comment
engyebrahim Oct 3, 2024
a8c8745
updated comment
engyebrahim Oct 3, 2024
bb179fb
rename
engyebrahim Oct 4, 2024
333e8b5
rename
engyebrahim Oct 4, 2024
d0186c7
typo
engyebrahim Oct 4, 2024
0b486f8
Merge branch 'main' into enji/config
engyebrahim Oct 4, 2024
6ec6423
remove unusful condition
engyebrahim Oct 4, 2024
776619b
Merge branch 'enji/config' of https://github.com/microsoft/testfx int…
engyebrahim Oct 4, 2024
86bb339
fix build
engyebrahim Oct 4, 2024
1e7f436
fix compilation err
engyebrahim Oct 4, 2024
87668a6
add check for having runsettings with mstest settings
engyebrahim Oct 4, 2024
ed5ddc7
Merge branch 'main' into enji/config
engyebrahim Oct 4, 2024
00067ce
Merge branch 'main' into enji/config
engyebrahim Oct 4, 2024
14947eb
update comment
engyebrahim Oct 4, 2024
ed6105f
Merge branch 'enji/config' of https://github.com/microsoft/testfx int…
engyebrahim Oct 4, 2024
f7f252a
fix
engyebrahim Oct 4, 2024
003142b
applied comments
engyebrahim Oct 7, 2024
7c52c0b
Merge branch 'main' into enji/config
engyebrahim Oct 7, 2024
701ad6b
throw only if runsetting has mstest/mstesv2 wit config presents
engyebrahim Oct 7, 2024
0460a2b
Merge branch 'enji/config' of https://github.com/microsoft/testfx int…
engyebrahim Oct 7, 2024
887a3b1
merge in case we have both config files
engyebrahim Oct 7, 2024
1640800
typo
engyebrahim Oct 7, 2024
d5916a7
Merge branch 'main' into enji/config
engyebrahim Oct 7, 2024
1a1be02
update conditions
engyebrahim Oct 8, 2024
d68bd30
Merge branch 'enji/config' of https://github.com/microsoft/testfx int…
engyebrahim Oct 8, 2024
323b3e7
format funcs
engyebrahim Oct 8, 2024
efab5cb
use app domain from config
engyebrahim Oct 8, 2024
01544fd
update json
engyebrahim Oct 8, 2024
14828c9
added a comment
engyebrahim Oct 8, 2024
80f51cc
fix overide
engyebrahim Oct 8, 2024
bbfd27e
fix merging
engyebrahim Oct 8, 2024
c3b3248
update value from json
engyebrahim Oct 8, 2024
5a676b8
fix
engyebrahim Oct 8, 2024
232ded3
fix
engyebrahim Oct 8, 2024
e864e5f
Merge branch 'main' into enji/config
engyebrahim Oct 9, 2024
31a8237
added integration tests (not baild sussessfully yet)
engyebrahim Oct 9, 2024
db8e947
Merge branch 'enji/config' of https://github.com/microsoft/testfx int…
engyebrahim Oct 9, 2024
d0f9628
Merge branch 'main' into enji/config
engyebrahim Oct 10, 2024
140ba53
fix
engyebrahim Oct 10, 2024
6da76eb
Merge branch 'enji/config' of https://github.com/microsoft/testfx int…
engyebrahim Oct 10, 2024
3d7e49d
Fix names
Evangelink Oct 10, 2024
be377c0
Merge branch 'main' into enji/config
engyebrahim Oct 10, 2024
426b422
fixed integration tests
engyebrahim Oct 10, 2024
dbaa4c7
Merge branch 'main' into enji/config
engyebrahim Oct 10, 2024
f2f7372
typo
engyebrahim Oct 10, 2024
8b862f8
addd a unit test
engyebrahim Oct 10, 2024
2081767
change privacy
engyebrahim Oct 10, 2024
1f59b1a
update code
engyebrahim Oct 10, 2024
626ab63
warnning
engyebrahim Oct 10, 2024
88304ca
add test
engyebrahim Oct 10, 2024
19d18f5
set region
engyebrahim Oct 10, 2024
f80f6b3
more unit tests
engyebrahim Oct 10, 2024
afa3bb8
spaces
engyebrahim Oct 10, 2024
f1698cc
fix
engyebrahim Oct 10, 2024
b50b7a7
added test
engyebrahim Oct 10, 2024
6946926
update security
engyebrahim Oct 10, 2024
2b1904f
added appdomain test
engyebrahim Oct 10, 2024
602f179
fix build
engyebrahim Oct 11, 2024
02ba78f
Merge branch 'main' into enji/config
engyebrahim Oct 11, 2024
cceed83
Merge branch 'main' into enji/config
engyebrahim Oct 14, 2024
71fac23
Merge branch 'main' into enji/config
engyebrahim Oct 14, 2024
22f897c
rename index
engyebrahim Oct 14, 2024
88518bf
update message
engyebrahim Oct 14, 2024
617e3d2
localize error
engyebrahim Oct 14, 2024
4d03e51
move mstest check to settings file
engyebrahim Oct 14, 2024
5a0e201
added more test
engyebrahim Oct 14, 2024
ce8fc1c
update tests
engyebrahim Oct 14, 2024
ba85b66
fixed tests
engyebrahim Oct 14, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// 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.Configurations;
using Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;
Expand All @@ -20,7 +21,7 @@ internal static bool AreValidSources(IEnumerable<string> sources)
PlatformServiceProvider.Instance.TestSource.ValidSourceExtensions.Any(extension =>
string.Equals(Path.GetExtension(source), extension, StringComparison.OrdinalIgnoreCase)));

internal static bool InitializeDiscovery(IEnumerable<string> sources, IDiscoveryContext? discoveryContext, IMessageLogger messageLogger)
internal static bool InitializeDiscovery(IEnumerable<string> sources, IDiscoveryContext? discoveryContext, IMessageLogger messageLogger, IConfiguration? configuration)
{
if (!AreValidSources(sources))
{
Expand All @@ -30,7 +31,7 @@ internal static bool InitializeDiscovery(IEnumerable<string> sources, IDiscovery
// Populate the runsettings.
try
{
MSTestSettings.PopulateSettings(discoveryContext, messageLogger);
MSTestSettings.PopulateSettings(discoveryContext, messageLogger, configuration);
}
catch (AdapterSettingsException ex)
{
Expand Down
230 changes: 213 additions & 17 deletions src/Adapter/MSTest.TestAdapter/MSTestSettings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
using System.Xml;
using System.Xml.Linq;

using Microsoft.Testing.Platform.Configurations;
using Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Adapter;
using Microsoft.VisualStudio.TestPlatform.ObjectModel.Logging;
Expand Down Expand Up @@ -253,7 +255,33 @@ public static void PopulateSettings(MSTestSettings settings)
/// The discovery context that contains the runsettings.
/// </param>
[Obsolete("this function will be removed in v4.0.0")]
public static void PopulateSettings(IDiscoveryContext? context) => PopulateSettings(context, null);
public static void PopulateSettings(IDiscoveryContext? context) => PopulateSettings(context, null, null);

private static bool IsRunSettingsFileHasMSTestSettings(string? runSettingsXml) => IsRunSettingsFileHasSettingName(runSettingsXml, SettingsName) || IsRunSettingsFileHasSettingName(runSettingsXml, SettingsNameAlias);

private static bool IsRunSettingsFileHasSettingName(string? runSettingsXml, string SettingName)
{
if (StringEx.IsNullOrWhiteSpace(runSettingsXml))
{
return false;
}

using var stringReader = new StringReader(runSettingsXml);
var reader = XmlReader.Create(stringReader, XmlRunSettingsUtilities.ReaderSettings);

// read to the fist child
XmlReaderUtilities.ReadToRootNode(reader);
reader.ReadToNextElement();

// Read till we reach nodeName element or reach EOF
while (!string.Equals(reader.Name, SettingName, StringComparison.OrdinalIgnoreCase)
&& !reader.EOF)
{
reader.SkipToNextElement();
}

return !reader.EOF;
}

/// <summary>
/// Populate adapter settings from the context.
Expand All @@ -262,32 +290,43 @@ public static void PopulateSettings(MSTestSettings settings)
/// <param name="logger"> The logger for messages. </param>
/// The discovery context that contains the runsettings.
/// </param>
internal static void PopulateSettings(IDiscoveryContext? context, IMessageLogger? logger)
internal static void PopulateSettings(IDiscoveryContext? context, IMessageLogger? logger, IConfiguration? configuration)
{
RunConfigurationSettings = RunConfigurationSettings.PopulateSettings(context);

if (context?.RunSettings == null || StringEx.IsNullOrEmpty(context.RunSettings.SettingsXml))
if (configuration?["mstest"] != null && context?.RunSettings != null && IsRunSettingsFileHasMSTestSettings(context.RunSettings.SettingsXml))
{
// This will contain default adapter settings
CurrentSettings = new MSTestSettings();
return;
throw new InvalidOperationException(Resource.DuplicateConfigurationError);
}

MSTestSettings? aliasSettings = GetSettings(context.RunSettings.SettingsXml, SettingsNameAlias, logger);
// This will contain default adapter settings
var settings = new MSTestSettings();
var runConfigurationSettings = RunConfigurationSettings.PopulateSettings(context);

// If a user specifies MSTestV2 in the runsettings, then prefer that over the v1 settings.
if (aliasSettings != null)
if (!StringEx.IsNullOrEmpty(context?.RunSettings?.SettingsXml) && configuration?["mstest"] is null)
{
CurrentSettings = aliasSettings;
MSTestSettings? aliasSettings = GetSettings(context.RunSettings.SettingsXml, SettingsNameAlias, logger);

// If a user specifies MSTestV2 in the runsettings, then prefer that over the v1 settings.
if (aliasSettings != null)
{
settings = aliasSettings;
}
else
{
MSTestSettings? mSTestSettings = GetSettings(context.RunSettings.SettingsXml, SettingsName, logger);

settings = mSTestSettings ?? new MSTestSettings();
}

SetGlobalSettings(context.RunSettings.SettingsXml, settings, logger);
}
else
else if (configuration?["mstest"] is not null)
{
MSTestSettings? settings = GetSettings(context.RunSettings.SettingsXml, SettingsName, logger);

CurrentSettings = settings ?? new MSTestSettings();
RunConfigurationSettings.SetRunConfigurationSettingsFromConfig(configuration, runConfigurationSettings);
SetSettingsFromConfig(configuration, logger, settings);
}

SetGlobalSettings(context.RunSettings.SettingsXml, CurrentSettings, logger);
CurrentSettings = settings;
RunConfigurationSettings = runConfigurationSettings;
}

/// <summary>
Expand Down Expand Up @@ -831,4 +870,161 @@ private static void SetGlobalSettings(
logger?.SendMessage(TestMessageLevel.Warning, string.Format(CultureInfo.CurrentCulture, Resource.InvalidValue, disableParallelizationString, "DisableParallelization"));
}
}

private static void ParseBooleanSetting(IConfiguration configuration, string key, IMessageLogger? logger, Action<bool> setSetting)
{
if (configuration[$"mstest:{key}"] is not string value)
{
return;
}

if (bool.TryParse(value, out bool result))
{
setSetting(result);
}
else
{
logger?.SendMessage(TestMessageLevel.Warning, string.Format(CultureInfo.CurrentCulture, Resource.InvalidValue, value, key));
}
}

private static void ParseIntegerSetting(IConfiguration configuration, string key, IMessageLogger? logger, Action<int> setSetting)
{
if (configuration[$"mstest:{key}"] is not string value)
{
return;
}

if (int.TryParse(value, out int result) && result > 0)
{
setSetting(result);
}
else
{
logger?.SendMessage(TestMessageLevel.Warning, string.Format(CultureInfo.CurrentCulture, Resource.InvalidValue, value, key));
}
}

/// <summary>
/// Convert the parameter xml to TestSettings.
/// </summary>
/// <param name="configuration">Configuration to load the settings from.</param>
/// <param name="logger"> The logger for messages. </param>
internal static void SetSettingsFromConfig(IConfiguration configuration, IMessageLogger? logger, MSTestSettings settings)
{
// Expected format of the json is: -
//
// "mstest" : {
// "timeout" : {
// "assemblyInitialize" : strictly positive int,
// "assemblyCleanup" : strictly positive int,
// "classInitialize" : strictly positive int,
// "classCleanup" : strictly positive int,
// "testInitialize" : strictly positive int,
// "testCleanup" : strictly positive int,
// "test" : strictly positive int,
// "useCooperativeCancellation" : true/false
// },
// "parallelism" : {
// "enabled": true/false,
// "workers": positive int,
// "scope": method/class,
// },
// "output" : {
// "captureTrace" : true/false
// },
// "execution" : {
// "mapInconclusiveToFailed" : true/false
// "mapNotRunnableToFailed" : true/false
// "treatDiscoveryWarningsAsErrors" : true/false
// "considerEmptyDataSourceAsInconclusive" : true/false
// "treatClassAndAssemblyCleanupWarningsAsErrors" : true/false
// "considerFixturesAsSpecialTests" : true/false
// }
// ... remaining settings
// }
ParseBooleanSetting(configuration, "enableBaseClassTestMethodsFromOtherAssemblies", logger, value => settings.EnableBaseClassTestMethodsFromOtherAssemblies = value);
ParseBooleanSetting(configuration, "orderTestsByNameInClass", logger, value => settings.OrderTestsByNameInClass = value);

ParseBooleanSetting(configuration, "output:captureTrace", logger, value => settings.CaptureDebugTraces = value);

ParseBooleanSetting(configuration, "parallelism:enabled", logger, value => settings.OrderTestsByNameInClass = value);

ParseBooleanSetting(configuration, "execution:mapInconclusiveToFailed", logger, value => settings.MapInconclusiveToFailed = value);
ParseBooleanSetting(configuration, "execution:mapNotRunnableToFailed", logger, value => settings.MapNotRunnableToFailed = value);
ParseBooleanSetting(configuration, "execution:treatDiscoveryWarningsAsErrors", logger, value => settings.TreatDiscoveryWarningsAsErrors = value);
ParseBooleanSetting(configuration, "execution:considerEmptyDataSourceAsInconclusive", logger, value => settings.ConsiderEmptyDataSourceAsInconclusive = value);
ParseBooleanSetting(configuration, "execution:treatClassAndAssemblyCleanupWarningsAsErrors", logger, value => settings.TreatClassAndAssemblyCleanupWarningsAsErrors = value);
ParseBooleanSetting(configuration, "execution:considerFixturesAsSpecialTests", logger, value => settings.ConsiderFixturesAsSpecialTests = value);

ParseBooleanSetting(configuration, "timeout:useCooperativeCancellation", logger, value => settings.CooperativeCancellationTimeout = value);
ParseIntegerSetting(configuration, "timeout:test", logger, value => settings.TestTimeout = value);
ParseIntegerSetting(configuration, "timeout:assemblyCleanup", logger, value => settings.AssemblyCleanupTimeout = value);
ParseIntegerSetting(configuration, "timeout:assemblyInitialize", logger, value => settings.AssemblyInitializeTimeout = value);
ParseIntegerSetting(configuration, "timeout:classInitialize", logger, value => settings.ClassInitializeTimeout = value);
ParseIntegerSetting(configuration, "timeout:classCleanup", logger, value => settings.ClassCleanupTimeout = value);
ParseIntegerSetting(configuration, "timeout:testInitialize", logger, value => settings.TestInitializeTimeout = value);
ParseIntegerSetting(configuration, "timeout:testCleanup", logger, value => settings.TestCleanupTimeout = value);

if (configuration["mstest:classCleanupLifecycle"] is string classCleanupLifecycle)
{
if (TryParseEnum(classCleanupLifecycle, out ClassCleanupBehavior lifecycle))
{
settings.ClassCleanupLifecycle = lifecycle;
}
else
{
throw new AdapterSettingsException(string.Format(
CultureInfo.CurrentCulture,
Resource.InvalidClassCleanupLifecycleValue,
classCleanupLifecycle,
#if NET
string.Join(", ", Enum.GetNames<ClassCleanupBehavior>())));
#else
string.Join(", ", EnumPolyfill.GetNames<ClassCleanupBehavior>())));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't we use polyfill for both? @Evangelink how's the story of polyfill here?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would need to double check but yeah most likely it should work.

#endif
}
}

if (configuration["mstest:parallelism:workers"] is string workers)
{
settings.ParallelizationWorkers = int.TryParse(workers, out int parallelWorkers)
engyebrahim marked this conversation as resolved.
Show resolved Hide resolved
? parallelWorkers == 0
? Environment.ProcessorCount
: parallelWorkers > 0
? parallelWorkers
: throw new AdapterSettingsException(string.Format(
CultureInfo.CurrentCulture,
Resource.InvalidParallelWorkersValue,
workers))
: throw new AdapterSettingsException(string.Format(
CultureInfo.CurrentCulture,
Resource.InvalidParallelWorkersValue,
workers));
}

if (configuration["mstest:parallelism:scope"] is string value)
{
value = value.Equals("class", StringComparison.OrdinalIgnoreCase) ? "ClassLevel"
: value.Equals("methood", StringComparison.OrdinalIgnoreCase) ? "MethodLevel" : value;
if (TryParseEnum(value, out ExecutionScope scope))
{
settings.ParallelizationScope = scope;
}
else
{
throw new AdapterSettingsException(string.Format(
CultureInfo.CurrentCulture,
Resource.InvalidParallelScopeValue,
value,
#if NET
string.Join(", ", Enum.GetNames<ExecutionScope>())));
#else
string.Join(", ", EnumPolyfill.GetNames<ExecutionScope>())));
#endif
}
}

MSTestSettingsProvider.Load(configuration);
}
}
9 changes: 9 additions & 0 deletions src/Adapter/MSTest.TestAdapter/Resources/Resource.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/Adapter/MSTest.TestAdapter/Resources/Resource.resx
Original file line number Diff line number Diff line change
Expand Up @@ -414,4 +414,7 @@ but received {4} argument(s), with types '{5}'.</value>
<data name="DynamicDataShouldBeValidMessageFormat_MemberType" xml:space="preserve">
<value>'[DynamicData]' referenced member '{0}.{1}' should return 'IEnumerable&lt;object[]&gt;', 'IEnumerable&lt;Tuple&gt;` or 'IEnumerable&lt;ValueTuple&gt;'</value>
</data>
<data name="DuplicateConfigurationError" xml:space="preserve">
<value>Both '.runsettings' and '.testconfig.json' files have been detected. Please select only one of these test configuration files.</value>
</data>
</root>
5 changes: 5 additions & 0 deletions src/Adapter/MSTest.TestAdapter/Resources/xlf/Resource.cs.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ byl však přijat tento počet argumentů: {4} s typy {5}.</target>
<target state="translated">Metoda inicializace třídy {0}.{1} byla zrušena.</target>
<note />
</trans-unit>
<trans-unit id="DuplicateConfigurationError">
<source>Both '.runsettings' and '.testconfig.json' files have been detected. Please select only one of these test configuration files.</source>
<target state="new">Both '.runsettings' and '.testconfig.json' files have been detected. Please select only one of these test configuration files.</target>
<note />
</trans-unit>
<trans-unit id="DynamicDataShouldBeValidMessageFormat_MemberType">
<source>'[DynamicData]' referenced member '{0}.{1}' should return 'IEnumerable&lt;object[]&gt;', 'IEnumerable&lt;Tuple&gt;` or 'IEnumerable&lt;ValueTuple&gt;'</source>
<target state="translated">Odkazovaný člen [DynamicData] {0}.{1} by měl vracet IEnumerable&lt;object[]&gt;, IEnumerable&lt;Tuple&gt; nebo IEnumerable&lt;ValueTuple&gt;.</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Adapter/MSTest.TestAdapter/Resources/xlf/Resource.de.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ aber empfing {4} Argument(e) mit den Typen „{5}“.</target>
<target state="translated">Die Initialisierungsmethode "{0}.{1}" der Klasse wurde abgebrochen</target>
<note />
</trans-unit>
<trans-unit id="DuplicateConfigurationError">
<source>Both '.runsettings' and '.testconfig.json' files have been detected. Please select only one of these test configuration files.</source>
<target state="new">Both '.runsettings' and '.testconfig.json' files have been detected. Please select only one of these test configuration files.</target>
<note />
</trans-unit>
<trans-unit id="DynamicDataShouldBeValidMessageFormat_MemberType">
<source>'[DynamicData]' referenced member '{0}.{1}' should return 'IEnumerable&lt;object[]&gt;', 'IEnumerable&lt;Tuple&gt;` or 'IEnumerable&lt;ValueTuple&gt;'</source>
<target state="translated">"[DynamicData]"-Element "{0}.{1}" muss "IEnumerable"&lt;"object[]&gt;", "IEnumerable&lt;Tuple&gt;" oder "IEnumerable&lt;ValueTuple&gt;" zurückgeben.</target>
Expand Down
5 changes: 5 additions & 0 deletions src/Adapter/MSTest.TestAdapter/Resources/xlf/Resource.es.xlf
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ pero recibió {4} argumento(s), con los tipos "{5}".</target>
<target state="translated">Método de inicialización de clase "{0}.{1}" se canceló</target>
<note />
</trans-unit>
<trans-unit id="DuplicateConfigurationError">
<source>Both '.runsettings' and '.testconfig.json' files have been detected. Please select only one of these test configuration files.</source>
<target state="new">Both '.runsettings' and '.testconfig.json' files have been detected. Please select only one of these test configuration files.</target>
<note />
</trans-unit>
<trans-unit id="DynamicDataShouldBeValidMessageFormat_MemberType">
<source>'[DynamicData]' referenced member '{0}.{1}' should return 'IEnumerable&lt;object[]&gt;', 'IEnumerable&lt;Tuple&gt;` or 'IEnumerable&lt;ValueTuple&gt;'</source>
<target state="translated">El miembro ''{0}.{1}'' de '[DynamicData]' al que se hace referencia debe devolver ''IEnumerable&lt;object[]&gt;', 'IEnumerable&lt;Tuple&gt;'' o ''IEnumerable&lt;ValueTuple&gt;''</target>
Expand Down
Loading
Loading