Return-Path: X-Original-To: apmail-flex-commits-archive@www.apache.org Delivered-To: apmail-flex-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id B0A2D17A25 for ; Sun, 5 Oct 2014 09:05:14 +0000 (UTC) Received: (qmail 15645 invoked by uid 500); 5 Oct 2014 09:05:13 -0000 Delivered-To: apmail-flex-commits-archive@flex.apache.org Received: (qmail 15535 invoked by uid 500); 5 Oct 2014 09:05:13 -0000 Mailing-List: contact commits-help@flex.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@flex.apache.org Delivered-To: mailing list commits@flex.apache.org Received: (qmail 15208 invoked by uid 99); 5 Oct 2014 09:05:13 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Sun, 05 Oct 2014 09:05:13 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 5E6171BC75; Sun, 5 Oct 2014 09:05:13 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: piotrz@apache.org To: commits@flex.apache.org Date: Sun, 05 Oct 2014 09:05:22 -0000 Message-Id: In-Reply-To: <5c131e985f2d494181717d05d3fa0446@git.apache.org> References: <5c131e985f2d494181717d05d3fa0446@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [11/30] Reorganized TLF test applications for using Apache Flex Unit 4.2.0 Changed first 8 tests for Apache Flex Unit Fixed ant build - no test automation yet http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/UnitTest/Tests/AllEventTest.as ---------------------------------------------------------------------- diff --git a/automation_tests/src/UnitTest/Tests/AllEventTest.as b/automation_tests/src/UnitTest/Tests/AllEventTest.as index 1a1bf9b..e799697 100644 --- a/automation_tests/src/UnitTest/Tests/AllEventTest.as +++ b/automation_tests/src/UnitTest/Tests/AllEventTest.as @@ -18,714 +18,745 @@ //////////////////////////////////////////////////////////////////////////////// package UnitTest.Tests { - import UnitTest.ExtendedClasses.TestSuiteExtended; - import UnitTest.ExtendedClasses.VellumTestCase; - import UnitTest.Fixtures.TestConfig; - import UnitTest.Fixtures.FileRepository; - import UnitTest.Validation.*; - - import flash.display.Bitmap; - import flash.display.BitmapData; - import flash.display.DisplayObject; - import flash.display.DisplayObjectContainer; - import flash.display.Loader; - import flash.display.Shape; - import flash.display.Sprite; - import flash.events.*; - import flash.geom.Point; - import flash.geom.Rectangle; - import flash.net.URLRequest; - import flash.text.engine.TextLine; - - import flashx.textLayout.compose.IFlowComposer; - import flashx.textLayout.compose.TextFlowLine; - import flashx.textLayout.container.ContainerController; - import flashx.textLayout.container.ScrollPolicy; - import flashx.textLayout.edit.IEditManager; - import flashx.textLayout.edit.SelectionManager; - import flashx.textLayout.edit.SelectionState; - import flashx.textLayout.edit.TextScrap; - import flashx.textLayout.elements.*; - import flashx.textLayout.events.CompositionCompleteEvent; - import flashx.textLayout.events.DamageEvent; - import flashx.textLayout.events.FlowElementMouseEvent; - import flashx.textLayout.events.FlowOperationEvent; - import flashx.textLayout.events.ScrollEvent; - import flashx.textLayout.events.ScrollEventDirection; - import flashx.textLayout.events.SelectionEvent; - import flashx.textLayout.events.StatusChangeEvent; - import flashx.textLayout.events.TextLayoutEvent; - import flashx.textLayout.events.UpdateCompleteEvent; - import flashx.textLayout.formats.BlockProgression; - import flashx.textLayout.formats.TextAlign; - import flashx.textLayout.formats.TextLayoutFormat; - import flashx.textLayout.formats.LineBreak; - import flashx.textLayout.operations.FlowElementOperation; - import flashx.textLayout.operations.FlowOperation; - import flashx.textLayout.operations.InsertInlineGraphicOperation; - import flashx.textLayout.operations.RedoOperation; - import flashx.textLayout.operations.UndoOperation; - import flashx.textLayout.tlf_internal; - import flashx.textLayout.utils.GeometryUtil; - - import mx.controls.scrollClasses.ScrollBar; - import mx.utils.LoaderUtil; - - use namespace tlf_internal; - - public class AllEventTest extends VellumTestCase - { - public function AllEventTest(methodName:String, testID:String, testConfig:TestConfig, testCaseXML:XML=null) - { - super(methodName, testID, testConfig, testCaseXML); - - // Note: These must correspond to a Watson product area (case-sensitive) - metaData.productArea = "Text Composition"; - } - - public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void - { - FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/ShortTextMouseEventTBLTR.xml"); - FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/ShortTextMouseEventTBRTL.xml"); - FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/ShortTextMouseEventRLLTR.xml"); - FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/ShortTextMouseEventRLRTL.xml"); - var testCaseClass:Class = AllEventTest; - VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts); - } - - private function beginSelectionEventValidation(target:IEventDispatcher, eventCount:int, validater:Function):void - { - target.addEventListener(SelectionEvent.SELECTION_CHANGE, validater); - } - - //SelectionEvent Test Cases - public function selectionEventTest():void - { - metaData.productArea = "Editing"; - - this.SelManager.selectRange(0,0); - - var textFlow:TextFlow = this.SelManager.textFlow; - var endIdx:int = 200; - var startIdx:int = 100; - - var theRects:Array = GeometryUtil.getHighlightBounds(new TextRange(textFlow, startIdx, endIdx)); - for each(var lineRectPair:Object in theRects) - { - var theLine:TextLine = lineRectPair.textLine as TextLine; - var rect:Rectangle = lineRectPair.rect as Rectangle; - var tfl:TextFlowLine = theLine.userData as TextFlowLine; - assertTrue( "userData on a textLine should be a TextFlowLine!", tfl); - - var parentObj:DisplayObjectContainer = theLine.parent; - var selObj:Shape = new Shape(); - - var globalStart:Point = new Point(rect.x, rect.y); - - //first "click" inside the bounds of the rect and make sure we have a point within the selection range: - var index:int = SelectionManager.tlf_internal::computeSelectionIndex(textFlow, theLine, null, rect.x + (rect.width/2), rect.y + (rect.height/2)); - - //validate using a calculated index. If this is a partial line selection, then using the abs start and end isn't valid. - var checkStart:int = tfl.absoluteStart >= startIdx ? tfl.absoluteStart : startIdx; - var checkEnd:int = (tfl.absoluteStart + tfl.textLength) <= endIdx ? (tfl.absoluteStart + tfl.textLength) : endIdx; - - //validate - assertTrue( "the computed index derived from the selection shape must be within the line!", checkStart <= index && checkEnd >= index); - } - - // Select All - var validator:SelectionEventValidator = new SelectionEventValidator(TestFrame.textFlow, - new SelectionEvent(SelectionEvent.SELECTION_CHANGE, false, false, new SelectionState(TestFrame.textFlow, 0, TestFrame.textFlow.textLength - 1))); - SelManager.selectAll(); - assertTrue("Expected selection event showing entire flow selected", validator.validate(1)); - - // Select range - validator.reset(new SelectionEvent(SelectionEvent.SELECTION_CHANGE, false, false, new SelectionState(TestFrame.textFlow, 10, 100))); - SelManager.selectRange(10, 100); - SelManager.refreshSelection(); - assertTrue("Expected selection event showing range selected", validator.validate(1)); - - // Apply format -- expects selection changed on selected area b/c the contents changed - var format:TextLayoutFormat = new TextLayoutFormat(); - format.fontSize = 48; - validator.reset(); - (SelManager as IEditManager).applyLeafFormat(format); - assertTrue("Expected selection event after formatting applied", validator.validate(1)); - - // Insert text -- expects selection changed on selected area b/c the contents changed - const textToInsert:String = "FOO"; - validator.reset(new SelectionEvent(SelectionEvent.SELECTION_CHANGE, false, false, - new SelectionState(TestFrame.textFlow, 20 + textToInsert.length, 20 + textToInsert.length))); - SelManager.selectRange(20, 20); - (SelManager as IEditManager).insertText("FOO"); - SelManager.flushPendingOperations(); // force insert to happen right away - assertTrue("Expected selection event after text insertion", validator.validate(1)); - - // Change select range - test that client code can change the selection from within a selection event handler - textFlow.addEventListener(SelectionEvent.SELECTION_CHANGE, changeSelectionHandler); - SelManager.selectRange(10, 100); - SelManager.refreshSelection(); - assertTrue("Expected entire flow selected", SelManager.absoluteStart == 0 && SelManager.absoluteEnd == textFlow.textLength - 1); - - // Test selection by mouse. We should get one and only one event from this. - SelManager.selectRange(10, 11); - theRects = GeometryUtil.getHighlightBounds(new TextRange(textFlow, SelManager.absoluteStart, SelManager.absoluteEnd)); - theLine = theRects[0].textLine as TextLine; - rect = theRects[0].rect as Rectangle; - tfl = theLine.userData as TextFlowLine; - var mouseEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, true, rect.x, rect.y, theLine, false, false, false, false); - validator.reset(new SelectionEvent(SelectionEvent.SELECTION_CHANGE, false, false, - new SelectionState(TestFrame.textFlow, 10, 10))); - theLine.dispatchEvent(mouseEvent); - assertTrue("Expected single selection event after mouse click", validator.validate(1)); - } - - private function changeSelectionHandler(event:SelectionEvent):void - { - var textFlow:TextFlow = event.selectionState.textFlow; - textFlow.removeEventListener(SelectionEvent.SELECTION_CHANGE, changeSelectionHandler); - textFlow.interactionManager.selectRange(0, textFlow.textLength); - } - - // DamageEvent Test Cases - public function damageEventTest():void - { - //Change Color Test - var selectionBegin:int = 20; - var selectionEnd:int = 400; - SelManager.selectRange(selectionBegin,selectionEnd); - var validator:DamageEventValidator = new DamageEventValidator(TestFrame.textFlow, - new DamageEvent(DamageEvent.DAMAGE, false, false, null, SelManager.absoluteStart, SelManager.absoluteEnd-SelManager.absoluteStart)); - const fontColor:int = 0xFF0000; - var ca:TextLayoutFormat = new TextLayoutFormat(); - - ca.color = fontColor; - SelManager.applyLeafFormat(ca); - SelManager.flushPendingOperations(); - assertTrue("Expected damage event showing after color change",validator.validate(1)); - - //Delete Text Test - validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, null, SelManager.absoluteStart, SelManager.absoluteEnd-SelManager.absoluteStart)); - SelManager.cutTextScrap(SelManager.getSelectionState()); - SelManager.flushPendingOperations(); - assertTrue("Expected damage event showing after text deletion",validator.validate(1)); - - //Delete Character Test - SelManager.selectRange(90,91); - validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, null, SelManager.absoluteStart, SelManager.absoluteEnd-SelManager.absoluteStart)); - SelManager.cutTextScrap(SelManager.getSelectionState()); - SelManager.flushPendingOperations(); - assertTrue("Expected damage event showing after character deletion",validator.validate(1)); - - //Change Geometry Test - validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength)); - TestFrame.setCompositionSize(500,500); - TestFrame.textFlow.flowComposer.updateAllControllers(); - assertTrue("Expected damage event showing after Geometry change",validator.validate(1)); - - //Change Block Progression Test - validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength)); - TestFrame.textFlow.blockProgression = "rl"; - TestFrame.textFlow.flowComposer.updateAllControllers(); - assertTrue("Expected damage event showing after Block Progression change",validator.validate(1)); - - //Change Font Size Test - validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength)); - TestFrame.textFlow.fontSize = 32; - TestFrame.textFlow.flowComposer.updateAllControllers(); - assertTrue("Expected DamageEvent showing after Font Size change",validator.validate(1)); - } - - public function statusChangeEventTest():void - { - metaData.productArea = "Editing"; - - //Insert Picture Test - var src:String = LoaderUtil.createAbsoluteURL(baseURL,"../../test/testFiles/assets/leaves.jpg"); - var element:InlineGraphicElement = new InlineGraphicElement(); - element.source = src; - element.width = 30; - element.height = 30; - var validator:StatusChangeEventValidator = new StatusChangeEventValidator(TestFrame.textFlow, - new StatusChangeEvent(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE, false, false, element, "loading", null)); - - var width:int = 30; - var height:int = 30; - var selectionBegin:int = 10; - var selectionEnd:int = 10; - SelManager.selectRange(selectionBegin, selectionEnd); - SelManager.insertInlineGraphic(src,width,height); - SelManager.flushPendingOperations(); - - assertTrue("Expected StatusChangeEvent showing after picture insertion",validator.validate(1)); - } - - //The following test case is designed to test bug#2929161 - [Embed( source="../../../../test/testFiles/assets/smiley.gif" )] - private var embeddedGIF:Class; - public function statusChangeEventHandlerTest():void - { - metaData.productArea = "Editing"; - - TestFrame.textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE, onStatusChangeHandler); - function onStatusChangeHandler (event:StatusChangeEvent):void - { - var ilg:InlineGraphicElement = event.element as InlineGraphicElement; - if(ilg && event.status == InlineGraphicElementStatus.READY) - { - assertTrue("Expected inline graphic is not null",ilg.graphic != null); - } - } - - //Insert Display Object - var yellowCircle:Sprite = new Sprite(); - yellowCircle.graphics.beginFill(0xFFFF33); // yellow - yellowCircle.graphics.drawCircle(10,12,10); - yellowCircle.graphics.endFill(); - - var width:int = 30; - var height:int = 30; - var selectionBegin:int = 10; - var selectionEnd:int = 10; - SelManager.selectRange(selectionBegin, selectionEnd); - SelManager.insertInlineGraphic(yellowCircle,width,height); - SelManager.flushPendingOperations(); - - //Insert Class - selectionBegin = 15; - selectionEnd = 15; - SelManager.selectRange(selectionBegin, selectionEnd); - SelManager.insertInlineGraphic(embeddedGIF,width,height); - SelManager.flushPendingOperations(); - - //Insert null object - selectionBegin = 20; - selectionEnd = 20; - SelManager.selectRange(selectionBegin, selectionEnd); - SelManager.insertInlineGraphic(null,width,height); - SelManager.flushPendingOperations(); - } - - public function FlowOperationEventTest():void - { - metaData.productArea = "Editing"; - - var src:String = LoaderUtil.createAbsoluteURL(baseURL,"../../test/testFiles/assets/leaves.jpg"); - var width:int = 30; - var height:int = 30; - var selectionBegin:int = 10; - var selectionEnd:int = 10; - SelManager.selectRange(selectionBegin, selectionEnd); - var operation:InsertInlineGraphicOperation = new InsertInlineGraphicOperation(SelManager.getSelectionState(), - src, width, height,"none"); - var beginValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, - new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_BEGIN, false, false, operation, 0, null)); - var endValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, - new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_END, false, false, operation, 0, null)); - var completeValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, - new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_COMPLETE, false, false, operation, 0, null)); - var compositionValidator:CompositionCompleteEventValidator = new CompositionCompleteEventValidator(TestFrame.textFlow, - new CompositionCompleteEvent(CompositionCompleteEvent.COMPOSITION_COMPLETE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength+1)); - SelManager.insertInlineGraphic(src,width,height); - assertTrue("Expected FlowOperationBeginEvent during picture insertion", beginValidator.validate(1)); - assertTrue("Expected FlowOperationEndEvent during picture insertion", endValidator.validate(1)); - assertTrue("Expected FlowOperationCompleteEvent during picture insertion", completeValidator.validate(1)); - assertTrue("Expected CompositionCompleEvent during picture insertion", compositionValidator.validate(1)); - - // Check undo - var pseudoUndoOperation:UndoOperation = new UndoOperation(operation); - beginValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_BEGIN, false, false, pseudoUndoOperation, 0, null)); - endValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_END, false, false, pseudoUndoOperation, 0, null)); - completeValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_COMPLETE, false, false, pseudoUndoOperation, 0, null)); - - SelManager.undo(); - - assertTrue("Expected FlowOperationBeginEvent during undo picture insertion", beginValidator.validate(1)); - assertTrue("Pseudo undo event should have been broadcast", FlowOperationEvent(beginValidator.lastEvent).operation is UndoOperation); - assertTrue("Expected FlowOperationEndEvent during undo picture insertion", endValidator.validate(1)); - assertTrue("Pseudo undo event should have been broadcast", FlowOperationEvent(endValidator.lastEvent).operation is UndoOperation); - assertTrue("Expected FlowOperationCompleteEvent undo during picture insertion", completeValidator.validate(1)); - assertTrue("Pseudo undo event should have been broadcast", FlowOperationEvent(completeValidator.lastEvent).operation is UndoOperation); - - // Check redo - var pseudoRedoOperation:RedoOperation = new RedoOperation(operation); - beginValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_BEGIN, false, false, pseudoRedoOperation, 0, null)); - endValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_END, false, false, pseudoRedoOperation, 0, null)); - completeValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_COMPLETE, false, false, pseudoRedoOperation, 0, null)); - - SelManager.redo(); - - assertTrue("Expected FlowOperationBeginEvent during redo picture insertion", beginValidator.validate(1)); - assertTrue("Pseudo redo event should have been broadcast", FlowOperationEvent(beginValidator.lastEvent).operation is RedoOperation); - assertTrue("Expected FlowOperationEndEvent during redo picture insertion", endValidator.validate(1)); - assertTrue("Pseudo redo event should have been broadcast", FlowOperationEvent(endValidator.lastEvent).operation is RedoOperation); - assertTrue("Expected FlowOperationCompleteEvent redo during picture insertion", completeValidator.validate(1)); - assertTrue("Pseudo redo event should have been broadcast", FlowOperationEvent(completeValidator.lastEvent).operation is RedoOperation); - - } - - public function FlowCompositeOperationEventTest():void - { - metaData.productArea = "Editing"; - - var beginValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, - new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_BEGIN, false, false, new FlowOperation(TestFrame.textFlow), 1, null)); - var endValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, - new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_END, false, false, new FlowOperation(TestFrame.textFlow), 1, null)); - var completeValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, - new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_COMPLETE, false, false, new FlowOperation(TestFrame.textFlow), 0, null)); - var compositionValidator:CompositionCompleteEventValidator = new CompositionCompleteEventValidator(TestFrame.textFlow, - new CompositionCompleteEvent(CompositionCompleteEvent.COMPOSITION_COMPLETE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength)); - - SelManager.selectAll(); - SelManager.beginCompositeOperation(); - var leafFormat:TextLayoutFormat = new TextLayoutFormat(); - leafFormat.fontSize = 18; - SelManager.applyLeafFormat(leafFormat); - var paraFormat:TextLayoutFormat = new TextLayoutFormat(); - paraFormat.textAlign = TextAlign.CENTER; - SelManager.applyParagraphFormat(paraFormat); - SelManager.endCompositeOperation(); - - assertTrue("Expected FlowOperationBeginEvent during composite operation", beginValidator.validate(2)); - assertTrue("Expected FlowOperationEndEvent during composite operation", endValidator.validate(2)); - assertTrue("Expected FlowOperationCompleteEvent during composite operation", completeValidator.validate(1)); - assertTrue("Expected CompositionCompleEvent during composite operation", compositionValidator.validate(1)); - } - public function CompositionCompleteEventTest():void - { - var validator:CompositionCompleteEventValidator; - var scroll:ScrollBar = new ScrollBar(); - var textHeight:int = Math.ceil(TestFrame.getContentBounds().height); - var textWidth:int = Math.ceil(TestFrame.getContentBounds().width); - - if (TestFrame.textFlow.blockProgression == "rl") - { - validator = new CompositionCompleteEventValidator(TestFrame.textFlow, - new CompositionCompleteEvent(CompositionCompleteEvent.COMPOSITION_COMPLETE, false, false, TestFrame.textFlow, 0, 744)); - } - else - { - validator = new CompositionCompleteEventValidator(TestFrame.textFlow, - new CompositionCompleteEvent(CompositionCompleteEvent.COMPOSITION_COMPLETE, false, false, TestFrame.textFlow, 0, 831)); - - } - - TestFrame.textFlow.fontSize = 30; - TestFrame.textFlow.flowComposer.updateAllControllers(); - assertTrue("Expected CompositionCompleEvent showing after font size changing", validator.validate(1)); - } - - public function UpdateCompleteEventTest():void - { - var validator:UpdateCompleteEventValidator = new UpdateCompleteEventValidator(TestFrame.textFlow, - new UpdateCompleteEvent(UpdateCompleteEvent.UPDATE_COMPLETE, false, false, TestFrame.textFlow, TestFrame)); - var selectionBegin:int = 40; - var selectionEnd:int = 50; - SelManager.selectRange(selectionBegin, selectionEnd); - SelManager.deleteNextWord(); - SelManager.textFlow.flowComposer.updateAllControllers(); // should not result in a compose and not generate an UpdateCompleteEvent - assertTrue("Expected One UpdateCompleteEvent showing after deleteNextWord", validator.validate(1)); - } - - public function ShortTextMouseEventTBLTRTest():void - { - ShortTextMouseEventTest(); - } - - public function ShortTextMouseEventTBRTLTest():void - { - ShortTextMouseEventTest(); - } - - public function ShortTextMouseEventRLLTRTest():void - { - ShortTextMouseEventTest(); - } - - public function ShortTextMouseEventRLRTLTest():void - { - ShortTextMouseEventTest(); - } - - // Test cases that should be covered - // The link on a short text which is less wide than a line - private function ShortTextMouseEventTest():void - { - var validator:FlowElementMouseEventValidator; - SelManager.selectRange(6, 10); - - //get the bounds of the link - var boundsInfo:Object = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; - var bounds:Rectangle = boundsInfo.rect as Rectangle; - var textLine:TextLine = boundsInfo.textLine; - - //get the link element - var leaf:FlowLeafElement = SelManager.textFlow.findLeaf(SelManager.absoluteStart); - var link:LinkElement = leaf.parent as LinkElement; - - var cc:ContainerController = SelManager.textFlow.flowComposer.getControllerAt(0); - var textFlow:TextFlow = SelManager.textFlow; // save it for later - SelManager.textFlow.interactionManager = null; // turn off editing - var mouseOverEvent:MouseEvent; - var mouseOutEvent:MouseEvent; - - //Make sure it works when scroll policy AUTO case - cc.horizontalScrollPolicy = ScrollPolicy.AUTO; - cc.verticalScrollPolicy = ScrollPolicy.AUTO; - // listen for rollOver event on the link, send an ersatz mouse_over, which will cause a rollOver - // after mouseOver, link should be in hover state - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); - mouseOverEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, - (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); - textLine.dispatchEvent(mouseOverEvent); - validator.validate(1); - assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); - - mouseOutEvent = new MouseEvent(MouseEvent.MOUSE_OUT, true, false, - bounds.right + 1, bounds.bottom + 1, textLine); - textLine.dispatchEvent(mouseOutEvent); - - //Make sure it works when scroll policy off case - cc.horizontalScrollPolicy = ScrollPolicy.OFF; - cc.verticalScrollPolicy = ScrollPolicy.OFF; - textFlow.flowComposer.updateAllControllers(); - - textFlow.interactionManager = SelManager; - SelManager.selectRange(6, 10); - boundsInfo = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; - bounds = boundsInfo.rect as Rectangle; - textLine = boundsInfo.textLine; - - textFlow = SelManager.textFlow; // save it for later - SelManager.textFlow.interactionManager = null; // turn off editing - - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); - mouseOverEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, - (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); - textLine.dispatchEvent(mouseOverEvent); - validator.validate(1); - assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); - - mouseOutEvent = new MouseEvent(MouseEvent.MOUSE_OUT, true, false, - bounds.right + 1, bounds.bottom + 1, textLine); - textLine.dispatchEvent(mouseOutEvent); - - //Test if it works when lineBreak == "toFit"; - cc.horizontalScrollPolicy = ScrollPolicy.AUTO; - cc.verticalScrollPolicy = ScrollPolicy.AUTO; - textFlow.lineBreak = LineBreak.TO_FIT; - textFlow.flowComposer.updateAllControllers(); - - textFlow.interactionManager = SelManager; - SelManager.selectRange(6, 10); - boundsInfo = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; - bounds = boundsInfo.rect as Rectangle; - textLine = boundsInfo.textLine; - - textFlow = SelManager.textFlow; // save it for later - SelManager.textFlow.interactionManager = null; // turn off editing - - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); - mouseOverEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, - (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); - textLine.dispatchEvent(mouseOverEvent); - validator.validate(1); - assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); - - mouseOutEvent = new MouseEvent(MouseEvent.MOUSE_OUT, true, false, - bounds.right + 1, bounds.bottom + 1, textLine); - textLine.dispatchEvent(mouseOutEvent); - - //Test if it works when doing measurement for width and/or height - cc.horizontalScrollPolicy = ScrollPolicy.OFF; - cc.verticalScrollPolicy = ScrollPolicy.OFF; - cc.setCompositionSize(300, 300); - - textFlow.interactionManager = SelManager; - SelManager.selectRange(6, 10); - boundsInfo = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; - bounds = boundsInfo.rect as Rectangle; - textLine = boundsInfo.textLine; - - textFlow = SelManager.textFlow; // save it for later - SelManager.textFlow.interactionManager = null; // turn off editing - - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); - mouseOverEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, - (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); - textLine.dispatchEvent(mouseOverEvent); - validator.validate(1); - assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); - - - // avoid tearDown assert about no Selectionmanager - textFlow.interactionManager = SelManager; - SelManager.selectRange(0, 0); - } - - // Test cases that should be covered - // 1. link on part of the line - // 2. link across several lines - // For now, only covering first line in link - public function FlowElementMouseEventTest():void - { - var validator:FlowElementMouseEventValidator; - - var cc:ContainerController = SelManager.textFlow.flowComposer.getControllerAt(0); - if (TestData.id == "FlowElementMouseEventTestScrollingOn") - { - cc.verticalScrollPolicy = ScrollPolicy.ON; - cc.horizontalScrollPolicy = ScrollPolicy.ON; - }else if (TestData.id == "FlowElementMouseEventTestScrolled") - { - cc.verticalScrollPolicy = ScrollPolicy.ON; - cc.horizontalScrollPolicy = ScrollPolicy.ON; - var originalXScroll:Number = cc.horizontalScrollPosition; - var originalYScroll:Number = cc.verticalScrollPosition; - - // Copy and paste the entire text, which should cause a scroll event - SelManager.selectRange(0, int.MAX_VALUE); - var scrap:TextScrap = TextScrap.createTextScrap(new TextRange(SelManager.textFlow, 0, SelManager.textFlow.textLength)); - var validator1:EventValidator = new EventValidator(SelManager.textFlow, new ScrollEvent(TextLayoutEvent.SCROLL, false, false)); - SelManager.selectRange(int.MAX_VALUE, int.MAX_VALUE); - SelManager.pasteTextScrap(scrap); - assertTrue("Expected to get a scroll event, but didn't", validator1.validate(1)); - - // Verify that the direction and delta in the event are correct - var scrollEvent:ScrollEvent = validator1.lastEvent as ScrollEvent; - validateScrollEvent(validator1.lastEvent as ScrollEvent, originalXScroll, originalYScroll); - - // scroll to a new position, and check that works as expected - originalXScroll = cc.horizontalScrollPosition; - originalYScroll = cc.verticalScrollPosition; - validator1.reset(new ScrollEvent(TextLayoutEvent.SCROLL, false, false)); - validateScrollEvent(validator1.lastEvent as ScrollEvent, originalXScroll, originalYScroll); - TestFrame.textFlow.flowComposer.updateAllControllers(); - } - - SelManager.selectRange(76, 85); - SelManager.applyLink("http://www.adobe.com/go/flashplayer","_self" ,false); - TestFrame.textFlow.flowComposer.updateAllControllers(); - - var container:DisplayObjectContainer = SelManager.textFlow.flowComposer.getControllerAt(0).container; - if (TestData.id == "FlowElementMouseEventTestMeasure") - { - container.height = NaN; - container.width = NaN; - } - // Get the bounds of the link in TextLine coordinates - var boundsInfo:Object = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; - var bounds:Rectangle = boundsInfo.rect as Rectangle; - var textLine:TextLine = boundsInfo.textLine; - - // get the event mirror off the link - var leaf:FlowLeafElement = SelManager.textFlow.findLeaf(SelManager.absoluteStart); - var link:LinkElement = leaf.parent as LinkElement; - var textFlow:TextFlow = SelManager.textFlow; // save it for later - SelManager.textFlow.interactionManager = null; // turn off editing - - // before we've done anything, link in normal state - assertTrue("before we've done anything, link should be in normal state", link.linkState == LinkState.LINK); - - // listen for rollOver event on the link, send an ersatz mouse_over, which will cause a rollOver - // after mouseOver, link should be in hover state - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); - var mouseOverEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, - (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); - textLine.dispatchEvent(mouseOverEvent); - validator.validate(1); - assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); - - // mouseMove - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.MOUSE_MOVE, false, true, link, null)); - var mouseMoveEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_MOVE, true, false, - (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); - textLine.dispatchEvent(mouseMoveEvent); - validator.validate(1); - - // mouseDown - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.MOUSE_DOWN, false, true, link, null)); - var mouseDownEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, - (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); - textLine.dispatchEvent(mouseDownEvent); - validator.validate(1); - assertTrue("after mouseDown, link should be in active state", link.linkState == LinkState.ACTIVE); - - // mouseUp -- also generates click - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.MOUSE_UP, false, true, link, null)); - var clickValidator:FlowElementMouseEventValidator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.CLICK, false, true, link, null)); - var mouseUpEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_UP, true, false, - (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); - textLine.dispatchEvent(mouseUpEvent); - validator.validate(1); - clickValidator.validate(1); - assertTrue("after mouseUp, link should be in hover state", link.linkState == LinkState.HOVER); - - // mouseOut - validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OUT, false, true, link, null)); - var mouseOutEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_OUT, true, false, - bounds.right + 1, bounds.bottom + 1, textLine); - textLine.dispatchEvent(mouseOutEvent); - validator.validate(1); - assertTrue("after mouseOut, link should be in default (normal) state", link.linkState == LinkState.LINK); - - // avoid tearDown assert about no Selectionmanager - textFlow.interactionManager = SelManager; - SelManager.selectRange(0, 0); - } - - - private function validateScrollEvent(scrollEvent:ScrollEvent, originalXScroll:Number, originalYScroll:Number):void - { - var flowComposer:IFlowComposer = SelManager.textFlow.flowComposer; - var controller:ContainerController = flowComposer.getControllerAt(flowComposer.numControllers - 1); - if (originalXScroll != controller.horizontalScrollPosition) - { - assertTrue("Scrolled horizontally, but got vertical scroll event", scrollEvent.direction == ScrollEventDirection.HORIZONTAL); - assertTrue("Scroll delta doesn't match expected", scrollEvent.delta == controller.horizontalScrollPosition - originalXScroll); - } - if (originalYScroll != controller.verticalScrollPosition) - { - assertTrue("Scrolled vertically, but got horizontal scroll event", scrollEvent.direction == ScrollEventDirection.VERTICAL); - assertTrue("Scroll delta doesn't match expected", scrollEvent.delta == controller.verticalScrollPosition - originalYScroll); - } - } - - public function scrollEventTest():void - { - var textFlow:TextFlow = SelManager.textFlow; - var controller:ContainerController = textFlow.flowComposer.getControllerAt(0); - controller.verticalScrollPolicy = ScrollPolicy.ON; - controller.horizontalScrollPolicy = ScrollPolicy.ON; - var originalXScroll:Number = controller.horizontalScrollPosition; - var originalYScroll:Number = controller.verticalScrollPosition; - - // Copy and paste the entire text, which should cause a scroll event - SelManager.selectRange(0, int.MAX_VALUE); - var scrap:TextScrap = TextScrap.createTextScrap(new TextRange(textFlow, 0, textFlow.textLength)); - var validator:EventValidator = new EventValidator(SelManager.textFlow, new ScrollEvent(TextLayoutEvent.SCROLL, false, false)); - SelManager.selectRange(int.MAX_VALUE, int.MAX_VALUE); - SelManager.pasteTextScrap(scrap); - assertTrue("Expected to get a scroll event, but didn't", validator.validate(1)); - - // Verify that the direction and delta in the event are correct - var scrollEvent:ScrollEvent = validator.lastEvent as ScrollEvent; - validateScrollEvent(validator.lastEvent as ScrollEvent, originalXScroll, originalYScroll); - - // Now scroll up, and check that works as expected - originalXScroll = controller.horizontalScrollPosition; - originalYScroll = controller.verticalScrollPosition; - var verticalText:Boolean = textFlow.computedFormat.blockProgression == BlockProgression.RL; - validator.reset(new ScrollEvent(TextLayoutEvent.SCROLL, false, false)); - if (verticalText) - controller.horizontalScrollPosition = 0; - else - controller.verticalScrollPosition = 0; - validateScrollEvent(validator.lastEvent as ScrollEvent, originalXScroll, originalYScroll); - } - - } + + import UnitTest.ExtendedClasses.TestSuiteExtended; + import UnitTest.ExtendedClasses.VellumTestCase; + import UnitTest.Fixtures.FileRepository; + import UnitTest.Fixtures.TestConfig; + import UnitTest.Validation.*; + + import flash.display.DisplayObjectContainer; + import flash.display.Sprite; + import flash.events.*; + import flash.geom.Rectangle; + import flash.text.engine.TextLine; + + import flashx.textLayout.compose.IFlowComposer; + import flashx.textLayout.compose.TextFlowLine; + import flashx.textLayout.container.ContainerController; + import flashx.textLayout.container.ScrollPolicy; + import flashx.textLayout.conversion.TextConverter; + import flashx.textLayout.edit.IEditManager; + import flashx.textLayout.edit.SelectionManager; + import flashx.textLayout.edit.SelectionState; + import flashx.textLayout.edit.TextScrap; + import flashx.textLayout.elements.*; + import flashx.textLayout.events.CompositionCompleteEvent; + import flashx.textLayout.events.DamageEvent; + import flashx.textLayout.events.FlowElementMouseEvent; + import flashx.textLayout.events.FlowOperationEvent; + import flashx.textLayout.events.ScrollEvent; + import flashx.textLayout.events.ScrollEventDirection; + import flashx.textLayout.events.SelectionEvent; + import flashx.textLayout.events.StatusChangeEvent; + import flashx.textLayout.events.TextLayoutEvent; + import flashx.textLayout.formats.BlockProgression; + import flashx.textLayout.formats.LineBreak; + import flashx.textLayout.formats.TextAlign; + import flashx.textLayout.formats.TextLayoutFormat; + import flashx.textLayout.operations.FlowOperation; + import flashx.textLayout.operations.InsertInlineGraphicOperation; + import flashx.textLayout.operations.RedoOperation; + import flashx.textLayout.operations.UndoOperation; + import flashx.textLayout.tlf_internal; + import flashx.textLayout.utils.GeometryUtil; + + import mx.utils.LoaderUtil; + + import org.flexunit.asserts.assertTrue; + + use namespace tlf_internal; + + public class AllEventTest extends VellumTestCase + { + [Embed(source="../../../../test/testFiles/assets/smiley.gif")] + private var embeddedGIF:Class; + + private const textTBLTR:String = "

MIA - MENU - DEN

"; + + public function AllEventTest():void + { + super("", "AllEventTest2", TestConfig.getInstance()); + metaData = {}; + // Note: These must correspond to a Watson product area (case-sensitive) + metaData.productArea = "Text Composition"; + } + + public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void + { + FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/tlf/ShortTextMouseEventTBLTR.xml"); + FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/tlf/ShortTextMouseEventTBRTL.xml"); + FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/tlf/ShortTextMouseEventRLLTR.xml"); + FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/tlf/ShortTextMouseEventRLRTL.xml"); + var testCaseClass:Class = AllEventTest; + VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts); + } + + [BeforeClass] + public static function setUpClass():void + { + var testConfig:TestConfig = TestConfig.getInstance(); + FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/tlf/ShortTextMouseEventTBLTR.xml"); + FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/tlf/ShortTextMouseEventTBRTL.xml"); + FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/tlf/ShortTextMouseEventRLLTR.xml"); + FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/tlf/ShortTextMouseEventRLRTL.xml"); + VellumTestCase.suiteFromXML(AllEventTest, testConfig.testXMLStore, testConfig, null); + } + + [Before] + override public function setUpTest():void + { + super.setUpTest(); + } + + [After] + override public function tearDownTest():void + { + super.tearDownTest(); + } + + private function beginSelectionEventValidation(target:IEventDispatcher, eventCount:int, validater:Function):void + { + target.addEventListener(SelectionEvent.SELECTION_CHANGE, validater); + } + + //SelectionEvent Test Cases + [Test] + public function selectionEventTest():void + { + metaData.productArea = "Editing"; + + this.SelManager.selectRange(0, 0); + + var textFlow:TextFlow = this.SelManager.textFlow; + var endIdx:int = 200; + var startIdx:int = 100; + + var theRects:Array = GeometryUtil.getHighlightBounds(new TextRange(textFlow, startIdx, endIdx)); + for each(var lineRectPair:Object in theRects) + { + var theLine:TextLine = lineRectPair.textLine as TextLine; + var rect:Rectangle = lineRectPair.rect as Rectangle; + var tfl:TextFlowLine = theLine.userData as TextFlowLine; + assertTrue("userData on a textLine should be a TextFlowLine!", tfl); + + //first "click" inside the bounds of the rect and make sure we have a point within the selection range: + var index:int = SelectionManager.tlf_internal::computeSelectionIndex(textFlow, theLine, null, rect.x + (rect.width / 2), rect.y + (rect.height / 2)); + + //validate using a calculated index. If this is a partial line selection, then using the abs start and end isn't valid. + var checkStart:int = tfl.absoluteStart >= startIdx ? tfl.absoluteStart : startIdx; + var checkEnd:int = (tfl.absoluteStart + tfl.textLength) <= endIdx ? (tfl.absoluteStart + tfl.textLength) : endIdx; + + //validate + assertTrue("the computed index derived from the selection shape must be within the line!", checkStart <= index && checkEnd >= index); + } + + // Select All + var validator:SelectionEventValidator = new SelectionEventValidator(TestFrame.textFlow, + new SelectionEvent(SelectionEvent.SELECTION_CHANGE, false, false, new SelectionState(TestFrame.textFlow, 0, TestFrame.textFlow.textLength - 1))); + SelManager.selectAll(); + assertTrue("Expected selection event showing entire flow selected", validator.validate(1)); + + // Select range + validator.reset(new SelectionEvent(SelectionEvent.SELECTION_CHANGE, false, false, new SelectionState(TestFrame.textFlow, 10, 100))); + SelManager.selectRange(10, 100); + SelManager.refreshSelection(); + assertTrue("Expected selection event showing range selected", validator.validate(1)); + + // Apply format -- expects selection changed on selected area b/c the contents changed + var format:TextLayoutFormat = new TextLayoutFormat(); + format.fontSize = 48; + validator.reset(); + (SelManager as IEditManager).applyLeafFormat(format); + assertTrue("Expected selection event after formatting applied", validator.validate(1)); + + // Insert text -- expects selection changed on selected area b/c the contents changed + const textToInsert:String = "FOO"; + validator.reset(new SelectionEvent(SelectionEvent.SELECTION_CHANGE, false, false, + new SelectionState(TestFrame.textFlow, 20 + textToInsert.length, 20 + textToInsert.length))); + SelManager.selectRange(20, 20); + (SelManager as IEditManager).insertText("FOO"); + SelManager.flushPendingOperations(); // force insert to happen right away + assertTrue("Expected selection event after text insertion", validator.validate(1)); + + // Change select range - test that client code can change the selection from within a selection event handler + textFlow.addEventListener(SelectionEvent.SELECTION_CHANGE, changeSelectionHandler); + SelManager.selectRange(10, 100); + SelManager.refreshSelection(); + assertTrue("Expected entire flow selected", SelManager.absoluteStart == 0 && SelManager.absoluteEnd == textFlow.textLength - 1); + + // Test selection by mouse. We should get one and only one event from this. + SelManager.selectRange(10, 11); + theRects = GeometryUtil.getHighlightBounds(new TextRange(textFlow, SelManager.absoluteStart, SelManager.absoluteEnd)); + theLine = theRects[0].textLine as TextLine; + rect = theRects[0].rect as Rectangle; + tfl = theLine.userData as TextFlowLine; + var mouseEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, true, rect.x, rect.y, theLine, false, false, false, false); + validator.reset(new SelectionEvent(SelectionEvent.SELECTION_CHANGE, false, false, + new SelectionState(TestFrame.textFlow, 10, 10))); + theLine.dispatchEvent(mouseEvent); + assertTrue("Expected single selection event after mouse click", validator.validate(1)); + } + + /** + * DamageEvent Test Cases + */ + [Test] + public function damageEventTest():void + { + //Change Color Test + var selectionBegin:int = 20; + var selectionEnd:int = 400; + SelManager.selectRange(selectionBegin, selectionEnd); + var validator:DamageEventValidator = new DamageEventValidator(TestFrame.textFlow, + new DamageEvent(DamageEvent.DAMAGE, false, false, null, SelManager.absoluteStart, SelManager.absoluteEnd - SelManager.absoluteStart)); + const fontColor:int = 0xFF0000; + var ca:TextLayoutFormat = new TextLayoutFormat(); + + ca.color = fontColor; + SelManager.applyLeafFormat(ca); + SelManager.flushPendingOperations(); + assertTrue("Expected damage event showing after color change", validator.validate(1)); + + //Delete Text Test + validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, null, SelManager.absoluteStart, SelManager.absoluteEnd - SelManager.absoluteStart)); + SelManager.cutTextScrap(SelManager.getSelectionState()); + SelManager.flushPendingOperations(); + assertTrue("Expected damage event showing after text deletion", validator.validate(1)); + + //Delete Character Test + SelManager.selectRange(90, 91); + validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, null, SelManager.absoluteStart, SelManager.absoluteEnd - SelManager.absoluteStart)); + SelManager.cutTextScrap(SelManager.getSelectionState()); + SelManager.flushPendingOperations(); + assertTrue("Expected damage event showing after character deletion", validator.validate(1)); + + //Change Geometry Test + validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength)); + TestFrame.setCompositionSize(500, 500); + TestFrame.textFlow.flowComposer.updateAllControllers(); + assertTrue("Expected damage event showing after Geometry change", validator.validate(1)); + + //Change Block Progression Test + validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength)); + TestFrame.textFlow.blockProgression = "rl"; + TestFrame.textFlow.flowComposer.updateAllControllers(); + assertTrue("Expected damage event showing after Block Progression change", validator.validate(1)); + + //Change Font Size Test + validator.reset(new DamageEvent(DamageEvent.DAMAGE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength)); + TestFrame.textFlow.fontSize = 32; + TestFrame.textFlow.flowComposer.updateAllControllers(); + assertTrue("Expected DamageEvent showing after Font Size change", validator.validate(1)); + } + + [Test] + public function statusChangeEventTest():void + { + metaData.productArea = "Editing"; + + //Insert Picture Test + var src:String = LoaderUtil.createAbsoluteURL(baseURL, "../../test/testFiles/assets/leaves.jpg"); + var element:InlineGraphicElement = new InlineGraphicElement(); + element.source = src; + element.width = 30; + element.height = 30; + var validator:StatusChangeEventValidator = new StatusChangeEventValidator(TestFrame.textFlow, + new StatusChangeEvent(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE, false, false, element, "loading", null)); + + var width:int = 30; + var height:int = 30; + var selectionBegin:int = 10; + var selectionEnd:int = 10; + SelManager.selectRange(selectionBegin, selectionEnd); + SelManager.insertInlineGraphic(src, width, height); + SelManager.flushPendingOperations(); + + assertTrue("Expected StatusChangeEvent showing after picture insertion", validator.validate(1)); + } + + /** + * The following test case is designed to test bug#2929161 + */ + [Test] + public function statusChangeEventHandlerTest():void + { + metaData.productArea = "Editing"; + + TestFrame.textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE, onStatusChangeHandler); + function onStatusChangeHandler(event:StatusChangeEvent):void + { + var ilg:InlineGraphicElement = event.element as InlineGraphicElement; + if (ilg && event.status == InlineGraphicElementStatus.READY) + { + assertTrue("Expected inline graphic is not null", ilg.graphic != null); + } + } + + //Insert Display Object + var yellowCircle:Sprite = new Sprite(); + yellowCircle.graphics.beginFill(0xFFFF33); // yellow + yellowCircle.graphics.drawCircle(10, 12, 10); + yellowCircle.graphics.endFill(); + + var width:int = 30; + var height:int = 30; + var selectionBegin:int = 10; + var selectionEnd:int = 10; + SelManager.selectRange(selectionBegin, selectionEnd); + SelManager.insertInlineGraphic(yellowCircle, width, height); + SelManager.flushPendingOperations(); + + //Insert Class + selectionBegin = 15; + selectionEnd = 15; + SelManager.selectRange(selectionBegin, selectionEnd); + SelManager.insertInlineGraphic(embeddedGIF, width, height); + SelManager.flushPendingOperations(); + + //Insert null object + selectionBegin = 20; + selectionEnd = 20; + SelManager.selectRange(selectionBegin, selectionEnd); + SelManager.insertInlineGraphic(null, width, height); + SelManager.flushPendingOperations(); + } + + [Test] + public function FlowOperationEventTest():void + { + metaData.productArea = "Editing"; + + var src:String = LoaderUtil.createAbsoluteURL(baseURL, "../../test/testFiles/assets/leaves.jpg"); + var width:int = 30; + var height:int = 30; + var selectionBegin:int = 10; + var selectionEnd:int = 10; + SelManager.selectRange(selectionBegin, selectionEnd); + var operation:InsertInlineGraphicOperation = new InsertInlineGraphicOperation(SelManager.getSelectionState(), + src, width, height, "none"); + var beginValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, + new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_BEGIN, false, false, operation, 0, null)); + var endValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, + new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_END, false, false, operation, 0, null)); + var completeValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, + new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_COMPLETE, false, false, operation, 0, null)); + var compositionValidator:CompositionCompleteEventValidator = new CompositionCompleteEventValidator(TestFrame.textFlow, + new CompositionCompleteEvent(CompositionCompleteEvent.COMPOSITION_COMPLETE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength + 1)); + SelManager.insertInlineGraphic(src, width, height); + assertTrue("Expected FlowOperationBeginEvent during picture insertion", beginValidator.validate(1)); + assertTrue("Expected FlowOperationEndEvent during picture insertion", endValidator.validate(1)); + assertTrue("Expected FlowOperationCompleteEvent during picture insertion", completeValidator.validate(1)); + assertTrue("Expected CompositionCompleEvent during picture insertion", compositionValidator.validate(1)); + + // Check undo + var pseudoUndoOperation:UndoOperation = new UndoOperation(operation); + beginValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_BEGIN, false, false, pseudoUndoOperation, 0, null)); + endValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_END, false, false, pseudoUndoOperation, 0, null)); + completeValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_COMPLETE, false, false, pseudoUndoOperation, 0, null)); + + SelManager.undo(); + + assertTrue("Expected FlowOperationBeginEvent during undo picture insertion", beginValidator.validate(1)); + assertTrue("Pseudo undo event should have been broadcast", FlowOperationEvent(beginValidator.lastEvent).operation is UndoOperation); + assertTrue("Expected FlowOperationEndEvent during undo picture insertion", endValidator.validate(1)); + assertTrue("Pseudo undo event should have been broadcast", FlowOperationEvent(endValidator.lastEvent).operation is UndoOperation); + assertTrue("Expected FlowOperationCompleteEvent undo during picture insertion", completeValidator.validate(1)); + assertTrue("Pseudo undo event should have been broadcast", FlowOperationEvent(completeValidator.lastEvent).operation is UndoOperation); + + // Check redo + var pseudoRedoOperation:RedoOperation = new RedoOperation(operation); + beginValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_BEGIN, false, false, pseudoRedoOperation, 0, null)); + endValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_END, false, false, pseudoRedoOperation, 0, null)); + completeValidator.reset(new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_COMPLETE, false, false, pseudoRedoOperation, 0, null)); + + SelManager.redo(); + + assertTrue("Expected FlowOperationBeginEvent during redo picture insertion", beginValidator.validate(1)); + assertTrue("Pseudo redo event should have been broadcast", FlowOperationEvent(beginValidator.lastEvent).operation is RedoOperation); + assertTrue("Expected FlowOperationEndEvent during redo picture insertion", endValidator.validate(1)); + assertTrue("Pseudo redo event should have been broadcast", FlowOperationEvent(endValidator.lastEvent).operation is RedoOperation); + assertTrue("Expected FlowOperationCompleteEvent redo during picture insertion", completeValidator.validate(1)); + assertTrue("Pseudo redo event should have been broadcast", FlowOperationEvent(completeValidator.lastEvent).operation is RedoOperation); + + } + + [Test] + public function FlowCompositeOperationEventTest():void + { + metaData.productArea = "Editing"; + + var beginValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, + new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_BEGIN, false, false, new FlowOperation(TestFrame.textFlow), 1, null)); + var endValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, + new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_END, false, false, new FlowOperation(TestFrame.textFlow), 1, null)); + var completeValidator:FlowOperationEventValidator = new FlowOperationEventValidator(TestFrame.textFlow, + new FlowOperationEvent(FlowOperationEvent.FLOW_OPERATION_COMPLETE, false, false, new FlowOperation(TestFrame.textFlow), 0, null)); + var compositionValidator:CompositionCompleteEventValidator = new CompositionCompleteEventValidator(TestFrame.textFlow, + new CompositionCompleteEvent(CompositionCompleteEvent.COMPOSITION_COMPLETE, false, false, TestFrame.textFlow, 0, TestFrame.textFlow.textLength)); + + SelManager.selectAll(); + SelManager.beginCompositeOperation(); + var leafFormat:TextLayoutFormat = new TextLayoutFormat(); + leafFormat.fontSize = 18; + SelManager.applyLeafFormat(leafFormat); + var paraFormat:TextLayoutFormat = new TextLayoutFormat(); + paraFormat.textAlign = TextAlign.CENTER; + SelManager.applyParagraphFormat(paraFormat); + SelManager.endCompositeOperation(); + + assertTrue("Expected FlowOperationBeginEvent during composite operation", beginValidator.validate(2)); + assertTrue("Expected FlowOperationEndEvent during composite operation", endValidator.validate(2)); + assertTrue("Expected FlowOperationCompleteEvent during composite operation", completeValidator.validate(1)); + assertTrue("Expected CompositionCompleEvent during composite operation", compositionValidator.validate(1)); + } + + [Test] + public function CompositionCompleteEventTest():void + { + var validator:CompositionCompleteEventValidator; + + if (TestFrame.textFlow.blockProgression == "rl") + { + validator = new CompositionCompleteEventValidator(TestFrame.textFlow, + new CompositionCompleteEvent(CompositionCompleteEvent.COMPOSITION_COMPLETE, false, false, TestFrame.textFlow, 0, 744)); + } + else + { + validator = new CompositionCompleteEventValidator(TestFrame.textFlow, + new CompositionCompleteEvent(CompositionCompleteEvent.COMPOSITION_COMPLETE, false, false, TestFrame.textFlow, 0, 831)); + + } + + TestFrame.textFlow.fontSize = 30; + TestFrame.textFlow.flowComposer.updateAllControllers(); + assertTrue("Expected CompositionCompleEvent showing after font size changing", validator.validate(1)); + } + + [Test] + [Ignore] + public function ShortTextMouseEventTBLTRTest():void + { + SelManager.textFlow = getTextFlowTBLTR(); + ShortTextMouseEventTest(); + } + + [Test] + [Ignore] + public function ShortTextMouseEventTBRTLTest():void + { + ShortTextMouseEventTest(); + } + + [Test] + [Ignore] + public function ShortTextMouseEventRLLTRTest():void + { + ShortTextMouseEventTest(); + } + + [Test] + [Ignore] + public function ShortTextMouseEventRLRTLTest():void + { + ShortTextMouseEventTest(); + } + + // Test cases that should be covered + // The link on a short text which is less wide than a line + private function ShortTextMouseEventTest():void + { + var validator:FlowElementMouseEventValidator; + SelManager.selectRange(6, 10); + var ttt:String = SelManager.textFlow.getText(); + + //get the bounds of the link + var selectionState:SelectionState = SelManager.getSelectionState(); + var highlightBounds:Array = GeometryUtil.getHighlightBounds(selectionState); + var boundsInfo:Object = highlightBounds[0]; + var bounds:Rectangle = boundsInfo.rect as Rectangle; + var textLine:TextLine = boundsInfo.textLine; + + //get the link element + var leaf:FlowLeafElement = SelManager.textFlow.findLeaf(SelManager.absoluteStart); + var link:LinkElement = leaf.parent as LinkElement; + + var cc:ContainerController = SelManager.textFlow.flowComposer.getControllerAt(0); + var textFlow:TextFlow = SelManager.textFlow; // save it for later + SelManager.textFlow.interactionManager = null; // turn off editing + var mouseOverEvent:MouseEvent; + var mouseOutEvent:MouseEvent; + + //Make sure it works when scroll policy AUTO case + cc.horizontalScrollPolicy = ScrollPolicy.AUTO; + cc.verticalScrollPolicy = ScrollPolicy.AUTO; + // listen for rollOver event on the link, send an ersatz mouse_over, which will cause a rollOver + // after mouseOver, link should be in hover state + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); + mouseOverEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, + (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); + textLine.dispatchEvent(mouseOverEvent); + validator.validate(1); + assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); + + mouseOutEvent = new MouseEvent(MouseEvent.MOUSE_OUT, true, false, + bounds.right + 1, bounds.bottom + 1, textLine); + textLine.dispatchEvent(mouseOutEvent); + + //Make sure it works when scroll policy off case + cc.horizontalScrollPolicy = ScrollPolicy.OFF; + cc.verticalScrollPolicy = ScrollPolicy.OFF; + textFlow.flowComposer.updateAllControllers(); + + textFlow.interactionManager = SelManager; + SelManager.selectRange(6, 10); + boundsInfo = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; + bounds = boundsInfo.rect as Rectangle; + textLine = boundsInfo.textLine; + + textFlow = SelManager.textFlow; // save it for later + SelManager.textFlow.interactionManager = null; // turn off editing + + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); + mouseOverEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, + (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); + textLine.dispatchEvent(mouseOverEvent); + validator.validate(1); + assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); + + mouseOutEvent = new MouseEvent(MouseEvent.MOUSE_OUT, true, false, + bounds.right + 1, bounds.bottom + 1, textLine); + textLine.dispatchEvent(mouseOutEvent); + + //Test if it works when lineBreak == "toFit"; + cc.horizontalScrollPolicy = ScrollPolicy.AUTO; + cc.verticalScrollPolicy = ScrollPolicy.AUTO; + textFlow.lineBreak = LineBreak.TO_FIT; + textFlow.flowComposer.updateAllControllers(); + + textFlow.interactionManager = SelManager; + SelManager.selectRange(6, 10); + boundsInfo = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; + bounds = boundsInfo.rect as Rectangle; + textLine = boundsInfo.textLine; + + textFlow = SelManager.textFlow; // save it for later + SelManager.textFlow.interactionManager = null; // turn off editing + + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); + mouseOverEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, + (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); + textLine.dispatchEvent(mouseOverEvent); + validator.validate(1); + assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); + + mouseOutEvent = new MouseEvent(MouseEvent.MOUSE_OUT, true, false, + bounds.right + 1, bounds.bottom + 1, textLine); + textLine.dispatchEvent(mouseOutEvent); + + //Test if it works when doing measurement for width and/or height + cc.horizontalScrollPolicy = ScrollPolicy.OFF; + cc.verticalScrollPolicy = ScrollPolicy.OFF; + cc.setCompositionSize(300, 300); + + textFlow.interactionManager = SelManager; + SelManager.selectRange(6, 10); + boundsInfo = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; + bounds = boundsInfo.rect as Rectangle; + textLine = boundsInfo.textLine; + + textFlow = SelManager.textFlow; // save it for later + SelManager.textFlow.interactionManager = null; // turn off editing + + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); + mouseOverEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, + (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); + textLine.dispatchEvent(mouseOverEvent); + validator.validate(1); + assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); + + + // avoid tearDown assert about no Selectionmanager + textFlow.interactionManager = SelManager; + SelManager.selectRange(0, 0); + } + + // Test cases that should be covered + // 1. link on part of the line + // 2. link across several lines + // For now, only covering first line in link + [Test] + public function FlowElementMouseEventTest():void + { + var validator:FlowElementMouseEventValidator; + + var cc:ContainerController = SelManager.textFlow.flowComposer.getControllerAt(0); + if (TestData.id == "FlowElementMouseEventTestScrollingOn") + { + cc.verticalScrollPolicy = ScrollPolicy.ON; + cc.horizontalScrollPolicy = ScrollPolicy.ON; + } + else if (TestData.id == "FlowElementMouseEventTestScrolled") + { + cc.verticalScrollPolicy = ScrollPolicy.ON; + cc.horizontalScrollPolicy = ScrollPolicy.ON; + var originalXScroll:Number = cc.horizontalScrollPosition; + var originalYScroll:Number = cc.verticalScrollPosition; + + // Copy and paste the entire text, which should cause a scroll event + SelManager.selectRange(0, int.MAX_VALUE); + var scrap:TextScrap = TextScrap.createTextScrap(new TextRange(SelManager.textFlow, 0, SelManager.textFlow.textLength)); + var validator1:EventValidator = new EventValidator(SelManager.textFlow, new ScrollEvent(TextLayoutEvent.SCROLL, false, false)); + SelManager.selectRange(int.MAX_VALUE, int.MAX_VALUE); + SelManager.pasteTextScrap(scrap); + assertTrue("Expected to get a scroll event, but didn't", validator1.validate(1)); + + // Verify that the direction and delta in the event are correct + var scrollEvent:ScrollEvent = validator1.lastEvent as ScrollEvent; + validateScrollEvent(validator1.lastEvent as ScrollEvent, originalXScroll, originalYScroll); + + // scroll to a new position, and check that works as expected + originalXScroll = cc.horizontalScrollPosition; + originalYScroll = cc.verticalScrollPosition; + validator1.reset(new ScrollEvent(TextLayoutEvent.SCROLL, false, false)); + validateScrollEvent(validator1.lastEvent as ScrollEvent, originalXScroll, originalYScroll); + TestFrame.textFlow.flowComposer.updateAllControllers(); + } + + SelManager.selectRange(76, 85); + SelManager.applyLink("http://www.adobe.com/go/flashplayer", "_self", false); + TestFrame.textFlow.flowComposer.updateAllControllers(); + + var container:DisplayObjectContainer = SelManager.textFlow.flowComposer.getControllerAt(0).container; + if (TestData.id == "FlowElementMouseEventTestMeasure") + { + container.height = NaN; + container.width = NaN; + } + // Get the bounds of the link in TextLine coordinates + var boundsInfo:Object = GeometryUtil.getHighlightBounds(SelManager.getSelectionState())[0]; + var bounds:Rectangle = boundsInfo.rect as Rectangle; + var textLine:TextLine = boundsInfo.textLine; + + // get the event mirror off the link + var leaf:FlowLeafElement = SelManager.textFlow.findLeaf(SelManager.absoluteStart); + var link:LinkElement = leaf.parent as LinkElement; + var textFlow:TextFlow = SelManager.textFlow; // save it for later + SelManager.textFlow.interactionManager = null; // turn off editing + + // before we've done anything, link in normal state + assertTrue("before we've done anything, link should be in normal state", link.linkState == LinkState.LINK); + + // listen for rollOver event on the link, send an ersatz mouse_over, which will cause a rollOver + // after mouseOver, link should be in hover state + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OVER, false, true, link, null)); + var mouseOverEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_OVER, true, false, + (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); + textLine.dispatchEvent(mouseOverEvent); + validator.validate(1); + assertTrue("after mouseOver, link should be in hover state", link.linkState == LinkState.HOVER); + + // mouseMove + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.MOUSE_MOVE, false, true, link, null)); + var mouseMoveEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_MOVE, true, false, + (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); + textLine.dispatchEvent(mouseMoveEvent); + validator.validate(1); + + // mouseDown + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.MOUSE_DOWN, false, true, link, null)); + var mouseDownEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, + (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); + textLine.dispatchEvent(mouseDownEvent); + validator.validate(1); + assertTrue("after mouseDown, link should be in active state", link.linkState == LinkState.ACTIVE); + + // mouseUp -- also generates click + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.MOUSE_UP, false, true, link, null)); + var clickValidator:FlowElementMouseEventValidator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.CLICK, false, true, link, null)); + var mouseUpEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_UP, true, false, + (bounds.left + bounds.right) / 2, (bounds.top + bounds.bottom) / 2, textLine); + textLine.dispatchEvent(mouseUpEvent); + validator.validate(1); + clickValidator.validate(1); + assertTrue("after mouseUp, link should be in hover state", link.linkState == LinkState.HOVER); + + // mouseOut + validator = new FlowElementMouseEventValidator(link, new FlowElementMouseEvent(FlowElementMouseEvent.ROLL_OUT, false, true, link, null)); + var mouseOutEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_OUT, true, false, + bounds.right + 1, bounds.bottom + 1, textLine); + textLine.dispatchEvent(mouseOutEvent); + validator.validate(1); + assertTrue("after mouseOut, link should be in default (normal) state", link.linkState == LinkState.LINK); + + // avoid tearDown assert about no Selectionmanager + textFlow.interactionManager = SelManager; + SelManager.selectRange(0, 0); + } + + [Test] + public function scrollEventTest():void + { + var textFlow:TextFlow = SelManager.textFlow; + var controller:ContainerController = textFlow.flowComposer.getControllerAt(0); + controller.verticalScrollPolicy = ScrollPolicy.ON; + controller.horizontalScrollPolicy = ScrollPolicy.ON; + var originalXScroll:Number = controller.horizontalScrollPosition; + var originalYScroll:Number = controller.verticalScrollPosition; + + // Copy and paste the entire text, which should cause a scroll event + SelManager.selectRange(0, int.MAX_VALUE); + var scrap:TextScrap = TextScrap.createTextScrap(new TextRange(textFlow, 0, textFlow.textLength)); + var validator:EventValidator = new EventValidator(SelManager.textFlow, new ScrollEvent(TextLayoutEvent.SCROLL, false, false)); + SelManager.selectRange(int.MAX_VALUE, int.MAX_VALUE); + SelManager.pasteTextScrap(scrap); + assertTrue("Expected to get a scroll event, but didn't", validator.validate(1)); + + // Verify that the direction and delta in the event are correct + var scrollEvent:ScrollEvent = validator.lastEvent as ScrollEvent; + validateScrollEvent(validator.lastEvent as ScrollEvent, originalXScroll, originalYScroll); + + // Now scroll up, and check that works as expected + originalXScroll = controller.horizontalScrollPosition; + originalYScroll = controller.verticalScrollPosition; + var verticalText:Boolean = textFlow.computedFormat.blockProgression == BlockProgression.RL; + validator.reset(new ScrollEvent(TextLayoutEvent.SCROLL, false, false)); + if (verticalText) + controller.horizontalScrollPosition = 0; + else + controller.verticalScrollPosition = 0; + validateScrollEvent(validator.lastEvent as ScrollEvent, originalXScroll, originalYScroll); + } + + private function validateScrollEvent(scrollEvent:ScrollEvent, originalXScroll:Number, originalYScroll:Number):void + { + var flowComposer:IFlowComposer = SelManager.textFlow.flowComposer; + var controller:ContainerController = flowComposer.getControllerAt(flowComposer.numControllers - 1); + if (originalXScroll != controller.horizontalScrollPosition) + { + assertTrue("Scrolled horizontally, but got vertical scroll event", scrollEvent.direction == ScrollEventDirection.HORIZONTAL); + assertTrue("Scroll delta doesn't match expected", scrollEvent.delta == controller.horizontalScrollPosition - originalXScroll); + } + if (originalYScroll != controller.verticalScrollPosition) + { + assertTrue("Scrolled vertically, but got horizontal scroll event", scrollEvent.direction == ScrollEventDirection.VERTICAL); + assertTrue("Scroll delta doesn't match expected", scrollEvent.delta == controller.verticalScrollPosition - originalYScroll); + } + } + + private function changeSelectionHandler(event:SelectionEvent):void + { + var textFlow:TextFlow = event.selectionState.textFlow; + textFlow.removeEventListener(SelectionEvent.SELECTION_CHANGE, changeSelectionHandler); + textFlow.interactionManager.selectRange(0, textFlow.textLength); + } + + private function getTextFlowTBLTR():TextFlow + { + var configuration:Configuration = TextFlow.defaultConfiguration.clone(); + return TextConverter.importToFlow(textTBLTR, TextConverter.TEXT_LAYOUT_FORMAT, configuration); + } + } } http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/UnitTest/Tests/AllParaAttributeTest.as ---------------------------------------------------------------------- diff --git a/automation_tests/src/UnitTest/Tests/AllParaAttributeTest.as b/automation_tests/src/UnitTest/Tests/AllParaAttributeTest.as index 1a86d2a..a351514 100644 --- a/automation_tests/src/UnitTest/Tests/AllParaAttributeTest.as +++ b/automation_tests/src/UnitTest/Tests/AllParaAttributeTest.as @@ -30,7 +30,9 @@ package UnitTest.Tests import flashx.textLayout.property.Property; import flashx.textLayout.tlf_internal; - use namespace tlf_internal; + import org.flexunit.asserts.assertTrue; + + use namespace tlf_internal; public class AllParaAttributeTest extends AllAttributeTest {