public virtual void PickerPeerExpandStateCollapsed()
        {
            Picker item = PickerInstance;
            PickerAutomationPeer    peer     = null;
            IExpandCollapseProvider provider = null;

            TestAsync(
                item,
                () => peer     = FrameworkElementAutomationPeer.CreatePeerForElement(item) as PickerAutomationPeer,
                () => provider = peer.GetPattern(PatternInterface.ExpandCollapse) as IExpandCollapseProvider,
                () => Assert.AreEqual(ExpandCollapseState.Collapsed, provider.ExpandCollapseState, "Unexpected ExpandCollapseState!"));
        }
        public virtual void PickerPeerSupportsExpandCollapse()
        {
            Picker item = PickerInstance;
            PickerAutomationPeer    peer     = null;
            IExpandCollapseProvider provider = null;

            TestAsync(
                item,
                () => peer     = FrameworkElementAutomationPeer.CreatePeerForElement(item) as PickerAutomationPeer,
                () => provider = peer.GetPattern(PatternInterface.ExpandCollapse) as IExpandCollapseProvider,
                () => Assert.IsNotNull(provider, "IExpandCollapseProvider peer should not be null!"));
        }
        public virtual void PickerPeerCollapseCollapsed()
        {
            Picker item = PickerInstance;
            PickerAutomationPeer    peer     = null;
            IExpandCollapseProvider provider = null;

            TestAsync(
                item,
                () => peer     = FrameworkElementAutomationPeer.CreatePeerForElement(item) as PickerAutomationPeer,
                () => provider = peer.GetPattern(PatternInterface.ExpandCollapse) as IExpandCollapseProvider,
                () => provider.Collapse(),
                () => Assert.IsFalse(item.IsDropDownOpen, "Item should be collapsed!"));
        }
        public virtual void PickerPeerExpandDisabled()
        {
            Picker item = PickerInstance;

            item.IsEnabled = false;
            PickerAutomationPeer    peer     = null;
            IExpandCollapseProvider provider = null;

            TestAsync(
                item,
                () => peer     = FrameworkElementAutomationPeer.CreatePeerForElement(item) as PickerAutomationPeer,
                () => provider = peer.GetPattern(PatternInterface.ExpandCollapse) as IExpandCollapseProvider,
                () => provider.Expand());
        }
        public virtual void PickerPeerOnlySupportsCorrectPatterns()
        {
            PickerAutomationPeer peer = CreatePickerAutomationPeer(PickerInstance);
            int index = 0;

            while (Enum.IsDefined(typeof(PatternInterface), index))
            {
                PatternInterface currentInterface = (PatternInterface)Enum.ToObject(typeof(PatternInterface), index);
                object           implementation   = peer.GetPattern(currentInterface);
                if (ExpectedPatterns.Contains(currentInterface))
                {
                    Assert.IsNotNull(implementation);
                }
                else
                {
                    Assert.IsNull(implementation);
                }
                index++;
            }
        }
        public virtual void ShouldThrowExceptionWhenCreatingPickerPeerWithNull()
        {
            PickerAutomationPeer peer = CreatePickerAutomationPeer(null);

            Assert.Fail("Should have thrown exception." + peer);
        }
        public virtual void CreatePickerPeer()
        {
            PickerAutomationPeer peer = CreatePickerAutomationPeer(PickerInstance);

            Assert.IsNotNull(peer);
        }
        /// <summary>
        /// IsDropDownOpenProperty property changed handler.
        /// </summary>
        /// <param name="d">Picker that changed its IsDropDownOpen.</param>
        /// <param name="e">Event arguments.</param>
        private static void OnIsDropDownOpenPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Picker source = (Picker)d;

            // Ignore the change if requested
            if (source._ignorePropertyChange)
            {
                source._ignorePropertyChange = false;
                return;
            }

            bool oldValue             = (bool)e.OldValue;
            bool newValue             = (bool)e.NewValue;
            bool delayedClosingVisual = source._popupClosedVisualState;
            RoutedPropertyChangingEventArgs <bool> args = new RoutedPropertyChangingEventArgs <bool>(e.Property, oldValue, newValue, true);

            PickerAutomationPeer peer = FrameworkElementAutomationPeer.FromElement(source) as PickerAutomationPeer;

            if (peer != null)
            {
                peer.RaiseExpandCollapseAutomationEvent(oldValue, newValue);
            }

            if (newValue)
            {
                // Opening
                source.OnDropDownOpening(args);

                // Opened
                if (!args.Cancel)
                {
                    source.OpenDropDown(oldValue, newValue);
                }
            }
            else
            {
                // Closing
                source.OnDropDownClosing(args);

                // Immediately close the drop down window:
                // When a popup closed visual state is present, the code path is
                // slightly different and the actual call to CloseDropDown will
                // be called only after the visual state's transition is done
                if (!args.Cancel && !delayedClosingVisual)
                {
                    source.CloseDropDown(oldValue, newValue);
                }
            }

            // If canceled, revert the value change
            if (args.Cancel)
            {
                // source._ignorePropertyChange = true;
                source.SetValue(e.Property, oldValue);
            }

            // Closing call when visual states are in use
            if (delayedClosingVisual)
            {
                source.UpdateVisualState(true);
            }
        }