// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

#nullable disable

using Windows.Win32.UI.Accessibility;
using static System.Windows.Forms.ToolStripControlHost;

namespace System.Windows.Forms.Tests.AccessibleObjects;

public class ToolStripControlHost_ToolStripControlHostAccessibleObjectTests
{
    [WinFormsFact]
    public void ToolStripControlHostAccessibleObject_Ctor_OwnerToolStripControlHostCannotBeNull()
    {
        Assert.Throws<ArgumentNullException>(() => new ToolStripControlHostAccessibleObject(null));
    }

    [WinFormsFact]
    public void ToolStripControlHostAccessibleObject_Ctor_Default()
    {
        using Control control = new();
        using ToolStripControlHost toolStrip = new(control);
        var accessibleObject = (ToolStripControlHostAccessibleObject)toolStrip.AccessibilityObject;

        Assert.NotNull(accessibleObject);
        Assert.Equal(toolStrip, accessibleObject.Owner);
        Assert.False(toolStrip.Control.IsHandleCreated);
    }

    [WinFormsFact]
    public void ToolStripControlHostAccessibleObject_DefaultAction_ReturnsExpected()
    {
        using Control control = new();
        using ToolStripControlHost toolStrip = new(control);
        var accessibleObject = (ToolStripControlHostAccessibleObject)toolStrip.AccessibilityObject;

        Assert.Equal(string.Empty, accessibleObject.DefaultAction);
        Assert.False(toolStrip.Control.IsHandleCreated);
    }

    [WinFormsFact]
    public void ToolStripControlHostAccessibleObject_Role_ReturnsExpected()
    {
        AccessibleRole testRole = AccessibleRole.Cell;
        using Control control = new();
        using ToolStripControlHost toolStrip = new(control);
        var accessibleObject = (ToolStripControlHostAccessibleObject)toolStrip.AccessibilityObject;

        control.AccessibleRole = testRole;

        Assert.Equal(testRole, accessibleObject.Role);
        Assert.False(toolStrip.Control.IsHandleCreated);
    }

    [WinFormsFact]
    public void ToolStripControlHostAccessibleObject_FragmentNavigate_ReturnsExpected()
    {
        using Control control = new();
        using ToolStripControlHost toolStrip = new(control);
        var accessibleObject = (ToolStripControlHostAccessibleObject)toolStrip.AccessibilityObject;

        Assert.Equal(control.AccessibilityObject, accessibleObject.FragmentNavigate(NavigateDirection.NavigateDirection_FirstChild));
        Assert.Equal(control.AccessibilityObject, accessibleObject.FragmentNavigate(NavigateDirection.NavigateDirection_LastChild));
        Assert.False(toolStrip.Control.IsHandleCreated);
    }

    [WinFormsFact]
    public void ToolStripControlHostAccessibleObject_ReleaseUiaProvider_ToolStripControlHostControl()
    {
        using ToolStrip toolStrip = new();
        using Control control = new();
        using ToolStripControlHost toolStripControlHost = new(control);
        toolStrip.Items.Add(toolStripControlHost);
        toolStripControlHost.Parent = toolStrip;
        toolStrip.CreateControl();

        _ = toolStripControlHost.AccessibilityObject;
        _ = toolStripControlHost.Control.AccessibilityObject;

        Assert.True(toolStripControlHost.Control.IsAccessibilityObjectCreated);

        toolStripControlHost.ReleaseUiaProvider();

        Assert.False(toolStripControlHost.Control.IsAccessibilityObjectCreated);
    }
}
