flex-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From aha...@apache.org
Subject [1/3] git commit: [flex-asjs] [refs/heads/develop] - get checkintests to not fail again
Date Fri, 11 Nov 2016 06:50:57 GMT
Repository: flex-asjs
Updated Branches:
  refs/heads/develop 1cb8e192b -> 5c8c667cb


get checkintests to not fail again


Project: http://git-wip-us.apache.org/repos/asf/flex-asjs/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-asjs/commit/5c8c667c
Tree: http://git-wip-us.apache.org/repos/asf/flex-asjs/tree/5c8c667c
Diff: http://git-wip-us.apache.org/repos/asf/flex-asjs/diff/5c8c667c

Branch: refs/heads/develop
Commit: 5c8c667cb2b93860d98e210ec8201d49c02cd794
Parents: 11ef704
Author: Alex Harui <aharui@apache.org>
Authored: Thu Nov 10 22:50:30 2016 -0800
Committer: Alex Harui <aharui@apache.org>
Committed: Thu Nov 10 22:50:53 2016 -0800

----------------------------------------------------------------------
 build.xml                                       |   1 +
 mustella/tests/basicTests/BasicTestsApp.mxml    |  20 +-
 .../tests/basicTests/DispatchMouseClickEvent.as | 300 ++++++++++++++++++
 mustella/tests/basicTests/DispatchMouseEvent.as | 309 +++++++++++++++++++
 mustella/tests/basicTests/FlexJSContext.as      |  22 +-
 mustella/tests/basicTests/TestStep.as           | 193 ++++++++++++
 6 files changed, 833 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/5c8c667c/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index 15af666..61caf6d 100644
--- a/build.xml
+++ b/build.xml
@@ -1398,6 +1398,7 @@
                file="${basedir}/mustella/tests/basicTests/BasicTestsApp.mxml">
             <jvmarg line="${mxmlc.jvm.args}"/>
             <arg line="-compiler.mxml.children-as-data=true" />
+            <arg line="-compiler.info.flex=false" />
             <library-path dir="${FLEX_SDK_HOME}" append="true">
                 <include name="mustella/mustella.swc"/>
                 <include name="frameworks/libs/framework.swc"/>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/5c8c667c/mustella/tests/basicTests/BasicTestsApp.mxml
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/BasicTestsApp.mxml b/mustella/tests/basicTests/BasicTestsApp.mxml
index 805b535..6d2635e 100644
--- a/mustella/tests/basicTests/BasicTestsApp.mxml
+++ b/mustella/tests/basicTests/BasicTestsApp.mxml
@@ -22,7 +22,25 @@ limitations under the License.
                    xmlns:js="library://ns.apache.org/flexjs/basic" 
                    xmlns:models="models.*" 
                    xmlns:controllers="controllers.*"
-                   >
+                   applicationComplete="forwardEvent(event)" >
+    <fx:Script>
+	  <![CDATA[
+	    import org.apache.flex.core.WrappedMovieClip;
+	    
+	    private var r:WrappedMovieClip;
+	    override public function setRoot(r:WrappedMovieClip):void
+	    {
+	      this.r = r;
+	      r["info"]().app = this;
+	      super.setRoot(r);
+	    }
+	    
+	    private function forwardEvent(e:Event):void
+	    {
+	    	r.dispatchEvent(e);
+	    }
+	  ]]>
+    </fx:Script>
     <js:valuesImpl>
         <js:SimpleCSSValuesImpl />
     </js:valuesImpl>

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/5c8c667c/mustella/tests/basicTests/DispatchMouseClickEvent.as
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/DispatchMouseClickEvent.as b/mustella/tests/basicTests/DispatchMouseClickEvent.as
new file mode 100644
index 0000000..7b5eba0
--- /dev/null
+++ b/mustella/tests/basicTests/DispatchMouseClickEvent.as
@@ -0,0 +1,300 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 {
+
+import flash.display.DisplayObject;
+import flash.display.DisplayObjectContainer;
+import flash.display.InteractiveObject;
+import flash.events.MouseEvent;
+import flash.geom.Point;
+import flash.text.TextField;
+
+import mx.core.mx_internal;
+use namespace mx_internal;
+
+/**
+ *  The test step that fakes a mouse event
+ *  MXML attributes:
+ *  target
+ *  type
+ *  ctrlKey (optional)
+ *  delta (optional)
+ *  localX
+ *  localY
+ *  relatedObject (optional)
+ *  shiftKey (optional)
+ *  stageX
+ *  stageY
+ *  waitTarget (optional)
+ *  waitEvent (optional)
+ *  timeout (optional);
+ */
+public class DispatchMouseClickEvent extends TestStep
+{
+
+	private static var mouseX:QName = new QName(mx_internal, "_mouseX");
+	private static var mouseY:QName = new QName(mx_internal, "_mouseY");
+
+	/**
+	 *  @private
+	 */
+	override public function execute(root:DisplayObject, context:UnitTester, testCase:TestCase,
testResult:TestResult):Boolean
+	{
+		if (waitEvent && waitTarget == null)
+			waitTarget = target;
+		return super.execute(root, context, testCase, testResult);
+	}
+
+	/**
+	 *  Set the target's property to the specified value
+	 */
+	override protected function doStep():void
+	{
+		UnitTester.blockFocusEvents = false;
+
+		var actualTarget:Object = context.stringToObject(target);
+		if (!(actualTarget is DisplayObject))
+		    if ("element" in actualTarget)
+			    actualTarget = actualTarget["element"];
+		if (!actualTarget)
+		{
+			testResult.doFail("Target " + target + " not found");
+			UnitTester.blockFocusEvents = true;
+			return;
+		}
+		dispatchMouseEvent(actualTarget, "mouseDown");
+		dispatchMouseEvent(actualTarget, "mouseUp");
+		dispatchMouseEvent(actualTarget, "click");
+
+		UnitTester.blockFocusEvents = true;
+
+	}
+
+	private function dispatchMouseEvent(actualTarget:Object, type:String):void
+	{
+		var event:MouseEvent = new MouseEvent(type, true); // all mouse events bubble
+		event.ctrlKey = ctrlKey;
+		event.shiftKey = shiftKey;
+		event.buttonDown = type == "mouseDown";
+		event.delta = delta;
+		if (relatedObject && relatedObject.length > 0)
+		{
+			event.relatedObject = InteractiveObject(context.stringToObject(relatedObject));
+		}
+		
+		var stagePt:Point;
+		if (!isNaN(localX) && !isNaN(localY))
+		{
+			stagePt = actualTarget.localToGlobal(new Point(localX, localY));
+		}
+		else if (!isNaN(stageX) && !isNaN(stageY))
+		{
+			stagePt = new Point(stageX, stageY);
+		}
+		else
+		{
+			stagePt = actualTarget.localToGlobal(new Point(0, 0));
+		}
+        try {
+            root[mouseX] = stagePt.x;
+            root[mouseY] = stagePt.y;
+            UnitTester.setMouseXY(stagePt);
+            if (root["topLevelSystemManager"] != root)
+            {
+                root["topLevelSystemManager"][mouseX] = stagePt.x;
+                root["topLevelSystemManager"][mouseY] = stagePt.y;
+            }            
+        } catch (e:Error) {} // some scenarios don't support this
+
+		if (actualTarget is DisplayObjectContainer)
+		{
+			var targets:Array = actualTarget.stage.getObjectsUnderPoint(stagePt);
+			var arr:Array = UnitTester.getObjectsUnderPoint(DisplayObject(actualTarget), stagePt);
+			targets = targets.concat(arr);
+
+			for (var i:int = targets.length - 1; i >= 0; i--)
+			{
+				if (targets[i] is InteractiveObject)
+				{
+					if (targets[i] is TextField && !targets[i].selectable)
+					{
+						actualTarget = targets[i].parent;
+						break;
+					}
+
+					if (isMouseTarget(InteractiveObject(targets[i])))
+					{
+						actualTarget = targets[i];
+						break;
+					}
+				}
+/*				else
+				{
+					try
+					{
+						actualTarget = targets[i].parent;
+						while (actualTarget)
+						{
+							if (actualTarget is InteractiveObject)
+							{
+								if (isMouseTarget(InteractiveObject(actualTarget)))
+								{
+									break;
+								}
+							}
+							actualTarget = actualTarget.parent;
+						}
+						if (actualTarget && actualTarget != root)
+							break;
+					}
+					catch (e:Error)
+					{
+						if (actualTarget)
+							break;
+					}
+				}
+*/			}
+		}
+
+		var localPt:Point = actualTarget.globalToLocal(stagePt);
+		event.localX = localPt.x;
+		event.localY = localPt.y;
+
+		if (actualTarget is TextField)
+		{
+			if (type == "mouseDown")
+			{
+				var charIndex:int = actualTarget.getCharIndexAtPoint(event.localX, event.localY);
+				actualTarget.setSelection(charIndex + 1, charIndex + 1);
+			}
+		}
+
+		try
+		{
+			actualTarget.dispatchEvent(event);
+		}
+		catch (e2:Error)
+		{
+			TestOutput.logResult("Exception thrown in DispatchMouseClickEvent.");
+			testResult.doFail (e2.getStackTrace());	
+			return;
+		}
+	}
+
+	/**
+	 *  The object that receives the mouse event
+	 */
+	public var target:String;
+
+	/**
+	 *  The ctrlKey property on the MouseEvent (optional)
+	 */
+	public var ctrlKey:Boolean;
+
+	/**
+	 *  The delta property on the MouseEvent (optional)
+	 */
+	public var delta:int;
+
+	/**
+	 *  The localX property on the MouseEvent (optional)
+	 *  Either set stageX/stageY or localX/localY, but not both.
+	 */
+	public var localX:Number;
+
+	/**
+	 *  The localY property on the MouseEvent (optional)
+	 *  Either set stageX/stageY or localX/localY, but not both.
+	 */
+	public var localY:Number;
+
+	/**
+	 *  The stageX property on the MouseEvent (optional)
+	 *  Either set stageX/stageY or localX/localY, but not both.
+	 */
+	public var stageX:Number;
+
+	/**
+	 *  The stageY property on the MouseEvent (optional)
+	 *  Either set stageX/stageY or localX/localY, but not both.
+	 */
+	public var stageY:Number;
+
+	/**
+	 *  The shiftKey property on the MouseEvent (optional)
+	 */
+	public var shiftKey:Boolean;
+
+	/**
+	 *  The relatedObject property on the MouseEvent (optional)
+	 */
+	public var relatedObject:String;
+
+
+    private function isMouseTarget(target:InteractiveObject):Boolean
+    {
+        if (!target.mouseEnabled)
+            return false;
+
+		// Examine parent chain for "mouseChildren" set to false:
+		try
+		{
+			var parent:DisplayObjectContainer = target.parent;
+			while (parent)
+			{
+				if (!parent.mouseChildren)
+					return false;
+				parent = parent.parent;
+			}
+		}
+		catch (e1:Error)
+		{
+		}
+
+        return true;
+    }
+
+	/**
+	 *  customize string representation
+	 */
+	override public function toString():String
+	{
+		var s:String = "DispatchMouseClickEvent: target = ";
+		s += target;
+		if (!isNaN(localX))
+			s += ", localX = " + localX.toString();
+		if (!isNaN(localY))
+			s += ", localY = " + localY.toString();
+		if (!isNaN(stageX))
+			s += ", stageX = " + stageX.toString();
+		if (!isNaN(stageY))
+			s += ", stageY = " + stageY.toString();
+		if (shiftKey)
+			s += ", shiftKey = " + shiftKey.toString();
+		if (ctrlKey)
+			s += ", ctrlKey = " + ctrlKey.toString();
+		if (relatedObject)
+			s += ", relatedObject = " + relatedObject.toString();
+		if (delta)
+			s += ", delta = " + delta.toString();
+		return s;
+	}
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/5c8c667c/mustella/tests/basicTests/DispatchMouseEvent.as
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/DispatchMouseEvent.as b/mustella/tests/basicTests/DispatchMouseEvent.as
new file mode 100644
index 0000000..58f22a5
--- /dev/null
+++ b/mustella/tests/basicTests/DispatchMouseEvent.as
@@ -0,0 +1,309 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 {
+
+import flash.display.DisplayObject;
+import flash.display.DisplayObjectContainer;
+import flash.display.InteractiveObject;
+import flash.text.TextField;
+import flash.events.MouseEvent;
+import flash.geom.Point;
+
+import mx.core.mx_internal;
+use namespace mx_internal;
+
+/**
+ *  The test step that fakes a mouse event
+ *  MXML attributes:
+ *  target
+ *  type
+ *  ctrlKey (optional)
+ *  delta (optional)
+ *  localX
+ *  localY
+ *  relatedObject (optional)
+ *  shiftKey (optional)
+ *  stageX
+ *  stageY
+ *  waitTarget (optional)
+ *  waitEvent (optional)
+ *  timeout (optional);
+ */
+public class DispatchMouseEvent extends TestStep
+{
+	private static var mouseX:QName = new QName(mx_internal, "_mouseX");
+	private static var mouseY:QName = new QName(mx_internal, "_mouseY");
+
+	/**
+	 *  @private
+	 */
+	override public function execute(root:DisplayObject, context:UnitTester, testCase:TestCase,
testResult:TestResult):Boolean
+	{
+		if (waitEvent && waitTarget == null)
+			waitTarget = target;
+		return super.execute(root, context, testCase, testResult);
+	}
+
+	/**
+	 *  Set the target's property to the specified value
+	 */
+	override protected function doStep():void
+	{
+		UnitTester.blockFocusEvents = false;
+
+		var actualTarget:Object = context.stringToObject(target);
+		if (!(actualTarget is DisplayObject))
+		    if ("element" in actualTarget)
+			    actualTarget = actualTarget["element"];
+		if (!actualTarget)
+		{
+			testResult.doFail("Target " + target + " not found");
+			UnitTester.blockFocusEvents = false;
+			return;
+		}
+
+		var event:MouseEvent = new MouseEvent(type, true); // all mouse events bubble
+		event.ctrlKey = ctrlKey;
+		event.shiftKey = shiftKey;
+		event.buttonDown = buttonDown || type == "mouseDown";
+		event.delta = delta;
+		if (relatedObject && relatedObject.length > 0)
+		{
+			event.relatedObject = InteractiveObject(context.stringToObject(relatedObject));
+			if (!event.relatedObject)
+			{
+				testResult.doFail("RelatedObject " + relatedObject + " not found");
+				UnitTester.blockFocusEvents = false;
+				return;
+			}
+		}
+		
+		var stagePt:Point;
+		if (!isNaN(localX) && !isNaN(localY))
+		{
+			stagePt = actualTarget.localToGlobal(new Point(localX, localY));
+		}
+		else if (!isNaN(stageX) && !isNaN(stageY))
+		{
+			stagePt = new Point(stageX, stageY);
+		}
+		else
+		{
+			stagePt = actualTarget.localToGlobal(new Point(0, 0));
+		}
+        try {
+            root[mouseX] = stagePt.x;
+            root[mouseY] = stagePt.y;
+            UnitTester.setMouseXY(stagePt);
+            if (root["topLevelSystemManager"] != root)
+            {
+                root["topLevelSystemManager"][mouseX] = stagePt.x;
+                root["topLevelSystemManager"][mouseY] = stagePt.y;
+            }            
+        } catch (e:Error) {}; // some scenarios don't support this
+
+		if (actualTarget is DisplayObjectContainer)
+		{
+			var targets:Array = actualTarget.stage.getObjectsUnderPoint(stagePt);
+			var arr:Array = UnitTester.getObjectsUnderPoint(DisplayObject(actualTarget), stagePt);
+			targets = targets.concat(arr);
+
+			for (var i:int = targets.length - 1; i >= 0; i--)
+			{
+				if (targets[i] is InteractiveObject)
+				{
+					if (targets[i] is TextField && !targets[i].selectable)
+					{
+						actualTarget = targets[i].parent;
+						break;
+					}
+
+					if (isMouseTarget(InteractiveObject(targets[i])))
+					{
+						actualTarget = targets[i];
+						break;
+					}
+				}
+/*				else
+				{
+					try
+					{
+						actualTarget = targets[i].parent;
+						while (actualTarget)
+						{
+							if (actualTarget is InteractiveObject)
+							{
+								if (isMouseTarget(InteractiveObject(actualTarget)))
+								{
+									break;
+								}
+							}
+							actualTarget = actualTarget.parent;
+						}
+						if (actualTarget && actualTarget != root)
+							break;
+					}
+					catch (e:Error)
+					{
+						if (actualTarget)
+							break;
+					}
+				}
+*/			}
+		}
+
+		var localPt:Point = actualTarget.globalToLocal(stagePt);
+		event.localX = localPt.x;
+		event.localY = localPt.y;
+
+		if (actualTarget is TextField)
+		{
+			if (type == "mouseDown")
+			{
+				var charIndex:int = actualTarget.getCharIndexAtPoint(event.localX, event.localY);
+				actualTarget.setSelection(charIndex + 1, charIndex + 1);
+			}
+		}
+
+		try
+		{
+			actualTarget.dispatchEvent(event);
+		}
+		catch (e2:Error)
+		{
+			TestOutput.logResult("Exception thrown in DispatchMouseClickEvent.");
+			testResult.doFail (e2.getStackTrace());	
+		}
+
+		UnitTester.blockFocusEvents = true;
+	}
+
+	/**
+	 *  The object that receives the mouse event
+	 */
+	public var target:String;
+
+	/**
+	 *  The type of the event to send (mouseUp, mouseDown, etc).
+	 */
+	public var type:String;
+
+	/**
+	 *  The buttonDown property on the MouseEvent (optional)
+	 */
+	public var buttonDown:Boolean;
+
+	/**
+	 *  The ctrlKey property on the MouseEvent (optional)
+	 */
+	public var ctrlKey:Boolean;
+
+	/**
+	 *  The delta property on the MouseEvent (optional)
+	 */
+	public var delta:int;
+
+	/**
+	 *  The localX property on the MouseEvent (optional)
+	 *  Either set stageX/stageY or localX/localY, but not both.
+	 */
+	public var localX:Number;
+
+	/**
+	 *  The localY property on the MouseEvent (optional)
+	 *  Either set stageX/stageY or localX/localY, but not both.
+	 */
+	public var localY:Number;
+
+	/**
+	 *  The stageX property on the MouseEvent (optional)
+	 *  Either set stageX/stageY or localX/localY, but not both.
+	 */
+	public var stageX:Number;
+
+	/**
+	 *  The stageY property on the MouseEvent (optional)
+	 *  Either set stageX/stageY or localX/localY, but not both.
+	 */
+	public var stageY:Number;
+
+	/**
+	 *  The shiftKey property on the MouseEvent (optional)
+	 */
+	public var shiftKey:Boolean;
+
+	/**
+	 *  The relatedObject property on the MouseEvent (optional)
+	 */
+	public var relatedObject:String;
+
+
+    private function isMouseTarget(target:InteractiveObject):Boolean
+    {
+        if (!target.mouseEnabled)
+            return false;
+
+		// Examine parent chain for "mouseChildren" set to false:
+		try
+		{
+			var parent:DisplayObjectContainer = target.parent;
+			while (parent)
+			{
+				if (!parent.mouseChildren)
+					return false;
+				parent = parent.parent;
+			}
+		}
+		catch (e1:Error)
+		{
+		}
+
+        return true;
+    }
+
+	/**
+	 *  customize string representation
+	 */
+	override public function toString():String
+	{
+		var s:String = "DispatchMouseEvent: target = ";
+		s += target;
+		if (type)
+			s += ", type = " + type;
+		if (!isNaN(localX))
+			s += ", localX = " + localX.toString();
+		if (!isNaN(localY))
+			s += ", localY = " + localY.toString();
+		if (!isNaN(stageX))
+			s += ", stageX = " + stageX.toString();
+		if (!isNaN(stageY))
+			s += ", stageY = " + stageY.toString();
+		if (shiftKey)
+			s += ", shiftKey = " + shiftKey.toString();
+		if (ctrlKey)
+			s += ", ctrlKey = " + ctrlKey.toString();
+		if (relatedObject)
+			s += ", relatedObject = " + relatedObject.toString();
+		if (delta)
+			s += ", delta = " + delta.toString();
+		return s;
+	}
+}
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/5c8c667c/mustella/tests/basicTests/FlexJSContext.as
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/FlexJSContext.as b/mustella/tests/basicTests/FlexJSContext.as
index 4f03402..2482f9f 100644
--- a/mustella/tests/basicTests/FlexJSContext.as
+++ b/mustella/tests/basicTests/FlexJSContext.as
@@ -16,14 +16,14 @@
 //  limitations under the License.
 //
 ////////////////////////////////////////////////////////////////////////////////
-package 
-{
+package 
+{
 
 [Mixin]
-public class FlexJSContext
+public class FlexJSContext
 {
-	public function FlexJSContext()
-	{
+	public function FlexJSContext()
+	{
 		super();
     }
     
@@ -34,10 +34,10 @@ public class FlexJSContext
 	
 	public static function contextFunction():Object
 	{
-		return UnitTester._root["initialView"];		
-	}
-}
+		return UnitTester._root["info"]().app["initialView"];		
+	}
+}
+
+
+}
 
-
-}
-

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/5c8c667c/mustella/tests/basicTests/TestStep.as
----------------------------------------------------------------------
diff --git a/mustella/tests/basicTests/TestStep.as b/mustella/tests/basicTests/TestStep.as
new file mode 100644
index 0000000..a2304ff
--- /dev/null
+++ b/mustella/tests/basicTests/TestStep.as
@@ -0,0 +1,193 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 {
+
+import flash.display.DisplayObject;
+import flash.events.Event;
+import flash.events.EventDispatcher;
+import flash.events.IEventDispatcher;
+import flash.utils.getTimer;
+
+/**
+ *  The abstract base class for all steps in a test case.  TestStep
+ *  cannot be used directly, instead its subclasses must be used
+ *  such as SetProperty, RunCode, Assert, etc.
+ */
+public class TestStep extends EventDispatcher
+{
+	/**
+	 *  Called by the TestCase when it is time to start this step
+	 *  The default implementation checks for a wait event and
+	 *  returns true if there isn't one and false if there is.
+	 */
+	public function execute(root:DisplayObject, context:UnitTester, testCase:TestCase, testResult:TestResult):Boolean
+	{
+		var tryLater:Boolean = false;
+
+		this.root = root;
+		this.context = context;
+		this.testCase = testCase;
+		this.testResult = testResult;
+
+		if (waitEvent)
+		{
+			var actualTarget:IEventDispatcher = context.stringToObject(waitTarget) as IEventDispatcher;
+			if (!(actualTarget is DisplayObject))
+				if ("element" in actualTarget)
+					actualTarget = actualTarget["element"];
+			if (!actualTarget)
+			{
+				// its ok if the target isn't here yet, it may be created during this step
+				tryLater = true;
+			}
+			else
+			{
+                UnitTester.waitEvent = waitEvent;
+				actualTarget.addEventListener(waitEvent, waitEventHandler);
+				testCase.setExpirationTime(getTimer() + timeout);
+			}
+		}
+
+		if (!UnitTester.hasRTE)
+			doStep();
+
+		// if test failed, don't bother waiting, just bail
+		if (testResult.hasStatus() || UnitTester.hasRTE)
+		{
+			if (UnitTester.hasRTE)
+			{ 
+				testResult.result = 1;
+				testResult.message = UnitTester.RTEMsg;
+				dispatchEvent(new Event("runComplete"));
+				return true;	
+			}
+
+			if (waitEvent)
+			{
+                UnitTester.waitEvent = null;
+				actualTarget = context.stringToObject(waitTarget) as IEventDispatcher;
+				if (!(actualTarget is DisplayObject))
+					if ("element" in actualTarget)
+						actualTarget = actualTarget["element"];
+				actualTarget.removeEventListener(waitEvent, waitEventHandler);
+				testCase.setExpirationTime(0);
+			}
+			return true;
+		}
+
+		if (tryLater && waitEvent)
+		{
+			actualTarget = context.stringToObject(waitTarget) as IEventDispatcher;
+			if (!(actualTarget is DisplayObject))
+			    if ("element" in actualTarget)
+				    actualTarget = actualTarget["element"];
+			if (!actualTarget)
+			{
+				testResult.doFail("Target " + waitTarget + " not found");
+				return true;
+			}
+            UnitTester.waitEvent = waitEvent;
+			actualTarget.addEventListener(waitEvent, waitEventHandler);
+			testCase.setExpirationTime(getTimer() + timeout);
+		}
+
+		return (waitEvent == null);
+	}
+
+	/**
+	 *  The name of the object to listen for an event we're waiting on
+	 */
+	public var waitTarget:String;
+
+	/**
+	 *  The name of the event to listen for on the waitTarget
+	 */
+	public var waitEvent:String;
+
+	/**
+	 *  The number of milliseconds to wait before giving up
+	 */
+	public var timeout:int = 3000;
+
+	/**
+	 *  The TestResult for this TestCase
+	 */
+	protected var testResult:TestResult;
+
+	/**
+	 *  The TestCase that this step belongs to
+	 */
+	protected var testCase:TestCase;
+
+	/**
+	 *  The UnitTester that this step belongs to
+	 */
+	protected var context:UnitTester;
+
+	/**
+	 *  The root for the SWF
+	 */
+	protected var root:DisplayObject;
+
+	/**
+	 *  The method that gets called when it is time to perform the work in the step.
+	 */
+	protected function doStep():void
+	{
+	}
+
+	/**
+	 *  The method that gets called back when the event we're waiting on fires
+	 */
+	protected function waitEventHandler(event:Event):void
+	{
+		stepComplete();
+	}
+
+	/**
+	 *  The method that gets called when it is time to clean up the step.
+	 */
+	protected function stepComplete():void
+	{
+		if (waitEvent)
+		{
+            UnitTester.waitEvent = null;
+			var actualTarget:IEventDispatcher = context.stringToObject(waitTarget) as IEventDispatcher;
+			if (!(actualTarget is DisplayObject))
+			    if ("element" in actualTarget)
+				    actualTarget = actualTarget["element"];
+			if (actualTarget)	// can be null if object killed during step
+				actualTarget.removeEventListener(waitEvent, waitEventHandler);
+			testCase.setExpirationTime(0);
+		}
+		dispatchEvent(new Event("stepComplete"));
+	}
+
+	/**
+	 *  Called by the test case if you time out
+	 */
+	public function timeoutCallback():void
+	{
+		testResult.doFail("Timeout waiting for " + waitEvent + " from " + waitTarget);
+		stepComplete();
+	}
+
+}
+
+}


Mime
View raw message