You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2012/05/03 00:45:08 UTC

svn commit: r1333232 [14/34] - in /incubator/flex/trunk: ./ frameworks/tests/ frameworks/tests/basicTests/ frameworks/tests/basicTests/dmv/ frameworks/tests/basicTests/dmv/scripts/ frameworks/tests/basicTests/dmv/views/ frameworks/tests/basicTests/fxg/...

Added: incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/StdAfx.h
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/StdAfx.h?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/StdAfx.h (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/StdAfx.h Wed May  2 22:44:38 2012
@@ -0,0 +1,52 @@
+/*
+ *
+ * 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.
+ *
+ */
+// stdafx.h : include file for standard system include files,
+//  or project specific include files that are used frequently, but
+//      are changed infrequently
+//
+
+#if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
+#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+#define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
+
+
+// Windows Header Files:
+#include <windows.h>
+#include <winsock2.h>
+#include <ws2tcpip.h>
+
+// C RunTime Header Files
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+
+// Local Header Files
+
+// TODO: reference additional headers your program requires here
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/StdAfx.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/resource.h
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/resource.h?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/resource.h (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/resource.h Wed May  2 22:44:38 2012
@@ -0,0 +1,45 @@
+/*
+ *
+ * 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.
+ *
+ */
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by CONTINUEAFTERRUNTIMEEXCEPTION.RC
+//
+#define IDR_MAINFRAME					128
+#define IDD_CONTINUEAFTERRUNTIMEEXCEPTION_DIALOG		102
+#define IDD_ABOUTBOX					103
+#define IDS_APP_TITLE					103
+#define IDM_ABOUT						104
+#define IDM_EXIT						105
+#define IDS_HELLO						106
+#define IDI_CONTINUEAFTERRUNTIMEEXCEPTION	            107
+#define IDI_SMALL						108
+#define IDC_CONTINUEAFTERRUNTIMEEXCEPTION	            109
+#define IDC_MYICON						2
+#define IDC_STATIC	                    -1
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+
+#define _APS_NEXT_RESOURCE_VALUE        129
+#define _APS_NEXT_COMMAND_VALUE         32771
+#define _APS_NEXT_CONTROL_VALUE         1000
+#define _APS_NEXT_SYMED_VALUE           110
+#endif
+#endif

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/ContinueAfterRuntimeException/resource.h
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/CoverageTimeout.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/CoverageTimeout.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/CoverageTimeout.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/CoverageTimeout.as Wed May  2 22:44:38 2012
@@ -0,0 +1,43 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.net.*;
+import flash.events.Event;
+
+[Mixin]
+/**
+ *  set a timeout to linger around for coverage data
+ */
+public class CoverageTimeout
+{
+
+	/**
+	 *  Mixin callback that gets everything ready to go.
+	 *  The UnitTester waits for an event before starting
+	 */
+	public static function init(root:DisplayObject):void
+	{
+		UnitTester.coverageTimeout = 30000;
+	}
+
+
+}
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/CoverageTimeout.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/CreateBitmapReferences.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/CreateBitmapReferences.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/CreateBitmapReferences.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/CreateBitmapReferences.as Wed May  2 22:44:38 2012
@@ -0,0 +1,46 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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;
+
+[Mixin]
+/**
+ *  A "marker" class that causes test scripts to write out
+ *  bitmaps to the urls instead of reading and comparing
+ *  so that baselines/reference-points can be created for
+ *  future comparing.
+ */
+public class CreateBitmapReferences 
+{
+
+	/**
+	 *  Mixin callback that gets everything ready to go.
+	 *  The UnitTester waits for an event before starting
+	 */
+	public static function init(root:DisplayObject):void
+	{
+		UnitTester.createBitmapReferences = true;
+		/// change this to suit your locally running server: 
+		UnitTester.bitmapServerPrefix = "http://localhost:9998/baselines/baseline.jsp?filename=";
+	}
+
+}
+
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/CreateBitmapReferences.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DesktopMacSettings.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DesktopMacSettings.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DesktopMacSettings.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DesktopMacSettings.as Wed May  2 22:44:38 2012
@@ -0,0 +1,40 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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;
+
+[Mixin]
+/**
+ * By including this mixin via CompileMustellaSwfs, we
+ * can set up some variables for UnitTester to use for
+ * a run of mobile tests on the desktop.
+ */
+public class DesktopMacSettings
+{
+	public static function init(root:DisplayObject):void
+	{
+		if( UnitTester.cv == null ){
+			UnitTester.cv = new ConditionalValue();
+		}
+	
+		UnitTester.cv.os = "mac";
+	}
+}
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DesktopMacSettings.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DesktopWinSettings.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DesktopWinSettings.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DesktopWinSettings.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DesktopWinSettings.as Wed May  2 22:44:38 2012
@@ -0,0 +1,40 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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;
+
+[Mixin]
+/**
+ * By including this mixin via CompileMustellaSwfs, we
+ * can set up some variables for UnitTester to use for
+ * a run of mobile tests on the desktop.
+ */
+public class DesktopWinSettings
+{
+	public static function init(root:DisplayObject):void
+	{
+		if( UnitTester.cv == null ){
+			UnitTester.cv = new ConditionalValue();
+		}
+		
+		UnitTester.cv.os = "win";
+	}
+}
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DesktopWinSettings.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DeviceNames.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DeviceNames.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DeviceNames.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DeviceNames.as Wed May  2 22:44:38 2012
@@ -0,0 +1,58 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.system.Capabilities;
+
+/**
+ *  allowed values for deviceName
+ *
+ */
+public class DeviceNames
+{
+	public static const ANDROID:String = "android";
+	public static const IOS:String = "iphone";
+	public static const QNX:String = "qnx";
+	public static const MAC:String = "mac";
+	public static const WIN:String = "win";
+
+	public static const OS_VALUES:Array = [WIN, MAC, ANDROID, IOS, QNX];
+	public static const OS_VERSION_VALUES:Array = ["android22", "android23", "ios3x", "ios40", "ios41"];
+	public static const DEVICE_VALUES:Array = ["desire","droid","droid2","droidX","evo","incredible","nexusOne","playbook"];
+
+	public static function getFromOS ():String 
+	{
+
+		if (Capabilities.os.substring (0, Capabilities.os.indexOf (" ")) == "Windows" )
+		{
+			return WIN;
+		} else if (Capabilities.os.substring (0, Capabilities.os.indexOf (" ")) == "Mac" )
+		{
+			return MAC;
+
+		} else 
+		{
+			return "";
+		}
+
+	}
+
+}
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DeviceNames.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DispatchEvent.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DispatchEvent.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DispatchEvent.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DispatchEvent.as Wed May  2 22:44:38 2012
@@ -0,0 +1,139 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.Event;
+import flash.system.ApplicationDomain;
+
+import mx.core.mx_internal;
+use namespace mx_internal;
+
+/**
+ *  The test step that fakes an event.  Do not use for MouseEvent or KeyboardEvent
+ *  MXML attributes:
+ *  bubbles
+ *  cancelable
+ *  eventClass
+ *  properties
+ *  target
+ *  type
+ *  waitTarget (optional)
+ *  waitEvent (optional)
+ *  timeout (optional);
+ */
+public class DispatchEvent extends TestStep
+{
+
+	/**
+	 *  @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)
+		{
+			testResult.doFail("Target " + target + " not found");
+			UnitTester.blockFocusEvents = false;
+			return;
+		}
+
+		var c:Class = ApplicationDomain.currentDomain.getDefinition(eventClass) as Class;
+		var event:Event = new c(type, bubbles, cancelable);
+		if (properties)
+		{
+			for (var s:String in properties)
+			{
+				event[s] = properties[s];
+			}
+		}
+		try
+		{
+			actualTarget.dispatchEvent(event);
+		}
+		catch (e2:Error)
+		{
+			TestOutput.logResult("Exception thrown in DispatchEvent.");
+			testResult.doFail (e2.getStackTrace());	
+		}
+
+		UnitTester.blockFocusEvents = true;
+	}
+
+	/**
+	 *  The qualified name of the class for the event
+	 *  i.e. flash.events.Event
+	 */
+	public var eventClass:String;
+
+	/**
+	 *  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 bubbles property on the Event (optional)
+	 */
+	public var bubbles:Boolean;
+
+	/**
+	 *  The cancelable property on the Event (optional)
+	 */
+	public var cancelable:Boolean;
+
+
+	/**
+	 *  The relatedObject property on the MouseEvent (optional)
+	 */
+	public var properties:Object;
+
+
+	/**
+	 *  customize string representation
+	 */
+	override public function toString():String
+	{
+		var s:String = "DispatchEvent: target = ";
+		s += target;
+		if (type)
+			s += ", type = " + type;
+		return s;
+	}
+}
+
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DispatchEvent.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DispatchKeyEvent.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DispatchKeyEvent.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DispatchKeyEvent.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DispatchKeyEvent.as Wed May  2 22:44:38 2012
@@ -0,0 +1,604 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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.KeyboardEvent;
+import flash.events.Event;
+import flash.events.FocusEvent;
+import flash.events.TextEvent;
+
+import flash.text.TextField;
+import flash.ui.Keyboard;
+import flash.system.Capabilities;
+
+
+/**
+ *  The test step that fakes a keyboard event
+ *  MXML attributes:
+ *  type (optional)
+ *  charCode
+ *  ctrlKey (optional)
+ *  keyCode (optional)
+ *  keyLocation (optional)
+ *  shiftKey (optional)
+ *  waitTarget (optional)
+ *  waitEvent (optional)
+ *  timeout (optional);
+ *  cancelable (optional)
+ */
+
+
+public class DispatchKeyEvent extends TestStep
+{
+	// These are constants from flash.ui.Keyboard.  They are not
+	// available in non-AIR compilations, so they are reproduced here
+	// to avoid compile errors.
+	// If they change in AIR, these will need to be updated.
+	public static const FLASH_UI_KEYBOARD_BACK:uint = 0x01000016;
+	public static const FLASH_UI_KEYBOARD_MENU:uint = 0x01000012;
+	public static const FLASH_UI_KEYBOARD_SEARCH:uint = 0x0100001F;
+	
+    /**
+     *  Set the target's property to the specified value
+     */
+    override protected function doStep():void
+    {
+        UnitTester.blockFocusEvents = false;
+
+        var sendBoth:Boolean = false;
+
+        if (!type)
+        {
+            sendBoth = true;
+            type = "keyDown";
+        }
+        
+        var i:int;
+        var n:int;
+        var charSequence:Array = new Array();
+        var keySequence:Array = new Array();
+		
+		
+        if (charCode)
+        {
+            charSequence.push(charCode);
+            keySequence.push(keyCode ? keyCode : CharCodeToKeyCode[charCode] ? CharCodeToKeyCode[charCode] : charCode);
+        }
+        else if (keyCode)
+        {
+            charSequence.push(KeyCodeToCharCode[keyCode] ? KeyCodeToCharCode[keyCode] : 0);
+            keySequence.push(keyCode);
+        }
+        else if (char)
+        {
+            n = char.length;
+            for (i = 0; i < n; i++)
+            {
+                var c:uint = char.charCodeAt(i) 
+                charSequence.push(c);
+                keySequence.push(CharCodeToKeyCode[c]);
+            }
+        }
+        else if (key || keys)
+        {
+            var sequence:Array;
+            if (key)
+                sequence = [ key ];
+            else
+                sequence = keys;
+            n = sequence.length;
+            for (i = 0; i < n; i++)
+            {
+                var kc:uint = Keyboard[sequence[i]];
+                if (kc == 0)
+                {
+                    testResult.doFail(key + " is not a valid flash.ui.Keyboard constant");
+                    UnitTester.blockFocusEvents = true;
+                    return;
+                }
+                keySequence.push(kc);
+                charSequence.push(KeyCodeToCharCode[kc] ? KeyCodeToCharCode[kc] : 0);
+            }
+        }
+        else
+        {
+            testResult.doFail("no keys specified");
+            UnitTester.blockFocusEvents = true;
+            return;
+        }
+		
+        try
+        {
+            for (i = 0; i < repeatCount; i++)
+            {
+                var m:int = charSequence.length;
+                for (var j:int = 0; j < m; j++)
+                {
+                    var event:KeyboardEvent = new KeyboardEvent(type, true, cancelable); // all keyboard events bubble
+                    event.ctrlKey = ctrlKey;
+                    event.shiftKey = shiftKey;
+                    event.charCode = charSequence[j];
+                    event.keyCode = keySequence[j];
+                    event.keyLocation = keyLocation;
+
+
+                    // note that we don't check Window activation since we want to run in the background
+                    // and window activation is a player function
+					
+                    var actualTarget:Object;
+
+                    if (window)
+                    {
+                        actualTarget = context.stringToObject(window);
+                        actualTarget = actualTarget.stage.focus;
+                    }
+                    else
+                    {
+                        actualTarget = root.stage.focus;
+                        if (!actualTarget)
+                        {
+                            actualTarget = UnitTester.getFocus();
+                        }
+                    }
+					
+					// BACK, MENU, and SEARCH are buttons on mobile (Android) devices.  
+					// On Android devices right now, actualTarget is still null at this point.  Dispatching the event to the stage works.
+					// Using the constants in flash.ui.Keyboard will cause an error in a non-AIR runs, so the constants are also defined
+					// in this file, above.  There is risk here.
+					if (keySequence[j] == FLASH_UI_KEYBOARD_BACK ||
+						keySequence[j] == FLASH_UI_KEYBOARD_MENU ||
+						keySequence[j] == FLASH_UI_KEYBOARD_SEARCH){
+						
+						actualTarget = root.stage;
+					}
+					
+                    if (actualTarget)
+                    {
+                        var targetType:TypeInfo = context.getTypeInfo(actualTarget);
+                        var isTextView:Boolean = targetType.isAssignableTo("spark.components::RichEditableText");
+
+
+                        if (actualTarget is TextField)
+                        {
+                            if (event.charCode)
+                            {
+                                if (actualTarget.type == "input")
+                                {
+                                    actualTarget.replaceSelectedText(String.fromCharCode(event.charCode));
+                                    // actualTarget.dispatchEvent(new Event("change", true));
+                                    actualTarget.dispatchEvent(new Event("change"));
+                                }
+                            }
+                            else
+                            {
+                                if (actualTarget.selectable)
+                                    emulateKey(actualTarget, event);
+                            }
+                        }
+
+                        actualTarget.dispatchEvent(event);
+
+
+
+                        if (isTextView)
+                        {
+                            if (event.keyCode == Keyboard.DELETE ||
+
+                                event.keyCode == Keyboard.BACKSPACE ||
+
+                                event.keyCode == Keyboard.INSERT ||
+
+                                ctrlKey)
+
+                            {
+
+                                // don't send TEXT_INPUT event
+
+                            }
+
+                            else
+
+                            {
+
+                                var textEvent:TextEvent = new TextEvent(TextEvent.TEXT_INPUT, true, true);
+
+                                textEvent.text = String.fromCharCode(charSequence[j]);
+
+                                actualTarget.dispatchEvent(textEvent);
+
+                            }
+
+                        }
+
+                        if (keySequence[j] == Keyboard.TAB && type == "keyDown")
+                        {
+                            var fm:Object;
+                            var newTarget:Object = actualTarget;
+                            while (!fm && newTarget)
+                            {   
+                                if ("focusManager" in newTarget)
+                                    fm = newTarget["focusManager"];
+                                newTarget = newTarget.parent;
+                            }
+                            newTarget = null;
+                            if (fm)
+                            {
+                                try
+                                {
+                                    newTarget = fm.getNextFocusManagerComponent(shiftKey);
+                                }
+                                catch (e:Error)
+                                {
+                                    // ignore error thrown here.  Should only throw if the
+                                    // current FM became inactive as a result of dispatching
+                                    // the key event.  We don't really care too much about
+                                    // getting an accurate newTarget in this case because
+                                    // newTarget is often wrong since the Player is offering
+                                    // it up and the Player has that wonky algorithm for
+                                    // determining newTarget.   In theory, none of our code
+                                    // truly cares as long as it doesn't point to old focus
+                                    // object.
+                                }
+                            }
+
+                            actualTarget.dispatchEvent(new FocusEvent(FocusEvent.KEY_FOCUS_CHANGE, true, true, InteractiveObject(newTarget), shiftKey, Keyboard.TAB));
+                        }
+                        
+                        if (sendBoth)
+                        {
+                            event = new KeyboardEvent("keyUp", true, cancelable);
+                            event.ctrlKey = ctrlKey;
+                            event.shiftKey = shiftKey;
+                            event.charCode = charSequence[j];
+                            event.keyCode = keySequence[j];
+                            event.keyLocation = keyLocation;
+                            actualTarget.dispatchEvent(event);
+                        }
+                    }
+                    else
+                    {
+                        if (keySequence[j] == Keyboard.TAB && type == "keyDown")
+                        {
+
+                            var thisRoot:DisplayObject
+							
+                            // note that we don't check Window activation since we want to run in the background
+                            // and window activation is a player function
+                            if (window)
+                            {
+                                thisRoot = context.stringToObject(window).root;
+                            }
+                            else
+                                thisRoot = root;
+                            try
+                            {
+                                thisRoot.stage.dispatchEvent(new FocusEvent(FocusEvent.KEY_FOCUS_CHANGE, true, true, InteractiveObject(actualTarget), shiftKey, Keyboard.TAB));
+                            }
+                            catch(se2:SecurityError)
+                            {
+                                thisRoot.dispatchEvent(new FocusEvent(FocusEvent.KEY_FOCUS_CHANGE, true, true, InteractiveObject(actualTarget), shiftKey, Keyboard.TAB));
+                            }
+                        }						
+						
+                    }
+                }
+            }
+        }
+        catch (e1:Error)
+        {
+            TestOutput.logResult("Exception thrown in DispatchKeyEvent.");
+            testResult.doFail (e1.getStackTrace()); 
+        }
+
+        UnitTester.blockFocusEvents = true;
+    }
+
+    /**
+
+     *  (Optional) name of a UI object whose Window/Stage
+
+     *  will be used to dispatch the event
+
+     */
+
+    public var window:String;
+
+
+
+    /**
+     *  The type of the event to send (keyUp, keyDown, etc).
+     *  If not set, we'll send both a keyDown and a keyUp
+     */
+    public var type:String;
+
+    /**
+     *  The char or sequence of chars to send as a string/char if you don't know the charCode (optional)
+     */
+    public var char:String;
+
+    /**
+     *  The charCode property on the KeyboardEvent (optional)
+     */
+    public var charCode:uint;
+
+    /**
+     *  The ctrlKey property on the KeyboardEvent (optional)
+     */
+    public var ctrlKey:Boolean;
+
+    /**
+     *  The Keyboard key if you don't know the keyCode (optional)
+     */
+    public var key:String;
+
+    /**
+     *  The sequence of keys (optional) e.g ["LEFT", "UP"]
+     */
+    public var keys:Array;
+
+    /**
+     *  The keyCode property on the KeyboardEvent (optional)
+     */
+    public var keyCode:uint;
+
+    /**
+     *  The keyLocation property on the KeyboardEvent (optional)
+     */
+    public var keyLocation:uint;
+
+    /**
+     *  The number of times to repeat the sequence (optional)
+     */
+    public var repeatCount:uint = 1;
+
+    /**
+     *  The shiftKey property on the KeyboardEvent (optional)
+     */
+    public var shiftKey:Boolean;
+
+    /**
+     *  Designate the created event to be cancelable. by default, they are not
+     */
+    public var cancelable:Boolean = false;
+
+    /**
+     *  The FlashPlayer TextField doesn't actually handle keyboard events so we have to
+     *  emulate them
+     */
+    private function emulateKey(actualTarget:Object, event:KeyboardEvent):void
+    {
+        var begin:int = actualTarget.selectionBeginIndex;
+        var end:int = actualTarget.selectionEndIndex;
+        var caret:int = actualTarget.caretIndex;
+        // trace("begin =", begin, "end =", end, "caret =", caret);
+
+        if (event.keyCode == Keyboard.LEFT)
+        {
+            if (event.shiftKey)
+            {
+                if (caret > 0)
+                {
+                    if (caret == begin)
+                    {
+                        begin--;
+                        // last param defines caret position
+                        actualTarget.setSelection(end, begin);
+                    }
+                    else if (caret == end)
+                    {
+                        end--;
+                        if (end < begin)
+                            begin = end;
+			            actualTarget.setSelection(end, begin);
+
+                    }
+                }
+            }
+            else
+            {
+                if (begin != end)
+                    actualTarget.setSelection(begin, begin);
+
+               else if (caret > 0)
+                    actualTarget.setSelection(caret - 1, caret - 1);
+            }
+        }
+        else if (event.keyCode == Keyboard.RIGHT)
+        {
+            if (event.shiftKey)
+            {
+                if (caret < actualTarget.length)
+                {
+                    if (caret == end)
+                    {
+                        end++;
+                        actualTarget.setSelection(begin, end);
+
+                    }
+                    else if (caret == begin)
+                    {
+                        begin++;
+                        if (end < begin)
+                            end = begin;
+                        // last param defines caret position
+                        actualTarget.setSelection(end, begin);
+
+                    }
+                }
+            }
+            else
+            {
+                if (begin != end)
+                    actualTarget.setSelection(end, end); 
+
+               else if (caret > 0)
+                    actualTarget.setSelection(caret + 1, caret + 1);
+            }
+        }
+    }
+
+    private var KeyCodeToCharCode:Object = {
+                    8: 8,
+                    13: 13,
+                    96: 48,
+                    97: 49,
+                    98: 50,
+                    99: 51,
+                    100: 52, 
+                    101: 53,
+                    102: 54,
+                    103: 55,
+                    104: 56,
+                    105: 57,
+                    106: 42,
+                    107: 43,
+                    109: 45,
+                    110: 46,
+                    111: 47
+    }
+
+    private var CharCodeToKeyCode:Object = {
+                    13: 13,
+                    33: 49,
+                    34: 222,
+                    35: 51,
+                    36: 52,
+                    37: 53,
+                    38: 55,
+                    39: 222,
+                    40: 57,
+                    41: 48,
+                    42: 56,
+                    43: 187,
+                    44: 188,
+                    45: 189,
+                    46: 190,
+                    47: 191,
+                    48: 48,
+                    49: 49,
+                    50: 50,
+                    51: 51,
+                    52: 52,
+                    53: 53,
+                    54: 54,
+                    55: 55,
+                    56: 56,
+                    57: 57,
+                    58: 186,
+                    59: 186,
+                    60: 188,
+                    61: 187,
+                    62: 190,
+                    63: 191,
+                    64: 50,
+                    65: 65,
+                    66: 66,
+                    67: 67,
+                    68: 68,
+                    69: 69,
+                    70: 70,
+                    71: 71,
+                    72: 72,
+                    73: 73,
+                    74: 74,
+                    75: 75,
+                    76: 76,
+                    77: 77,
+                    78: 78,
+                    79: 79,
+                    80: 80,
+                    81: 81,
+                    82: 82,
+                    83: 83,
+                    84: 84,
+                    85: 85,
+                    86: 86,
+                    87: 87,
+                    88: 88,
+                    89: 89,
+                    90: 90,
+                    91: 219,
+                    92: 220,
+                    93: 221,
+                    94: 54,
+                    95: 189,
+                    96: 192,
+                    97: 65,
+                    98: 66,
+                    99: 67,
+                    100: 68,
+                    101: 69,
+                    102: 70,
+                    103: 71,
+                    104: 72,
+                    105: 73,
+                    106: 74,
+                    107: 75,
+                    108: 76,
+                    109: 77,
+                    110: 78,
+                    111: 79,
+                    112: 80,
+                    113: 81,
+                    114: 82,
+                    115: 83,
+                    116: 84,
+                    117: 85,
+                    118: 86,
+                    119: 87,
+                    120: 88,
+                    121: 89,
+                    122: 90,
+                    123: 219,
+                    124: 220,
+                    125: 221,
+                    126: 192
+    }
+
+    /**
+     *  customize string representation
+     */
+    override public function toString():String
+    {
+        var s:String = "DispatchKeyEvent";
+        if (charCode)
+            s += ": charCode = " + charCode.toString();
+        if (keyCode)
+            s += ": keyCode = " + keyCode.toString();
+        if (char)
+            s += ": char = " + char;
+        if (key)
+            s += ": key = " + key;
+        if (keys)
+            s += ": keys = " + keys.toString();
+        if (type)
+            s += ", type = " + type;
+        if (shiftKey)
+            s += ", shiftKey = " + shiftKey.toString();
+        if (ctrlKey)
+            s += ", ctrlKey = " + ctrlKey.toString();
+        if (repeatCount)
+            s += ", repeatCount = " + repeatCount.toString();
+        return s;
+    }
+}
+
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DispatchKeyEvent.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseClickEvent.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseClickEvent.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseClickEvent.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseClickEvent.as Wed May  2 22:44:38 2012
@@ -0,0 +1,295 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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)
+		{
+			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));
+		}
+		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;
+		}
+
+		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;
+	}
+}
+
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseClickEvent.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseEvent.as
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseEvent.as?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseEvent.as (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseEvent.as Wed May  2 22:44:38 2012
@@ -0,0 +1,304 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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)
+		{
+			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));
+		}
+		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;
+		}
+
+		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;
+	}
+}
+
+}

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DispatchMouseEvent.as
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropMain.mxml
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropMain.mxml?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropMain.mxml (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropMain.mxml Wed May  2 22:44:38 2012
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  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.
+
+-->
+<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" >
+
+	<mx:Script>
+	<![CDATA[
+		// uncomment this to write bitmaps
+		// public var createBitmapReferences:CreateBitmapReferences;
+
+		public var script:DragAndDropScript;
+
+		// public var cbTester2:CBTester2;					
+
+	]]>
+	</mx:Script>
+		
+	<mx:List id="lb" dragEnabled="true" dragMoveEnabled="true" initialize="lb.dataProvider=['alpha', 'beta', 'gamma', 'delta']" />
+
+	<mx:List id="lb1" dropEnabled="true" initialize="lb1.dataProvider=['apple']" />
+
+	<!-- probably best to uncomment one at a time -->
+	<!--<EventSniffer />-->
+	<!--<PixelSniffer />-->
+</mx:Application>

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropMain.mxml
------------------------------------------------------------------------------
    svn:eol-style = native

Added: incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropScript.mxml
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropScript.mxml?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropScript.mxml (added)
+++ incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropScript.mxml Wed May  2 22:44:38 2012
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+  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.
+
+-->
+<UnitTester xmlns:mx="http://www.adobe.com/2006/mxml" xmlns="*" testSWF="NSMain.mxml">
+
+	<!-- this set of lines form a template that must be in each unit test -->
+	<mx:Script>
+	<![CDATA[
+	public static function init(o:DisplayObject):void
+	{
+	}					
+	]]>
+	</mx:Script>
+	<mx:Metadata>
+	<![CDATA[
+		[Mixin]
+	]]>
+	</mx:Metadata>	
+	<!-- end of set of lines that must be in each unit test -->
+
+	<mx:Script>
+	<![CDATA[
+	]]>
+	</mx:Script>
+
+	<testCases>
+		<TestCase testID="myProp1">
+			<body>
+ 				<DispatchMouseEvent target="lb" type="mouseOver" localX="10" localY="30" />
+ 				<DispatchMouseEvent target="lb" type="mouseDown" localX="10" localY="30" />
+ 				<DispatchMouseEvent target="lb" type="mouseMove" buttonDown="true" localX="2" localY="30" waitTarget="lb" waitEvent="dragStart" />
+ 				<DispatchMouseEvent target="stage" type="mouseMove" buttonDown="true" stageX="228" stageY="57" 
+									waitTarget="mx.managers::DragManager.mx_internal:dragProxy" waitEvent="move"/>
+ 				<DispatchMouseEvent target="stage" type="mouseMove" buttonDown="true" stageX="208" stageY="77"
+									waitTarget="mx.managers::DragManager.mx_internal:dragProxy" waitEvent="move"/>
+ 				<DispatchMouseEvent target="stage" type="mouseMove" buttonDown="true" stageX="208" stageY="107"
+									waitTarget="mx.managers::DragManager.mx_internal:dragProxy" waitEvent="move"/>
+ 				<DispatchMouseEvent target="stage" type="mouseMove" buttonDown="true" stageX="218" stageY="157"
+									waitTarget="mx.managers::DragManager.mx_internal:dragProxy" waitEvent="move"/>
+ 				<DispatchMouseEvent target="stage" type="mouseMove" buttonDown="true" stageX="228" stageY="217"
+									waitTarget="mx.managers::DragManager.mx_internal:dragProxy" waitEvent="move"/>
+ 				<DispatchMouseEvent target="stage" type="mouseMove" buttonDown="true" stageX="238" stageY="237" waitTarget="lb1" waitEvent="dragEnter"/>
+ 				<DispatchMouseEvent target="stage" type="mouseUp" stageX="238" stageY="237" waitTarget="lb1" waitEvent="dragDrop" />
+				<AssertEvent target="lb" eventName="dragComplete" eventClass="mx.events::DragEvent" />
+				<AssertPropertyValue target="lb.dataProvider" propertyName="length" value="3" />
+				<AssertPropertyValue target="lb1.dataProvider" propertyName="length" value="2" />
+			</body>
+		</TestCase>
+  	</testCases>
+</UnitTester>
\ No newline at end of file

Propchange: incubator/flex/trunk/mustella/as3/src/mustella/DragAndDropScript.mxml
------------------------------------------------------------------------------
    svn:eol-style = native