/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/Test/Core/Assert/UseCultureAttribute.cs
101 строка
4 KB
Tomas Matousek
Move
23 окт 2020, 21:06
23 окт 2020, 21:06
d49cd2b
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System; using System.Globalization; using System.Reflection; using System.Threading; using Xunit.Sdk; namespace Roslyn.Test.Utilities { /// <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> /// <remarks> /// This code was adapted from /// https://github.com/xunit/samples.xunit/blob/5de2967/UseCulture/UseCultureAttribute.cs. /// The original code is (c) 2014 Outercurve Foundation and licensed under the Apache License, /// Version 2.0. /// </remarks> [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class UseCultureAttribute : BeforeAfterTestAttribute { private readonly Lazy<CultureInfo> _culture; private readonly Lazy<CultureInfo> _uiCulture; private CultureInfo _originalCulture; private 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) { _culture = new Lazy<CultureInfo>(() => new CultureInfo(culture, useUserOverride: false)); _uiCulture = new Lazy<CultureInfo>(() => new CultureInfo(uiCulture, useUserOverride: false)); } /// <summary> /// Gets the culture. /// </summary> public CultureInfo Culture => _culture.Value; /// <summary> /// Gets the UI culture. /// </summary> public CultureInfo UICulture => _uiCulture.Value; /// <summary> /// Stores the current <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 = CultureInfo.CurrentCulture; _originalUICulture = CultureInfo.CurrentUICulture; CultureInfo.CurrentCulture = Culture; CultureInfo.CurrentUICulture = UICulture; CultureInfo.CurrentCulture.ClearCachedData(); CultureInfo.CurrentUICulture.ClearCachedData(); } /// <summary> /// Restores the original <see cref="CultureInfo.CurrentCulture" /> and /// <see cref="CultureInfo.CurrentUICulture" />. /// </summary> /// <param name="methodUnderTest">The method under test</param> public override void After(MethodInfo methodUnderTest) { CultureInfo.CurrentCulture = _originalCulture; CultureInfo.CurrentUICulture = _originalUICulture; CultureInfo.CurrentCulture.ClearCachedData(); CultureInfo.CurrentUICulture.ClearCachedData(); } } }