diff --git a/src/Exercism.Tests/Exercism.Tests.csproj b/src/Exercism.Tests/Exercism.Tests.csproj index 048e4d0..a0c7a79 100644 --- a/src/Exercism.Tests/Exercism.Tests.csproj +++ b/src/Exercism.Tests/Exercism.Tests.csproj @@ -18,4 +18,8 @@ + + + + diff --git a/src/Exercism.Tests/UseCultureAttribute.cs b/src/Exercism.Tests/UseCultureAttribute.cs new file mode 100644 index 0000000..84e35d8 --- /dev/null +++ b/src/Exercism.Tests/UseCultureAttribute.cs @@ -0,0 +1,49 @@ +using System; +using System.Globalization; +using System.Reflection; +using Xunit.Sdk; + +namespace Exercism.Tests +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class UseCultureAttribute : BeforeAfterTestAttribute + { + private readonly CultureInfo _culture; + private readonly CultureInfo _uiCulture; + + private CultureInfo _originalCulture; + private CultureInfo _originalUiCulture; + + public UseCultureAttribute() + { + _culture = CultureInfo.InvariantCulture; + _uiCulture = CultureInfo.InvariantCulture; + } + + public UseCultureAttribute(string culture) + : this(culture, culture) + { + } + + public UseCultureAttribute(string culture, string uiCulture) + { + _culture = new CultureInfo(culture, false); + _uiCulture = new CultureInfo(uiCulture, false); + } + + public override void Before(MethodInfo methodUnderTest) + { + _originalCulture = CultureInfo.CurrentCulture; + _originalUiCulture = CultureInfo.CurrentUICulture; + + CultureInfo.CurrentCulture = _culture; + CultureInfo.CurrentUICulture = _uiCulture; + } + + public override void After(MethodInfo methodUnderTest) + { + CultureInfo.CurrentCulture = _originalCulture; + CultureInfo.CurrentUICulture = _originalUiCulture; + } + } +} \ No newline at end of file diff --git a/tests/Exercism.Tests.Tests/UseCultureAttributeTests.cs b/tests/Exercism.Tests.Tests/UseCultureAttributeTests.cs new file mode 100644 index 0000000..a92a2e2 --- /dev/null +++ b/tests/Exercism.Tests.Tests/UseCultureAttributeTests.cs @@ -0,0 +1,40 @@ +using System.Globalization; +using Xunit; + +namespace Exercism.Tests.Tests +{ + [UseCulture("en-US")] + public class UseCultureAttributeTests + { + [Fact] + [UseCulture("nl-NL")] + public void SpecifyCulture() + { + Assert.Equal("nl-NL", CultureInfo.CurrentCulture.Name); + Assert.Equal("nl-NL", CultureInfo.CurrentUICulture.Name); + } + + [Fact] + [UseCulture("nl-NL", "nl-BE")] + public void SpecifyCultureAndUiCulture() + { + Assert.Equal("nl-NL", CultureInfo.CurrentCulture.Name); + Assert.Equal("nl-BE", CultureInfo.CurrentUICulture.Name); + } + + [Fact] + [UseCulture] + public void DontSpecifyCulture() + { + Assert.Equal(CultureInfo.InvariantCulture, CultureInfo.CurrentCulture); + Assert.Equal(CultureInfo.InvariantCulture, CultureInfo.CurrentUICulture); + } + + [Fact] + public void InheritCultureFromClass() + { + Assert.Equal("en-US", CultureInfo.CurrentCulture.Name); + Assert.Equal("en-US", CultureInfo.CurrentUICulture.Name); + } + } +}