File: System\Windows\Markup\ReferenceTests.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\tests\UnitTests\System.Xaml.Tests\System.Xaml.Tests.csproj (System.Xaml.Tests)
// 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.Collections.Generic;
using System.Xaml;
using Xunit;
 
namespace System.Windows.Markup.Tests;
 
public class ReferenceTests
{
    [Fact]
    public void Ctor_Default()
    {
        var reference = new Reference();
        Assert.Null(reference.Name);
    }
 
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("name")]
    public void Ctor_String(string name)
    {
        var reference = new Reference(name);
        Assert.Equal(name, reference.Name);
    }
 
    [Fact]
    public void ProvideValue_ResolveSuccessful_ReturnsExpected()
    {
        var reference = new Reference("name");
        var provider = new CustomServiceProvider
        {
            ServiceAction = serviceType => new CustomXamlNameResolver
            {
                ResolveAction = name => "resolve",
                GetFixupTokenAction = (names, canAssignDirectly) => "fixup"
            }
        };
        Assert.Equal("resolve", reference.ProvideValue(provider));
    }
 
    [Theory]
    [InlineData("fixup")]
    [InlineData(null)]
    public void ProvideValue_ResolveUnsuccessful_ReturnsExpected(string fixup)
    {
        var reference = new Reference("name");
 
        var provider = new CustomServiceProvider
        {
            ServiceAction = serviceType => new CustomXamlNameResolver
            {
                ResolveAction = name => null!,
                GetFixupTokenAction = (names, canAssignDirectly) => fixup
            }
        };
        Assert.Equal(fixup, reference.ProvideValue(provider));
    }
 
    [Fact]
    public void ProvideValue_NullServiceProvider_ThrowsArgumentNullException()
    {
        var reference = new Reference("name");
        Assert.Throws<ArgumentNullException>("serviceProvider", () => reference.ProvideValue(null));
    }
 
    [Theory]
    [InlineData(null)]
    [InlineData("string")]
    public void ProvideValue_NonIXamlNameResolverProvider_ThrowsInvalidOperationException(object value)
    {
        var reference = new Reference("name");
        var provider = new CustomServiceProvider
        {
            ServiceAction = serviceType => value
        };
        Assert.Throws<InvalidOperationException>(() => reference.ProvideValue(provider));
    }
 
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    public void ProvideValue_NullOrEmptyName_ThrowsInvalidOperationException(string name)
    {
        var reference = new Reference(name);
        var provider = new CustomServiceProvider
        {
            ServiceAction = serviceType => new CustomXamlNameResolver()
        };
        Assert.Throws<InvalidOperationException>(() => reference.ProvideValue(provider));
    }
    
    private class CustomServiceProvider : IServiceProvider
    {
        public Func<Type, object> ServiceAction { get; set; }
 
        public object GetService(Type serviceType)
        {
            if (ServiceAction is null)
            {
                throw new NotImplementedException();
            }
 
            return ServiceAction(serviceType);
        }
    }
    
 
    private class CustomXamlNameResolver : IXamlNameResolver
    {
        public bool IsFixupTokenAvailable => throw new NotImplementedException();
 
        public Func<string, object> ResolveAction { get; set; }
 
        public object Resolve(string name)
        {
            if (ResolveAction is null)
            {
                throw new NotImplementedException();
            }
 
            return ResolveAction(name);
        }
 
        public object Resolve(string name, out bool isFullyInitialized) => throw new NotImplementedException();
 
        public object GetFixupToken(IEnumerable<string> names) => throw new NotImplementedException();
 
        public Func<IEnumerable<string>, bool, object> GetFixupTokenAction { get; set; }
        
        public object GetFixupToken(IEnumerable<string> names, bool canAssignDirectly)
        {
            if (GetFixupTokenAction is null)
            {
                throw new NotImplementedException();
            }
 
            return GetFixupTokenAction(names, canAssignDirectly);
        }
 
        public IEnumerable<KeyValuePair<string, object>> GetAllNamesAndValuesInScope()
            => throw new NotImplementedException();
 
        public event EventHandler OnNameScopeInitializationComplete
        {
            add => throw new NotImplementedException();
            remove => throw new NotImplementedException();
        }
    }
}