From 4ba159afe791acda823b9564e54e628d388012b2 Mon Sep 17 00:00:00 2001 From: damianedwards Date: Wed, 20 May 2015 11:56:47 -0700 Subject: [PATCH] Removed Moq from tests & enabled .NET Core - Introduced AssemblyWrapper to enable testing - Cleaned up properties on ResourceManagerStringLocalizer - #15 Change "Strategy" to "Provider" - #19 --- samples/LocalizationSample/Startup.cs | 12 +-- ...ptLanguageHeaderRequestCultureProvider.cs} | 2 +- ...egy.cs => CookieRequestCultureProvider.cs} | 2 +- ...egy.cs => CustomRequestCultureProvider.cs} | 14 +-- .../IRequestCultureFeature.cs | 6 +- ...Strategy.cs => IRequestCultureProvider.cs} | 8 +- ...s => QueryStringRequestCultureProvider.cs} | 2 +- .../RequestCultureFeature.cs | 6 +- ...eStrategy.cs => RequestCultureProvider.cs} | 5 +- .../RequestLocalizationMiddleware.cs | 12 +-- .../RequestLocalizationOptions.cs | 20 ++--- .../Internal/AssemblyWrapper.cs | 23 +++++ .../ResourceManagerStringLocalizer.cs | 62 +++++++------ .../ResourceManagerStringLocalizerFactory.cs | 8 +- ...sourceManagerWithCultureStringLocalizer.cs | 15 +++- .../ResourceManagerStringLocalizerTest.cs | 87 ++++++++----------- .../project.json | 25 +++--- 17 files changed, 166 insertions(+), 143 deletions(-) rename src/Microsoft.AspNet.Localization/{AcceptLanguageHeaderRequestCultureStrategy.cs => AcceptLanguageHeaderRequestCultureProvider.cs} (97%) rename src/Microsoft.AspNet.Localization/{CookieRequestCultureStrategy.cs => CookieRequestCultureProvider.cs} (98%) rename src/Microsoft.AspNet.Localization/{CustomRequestCultureStrategy.cs => CustomRequestCultureProvider.cs} (63%) rename src/Microsoft.AspNet.Localization/{IRequestCultureStrategy.cs => IRequestCultureProvider.cs} (75%) rename src/Microsoft.AspNet.Localization/{QueryStringRequestCultureStrategy.cs => QueryStringRequestCultureProvider.cs} (97%) rename src/Microsoft.AspNet.Localization/{RequestCultureStrategy.cs => RequestCultureProvider.cs} (93%) create mode 100644 src/Microsoft.Framework.Localization/Internal/AssemblyWrapper.cs diff --git a/samples/LocalizationSample/Startup.cs b/samples/LocalizationSample/Startup.cs index ea9fb7c6c3..b67fa550c0 100644 --- a/samples/LocalizationSample/Startup.cs +++ b/samples/LocalizationSample/Startup.cs @@ -36,9 +36,9 @@ namespace LocalizationSample //} }; - // Optionally create an app-specific strategy with just a delegate, e.g. look up user preference from DB. - // Inserting it as position 0 ensures it has priority over any of the default strategies. - //options.RequestCultureStrategies.Insert(0, new CustomRequestCultureStrategy(async context => + // Optionally create an app-specific provider with just a delegate, e.g. look up user preference from DB. + // Inserting it as position 0 ensures it has priority over any of the default providers. + //options.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(async context => //{ //})); @@ -74,13 +74,13 @@ $@" function useCookie() {{ var culture = document.getElementById('culture'); var uiCulture = document.getElementById('uiCulture'); - var cookieValue = '{CookieRequestCultureStrategy.DefaultCookieName}=c='+culture.options[culture.selectedIndex].value+'|uic='+uiCulture.options[uiCulture.selectedIndex].value; + var cookieValue = '{CookieRequestCultureProvider.DefaultCookieName}=c='+culture.options[culture.selectedIndex].value+'|uic='+uiCulture.options[uiCulture.selectedIndex].value; document.cookie = cookieValue; window.location = window.location.href.split('?')[0]; }} function clearCookie() {{ - document.cookie='{CookieRequestCultureStrategy.DefaultCookieName}=""""'; + document.cookie='{CookieRequestCultureProvider.DefaultCookieName}=""""'; }} @@ -101,7 +101,7 @@ $@" await context.Response.WriteAsync(""); await context.Response.WriteAsync("
"); await context.Response.WriteAsync(""); - await context.Response.WriteAsync($""); + await context.Response.WriteAsync($""); await context.Response.WriteAsync($""); await context.Response.WriteAsync($""); await context.Response.WriteAsync($""); diff --git a/src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureProvider.cs similarity index 97% rename from src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureStrategy.cs rename to src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureProvider.cs index eef5cf798b..46fbed8cc2 100644 --- a/src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/AcceptLanguageHeaderRequestCultureProvider.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Localization /// /// Determines the culture information for a request via the value of the Accept-Language header. /// - public class AcceptLanguageHeaderRequestCultureStrategy : RequestCultureStrategy + public class AcceptLanguageHeaderRequestCultureProvider : RequestCultureProvider { /// /// The maximum number of values in the Accept-Language header to attempt to create a diff --git a/src/Microsoft.AspNet.Localization/CookieRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/CookieRequestCultureProvider.cs similarity index 98% rename from src/Microsoft.AspNet.Localization/CookieRequestCultureStrategy.cs rename to src/Microsoft.AspNet.Localization/CookieRequestCultureProvider.cs index e1422656d7..a9a20b03a7 100644 --- a/src/Microsoft.AspNet.Localization/CookieRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/CookieRequestCultureProvider.cs @@ -12,7 +12,7 @@ namespace Microsoft.AspNet.Localization /// /// Determines the culture information for a request via the value of a cookie. /// - public class CookieRequestCultureStrategy : RequestCultureStrategy + public class CookieRequestCultureProvider : RequestCultureProvider { private static readonly char[] _cookieSeparator = new[] { '|' }; private static readonly string _culturePrefix = "c="; diff --git a/src/Microsoft.AspNet.Localization/CustomRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/CustomRequestCultureProvider.cs similarity index 63% rename from src/Microsoft.AspNet.Localization/CustomRequestCultureStrategy.cs rename to src/Microsoft.AspNet.Localization/CustomRequestCultureProvider.cs index 65546bed44..0bbb94f42b 100644 --- a/src/Microsoft.AspNet.Localization/CustomRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/CustomRequestCultureProvider.cs @@ -11,23 +11,23 @@ namespace Microsoft.AspNet.Localization /// /// Determines the culture information for a request via the configured delegate. /// - public class CustomRequestCultureStrategy : RequestCultureStrategy + public class CustomRequestCultureProvider : RequestCultureProvider { - private readonly Func> _strategy; + private readonly Func> _provider; /// - /// Creates a new using the specified delegate. + /// Creates a new using the specified delegate. /// - /// The strategy delegate. - public CustomRequestCultureStrategy([NotNull] Func> strategy) + /// The provider delegate. + public CustomRequestCultureProvider([NotNull] Func> provider) { - _strategy = strategy; + _provider = provider; } /// public override Task DetermineRequestCulture([NotNull] HttpContext httpContext) { - return _strategy(httpContext); + return _provider(httpContext); } } } diff --git a/src/Microsoft.AspNet.Localization/IRequestCultureFeature.cs b/src/Microsoft.AspNet.Localization/IRequestCultureFeature.cs index 44cc487a63..4ea6aed42c 100644 --- a/src/Microsoft.AspNet.Localization/IRequestCultureFeature.cs +++ b/src/Microsoft.AspNet.Localization/IRequestCultureFeature.cs @@ -14,10 +14,10 @@ namespace Microsoft.AspNet.Localization RequestCulture RequestCulture { get; } /// - /// The that determined the request's culture information. - /// If the value is null then no strategy was used and the request's culture was set to the value of + /// The that determined the request's culture information. + /// If the value is null then no provider was used and the request's culture was set to the value of /// . /// - IRequestCultureStrategy Strategy { get; } + IRequestCultureProvider Provider { get; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Localization/IRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/IRequestCultureProvider.cs similarity index 75% rename from src/Microsoft.AspNet.Localization/IRequestCultureStrategy.cs rename to src/Microsoft.AspNet.Localization/IRequestCultureProvider.cs index 91001e57cc..4af4908b2e 100644 --- a/src/Microsoft.AspNet.Localization/IRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/IRequestCultureProvider.cs @@ -7,17 +7,17 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Localization { /// - /// Represents a strategy for determining the culture information of an . + /// Represents a provider for determining the culture information of an . /// - public interface IRequestCultureStrategy + public interface IRequestCultureProvider { /// - /// Implements the strategy to determine the culture of the given request. + /// Implements the provider to determine the culture of the given request. /// /// The for the request. /// /// The determined . - /// Returns null if the strategy couldn't determine a . + /// Returns null if the provider couldn't determine a . /// Task DetermineRequestCulture(HttpContext httpContext); } diff --git a/src/Microsoft.AspNet.Localization/QueryStringRequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/QueryStringRequestCultureProvider.cs similarity index 97% rename from src/Microsoft.AspNet.Localization/QueryStringRequestCultureStrategy.cs rename to src/Microsoft.AspNet.Localization/QueryStringRequestCultureProvider.cs index 5c6ebab146..0b5f0aef16 100644 --- a/src/Microsoft.AspNet.Localization/QueryStringRequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/QueryStringRequestCultureProvider.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Localization /// /// Determines the culture information for a request via values in the query string. /// - public class QueryStringRequestCultureStrategy : RequestCultureStrategy + public class QueryStringRequestCultureProvider : RequestCultureProvider { /// /// The key that contains the culture name. diff --git a/src/Microsoft.AspNet.Localization/RequestCultureFeature.cs b/src/Microsoft.AspNet.Localization/RequestCultureFeature.cs index 76505b4759..f512cba2aa 100644 --- a/src/Microsoft.AspNet.Localization/RequestCultureFeature.cs +++ b/src/Microsoft.AspNet.Localization/RequestCultureFeature.cs @@ -14,16 +14,16 @@ namespace Microsoft.AspNet.Localization /// Creates a new with the specified . /// /// The . - public RequestCultureFeature([NotNull] RequestCulture requestCulture, IRequestCultureStrategy strategy) + public RequestCultureFeature([NotNull] RequestCulture requestCulture, IRequestCultureProvider provider) { RequestCulture = requestCulture; - Strategy = strategy; + Provider = provider; } /// public RequestCulture RequestCulture { get; } /// - public IRequestCultureStrategy Strategy { get; } + public IRequestCultureProvider Provider { get; } } } diff --git a/src/Microsoft.AspNet.Localization/RequestCultureStrategy.cs b/src/Microsoft.AspNet.Localization/RequestCultureProvider.cs similarity index 93% rename from src/Microsoft.AspNet.Localization/RequestCultureStrategy.cs rename to src/Microsoft.AspNet.Localization/RequestCultureProvider.cs index 6d30805119..234d46dc22 100644 --- a/src/Microsoft.AspNet.Localization/RequestCultureStrategy.cs +++ b/src/Microsoft.AspNet.Localization/RequestCultureProvider.cs @@ -3,14 +3,13 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Localization { /// - /// An abstract base class strategy for determining the culture information of an . + /// An abstract base class provider for determining the culture information of an . /// - public abstract class RequestCultureStrategy : IRequestCultureStrategy + public abstract class RequestCultureProvider : IRequestCultureProvider { /// /// The current options for the . diff --git a/src/Microsoft.AspNet.Localization/RequestLocalizationMiddleware.cs b/src/Microsoft.AspNet.Localization/RequestLocalizationMiddleware.cs index 54600e17a4..4dc60d7a86 100644 --- a/src/Microsoft.AspNet.Localization/RequestLocalizationMiddleware.cs +++ b/src/Microsoft.AspNet.Localization/RequestLocalizationMiddleware.cs @@ -40,23 +40,23 @@ namespace Microsoft.AspNet.Localization var requestCulture = _options.DefaultRequestCulture ?? new RequestCulture(CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture); - IRequestCultureStrategy winningStrategy = null; + IRequestCultureProvider winningProvider = null; - if (_options.RequestCultureStrategies != null) + if (_options.RequestCultureProviders != null) { - foreach (var strategy in _options.RequestCultureStrategies) + foreach (var provider in _options.RequestCultureProviders) { - var result = await strategy.DetermineRequestCulture(context); + var result = await provider.DetermineRequestCulture(context); if (result != null) { requestCulture = result; - winningStrategy = strategy; + winningProvider = provider; break; } } } - context.SetFeature(new RequestCultureFeature(requestCulture, winningStrategy)); + context.SetFeature(new RequestCultureFeature(requestCulture, winningProvider)); SetCurrentThreadCulture(requestCulture); diff --git a/src/Microsoft.AspNet.Localization/RequestLocalizationOptions.cs b/src/Microsoft.AspNet.Localization/RequestLocalizationOptions.cs index 74eb335921..a6e4bcc932 100644 --- a/src/Microsoft.AspNet.Localization/RequestLocalizationOptions.cs +++ b/src/Microsoft.AspNet.Localization/RequestLocalizationOptions.cs @@ -19,17 +19,17 @@ namespace Microsoft.AspNet.Localization { DefaultRequestCulture = new RequestCulture(CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture); - RequestCultureStrategies = new List + RequestCultureProviders = new List { - new QueryStringRequestCultureStrategy { Options = this }, - new CookieRequestCultureStrategy { Options = this }, - new AcceptLanguageHeaderRequestCultureStrategy { Options = this } + new QueryStringRequestCultureProvider { Options = this }, + new CookieRequestCultureProvider { Options = this }, + new AcceptLanguageHeaderRequestCultureProvider { Options = this } }; } /// /// The default to use. This value will be used if none of the configured - /// options result in a non-null result. + /// options result in a non-null result. /// Defaults to set to /// and set to . /// @@ -54,16 +54,16 @@ namespace Microsoft.AspNet.Localization public IList SupportedUICultures { get; set; } /// - /// An ordered list of strategies used to determine a request's culture information. The first strategy that + /// An ordered list of providers used to determine a request's culture information. The first provider that /// returns a non-null result for a given request will be used. /// Defaults to the following: /// - /// - /// - /// + /// + /// + /// /// /// [SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly", Justification = "Improves usability")] - public IList RequestCultureStrategies { get; set; } + public IList RequestCultureProviders { get; set; } } } diff --git a/src/Microsoft.Framework.Localization/Internal/AssemblyWrapper.cs b/src/Microsoft.Framework.Localization/Internal/AssemblyWrapper.cs new file mode 100644 index 0000000000..ca95f85540 --- /dev/null +++ b/src/Microsoft.Framework.Localization/Internal/AssemblyWrapper.cs @@ -0,0 +1,23 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Reflection; +using Microsoft.Framework.Internal; + +namespace Microsoft.Framework.Localization.Internal +{ + public class AssemblyWrapper + { + public AssemblyWrapper([NotNull] Assembly assembly) + { + Assembly = assembly; + } + + public Assembly Assembly { get; } + + public virtual string FullName => Assembly.FullName; + + public virtual Stream GetManifestResourceStream(string name) => Assembly.GetManifestResourceStream(name); + } +} diff --git a/src/Microsoft.Framework.Localization/ResourceManagerStringLocalizer.cs b/src/Microsoft.Framework.Localization/ResourceManagerStringLocalizer.cs index 1ff97dfb8d..bbcf7498e9 100644 --- a/src/Microsoft.Framework.Localization/ResourceManagerStringLocalizer.cs +++ b/src/Microsoft.Framework.Localization/ResourceManagerStringLocalizer.cs @@ -9,6 +9,7 @@ using System.Globalization; using System.Reflection; using System.Resources; using Microsoft.Framework.Internal; +using Microsoft.Framework.Localization.Internal; namespace Microsoft.Framework.Localization { @@ -18,12 +19,16 @@ namespace Microsoft.Framework.Localization /// public class ResourceManagerStringLocalizer : IStringLocalizer { + private static readonly ConcurrentDictionary> _resourceNamesCache = + new ConcurrentDictionary>(); + private readonly ConcurrentDictionary _missingManifestCache = new ConcurrentDictionary(); - private static readonly ConcurrentDictionary> _resourceNamesCache = - new ConcurrentDictionary>(); - + private readonly ResourceManager _resourceManager; + private readonly AssemblyWrapper _resourceAssemblyWrapper; + private readonly string _resourceBaseName; + /// /// Creates a new . /// @@ -34,26 +39,23 @@ namespace Microsoft.Framework.Localization [NotNull] ResourceManager resourceManager, [NotNull] Assembly resourceAssembly, [NotNull] string baseName) + : this(resourceManager, new AssemblyWrapper(resourceAssembly), baseName) { - ResourceManager = resourceManager; - ResourceAssembly = resourceAssembly; - ResourceBaseName = baseName; + } /// - /// The to read strings from. + /// Intended for testing purposes only. /// - protected ResourceManager ResourceManager { get; } - - /// - /// The that contains the strings as embedded resources. - /// - protected Assembly ResourceAssembly { get; } - - /// - /// The base name of the embedded resource in the that contains the strings. - /// - protected string ResourceBaseName { get; } + public ResourceManagerStringLocalizer( + [NotNull] ResourceManager resourceManager, + [NotNull] AssemblyWrapper resourceAssemblyWrapper, + [NotNull] string baseName) + { + _resourceAssemblyWrapper = resourceAssemblyWrapper; + _resourceManager = resourceManager; + _resourceBaseName = baseName; + } /// public virtual LocalizedString this[[NotNull] string name] @@ -84,16 +86,15 @@ namespace Microsoft.Framework.Localization public IStringLocalizer WithCulture(CultureInfo culture) { return culture == null - ? new ResourceManagerStringLocalizer(ResourceManager, ResourceAssembly, ResourceBaseName) - : new ResourceManagerWithCultureStringLocalizer( - ResourceManager, - ResourceAssembly, - ResourceBaseName, + ? new ResourceManagerStringLocalizer(_resourceManager, _resourceAssemblyWrapper, _resourceBaseName) + : new ResourceManagerWithCultureStringLocalizer(_resourceManager, + _resourceAssemblyWrapper, + _resourceBaseName, culture); } /// - /// Gets a resource string from the and returns null instead of + /// Gets a resource string from the and returns null instead of /// throwing exceptions if a match isn't found. /// /// The name of the string resource. @@ -110,7 +111,7 @@ namespace Microsoft.Framework.Localization try { - return culture == null ? ResourceManager.GetString(name) : ResourceManager.GetString(name, culture); + return culture == null ? _resourceManager.GetString(name) : _resourceManager.GetString(name, culture); } catch (MissingManifestResourceException) { @@ -150,10 +151,7 @@ namespace Microsoft.Framework.Localization } // Internal to allow testing - internal static void ClearResourceNamesCache() - { - _resourceNamesCache.Clear(); - } + internal static void ClearResourceNamesCache() => _resourceNamesCache.Clear(); private IEnumerable GetResourceNamesFromCultureHierarchy(CultureInfo startingCulture) { @@ -186,19 +184,19 @@ namespace Microsoft.Framework.Localization private IList GetResourceNamesForCulture(CultureInfo culture) { - var resourceStreamName = ResourceBaseName; + var resourceStreamName = _resourceBaseName; if (!string.IsNullOrEmpty(culture.Name)) { resourceStreamName += "." + culture.Name; } resourceStreamName += ".resources"; - var cacheKey = $"assembly={ResourceAssembly.FullName};resourceStreamName={resourceStreamName}"; + var cacheKey = $"assembly={_resourceAssemblyWrapper.FullName};resourceStreamName={resourceStreamName}"; var cultureResourceNames = _resourceNamesCache.GetOrAdd(cacheKey, key => { var names = new List(); - using (var cultureResourceStream = ResourceAssembly.GetManifestResourceStream(key)) + using (var cultureResourceStream = _resourceAssemblyWrapper.GetManifestResourceStream(key)) using (var resources = new ResourceReader(cultureResourceStream)) { foreach (DictionaryEntry entry in resources) diff --git a/src/Microsoft.Framework.Localization/ResourceManagerStringLocalizerFactory.cs b/src/Microsoft.Framework.Localization/ResourceManagerStringLocalizerFactory.cs index 3039a9d377..92899e15a4 100644 --- a/src/Microsoft.Framework.Localization/ResourceManagerStringLocalizerFactory.cs +++ b/src/Microsoft.Framework.Localization/ResourceManagerStringLocalizerFactory.cs @@ -5,6 +5,7 @@ using System; using System.Reflection; using System.Resources; using Microsoft.Framework.Internal; +using Microsoft.Framework.Localization.Internal; using Microsoft.Framework.Runtime; namespace Microsoft.Framework.Localization @@ -34,7 +35,7 @@ namespace Microsoft.Framework.Localization public IStringLocalizer Create([NotNull] Type resourceSource) { var typeInfo = resourceSource.GetTypeInfo(); - var assembly = typeInfo.Assembly; + var assembly = new AssemblyWrapper(typeInfo.Assembly); var baseName = typeInfo.FullName; return new ResourceManagerStringLocalizer(new ResourceManager(resourceSource), assembly, baseName); } @@ -49,7 +50,10 @@ namespace Microsoft.Framework.Localization { var assembly = Assembly.Load(new AssemblyName(location ?? _applicationEnvironment.ApplicationName)); - return new ResourceManagerStringLocalizer(new ResourceManager(baseName, assembly), assembly, baseName); + return new ResourceManagerStringLocalizer( + new ResourceManager(baseName, assembly), + new AssemblyWrapper(assembly), + baseName); } } } \ No newline at end of file diff --git a/src/Microsoft.Framework.Localization/ResourceManagerWithCultureStringLocalizer.cs b/src/Microsoft.Framework.Localization/ResourceManagerWithCultureStringLocalizer.cs index c8d2f36dbb..1260e26579 100644 --- a/src/Microsoft.Framework.Localization/ResourceManagerWithCultureStringLocalizer.cs +++ b/src/Microsoft.Framework.Localization/ResourceManagerWithCultureStringLocalizer.cs @@ -1,12 +1,12 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.Globalization; using System.Reflection; using System.Resources; using Microsoft.Framework.Internal; +using Microsoft.Framework.Localization.Internal; namespace Microsoft.Framework.Localization { @@ -35,6 +35,19 @@ namespace Microsoft.Framework.Localization _culture = culture; } + /// + /// Intended for testing purposes only. + /// + public ResourceManagerWithCultureStringLocalizer( + [NotNull] ResourceManager resourceManager, + [NotNull] AssemblyWrapper assemblyWrapper, + [NotNull] string baseName, + [NotNull] CultureInfo culture) + : base(resourceManager, assemblyWrapper, baseName) + { + _culture = culture; + } + /// public override LocalizedString this[[NotNull] string name] { diff --git a/test/Microsoft.Framework.Localization.Test/ResourceManagerStringLocalizerTest.cs b/test/Microsoft.Framework.Localization.Test/ResourceManagerStringLocalizerTest.cs index ce88695724..410fc2c50f 100644 --- a/test/Microsoft.Framework.Localization.Test/ResourceManagerStringLocalizerTest.cs +++ b/test/Microsoft.Framework.Localization.Test/ResourceManagerStringLocalizerTest.cs @@ -6,7 +6,7 @@ using System.IO; using System.Linq; using System.Reflection; using System.Resources; -using Moq; +using Microsoft.Framework.Localization.Internal; using Xunit; namespace Microsoft.Framework.Localization.Test @@ -18,19 +18,11 @@ namespace Microsoft.Framework.Localization.Test { // Arrange ResourceManagerStringLocalizer.ClearResourceNamesCache(); - var resourceManager = new Mock(); - var resourceAssembly = new Mock(); - resourceAssembly.Setup(rm => rm.GetManifestResourceStream(It.IsAny())) - .Returns(() => MakeResourceStream()); var baseName = "test"; - var localizer1 = new ResourceManagerStringLocalizer( - resourceManager.Object, - resourceAssembly.Object, - baseName); - var localizer2 = new ResourceManagerStringLocalizer( - resourceManager.Object, - resourceAssembly.Object, - baseName); + var resourceAssembly = new TestAssemblyWrapper(); + var resourceManager = new TestResourceManager(baseName, resourceAssembly.Assembly); + var localizer1 = new ResourceManagerStringLocalizer(resourceManager, resourceAssembly, baseName); + var localizer2 = new ResourceManagerStringLocalizer(resourceManager, resourceAssembly, baseName); // Act for (int i = 0; i < 5; i++) @@ -41,9 +33,7 @@ namespace Microsoft.Framework.Localization.Test // Assert var expectedCallCount = GetCultureInfoDepth(CultureInfo.CurrentUICulture); - resourceAssembly.Verify( - rm => rm.GetManifestResourceStream(It.IsAny()), - Times.Exactly(expectedCallCount)); + Assert.Equal(expectedCallCount, resourceAssembly.GetManifestResourceStreamCallCount); } [Fact] @@ -51,24 +41,13 @@ namespace Microsoft.Framework.Localization.Test { // Arrange ResourceManagerStringLocalizer.ClearResourceNamesCache(); - var resourceManager = new Mock(); - var resourceAssembly1 = new Mock(); - resourceAssembly1.CallBase = true; - var resourceAssembly2 = new Mock(); - resourceAssembly2.CallBase = true; - resourceAssembly1.Setup(rm => rm.GetManifestResourceStream(It.IsAny())) - .Returns(() => MakeResourceStream()); - resourceAssembly2.Setup(rm => rm.GetManifestResourceStream(It.IsAny())) - .Returns(() => MakeResourceStream()); var baseName = "test"; - var localizer1 = new ResourceManagerStringLocalizer( - resourceManager.Object, - resourceAssembly1.Object, - baseName); - var localizer2 = new ResourceManagerStringLocalizer( - resourceManager.Object, - resourceAssembly2.Object, - baseName); + var resourceAssembly1 = new TestAssemblyWrapper("Assembly1"); + var resourceAssembly2 = new TestAssemblyWrapper("Assembly2"); + var resourceManager1 = new TestResourceManager(baseName, resourceAssembly1.Assembly); + var resourceManager2 = new TestResourceManager(baseName, resourceAssembly2.Assembly); + var localizer1 = new ResourceManagerStringLocalizer(resourceManager1, resourceAssembly1, baseName); + var localizer2 = new ResourceManagerStringLocalizer(resourceManager2, resourceAssembly2, baseName); // Act localizer1.ToList(); @@ -76,12 +55,8 @@ namespace Microsoft.Framework.Localization.Test // Assert var expectedCallCount = GetCultureInfoDepth(CultureInfo.CurrentUICulture); - resourceAssembly1.Verify( - rm => rm.GetManifestResourceStream(It.IsAny()), - Times.Exactly(expectedCallCount)); - resourceAssembly2.Verify( - rm => rm.GetManifestResourceStream(It.IsAny()), - Times.Exactly(expectedCallCount)); + Assert.Equal(expectedCallCount, resourceAssembly1.GetManifestResourceStreamCallCount); + Assert.Equal(expectedCallCount, resourceAssembly2.GetManifestResourceStreamCallCount); } private static Stream MakeResourceStream() @@ -114,25 +89,35 @@ namespace Microsoft.Framework.Localization.Test return result; } - public class TestAssembly1 : Assembly + public class TestResourceManager : ResourceManager { - public override string FullName + public TestResourceManager(string baseName, Assembly assembly) + : base(baseName, assembly) { - get - { - return nameof(TestAssembly1); - } + } + + public override string GetString(string name, CultureInfo culture) => null; } - public class TestAssembly2 : Assembly + public class TestAssemblyWrapper : AssemblyWrapper { - public override string FullName + private readonly string _name; + + public TestAssemblyWrapper(string name = nameof(TestAssemblyWrapper)) + : base(typeof(TestAssemblyWrapper).GetTypeInfo().Assembly) { - get - { - return nameof(TestAssembly2); - } + _name = name; + } + + public int GetManifestResourceStreamCallCount { get; private set; } + + public override string FullName => _name; + + public override Stream GetManifestResourceStream(string name) + { + GetManifestResourceStreamCallCount++; + return MakeResourceStream(); } } } diff --git a/test/Microsoft.Framework.Localization.Test/project.json b/test/Microsoft.Framework.Localization.Test/project.json index 45f8dd778c..420577a021 100644 --- a/test/Microsoft.Framework.Localization.Test/project.json +++ b/test/Microsoft.Framework.Localization.Test/project.json @@ -1,16 +1,17 @@ { - "dependencies": { - "Moq": "4.2.1502.911", - "xunit": "2.1.0-*", - "xunit.runner.dnx": "2.1.0-*", - "Microsoft.Framework.Localization": "1.0.0-*" - }, + "dependencies": { + "xunit": "2.1.0-*", + "xunit.runner.dnx": "2.1.0-*", + "Microsoft.Framework.Localization": "1.0.0-*", + "System.Reflection": "4.0.10-*" + }, - "commands": { - "test": "xunit.runner.dnx" - }, + "commands": { + "test": "xunit.runner.dnx" + }, - "frameworks": { - "dnx451": { } - } + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } }
Winning strategy:{requestCultureFeature.Strategy.GetType().Name}
Winning provider:{requestCultureFeature.Provider.GetType().Name}
{SR["Current request culture:"]}{requestCulture.Culture.DisplayName} ({requestCulture.Culture})
{SR["Current request UI culture:"]}{requestCulture.UICulture.DisplayName} ({requestCulture.UICulture})
{SR["Current thread culture:"]}{CultureInfo.CurrentCulture.DisplayName} ({CultureInfo.CurrentCulture})