diff options
author | 杨宇千 <crupest@outlook.com> | 2019-10-25 18:36:02 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-10-25 18:36:02 +0800 |
commit | 5790142f81f2a94ad073834b1534acbf9b02ea3c (patch) | |
tree | c6ec0a916c78a02b36113fb62f0e919019df6cfc /Timeline.Tests/Helpers | |
parent | 681e2cc9ecaeefd883a7c6645374926c184fba5d (diff) | |
download | timeline-5790142f81f2a94ad073834b1534acbf9b02ea3c.tar.gz timeline-5790142f81f2a94ad073834b1534acbf9b02ea3c.tar.bz2 timeline-5790142f81f2a94ad073834b1534acbf9b02ea3c.zip |
Add NeutralResourcesLanguage. Conform to best practices.
Diffstat (limited to 'Timeline.Tests/Helpers')
-rw-r--r-- | Timeline.Tests/Helpers/UseCultureAttribute.cs | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Timeline.Tests/Helpers/UseCultureAttribute.cs b/Timeline.Tests/Helpers/UseCultureAttribute.cs new file mode 100644 index 00000000..f0064c01 --- /dev/null +++ b/Timeline.Tests/Helpers/UseCultureAttribute.cs @@ -0,0 +1,91 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Reflection; +using System.Threading; +using Xunit.Sdk; + +// Copied from https://github.com/xunit/samples.xunit/blob/master/UseCulture/UseCultureAttribute.cs + +/// <summary> +/// Apply this attribute to your test method to replace the +/// <see cref="Thread.CurrentThread" /> <see cref="CultureInfo.CurrentCulture" /> and +/// <see cref="CultureInfo.CurrentUICulture" /> with another culture. +/// </summary> +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] +public class UseCultureAttribute : BeforeAfterTestAttribute +{ + readonly Lazy<CultureInfo> culture; + readonly Lazy<CultureInfo> uiCulture; + + CultureInfo originalCulture; + CultureInfo originalUICulture; + + /// <summary> + /// Replaces the culture and UI culture of the current thread with + /// <paramref name="culture" /> + /// </summary> + /// <param name="culture">The name of the culture.</param> + /// <remarks> + /// <para> + /// This constructor overload uses <paramref name="culture" /> for both + /// <see cref="Culture" /> and <see cref="UICulture" />. + /// </para> + /// </remarks> + public UseCultureAttribute(string culture) + : this(culture, culture) { } + + /// <summary> + /// Replaces the culture and UI culture of the current thread with + /// <paramref name="culture" /> and <paramref name="uiCulture" /> + /// </summary> + /// <param name="culture">The name of the culture.</param> + /// <param name="uiCulture">The name of the UI culture.</param> + public UseCultureAttribute(string culture, string uiCulture) + { + this.culture = new Lazy<CultureInfo>(() => new CultureInfo(culture, false)); + this.uiCulture = new Lazy<CultureInfo>(() => new CultureInfo(uiCulture, false)); + } + + /// <summary> + /// Gets the culture. + /// </summary> + public CultureInfo Culture { get { return culture.Value; } } + + /// <summary> + /// Gets the UI culture. + /// </summary> + public CultureInfo UICulture { get { return uiCulture.Value; } } + + /// <summary> + /// Stores the current <see cref="Thread.CurrentPrincipal" /> + /// <see cref="CultureInfo.CurrentCulture" /> and <see cref="CultureInfo.CurrentUICulture" /> + /// and replaces them with the new cultures defined in the constructor. + /// </summary> + /// <param name="methodUnderTest">The method under test</param> + public override void Before(MethodInfo methodUnderTest) + { + originalCulture = Thread.CurrentThread.CurrentCulture; + originalUICulture = Thread.CurrentThread.CurrentUICulture; + + Thread.CurrentThread.CurrentCulture = Culture; + Thread.CurrentThread.CurrentUICulture = UICulture; + + CultureInfo.CurrentCulture.ClearCachedData(); + CultureInfo.CurrentUICulture.ClearCachedData(); + } + + /// <summary> + /// Restores the original <see cref="CultureInfo.CurrentCulture" /> and + /// <see cref="CultureInfo.CurrentUICulture" /> to <see cref="Thread.CurrentPrincipal" /> + /// </summary> + /// <param name="methodUnderTest">The method under test</param> + public override void After(MethodInfo methodUnderTest) + { + Thread.CurrentThread.CurrentCulture = originalCulture; + Thread.CurrentThread.CurrentUICulture = originalUICulture; + + CultureInfo.CurrentCulture.ClearCachedData(); + CultureInfo.CurrentUICulture.ClearCachedData(); + } +} |