File: System\Windows\Forms\PropertyGridInternal\AccessibleObjects\PropertyDescriptorGridEntry.PropertyDescriptorGridEntryAccessibleObjectTests.cs
Web Access
Project: src\src\System.Windows.Forms\tests\UnitTests\System.Windows.Forms.Tests.csproj (System.Windows.Forms.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.ComponentModel;
using System.Drawing;
using Windows.Win32.UI.Accessibility;
 
namespace System.Windows.Forms.PropertyGridInternal.Tests.AccessibleObjects;
 
public class PropertyDescriptorGridEntryAccessibleObjectTests
{
    [WinFormsFact]
    public void PropertyDescriptorGridEntryAccessibleObject_Navigates_to_DropDownControlHolder()
    {
        using PropertyGrid propertyGrid = new();
        using PropertyGridView propertyGridView = new(serviceProvider: null, propertyGrid);
 
        TestPropertyGridViewAccessibleObject accessibleObject = new(propertyGridView, parentPropertyGrid: null);
        propertyGridView.Properties.AddValue(propertyGrid.TestAccessor().Dynamic.s_accessibilityProperty, accessibleObject);
 
        TestPropertyDescriptorGridEntry gridEntry = new(propertyGrid, null, false);
        propertyGridView.TestAccessor().Dynamic._selectedGridEntry = gridEntry;
 
        PropertyGridView.DropDownHolder dropDownHolder = new(propertyGridView);
        dropDownHolder.TestAccessor().Dynamic.SetState(0x00000002, true); // Control class States.Visible flag
        propertyGridView.TestAccessor().Dynamic._dropDownHolder = dropDownHolder;
        gridEntry.TestAccessor().Dynamic._parent = new TestGridEntry(propertyGrid, null, propertyGridView);
 
        IRawElementProviderFragment.Interface firstChild = gridEntry.AccessibilityObject.FragmentNavigate(NavigateDirection.NavigateDirection_FirstChild);
        Assert.NotNull(firstChild);
        Assert.Equal(typeof(PropertyGridView.DropDownHolder.DropDownHolderAccessibleObject), firstChild.GetType());
    }
 
    [WinFormsFact]
    public void PropertyDescriptorGridEntryAccessibleObject_Ctor_Default()
    {
        using PropertyGrid propertyGrid = new();
        TestPropertyDescriptorGridEntry propertyDescriptorGridEntryTestEntity = new(propertyGrid, null, false);
        AccessibleObject propertyDescriptorGridEntryAccessibleObject = propertyDescriptorGridEntryTestEntity.AccessibilityObject;
 
        Assert.NotNull(propertyDescriptorGridEntryAccessibleObject);
 
        GridEntry owningGridEntry = ((IOwnedObject<GridEntry>)propertyDescriptorGridEntryAccessibleObject).Owner;
 
        Assert.Equal(propertyDescriptorGridEntryTestEntity, owningGridEntry);
    }
 
    [WinFormsFact]
    public void PropertyDescriptorGridEntryAccessibleObject_ExpandCollapseState_collapsed_by_default()
    {
        using PropertyGrid propertyGrid = new();
        TestPropertyDescriptorGridEntry propertyDescriptorGridEntryTestEntity = new(propertyGrid, null, false);
        AccessibleObject propertyDescriptorGridEntryAccessibleObject = propertyDescriptorGridEntryTestEntity.AccessibilityObject;
 
        ExpandCollapseState expandCollapseState = propertyDescriptorGridEntryAccessibleObject.ExpandCollapseState;
        Assert.Equal(ExpandCollapseState.ExpandCollapseState_Collapsed, expandCollapseState);
    }
 
    [WinFormsFact]
    public void PropertyDescriptorGridEntryAccessibleObject_ExpandCollapseState_reflects_ExpandablePropertyState()
    {
        using PropertyGrid propertyGrid = new();
        TestEntity testEntity = new()
        {
            SizeProperty = Size.Empty
        };
        propertyGrid.SelectedObject = testEntity;
 
        PropertyGridView propertyGridView = propertyGrid.TestAccessor().GridView;
 
        int firstPropertyIndex = 1; // Index 0 corresponds to the category grid entry.
        var gridEntry = (PropertyDescriptorGridEntry)propertyGridView.AccessibilityGetGridEntries()[firstPropertyIndex];
 
        var selectedGridEntry = propertyGridView.TestAccessor().Dynamic._selectedGridEntry as PropertyDescriptorGridEntry;
        Assert.Equal(gridEntry.PropertyName, selectedGridEntry.PropertyName);
 
        AccessibleObject selectedGridEntryAccessibleObject = gridEntry.AccessibilityObject;
 
        gridEntry.InternalExpanded = false;
        Assert.Equal(ExpandCollapseState.ExpandCollapseState_Collapsed, selectedGridEntryAccessibleObject.ExpandCollapseState);
 
        gridEntry.InternalExpanded = true;
        Assert.Equal(ExpandCollapseState.ExpandCollapseState_Expanded, selectedGridEntryAccessibleObject.ExpandCollapseState);
    }
 
    [WinFormsFact]
    public void PropertyDescriptorGridEntryAccessibleObject_IsPatternSupported_IfExpandCollapsePatternAndEnumerable_ReturnsTrue()
    {
        using PropertyGrid propertyGrid = new();
        using PropertyGridView propertyGridView = new(serviceProvider: null, propertyGrid);
 
        TestGridEntry parent = new(propertyGrid, peParent: null, propertyGridView);
        PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(typeof(TestEntity)).
            Find(nameof(TestEntity.SizeProperty), ignoreCase: false);
 
        EnumerablePropertyDescriptorGridEntry gridEntry = new(propertyGrid, parent, propertyDescriptor, hide: false);
        AccessibleObject accessibleObject = gridEntry.AccessibilityObject;
 
        Assert.True(gridEntry.Enumerable);
        Assert.True(accessibleObject.IsPatternSupported(UIA_PATTERN_ID.UIA_ExpandCollapsePatternId));
        Assert.False(propertyGrid.IsHandleCreated);
        Assert.False(propertyGridView.IsHandleCreated);
    }
 
    [WinFormsFact]
    public void PropertyDescriptorGridEntryAccessibleObject_IsPatternSupported_IfExpandCollapsePatternAndDropDownEditable_ReturnsTrue()
    {
        using PropertyGrid propertyGrid = new();
        using PropertyGridView propertyGridView = new(serviceProvider: null, propertyGrid);
 
        TestGridEntry parent = new(propertyGrid, peParent: null, propertyGridView);
        PropertyDescriptor propertyDescriptor = TypeDescriptor.GetProperties(typeof(TestEntity)).
            Find(nameof(TestEntity.SizeProperty), ignoreCase: false);
 
        DropDownEditablePropertyDescriptorGridEntry gridEntry = new(propertyGrid, parent, propertyDescriptor, hide: false);
        AccessibleObject accessibleObject = gridEntry.AccessibilityObject;
 
        Assert.True(gridEntry.NeedsDropDownButton);
        Assert.True(accessibleObject.IsPatternSupported(UIA_PATTERN_ID.UIA_ExpandCollapsePatternId));
        Assert.False(propertyGrid.IsHandleCreated);
        Assert.False(propertyGridView.IsHandleCreated);
    }
 
    private class TestGridEntry : GridEntry
    {
        private readonly PropertyGridView _propertyGridView;
 
        public TestGridEntry(PropertyGrid ownerGrid, GridEntry peParent, PropertyGridView propertyGridView)
            : base(ownerGrid, peParent)
        {
            _propertyGridView = propertyGridView;
        }
 
        internal override PropertyGridView OwnerGridView => _propertyGridView;
    }
 
    private class CustomPropertyDescriptor : PropertyDescriptor
    {
        public CustomPropertyDescriptor(string name, Attribute[] attrs)
            : base(name, attrs)
        {
        }
 
        public override Type PropertyType => throw new NotImplementedException();
 
        public override Type ComponentType => throw new NotImplementedException();
 
        public override bool IsReadOnly => false;
 
        public override bool CanResetValue(object component) => throw new NotImplementedException();
 
        public override object GetValue(object component) => throw new NotImplementedException();
 
        public override void ResetValue(object component) => throw new NotImplementedException();
 
        public override void SetValue(object component, object value)
        {
            throw new NotImplementedException();
        }
 
        public override bool ShouldSerializeValue(object component)
        {
            throw new NotImplementedException();
        }
    }
 
    private class TestPropertyDescriptorGridEntry : PropertyDescriptorGridEntry
    {
        private GridEntryCollection _collection;
 
        public TestPropertyDescriptorGridEntry(PropertyGrid ownerGrid, GridEntry parent, bool hide)
            : base(ownerGrid, parent, new CustomPropertyDescriptor("Test", Array.Empty<Attribute>()), hide)
        {
        }
 
        public override GridEntryCollection Children
        {
            get
            {
                _collection ??= [];
 
                return _collection;
            }
        }
 
        internal override bool Enumerable => false;
    }
 
    private class TestPropertyGridViewAccessibleObject : PropertyGridView.PropertyGridViewAccessibleObject
    {
        public TestPropertyGridViewAccessibleObject(PropertyGridView owner, PropertyGrid parentPropertyGrid)
            : base(owner, parentPropertyGrid)
        {
        }
    }
 
    internal class TestEntity
    {
        public Size SizeProperty
        {
            get; set;
        }
    }
 
    private class EnumerablePropertyDescriptorGridEntry : PropertyDescriptorGridEntry
    {
        public EnumerablePropertyDescriptorGridEntry(PropertyGrid ownerGrid, GridEntry parent, PropertyDescriptor propertyDescriptor, bool hide)
            : base(ownerGrid, parent, propertyDescriptor, hide)
        {
        }
 
        internal override bool Enumerable => true;
    }
 
    private class DropDownEditablePropertyDescriptorGridEntry : PropertyDescriptorGridEntry
    {
        public DropDownEditablePropertyDescriptorGridEntry(PropertyGrid ownerGrid, GridEntry parent, PropertyDescriptor propertyDescriptor, bool hide)
            : base(ownerGrid, parent, propertyDescriptor, hide)
        {
        }
 
        public override bool NeedsDropDownButton => true;
    }
}