FLEX-35126 Added a unit test to reprouce the bug. Currently it passes, as 
expected. (But if I manually put back the fix for FLEX-34088, it fails, as it 
should, meaning it actually tests the correct bug.)


Project: http://git-wip-us.apache.org/repos/asf/flex-sdk/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-sdk/commit/3d71f1b5
Tree: http://git-wip-us.apache.org/repos/asf/flex-sdk/tree/3d71f1b5
Diff: http://git-wip-us.apache.org/repos/asf/flex-sdk/diff/3d71f1b5

Branch: refs/heads/develop
Commit: 3d71f1b5e458ee39f439ef68db092ed08a8935df
Parents: a797884
Author: Mihai Chira <mih...@apache.org>
Authored: Mon Sep 19 13:24:17 2016 +0200
Committer: Mihai Chira <mih...@apache.org>
Committed: Mon Sep 19 13:24:17 2016 +0200

----------------------------------------------------------------------
 .../components/DropDownList_FLEX_35126_Tests.as | 182 +++++++++++++++++++
 1 file changed, 182 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-sdk/blob/3d71f1b5/frameworks/projects/spark/tests/spark/components/DropDownList_FLEX_35126_Tests.as
----------------------------------------------------------------------
diff --git 
a/frameworks/projects/spark/tests/spark/components/DropDownList_FLEX_35126_Tests.as
 
b/frameworks/projects/spark/tests/spark/components/DropDownList_FLEX_35126_Tests.as
new file mode 100644
index 0000000..82ab10e
--- /dev/null
+++ 
b/frameworks/projects/spark/tests/spark/components/DropDownList_FLEX_35126_Tests.as
@@ -0,0 +1,182 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+package spark.components {
+    import flash.events.Event;
+    import flash.events.EventDispatcher;
+    import flash.events.MouseEvent;
+
+    import mx.events.FlexMouseEvent;
+
+    import org.flexunit.assertThat;
+    import org.flexunit.asserts.assertEquals;
+    import org.flexunit.asserts.assertFalse;
+    import org.flexunit.asserts.assertTrue;
+    import org.flexunit.async.Async;
+    import org.fluint.uiImpersonation.UIImpersonator;
+
+    public class DropDownList_FLEX_35126_Tests
+    {
+        private static const NO_ENTER_FRAMES_TO_ALLOW:int = 2;
+        private static var noEnterFramesRemaining:int = NaN;
+        private static const _finishNotifier:EventDispatcher = new 
EventDispatcher();
+
+        private static var _sut:DropDownListInspectable;
+        private static var _dropDownListOnStage:DropDownList;
+        private var _popUp:PopUpAnchor;
+
+        [Before]
+        public function setUp():void
+        {
+            _popUp = new PopUpAnchor();
+            _popUp.displayPopUp = true;
+
+            _sut = new DropDownListInspectable();
+            _sut.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, 
onMouseDownOutsidePopup);
+
+            _popUp.popUp = _sut;
+
+            _dropDownListOnStage = new DropDownList();
+        }
+
+        private function onMouseDownOutsidePopup(event:FlexMouseEvent):void
+        {
+            _popUp.displayPopUp = false;
+        }
+
+        [After]
+        public function tearDown():void
+        {
+            _sut = null;
+            _popUp = null;
+            _dropDownListOnStage = null;
+        }
+
+        [Test(async, timeout=1000)]
+        public function 
test_dropdown_doesnt_close_when_item_selected_from_DropDownList():void
+        {
+            //given
+            _popUp.width = _sut.width = 150;
+            _dropDownListOnStage.x = 200;
+            UIImpersonator.addChild(_popUp);
+            UIImpersonator.addChild(_dropDownListOnStage);
+
+            //then
+            assertTrue(_popUp.displayPopUp);
+            assertThat(isNaN(_sut.dropDownController_.rollOverOpenDelay));
+
+            //when
+            _sut.openButton.dispatchEvent(new 
MouseEvent(MouseEvent.ROLL_OVER));
+            _sut.openButton.dispatchEvent(new 
MouseEvent(MouseEvent.MOUSE_DOWN));
+
+            //then - wait a frame
+            noEnterFramesRemaining = NO_ENTER_FRAMES_TO_ALLOW;
+            UIImpersonator.testDisplay.addEventListener(Event.ENTER_FRAME, 
onEnterFrame);
+            Async.handleEvent(this, _finishNotifier, Event.COMPLETE, 
then_open_drop_down, 300);
+        }
+
+        private function then_open_drop_down(event:Event, 
passThroughData:Object):void
+        {
+            //when - MOUSE_UP to signify the lifting of the mouse button
+            _sut.openButton.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_UP));
+
+            //then
+            assertTrue(_sut.isDropDownOpen);
+
+            //when - MOUSE_DOWN on the stage dropDownList
+            _dropDownListOnStage.openButton.dispatchEvent(new 
MouseEvent(MouseEvent.ROLL_OVER));
+            _dropDownListOnStage.openButton.dispatchEvent(new 
MouseEvent(MouseEvent.MOUSE_DOWN));
+
+            //then - wait a frame
+            noEnterFramesRemaining = NO_ENTER_FRAMES_TO_ALLOW;
+            UIImpersonator.testDisplay.addEventListener(Event.ENTER_FRAME, 
onEnterFrame);
+            Async.handleEvent(this, _finishNotifier, Event.COMPLETE, 
then_select_item_in_drop_down, 300);
+        }
+
+        private function then_select_item_in_drop_down(event:Event, 
passThroughData:Object):void
+        {
+            //when - MOUSE_UP to signify the lifting of the mouse button
+            _dropDownListOnStage.openButton.dispatchEvent(new 
MouseEvent(MouseEvent.MOUSE_UP));
+
+            //then
+            assertFalse("PopUpAnchor should be closed", _popUp.displayPopUp);
+            assertTrue(_dropDownListOnStage.isDropDownOpen);
+
+            //when - second click on stage dropdown
+            _dropDownListOnStage.openButton.dispatchEvent(new 
MouseEvent(MouseEvent.ROLL_OVER));
+            _dropDownListOnStage.openButton.dispatchEvent(new 
MouseEvent(MouseEvent.MOUSE_DOWN));
+
+            //then
+            assertEquals("The DropDownController should have closed the 
DropDownList at the first click on the other DropDownList, and stopped 
listening to mouse events", 1, _sut.noReactionsToOutsideClick);
+        }
+
+        private static function onEnterFrame(event:Event):void
+        {
+            if(!--noEnterFramesRemaining)
+            {
+                
UIImpersonator.testDisplay.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
+                _finishNotifier.dispatchEvent(new Event(Event.COMPLETE));
+            }
+        }
+    }
+}
+
+import flash.events.Event;
+
+import mx.core.mx_internal;
+
+import spark.components.DropDownList;
+import spark.components.supportClasses.DropDownController;
+import spark.skins.spark.DropDownListSkin;
+
+use namespace mx_internal;
+
+class DropDownListInspectable extends DropDownList
+{
+    public var noReactionsToOutsideClick:int = 0;
+
+    public function DropDownListInspectable()
+    {
+        super();
+        this.setStyle("skinClass", DropDownListSkin);
+        this.dropDownController = new DropDownControllerInspectable();
+        
this.dropDownController.addEventListener(DropDownControllerInspectable.REACT_TO_MOUSE_DOWN,
 onControllerReactedToMouseDown);
+    }
+
+    private function onControllerReactedToMouseDown(event:Event):void
+    {
+        noReactionsToOutsideClick++;
+    }
+
+    public function get dropDownController_():DropDownController
+    {
+        return this.dropDownController;
+    }
+}
+
+class DropDownControllerInspectable extends DropDownController
+{
+    public static const REACT_TO_MOUSE_DOWN:String = "justReactedToMouseDown";
+
+    override mx_internal function 
systemManager_mouseDownHandler(event:Event):void
+    {
+        super.mx_internal::systemManager_mouseDownHandler(event);
+        dispatchEvent(new Event(REACT_TO_MOUSE_DOWN));
+    }
+}
\ No newline at end of file

Reply via email to