File: Infrastructure\ConfigureCompatibilityOptionsTest.cs
Web Access
Project: src\src\Mvc\Mvc.Core\test\Microsoft.AspNetCore.Mvc.Core.Test.csproj (Microsoft.AspNetCore.Mvc.Core.Test)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
 
#pragma warning disable ASP5001 // Type or member is obsolete
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
 
[System.Obsolete]
public class ConfigureCompatibilityOptionsTest
{
    [Fact]
    public void PostConfigure_NoValueForProperty_DoesNothing()
    {
        // Arrange
        var configure = Create(CompatibilityVersion.Version_3_0, new Dictionary<string, object>());
 
        var options = new TestOptions();
 
        // Act
        configure.PostConfigure(Options.DefaultName, options);
 
        // Assert
        Assert.False(options.TestProperty);
    }
 
    [Fact]
    public void PostConfigure_ValueIsSet_DoesNothing()
    {
        // Arrange
        var configure = Create(
            CompatibilityVersion.Version_3_0,
            new Dictionary<string, object>
            {
                    { nameof(TestOptions.TestProperty), true },
            });
 
        var options = new TestOptions()
        {
            TestProperty = false,
        };
 
        // Act
        configure.PostConfigure(Options.DefaultName, options);
 
        // Assert
        Assert.False(options.TestProperty);
    }
 
    [Fact]
    public void PostConfigure_ValueNotSet_SetsValue()
    {
        // Arrange
        var configure = Create(
            CompatibilityVersion.Version_3_0,
            new Dictionary<string, object>
            {
                    { nameof(TestOptions.TestProperty), true },
            });
 
        var options = new TestOptions();
 
        // Act
        configure.PostConfigure(Options.DefaultName, options);
 
        // Assert
        Assert.True(options.TestProperty);
    }
 
    private static ConfigureCompatibilityOptions<TestOptions> Create(
        CompatibilityVersion version,
        IReadOnlyDictionary<string, object> defaultValues)
    {
        var compatibilityOptions = Options.Create(new MvcCompatibilityOptions() { CompatibilityVersion = version });
        return new TestConfigure(NullLoggerFactory.Instance, compatibilityOptions, defaultValues);
    }
 
    private class TestOptions : IEnumerable<ICompatibilitySwitch>
    {
        private readonly CompatibilitySwitch<bool> _testProperty;
 
        private readonly ICompatibilitySwitch[] _switches;
 
        public TestOptions()
        {
            _testProperty = new CompatibilitySwitch<bool>(nameof(TestProperty));
            _switches = new ICompatibilitySwitch[] { _testProperty };
        }
 
        public bool TestProperty
        {
            get => _testProperty.Value;
            set => _testProperty.Value = value;
        }
 
        public IEnumerator<ICompatibilitySwitch> GetEnumerator()
        {
            return ((IEnumerable<ICompatibilitySwitch>)_switches).GetEnumerator();
        }
 
        IEnumerator IEnumerable.GetEnumerator() => _switches.GetEnumerator();
    }
 
    private class TestConfigure : ConfigureCompatibilityOptions<TestOptions>
    {
        public TestConfigure(
            ILoggerFactory loggerFactory,
            IOptions<MvcCompatibilityOptions> compatibilityOptions,
            IReadOnlyDictionary<string, object> defaultValues)
            : base(loggerFactory, compatibilityOptions)
        {
            DefaultValues = defaultValues;
        }
 
        protected override IReadOnlyDictionary<string, object> DefaultValues { get; }
    }
}