reorg mustella java files

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

Branch: refs/heads/packaging
Commit: 0e704f9b07a15771d51c493b88e857b79b2d38fe
Parents: 5403f13
Author: Alex Harui <aha...@apache.org>
Authored: Thu Sep 21 11:43:37 2017 -0700
Committer: Alex Harui <aha...@apache.org>
Committed: Thu Sep 21 11:43:37 2017 -0700

----------------------------------------------------------------------
 .../src/marmotinni/AssertPropertyValue.java     | 103 -------
 mustella/java/src/marmotinni/AssertStep.java    |  54 ----
 .../java/src/marmotinni/DispatchKeyEvent.java   | 203 -------------
 .../src/marmotinni/DispatchMouseClickEvent.java | 205 -------------
 .../java/src/marmotinni/DispatchMouseEvent.java | 222 --------------
 .../java/src/marmotinni/MarmotinniRunner.java   | 259 ----------------
 mustella/java/src/marmotinni/SetProperty.java   | 119 --------
 mustella/java/src/marmotinni/TestCase.java      | 293 -------------------
 mustella/java/src/marmotinni/TestOutput.java    |  36 ---
 mustella/java/src/marmotinni/TestResult.java    | 151 ----------
 mustella/java/src/marmotinni/TestStep.java      | 124 --------
 .../java/marmotinni/AssertPropertyValue.java    | 103 +++++++
 .../src/main/java/marmotinni/AssertStep.java    |  54 ++++
 .../main/java/marmotinni/DispatchKeyEvent.java  | 203 +++++++++++++
 .../marmotinni/DispatchMouseClickEvent.java     | 205 +++++++++++++
 .../java/marmotinni/DispatchMouseEvent.java     | 222 ++++++++++++++
 .../main/java/marmotinni/MarmotinniRunner.java  | 259 ++++++++++++++++
 .../src/main/java/marmotinni/SetProperty.java   | 119 ++++++++
 mustella/src/main/java/marmotinni/TestCase.java | 293 +++++++++++++++++++
 .../src/main/java/marmotinni/TestOutput.java    |  36 +++
 .../src/main/java/marmotinni/TestResult.java    | 151 ++++++++++
 mustella/src/main/java/marmotinni/TestStep.java | 124 ++++++++
 22 files changed, 1769 insertions(+), 1769 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/AssertPropertyValue.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/AssertPropertyValue.java 
b/mustella/java/src/marmotinni/AssertPropertyValue.java
deleted file mode 100644
index 156be82..0000000
--- a/mustella/java/src/marmotinni/AssertPropertyValue.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import org.openqa.selenium.JavascriptExecutor;
-
-import org.xml.sax.Attributes;
-
-/** 
- * AssertPropertyValue
- *
- * Assert if a property is set to the right value
- */
-public class AssertPropertyValue extends AssertStep { 
-
-
-       public AssertPropertyValue () { 
-       }
-       
-       /**
-        *  The name of the property to test
-        */
-       public String propertyName;
-       
-       /**
-        *  The value the property should have
-        */
-       public String value;
-
-       /**
-        *  The value the property should have
-        */
-       public String valueExpression;
-       
-       @Override
-       public void populateFromAttributes(Attributes attributes)
-       {
-               target = attributes.getValue("target");
-               propertyName = attributes.getValue("propertyName");
-               value = attributes.getValue("value");
-               valueExpression = attributes.getValue("valueExpression");
-       }
-       
-       @Override
-    protected void doStep()
-    {
-               
-               StringBuilder getScript = new StringBuilder();
-               insertTargetScript(getScript, target);
-               getScript.append(" return target['" + propertyName + "'];");
-               if (TestStep.showScripts)
-                       System.out.println(getScript.toString());
-               String actualValue = 
((JavascriptExecutor)webDriver).executeScript(getScript.toString()).toString();
-               String valueString = null;
-               if (valueExpression != null)
-                       valueString = 
((JavascriptExecutor)webDriver).executeScript(valueExpression).toString();
-               else if (value != null)
-                       valueString = value;
-               else
-                       valueString = "null";
-                       
-               if (!valueString.equals(actualValue))
-               {
-                       testResult.doFail(target + "." + propertyName + " " + 
actualValue + " != " + valueString);      
-               }
-                               
-    }
-       
-    /**
-     *  customize string representation
-     */
-       @Override
-    public String toString()
-    {
-               String s = "AssertPropertyValue";
-               if (target != null)
-                       s += ": target = " + target.toString();
-               if (propertyName != null)
-                       s += ": propertyName = " + propertyName.toString();
-               if (value != null)
-                       s += ": value = " + value;
-               return s;
-       }
-       
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/AssertStep.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/AssertStep.java 
b/mustella/java/src/marmotinni/AssertStep.java
deleted file mode 100644
index a8223f7..0000000
--- a/mustella/java/src/marmotinni/AssertStep.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import org.openqa.selenium.WebDriver;
-
-/** 
- * AssertStep
- *
- * Base class for test steps like AssertPropertyValue, etc.
- */
-public class AssertStep extends TestStep { 
-
-
-       public AssertStep () { 
-       }
-
-       /**
-        *  Called by the test case in case you need to set up before execute()
-        */
-       public void preview(WebDriver webDriver, TestCase testCase, TestResult 
testResult)
-       {
-               this.webDriver = webDriver;
-               this.testCase = testCase;
-               this.testResult = testResult;
-       }
-       
-       public String target;
-       
-       /**
-        *  Called by the test case in case you need to clean up after execute()
-        */
-       public void cleanup()
-       {
-       }
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/DispatchKeyEvent.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/DispatchKeyEvent.java 
b/mustella/java/src/marmotinni/DispatchKeyEvent.java
deleted file mode 100644
index 1361432..0000000
--- a/mustella/java/src/marmotinni/DispatchKeyEvent.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import java.util.ArrayList;
-
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.Keys;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-
-import org.xml.sax.Attributes;
-
-/** 
- * DispatchKeyEvent
- *
- * Dispatch keys to the currently focused element
- */
-public class DispatchKeyEvent extends TestStep { 
-
-       public DispatchKeyEvent () { 
-       }
-
-       // 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 final int FLASH_UI_KEYBOARD_BACK = 0x01000016;
-       public static final int FLASH_UI_KEYBOARD_MENU = 0x01000012;
-       public static final int FLASH_UI_KEYBOARD_SEARCH = 0x0100001F;
-       
-    private StringBuilder charSequence;
-    private int currentRepeat;
-    private int currentKey;
-    private boolean sendBoth;
-    
-    /**
-     *  Set the target's property to the specified value
-     */
-       @Override
-    protected void doStep()
-    {
-        sendBoth = false;
-               
-        if (type == null)
-        {
-            sendBoth = true;
-            type = "keyDown";
-        }
-        
-        int i;
-        int j;
-        int n;
-        charSequence = new StringBuilder();
-                               
-        try
-        {
-                       for (i = 0; i < repeatCount; i++)
-                       {
-                               WebElement focusedElement = 
(WebElement)((JavascriptExecutor)webDriver).executeScript("return 
document.activeElement");
-                               if (chars != null)
-                               {
-                                       charSequence.append(chars);
-                                       focusedElement.sendKeys(charSequence);
-                               }
-                               else if (keys != null)
-                               {
-                                       n = keys.size();
-                                       for (j = 0; j < n; i++)
-                                       {
-                                               Keys key = 
Keys.valueOf(keys.get(j));
-                                               focusedElement.sendKeys(key);
-                                               // could be new focused element 
if tab or similar
-                                               focusedElement = 
(WebElement)((JavascriptExecutor)webDriver).executeScript("return 
document.activeElement");
-                                       }
-                               }
-                               else
-                               {
-                                       testResult.doFail("no keys specified");
-                                       return;
-                               }
-                       }
-               }
-               catch (Exception e1)
-               {
-                       TestOutput.logResult("Exception thrown in 
DispatchKeyEvent.");
-                       testResult.doFail (e1.getMessage()); 
-               }
-               
-    }
-       
-    /**
-     *  (Optional) name of a UI object whose Window/Stage
-     *  will be used to dispatch the event
-     */
-    public String window;
-       
-    /**
-     *  The type of the event to send (keyUp, keyDown, etc).
-     *  If not set, we'll send both a keyDown and a keyUp
-     */
-    public String type;
-       
-    /**
-     *  The char or sequence of chars to send as a string/char if you don't 
know the charCode (optional)
-     */
-    public String chars;
-       
-    /**
-     *  The ctrlKey property on the KeyboardEvent (optional)
-     */
-    public boolean ctrlKey;
-       
-    /**
-     *  The sequence of keys (optional) e.g ["LEFT", "UP"]
-     */
-    public ArrayList<String> keys;
-       
-    /**
-     *  The keyLocation property on the KeyboardEvent (optional)
-     */
-    public int keyLocation;
-       
-    /**
-     *  The number of times to repeat the sequence (optional)
-     */
-    public int repeatCount = 1;
-       
-    /**
-     *  The shiftKey property on the KeyboardEvent (optional)
-     */
-    public boolean shiftKey;
-       
-    /**
-     *  Designate the created event to be cancelable. by default, they are not
-     */
-    public boolean cancelable = false;
-           
-    /**
-     *  customize string representation
-     */
-       @Override
-    public String toString()
-    {
-               String s = "DispatchKeyEvent";
-               if (chars != null)
-                       s += ": char = " + chars;
-               if (keys != null)
-                       s += ": keys = " + keys.toString();
-               if (type != null)
-                       s += ", type = " + type;
-               if (shiftKey)
-                       s += ", shiftKey = true";
-               if (ctrlKey)
-                       s += ", ctrlKey = true";
-               if (repeatCount != 0)
-                       s += ", repeatCount = " + Integer.toString(repeatCount);
-               return s;
-       }
-
-       @Override
-       public void populateFromAttributes(Attributes attributes) throws 
Exception
-       {
-               chars = attributes.getValue("char");
-               String key = attributes.getValue("key");
-               if (key != null)
-               {
-                       keys = new ArrayList<String>();
-                       keys.add(key);
-               }
-               String keyAttr = attributes.getValue("keys");
-               if (keyAttr != null)
-               {
-                       keys = new ArrayList<String>();
-                       String keyList[] = keyAttr.split(",");
-                       for (String keyPart : keyList)
-                               keys.add(keyPart);
-               }
-               String keyCode = attributes.getValue("keyCode");
-               if (keyCode != null)
-                       throw new Exception("keyCode not supported");
-
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/DispatchMouseClickEvent.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/DispatchMouseClickEvent.java 
b/mustella/java/src/marmotinni/DispatchMouseClickEvent.java
deleted file mode 100644
index 66c65bc..0000000
--- a/mustella/java/src/marmotinni/DispatchMouseClickEvent.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-
-import org.xml.sax.Attributes;
-
-/** 
- * DispatchMouseClickEvent
- *
- * Dispatch click to the element under the mouse
- */
-public class DispatchMouseClickEvent extends TestStep { 
-
-    /**
-     *  Dispatch click event
-     */
-       @Override
-    protected void doStep()
-    {
-               
-               Long x;
-               Long y;
-               if (hasLocal)
-               {
-                       StringBuilder script = new StringBuilder();
-                       insertTargetScript(script, target);
-                       script.append("return target.element.offsetLeft");
-                       if (TestStep.showScripts)
-                               System.out.println(script);
-                       x = 
(Long)((JavascriptExecutor)webDriver).executeScript(script.toString());
-                       script = new StringBuilder();
-                       insertTargetScript(script, target);
-                       script.append("return target.element.offsetTop");
-                       if (TestStep.showScripts)
-                               System.out.println(script);
-                       y = 
(Long)((JavascriptExecutor)webDriver).executeScript(script.toString());
-                       x += localX;
-                       y += localY;
-               }
-               else
-               {
-                       x = stageX;
-                       y = stageY;
-               }
-               
-               // find top-most element
-               StringBuilder script = new StringBuilder();
-               script.append("var all = document.all;");
-               script.append("var n = all.length;");
-               script.append("for(var i=n-1;i>=0;i--) { ");
-               script.append("    var e = all[i];");
-               script.append("     if (" + x + " >= e.offsetLeft && " + x + " 
<= e.offsetLeft + e.offsetWidth && " + y + " >= e.offsetTop && " + y + " <= 
e.offsetTop + e.offsetHeight)");
-               script.append("         return e;");
-               script.append("};");
-               script.append("return null;");
-               if (TestStep.showScripts)
-                       System.out.println(script);
-               WebElement mouseTarget = 
(WebElement)((JavascriptExecutor)webDriver).executeScript(script.toString());
-        try
-        {
-                       mouseTarget.click();
-        }
-        catch (Exception e1)
-        {
-            TestOutput.logResult("Exception thrown in 
DispatchMouseClickEvent.");
-            testResult.doFail (e1.getMessage()); 
-        }
-               
-    }
-       
-       /**
-        *  The object that should receive the mouse event
-        */
-       public String target;
-       
-       /**
-        *  The ctrlKey property on the MouseEvent (optional)
-        */
-       public boolean ctrlKey;
-       
-       /**
-        *  The delta property on the MouseEvent (optional)
-        */
-       public int delta;
-       
-       private boolean hasLocal;
-       private boolean hasStage;
-       
-       /**
-        *  The localX property on the MouseEvent (optional)
-        *  Either set stageX/stageY or localX/localY, but not both.
-        */
-       public long localX;
-       
-       /**
-        *  The localY property on the MouseEvent (optional)
-        *  Either set stageX/stageY or localX/localY, but not both.
-        */
-       public long localY;
-       
-       /**
-        *  The stageX property on the MouseEvent (optional)
-        *  Either set stageX/stageY or localX/localY, but not both.
-        */
-       public long stageX;
-       
-       /**
-        *  The stageY property on the MouseEvent (optional)
-        *  Either set stageX/stageY or localX/localY, but not both.
-        */
-       public long stageY;
-       
-       /**
-        *  The shiftKey property on the MouseEvent (optional)
-        */
-       public boolean shiftKey;
-       
-       /**
-        *  The relatedObject property on the MouseEvent (optional)
-        */
-       public String relatedObject;
-       
-       /**
-        *  customize string representation
-        */
-       @Override 
-       public String toString()
-       {
-               String s = "DispatchMouseClickEvent: target = ";
-               s += target;
-               if (hasLocal)
-               {
-                       s += ", localX = " + Long.toString(localX);
-                       s += ", localY = " + Long.toString(localY);
-               }
-               if (hasStage)
-               {
-                       s += ", stageX = " + Long.toString(stageX);
-                       s += ", stageY = " + Long.toString(stageY);
-               }
-               if (shiftKey)
-                       s += ", shiftKey = true";
-               if (ctrlKey)
-                       s += ", ctrlKey = true";
-               
-               if (relatedObject != null)
-                       s += ", relatedObject = " + relatedObject;
-               if (delta != 0)
-                       s += ", delta = " + Integer.toString(delta);
-               return s;
-       }
-       
-       @Override
-       public void populateFromAttributes(Attributes attributes)
-       {
-               target = attributes.getValue("target");
-               String value = attributes.getValue("localX");
-               if (value != null)
-               {
-                       localX = Long.parseLong(value);
-                       hasLocal = true;
-               }
-               value = attributes.getValue("localY");
-               if (value != null)
-               {
-                       localY = Long.parseLong(value);
-                       hasLocal = true;
-               }
-               value = attributes.getValue("stageX");
-               if (value != null)
-               {
-                       stageX = Long.parseLong(value);
-                       hasStage = true;
-               }
-               value = attributes.getValue("stageY");
-               if (value != null)
-               {
-                       stageY = Long.parseLong(value);
-                       hasStage = true;
-               }
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/DispatchMouseEvent.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/DispatchMouseEvent.java 
b/mustella/java/src/marmotinni/DispatchMouseEvent.java
deleted file mode 100644
index 0f9a874..0000000
--- a/mustella/java/src/marmotinni/DispatchMouseEvent.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.remote.RemoteWebElement;
-
-import org.xml.sax.Attributes;
-
-/** 
- * DispatchMouseEvent
- *
- * Dispatch mouse event
- */
-public class DispatchMouseEvent extends TestStep { 
-
-    /**
-     *  Dispatch a mouse event
-     */
-       @Override
-    protected void doStep()
-    {
-               
-               Long x;
-               Long y;
-               if (hasLocal)
-               {
-                       StringBuilder script = new StringBuilder();
-                       insertTargetScript(script, target);
-                       script.append("return target.element.offsetLeft");
-                       if (TestStep.showScripts)
-                               System.out.println(script);
-                       x = 
(Long)((JavascriptExecutor)webDriver).executeScript(script.toString());
-                       script = new StringBuilder();
-                       insertTargetScript(script, target);
-                       script.append("return target.element.offsetTop");
-                       if (TestStep.showScripts)
-                               System.out.println(script);
-                       y = 
(Long)((JavascriptExecutor)webDriver).executeScript(script.toString());
-                       x += localX;
-                       y += localY;
-               }
-               else
-               {
-                       x = stageX;
-                       y = stageY;
-               }
-               
-               // find top-most element
-               StringBuilder script = new StringBuilder();
-               script.append("var all = document.all;");
-               script.append("var n = all.length;");
-               script.append("for(var i=n-1;i>=0;i--) { ");
-               script.append("    var e = all[i];");
-               script.append("     if (" + x + " >= e.offsetLeft && " + x + " 
<= e.offsetLeft + e.offsetWidth && " + y + " >= e.offsetTop && " + y + " <= 
e.offsetTop + e.offsetHeight) {");
-               script.append("         if (!e.id) e.id = 
Math.random().toString();");
-               script.append("         return e;");
-               script.append("     }");
-               script.append("};");
-               script.append("return null;");
-               if (TestStep.showScripts)
-                       System.out.println(script);
-               RemoteWebElement mouseTarget = 
(RemoteWebElement)((JavascriptExecutor)webDriver).executeScript(script.toString());
-               //System.out.println("mouseTarget: " + mouseTarget.getTagName() 
+ " " + mouseTarget.getAttribute("id"));
-               String actualId = mouseTarget.getAttribute("id");
-               
-               script = new StringBuilder();
-               script.append("var e = document.createEvent('MouseEvent');");
-               script.append("e.initMouseEvent(\"" + type + "\", true, false, 
window, " + delta + ", " + x + ", " + y + ", " + localX + ", " + localY + ", " 
+ ctrlKey + ", false, " + shiftKey + ", false, " + type.equals("mouseDown") + 
", " + relatedObject + ");");
-               script.append("document.getElementById('" + actualId + 
"').dispatchEvent(e);");
-               if (TestStep.showScripts)
-                       System.out.println(script);
-        try
-        {
-                       
((JavascriptExecutor)webDriver).executeScript(script.toString());
-        }
-        catch (Exception e1)
-        {
-            TestOutput.logResult("Exception thrown in DispatchMouseEvent.");
-            testResult.doFail (e1.getMessage()); 
-        }
-               
-    }
-       
-       /**
-        *  The object that should receive the mouse event
-        */
-       public String target;
-       
-       /**
-        *  The type/name of the event
-        */
-       public String type;
-       
-       /**
-        *  The ctrlKey property on the MouseEvent (optional)
-        */
-       public boolean ctrlKey;
-       
-       /**
-        *  The delta property on the MouseEvent (optional)
-        */
-       public int delta;
-       
-       private boolean hasLocal;
-       private boolean hasStage;
-
-       /**
-        *  The localX property on the MouseEvent (optional)
-        *  Either set stageX/stageY or localX/localY, but not both.
-        */
-       public long localX;
-       
-       /**
-        *  The localY property on the MouseEvent (optional)
-        *  Either set stageX/stageY or localX/localY, but not both.
-        */
-       public long localY;
-       
-       /**
-        *  The stageX property on the MouseEvent (optional)
-        *  Either set stageX/stageY or localX/localY, but not both.
-        */
-       public long stageX;
-       
-       /**
-        *  The stageY property on the MouseEvent (optional)
-        *  Either set stageX/stageY or localX/localY, but not both.
-        */
-       public long stageY;
-       
-       /**
-        *  The shiftKey property on the MouseEvent (optional)
-        */
-       public boolean shiftKey;
-       
-       /**
-        *  The relatedObject property on the MouseEvent (optional)
-        */
-       public String relatedObject;
-       
-       /**
-        *  customize string representation
-        */
-       @Override 
-       public String toString()
-       {
-               String s = "DispatchMouseEvent: target = ";
-               s += target;
-               if (hasLocal)
-               {
-                       s += ", localX = " + Long.toString(localX);
-                       s += ", localY = " + Long.toString(localY);
-               }
-               if (hasStage)
-               {
-                       s += ", stageX = " + Long.toString(stageX);
-                       s += ", stageY = " + Long.toString(stageY);
-               }
-               if (shiftKey)
-                       s += ", shiftKey = true";
-               if (ctrlKey)
-                       s += ", ctrlKey = true";
-               
-               if (relatedObject != null)
-                       s += ", relatedObject = " + relatedObject;
-               if (delta != 0)
-                       s += ", delta = " + Integer.toString(delta);
-               return s;
-       }
-       
-       @Override
-       public void populateFromAttributes(Attributes attributes)
-       {
-               target = attributes.getValue("target");
-               type = attributes.getValue("type");
-               String value = attributes.getValue("localX");
-               if (value != null)
-               {
-                       localX = Long.parseLong(value);
-                       hasLocal = true;
-               }
-               value = attributes.getValue("localY");
-               if (value != null)
-               {
-                       localY = Long.parseLong(value);
-                       hasLocal = true;
-               }
-               value = attributes.getValue("stageX");
-               if (value != null)
-               {
-                       stageX = Long.parseLong(value);
-                       hasStage = true;
-               }
-               value = attributes.getValue("stageY");
-               if (value != null)
-               {
-                       stageY = Long.parseLong(value);
-                       hasStage = true;
-               }
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/MarmotinniRunner.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/MarmotinniRunner.java 
b/mustella/java/src/marmotinni/MarmotinniRunner.java
deleted file mode 100644
index 73061fd..0000000
--- a/mustella/java/src/marmotinni/MarmotinniRunner.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.firefox.FirefoxDriver;
-import org.openqa.selenium.chrome.ChromeDriver;
-import org.openqa.selenium.firefox.FirefoxProfile;
-import org.openqa.selenium.firefox.internal.ProfilesIni;
-
-import java.io.IOException;
-import java.nio.CharBuffer;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-
-/** 
- * TestEngine
- *
- * Runs a mustella script by parsing it and executing its contents
- *
- */
-public class MarmotinniRunner extends DefaultHandler { 
-
-       public MarmotinniRunner () { 
-       }
-
-       public boolean runTest(WebDriver webDriver, String scriptName)
-       {
-               if (tagMap == null)
-                       setupMap();
-               tests = new ArrayList<TestCase>();
-               
-               System.out.println("running script " + scriptName);
-               
-               SAXParserFactory spf = SAXParserFactory.newInstance();
-               try {
-                       
-                       //get a new instance of parser
-                       SAXParser sp = spf.newSAXParser();
-                       
-                       //parse the file and also register this class for call 
backs
-                       sp.parse(scriptName, this);
-                       
-               }catch(SAXException se) {
-                       se.printStackTrace();
-               }catch(ParserConfigurationException pce) {
-                       pce.printStackTrace();
-               }catch (IOException ie) {
-                       ie.printStackTrace();
-               }
-               boolean success = true;
-               System.out.println("test case count: " + tests.size());
-               for (TestCase testCase : tests)
-               {
-                       this.testCase = testCase;
-                       testCase.runTest(webDriver);
-                       TestResult testResult = testCase.getTestResult();
-                       testResult.scriptName = scriptName;
-                       if (!testResult.hasStatus())
-                               testResult.result = TestResult.PASS;
-                       else
-                       {
-                               System.out.println("test failure");
-                               success = false;
-                       }
-                       System.out.println(testResult.toString());
-               }
-               return success;
-       }
-
-       private HashMap<String, Class<?>> tagMap = null;
-       
-       private void setupMap()
-       {
-               tagMap = new HashMap<String, Class<?>>();
-               tagMap.put("SetProperty", SetProperty.class);
-               tagMap.put("DispatchKeyEvent", DispatchKeyEvent.class);
-               tagMap.put("DispatchMouseEvent", DispatchMouseEvent.class);
-               tagMap.put("DispatchMouseClickEvent", 
DispatchMouseClickEvent.class);
-               tagMap.put("AssertPropertyValue", AssertPropertyValue.class);
-       }
-       
-       private boolean verboseXMLParsing;
-       private ArrayList<TestCase> tests;
-       private TestCase testCase;
-       private String currentPhase;
-       
-       //Event Handlers
-       public void startElement(String uri, String localName, String qName, 
Attributes attributes) throws SAXException {
-               if (verboseXMLParsing)
-                       System.out.println("StartElement: uri: " + uri + 
"localName: " + localName + "qName: " + qName);
-               if(qName.equalsIgnoreCase("UnitTester")) {
-                       // this should be the top-level tag, just ignore for 
now.  Will need to process script subtags later
-               }
-               else if (qName.length() == 0)
-               {
-                       // there seems to be some empty tags
-               }
-               else if (qName.equalsIgnoreCase("testCases"))
-               {
-                       // there seems to be some empty tags
-               }
-               else if (qName.equalsIgnoreCase("mx:Script"))
-               {
-                       // there seems to be some empty tags
-               }
-               else if (qName.equalsIgnoreCase("mx:Metadata"))
-               {
-                       // there seems to be some empty tags
-               }
-               else if (qName.equalsIgnoreCase("TestCase")) {
-                       testCase = new TestCase();
-                       testCase.populateFromAttributes(attributes);
-                       tests.add(testCase);
-               }
-               else if (tagMap.containsKey(qName)) {
-                       Class<?> c = tagMap.get(qName);
-                       try {
-                               TestStep testStep = (TestStep)c.newInstance(); 
-                               testStep.populateFromAttributes(attributes);
-                               if (currentPhase.equals("setup"))
-                                       testCase.setup.add(testStep);
-                               else if (currentPhase.equals("body"))
-                                       testCase.body.add(testStep);
-                               else
-                                       testCase.cleanup.add(testStep);
-                       }
-                       catch (Exception e) {
-                               System.out.println(e.getMessage());
-                               return;
-                       }
-               }
-               else if (qName.equals("setup")) {
-                       currentPhase = "setup";
-                       testCase.setup = new ArrayList<TestStep>();
-               }
-               else if (qName.equals("body")) {
-                       currentPhase = "body";
-                       testCase.body = new ArrayList<TestStep>();
-               }
-               else if (qName.equals("cleanup")) {
-                       currentPhase = "cleanup";
-                       testCase.cleanup = new ArrayList<TestStep>();
-               }
-               else {
-                       System.out.println("unexpected element: " + uri + 
qName);
-               }
-
-       }
-       
-       
-       public void characters(char[] ch, int start, int length) throws 
SAXException {
-               CharBuffer cb = CharBuffer.allocate(ch.length);
-               cb.put(ch);
-               String s = cb.toString();
-               if (verboseXMLParsing)
-                       if (s.trim().length() > 0)
-                               System.out.println("unexpected characters: " + 
s);
-       }
-       
-       public void endElement(String uri, String localName, String qName) 
throws SAXException {
-               if (verboseXMLParsing)
-                       System.out.println("EndElement: uri: " + uri + 
"localName: " + localName + "qName: " + qName);
-       }
-       
-       public static void main(String[] args)
-    {
-               ArrayList<String> scripts = new ArrayList<String>();
-        Map<String, String> argsMap = new HashMap<String, String>();
-        for (String arg : args)
-        {
-            String[] keyValuePair = arg.split("=");
-                       if (keyValuePair[0].equals("script"))
-                               scripts.add(keyValuePair[1]);
-                       else    
-                               argsMap.put(keyValuePair[0], keyValuePair[1]);
-        }
-        final String showScriptsArg = argsMap.get("showScripts");
-        TestStep.showScripts = showScriptsArg != null && 
showScriptsArg.equalsIgnoreCase("true");
-        final String showStepsArg = argsMap.get("showSteps");
-        TestCase.showSteps = showStepsArg != null && 
showStepsArg.equalsIgnoreCase("true");
-               
-        final String url = argsMap.get("url");
-               System.out.println(url);
-        
-               final String browser = argsMap.get("browser");
-        WebDriver driver;
-               if (browser != null && browser.equalsIgnoreCase("chrome"))
-                       driver = new ChromeDriver();
-               else if (argsMap.containsKey("profile"))
-               {
-                       ProfilesIni profile = new ProfilesIni();
-                       FirefoxProfile ffprofile = 
profile.getProfile(argsMap.get("profile"));
-                       System.out.println("FireFox Profile: " + 
argsMap.get("profile"));                       
-                       driver = new FirefoxDriver(ffprofile);
-               }
-               else
-                       driver = new FirefoxDriver();
-               
-        driver.get(url);
-               
-               int exitCode = 0;
-               try 
-               {
-                       MarmotinniRunner mr = new MarmotinniRunner();
-                       final String verboseXMLParsingArg = 
argsMap.get("verboseXMLParsing");
-                       mr.verboseXMLParsing = verboseXMLParsingArg != null && 
verboseXMLParsingArg.equalsIgnoreCase("true");
-                       int n = scripts.size();
-                       for (int i = 0; i < n; i++)
-                       {
-                               if (!mr.runTest(driver, scripts.get(i)))
-                               {
-                                       System.out.println("script failed");
-                                       exitCode = 1;
-                               }
-                       }                       
-               }
-               catch (Exception e)
-        {
-            System.out.println(e.getMessage());
-                       exitCode = 1;
-        }
-        finally
-        {
-            driver.quit();
-        }
-               System.exit(exitCode);
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/SetProperty.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/SetProperty.java 
b/mustella/java/src/marmotinni/SetProperty.java
deleted file mode 100644
index b05c419..0000000
--- a/mustella/java/src/marmotinni/SetProperty.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import org.openqa.selenium.JavascriptExecutor;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-
-import org.xml.sax.Attributes;
-
-/** 
- * SetProperty
- *
- * Set a property
- */
-public class SetProperty extends TestStep { 
-
-       public SetProperty () { 
-       }
-
-    /**
-     *  Set the target's property to the specified value
-     */
-       @Override
-    protected void doStep()
-    {
-               String valueString = null;
-               if (valueExpression != null)
-                       valueString = 
((JavascriptExecutor)webDriver).executeScript(valueExpression).toString();
-               else if (value != null)
-               {
-                       if (value.equalsIgnoreCase("false") || 
value.equalsIgnoreCase("true"))
-                               valueString = value;
-                       else {                          
-                               try {
-                                       Double.parseDouble(value);
-                                       valueString = value;
-                               }
-                               catch (Exception e) {
-                                       valueString = "'" + value + "'";
-                               }
-                       }
-               }
-               else
-                       valueString = "null";
-               
-               StringBuilder setScript = new StringBuilder();
-               insertTargetScript(setScript, target);
-               setScript.append("if (typeof(target['set_' + '" + propertyName 
+ "']) == 'function') target['set_' + '" + propertyName + "'](" + valueString + 
");");
-               setScript.append(" else target['" + propertyName + "']=" + 
valueString + ";");
-               if (TestStep.showScripts)
-                       System.out.println(setScript.toString());
-               
((JavascriptExecutor)webDriver).executeScript(setScript.toString());
-    }
-       
-       /**
-        *  The object to set a property on
-        */
-       public String target;
-       
-       /**
-        *  The name of the property to set
-        */
-       public String propertyName;
-       
-       /**
-        *  The value to set
-        */
-       public String value;
-       
-       /**
-        *  The value to set
-        */
-       public String valueExpression;
-       
-    /**
-     *  customize string representation
-     */
-       @Override
-    public String toString()
-    {
-               String s = "SetProperty";
-               if (target != null)
-                       s += ": target = " + target.toString();
-               if (propertyName != null)
-                       s += ": propertyName = " + propertyName.toString();
-               if (value != null)
-                       s += ": value = " + value;
-               return s;
-       }
-
-       @Override
-       public void populateFromAttributes(Attributes attributes)
-       {
-               target = attributes.getValue("target");
-               propertyName = attributes.getValue("propertyName");
-               value = attributes.getValue("value");
-               valueExpression = attributes.getValue("valueExpression");
-       }
-
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/TestCase.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/TestCase.java 
b/mustella/java/src/marmotinni/TestCase.java
deleted file mode 100644
index 06e0e80..0000000
--- a/mustella/java/src/marmotinni/TestCase.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Date;
-
-import org.openqa.selenium.WebDriver;
-
-import org.xml.sax.Attributes;
-
-/** 
- * TestCase
- *
- * A set of TestSteps.
- */
-public class TestCase { 
-
-       public static boolean showSteps = false;
-       
-       /**
-        *  The history of bugs that this test case has encountered
-        */
-       public List<String> bugs;
-       
-       /**
-        *  The sequence of TestSteps that comprise the test setup
-        */
-       public List<TestStep> setup;
-       
-       /**
-        *  The sequence of TestSteps that comprise the test
-        */
-       public List<TestStep> body;
-       
-       /**
-        *  The sequence of TestSteps that restore the test environment
-        */
-       public List<TestStep> cleanup;
-       
-       /**
-        *  An identifier for the test
-        */
-       public String testID;
-       
-       /**
-        *  A description of the test 
-        */
-       public String description;
-       
-       /**
-        *  keywords, summarizing the tests
-        */
-       public String keywords;
-       
-       /**
-        *  frequency, an estimate of the tests's intersection with real-world
-        *  usage. 1 = most frequent usage; 2 somewhat common; 3 = unusual
-        */
-       public String frequency;
-       
-       /**
-        *  The current set of steps (setup, body, cleanup) we are executing
-        */
-       private List<TestStep> currentSteps;
-       
-       /**
-        *  Which step we're currently executing (or waiting on an event for)
-        */
-       private int currentIndex = 0;
-       
-       /**
-        *  Number of steps in currentSteps
-        */
-       private int numSteps = 0;
-       
-       /**
-        *  Storage for the cleanupAsserts
-        */
-       private List<AssertStep> cleanupAsserts;
-       
-       /**
-        *  Steps we have to review at the end of the body to see if
-        *  they failed or not.  These steps monitor activity like
-        *  checking for duplicate events or making sure unwanted events
-        *  don't fire.
-        */
-       public List<AssertStep> getCleanupAsserts()
-       {
-               return cleanupAsserts;
-       }
-       
-       /**
-        *  Storage for this tests's result
-        */
-       private TestResult testResult;
-       
-       /**
-        *  This tests's result
-        */
-       public TestResult getTestResult() 
-       { 
-               testResult.testID = testID;
-               return testResult;
-       }
-       
-       /**
-        * Constructor. Create the TestResult associated with this TestCase
-        */
-       public TestCase() {
-               
-               testResult = new TestResult();
-               testResult.testID = testID;
-               
-               cleanupAsserts = new ArrayList<AssertStep>();
-       }
-       
-       /**
-        *  Called when it is time to execute
-        *  this test case.
-        *
-        */
-       public boolean runTest(WebDriver webDriver)
-       {
-               testResult.beginTime = new Date().getTime();
-                                               
-               return runSetup(webDriver);
-       }
-       
-       /**
-        *  Execute the setup portion of the test
-        */
-       private boolean runSetup(WebDriver webDriver)
-       {
-               if (!testResult.hasStatus()) 
-               { 
-                       if (setup != null)
-                       {
-                               testResult.phase = TestResult.SETUP;
-                               currentIndex = 0;
-                               currentSteps = setup;
-                               numSteps = setup.size();
-                               // return if we need to wait for something
-                               if (!runSteps(webDriver))
-                                       return false;
-                               
-                       }
-               }
-               return runBody(webDriver);
-       }
-       
-       /**
-        *  Execute the body portion of the test
-        */
-       private boolean runBody(WebDriver webDriver)
-       {
-               if (!testResult.hasStatus()) 
-               { 
-                       if (body != null)
-                       {
-                               testResult.phase = TestResult.BODY;
-                               currentIndex = 0;
-                               currentSteps = body;
-                               numSteps = body.size();
-                               // return if we need to wait for something
-                               if (!runSteps(webDriver))
-                                       return false;
-                               
-                       }
-               }
-               return runCleanup(webDriver);
-       }
-       
-       /**
-        *  Execute the cleanup portion of the test
-        */
-       private boolean runCleanup(WebDriver webDriver)
-       {
-               if (!testResult.hasStatus()) 
-               { 
-                       if (cleanup != null)
-                       {
-                               testResult.phase = TestResult.CLEANUP;
-                               currentIndex = 0;
-                               currentSteps = cleanup;
-                               numSteps = cleanup.size();
-                               // return if we need to wait for something
-                               if (!runSteps(webDriver))
-                                       return false;
-                               
-                       }
-               }
-               return runComplete();
-       }
-       
-       /**
-        *  Clean up when all three phases are done.  Sends an event
-        *  to the UnitTester harness to tell it that it can run
-        *  the next test case.
-        */
-       private boolean runComplete()
-       {
-               int n = cleanupAsserts.size();
-               for (int i = 0; i < n; i++)
-               {
-                       AssertStep asrt = cleanupAsserts.get(i);
-                       asrt.cleanup();
-               }
-               testResult.endTime = new Date().getTime();
-               return true;
-       }
-       
-       /**
-        *  Go through the currentSteps, executing each one.
-        *  Returns true if no test steps required waiting.
-        *  Returns false if we have to wait for an event before
-        *  continuing.
-        */
-       private boolean runSteps(WebDriver webDriver)
-       {
-               while (currentIndex < numSteps)
-               {
-                       // return if a step failed
-                       if (testResult.hasStatus()) 
-                               return true;
-                       
-                       TestStep step = currentSteps.get(currentIndex);
-                       if (!(step instanceof AssertStep))
-                       {
-                               // look at subsequent steps for Asserts and set 
them up early
-                               for (int j = currentIndex + 1; j < numSteps; 
j++)
-                               {
-                                       // scan following asserts for 
AssertEvents and set them up early
-                                       TestStep nextStep = currentSteps.get(j);
-                                       if (nextStep instanceof AssertStep)
-                                       {
-                                               
((AssertStep)nextStep).preview(webDriver, this, testResult);
-                                               /* TODO: (aharui) re-enable 
when we need these asserts
-                                               // do a check to be sure folks 
are using AssertEventPropertyValue correctly
-                                               if (nextStep instanceof 
AssertEventPropertyValue)
-                                               {
-                                                       // AEPV must follow an 
AssertEvent or another AEPV
-                                                       if (j == 0 || 
!(currentSteps[j-1] instanceof AssertEvent || currentSteps[j-1] instanceof 
AssertEventPropertyValue))
-                                                               
TestOutput.logResult("WARNING: AssertEventPropertyValue may be missing 
preceding AssertEvent");
-                                               }
-                                               else if (nextStep instanceof 
AssertError)
-                                               {
-                                                       if (step instanceof 
SetProperty)
-                                                               
SetProperty(step).expectError = true;
-                                               }
-                                               */
-                                       }
-                                       else
-                                               break;
-                               }
-                       }
-                       if (TestCase.showSteps)
-                               System.out.println(step.toString());
-                       step.execute(webDriver, this, testResult);
-                       currentIndex++;
-               }
-               return true;
-       }
-                               
-       public void populateFromAttributes(Attributes attributes)
-       {
-               description = attributes.getValue("description");
-               testID = attributes.getValue("testID");
-               keywords = attributes.getValue("keywords");
-               frequency = attributes.getValue("frequency");
-               
-       }
-       
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/TestOutput.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/TestOutput.java 
b/mustella/java/src/marmotinni/TestOutput.java
deleted file mode 100644
index 4b63f10..0000000
--- a/mustella/java/src/marmotinni/TestOutput.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-/**
- *  The class that collects TestResults for a TestCase
- */
-public class TestOutput 
-{
-       
-       /** 
-        *  get printable version of phase
-        */
-       public static void logResult(String message) { 
-               System.out.println(message);
-       }
-       
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/TestResult.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/TestResult.java 
b/mustella/java/src/marmotinni/TestResult.java
deleted file mode 100644
index 1d64bae..0000000
--- a/mustella/java/src/marmotinni/TestResult.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import java.util.Date;
-
-/**
- *  The class that collects TestResults for a TestCase
- */
-public class TestResult 
-{
-       
-       public static final int PASS = 0;
-       public static final int FAIL = 1;
-       public static final int ERROR = 2;
-       
-       public static final int SETUP = 0;
-       public static final int BODY = 1;
-       public static final int CLEANUP = 2;
-       
-       /** 
-        *  testID
-        */
-       public String testID;
-       
-       /** 
-        *  begin time
-        */
-       public long beginTime;
-       
-       /** 
-        *  end time
-        */
-       public long endTime;
-       
-       /** 
-        *  result
-        */
-       public int result = -1;  // "pass", "fail", "error"
-       
-       /** 
-        *  message. Failures often have messages
-        */
-       public String message = "";
-       
-       /** 
-        *  extraInfo: failures may have a file associated 
-        */
-       public String extraInfo = "";
-       
-       /** 
-        *  Name of the Script associated with this result
-        */
-       public String scriptName = "";
-       
-       /** 
-        *  phase. how far the test finished. setup, body, cleanup
-        */
-       public int phase = -1;
-       
-       /** 
-        *  get printable version of phase
-        */
-       public static String getPhaseString(int val) { 
-               if (val == CLEANUP) {
-                       return "cleanup";
-               }else if (val == BODY) {
-                       return "body";
-               }else if (val == SETUP) {
-                       return "setup";
-                       
-               }
-               return "no phase set";
-       }
-       
-       /** 
-        *  get printable version of result
-        */
-       public static String getResultString(int val) { 
-               if (val == PASS) {
-                       return "pass";
-               }else if (val == FAIL) {
-                       return "fail";
-               }else if (val == ERROR) {
-                       return "error";
-               }
-               return null;
-       }
-       
-       
-       /** 
-        *  default output look
-        */
-       public String toString() 
-       { 
-               return "RESULT: scriptName=" + scriptName + " id=" + testID + " 
result=" + getResultString(result)  + " elapsed=" + (endTime-beginTime) + " 
phase=" + getPhaseString(phase) + " started=" + beginTime + " extraInfo=" + 
extraInfo + " msg=" + message ;
-       }
-       
-       
-       public boolean hasStatus() { 
-               return (result != -1);
-       }
-       
-       
-       public void doFail (String msg) {
-               doFail(msg, null, null, 0);
-       }
-       
-       public void doFail (String msg, String extraInfo) { 
-               doFail(msg, extraInfo, null, 0);
-       }
-       
-       public void doFail (String msg, String extraInfo, TestStep lastStep, 
int lastStepLine) { 
-               // first failure is the one we keep
-               if (this.result != FAIL)
-               {
-                       this.result = FAIL;
-                       // this.message = msg;
-                       if (lastStep != null)
-                       { 
-                               String tmp = lastStep.toString().substring(0, 
lastStep.toString().indexOf (":")) + "(" + getPhaseString(phase) + ":step " + 
(lastStepLine + 1) + ") ";
-                               this.message = tmp + " " + msg;
-                       } 
-                       else 
-                       {
-                               this.message = msg;
-                       }
-                       this.extraInfo = extraInfo;
-               }
-       }
-       
-       
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/java/src/marmotinni/TestStep.java
----------------------------------------------------------------------
diff --git a/mustella/java/src/marmotinni/TestStep.java 
b/mustella/java/src/marmotinni/TestStep.java
deleted file mode 100644
index 23eb1b3..0000000
--- a/mustella/java/src/marmotinni/TestStep.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *
- * 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 marmotinni;
-
-import org.openqa.selenium.WebDriver;
-
-import org.xml.sax.Attributes;
-
-/** 
- * TestStep
- *
- * Base class for test steps like DispatchMouseEvent and AssertPropertyValue, 
etc.
- */
-public class TestStep { 
-
-       public static boolean showScripts = false;
-
-       public TestStep () { 
-       }
-
-       public boolean execute(WebDriver webDriver, TestCase testCase, 
TestResult testResult)
-       {
-               this.webDriver = webDriver;
-               this.testCase = testCase;
-               this.testResult = testResult;
-                               
-               doStep();
-               
-               // if test failed, don't bother waiting, just bail
-               if (testResult.hasStatus())
-               {
-                       if (waitEvent != null)
-                       {
-                               /* TODO: figure out how to wait */
-                       }
-               }
-               
-               return true;
-       }
-       
-       /**
-        *  The name of the object to listen for an event we're waiting on
-        */
-       public String waitTarget;
-       
-       /**
-        *  The name of the event to listen for on the waitTarget
-        */
-       public String waitEvent;
-       
-       /**
-        *  The number of milliseconds to wait before giving up
-        */
-       public int timeout = 3000;
-       
-       /**
-        *  The TestResult for this TestCase
-        */
-       protected TestResult testResult;
-       
-       /**
-        *  The TestCase that this step belongs to
-        */
-       protected TestCase testCase;
-
-       /**
-        *  The WebDriver for this session
-        */
-       protected WebDriver webDriver;
-       
-       /**
-        *  The method that gets called when it is time to perform the work in 
the step.
-        */
-       protected void doStep()
-       {
-       }
-       
-       public void populateFromAttributes(Attributes attributes) throws 
Exception
-       {
-               waitTarget = attributes.getValue("waitTarget");
-               waitEvent = attributes.getValue("waitEvent");
-       }
-       
-       protected void insertTargetScript(StringBuilder sb, String target)
-       {
-               sb.append("var target = 
document.getElementsByTagName('body')[0];");
-               sb.append("target = target.flexjs_wrapper;");
-               sb.append("target = target.initialView;");
-               if (target == null || target.length() == 0)
-               {
-                       return;
-               }
-               String parts[] = target.split("\\.");
-               int n = parts.length;
-               for (int i = 0; i < n; i++)
-               {
-                       sb.append("target = target['" + parts[i] + "'];");
-               }
-
-       }
-       
-       public String toString()
-       {
-               return "";
-       }
-}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/AssertPropertyValue.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/AssertPropertyValue.java 
b/mustella/src/main/java/marmotinni/AssertPropertyValue.java
new file mode 100644
index 0000000..156be82
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/AssertPropertyValue.java
@@ -0,0 +1,103 @@
+/*
+ *
+ * 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 marmotinni;
+
+import org.openqa.selenium.JavascriptExecutor;
+
+import org.xml.sax.Attributes;
+
+/** 
+ * AssertPropertyValue
+ *
+ * Assert if a property is set to the right value
+ */
+public class AssertPropertyValue extends AssertStep { 
+
+
+       public AssertPropertyValue () { 
+       }
+       
+       /**
+        *  The name of the property to test
+        */
+       public String propertyName;
+       
+       /**
+        *  The value the property should have
+        */
+       public String value;
+
+       /**
+        *  The value the property should have
+        */
+       public String valueExpression;
+       
+       @Override
+       public void populateFromAttributes(Attributes attributes)
+       {
+               target = attributes.getValue("target");
+               propertyName = attributes.getValue("propertyName");
+               value = attributes.getValue("value");
+               valueExpression = attributes.getValue("valueExpression");
+       }
+       
+       @Override
+    protected void doStep()
+    {
+               
+               StringBuilder getScript = new StringBuilder();
+               insertTargetScript(getScript, target);
+               getScript.append(" return target['" + propertyName + "'];");
+               if (TestStep.showScripts)
+                       System.out.println(getScript.toString());
+               String actualValue = 
((JavascriptExecutor)webDriver).executeScript(getScript.toString()).toString();
+               String valueString = null;
+               if (valueExpression != null)
+                       valueString = 
((JavascriptExecutor)webDriver).executeScript(valueExpression).toString();
+               else if (value != null)
+                       valueString = value;
+               else
+                       valueString = "null";
+                       
+               if (!valueString.equals(actualValue))
+               {
+                       testResult.doFail(target + "." + propertyName + " " + 
actualValue + " != " + valueString);      
+               }
+                               
+    }
+       
+    /**
+     *  customize string representation
+     */
+       @Override
+    public String toString()
+    {
+               String s = "AssertPropertyValue";
+               if (target != null)
+                       s += ": target = " + target.toString();
+               if (propertyName != null)
+                       s += ": propertyName = " + propertyName.toString();
+               if (value != null)
+                       s += ": value = " + value;
+               return s;
+       }
+       
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/AssertStep.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/AssertStep.java 
b/mustella/src/main/java/marmotinni/AssertStep.java
new file mode 100644
index 0000000..a8223f7
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/AssertStep.java
@@ -0,0 +1,54 @@
+/*
+ *
+ * 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 marmotinni;
+
+import org.openqa.selenium.WebDriver;
+
+/** 
+ * AssertStep
+ *
+ * Base class for test steps like AssertPropertyValue, etc.
+ */
+public class AssertStep extends TestStep { 
+
+
+       public AssertStep () { 
+       }
+
+       /**
+        *  Called by the test case in case you need to set up before execute()
+        */
+       public void preview(WebDriver webDriver, TestCase testCase, TestResult 
testResult)
+       {
+               this.webDriver = webDriver;
+               this.testCase = testCase;
+               this.testResult = testResult;
+       }
+       
+       public String target;
+       
+       /**
+        *  Called by the test case in case you need to clean up after execute()
+        */
+       public void cleanup()
+       {
+       }
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/DispatchKeyEvent.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/DispatchKeyEvent.java 
b/mustella/src/main/java/marmotinni/DispatchKeyEvent.java
new file mode 100644
index 0000000..1361432
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/DispatchKeyEvent.java
@@ -0,0 +1,203 @@
+/*
+ *
+ * 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 marmotinni;
+
+import java.util.ArrayList;
+
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.Keys;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import org.xml.sax.Attributes;
+
+/** 
+ * DispatchKeyEvent
+ *
+ * Dispatch keys to the currently focused element
+ */
+public class DispatchKeyEvent extends TestStep { 
+
+       public DispatchKeyEvent () { 
+       }
+
+       // 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 final int FLASH_UI_KEYBOARD_BACK = 0x01000016;
+       public static final int FLASH_UI_KEYBOARD_MENU = 0x01000012;
+       public static final int FLASH_UI_KEYBOARD_SEARCH = 0x0100001F;
+       
+    private StringBuilder charSequence;
+    private int currentRepeat;
+    private int currentKey;
+    private boolean sendBoth;
+    
+    /**
+     *  Set the target's property to the specified value
+     */
+       @Override
+    protected void doStep()
+    {
+        sendBoth = false;
+               
+        if (type == null)
+        {
+            sendBoth = true;
+            type = "keyDown";
+        }
+        
+        int i;
+        int j;
+        int n;
+        charSequence = new StringBuilder();
+                               
+        try
+        {
+                       for (i = 0; i < repeatCount; i++)
+                       {
+                               WebElement focusedElement = 
(WebElement)((JavascriptExecutor)webDriver).executeScript("return 
document.activeElement");
+                               if (chars != null)
+                               {
+                                       charSequence.append(chars);
+                                       focusedElement.sendKeys(charSequence);
+                               }
+                               else if (keys != null)
+                               {
+                                       n = keys.size();
+                                       for (j = 0; j < n; i++)
+                                       {
+                                               Keys key = 
Keys.valueOf(keys.get(j));
+                                               focusedElement.sendKeys(key);
+                                               // could be new focused element 
if tab or similar
+                                               focusedElement = 
(WebElement)((JavascriptExecutor)webDriver).executeScript("return 
document.activeElement");
+                                       }
+                               }
+                               else
+                               {
+                                       testResult.doFail("no keys specified");
+                                       return;
+                               }
+                       }
+               }
+               catch (Exception e1)
+               {
+                       TestOutput.logResult("Exception thrown in 
DispatchKeyEvent.");
+                       testResult.doFail (e1.getMessage()); 
+               }
+               
+    }
+       
+    /**
+     *  (Optional) name of a UI object whose Window/Stage
+     *  will be used to dispatch the event
+     */
+    public String window;
+       
+    /**
+     *  The type of the event to send (keyUp, keyDown, etc).
+     *  If not set, we'll send both a keyDown and a keyUp
+     */
+    public String type;
+       
+    /**
+     *  The char or sequence of chars to send as a string/char if you don't 
know the charCode (optional)
+     */
+    public String chars;
+       
+    /**
+     *  The ctrlKey property on the KeyboardEvent (optional)
+     */
+    public boolean ctrlKey;
+       
+    /**
+     *  The sequence of keys (optional) e.g ["LEFT", "UP"]
+     */
+    public ArrayList<String> keys;
+       
+    /**
+     *  The keyLocation property on the KeyboardEvent (optional)
+     */
+    public int keyLocation;
+       
+    /**
+     *  The number of times to repeat the sequence (optional)
+     */
+    public int repeatCount = 1;
+       
+    /**
+     *  The shiftKey property on the KeyboardEvent (optional)
+     */
+    public boolean shiftKey;
+       
+    /**
+     *  Designate the created event to be cancelable. by default, they are not
+     */
+    public boolean cancelable = false;
+           
+    /**
+     *  customize string representation
+     */
+       @Override
+    public String toString()
+    {
+               String s = "DispatchKeyEvent";
+               if (chars != null)
+                       s += ": char = " + chars;
+               if (keys != null)
+                       s += ": keys = " + keys.toString();
+               if (type != null)
+                       s += ", type = " + type;
+               if (shiftKey)
+                       s += ", shiftKey = true";
+               if (ctrlKey)
+                       s += ", ctrlKey = true";
+               if (repeatCount != 0)
+                       s += ", repeatCount = " + Integer.toString(repeatCount);
+               return s;
+       }
+
+       @Override
+       public void populateFromAttributes(Attributes attributes) throws 
Exception
+       {
+               chars = attributes.getValue("char");
+               String key = attributes.getValue("key");
+               if (key != null)
+               {
+                       keys = new ArrayList<String>();
+                       keys.add(key);
+               }
+               String keyAttr = attributes.getValue("keys");
+               if (keyAttr != null)
+               {
+                       keys = new ArrayList<String>();
+                       String keyList[] = keyAttr.split(",");
+                       for (String keyPart : keyList)
+                               keys.add(keyPart);
+               }
+               String keyCode = attributes.getValue("keyCode");
+               if (keyCode != null)
+                       throw new Exception("keyCode not supported");
+
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/DispatchMouseClickEvent.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/DispatchMouseClickEvent.java 
b/mustella/src/main/java/marmotinni/DispatchMouseClickEvent.java
new file mode 100644
index 0000000..66c65bc
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/DispatchMouseClickEvent.java
@@ -0,0 +1,205 @@
+/*
+ *
+ * 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 marmotinni;
+
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+
+import org.xml.sax.Attributes;
+
+/** 
+ * DispatchMouseClickEvent
+ *
+ * Dispatch click to the element under the mouse
+ */
+public class DispatchMouseClickEvent extends TestStep { 
+
+    /**
+     *  Dispatch click event
+     */
+       @Override
+    protected void doStep()
+    {
+               
+               Long x;
+               Long y;
+               if (hasLocal)
+               {
+                       StringBuilder script = new StringBuilder();
+                       insertTargetScript(script, target);
+                       script.append("return target.element.offsetLeft");
+                       if (TestStep.showScripts)
+                               System.out.println(script);
+                       x = 
(Long)((JavascriptExecutor)webDriver).executeScript(script.toString());
+                       script = new StringBuilder();
+                       insertTargetScript(script, target);
+                       script.append("return target.element.offsetTop");
+                       if (TestStep.showScripts)
+                               System.out.println(script);
+                       y = 
(Long)((JavascriptExecutor)webDriver).executeScript(script.toString());
+                       x += localX;
+                       y += localY;
+               }
+               else
+               {
+                       x = stageX;
+                       y = stageY;
+               }
+               
+               // find top-most element
+               StringBuilder script = new StringBuilder();
+               script.append("var all = document.all;");
+               script.append("var n = all.length;");
+               script.append("for(var i=n-1;i>=0;i--) { ");
+               script.append("    var e = all[i];");
+               script.append("     if (" + x + " >= e.offsetLeft && " + x + " 
<= e.offsetLeft + e.offsetWidth && " + y + " >= e.offsetTop && " + y + " <= 
e.offsetTop + e.offsetHeight)");
+               script.append("         return e;");
+               script.append("};");
+               script.append("return null;");
+               if (TestStep.showScripts)
+                       System.out.println(script);
+               WebElement mouseTarget = 
(WebElement)((JavascriptExecutor)webDriver).executeScript(script.toString());
+        try
+        {
+                       mouseTarget.click();
+        }
+        catch (Exception e1)
+        {
+            TestOutput.logResult("Exception thrown in 
DispatchMouseClickEvent.");
+            testResult.doFail (e1.getMessage()); 
+        }
+               
+    }
+       
+       /**
+        *  The object that should receive the mouse event
+        */
+       public String target;
+       
+       /**
+        *  The ctrlKey property on the MouseEvent (optional)
+        */
+       public boolean ctrlKey;
+       
+       /**
+        *  The delta property on the MouseEvent (optional)
+        */
+       public int delta;
+       
+       private boolean hasLocal;
+       private boolean hasStage;
+       
+       /**
+        *  The localX property on the MouseEvent (optional)
+        *  Either set stageX/stageY or localX/localY, but not both.
+        */
+       public long localX;
+       
+       /**
+        *  The localY property on the MouseEvent (optional)
+        *  Either set stageX/stageY or localX/localY, but not both.
+        */
+       public long localY;
+       
+       /**
+        *  The stageX property on the MouseEvent (optional)
+        *  Either set stageX/stageY or localX/localY, but not both.
+        */
+       public long stageX;
+       
+       /**
+        *  The stageY property on the MouseEvent (optional)
+        *  Either set stageX/stageY or localX/localY, but not both.
+        */
+       public long stageY;
+       
+       /**
+        *  The shiftKey property on the MouseEvent (optional)
+        */
+       public boolean shiftKey;
+       
+       /**
+        *  The relatedObject property on the MouseEvent (optional)
+        */
+       public String relatedObject;
+       
+       /**
+        *  customize string representation
+        */
+       @Override 
+       public String toString()
+       {
+               String s = "DispatchMouseClickEvent: target = ";
+               s += target;
+               if (hasLocal)
+               {
+                       s += ", localX = " + Long.toString(localX);
+                       s += ", localY = " + Long.toString(localY);
+               }
+               if (hasStage)
+               {
+                       s += ", stageX = " + Long.toString(stageX);
+                       s += ", stageY = " + Long.toString(stageY);
+               }
+               if (shiftKey)
+                       s += ", shiftKey = true";
+               if (ctrlKey)
+                       s += ", ctrlKey = true";
+               
+               if (relatedObject != null)
+                       s += ", relatedObject = " + relatedObject;
+               if (delta != 0)
+                       s += ", delta = " + Integer.toString(delta);
+               return s;
+       }
+       
+       @Override
+       public void populateFromAttributes(Attributes attributes)
+       {
+               target = attributes.getValue("target");
+               String value = attributes.getValue("localX");
+               if (value != null)
+               {
+                       localX = Long.parseLong(value);
+                       hasLocal = true;
+               }
+               value = attributes.getValue("localY");
+               if (value != null)
+               {
+                       localY = Long.parseLong(value);
+                       hasLocal = true;
+               }
+               value = attributes.getValue("stageX");
+               if (value != null)
+               {
+                       stageX = Long.parseLong(value);
+                       hasStage = true;
+               }
+               value = attributes.getValue("stageY");
+               if (value != null)
+               {
+                       stageY = Long.parseLong(value);
+                       hasStage = true;
+               }
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/DispatchMouseEvent.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/DispatchMouseEvent.java 
b/mustella/src/main/java/marmotinni/DispatchMouseEvent.java
new file mode 100644
index 0000000..0f9a874
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/DispatchMouseEvent.java
@@ -0,0 +1,222 @@
+/*
+ *
+ * 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 marmotinni;
+
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.remote.RemoteWebElement;
+
+import org.xml.sax.Attributes;
+
+/** 
+ * DispatchMouseEvent
+ *
+ * Dispatch mouse event
+ */
+public class DispatchMouseEvent extends TestStep { 
+
+    /**
+     *  Dispatch a mouse event
+     */
+       @Override
+    protected void doStep()
+    {
+               
+               Long x;
+               Long y;
+               if (hasLocal)
+               {
+                       StringBuilder script = new StringBuilder();
+                       insertTargetScript(script, target);
+                       script.append("return target.element.offsetLeft");
+                       if (TestStep.showScripts)
+                               System.out.println(script);
+                       x = 
(Long)((JavascriptExecutor)webDriver).executeScript(script.toString());
+                       script = new StringBuilder();
+                       insertTargetScript(script, target);
+                       script.append("return target.element.offsetTop");
+                       if (TestStep.showScripts)
+                               System.out.println(script);
+                       y = 
(Long)((JavascriptExecutor)webDriver).executeScript(script.toString());
+                       x += localX;
+                       y += localY;
+               }
+               else
+               {
+                       x = stageX;
+                       y = stageY;
+               }
+               
+               // find top-most element
+               StringBuilder script = new StringBuilder();
+               script.append("var all = document.all;");
+               script.append("var n = all.length;");
+               script.append("for(var i=n-1;i>=0;i--) { ");
+               script.append("    var e = all[i];");
+               script.append("     if (" + x + " >= e.offsetLeft && " + x + " 
<= e.offsetLeft + e.offsetWidth && " + y + " >= e.offsetTop && " + y + " <= 
e.offsetTop + e.offsetHeight) {");
+               script.append("         if (!e.id) e.id = 
Math.random().toString();");
+               script.append("         return e;");
+               script.append("     }");
+               script.append("};");
+               script.append("return null;");
+               if (TestStep.showScripts)
+                       System.out.println(script);
+               RemoteWebElement mouseTarget = 
(RemoteWebElement)((JavascriptExecutor)webDriver).executeScript(script.toString());
+               //System.out.println("mouseTarget: " + mouseTarget.getTagName() 
+ " " + mouseTarget.getAttribute("id"));
+               String actualId = mouseTarget.getAttribute("id");
+               
+               script = new StringBuilder();
+               script.append("var e = document.createEvent('MouseEvent');");
+               script.append("e.initMouseEvent(\"" + type + "\", true, false, 
window, " + delta + ", " + x + ", " + y + ", " + localX + ", " + localY + ", " 
+ ctrlKey + ", false, " + shiftKey + ", false, " + type.equals("mouseDown") + 
", " + relatedObject + ");");
+               script.append("document.getElementById('" + actualId + 
"').dispatchEvent(e);");
+               if (TestStep.showScripts)
+                       System.out.println(script);
+        try
+        {
+                       
((JavascriptExecutor)webDriver).executeScript(script.toString());
+        }
+        catch (Exception e1)
+        {
+            TestOutput.logResult("Exception thrown in DispatchMouseEvent.");
+            testResult.doFail (e1.getMessage()); 
+        }
+               
+    }
+       
+       /**
+        *  The object that should receive the mouse event
+        */
+       public String target;
+       
+       /**
+        *  The type/name of the event
+        */
+       public String type;
+       
+       /**
+        *  The ctrlKey property on the MouseEvent (optional)
+        */
+       public boolean ctrlKey;
+       
+       /**
+        *  The delta property on the MouseEvent (optional)
+        */
+       public int delta;
+       
+       private boolean hasLocal;
+       private boolean hasStage;
+
+       /**
+        *  The localX property on the MouseEvent (optional)
+        *  Either set stageX/stageY or localX/localY, but not both.
+        */
+       public long localX;
+       
+       /**
+        *  The localY property on the MouseEvent (optional)
+        *  Either set stageX/stageY or localX/localY, but not both.
+        */
+       public long localY;
+       
+       /**
+        *  The stageX property on the MouseEvent (optional)
+        *  Either set stageX/stageY or localX/localY, but not both.
+        */
+       public long stageX;
+       
+       /**
+        *  The stageY property on the MouseEvent (optional)
+        *  Either set stageX/stageY or localX/localY, but not both.
+        */
+       public long stageY;
+       
+       /**
+        *  The shiftKey property on the MouseEvent (optional)
+        */
+       public boolean shiftKey;
+       
+       /**
+        *  The relatedObject property on the MouseEvent (optional)
+        */
+       public String relatedObject;
+       
+       /**
+        *  customize string representation
+        */
+       @Override 
+       public String toString()
+       {
+               String s = "DispatchMouseEvent: target = ";
+               s += target;
+               if (hasLocal)
+               {
+                       s += ", localX = " + Long.toString(localX);
+                       s += ", localY = " + Long.toString(localY);
+               }
+               if (hasStage)
+               {
+                       s += ", stageX = " + Long.toString(stageX);
+                       s += ", stageY = " + Long.toString(stageY);
+               }
+               if (shiftKey)
+                       s += ", shiftKey = true";
+               if (ctrlKey)
+                       s += ", ctrlKey = true";
+               
+               if (relatedObject != null)
+                       s += ", relatedObject = " + relatedObject;
+               if (delta != 0)
+                       s += ", delta = " + Integer.toString(delta);
+               return s;
+       }
+       
+       @Override
+       public void populateFromAttributes(Attributes attributes)
+       {
+               target = attributes.getValue("target");
+               type = attributes.getValue("type");
+               String value = attributes.getValue("localX");
+               if (value != null)
+               {
+                       localX = Long.parseLong(value);
+                       hasLocal = true;
+               }
+               value = attributes.getValue("localY");
+               if (value != null)
+               {
+                       localY = Long.parseLong(value);
+                       hasLocal = true;
+               }
+               value = attributes.getValue("stageX");
+               if (value != null)
+               {
+                       stageX = Long.parseLong(value);
+                       hasStage = true;
+               }
+               value = attributes.getValue("stageY");
+               if (value != null)
+               {
+                       stageY = Long.parseLong(value);
+                       hasStage = true;
+               }
+       }
+
+}

http://git-wip-us.apache.org/repos/asf/flex-asjs/blob/0e704f9b/mustella/src/main/java/marmotinni/MarmotinniRunner.java
----------------------------------------------------------------------
diff --git a/mustella/src/main/java/marmotinni/MarmotinniRunner.java 
b/mustella/src/main/java/marmotinni/MarmotinniRunner.java
new file mode 100644
index 0000000..73061fd
--- /dev/null
+++ b/mustella/src/main/java/marmotinni/MarmotinniRunner.java
@@ -0,0 +1,259 @@
+/*
+ *
+ * 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 marmotinni;
+
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxProfile;
+import org.openqa.selenium.firefox.internal.ProfilesIni;
+
+import java.io.IOException;
+import java.nio.CharBuffer;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.HashMap;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+
+/** 
+ * TestEngine
+ *
+ * Runs a mustella script by parsing it and executing its contents
+ *
+ */
+public class MarmotinniRunner extends DefaultHandler { 
+
+       public MarmotinniRunner () { 
+       }
+
+       public boolean runTest(WebDriver webDriver, String scriptName)
+       {
+               if (tagMap == null)
+                       setupMap();
+               tests = new ArrayList<TestCase>();
+               
+               System.out.println("running script " + scriptName);
+               
+               SAXParserFactory spf = SAXParserFactory.newInstance();
+               try {
+                       
+                       //get a new instance of parser
+                       SAXParser sp = spf.newSAXParser();
+                       
+                       //parse the file and also register this class for call 
backs
+                       sp.parse(scriptName, this);
+                       
+               }catch(SAXException se) {
+                       se.printStackTrace();
+               }catch(ParserConfigurationException pce) {
+                       pce.printStackTrace();
+               }catch (IOException ie) {
+                       ie.printStackTrace();
+               }
+               boolean success = true;
+               System.out.println("test case count: " + tests.size());
+               for (TestCase testCase : tests)
+               {
+                       this.testCase = testCase;
+                       testCase.runTest(webDriver);
+                       TestResult testResult = testCase.getTestResult();
+                       testResult.scriptName = scriptName;
+                       if (!testResult.hasStatus())
+                               testResult.result = TestResult.PASS;
+                       else
+                       {
+                               System.out.println("test failure");
+                               success = false;
+                       }
+                       System.out.println(testResult.toString());
+               }
+               return success;
+       }
+
+       private HashMap<String, Class<?>> tagMap = null;
+       
+       private void setupMap()
+       {
+               tagMap = new HashMap<String, Class<?>>();
+               tagMap.put("SetProperty", SetProperty.class);
+               tagMap.put("DispatchKeyEvent", DispatchKeyEvent.class);
+               tagMap.put("DispatchMouseEvent", DispatchMouseEvent.class);
+               tagMap.put("DispatchMouseClickEvent", 
DispatchMouseClickEvent.class);
+               tagMap.put("AssertPropertyValue", AssertPropertyValue.class);
+       }
+       
+       private boolean verboseXMLParsing;
+       private ArrayList<TestCase> tests;
+       private TestCase testCase;
+       private String currentPhase;
+       
+       //Event Handlers
+       public void startElement(String uri, String localName, String qName, 
Attributes attributes) throws SAXException {
+               if (verboseXMLParsing)
+                       System.out.println("StartElement: uri: " + uri + 
"localName: " + localName + "qName: " + qName);
+               if(qName.equalsIgnoreCase("UnitTester")) {
+                       // this should be the top-level tag, just ignore for 
now.  Will need to process script subtags later
+               }
+               else if (qName.length() == 0)
+               {
+                       // there seems to be some empty tags
+               }
+               else if (qName.equalsIgnoreCase("testCases"))
+               {
+                       // there seems to be some empty tags
+               }
+               else if (qName.equalsIgnoreCase("mx:Script"))
+               {
+                       // there seems to be some empty tags
+               }
+               else if (qName.equalsIgnoreCase("mx:Metadata"))
+               {
+                       // there seems to be some empty tags
+               }
+               else if (qName.equalsIgnoreCase("TestCase")) {
+                       testCase = new TestCase();
+                       testCase.populateFromAttributes(attributes);
+                       tests.add(testCase);
+               }
+               else if (tagMap.containsKey(qName)) {
+                       Class<?> c = tagMap.get(qName);
+                       try {
+                               TestStep testStep = (TestStep)c.newInstance(); 
+                               testStep.populateFromAttributes(attributes);
+                               if (currentPhase.equals("setup"))
+                                       testCase.setup.add(testStep);
+                               else if (currentPhase.equals("body"))
+                                       testCase.body.add(testStep);
+                               else
+                                       testCase.cleanup.add(testStep);
+                       }
+                       catch (Exception e) {
+                               System.out.println(e.getMessage());
+                               return;
+                       }
+               }
+               else if (qName.equals("setup")) {
+                       currentPhase = "setup";
+                       testCase.setup = new ArrayList<TestStep>();
+               }
+               else if (qName.equals("body")) {
+                       currentPhase = "body";
+                       testCase.body = new ArrayList<TestStep>();
+               }
+               else if (qName.equals("cleanup")) {
+                       currentPhase = "cleanup";
+                       testCase.cleanup = new ArrayList<TestStep>();
+               }
+               else {
+                       System.out.println("unexpected element: " + uri + 
qName);
+               }
+
+       }
+       
+       
+       public void characters(char[] ch, int start, int length) throws 
SAXException {
+               CharBuffer cb = CharBuffer.allocate(ch.length);
+               cb.put(ch);
+               String s = cb.toString();
+               if (verboseXMLParsing)
+                       if (s.trim().length() > 0)
+                               System.out.println("unexpected characters: " + 
s);
+       }
+       
+       public void endElement(String uri, String localName, String qName) 
throws SAXException {
+               if (verboseXMLParsing)
+                       System.out.println("EndElement: uri: " + uri + 
"localName: " + localName + "qName: " + qName);
+       }
+       
+       public static void main(String[] args)
+    {
+               ArrayList<String> scripts = new ArrayList<String>();
+        Map<String, String> argsMap = new HashMap<String, String>();
+        for (String arg : args)
+        {
+            String[] keyValuePair = arg.split("=");
+                       if (keyValuePair[0].equals("script"))
+                               scripts.add(keyValuePair[1]);
+                       else    
+                               argsMap.put(keyValuePair[0], keyValuePair[1]);
+        }
+        final String showScriptsArg = argsMap.get("showScripts");
+        TestStep.showScripts = showScriptsArg != null && 
showScriptsArg.equalsIgnoreCase("true");
+        final String showStepsArg = argsMap.get("showSteps");
+        TestCase.showSteps = showStepsArg != null && 
showStepsArg.equalsIgnoreCase("true");
+               
+        final String url = argsMap.get("url");
+               System.out.println(url);
+        
+               final String browser = argsMap.get("browser");
+        WebDriver driver;
+               if (browser != null && browser.equalsIgnoreCase("chrome"))
+                       driver = new ChromeDriver();
+               else if (argsMap.containsKey("profile"))
+               {
+                       ProfilesIni profile = new ProfilesIni();
+                       FirefoxProfile ffprofile = 
profile.getProfile(argsMap.get("profile"));
+                       System.out.println("FireFox Profile: " + 
argsMap.get("profile"));                       
+                       driver = new FirefoxDriver(ffprofile);
+               }
+               else
+                       driver = new FirefoxDriver();
+               
+        driver.get(url);
+               
+               int exitCode = 0;
+               try 
+               {
+                       MarmotinniRunner mr = new MarmotinniRunner();
+                       final String verboseXMLParsingArg = 
argsMap.get("verboseXMLParsing");
+                       mr.verboseXMLParsing = verboseXMLParsingArg != null && 
verboseXMLParsingArg.equalsIgnoreCase("true");
+                       int n = scripts.size();
+                       for (int i = 0; i < n; i++)
+                       {
+                               if (!mr.runTest(driver, scripts.get(i)))
+                               {
+                                       System.out.println("script failed");
+                                       exitCode = 1;
+                               }
+                       }                       
+               }
+               catch (Exception e)
+        {
+            System.out.println(e.getMessage());
+                       exitCode = 1;
+        }
+        finally
+        {
+            driver.quit();
+        }
+               System.exit(exitCode);
+       }
+
+}

Reply via email to