blob: 8e58df58dac4a6b2cca4d2173562f5171cbed2c8 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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 UnitTest.Tests
{
import UnitTest.ExtendedClasses.TestSuiteExtended;
import UnitTest.ExtendedClasses.VellumTestCase;
import UnitTest.Fixtures.TestConfig;
import flash.events.*;
import flash.ui.KeyLocation;
import flashx.textLayout.edit.EditManager;
import flashx.textLayout.elements.TextFlow;
import flashx.undo.UndoManager;
public class EventOverrideTest extends VellumTestCase
{
public function EventOverrideTest(methodName:String, testID:String, testConfig:TestConfig, testCaseXML:XML=null)
{
super(methodName, testID, testConfig, testCaseXML);
if ( TestData.eventOverride )
{
TestID = TestID + ":" + TestData.eventOverride;
}
// Note: These must correspond to a Watson product area (case-sensitive)
metaData.productArea = "Editing";
}
public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void
{
var testCaseClass:Class = EventOverrideTest;
VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts);
}
public override function setUp():void
{
/*if ( TestData.eventOverride )
{
TextFlow.defaultConfiguration.manageEventListeners = false;
}*/
super.setUp();
if ( TestData.overrideEditManager == "true" )
{
var testManager:EditManager = new TestEditManager(new UndoManager());
SelManager.textFlow.interactionManager = testManager;
SelManager = testManager;
SelManager.selectRange(0,0);
}
}
public override function tearDown():void
{
/*if ( TestData.eventOverride )
{
TextFlow.defaultConfiguration.manageEventListeners = true;
// Make sure we leave without a broken TextFlow
loadTestFile("empty.xml");
}*/
if ( TestData.overrideEditManager == "true" )
{
var newManager:EditManager = new EditManager(new UndoManager());
SelManager.textFlow.interactionManager = newManager;
SelManager = newManager;
}
}
// Returns the string from begIdx through and including endIdx
private function getText( begIdx:int, endIdx:int ): String
{
var outString:String = "";
for ( var x:int = begIdx; x < endIdx; x++ )
{
outString += SelManager.textFlow.getCharAtPosition(x);
}
return outString;
}
// Returns the text contents of the entire textflow
private function getAllText(): String
{
var begIdx:int = SelManager.textFlow.parentRelativeStart;
var endIdx:int = SelManager.textFlow.parentRelativeEnd-1;
var outString:String = "";
for ( var x:int = begIdx; x < endIdx; x++ )
{
outString += SelManager.textFlow.getCharAtPosition(x);
}
return outString;
}
/******* Framework for event override tests (Not using derived editmanager ***********************/
/** Removing for expected ARB-related updates - probably to be removed permanently
*
private function eventFromText( textID:String, addListener:Boolean, removeListener:Boolean = false ):Event
{
var outEvent:Event;
switch ( textID )
{
case "MOUSE_DOWN":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( MouseEvent.MOUSE_DOWN, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( MouseEvent.MOUSE_DOWN, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new MouseEvent( MouseEvent.MOUSE_DOWN, true, false, 0, 0 );
return outEvent;
}
break;
case "MOUSE_OVER":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( MouseEvent.MOUSE_OVER, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( MouseEvent.MOUSE_OVER, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new MouseEvent( MouseEvent.MOUSE_OVER, true, false, 0, 0 );
return outEvent;
}
break;
case "MOUSE_OUT":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( MouseEvent.MOUSE_OUT, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( MouseEvent.MOUSE_OUT, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new MouseEvent( MouseEvent.MOUSE_OUT, true, false, 0, 0 );
return outEvent;
}
break;
case "MOUSE_WHEEL":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( MouseEvent.MOUSE_WHEEL, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( MouseEvent.MOUSE_WHEEL, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new MouseEvent( MouseEvent.MOUSE_WHEEL, true, false, 0, 0 );
return outEvent;
}
break;
case "DOUBLE_CLICK":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( MouseEvent.DOUBLE_CLICK, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( MouseEvent.DOUBLE_CLICK, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new MouseEvent( MouseEvent.DOUBLE_CLICK, true, false, 0, 0 );
return outEvent;
}
break;
case "KEY_DOWN":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( KeyboardEvent.KEY_DOWN, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( KeyboardEvent.KEY_DOWN, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new KeyboardEvent( KeyboardEvent.KEY_DOWN, true, false,
8, 8, KeyLocation.STANDARD, true, false, false);
return outEvent;
}
break;
case "FOCUS_IN":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( FocusEvent.FOCUS_IN, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( FocusEvent.FOCUS_IN, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new FocusEvent( FocusEvent.FOCUS_IN );
return outEvent;
}
break;
case "FOCUS_OUT":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( FocusEvent.FOCUS_OUT, eventHandler );
}
else
if (addListener)
{
SelManager.textFlow.addEventListener( FocusEvent.FOCUS_OUT, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new FocusEvent( FocusEvent.FOCUS_OUT );
return outEvent;
}
break;
case "TEXT_INPUT":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( TextEvent.TEXT_INPUT, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( TextEvent.TEXT_INPUT, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new TextEvent( TextEvent.TEXT_INPUT, false, true, "WONTSEEME" );
return outEvent;
}
break;
case "ACTIVATE":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( Event.ACTIVATE, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( Event.ACTIVATE, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new Event( Event.ACTIVATE );
return outEvent;
}
break;
case "DEACTIVATE":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( Event.DEACTIVATE, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( Event.DEACTIVATE, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new Event( Event.DEACTIVATE );
return outEvent;
}
break;
case "MENU_SELECT":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( ContextMenuEvent.MENU_SELECT, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( ContextMenuEvent.MENU_SELECT, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new ContextMenuEvent( ContextMenuEvent.MENU_SELECT );
return outEvent;
}
break;
case "SELECT_ALL":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( Event.SELECT_ALL, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( Event.SELECT_ALL, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new Event( Event.SELECT_ALL );
return outEvent;
}
break;
case "COPY":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( Event.COPY, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( Event.COPY, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new Event( Event.COPY );
return outEvent;
}
break;
case "CUT":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( Event.CUT, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( Event.CUT, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new Event( Event.CUT );
return outEvent;
}
break;
case "PASTE":
if ( removeListener )
{
SelManager.textFlow.removeEventListener( Event.PASTE, eventHandler );
}
else if (addListener)
{
SelManager.textFlow.addEventListener( Event.PASTE, eventHandler, false, 0, true );
return null;
}
else
{
outEvent = new Event( Event.PASTE );
return outEvent;
}
break;
}
return null;
}
// Generic event handler
// How can this be made more even specific?
private function eventHandler( event:Event ):void
{
SelManager.insertText("EVENT");
}
// Generic test case for all event overrides
public function testEventOverride():void
{
SelManager.insertText("StillHere");
SelManager.selectRange(9,9);
// Add event listener
eventFromText( TestData.eventOverride, true );
var newEvent:Event = eventFromText( TestData.eventOverride, false );
assertTrue( "Test Case Failure: Unable to find event specified in XML",
newEvent != null );
SelManager.textFlow.dispatchEvent(newEvent);
SelManager.flushPendingOperations();
assertTrue( TestData.eventOverride + " event was not executed after override",
getAllText() == "StillHereEVENT" );
assertTrue( TestData.eventOverride + " event shouldn't change selection",
SelManager.activePosition == 14 && SelManager.anchorPosition == 14 );
// Remove event listener
eventFromText( TestData.eventOverride, false, true );
}
*/
/************** TESTS USING DERIVED EDITMANAGER **************************************************/
public function keyDownDerivedTest():void
{
SelManager.insertText("StillHere");
SelManager.selectRange(9,9);
// Send a Ctrl-Backspace
var kEvent:KeyboardEvent = new KeyboardEvent( KeyboardEvent.KEY_DOWN,
true, false, 8, 8, KeyLocation.STANDARD, true, false, false);
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Keyboard event executed normally when overridden",
getText(0,9) == "StillHere" );
assertTrue( "Keyboard event override was not executed",
getAllText() == "StillHereKEYDOWN" );
}
public function mouseDownDerivedTest():void
{
var kEvent:MouseEvent = new MouseEvent( MouseEvent.MOUSE_DOWN, true, false, 0, 0 );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Mouse Down event override was not executed",
getAllText() == "MOUSEDOWN" );
}
public function mouseMoveDerivedTest():void
{
(SelManager as TestEditManager).mouseMoved = false;
var kEvent:MouseEvent = new MouseEvent( MouseEvent.MOUSE_DOWN, true, false, 0, 0 );
TestFrame.container["dispatchEvent"](kEvent);
var mEvent:MouseEvent = new MouseEvent( MouseEvent.MOUSE_MOVE, true, false,
20, 20 );
TestFrame.container["dispatchEvent"](mEvent);
SelManager.flushPendingOperations();
assertTrue( "Mouse Move event override was not executed",
getAllText() == "MOUSEDOWNMOUSEMOVE" );
}
public function textEventDerivedTest():void
{
// Send 'a' string
var kEvent:TextEvent = new TextEvent( TextEvent.TEXT_INPUT, false, false, "a" );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Text Event override was not executed",
getAllText() == "TEXTEVENT" );
}
public function focusInDerivedTest():void
{
var kEvent:FocusEvent = new FocusEvent( FocusEvent.FOCUS_IN );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Focus In override was not executed",
getAllText() == "FOCUSIN" );
}
public function focusOutDerivedTest():void
{
var kEvent:FocusEvent = new FocusEvent( FocusEvent.FOCUS_OUT );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Focus Out override was not executed",
getAllText() == "FOCUSOUT" );
}
public function activateDerivedTest():void
{
var kEvent:Event = new Event( Event.ACTIVATE );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Activate override was not executed",
getAllText() == "ACTIVATE" );
}
public function deactivateDerivedTest():void
{
var kEvent:Event = new Event( Event.DEACTIVATE );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Deactivate override was not executed",
getAllText() == "DEACTIVATE" );
}
public function deleteNextDerivedTest():void
{
(SelManager as TestEditManager).useDefaultKeyDown = true;
var kEvent:KeyboardEvent = new KeyboardEvent( KeyboardEvent.KEY_DOWN, true, false, 127, 46 );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Delete Next override was not executed by pressing 'Delete'",
getAllText() == "DELETENEXT" );
(SelManager as TestEditManager).useDefaultKeyDown = false;
}
public function deletePreviousDerivedTest():void
{
(SelManager as TestEditManager).useDefaultKeyDown = true;
var kEvent:KeyboardEvent = new KeyboardEvent( KeyboardEvent.KEY_DOWN, true, false, 8, 8 );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Delete Previous override was not executed by pressing 'Backspace'",
getAllText() == "DELETEPREVIOUS" );
(SelManager as TestEditManager).useDefaultKeyDown = false;
}
public function deleteNextWordDerivedTest():void
{
(SelManager as TestEditManager).useDefaultKeyDown = true;
var kEvent:KeyboardEvent = new KeyboardEvent( KeyboardEvent.KEY_DOWN, true, false, 127, 46, 0, true );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Delete Next override was not executed by pressing 'Ctrl-Delete'",
getAllText() == "DELETENEXTWORD" );
(SelManager as TestEditManager).useDefaultKeyDown = false;
}
public function deletePreviousWordDerivedTest():void
{
(SelManager as TestEditManager).useDefaultKeyDown = true;
var kEvent:KeyboardEvent = new KeyboardEvent( KeyboardEvent.KEY_DOWN, true, false, 8, 8, 0, true );
TestFrame.container["dispatchEvent"](kEvent);
SelManager.flushPendingOperations();
assertTrue( "Delete Previous override was not executed by pressing 'Ctrl-Backspace'",
getAllText() == "DELETEPREVIOUSWORD" );
(SelManager as TestEditManager).useDefaultKeyDown = false;
}
}
}
/********Editmanager for overriding events - Internal Helper Class**********************************/
import flashx.textLayout.edit.EditManager;
import flashx.undo.IUndoManager;
import flash.events.KeyboardEvent;
import flash.events.MouseEvent;
import flash.events.TextEvent;
import flash.events.FocusEvent;
import flash.events.Event;
import flashx.textLayout.edit.SelectionState;
internal class TestEditManager extends EditManager
{
public var mouseMoved:Boolean;
public var useDefaultKeyDown:Boolean;
public function TestEditManager(undo:IUndoManager = null)
{
super(undo);
useDefaultKeyDown = false;
// Don't react to this event and ruin a different test
mouseMoved = true;
}
public override function keyDownHandler(event:KeyboardEvent):void
{
if ( useDefaultKeyDown == true )
super.keyDownHandler(event);
else
insertText("KEYDOWN");
}
public override function mouseDownHandler(event:MouseEvent):void
{ insertText("MOUSEDOWN"); }
public override function mouseMoveHandler(event:MouseEvent):void
{
// Don't react to this event more than once
if ( !mouseMoved)
{
insertText("MOUSEMOVE");
mouseMoved = true;
}
}
public override function textInputHandler(event:TextEvent):void
{ insertText("TEXTEVENT"); }
public override function focusInHandler(event:FocusEvent):void
{ insertText("FOCUSIN"); }
public override function focusOutHandler(event:FocusEvent):void
{ insertText("FOCUSOUT"); }
public override function activateHandler(event:Event):void
{ insertText("ACTIVATE"); }
public override function deactivateHandler(event:Event):void
{ insertText("DEACTIVATE"); }
/***** EDITMANAGER OVERRIDES *****/
public override function deleteNextCharacter(operationState:SelectionState=null):void
{ insertText("DELETENEXT"); }
public override function deletePreviousCharacter(operationState:SelectionState=null):void
{ insertText("DELETEPREVIOUS"); }
public override function deleteNextWord(operationState:SelectionState=null):void
{ insertText("DELETENEXTWORD"); }
public override function deletePreviousWord(operationState:SelectionState=null):void
{ insertText("DELETEPREVIOUSWORD"); }
}