File: System\Windows\Markup\ArrayExtensionTests.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.
 
using System.Collections;
using System.Collections.Generic;
using Xunit;
 
namespace System.Windows.Markup.Tests;
 
public class ArrayExtensionTests
{
    [Fact]
    public void Ctor_Default()
    {
        var extension = new ArrayExtension();
        Assert.Null(extension.Type);
        Assert.IsType<ArrayList>(extension.Items);
        Assert.Same(extension.Items, extension.Items);
        Assert.Empty(extension.Items);
    }
 
    [Theory]
    [InlineData(typeof(int))]
    public void Ctor_Type(Type type)
    {
        var extension = new ArrayExtension(type);
        Assert.Equal(type, extension.Type);
        Assert.IsType<ArrayList>(extension.Items);
        Assert.Same(extension.Items, extension.Items);
        Assert.Empty(extension.Items);
    }
 
    [Fact]
    public void Ctor_NullType_ThrowsArgumentNullException()
    {
        Assert.Throws<ArgumentNullException>("arrayType", () => new ArrayExtension((Type)null!));
    }
 
    public static IEnumerable<object[]> Ctor_Array_TestData()
    {
        yield return new object[] { Array.Empty<object>(), typeof(object) };
        yield return new object[] { new object[1], typeof(object) };
        yield return new object[] { Array.Empty<int>(), typeof(int) };
        yield return new object[] { new int[] { 1, 2, 3, 4, 5, 6 }, typeof(int) };
        yield return new object[] { new int[0, 0], typeof(int) };
        yield return new object[] { new int[0, 1], typeof(int) };
        yield return new object[] { new int[1, 0], typeof(int) };
    }
 
    [Theory]
    [MemberData(nameof(Ctor_Array_TestData))]
    public void Ctor_Array(Array elements, Type expectedType)
    {
        var extension = new ArrayExtension(elements);
        Assert.Equal(expectedType, extension.Type);
        Assert.IsType<ArrayList>(extension.Items);
        Assert.Same(extension.Items, extension.Items);
        Assert.Equal(elements, extension.Items);
    }
 
    [Fact]
    public void Ctor_NullElements_ThrowsArgumentNullException()
    {
        Assert.Throws<ArgumentNullException>("elements", () => new ArrayExtension((Array)null!));
    }
 
    [Fact]
    public void Ctor_MultdimensionalArray_ThrowsRankException()
    {
        Assert.Throws<RankException>(() => new ArrayExtension(new int[1, 1]));
    }
 
    [Theory]
    [InlineData(null)]
    [InlineData("string")]
    [InlineData(1)]
    public void AddChild_Invoke_AddsToItems(object? value)
    {
        var extension = new ArrayExtension();
        extension.AddChild(value);
        Assert.Equal(value, Assert.Single(extension.Items));
    }
 
    [Theory]
    [InlineData(null)]
    [InlineData("")]
    [InlineData("string")]
    public void AddText_Invoke_AddsToItems(string? text)
    {
        var extension = new ArrayExtension();
        extension.AddText(text);
        Assert.Equal(text, Assert.Single(extension.Items));
    }
 
    [Fact]
    public void ProvideValue_ValidArrayType_ReturnsExpected()
    {
        var extension = new ArrayExtension(typeof(int));
        extension.AddChild(1);
        extension.AddChild(2);
        Assert.Equal(new object[] { 1, 2 }, extension.ProvideValue(null));
    }
 
    [Fact]
    public void ProvideValue_NullArrayType_ThrowsInvalidOperationException()
    {
        var extension = new ArrayExtension();
        Assert.Throws<InvalidOperationException>(() => extension.ProvideValue(null));
    }
 
    [Fact]
    public void ProvideValue_InvalidArrayType_ThrowsInvalidOperationException()
    {
        var extension = new ArrayExtension(typeof(int));
        extension.AddChild("string");
        Assert.Throws<InvalidOperationException>(() => extension.ProvideValue(null));
    }
 
    [Theory]
    [InlineData(null)]
    [InlineData(typeof(int))]
    public void Type_Set_GetReturnsExpected(Type? value)
    {
        ArrayExtension extension = new()
        {
            // Set.
            Type = value
        };
 
        Assert.Equal(value, extension.Type);
 
        // Set same.
        extension.Type = value;
        Assert.Equal(value, extension.Type);
    }
}