From 83e69f37378ad42048bff9557e79e637888b14ef Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Tue, 25 Aug 2026 10:20:32 +0200 Subject: [PATCH 1/4] fix(Atc.DotNet): make project file parsing namespace- and attribute-order-agnostic DotnetNugetHelper.GetAllPackageReferences looked up PackageReference elements with Descendants("PackageReference"), a namespace-qualified lookup. Any project file declaring the legacy MSBuild namespace () therefore yielded zero package references instead of its actual ones. Element and attribute lookups now match on local name, so both SDK-style and legacy-namespace files are handled. The same method also rejected content with a leading blank line or indentation, throwing DataException("Expect xml content") for perfectly valid XML. Leading whitespace is now trimmed before the guard, matching what VisualStudioSolutionFileHelper.TryParseSlnx already does. Genuinely non-XML input still throws. DotnetCsProjFileHelper resolved the project SDK through XElement.FirstAttribute, which is only the Sdk attribute when it happens to be written first. Both an attribute ordered ahead of it () and an xmlns declaration - which LINQ to XML also exposes as an attribute - made every SDK comparison fail and GetProjectType silently return DotnetProjectType.None. The Sdk attribute is now looked up by name via GetSdk/IsSdk. A missing Sdk attribute is still treated as not disqualifying, preserving the previous semantics. --- src/Atc.DotNet/DotnetCsProjFileHelper.cs | 38 +++++--- src/Atc.DotNet/DotnetNugetHelper.cs | 41 +++++++-- ...DotnetCsProjFileHelperSdkAttributeTests.cs | 86 +++++++++++++++++++ .../DotnetNugetHelperTests.cs | 69 +++++++++++++++ 4 files changed, 217 insertions(+), 17 deletions(-) create mode 100644 test/Atc.DotNet.Tests/DotnetCsProjFileHelperSdkAttributeTests.cs diff --git a/src/Atc.DotNet/DotnetCsProjFileHelper.cs b/src/Atc.DotNet/DotnetCsProjFileHelper.cs index 89d0a913..227c9942 100644 --- a/src/Atc.DotNet/DotnetCsProjFileHelper.cs +++ b/src/Atc.DotNet/DotnetCsProjFileHelper.cs @@ -178,24 +178,25 @@ public static DotnetProjectType GetProjectType(string fileContent) private static DotnetProjectType ProjectSdkElement(XElement rootElement) { - if (rootElement.FirstAttribute is not null) + var sdk = GetSdk(rootElement); + if (sdk is not null) { - if (rootElement.FirstAttribute.Value.StartsWith("Aspire.AppHost.Sdk", StringComparison.OrdinalIgnoreCase)) + if (sdk.StartsWith("Aspire.AppHost.Sdk", StringComparison.OrdinalIgnoreCase)) { return DotnetProjectType.AspireAppHost; } - if (rootElement.FirstAttribute.Value.Equals("Microsoft.NET.Sdk.BlazorWebAssembly", StringComparison.Ordinal)) + if (sdk.Equals("Microsoft.NET.Sdk.BlazorWebAssembly", StringComparison.Ordinal)) { return DotnetProjectType.BlazorWAsmApp; } - if (rootElement.FirstAttribute.Value.Equals("Microsoft.NET.Sdk.Razor", StringComparison.Ordinal)) + if (sdk.Equals("Microsoft.NET.Sdk.Razor", StringComparison.Ordinal)) { return DotnetProjectType.RazorLibrary; } - if (rootElement.FirstAttribute.Value.Equals("Microsoft.NET.Sdk.Worker", StringComparison.Ordinal)) + if (sdk.Equals("Microsoft.NET.Sdk.Worker", StringComparison.Ordinal)) { return DotnetProjectType.WorkerService; } @@ -224,8 +225,7 @@ private static DotnetProjectType ProjectSdkElement(XElement rootElement) private static DotnetProjectType ProjectElementForSdk(XElement rootElement) { - if (rootElement.FirstAttribute is not null && - !rootElement.FirstAttribute.Value.Equals("Microsoft.NET.Sdk", StringComparison.Ordinal)) + if (!IsSdk(rootElement, "Microsoft.NET.Sdk")) { return DotnetProjectType.None; } @@ -285,8 +285,7 @@ private static DotnetProjectType ProjectElementForSdk(XElement rootElement) private static DotnetProjectType ProjectElementForSdkTest( XElement rootElement) { - if (rootElement.FirstAttribute is not null && - !rootElement.FirstAttribute.Value.Equals("Microsoft.NET.Sdk", StringComparison.Ordinal)) + if (!IsSdk(rootElement, "Microsoft.NET.Sdk")) { return DotnetProjectType.None; } @@ -317,8 +316,7 @@ private static DotnetProjectType ProjectElementForSdkTest( private static DotnetProjectType ProjectElementForSdkWeb( XElement rootElement) { - if (rootElement.FirstAttribute is not null && - !rootElement.FirstAttribute.Value.Equals("Microsoft.NET.Sdk.Web", StringComparison.Ordinal)) + if (!IsSdk(rootElement, "Microsoft.NET.Sdk.Web")) { return DotnetProjectType.None; } @@ -367,6 +365,24 @@ private static DotnetProjectType ProjectElementForToolsVersion( return DotnetProjectType.None; } + /// + /// Reads the Sdk attribute of the project element. The attribute is looked up by name + /// instead of using , since any other attribute - an + /// xmlns declaration included - can be written ahead of it. + /// + private static string? GetSdk(XElement rootElement) + => rootElement.Attribute("Sdk")?.Value; + + private static bool IsSdk( + XElement rootElement, + string sdk) + { + var value = GetSdk(rootElement); + + return value is null || + value.Equals(sdk, StringComparison.Ordinal); + } + private static bool HasPackageReference( XElement rootElement, string packageReference) diff --git a/src/Atc.DotNet/DotnetNugetHelper.cs b/src/Atc.DotNet/DotnetNugetHelper.cs index 05523f7e..ee38aea8 100644 --- a/src/Atc.DotNet/DotnetNugetHelper.cs +++ b/src/Atc.DotNet/DotnetNugetHelper.cs @@ -44,19 +44,24 @@ public static List GetAllPackageReferences( throw new ArgumentNullException(nameof(fileContent)); } - if (!fileContent.StartsWith('<')) + // A project file can start with a byte-order-mark remnant, a blank line or indentation + // before the XML declaration, none of which stops it from being valid XML. + var trimmedFileContent = fileContent.TrimStart(); + + if (!trimmedFileContent.StartsWith('<')) { throw new DataException("Expect xml content"); } - var xDoc = XDocument.Parse(fileContent); + var xDoc = XDocument.Parse(trimmedFileContent); var data = xDoc - .Descendants("PackageReference") + .Descendants() + .Where(e => e.Name.LocalName.Equals("PackageReference", StringComparison.Ordinal)) .Select(e => new { - PackageId = e.Attribute("Include")?.Value, - Version = e.Attribute("Version")?.Value - ?? e.Element("Version")?.Value, + PackageId = GetAttributeValue(e, "Include"), + Version = GetAttributeValue(e, "Version") + ?? GetElementValue(e, "Version"), }) .Where(x => !string.IsNullOrEmpty(x.PackageId) && !string.IsNullOrEmpty(x.Version)) .Select(x => new DotnetNugetPackageMetadataBase(x.PackageId!, x.Version!)) @@ -65,4 +70,28 @@ public static List GetAllPackageReferences( return data; } + + /// + /// Reads an attribute by its local name, so project files declaring the legacy MSBuild + /// namespace are handled the same way as SDK-style ones. + /// + private static string? GetAttributeValue( + XElement element, + string attributeName) + => element + .Attributes() + .FirstOrDefault(x => x.Name.LocalName.Equals(attributeName, StringComparison.Ordinal)) + ?.Value; + + /// + /// Reads a child element by its local name, so project files declaring the legacy MSBuild + /// namespace are handled the same way as SDK-style ones. + /// + private static string? GetElementValue( + XElement element, + string elementName) + => element + .Elements() + .FirstOrDefault(x => x.Name.LocalName.Equals(elementName, StringComparison.Ordinal)) + ?.Value; } \ No newline at end of file diff --git a/test/Atc.DotNet.Tests/DotnetCsProjFileHelperSdkAttributeTests.cs b/test/Atc.DotNet.Tests/DotnetCsProjFileHelperSdkAttributeTests.cs new file mode 100644 index 00000000..4b406c42 --- /dev/null +++ b/test/Atc.DotNet.Tests/DotnetCsProjFileHelperSdkAttributeTests.cs @@ -0,0 +1,86 @@ +namespace Atc.DotNet.Tests; + +/// +/// The SDK of a project file was resolved through XElement.FirstAttribute, which is only +/// the Sdk attribute when it happens to be written first. Any attribute placed ahead of it +/// - including an xmlns declaration, which LINQ to XML also exposes as an attribute - +/// made the whole project type detection fall through to . +/// +public class DotnetCsProjFileHelperSdkAttributeTests +{ + [Theory] + [InlineData(DotnetProjectType.ConsoleApp, "")] + [InlineData(DotnetProjectType.ConsoleApp, "")] + [InlineData(DotnetProjectType.ConsoleApp, "")] + public void GetProjectType_FileContent_ResolvesSdk_RegardlessOfAttributeOrder( + DotnetProjectType expected, + string projectStartElement) + { + // Arrange + var fileContent = $""" + {projectStartElement} + + Exe + net9.0 + + + """; + + // Atc + var actual = DotnetCsProjFileHelper.GetProjectType(fileContent); + + // Assert + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(DotnetProjectType.WebApi, "Microsoft.NET.Sdk.Web", "Swashbuckle.AspNetCore")] + [InlineData(DotnetProjectType.XUnitTest, "Microsoft.NET.Sdk", "xunit")] + public void GetProjectType_FileContent_ResolvesSdk_WhenNamespaceIsDeclaredBeforeSdkAttribute( + DotnetProjectType expected, + string sdk, + string packageReference) + { + // Arrange + var fileContent = $""" + + + net9.0 + + + + + + """; + + // Atc + var actual = DotnetCsProjFileHelper.GetProjectType(fileContent); + + // Assert + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(DotnetProjectType.AspireAppHost, "Aspire.AppHost.Sdk/9.0.0")] + [InlineData(DotnetProjectType.RazorLibrary, "Microsoft.NET.Sdk.Razor")] + [InlineData(DotnetProjectType.WorkerService, "Microsoft.NET.Sdk.Worker")] + public void GetProjectType_FileContent_ResolvesWellKnownSdk_WhenAnotherAttributeComesFirst( + DotnetProjectType expected, + string sdk) + { + // Arrange + var fileContent = $""" + + + net9.0 + + + """; + + // Atc + var actual = DotnetCsProjFileHelper.GetProjectType(fileContent); + + // Assert + Assert.Equal(expected, actual); + } +} \ No newline at end of file diff --git a/test/Atc.DotNet.Tests/DotnetNugetHelperTests.cs b/test/Atc.DotNet.Tests/DotnetNugetHelperTests.cs index 0d362732..da978be6 100644 --- a/test/Atc.DotNet.Tests/DotnetNugetHelperTests.cs +++ b/test/Atc.DotNet.Tests/DotnetNugetHelperTests.cs @@ -59,6 +59,59 @@ public void GetAllPackageReferences_FileContent() .And.HaveCount(3); } + [Fact] + public void GetAllPackageReferences_FileContent_WithLegacyMsBuildNamespace() + { + // Arrange + var fileContent = CreateDirectoryBuildPropsFileContentWithLegacyMsBuildNamespace(); + + // Atc + var actual = DotnetNugetHelper.GetAllPackageReferences(fileContent); + + // Assert + actual + .Should().NotBeEmpty() + .And.HaveCount(3); + + actual[0].PackageId.Should().Be("AsyncFixer"); + actual[0].Version.Should().Be("2.1.0"); + actual[1].PackageId.Should().Be("Meziantou.Analyzer"); + actual[1].Version.Should().Be("3.0.54"); + actual[2].PackageId.Should().Be("SonarAnalyzer.CSharp"); + actual[2].Version.Should().Be("10.24.0.138807"); + } + + [Theory] + [InlineData("\r\n")] + [InlineData(" ")] + [InlineData("\r\n \r\n")] + public void GetAllPackageReferences_FileContent_WithLeadingWhitespace( + string leadingWhitespace) + { + // Arrange + var fileContent = leadingWhitespace + CreateCsprojFileContent(); + + // Atc + var actual = DotnetNugetHelper.GetAllPackageReferences(fileContent); + + // Assert + actual + .Should().NotBeEmpty() + .And.HaveCount(3); + } + + [Theory] + [InlineData("")] + [InlineData(" ")] + [InlineData("Not xml at all")] + public void GetAllPackageReferences_FileContent_ThrowsDataException_WhenContentIsNotXml( + string fileContent) + { + // Atc & Assert + Assert.Throws( + () => DotnetNugetHelper.GetAllPackageReferences(fileContent)); + } + private static Task CreateCsprojFile( DirectoryInfo workingDirectory, string fileName) @@ -89,4 +142,20 @@ private static string CreateCsprojFileContent() sb.AppendLine(""); return sb.ToString(); } + + private static string CreateDirectoryBuildPropsFileContentWithLegacyMsBuildNamespace() + { + var sb = new StringBuilder(); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(2, ""); + sb.AppendLine(4, ""); + sb.AppendLine(4, ""); + sb.AppendLine(4, ""); + sb.AppendLine(6, "10.24.0.138807"); + sb.AppendLine(4, ""); + sb.AppendLine(2, ""); + sb.AppendLine(""); + return sb.ToString(); + } } \ No newline at end of file From 6e716fb40d80b7ca324b49b97b1fc73f171d0773 Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Tue, 25 Aug 2026 10:35:41 +0200 Subject: [PATCH 2/4] chore(deps): nuget updates --- Directory.Build.props | 4 ++-- .../Demo.Atc.Console.Spectre.Cli.csproj | 6 +++--- sample/Demo.Atc.Dotnet.Cli/Demo.Atc.Dotnet.Cli.csproj | 6 +++--- src/Atc.Console.Spectre/Atc.Console.Spectre.csproj | 2 +- src/Atc.OpenApi/Atc.OpenApi.csproj | 2 +- .../Atc.Rest.AwesomeAssertions.csproj | 2 +- src/Atc.Rest.HealthChecks/Atc.Rest.HealthChecks.csproj | 2 +- src/Atc.XUnit/Atc.XUnit.csproj | 6 +++--- src/Atc/Atc.csproj | 8 ++++---- src/Directory.Build.props | 2 +- test/Directory.Build.props | 10 +++++----- 11 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 6e47d654..06b708d8 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -42,9 +42,9 @@ - + - + \ No newline at end of file diff --git a/sample/Demo.Atc.Console.Spectre.Cli/Demo.Atc.Console.Spectre.Cli.csproj b/sample/Demo.Atc.Console.Spectre.Cli/Demo.Atc.Console.Spectre.Cli.csproj index d21ea322..213a83a1 100644 --- a/sample/Demo.Atc.Console.Spectre.Cli/Demo.Atc.Console.Spectre.Cli.csproj +++ b/sample/Demo.Atc.Console.Spectre.Cli/Demo.Atc.Console.Spectre.Cli.csproj @@ -8,9 +8,9 @@ - - - + + + diff --git a/sample/Demo.Atc.Dotnet.Cli/Demo.Atc.Dotnet.Cli.csproj b/sample/Demo.Atc.Dotnet.Cli/Demo.Atc.Dotnet.Cli.csproj index 295b5989..4a0a506b 100644 --- a/sample/Demo.Atc.Dotnet.Cli/Demo.Atc.Dotnet.Cli.csproj +++ b/sample/Demo.Atc.Dotnet.Cli/Demo.Atc.Dotnet.Cli.csproj @@ -8,9 +8,9 @@ - - - + + + diff --git a/src/Atc.Console.Spectre/Atc.Console.Spectre.csproj b/src/Atc.Console.Spectre/Atc.Console.Spectre.csproj index b0185546..1e249f5b 100644 --- a/src/Atc.Console.Spectre/Atc.Console.Spectre.csproj +++ b/src/Atc.Console.Spectre/Atc.Console.Spectre.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Atc.OpenApi/Atc.OpenApi.csproj b/src/Atc.OpenApi/Atc.OpenApi.csproj index 502870f8..41025624 100644 --- a/src/Atc.OpenApi/Atc.OpenApi.csproj +++ b/src/Atc.OpenApi/Atc.OpenApi.csproj @@ -9,7 +9,7 @@ - + diff --git a/src/Atc.Rest.AwesomeAssertions/Atc.Rest.AwesomeAssertions.csproj b/src/Atc.Rest.AwesomeAssertions/Atc.Rest.AwesomeAssertions.csproj index a088cc7f..59869e31 100644 --- a/src/Atc.Rest.AwesomeAssertions/Atc.Rest.AwesomeAssertions.csproj +++ b/src/Atc.Rest.AwesomeAssertions/Atc.Rest.AwesomeAssertions.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Atc.Rest.HealthChecks/Atc.Rest.HealthChecks.csproj b/src/Atc.Rest.HealthChecks/Atc.Rest.HealthChecks.csproj index f3ec9c78..3959a58d 100644 --- a/src/Atc.Rest.HealthChecks/Atc.Rest.HealthChecks.csproj +++ b/src/Atc.Rest.HealthChecks/Atc.Rest.HealthChecks.csproj @@ -10,7 +10,7 @@ - + diff --git a/src/Atc.XUnit/Atc.XUnit.csproj b/src/Atc.XUnit/Atc.XUnit.csproj index 19c9ca9f..4056578a 100644 --- a/src/Atc.XUnit/Atc.XUnit.csproj +++ b/src/Atc.XUnit/Atc.XUnit.csproj @@ -18,9 +18,9 @@ NU1701 - - - + + + diff --git a/src/Atc/Atc.csproj b/src/Atc/Atc.csproj index d192278e..f2907537 100644 --- a/src/Atc/Atc.csproj +++ b/src/Atc/Atc.csproj @@ -10,13 +10,13 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + @@ -77,7 +77,7 @@ - + diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 5a262bf9..253cb192 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -53,7 +53,7 @@ - + diff --git a/test/Directory.Build.props b/test/Directory.Build.props index d0792d71..b8a2d319 100644 --- a/test/Directory.Build.props +++ b/test/Directory.Build.props @@ -17,13 +17,13 @@ - + - - + + - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive From b0157ffc60c17b0ceb09a2c56f785f2ea7fe3cbf Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Tue, 25 Aug 2026 10:39:26 +0200 Subject: [PATCH 3/4] chore(deps): nuget updates and fix for ICSharpCode.Decompiler --- src/Atc.XUnit/Atc.XUnit.csproj | 2 +- .../AbstractSyntaxTree/DecompilerHelper.cs | 24 ++++++------------- .../DecompilerMethodHelper.cs | 6 ++--- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/Atc.XUnit/Atc.XUnit.csproj b/src/Atc.XUnit/Atc.XUnit.csproj index 4056578a..11250885 100644 --- a/src/Atc.XUnit/Atc.XUnit.csproj +++ b/src/Atc.XUnit/Atc.XUnit.csproj @@ -14,7 +14,7 @@ - + NU1701 diff --git a/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerHelper.cs b/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerHelper.cs index d3fa4ecf..cbafcf20 100644 --- a/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerHelper.cs +++ b/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerHelper.cs @@ -32,7 +32,7 @@ internal static Tuple[] GetTestMethodsWithDecompi Tuple[] testTypeMethods) { var testMethods = new List>(); - foreach ((Type testType, MethodInfo[] testMethodInfos) in testTypeMethods) + foreach (var (testType, testMethodInfos) in testTypeMethods) { if (testType.FullName is null) { @@ -43,28 +43,18 @@ internal static Tuple[] GetTestMethodsWithDecompi var syntaxTree = decompiler.DecompileType(fullTypeName); var astNodes = syntaxTree .Descendants - .Where(x => x.NodeType == NodeType.Member) + .OfType() .ToArray(); foreach (var testMethodInfo in testMethodInfos) { - foreach (var astNode in astNodes) - { - if (astNode is not MethodDeclaration methodDeclaration) - { - continue; - } - - if (!methodDeclaration.Name.Equals(testMethodInfo.Name, StringComparison.Ordinal)) - { - continue; - } - - testMethods.Add(new Tuple(testMethodInfo, methodDeclaration)); - } + testMethods.AddRange( + astNodes + .Where(methodDeclaration => methodDeclaration.Name.Equals(testMethodInfo.Name, StringComparison.Ordinal)) + .Select(methodDeclaration => new Tuple(testMethodInfo, methodDeclaration))); } } - return testMethods.ToArray(); + return [.. testMethods]; } } \ No newline at end of file diff --git a/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerMethodHelper.cs b/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerMethodHelper.cs index d6f0ec61..f64499a0 100644 --- a/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerMethodHelper.cs +++ b/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerMethodHelper.cs @@ -170,9 +170,9 @@ testMethodsWithDeclaration is null || } internal static AstNode? GetAstNodeForMethod( - AstNode astNode, + AstNode? astNode, string methodName) - => astNode.Descendants + => astNode?.Descendants .Where(x => x.IsType(typeof(InvocationExpression))) .Select(node => node.Descendants.FirstOrDefault(x => x.IsType(typeof(Identifier)) && string.Equals(x.ToString(), methodName, StringComparison.Ordinal))) .FirstOrDefault(x => x is not null); @@ -207,7 +207,7 @@ testMethodsWithDeclaration is null || } internal static AstNode? GetAstNodeForMethodWithParameters( - AstNode astNode, + AstNode? astNode, string methodName) => GetAstNodeForMethod(astNode, methodName)?.Parent?.Parent; From 57b827ef641b1aa89b673f516fdfd396336b5b85 Mon Sep 17 00:00:00 2001 From: David Kallesen Date: Tue, 25 Aug 2026 11:05:16 +0200 Subject: [PATCH 4/4] test: update some test to allow other OS languages then the default en-US for the test runner --- .../DecompilerMethodHelper.cs | 8 +++- .../ParametersNamingMatchHelper.cs | 3 +- .../BaseTypes/DateTimeExtensionsTests.cs | 38 +++++++++---------- .../DateTimeOffsetExtensionsTests.cs | 30 +++++++-------- .../BaseTypes/DecimalExtensionsTests.cs | 2 +- .../BaseTypes/DoubleExtensionsTests.cs | 2 +- .../BaseTypes/IntegerExtensionsTests.cs | 8 ++-- .../BaseTypes/TimeSpanExtensionsTests.cs | 8 ++-- test/Atc.Tests/Helpers/DateTimeHelperTests.cs | 16 ++++---- .../Helpers/DateTimeOffsetHelperTests.cs | 16 ++++---- .../Helpers/Enums/DayOfWeekHelperTests.cs | 6 +-- test/Atc.Tests/Helpers/NumberHelperTests.cs | 20 +++++----- 12 files changed, 81 insertions(+), 76 deletions(-) diff --git a/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerMethodHelper.cs b/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerMethodHelper.cs index f64499a0..de945556 100644 --- a/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerMethodHelper.cs +++ b/src/Atc.XUnit/Internal/AbstractSyntaxTree/DecompilerMethodHelper.cs @@ -220,10 +220,12 @@ internal static List GetAstNodesForMethodParameters( return new List(); } - // Check if there are complex expressions (DirectionExpression or ObjectCreateExpression) as direct children + // Check if there are complex expressions (DirectionExpression, OutVarDeclarationExpression or ObjectCreateExpression) as direct children // If so, we need to extract from direct children to get these nodes properly var hasComplexExpressions = astNode.Children - .Any(x => x.IsType(typeof(DirectionExpression)) || x.IsType(typeof(ObjectCreateExpression))); + .Any(x => x.IsType(typeof(DirectionExpression)) || + x.IsType(typeof(OutVarDeclarationExpression)) || + x.IsType(typeof(ObjectCreateExpression))); if (hasComplexExpressions) { @@ -251,6 +253,7 @@ internal static List GetAstNodesForMethodParameters( .Where(x => x.IsType(typeof(InvocationExpression)) || x.IsType(typeof(ObjectCreateExpression)) || x.IsType(typeof(DirectionExpression)) || + x.IsType(typeof(OutVarDeclarationExpression)) || x.IsType(typeof(LambdaExpression)) || x.IsType(typeof(AnonymousMethodExpression)) || x.ToString().Contains("=>", StringComparison.Ordinal)) @@ -291,6 +294,7 @@ private static List FilterDirectChildArguments(AstNode astNode) return child.IsType(typeof(InvocationExpression)) || child.IsType(typeof(ObjectCreateExpression)) || child.IsType(typeof(DirectionExpression)) || + child.IsType(typeof(OutVarDeclarationExpression)) || child.IsType(typeof(IdentifierExpression)) || child.IsType(typeof(PrimitiveExpression)) || child.IsType(typeof(NullReferenceExpression)) || diff --git a/src/Atc.XUnit/Internal/AbstractSyntaxTree/ParametersNamingMatchHelper.cs b/src/Atc.XUnit/Internal/AbstractSyntaxTree/ParametersNamingMatchHelper.cs index 3b70053a..a1ec27c2 100644 --- a/src/Atc.XUnit/Internal/AbstractSyntaxTree/ParametersNamingMatchHelper.cs +++ b/src/Atc.XUnit/Internal/AbstractSyntaxTree/ParametersNamingMatchHelper.cs @@ -366,7 +366,8 @@ private static bool ParameterCheckForDirectionExpression( ParameterInfo parameter, AstNode astNode) { - if (!astNode.IsType(typeof(DirectionExpression))) + if (!astNode.IsType(typeof(DirectionExpression)) && + !astNode.IsType(typeof(OutVarDeclarationExpression))) { return false; } diff --git a/test/Atc.Tests/Extensions/BaseTypes/DateTimeExtensionsTests.cs b/test/Atc.Tests/Extensions/BaseTypes/DateTimeExtensionsTests.cs index e243529c..f4fe4ac5 100644 --- a/test/Atc.Tests/Extensions/BaseTypes/DateTimeExtensionsTests.cs +++ b/test/Atc.Tests/Extensions/BaseTypes/DateTimeExtensionsTests.cs @@ -38,7 +38,7 @@ public void GetPrettyTimeDiff( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = start.GetPrettyTimeDiff(); @@ -57,7 +57,7 @@ public void GetPrettyTimeDiff_DecimalPrecision( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = start.GetPrettyTimeDiff(decimalPrecision); @@ -76,8 +76,8 @@ public void GetPrettyTimeDiff_EndNow( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeUiLcid); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = start.GetPrettyTimeDiff(end); @@ -96,8 +96,8 @@ public void GetPrettyTimeDiff_EndNow_DecimalPrecision( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeUiLcid); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = start.GetPrettyTimeDiff(end, decimalPrecision); @@ -133,7 +133,7 @@ public void GetWeekNumberUi( int month) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates, useUserOverride: false); var input = new DateTime(year, month, 1, 0, 0, 0); // Act @@ -210,7 +210,7 @@ public void ToLongDateStringUi( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTime.ToLongDateStringUi(); @@ -230,7 +230,7 @@ public void ToLongDateString( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTime.ToLongDateString(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); @@ -250,7 +250,7 @@ public void ToLongTimeStringUi( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTime.ToLongTimeStringUi(); @@ -270,7 +270,7 @@ public void ToLongTimeString( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTime.ToLongTimeString(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); @@ -290,7 +290,7 @@ public void ToShortDateStringUi( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTime.ToShortDateStringUi(); @@ -310,7 +310,7 @@ public void ToShortDateString( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTime.ToShortDateString(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); @@ -330,7 +330,7 @@ public void ToShortTimeStringUi( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTime.ToShortTimeStringUi(); @@ -350,7 +350,7 @@ public void ToShortTimeString( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTime.ToShortTimeString(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); @@ -370,7 +370,7 @@ public void ToLongDateStringUsingSpecificCulture( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - var cultureInfo = new CultureInfo(cultureInfoLcid); + var cultureInfo = new CultureInfo(cultureInfoLcid, useUserOverride: false); // Act var actual = dateTime.ToLongDateStringUsingSpecificCulture(cultureInfo); @@ -390,7 +390,7 @@ public void ToLongTimeStringUsingSpecificCulture( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - var cultureInfo = new CultureInfo(cultureInfoLcid); + var cultureInfo = new CultureInfo(cultureInfoLcid, useUserOverride: false); // Act var actual = dateTime.ToLongTimeStringUsingSpecificCulture(cultureInfo); @@ -410,7 +410,7 @@ public void ToShortDateStringUsingSpecificCulture( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - var cultureInfo = new CultureInfo(cultureInfoLcid); + var cultureInfo = new CultureInfo(cultureInfoLcid, useUserOverride: false); // Act var actual = dateTime.ToShortDateStringUsingSpecificCulture(cultureInfo); @@ -430,7 +430,7 @@ public void ToShortTimeStringUsingSpecificCulture( { // Arrange var dateTime = new DateTime(2023, 10, 15, 15, 30, 45, DateTimeKind.Local); - var cultureInfo = new CultureInfo(cultureInfoLcid); + var cultureInfo = new CultureInfo(cultureInfoLcid, useUserOverride: false); // Act var actual = dateTime.ToShortTimeStringUsingSpecificCulture(cultureInfo); diff --git a/test/Atc.Tests/Extensions/BaseTypes/DateTimeOffsetExtensionsTests.cs b/test/Atc.Tests/Extensions/BaseTypes/DateTimeOffsetExtensionsTests.cs index 9dc781d7..286e6207 100644 --- a/test/Atc.Tests/Extensions/BaseTypes/DateTimeOffsetExtensionsTests.cs +++ b/test/Atc.Tests/Extensions/BaseTypes/DateTimeOffsetExtensionsTests.cs @@ -33,7 +33,7 @@ public void GetPrettyTimeDiff( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = start.GetPrettyTimeDiff(); @@ -52,7 +52,7 @@ public void GetPrettyTimeDiff_DecimalPrecision( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = start.GetPrettyTimeDiff(decimalPrecision); @@ -71,8 +71,8 @@ public void GetPrettyTimeDiff_EndNow( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeUiLcid); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = start.GetPrettyTimeDiff(end); @@ -91,8 +91,8 @@ public void GetPrettyTimeDiff_EndNow_DecimalPrecision( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeUiLcid); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = start.GetPrettyTimeDiff(end, decimalPrecision); @@ -128,7 +128,7 @@ public void GetWeekNumberUi( int month) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates, useUserOverride: false); var input = new DateTimeOffset(year, month, 1, 0, 0, 0, TimeSpan.Zero); // Act @@ -266,7 +266,7 @@ public void ToLongDateStringUi( { // Arrange var dateTimeOffset = new DateTimeOffset(2023, 10, 15, 15, 30, 45, TimeSpan.Zero); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTimeOffset.ToLongDateStringUi(); @@ -286,7 +286,7 @@ public void ToLongDateString( { // Arrange var dateTimeOffset = new DateTimeOffset(2023, 10, 15, 15, 30, 45, TimeSpan.Zero); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTimeOffset.ToLongDateString(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); @@ -306,7 +306,7 @@ public void ToLongTimeStringUi( { // Arrange var dateTimeOffset = new DateTimeOffset(2023, 10, 15, 15, 30, 45, TimeSpan.Zero); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTimeOffset.ToLongTimeStringUi(); @@ -326,7 +326,7 @@ public void ToLongTimeString( { // Arrange var dateTimeOffset = new DateTimeOffset(2023, 10, 15, 15, 30, 45, TimeSpan.Zero); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTimeOffset.ToLongTimeString(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); @@ -346,7 +346,7 @@ public void ToShortDateStringUi( { // Arrange var dateTimeOffset = new DateTimeOffset(2023, 10, 15, 15, 30, 45, TimeSpan.Zero); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTimeOffset.ToShortDateStringUi(); @@ -366,7 +366,7 @@ public void ToShortDateString( { // Arrange var dateTimeOffset = new DateTimeOffset(2023, 10, 15, 15, 30, 45, TimeSpan.Zero); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTimeOffset.ToShortDateString(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); @@ -386,7 +386,7 @@ public void ToShortTimeStringUi( { // Arrange var dateTimeOffset = new DateTimeOffset(2023, 10, 15, 15, 30, 45, TimeSpan.Zero); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTimeOffset.ToShortTimeStringUi(); @@ -406,7 +406,7 @@ public void ToShortTimeString( { // Arrange var dateTimeOffset = new DateTimeOffset(2023, 10, 15, 15, 30, 45, TimeSpan.Zero); - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = dateTimeOffset.ToShortTimeString(Thread.CurrentThread.CurrentUICulture.DateTimeFormat); diff --git a/test/Atc.Tests/Extensions/BaseTypes/DecimalExtensionsTests.cs b/test/Atc.Tests/Extensions/BaseTypes/DecimalExtensionsTests.cs index 1f50a06c..ca08de5f 100644 --- a/test/Atc.Tests/Extensions/BaseTypes/DecimalExtensionsTests.cs +++ b/test/Atc.Tests/Extensions/BaseTypes/DecimalExtensionsTests.cs @@ -115,7 +115,7 @@ public void CurrencyRoundingUi( decimal input) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates, useUserOverride: false); // Act var actual = input.CurrencyRoundingUi(); diff --git a/test/Atc.Tests/Extensions/BaseTypes/DoubleExtensionsTests.cs b/test/Atc.Tests/Extensions/BaseTypes/DoubleExtensionsTests.cs index 4ba96802..bb6f5146 100644 --- a/test/Atc.Tests/Extensions/BaseTypes/DoubleExtensionsTests.cs +++ b/test/Atc.Tests/Extensions/BaseTypes/DoubleExtensionsTests.cs @@ -173,7 +173,7 @@ public void CurrencyRoundingUi( double input) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates, useUserOverride: false); // Act var actual = input.CurrencyRoundingUi(); diff --git a/test/Atc.Tests/Extensions/BaseTypes/IntegerExtensionsTests.cs b/test/Atc.Tests/Extensions/BaseTypes/IntegerExtensionsTests.cs index 4441d3f7..4f5ad47a 100644 --- a/test/Atc.Tests/Extensions/BaseTypes/IntegerExtensionsTests.cs +++ b/test/Atc.Tests/Extensions/BaseTypes/IntegerExtensionsTests.cs @@ -120,7 +120,7 @@ public void GetMonthNameByMonthNumberUi( bool pascalCased) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = input.GetMonthNameByMonthNumberUi(pascalCased); @@ -155,7 +155,7 @@ public void GetNumberOfWeeksByYearUi( int input) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates, useUserOverride: false); // Act var actual = input.GetNumberOfWeeksByYearUi(); @@ -199,7 +199,7 @@ public void GetFirstDayOfWeekNumberByYearUi( int weekNumber) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates, useUserOverride: false); var expectedDateTime = new DateTime(expectedYear, expectedMonth, expectedDay); // Act @@ -244,7 +244,7 @@ public void GetLastDayOfWeekNumberByYearUi( int weekNumber) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(GlobalizationLcidConstants.UnitedStates, useUserOverride: false); var expectedDateTime = new DateTime(expectedYear, expectedMonth, expectedDay); // Act diff --git a/test/Atc.Tests/Extensions/BaseTypes/TimeSpanExtensionsTests.cs b/test/Atc.Tests/Extensions/BaseTypes/TimeSpanExtensionsTests.cs index 465868ca..a1385e9d 100644 --- a/test/Atc.Tests/Extensions/BaseTypes/TimeSpanExtensionsTests.cs +++ b/test/Atc.Tests/Extensions/BaseTypes/TimeSpanExtensionsTests.cs @@ -81,7 +81,7 @@ public void GetPrettyTimeDiff( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = timeSpan.GetPrettyTime(); @@ -100,8 +100,8 @@ public void GetPrettyTimeUi( int arrangeLcid) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); - Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); + Thread.CurrentThread.CurrentCulture = new CultureInfo(arrangeLcid, useUserOverride: false); // Act var actual = timeSpan.GetPrettyTimeUi(); @@ -119,7 +119,7 @@ public void GetPrettyTimeDiff_DecimalPrecision( int arrangeUiLcid) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = timeSpan.GetPrettyTime(decimalPrecision); diff --git a/test/Atc.Tests/Helpers/DateTimeHelperTests.cs b/test/Atc.Tests/Helpers/DateTimeHelperTests.cs index 3c1f77af..c238adf4 100644 --- a/test/Atc.Tests/Helpers/DateTimeHelperTests.cs +++ b/test/Atc.Tests/Helpers/DateTimeHelperTests.cs @@ -26,7 +26,7 @@ public void TryParseUi( string value) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DateTimeHelper.TryParseUi(value, out _); @@ -46,7 +46,7 @@ public void TryParseUsingSpecificCulture( string value) { // Arrange - var cultureInfo = new CultureInfo(cultureLcid); + var cultureInfo = new CultureInfo(cultureLcid, useUserOverride: false); // Act var actual = DateTimeHelper.TryParseUsingSpecificCulture(value, cultureInfo, out _); @@ -78,7 +78,7 @@ public void TryParseShortDateUi( string value) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DateTimeHelper.TryParseShortDateUi(value, out _); @@ -98,7 +98,7 @@ public void TryParseShortDateUsingSpecificCulture( string value) { // Arrange - var cultureInfo = new CultureInfo(cultureLcid); + var cultureInfo = new CultureInfo(cultureLcid, useUserOverride: false); // Act var actual = DateTimeHelper.TryParseShortDateUsingSpecificCulture(value, cultureInfo, out _); @@ -130,7 +130,7 @@ public void TryParseShortTimeUi( string value) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DateTimeHelper.TryParseShortTimeUi(value, out _); @@ -150,7 +150,7 @@ public void TryParseShortTimeUsingSpecificCulture( string value) { // Arrange - var cultureInfo = new CultureInfo(cultureLcid); + var cultureInfo = new CultureInfo(cultureLcid, useUserOverride: false); // Act var actual = DateTimeHelper.TryParseShortTimeUsingSpecificCulture(value, cultureInfo, out _); @@ -182,7 +182,7 @@ public void TryParseShortTimeUiUtc( string value) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DateTimeHelper.TryParseShortTimeUiUtc(value, out _); @@ -202,7 +202,7 @@ public void TryParseShortTimeUsingSpecificCultureUtc( string value) { // Arrange - var cultureInfo = new CultureInfo(cultureLcid); + var cultureInfo = new CultureInfo(cultureLcid, useUserOverride: false); // Act var actual = DateTimeHelper.TryParseShortTimeUsingSpecificCultureUtc(value, cultureInfo, out _); diff --git a/test/Atc.Tests/Helpers/DateTimeOffsetHelperTests.cs b/test/Atc.Tests/Helpers/DateTimeOffsetHelperTests.cs index d5f5ac06..c0ffbd22 100644 --- a/test/Atc.Tests/Helpers/DateTimeOffsetHelperTests.cs +++ b/test/Atc.Tests/Helpers/DateTimeOffsetHelperTests.cs @@ -26,7 +26,7 @@ public void TryParseUi( string value) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DateTimeOffsetHelper.TryParseUi(value, out _); @@ -58,7 +58,7 @@ public void TryParseShortDateUi( string value) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DateTimeOffsetHelper.TryParseShortDateUi(value, out _); @@ -90,7 +90,7 @@ public void TryParseShortTimeUi( string value) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DateTimeOffsetHelper.TryParseShortTimeUi(value, out _); @@ -122,7 +122,7 @@ public void TryParseShortTimeUiUtc( string value) { // Arrange - Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid); + Thread.CurrentThread.CurrentUICulture = new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DateTimeOffsetHelper.TryParseShortTimeUiUtc(value, out _); @@ -148,7 +148,7 @@ public void TryParseUsingSpecificCulture( { var actual = DateTimeOffsetHelper.TryParseUsingSpecificCulture( value, - new CultureInfo(lcid), + new CultureInfo(lcid, useUserOverride: false), out _); Assert.Equal(expected, actual); } @@ -170,7 +170,7 @@ public void TryParseShortDateUsingSpecificCulture( { var actual = DateTimeOffsetHelper.TryParseShortDateUsingSpecificCulture( value, - new CultureInfo(lcid), + new CultureInfo(lcid, useUserOverride: false), out _); Assert.Equal(expected, actual); } @@ -195,7 +195,7 @@ public void TryParseShortTimeUsingSpecificCulture( { var actual = DateTimeOffsetHelper.TryParseShortTimeUsingSpecificCulture( value, - new CultureInfo(lcid), + new CultureInfo(lcid, useUserOverride: false), out _); Assert.Equal(expected, actual); } @@ -220,7 +220,7 @@ public void TryParseShortTimeUsingSpecificCultureUtc( { var actual = DateTimeOffsetHelper.TryParseShortTimeUsingSpecificCultureUtc( value, - new CultureInfo(lcid), + new CultureInfo(lcid, useUserOverride: false), out _); Assert.Equal(expected, actual); } diff --git a/test/Atc.Tests/Helpers/Enums/DayOfWeekHelperTests.cs b/test/Atc.Tests/Helpers/Enums/DayOfWeekHelperTests.cs index e77a3e0d..8028d50b 100644 --- a/test/Atc.Tests/Helpers/Enums/DayOfWeekHelperTests.cs +++ b/test/Atc.Tests/Helpers/Enums/DayOfWeekHelperTests.cs @@ -45,7 +45,7 @@ public void GetDescription( // Arrange var culture = arrangeUiLcid == 0 ? GlobalizationConstants.EnglishCultureInfo - : new CultureInfo(arrangeUiLcid); + : new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DayOfWeekHelper.GetDescription(input, culture); @@ -64,7 +64,7 @@ public void GetDescriptions( CultureInfo? culture = null; if (arrangeUiLcid > 0) { - culture = new CultureInfo(arrangeUiLcid); + culture = new CultureInfo(arrangeUiLcid, useUserOverride: false); } // Act @@ -91,7 +91,7 @@ public void TryParseDescription( // Arrange var culture = arrangeUiLcid == 0 ? GlobalizationConstants.EnglishCultureInfo - : new CultureInfo(arrangeUiLcid); + : new CultureInfo(arrangeUiLcid, useUserOverride: false); // Act var actual = DayOfWeekHelper.TryParseDescription(input, out var dayOfWeek, culture); diff --git a/test/Atc.Tests/Helpers/NumberHelperTests.cs b/test/Atc.Tests/Helpers/NumberHelperTests.cs index 30a44399..97b509c1 100644 --- a/test/Atc.Tests/Helpers/NumberHelperTests.cs +++ b/test/Atc.Tests/Helpers/NumberHelperTests.cs @@ -52,7 +52,7 @@ public void IsNumber_CultureInfo( bool expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.IsNumber(value, new CultureInfo(cultureInfoLcid))); + => Assert.Equal(expected, NumberHelper.IsNumber(value, new CultureInfo(cultureInfoLcid, useUserOverride: false))); [Theory] [InlineData(true, "123")] @@ -120,7 +120,7 @@ public void IsDecimal_CultureInfo( bool expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.IsDecimal(value, new CultureInfo(cultureInfoLcid))); + => Assert.Equal(expected, NumberHelper.IsDecimal(value, new CultureInfo(cultureInfoLcid, useUserOverride: false))); [Theory] [InlineData(123.45, "123.45")] @@ -161,7 +161,7 @@ public void ParseToDecimal_CultureInfo( decimal expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.ParseToDecimal(value, new CultureInfo(cultureInfoLcid))); + => Assert.Equal(expected, NumberHelper.ParseToDecimal(value, new CultureInfo(cultureInfoLcid, useUserOverride: false))); [Theory] [InlineData(true, "123.45")] @@ -202,7 +202,7 @@ public void TryParseToDecimal_CultureInfo( bool expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.TryParseToDecimal(value, new CultureInfo(cultureInfoLcid), out _)); + => Assert.Equal(expected, NumberHelper.TryParseToDecimal(value, new CultureInfo(cultureInfoLcid, useUserOverride: false), out _)); [Theory] [InlineData(true, "123.45")] @@ -243,7 +243,7 @@ public void IsDouble_CultureInfo( bool expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.IsDouble(value, new CultureInfo(cultureInfoLcid))); + => Assert.Equal(expected, NumberHelper.IsDouble(value, new CultureInfo(cultureInfoLcid, useUserOverride: false))); [Theory] [InlineData(123.45, "123.45")] @@ -284,7 +284,7 @@ public void ParseToDouble_CultureInfo( double expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.ParseToDouble(value, new CultureInfo(cultureInfoLcid))); + => Assert.Equal(expected, NumberHelper.ParseToDouble(value, new CultureInfo(cultureInfoLcid, useUserOverride: false))); [Theory] [InlineData(true, "123.45")] @@ -325,7 +325,7 @@ public void TryParseToDouble_CultureInfo( bool expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.TryParseToDouble(value, new CultureInfo(cultureInfoLcid), out _)); + => Assert.Equal(expected, NumberHelper.TryParseToDouble(value, new CultureInfo(cultureInfoLcid, useUserOverride: false), out _)); [Theory] [InlineData(true, "123.45")] @@ -366,7 +366,7 @@ public void IsFloat_CultureInfo( bool expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.IsFloat(value, new CultureInfo(cultureInfoLcid))); + => Assert.Equal(expected, NumberHelper.IsFloat(value, new CultureInfo(cultureInfoLcid, useUserOverride: false))); [Theory] [InlineData(123.45f, "123.45")] @@ -407,7 +407,7 @@ public void ParseToFloat_CultureInfo( float expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.ParseToFloat(value, new CultureInfo(cultureInfoLcid))); + => Assert.Equal(expected, NumberHelper.ParseToFloat(value, new CultureInfo(cultureInfoLcid, useUserOverride: false))); [Theory] [InlineData(true, "123.45")] @@ -448,5 +448,5 @@ public void TryParseToFloat_CultureInfo( bool expected, string value, int cultureInfoLcid) - => Assert.Equal(expected, NumberHelper.TryParseToFloat(value, new CultureInfo(cultureInfoLcid), out _)); + => Assert.Equal(expected, NumberHelper.TryParseToFloat(value, new CultureInfo(cultureInfoLcid, useUserOverride: false), out _)); } \ No newline at end of file