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

using Windows.Win32.UI.Accessibility;

namespace System.Windows.Forms.Tests;

public class ComboBoxChildTextUiaProviderTests
{
    public static IEnumerable<object[]> ComboBoxChildTextUiaProvider_FragmentNavigate__TestData()
    {
        foreach (bool createControl in new[] { true, false })
        {
            foreach (bool droppedDown in new[] { true, false })
            {
                yield return new object[] { createControl, droppedDown };
            }
        }
    }

    [WinFormsTheory]
    [MemberData(nameof(ComboBoxChildTextUiaProvider_FragmentNavigate__TestData))]
    public void ComboBoxChildTextUiaProvider_FragmentNavigate_PreviousSibling_ReturnsExpected(
        bool createControl,
        bool droppedDown)
    {
        using ComboBox comboBox = new ComboBox
        {
            DropDownStyle = ComboBoxStyle.DropDownList
        };

        if (createControl)
        {
            comboBox.CreateControl();
        }

        comboBox.DroppedDown = droppedDown;
        AccessibleObject previousItem = comboBox.ChildTextAccessibleObject
            .FragmentNavigate(NavigateDirection.NavigateDirection_PreviousSibling) as AccessibleObject;

        Assert.Equal(!droppedDown, previousItem is null);
        Assert.Equal(droppedDown, previousItem == comboBox.ChildListAccessibleObject);
        Assert.True(comboBox.IsHandleCreated);
    }

    [WinFormsTheory]
    [MemberData(nameof(ComboBoxChildTextUiaProvider_FragmentNavigate__TestData))]
    public void ComboBoxChildTextUiaProvider_FragmentNavigate_NextSibling_ReturnsExpected(
        bool createControl,
        bool droppedDown)
    {
        using ComboBox comboBox = new ComboBox
        {
            DropDownStyle = ComboBoxStyle.DropDownList
        };

        if (createControl)
        {
            comboBox.CreateControl();
        }

        comboBox.DroppedDown = droppedDown;
        AccessibleObject nextItem = comboBox.ChildTextAccessibleObject
            .FragmentNavigate(NavigateDirection.NavigateDirection_NextSibling) as AccessibleObject;

        AccessibleObject expectedItem = ((ComboBox.ComboBoxAccessibleObject)comboBox.AccessibilityObject).DropDownButtonUiaProvider;

        Assert.Equal(expectedItem, nextItem);
        Assert.True(comboBox.IsHandleCreated);
    }
}
