From aab051a20f7a9c6ffe68d2219a9f736d3bc15898 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 29 Dec 2015 13:18:45 -0800 Subject: [PATCH] Rename DictionaryBasedValueProvider to RouteValueProvider Fixes #3629 --- .../ModelBinding/IValueProviderFactory.cs | 3 + .../Internal/MvcCoreMvcOptionsSetup.cs | 2 +- .../ModelBinding/JQueryFormValueProvider.cs | 6 +- .../JQueryFormValueProviderFactory.cs | 10 +- ...ValueProvider.cs => RouteValueProvider.cs} | 15 +- ...actory.cs => RouteValueProviderFactory.cs} | 8 +- ...derTests.cs => RouteValueProviderTests.cs} | 60 +++---- .../ModelBinding/TestValueProvider.cs | 7 +- .../MvcOptionsSetupTest.cs | 154 ++++++++++-------- 9 files changed, 144 insertions(+), 121 deletions(-) rename src/Microsoft.AspNet.Mvc.Core/ModelBinding/{DictionaryBasedValueProvider.cs => RouteValueProvider.cs} (84%) rename src/Microsoft.AspNet.Mvc.Core/ModelBinding/{RouteValueValueProviderFactory.cs => RouteValueProviderFactory.cs} (65%) rename test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/{DictionaryBasedValueProviderTests.cs => RouteValueProviderTests.cs} (68%) diff --git a/src/Microsoft.AspNet.Mvc.Abstractions/ModelBinding/IValueProviderFactory.cs b/src/Microsoft.AspNet.Mvc.Abstractions/ModelBinding/IValueProviderFactory.cs index 08b05f1599..2af59b25f9 100644 --- a/src/Microsoft.AspNet.Mvc.Abstractions/ModelBinding/IValueProviderFactory.cs +++ b/src/Microsoft.AspNet.Mvc.Abstractions/ModelBinding/IValueProviderFactory.cs @@ -5,6 +5,9 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Mvc.ModelBinding { + /// + /// A factory for creating instances. + /// public interface IValueProviderFactory { /// diff --git a/src/Microsoft.AspNet.Mvc.Core/Internal/MvcCoreMvcOptionsSetup.cs b/src/Microsoft.AspNet.Mvc.Core/Internal/MvcCoreMvcOptionsSetup.cs index 457b153491..7fb6a96f1c 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Internal/MvcCoreMvcOptionsSetup.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Internal/MvcCoreMvcOptionsSetup.cs @@ -51,7 +51,7 @@ namespace Microsoft.AspNet.Mvc.Internal options.OutputFormatters.Add(new StreamOutputFormatter()); // Set up ValueProviders - options.ValueProviderFactories.Add(new RouteValueValueProviderFactory()); + options.ValueProviderFactories.Add(new RouteValueProviderFactory()); options.ValueProviderFactories.Add(new QueryStringValueProviderFactory()); options.ValueProviderFactories.Add(new FormValueProviderFactory()); options.ValueProviderFactories.Add(new JQueryFormValueProviderFactory()); diff --git a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/JQueryFormValueProvider.cs b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/JQueryFormValueProvider.cs index c30ac13e48..b1ca4db1c4 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/JQueryFormValueProvider.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/JQueryFormValueProvider.cs @@ -9,7 +9,7 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Mvc.ModelBinding { /// - /// An for form data stored in an . + /// An for jQuery formatted form data. /// public class JQueryFormValueProvider : BindingSourceValueProvider, IEnumerableValueProvider { @@ -17,10 +17,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding private PrefixContainer _prefixContainer; /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The of the data. - /// A delegate which provides the values to wrap. + /// The values. /// The culture to return with ValueProviderResult instances. public JQueryFormValueProvider( BindingSource bindingSource, diff --git a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/JQueryFormValueProviderFactory.cs b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/JQueryFormValueProviderFactory.cs index 1c812b5790..7cf1303f4c 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/JQueryFormValueProviderFactory.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/JQueryFormValueProviderFactory.cs @@ -13,8 +13,12 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Mvc.ModelBinding { + /// + /// A for . + /// public class JQueryFormValueProviderFactory : IValueProviderFactory { + /// public Task GetValueProviderAsync(ActionContext context) { if (context == null) @@ -34,9 +38,9 @@ namespace Microsoft.AspNet.Mvc.ModelBinding private static async Task CreateValueProviderAsync(HttpRequest request) { return new JQueryFormValueProvider( - BindingSource.Form, - await GetValueCollectionAsync(request), - CultureInfo.CurrentCulture); + BindingSource.Form, + await GetValueCollectionAsync(request), + CultureInfo.CurrentCulture); } private static async Task> GetValueCollectionAsync(HttpRequest request) diff --git a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/DictionaryBasedValueProvider.cs b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueProvider.cs similarity index 84% rename from src/Microsoft.AspNet.Mvc.Core/ModelBinding/DictionaryBasedValueProvider.cs rename to src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueProvider.cs index ace0d4cf33..65b3bbf9e1 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/DictionaryBasedValueProvider.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueProvider.cs @@ -2,28 +2,27 @@ // 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 Microsoft.AspNet.Routing; namespace Microsoft.AspNet.Mvc.ModelBinding { /// - /// An adapter for data stored in an - /// . + /// An adapter for data stored in an . /// - public class DictionaryBasedValueProvider : BindingSourceValueProvider + public class RouteValueProvider : BindingSourceValueProvider { - private readonly IDictionary _values; + private readonly RouteValueDictionary _values; private PrefixContainer _prefixContainer; /// - /// Creates a new . + /// Creates a new . /// /// The of the data. /// The values. - public DictionaryBasedValueProvider( + public RouteValueProvider( BindingSource bindingSource, - IDictionary values) + RouteValueDictionary values) : base(bindingSource) { if (bindingSource == null) diff --git a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueValueProviderFactory.cs b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueProviderFactory.cs similarity index 65% rename from src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueValueProviderFactory.cs rename to src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueProviderFactory.cs index 2a0e0c12c5..803b2d5426 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueValueProviderFactory.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/RouteValueProviderFactory.cs @@ -6,8 +6,12 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Mvc.ModelBinding { - public class RouteValueValueProviderFactory : IValueProviderFactory + /// + /// A for creating instances. + /// + public class RouteValueProviderFactory : IValueProviderFactory { + /// public Task GetValueProviderAsync(ActionContext context) { if (context == null) @@ -15,7 +19,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding throw new ArgumentNullException(nameof(context)); } - return Task.FromResult(new DictionaryBasedValueProvider( + return Task.FromResult(new RouteValueProvider( BindingSource.Path, context.RouteData.Values)); } diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/DictionaryBasedValueProviderTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/RouteValueProviderTests.cs similarity index 68% rename from test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/DictionaryBasedValueProviderTests.cs rename to test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/RouteValueProviderTests.cs index 01dd0baeca..f1397c661b 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/DictionaryBasedValueProviderTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/RouteValueProviderTests.cs @@ -3,22 +3,22 @@ using System; using System.Collections.Generic; -using System.Threading.Tasks; +using Microsoft.AspNet.Routing; using Xunit; namespace Microsoft.AspNet.Mvc.ModelBinding { - public class DictionaryBasedValueProviderTests + public class RouteValueProviderTests { [Fact] public void GetValueProvider_ReturnsNull_WhenKeyIsNotFound() { // Arrange - var values = new Dictionary(StringComparer.OrdinalIgnoreCase) + var values = new RouteValueDictionary(new Dictionary { { "test-key", "value" } - }; - var provider = new DictionaryBasedValueProvider(BindingSource.Query, values); + }); + var provider = new RouteValueProvider(BindingSource.Query, values); // Act var result = provider.GetValue("not-test-key"); @@ -31,11 +31,11 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void GetValueProvider_ReturnsValue_IfKeyIsPresent() { // Arrange - var values = new Dictionary(StringComparer.OrdinalIgnoreCase) + var values = new RouteValueDictionary(new Dictionary { { "test-key", "test-value" } - }; - var provider = new DictionaryBasedValueProvider(BindingSource.Query, values); + }); + var provider = new RouteValueProvider(BindingSource.Query, values); // Act var result = provider.GetValue("test-key"); @@ -48,11 +48,11 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void ContainsPrefix_ReturnsNullValue_IfKeyIsPresent() { // Arrange - var values = new Dictionary(StringComparer.OrdinalIgnoreCase) + var values = new RouteValueDictionary(new Dictionary { { "test-key", null } - }; - var provider = new DictionaryBasedValueProvider(BindingSource.Query, values); + }); + var provider = new RouteValueProvider(BindingSource.Query, values); // Act var result = provider.GetValue("test-key"); @@ -68,13 +68,13 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void ContainsPrefix_ReturnsTrue_ForKnownPrefixes(string prefix) { // Arrange - var values = new Dictionary + var values = new RouteValueDictionary(new Dictionary { { "foo", 1 }, { "bar.baz", 1 }, - }; + }); - var valueProvider = new DictionaryBasedValueProvider(BindingSource.Query, values); + var valueProvider = new RouteValueProvider(BindingSource.Query, values); // Act var result = valueProvider.ContainsPrefix(prefix); @@ -89,13 +89,13 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void GetValue_ReturnsCorrectValue_ForKnownKeys(string prefix, string expectedValue) { // Arrange - var values = new Dictionary + var values = new RouteValueDictionary(new Dictionary { { "bar", 1 }, { "bar.baz", 2 }, - }; + }); - var valueProvider = new DictionaryBasedValueProvider(BindingSource.Query, values); + var valueProvider = new RouteValueProvider(BindingSource.Query, values); // Act var result = valueProvider.GetValue(prefix); @@ -108,12 +108,12 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void GetValue_DoesNotReturnAValue_ForAKeyPrefix() { // Arrange - var values = new Dictionary + var values = new RouteValueDictionary(new Dictionary { { "bar.baz", 2 }, - }; + }); - var valueProvider = new DictionaryBasedValueProvider(BindingSource.Query, values); + var valueProvider = new RouteValueProvider(BindingSource.Query, values); // Act var result = valueProvider.GetValue("bar"); @@ -126,11 +126,11 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void ContainsPrefix_ReturnsFalse_IfKeyIsNotPresent() { // Arrange - var values = new Dictionary(StringComparer.OrdinalIgnoreCase) + var values = new RouteValueDictionary(new Dictionary { { "test-key", "test-value" } - }; - var provider = new DictionaryBasedValueProvider(BindingSource.Query, values); + }); + var provider = new RouteValueProvider(BindingSource.Query, values); // Act var result = provider.ContainsPrefix("not-test-key"); @@ -143,11 +143,11 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void ContainsPrefix_ReturnsTrue_IfKeyIsPresent() { // Arrange - var values = new Dictionary(StringComparer.OrdinalIgnoreCase) + var values = new RouteValueDictionary(new Dictionary { { "test-key", "test-value" } - }; - var provider = new DictionaryBasedValueProvider(BindingSource.Query, values); + }); + var provider = new RouteValueProvider(BindingSource.Query, values); // Act var result = provider.ContainsPrefix("test-key"); @@ -160,8 +160,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void FilterInclude() { // Arrange - var values = new Dictionary(StringComparer.OrdinalIgnoreCase); - var provider = new DictionaryBasedValueProvider(BindingSource.Query, values); + var values = new RouteValueDictionary(); + var provider = new RouteValueProvider(BindingSource.Query, values); var bindingSource = new BindingSource( BindingSource.Query.Id, @@ -181,8 +181,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding public void FilterExclude() { // Arrange - var values = new Dictionary(StringComparer.OrdinalIgnoreCase); - var provider = new DictionaryBasedValueProvider(BindingSource.Query, values); + var values = new RouteValueDictionary(); + var provider = new RouteValueProvider(BindingSource.Query, values); var bindingSource = new BindingSource( "Test", diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/TestValueProvider.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/TestValueProvider.cs index 1c379fb004..b4d02cbf23 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/TestValueProvider.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/TestValueProvider.cs @@ -2,10 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using Microsoft.AspNet.Routing; namespace Microsoft.AspNet.Mvc.ModelBinding { - public class TestValueProvider : DictionaryBasedValueProvider + public class TestValueProvider : RouteValueProvider { public static readonly BindingSource TestBindingSource = new BindingSource( id: "Test", @@ -14,12 +15,12 @@ namespace Microsoft.AspNet.Mvc.ModelBinding isFromRequest: true); public TestValueProvider(IDictionary values) - : base(TestBindingSource, values) + : base(TestBindingSource, new RouteValueDictionary(values)) { } public TestValueProvider(BindingSource bindingSource, IDictionary values) - : base(bindingSource, values) + : base(bindingSource, new RouteValueDictionary(values)) { } } diff --git a/test/Microsoft.AspNet.Mvc.Test/MvcOptionsSetupTest.cs b/test/Microsoft.AspNet.Mvc.Test/MvcOptionsSetupTest.cs index cea9e9c1a0..49e1c5dcaf 100644 --- a/test/Microsoft.AspNet.Mvc.Test/MvcOptionsSetupTest.cs +++ b/test/Microsoft.AspNet.Mvc.Test/MvcOptionsSetupTest.cs @@ -4,24 +4,25 @@ using System; using System.IO; using System.Linq; +using System.Threading; +using System.Xml; using System.Xml.Linq; using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.Formatters; using Microsoft.AspNet.Mvc.Internal; using Microsoft.AspNet.Mvc.ModelBinding; +using Microsoft.AspNet.Mvc.ModelBinding.Metadata; using Microsoft.AspNet.Mvc.ModelBinding.Validation; using Microsoft.AspNet.Mvc.Razor; using Microsoft.Extensions.CompilationAbstractions; -using Microsoft.Extensions.PlatformAbstractions; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.Extensions.PlatformAbstractions; using Moq; using Newtonsoft.Json.Linq; using Xunit; -using Microsoft.Extensions.Logging; -using System.Threading; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Mvc.ModelBinding.Metadata; namespace Microsoft.AspNet.Mvc { @@ -45,19 +46,18 @@ namespace Microsoft.AspNet.Mvc var options = GetOptions(); // Assert - var i = 0; - Assert.Equal(11, options.ModelBinders.Count); - Assert.IsType(typeof(BinderTypeBasedModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(ServicesModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(BodyModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(HeaderModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(SimpleTypeModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(CancellationTokenModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(ByteArrayModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(FormFileModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(FormCollectionModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(GenericModelBinder), options.ModelBinders[i++]); - Assert.IsType(typeof(MutableObjectModelBinder), options.ModelBinders[i++]); + Assert.Collection(options.ModelBinders, + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder), + binder => Assert.IsType(binder)); } [Fact] @@ -68,11 +68,11 @@ namespace Microsoft.AspNet.Mvc // Assert var valueProviders = options.ValueProviderFactories; - Assert.Equal(4, valueProviders.Count); - Assert.IsType(valueProviders[0]); - Assert.IsType(valueProviders[1]); - Assert.IsType(valueProviders[2]); - Assert.IsType(valueProviders[3]); + Assert.Collection(valueProviders, + provider => Assert.IsType(provider), + provider => Assert.IsType(provider), + provider => Assert.IsType(provider), + provider => Assert.IsType(provider)); } [Fact] @@ -82,11 +82,11 @@ namespace Microsoft.AspNet.Mvc var options = GetOptions(); // Assert - Assert.Equal(4, options.OutputFormatters.Count); - Assert.IsType(options.OutputFormatters[0]); - Assert.IsType(options.OutputFormatters[1]); - Assert.IsType(options.OutputFormatters[2]); - Assert.IsType(options.OutputFormatters[3]); + Assert.Collection(options.OutputFormatters, + formatter => Assert.IsType(formatter), + formatter => Assert.IsType(formatter), + formatter => Assert.IsType(formatter), + formatter => Assert.IsType(formatter)); } [Fact] @@ -96,9 +96,9 @@ namespace Microsoft.AspNet.Mvc var options = GetOptions(); // Assert - Assert.Equal(2, options.InputFormatters.Count); - Assert.IsType(options.InputFormatters[0]); - Assert.IsType(options.InputFormatters[1]); + Assert.Collection(options.InputFormatters, + formatter => Assert.IsType(formatter), + formatter => Assert.IsType(formatter)); } [Fact] @@ -108,9 +108,9 @@ namespace Microsoft.AspNet.Mvc var options = GetOptions(); // Assert - Assert.Equal(2, options.ModelValidatorProviders.Count); - Assert.IsType(options.ModelValidatorProviders[0]); - Assert.IsType(options.ModelValidatorProviders[1]); + Assert.Collection(options.ModelValidatorProviders, + validator => Assert.IsType(validator), + validator => Assert.IsType(validator)); } [Fact] @@ -120,10 +120,10 @@ namespace Microsoft.AspNet.Mvc var options = GetOptions(AddDnxServices); // Assert - Assert.Equal(3, options.ClientModelValidatorProviders.Count); - Assert.IsType(options.ClientModelValidatorProviders[0]); - Assert.IsType(options.ClientModelValidatorProviders[1]); - Assert.IsType(options.ClientModelValidatorProviders[2]); + Assert.Collection(options.ClientModelValidatorProviders, + validator => Assert.IsType(validator), + validator => Assert.IsType(validator), + validator => Assert.IsType(validator)); } [Fact] @@ -148,39 +148,51 @@ namespace Microsoft.AspNet.Mvc // Assert var providers = options.ModelMetadataDetailsProviders; - Assert.Equal(12, providers.Count); - var i = 0; - - Assert.IsType(providers[i++]); - Assert.IsType(providers[i++]); - - var excludeFilter = Assert.IsType(providers[i++]); - Assert.Equal(typeof(Type), excludeFilter.Type); - - excludeFilter = Assert.IsType(providers[i++]); - Assert.Equal(typeof(Uri), excludeFilter.Type); - - excludeFilter = Assert.IsType(providers[i++]); - Assert.Equal(typeof(CancellationToken), excludeFilter.Type); - - excludeFilter = Assert.IsType(providers[i++]); - Assert.Equal(typeof(IFormFile), excludeFilter.Type); - - excludeFilter = Assert.IsType(providers[i++]); - Assert.Equal(typeof(IFormCollection), excludeFilter.Type); - - Assert.IsType(providers[i++]); - - excludeFilter = Assert.IsType(providers[i++]); - Assert.Equal(typeof(JToken), excludeFilter.Type); - - Assert.IsType(providers[i++]); - - excludeFilter = Assert.IsType(providers[i++]); - Assert.Equal(typeof(XObject).FullName, excludeFilter.FullTypeName); - - excludeFilter = Assert.IsType(providers[i++]); - Assert.Equal("System.Xml.XmlNode", excludeFilter.FullTypeName); + Assert.Collection(providers, + provider => Assert.IsType(provider), + provider => Assert.IsType(provider), + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(Type), excludeFilter.Type); + }, + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(Uri), excludeFilter.Type); + }, + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(CancellationToken), excludeFilter.Type); + }, + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(IFormFile), excludeFilter.Type); + }, + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(IFormCollection), excludeFilter.Type); + }, + provider => Assert.IsType(provider), + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(JToken), excludeFilter.Type); + }, + provider => Assert.IsType(provider), + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(XObject).FullName, excludeFilter.FullTypeName); + }, + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(XmlNode).FullName, excludeFilter.FullTypeName); + }); } [Fact]