diff --git a/src/Abstractions/src/Asp.Versioning.Abstractions/AdvertiseApiVersionsAttribute.cs b/src/Abstractions/src/Asp.Versioning.Abstractions/AdvertiseApiVersionsAttribute.cs index eed5d62c..9d879940 100644 --- a/src/Abstractions/src/Asp.Versioning.Abstractions/AdvertiseApiVersionsAttribute.cs +++ b/src/Abstractions/src/Asp.Versioning.Abstractions/AdvertiseApiVersionsAttribute.cs @@ -97,5 +97,5 @@ public bool Deprecated } /// - public override int GetHashCode() => HashCode.Combine( GetHashCode(), Deprecated ); + public override int GetHashCode() => HashCode.Combine( base.GetHashCode(), Deprecated ); } \ No newline at end of file diff --git a/src/Abstractions/src/Asp.Versioning.Abstractions/Asp.Versioning.Abstractions.csproj b/src/Abstractions/src/Asp.Versioning.Abstractions/Asp.Versioning.Abstractions.csproj index cf2411e7..fdfb8220 100644 --- a/src/Abstractions/src/Asp.Versioning.Abstractions/Asp.Versioning.Abstractions.csproj +++ b/src/Abstractions/src/Asp.Versioning.Abstractions/Asp.Versioning.Abstractions.csproj @@ -1,7 +1,7 @@  - 6.2.0 + 6.2.1 6.2.0.0 netstandard1.0;netstandard2.0;net6.0 API Versioning Abstractions diff --git a/src/Abstractions/src/Asp.Versioning.Abstractions/ReleaseNotes.txt b/src/Abstractions/src/Asp.Versioning.Abstractions/ReleaseNotes.txt index 5f282702..40820b51 100644 --- a/src/Abstractions/src/Asp.Versioning.Abstractions/ReleaseNotes.txt +++ b/src/Abstractions/src/Asp.Versioning.Abstractions/ReleaseNotes.txt @@ -1 +1 @@ - \ No newline at end of file +[Fixed #932](https://github.com/dotnet/aspnet-api-versioning/issues/932) \ No newline at end of file diff --git a/src/Abstractions/test/Asp.Versioning.Abstractions.Tests/ApiVersionFormatProviderTest.cs b/src/Abstractions/test/Asp.Versioning.Abstractions.Tests/ApiVersionFormatProviderTest.cs index 64b440a8..7b8d2245 100644 --- a/src/Abstractions/test/Asp.Versioning.Abstractions.Tests/ApiVersionFormatProviderTest.cs +++ b/src/Abstractions/test/Asp.Versioning.Abstractions.Tests/ApiVersionFormatProviderTest.cs @@ -41,6 +41,7 @@ public void get_format_should_return_expected_format_provider() } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_allow_null_or_empty_format_string( ApiVersionFormatProvider provider ) { @@ -56,6 +57,7 @@ public void format_should_allow_null_or_empty_format_string( ApiVersionFormatPro } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_full_formatted_string_without_optional_components( ApiVersionFormatProvider provider ) { @@ -70,6 +72,7 @@ public void format_should_return_full_formatted_string_without_optional_componen } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_full_formatted_string_with_optional_components( ApiVersionFormatProvider provider ) { @@ -84,6 +87,7 @@ public void format_should_return_full_formatted_string_with_optional_components( } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_original_string_format_when_argument_cannot_be_formatted( ApiVersionFormatProvider provider ) { @@ -113,6 +117,7 @@ public void format_should_not_allow_malformed_literal_string( ApiVersionFormatPr } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( GroupVersionFormatData ) )] public void format_should_return_formatted_group_version_string( ApiVersionFormatProvider provider, string format ) { @@ -129,6 +134,7 @@ public void format_should_return_formatted_group_version_string( ApiVersionForma } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_formatted_minor_version_string( ApiVersionFormatProvider provider ) { @@ -143,6 +149,7 @@ public void format_should_return_formatted_minor_version_string( ApiVersionForma } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_formatted_major_version_string( ApiVersionFormatProvider provider ) { @@ -157,6 +164,7 @@ public void format_should_return_formatted_major_version_string( ApiVersionForma } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_formatted_major_and_minor_version_string( ApiVersionFormatProvider provider ) { @@ -171,6 +179,7 @@ public void format_should_return_formatted_major_and_minor_version_string( ApiVe } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_formatted_short_version_string( ApiVersionFormatProvider provider ) { @@ -185,6 +194,7 @@ public void format_should_return_formatted_short_version_string( ApiVersionForma } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_formatted_long_version_string( ApiVersionFormatProvider provider ) { @@ -199,6 +209,7 @@ public void format_should_return_formatted_long_version_string( ApiVersionFormat } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( FormatProvidersData ) )] public void format_should_return_formatted_status_string( ApiVersionFormatProvider provider ) { @@ -213,6 +224,7 @@ public void format_should_return_formatted_status_string( ApiVersionFormatProvid } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( PaddedMinorVersionFormatData ) )] public void format_should_return_formatted_minor_version_with_padding_string( ApiVersionFormatProvider provider, string format ) { @@ -233,6 +245,7 @@ public void format_should_return_formatted_minor_version_with_padding_string( Ap } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( PaddedMajorVersionFormatData ) )] public void format_should_return_formatted_major_version_with_padding_string( ApiVersionFormatProvider provider, string format ) { @@ -253,6 +266,7 @@ public void format_should_return_formatted_major_version_with_padding_string( Ap } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( CustomFormatData ) )] public void format_should_return_custom_format_string( Func format, string expected ) { @@ -268,6 +282,7 @@ public void format_should_return_custom_format_string( Func } [Theory] + [AssumeCulture( "en-us" )] [MemberData( nameof( MultipleFormatParameterData ) )] public void format_should_return_formatted_string_with_multiple_parameters( ApiVersionFormatProvider provider, string format, object secondArgument, string expected ) { @@ -284,6 +299,7 @@ public void format_should_return_formatted_string_with_multiple_parameters( ApiV } [Fact] + [AssumeCulture( "en-us" )] public void format_should_return_formatted_string_with_escape_sequence() { // arrange diff --git a/src/Abstractions/test/Asp.Versioning.Abstractions.Tests/AssumeCultureAttribute.cs b/src/Abstractions/test/Asp.Versioning.Abstractions.Tests/AssumeCultureAttribute.cs new file mode 100644 index 00000000..9c956d87 --- /dev/null +++ b/src/Abstractions/test/Asp.Versioning.Abstractions.Tests/AssumeCultureAttribute.cs @@ -0,0 +1,40 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. + +namespace Asp.Versioning; + +using System.Globalization; +using System.Reflection; +using Xunit.Sdk; +using static System.AttributeTargets; +using static System.Threading.Thread; + +/// +/// Allows a test method to assume that it is running in a specific locale. +/// +[AttributeUsage( Class | Method, AllowMultiple = false, Inherited = true )] +public sealed class AssumeCultureAttribute : BeforeAfterTestAttribute +{ + private CultureInfo originalCulture; + private CultureInfo originalUICulture; + + public AssumeCultureAttribute( string name ) => Name = name; + + public string Name { get; } + + public override void Before( MethodInfo methodUnderTest ) + { + originalCulture = CurrentThread.CurrentCulture; + originalUICulture = CurrentThread.CurrentUICulture; + + var culture = CultureInfo.CreateSpecificCulture( Name ); + + CurrentThread.CurrentCulture = culture; + CurrentThread.CurrentUICulture = culture; + } + + public override void After( MethodInfo methodUnderTest ) + { + CurrentThread.CurrentCulture = originalCulture; + CurrentThread.CurrentUICulture = originalUICulture; + } +} \ No newline at end of file