You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by pi...@apache.org on 2015/05/03 22:23:50 UTC
git commit: [flex-tlf] [refs/heads/develop] - Migrate SelectionTest
to FU 4 Ignored test: wordSelection
Repository: flex-tlf
Updated Branches:
refs/heads/develop fba0c998c -> 372126a93
Migrate SelectionTest to FU 4
Ignored test: wordSelection
Project: http://git-wip-us.apache.org/repos/asf/flex-tlf/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-tlf/commit/372126a9
Tree: http://git-wip-us.apache.org/repos/asf/flex-tlf/tree/372126a9
Diff: http://git-wip-us.apache.org/repos/asf/flex-tlf/diff/372126a9
Branch: refs/heads/develop
Commit: 372126a934d869c3edb2448dc025d74dff59d85c
Parents: fba0c99
Author: piotrz <pi...@gmail.com>
Authored: Sun May 3 22:23:30 2015 +0200
Committer: piotrz <pi...@gmail.com>
Committed: Sun May 3 22:23:30 2015 +0200
----------------------------------------------------------------------
automation_tests/src/AllTestsSuite.as | 2 +
.../src/UnitTest/Tests/SelectionTest.as | 1828 +++++++++---------
test/testCases/SelectionTest.xml | 2 +-
3 files changed, 965 insertions(+), 867 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/372126a9/automation_tests/src/AllTestsSuite.as
----------------------------------------------------------------------
diff --git a/automation_tests/src/AllTestsSuite.as b/automation_tests/src/AllTestsSuite.as
index 6d3739c..b9c0c38 100644
--- a/automation_tests/src/AllTestsSuite.as
+++ b/automation_tests/src/AllTestsSuite.as
@@ -46,6 +46,7 @@ package
import UnitTest.Tests.LocaleTests;
import UnitTest.Tests.OperationTest;
import UnitTest.Tests.ScrollingTest;
+ import UnitTest.Tests.SelectionTest;
import UnitTest.Tests.SpacingTest;
import UnitTest.Tests.StyleTest;
import UnitTest.Tests.TCYTest;
@@ -100,6 +101,7 @@ package
public var textContainerManagerTest:TextContainerManagerTest;
public var tcyTest:TCYTest;
public var styleTest:StyleTest;
+ public var selectionTest:SelectionTest;
}
}
http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/372126a9/automation_tests/src/UnitTest/Tests/SelectionTest.as
----------------------------------------------------------------------
diff --git a/automation_tests/src/UnitTest/Tests/SelectionTest.as b/automation_tests/src/UnitTest/Tests/SelectionTest.as
index 2e72cfd..14e554c 100644
--- a/automation_tests/src/UnitTest/Tests/SelectionTest.as
+++ b/automation_tests/src/UnitTest/Tests/SelectionTest.as
@@ -18,882 +18,978 @@
////////////////////////////////////////////////////////////////////////////////
package UnitTest.Tests
{
- import UnitTest.ExtendedClasses.TestSuiteExtended;
- import UnitTest.ExtendedClasses.VellumTestCase;
- import UnitTest.Fixtures.TestConfig;
-
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.BlendMode;
- import flash.display.DisplayObjectContainer;
- import flash.display.IBitmapDrawable;
- import flash.display.Shape;
- import flash.display.Sprite;
- import flash.events.*;
- import flash.geom.Matrix;
- import flash.geom.Point;
- import flash.geom.Rectangle;
- import flash.text.engine.TextLine;
- import flash.text.engine.TextLineValidity;
- import flash.text.engine.TextRotation;
- import flash.utils.ByteArray;
-
- import flashx.textLayout.compose.TextFlowLine;
- import flashx.textLayout.container.ContainerController;
- import flashx.textLayout.conversion.TextConverter;
- import flashx.textLayout.edit.SelectionFormat;
- import flashx.textLayout.edit.EditManager;
- import flashx.textLayout.edit.SelectionManager;
- import flashx.textLayout.elements.*;
- import flashx.textLayout.formats.TextLayoutFormat;
- import flashx.textLayout.tlf_internal;
- import flashx.textLayout.utils.GeometryUtil;
-
- import mx.utils.LoaderUtil;
+ import UnitTest.ExtendedClasses.TestConfigurationLoader;
+ import UnitTest.ExtendedClasses.VellumTestCase;
+ import UnitTest.Fixtures.TestCaseVo;
+ import UnitTest.Fixtures.TestConfig;
+
+ import flash.display.Bitmap;
+ import flash.display.BitmapData;
+ import flash.display.BlendMode;
+ import flash.display.IBitmapDrawable;
+ import flash.display.Sprite;
+ import flash.events.*;
+ import flash.geom.Matrix;
+ import flash.geom.Point;
+ import flash.geom.Rectangle;
+ import flash.text.engine.TextLine;
+ import flash.text.engine.TextRotation;
+ import flash.utils.ByteArray;
+
+ import flashx.textLayout.compose.TextFlowLine;
+ import flashx.textLayout.container.ContainerController;
+ import flashx.textLayout.conversion.TextConverter;
+ import flashx.textLayout.edit.EditManager;
+ import flashx.textLayout.edit.SelectionFormat;
+ import flashx.textLayout.edit.SelectionManager;
+ import flashx.textLayout.elements.*;
+ import flashx.textLayout.formats.TextLayoutFormat;
+ import flashx.textLayout.tlf_internal;
+ import flashx.textLayout.utils.GeometryUtil;
+
+ import mx.utils.LoaderUtil;
import org.flexunit.asserts.assertTrue;
import org.flexunit.asserts.fail;
+ [TestCase(order=39)]
+ [RunWith("org.flexunit.runners.Parameterized")]
public class SelectionTest extends VellumTestCase
- {
- public function SelectionTest(methodName:String, testID:String, testConfig:TestConfig, testCaseXML:XML=null)
- {
- super(methodName, testID, testConfig, testCaseXML);
-
- if ( TestData.rotationAmount )
- TestID = TestID + ":" + TestData.rotationAmount;
-
-
- // Note: These must correspond to a Watson product area (case-sensitive)
- metaData.productArea = "Editing";
- metaData.productSubArea = "Selection";
- }
-
- public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void
- {
- var testCaseClass:Class = SelectionTest;
- VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts);
- }
-
- public override function setUpTest():void
- {
- super.setUpTest();
- }
-
- public override function tearDownTest():void
- {
- super.tearDownTest();
- }
-
- // Tests the default SelectionFormat
- public function defaultColorTest():void
- {
- assertTrue( "Default focus selection format alpha is unexpected",
- SelManager.focusedSelectionFormat.rangeAlpha == 1 );
- assertTrue( "Default focus selection format blend mode is unexpected",
- SelManager.focusedSelectionFormat.rangeBlendMode == BlendMode.DIFFERENCE );
- assertTrue( "Default focus selection format color is unexpected",
- SelManager.focusedSelectionFormat.rangeColor == 0xffffff );
-
- assertTrue( "Default no focus selection format alpha is unexpected",
- SelManager.unfocusedSelectionFormat.rangeAlpha == 1 );
- assertTrue( "Default no focus selection format blend mode is unexpected",
- SelManager.unfocusedSelectionFormat.rangeBlendMode == BlendMode.DIFFERENCE );
- assertTrue( "Default no focus selection format color is unexpected",
- SelManager.unfocusedSelectionFormat.rangeColor == 0xffffff );
-
- // inactive
- assertTrue( "Overridden non-default inactive selection format alpha is incorrect",
- SelManager.inactiveSelectionFormat.rangeAlpha == 1 );
- assertTrue( "Overridden non-default inactive selection format blend mode is incorrect",
- SelManager.inactiveSelectionFormat.rangeBlendMode == BlendMode.DIFFERENCE );
- assertTrue( "Overridden non-default inactive selection format color is incorrect",
- SelManager.inactiveSelectionFormat.rangeColor == 0xffffff );
- }
-
- // Tests overridding the default SelectionFormat in the Configuration.
- // Default SelectionFormat set in setUp based on XML flag
- public function overrideDefaultColorTest():void
- {
- var config:Configuration = TextFlow.defaultConfiguration.clone();
-
- config.focusedSelectionFormat = new SelectionFormat(0x00ff00, 0.5, BlendMode.DARKEN, 0x00ff00, 0.5, BlendMode.DARKEN, 0);
- config.unfocusedSelectionFormat = new SelectionFormat(0x00ffff, 0, BlendMode.ALPHA, 0x00ffff, 0, BlendMode.ALPHA, 0);
- config.inactiveSelectionFormat = new SelectionFormat(0xf0000f, 0.1, BlendMode.LAYER, 0xf0000f, 0.1, BlendMode.LAYER, 0);
-
- var textFlow:TextFlow = new TextFlow(config);
- textFlow.interactionManager = new SelectionManager();
-
- assertTrue( "Overridden default focus selection format alpha is incorrect",
- textFlow.interactionManager.focusedSelectionFormat.rangeAlpha == 0.5 );
- assertTrue( "Overridden default focus selection format blend mode is incorrect",
- textFlow.interactionManager.focusedSelectionFormat.rangeBlendMode == BlendMode.DARKEN );
- assertTrue( "Overridden default focus selection format color is incorrect",
- textFlow.interactionManager.focusedSelectionFormat.rangeColor == 0x00ff00 );
-
- // no focus
- assertTrue( "Overridden default no focus selection format alpha is incorrect",
- textFlow.interactionManager.unfocusedSelectionFormat.rangeAlpha == 0 );
- assertTrue( "Overridden default no focus selection format blend mode is incorrect",
- textFlow.interactionManager.unfocusedSelectionFormat.rangeBlendMode == BlendMode.ALPHA );
- assertTrue( "Overridden default no focus selection format color is incorrect",
- textFlow.interactionManager.unfocusedSelectionFormat.rangeColor == 0x00ffff );
-
- // inactive
- assertTrue( "Overridden non-default inactive selection format alpha is incorrect",
- textFlow.interactionManager.inactiveSelectionFormat.rangeAlpha == 0.1 );
- assertTrue( "Overridden non-default inactive selection format blend mode is incorrect",
- textFlow.interactionManager.inactiveSelectionFormat.rangeBlendMode == BlendMode.LAYER );
- assertTrue( "Overridden non-default inactive selection format color is incorrect",
- textFlow.interactionManager.inactiveSelectionFormat.rangeColor == 0xf0000f );
- }
-
- // Tests overridding the default SelectionFormat
- public function overrideColorTest():void
- {
- assertTrue(SelManager == SelManager.textFlow.interactionManager,"SelManager mismatch");
-
- SelManager.textFlow.interactionManager.focusedSelectionFormat = new SelectionFormat(0xffff00, 0.25, BlendMode.HARDLIGHT, 0xffff00, 0.25, BlendMode.HARDLIGHT, 0);
- SelManager.textFlow.interactionManager.unfocusedSelectionFormat = new SelectionFormat(0xf0ff0f, 0.75, BlendMode.INVERT, 0xf0ff0f, 0.75, BlendMode.INVERT, 0);
- SelManager.textFlow.interactionManager.inactiveSelectionFormat = new SelectionFormat(0x0f00f0, 0.44, BlendMode.LIGHTEN, 0x0f00f0, 0.44, BlendMode.LIGHTEN, 0);
-
- // Set to active
-
- assertTrue( "Overridden active focus selection format alpha is incorrect",
- SelManager.focusedSelectionFormat.rangeAlpha == 0.25 );
- assertTrue( "Overridden active focus selection format blend mode is incorrect",
- SelManager.focusedSelectionFormat.rangeBlendMode == BlendMode.HARDLIGHT );
- assertTrue( "Overridden active focus selection format color is incorrect",
- SelManager.focusedSelectionFormat.rangeColor == 0xffff00 );
-
- // No Focus
- assertTrue( "Overridden no focus selection format alpha is incorrect",
- SelManager.unfocusedSelectionFormat.rangeAlpha == 0.75 );
- assertTrue( "Overridden no focus selection format blend mode is incorrect",
- SelManager.unfocusedSelectionFormat.rangeBlendMode == BlendMode.INVERT );
- assertTrue( "Overridden no focus selection format color is incorrect",
- SelManager.unfocusedSelectionFormat.rangeColor == 0xf0ff0f );
-
- // inactive
- assertTrue( "Overridden non-default inactive selection format alpha is incorrect",
- SelManager.inactiveSelectionFormat.rangeAlpha == 0.44 );
- assertTrue( "Overridden non-default inactive selection format blend mode is incorrect",
- SelManager.inactiveSelectionFormat.rangeBlendMode == BlendMode.LIGHTEN );
- assertTrue( "Overridden non-default inactive selection format color is incorrect",
- SelManager.inactiveSelectionFormat.rangeColor == 0x0f00f0 );
- }
-
- // Tests overridding the SelectionFormat when the default SelectionFormat was overridden
- // Default SelectionFormat set in setUp based on XML flag
- public function overriddenColorTest():void
- {
- // Set to active
-
- SelManager.textFlow.interactionManager.focusedSelectionFormat = new SelectionFormat(0xfffff0, 1, BlendMode.ERASE, 0xfffff0, 1, BlendMode.ERASE, 0);
- SelManager.textFlow.interactionManager.unfocusedSelectionFormat = new SelectionFormat(0xff00ff, 0.5, BlendMode.NORMAL, 0xff00ff, 0.5, BlendMode.NORMAL, 0);
- SelManager.textFlow.interactionManager.inactiveSelectionFormat = new SelectionFormat(0xf000ff, 0.77, BlendMode.SHADER, 0xf000ff, 0.77, BlendMode.SHADER, 0);
-
- assertTrue( "Overridden non-default active focus selection format alpha is incorrect",
- SelManager.focusedSelectionFormat.rangeAlpha == 1 );
- assertTrue( "Overridden non-default active focus selection format blend mode is incorrect",
- SelManager.focusedSelectionFormat.rangeBlendMode == BlendMode.ERASE );
- assertTrue( "Overridden non-default active focus selection format color is incorrect",
- SelManager.focusedSelectionFormat.rangeColor == 0xfffff0 );
-
- // no focus
- assertTrue( "Overridden non-default no focus selection format alpha is incorrect",
- SelManager.unfocusedSelectionFormat.rangeAlpha == 0.5 );
- assertTrue( "Overridden non-default no focus selection format blend mode is incorrect",
- SelManager.unfocusedSelectionFormat.rangeBlendMode == BlendMode.NORMAL );
- assertTrue( "Overridden non-default no focus selection format color is incorrect",
- SelManager.unfocusedSelectionFormat.rangeColor == 0xff00ff );
-
- // inactive
- assertTrue( "Overridden non-default inactive selection format alpha is incorrect",
- SelManager.inactiveSelectionFormat.rangeAlpha == 0.77 );
- assertTrue( "Overridden non-default inactive selection format blend mode is incorrect",
- SelManager.inactiveSelectionFormat.rangeBlendMode == BlendMode.SHADER );
- assertTrue( "Overridden non-default inactive selection format color is incorrect",
- SelManager.inactiveSelectionFormat.rangeColor == 0xf000ff );
- }
-
- public function makeRangeShapes():void
- {
- //deselect everything
- this.SelManager.selectRange(0,0);
-
- var tFlow:TextFlow = this.SelManager.textFlow;
- var endIdx:int = 283;
- var startIdx:int = 84;
-
- var theRects:Array = GeometryUtil.getHighlightBounds(new TextRange(tFlow, 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(tFlow, 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);
-
-
- //draw the shape - this can serve as an example as to how to use this method for internal dev.
- /*globalStart = theLine.localToGlobal(globalStart);
- globalStart = parentObj.globalToLocal(globalStart);
- rect.x = globalStart.x;
- rect.y = globalStart.y;
-
- selObj.graphics.beginFill(0x27FEE0);
- selObj.alpha = .5
- var cmds:Vector.<int> = new Vector.<int>();
- var pathPoints:Vector.<Number> = new Vector.<Number>();
-
- //set the start point - topLeft
- cmds.push(GraphicsPathCommand.MOVE_TO);
- pathPoints.push(rect.x);
- pathPoints.push(rect.y);
-
- //line to topRight
- cmds.push(GraphicsPathCommand.LINE_TO);
- pathPoints.push(rect.x + rect.width);
- pathPoints.push(rect.y);
-
- //line to botRight
- cmds.push(GraphicsPathCommand.LINE_TO);
- pathPoints.push(rect.x + rect.width);
- pathPoints.push(rect.y + rect.height);
-
- //line to botLeft
- cmds.push(GraphicsPathCommand.LINE_TO);
- pathPoints.push(rect.x);
- pathPoints.push(rect.y + rect.height);
-
- //line to close the path - topLeft
- cmds.push(GraphicsPathCommand.LINE_TO);
- pathPoints.push(rect.x);
- pathPoints.push(rect.y);
-
- selObj.graphics.drawPath(cmds, pathPoints, flash.display.GraphicsPathWinding.NON_ZERO);
- parentObj.addChild(selObj);*/
-
- }
- }
-
- // Bitmap snapshots are used as validation for this test
- public function selectedTextRotationTest():void
- {
- if ( !TestData.rotationAmount )
- fail( "Test Error: Rotation amount not specified" );
-
- var newRotation:String;
-
- switch( TestData.rotationAmount )
- {
- case "auto":
- newRotation = TextRotation.AUTO;
- break;
- case "0":
- newRotation = TextRotation.ROTATE_0;
- break;
- case "90":
- newRotation = TextRotation.ROTATE_90;
- break;
- case "180":
- newRotation = TextRotation.ROTATE_180;
- break;
- case "270":
- newRotation = TextRotation.ROTATE_270;
- break;
- default:
- fail( "Test Error: Rotation amount not recognized: " + TestData.rotationAmount );
- }
-
- SelManager.selectAll();
- var rotationFormat:TextLayoutFormat = new TextLayoutFormat();
- rotationFormat.textRotation = newRotation;
- SelManager.applyLeafFormat( rotationFormat );
- }
-
- public function wordSelection():void
- {
- var textLine:String;
- var doubleClickIndexStart:int;
- var doubleClickIndexEnd:int;
- var selectStart:int;
- var selectEnd:int;
- var width:int = 20;
- var height:int = 20;
-
- // get data from XML file
- textLine = TestData.inputString;
- doubleClickIndexStart = TestData.doubleClickIndexStart;
- doubleClickIndexEnd = TestData.doubleClickIndexStart;
- if (TestData.doubleClickIndexEnd)
- doubleClickIndexEnd = TestData.doubleClickIndexEnd;
- selectStart = TestData.selectStart;
- selectEnd = TestData.selectEnd;
-
- SelManager.insertText(textLine);
- if ( TestData.id == "imageWordSelection")
- {
- SelManager.selectRange(5,5);
- SelManager.insertInlineGraphic(LoaderUtil.createAbsoluteURL(baseURL,"../../test/testFiles/assets/smiley.gif"),width,height);
- }else if ( TestData.id == "linkWordSelection")
- {
- SelManager.selectRange(0,4);
- SelManager.applyLink("http://www.google.com", "_self", false);
- var fl:FlowElement = SelManager.textFlow.findLeaf((doubleClickIndexStart + doubleClickIndexEnd) / 2) as FlowElement;
- var linkEl:LinkElement = fl.getParentByType(LinkElement) as LinkElement;
- }
-
- SelManager.selectRange(doubleClickIndexStart,doubleClickIndexEnd);
- var mEvent:MouseEvent = new MouseEvent( MouseEvent.DOUBLE_CLICK );
- TestFrame.container["dispatchEvent"](mEvent);
- assertTrue( "Selection should have been from " + selectStart + " to " + selectEnd +
-" but was actually from " + SelManager.absoluteStart + " to " + SelManager.absoluteEnd,
- SelManager.absoluteStart == selectStart &&
- SelManager.absoluteEnd == selectEnd );
-
- }
-
- /* this is for testing the bug 2365787. Selecting text with shift-down breaks on last empty line
- */
- public function SelectLineBreakOnLastEmptyLine():void
- {
- var longWordText:String = "longlonglonglonglonglong" + "\n";
- SelManager.insertText(longWordText);
-
- // get the rect where the first character of the second line is displayed
- SelManager.selectRange(0,0);
- var testLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(1).getTextLine();
- var characterBounds:Rectangle = testLine.getAtomBounds(0);
- characterBounds.offset (testLine.x, testLine.y);
- var testRect:Rectangle = new Rectangle;
- testRect.height = characterBounds.height;
- testRect.width = characterBounds.width;
- var containerMatrix:Matrix = new Matrix (1,0,0,1,-characterBounds.x, -characterBounds.y);
-
- //save bitmap of that rect
- var beforeBitmapData:BitmapData = new BitmapData(testRect.width,testRect.height);
- beforeBitmapData.draw(TestFrame.container as IBitmapDrawable, containerMatrix, null, null, testRect);
- var beforeBitmap:Bitmap = new Bitmap (beforeBitmapData);
- var beforePixels:ByteArray = beforeBitmap.bitmapData.getPixels(testRect);
-
- //select All Texts including the line breaker in second line
- SelManager.selectAll();
- TestFrame.flowComposer.updateAllControllers();
-
- //save bitmap select All
- var afterBitmapData:BitmapData = new BitmapData(testRect.width,testRect.height);
- afterBitmapData.draw(TestFrame.container as IBitmapDrawable,containerMatrix, null, null, testRect);
- var afterBitmap:Bitmap = new Bitmap(afterBitmapData);
-
- // This will do the bitmap compare of the two bitmaps.
- var bounds:Rectangle = new Rectangle(0, 0, afterBitmap.width,afterBitmap.height);
- var afterPixels:ByteArray = afterBitmap.bitmapData.getPixels(bounds)
+ {
+ [DataPoints(loader=selectedTextRotationTestLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var selectedTextRotationTestDp:Array;
+
+ public static var selectedTextRotationTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "selectedTextRotationTest");
+
+ [DataPoints(loader=wordSelectionLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var wordSelectionDp:Array;
+
+ public static var wordSelectionLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "wordSelection");
+
+ [DataPoints(loader=selectLineBreakOnLastEmptyLineLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var selectLineBreakOnLastEmptyLineDp:Array;
+
+ public static var selectLineBreakOnLastEmptyLineLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "selectLineBreakOnLastEmptyLine");
+
+ [DataPoints(loader=clickSelectionLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var clickSelectionDp:Array;
+
+ public static var clickSelectionLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "clickSelection");
+
+ [DataPoints(loader=clickSelectionOnColumnLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var clickSelectionOnColumnDp:Array;
+
+ public static var clickSelectionOnColumnLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "clickSelectionOnColumn");
+
+ [DataPoints(loader=clickSelectionTestLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var clickSelectionTestDp:Array;
+
+ public static var clickSelectionTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "clickSelectionTest");
+
+ [DataPoints(loader=clickContainerTestLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var clickContainerTestDp:Array;
+
+ public static var clickContainerTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "clickContainerTest");
+
+ [DataPoints(loader=clickInTCYLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var clickInTCYDp:Array;
+
+ public static var clickInTCYLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "clickInTCY");
+
+ [DataPoints(loader=flowElementDeepCopyDpLoader)]
+ [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+ public static var flowElementDeepCopyDp:Array;
+
+ public static var flowElementDeepCopyDpLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/SelectionTest.xml", "flowElementDeepCopyDp");
+
+ public function SelectionTest()
+ {
+ super("", "SelectionTest", TestConfig.getInstance());
+
+ metaData = {};
+ // Note: These must correspond to a Watson product area (case-sensitive)
+ metaData.productArea = "Editing";
+ metaData.productSubArea = "Selection";
+ }
+
+ [Before]
+ public override function setUpTest():void
+ {
+ super.setUpTest();
+ }
+
+ [After]
+ public override function tearDownTest():void
+ {
+ super.tearDownTest();
+ }
+
+ /**
+ * Tests the default SelectionFormat
+ */
+ [Test]
+ public function defaultColorTest():void
+ {
+ assertTrue("Default focus selection format alpha is unexpected",
+ SelManager.focusedSelectionFormat.rangeAlpha == 1);
+ assertTrue("Default focus selection format blend mode is unexpected",
+ SelManager.focusedSelectionFormat.rangeBlendMode == BlendMode.DIFFERENCE);
+ assertTrue("Default focus selection format color is unexpected",
+ SelManager.focusedSelectionFormat.rangeColor == 0xffffff);
+
+ assertTrue("Default no focus selection format alpha is unexpected",
+ SelManager.unfocusedSelectionFormat.rangeAlpha == 1);
+ assertTrue("Default no focus selection format blend mode is unexpected",
+ SelManager.unfocusedSelectionFormat.rangeBlendMode == BlendMode.DIFFERENCE);
+ assertTrue("Default no focus selection format color is unexpected",
+ SelManager.unfocusedSelectionFormat.rangeColor == 0xffffff);
+
+ // inactive
+ assertTrue("Overridden non-default inactive selection format alpha is incorrect",
+ SelManager.inactiveSelectionFormat.rangeAlpha == 1);
+ assertTrue("Overridden non-default inactive selection format blend mode is incorrect",
+ SelManager.inactiveSelectionFormat.rangeBlendMode == BlendMode.DIFFERENCE);
+ assertTrue("Overridden non-default inactive selection format color is incorrect",
+ SelManager.inactiveSelectionFormat.rangeColor == 0xffffff);
+ }
+
+ /**
+ * Tests overridding the default SelectionFormat in the Configuration.
+ * Default SelectionFormat set in setUp based on XML flag
+ */
+ [Test]
+ public function overrideDefaultColorTest():void
+ {
+ var config:Configuration = TextFlow.defaultConfiguration.clone();
+
+ config.focusedSelectionFormat = new SelectionFormat(0x00ff00, 0.5, BlendMode.DARKEN, 0x00ff00, 0.5, BlendMode.DARKEN, 0);
+ config.unfocusedSelectionFormat = new SelectionFormat(0x00ffff, 0, BlendMode.ALPHA, 0x00ffff, 0, BlendMode.ALPHA, 0);
+ config.inactiveSelectionFormat = new SelectionFormat(0xf0000f, 0.1, BlendMode.LAYER, 0xf0000f, 0.1, BlendMode.LAYER, 0);
+
+ var textFlow:TextFlow = new TextFlow(config);
+ textFlow.interactionManager = new SelectionManager();
+
+ assertTrue("Overridden default focus selection format alpha is incorrect",
+ textFlow.interactionManager.focusedSelectionFormat.rangeAlpha == 0.5);
+ assertTrue("Overridden default focus selection format blend mode is incorrect",
+ textFlow.interactionManager.focusedSelectionFormat.rangeBlendMode == BlendMode.DARKEN);
+ assertTrue("Overridden default focus selection format color is incorrect",
+ textFlow.interactionManager.focusedSelectionFormat.rangeColor == 0x00ff00);
+
+ // no focus
+ assertTrue("Overridden default no focus selection format alpha is incorrect",
+ textFlow.interactionManager.unfocusedSelectionFormat.rangeAlpha == 0);
+ assertTrue("Overridden default no focus selection format blend mode is incorrect",
+ textFlow.interactionManager.unfocusedSelectionFormat.rangeBlendMode == BlendMode.ALPHA);
+ assertTrue("Overridden default no focus selection format color is incorrect",
+ textFlow.interactionManager.unfocusedSelectionFormat.rangeColor == 0x00ffff);
+
+ // inactive
+ assertTrue("Overridden non-default inactive selection format alpha is incorrect",
+ textFlow.interactionManager.inactiveSelectionFormat.rangeAlpha == 0.1);
+ assertTrue("Overridden non-default inactive selection format blend mode is incorrect",
+ textFlow.interactionManager.inactiveSelectionFormat.rangeBlendMode == BlendMode.LAYER);
+ assertTrue("Overridden non-default inactive selection format color is incorrect",
+ textFlow.interactionManager.inactiveSelectionFormat.rangeColor == 0xf0000f);
+ }
+
+ /**
+ * Tests overridding the default SelectionFormat
+ */
+ [Test]
+ public function overrideColorTest():void
+ {
+ assertTrue(SelManager == SelManager.textFlow.interactionManager, "SelManager mismatch");
+
+ SelManager.textFlow.interactionManager.focusedSelectionFormat = new SelectionFormat(0xffff00, 0.25, BlendMode.HARDLIGHT, 0xffff00, 0.25, BlendMode.HARDLIGHT, 0);
+ SelManager.textFlow.interactionManager.unfocusedSelectionFormat = new SelectionFormat(0xf0ff0f, 0.75, BlendMode.INVERT, 0xf0ff0f, 0.75, BlendMode.INVERT, 0);
+ SelManager.textFlow.interactionManager.inactiveSelectionFormat = new SelectionFormat(0x0f00f0, 0.44, BlendMode.LIGHTEN, 0x0f00f0, 0.44, BlendMode.LIGHTEN, 0);
+
+ // Set to active
+
+ assertTrue("Overridden active focus selection format alpha is incorrect",
+ SelManager.focusedSelectionFormat.rangeAlpha == 0.25);
+ assertTrue("Overridden active focus selection format blend mode is incorrect",
+ SelManager.focusedSelectionFormat.rangeBlendMode == BlendMode.HARDLIGHT);
+ assertTrue("Overridden active focus selection format color is incorrect",
+ SelManager.focusedSelectionFormat.rangeColor == 0xffff00);
+
+ // No Focus
+ assertTrue("Overridden no focus selection format alpha is incorrect",
+ SelManager.unfocusedSelectionFormat.rangeAlpha == 0.75);
+ assertTrue("Overridden no focus selection format blend mode is incorrect",
+ SelManager.unfocusedSelectionFormat.rangeBlendMode == BlendMode.INVERT);
+ assertTrue("Overridden no focus selection format color is incorrect",
+ SelManager.unfocusedSelectionFormat.rangeColor == 0xf0ff0f);
+
+ // inactive
+ assertTrue("Overridden non-default inactive selection format alpha is incorrect",
+ SelManager.inactiveSelectionFormat.rangeAlpha == 0.44);
+ assertTrue("Overridden non-default inactive selection format blend mode is incorrect",
+ SelManager.inactiveSelectionFormat.rangeBlendMode == BlendMode.LIGHTEN);
+ assertTrue("Overridden non-default inactive selection format color is incorrect",
+ SelManager.inactiveSelectionFormat.rangeColor == 0x0f00f0);
+ }
+
+ /**
+ * Tests overridding the SelectionFormat when the default SelectionFormat was overridden
+ * Default SelectionFormat set in setUp based on XML flag
+ */
+ [Test]
+ public function overriddenColorTest():void
+ {
+ // Set to active
+
+ SelManager.textFlow.interactionManager.focusedSelectionFormat = new SelectionFormat(0xfffff0, 1, BlendMode.ERASE, 0xfffff0, 1, BlendMode.ERASE, 0);
+ SelManager.textFlow.interactionManager.unfocusedSelectionFormat = new SelectionFormat(0xff00ff, 0.5, BlendMode.NORMAL, 0xff00ff, 0.5, BlendMode.NORMAL, 0);
+ SelManager.textFlow.interactionManager.inactiveSelectionFormat = new SelectionFormat(0xf000ff, 0.77, BlendMode.SHADER, 0xf000ff, 0.77, BlendMode.SHADER, 0);
+
+ assertTrue("Overridden non-default active focus selection format alpha is incorrect",
+ SelManager.focusedSelectionFormat.rangeAlpha == 1);
+ assertTrue("Overridden non-default active focus selection format blend mode is incorrect",
+ SelManager.focusedSelectionFormat.rangeBlendMode == BlendMode.ERASE);
+ assertTrue("Overridden non-default active focus selection format color is incorrect",
+ SelManager.focusedSelectionFormat.rangeColor == 0xfffff0);
+
+ // no focus
+ assertTrue("Overridden non-default no focus selection format alpha is incorrect",
+ SelManager.unfocusedSelectionFormat.rangeAlpha == 0.5);
+ assertTrue("Overridden non-default no focus selection format blend mode is incorrect",
+ SelManager.unfocusedSelectionFormat.rangeBlendMode == BlendMode.NORMAL);
+ assertTrue("Overridden non-default no focus selection format color is incorrect",
+ SelManager.unfocusedSelectionFormat.rangeColor == 0xff00ff);
+
+ // inactive
+ assertTrue("Overridden non-default inactive selection format alpha is incorrect",
+ SelManager.inactiveSelectionFormat.rangeAlpha == 0.77);
+ assertTrue("Overridden non-default inactive selection format blend mode is incorrect",
+ SelManager.inactiveSelectionFormat.rangeBlendMode == BlendMode.SHADER);
+ assertTrue("Overridden non-default inactive selection format color is incorrect",
+ SelManager.inactiveSelectionFormat.rangeColor == 0xf000ff);
+ }
+
+ [Test]
+ public function makeRangeShapes():void
+ {
+ //deselect everything
+ this.SelManager.selectRange(0, 0);
+
+ var tFlow:TextFlow = this.SelManager.textFlow;
+ var endIdx:int = 283;
+ var startIdx:int = 84;
+
+ var theRects:Array = GeometryUtil.getHighlightBounds(new TextRange(tFlow, 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(tFlow, 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);
+
+
+ //draw the shape - this can serve as an example as to how to use this method for internal dev.
+ /*globalStart = theLine.localToGlobal(globalStart);
+ globalStart = parentObj.globalToLocal(globalStart);
+ rect.x = globalStart.x;
+ rect.y = globalStart.y;
+
+ selObj.graphics.beginFill(0x27FEE0);
+ selObj.alpha = .5
+ var cmds:Vector.<int> = new Vector.<int>();
+ var pathPoints:Vector.<Number> = new Vector.<Number>();
+
+ //set the start point - topLeft
+ cmds.push(GraphicsPathCommand.MOVE_TO);
+ pathPoints.push(rect.x);
+ pathPoints.push(rect.y);
+
+ //line to topRight
+ cmds.push(GraphicsPathCommand.LINE_TO);
+ pathPoints.push(rect.x + rect.width);
+ pathPoints.push(rect.y);
+
+ //line to botRight
+ cmds.push(GraphicsPathCommand.LINE_TO);
+ pathPoints.push(rect.x + rect.width);
+ pathPoints.push(rect.y + rect.height);
+
+ //line to botLeft
+ cmds.push(GraphicsPathCommand.LINE_TO);
+ pathPoints.push(rect.x);
+ pathPoints.push(rect.y + rect.height);
+
+ //line to close the path - topLeft
+ cmds.push(GraphicsPathCommand.LINE_TO);
+ pathPoints.push(rect.x);
+ pathPoints.push(rect.y);
+
+ selObj.graphics.drawPath(cmds, pathPoints, flash.display.GraphicsPathWinding.NON_ZERO);
+ parentObj.addChild(selObj);*/
+
+ }
+ }
+
+ /**
+ * Bitmap snapshots are used as validation for this test
+ */
+ [Test(dataProvider=selectedTextRotationTestDp)]
+ public function selectedTextRotationTest(testCaseVo:TestCaseVo):void
+ {
+ if (!testCaseVo.rotationAmount)
+ fail("Test Error: Rotation amount not specified");
+
+ var newRotation:String;
+
+ switch (testCaseVo.rotationAmount)
+ {
+ case "auto":
+ newRotation = TextRotation.AUTO;
+ break;
+ case "0":
+ newRotation = TextRotation.ROTATE_0;
+ break;
+ case "90":
+ newRotation = TextRotation.ROTATE_90;
+ break;
+ case "180":
+ newRotation = TextRotation.ROTATE_180;
+ break;
+ case "270":
+ newRotation = TextRotation.ROTATE_270;
+ break;
+ default:
+ fail("Test Error: Rotation amount not recognized: " + testCaseVo.rotationAmount);
+ }
+
+ SelManager.selectAll();
+ var rotationFormat:TextLayoutFormat = new TextLayoutFormat();
+ rotationFormat.textRotation = newRotation;
+ SelManager.applyLeafFormat(rotationFormat);
+ }
+
+ [Test(dataProvider=wordSelectionDp)]
+ [Ignore]
+ public function wordSelection(testCaseVo:TestCaseVo):void
+ {
+ var textLine:String;
+ var doubleClickIndexStart:int;
+ var doubleClickIndexEnd:int;
+ var selectStart:int;
+ var selectEnd:int;
+ var width:int = 20;
+ var height:int = 20;
+
+ // get data from XML file
+ textLine = testCaseVo.inputString;
+ doubleClickIndexStart = testCaseVo.doubleClickIndexStart;
+ doubleClickIndexEnd = testCaseVo.doubleClickIndexStart;
+ if (testCaseVo.doubleClickIndexEnd)
+ doubleClickIndexEnd = testCaseVo.doubleClickIndexEnd;
+ selectStart = testCaseVo.selectStart;
+ selectEnd = testCaseVo.selectEnd;
+
+ SelManager.insertText(textLine);
+ if (testCaseVo.id == "imageWordSelection")
+ {
+ SelManager.selectRange(5, 5);
+ SelManager.insertInlineGraphic(LoaderUtil.createAbsoluteURL(baseURL, "../../test/testFiles/assets/smiley.gif"), width, height);
+ } else if (testCaseVo.id == "linkWordSelection")
+ {
+ SelManager.selectRange(0, 4);
+ SelManager.applyLink("http://www.google.com", "_self", false);
+ var fl:FlowElement = SelManager.textFlow.findLeaf((doubleClickIndexStart + doubleClickIndexEnd) / 2) as FlowElement;
+ var linkEl:LinkElement = fl.getParentByType(LinkElement) as LinkElement;
+ }
+
+ SelManager.selectRange(doubleClickIndexStart, doubleClickIndexEnd);
+ var mEvent:MouseEvent = new MouseEvent(MouseEvent.DOUBLE_CLICK);
+ TestFrame.container["dispatchEvent"](mEvent);
+ assertTrue("Selection should have been from " + selectStart + " to " + selectEnd +
+ " but was actually from " + SelManager.absoluteStart + " to " + SelManager.absoluteEnd,
+ SelManager.absoluteStart == selectStart &&
+ SelManager.absoluteEnd == selectEnd);
+
+ }
+
+ /**
+ * this is for testing the bug 2365787. Selecting text with shift-down breaks on last empty line
+ */
+ [Test(dataProvider=selectLineBreakOnLastEmptyLineDp)]
+ public function selectLineBreakOnLastEmptyLine(testCaseVo:TestCaseVo):void
+ {
+ TestData.fileName = testCaseVo.fileName;
+ setUpTest();
+
+ var longWordText:String = "longlonglonglonglonglong" + "\n";
+ SelManager.insertText(longWordText);
+
+ // get the rect where the first character of the second line is displayed
+ SelManager.selectRange(0, 0);
+ var testLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(1).getTextLine();
+ var characterBounds:Rectangle = testLine.getAtomBounds(0);
+ characterBounds.offset(testLine.x, testLine.y);
+ var testRect:Rectangle = new Rectangle;
+ testRect.height = characterBounds.height;
+ testRect.width = characterBounds.width;
+ var containerMatrix:Matrix = new Matrix(1, 0, 0, 1, -characterBounds.x, -characterBounds.y);
+
+ //save bitmap of that rect
+ var beforeBitmapData:BitmapData = new BitmapData(testRect.width, testRect.height);
+ beforeBitmapData.draw(TestFrame.container as IBitmapDrawable, containerMatrix, null, null, testRect);
+ var beforeBitmap:Bitmap = new Bitmap(beforeBitmapData);
+ var beforePixels:ByteArray = beforeBitmap.bitmapData.getPixels(testRect);
+
+ //select All Texts including the line breaker in second line
+ SelManager.selectAll();
+ TestFrame.flowComposer.updateAllControllers();
+
+ //save bitmap select All
+ var afterBitmapData:BitmapData = new BitmapData(testRect.width, testRect.height);
+ afterBitmapData.draw(TestFrame.container as IBitmapDrawable, containerMatrix, null, null, testRect);
+ var afterBitmap:Bitmap = new Bitmap(afterBitmapData);
+
+ // This will do the bitmap compare of the two bitmaps.
+ var bounds:Rectangle = new Rectangle(0, 0, afterBitmap.width, afterBitmap.height);
+ var afterPixels:ByteArray = afterBitmap.bitmapData.getPixels(bounds);
var diffPixels:ByteArray = beforeBitmap.bitmapData.getPixels(bounds);
- afterPixels.position = 0;
- diffPixels.position = 0;
- var pixelCount:Number = diffPixels.bytesAvailable;
- var diffCount:Number = 0;
+ afterPixels.position = 0;
+ diffPixels.position = 0;
+ var pixelCount:Number = diffPixels.bytesAvailable;
+ var diffCount:Number = 0;
- while (diffPixels.bytesAvailable > 0)
- {
- var p1:int = diffPixels.readByte();
+ while (diffPixels.bytesAvailable > 0)
+ {
+ var p1:int = diffPixels.readByte();
var p2:int = afterPixels.readByte();
if (p1 != p2)
{
- diffCount ++;
+ diffCount++;
}
- }
-
- var diff:Number = diffCount/pixelCount*100;
- assertTrue("The selection didn't select the last line breaker, otherwise diff > diffTolerance" + " The diff is "+
- diff + " And the diffTolerance is " + diffTolerance, diff > diffTolerance);
-
- }
-
- private function dispatchEvent(event:Event):void
- {
- // assume containers support dispatchEvent. Otherwise we get an error
- TestFrame.container["dispatchEvent"](event);
- }
-
- //click to left of line, on left edge of line, on right edge of line, to right of line, between lines, after last line
- public function clickSelection():void
- {
- var textInput:String = TestData.inputString;
- var posOfSelection:int = TestData.posOfSelection;
- var format:TextLayoutFormat = new TextLayoutFormat();
- format = new TextLayoutFormat();
- format.paddingLeft = 30;
- format.paddingRight = 30;
- format.paddingTop = 40;
- format.paddingBottom = 40;
- format.lineHeight = 30;
- SelManager.insertText(textInput);
- textInput = "Second line in test";
- SelManager.insertText(textInput);
- SelManager.selectRange(14, 14);
- SelManager.splitParagraph();
- var tf:TextFlow = SelManager.textFlow;
- SelManager.applyFormatToElement(SelManager.textFlow,format);
- var firstLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(0).getTextLine();
- var secondLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(1).getTextLine();
- var lastLine:TextLine = secondLine;
- var offset:Number = 0;
-
- SelManager.selectRange(0,0);
- if (posOfSelection <= 14) //selection in first line
- {
- var bounds_1:Rectangle = firstLine.getAtomBounds(posOfSelection);
- }
- else
- {
- var tfl_2:TextFlowLine = SelManager.textFlow.flowComposer.findLineAtPosition(posOfSelection);
- var adjustedPosOfSelection:int = posOfSelection - tfl_2.absoluteStart;
- var bounds_2:Rectangle = lastLine.getAtomBounds(adjustedPosOfSelection);
- }
-
- var mouseX:Number;
- var mouseY:Number;
- if (posOfSelection <= 14)
- {
- mouseX = bounds_1.x + format.paddingLeft;
- mouseY = firstLine.y;
- }
- else
- {
- mouseX = bounds_2.x + format.paddingLeft;
- mouseY = lastLine.y;
- }
-
- if (TestData.id == "clickAboveFirstLine")
- {
- mouseY = firstLine.y - 1;
- } else if (TestData.id == "clickOnLeftOfLine")
- {
- mouseX = mouseX - 1;
- } else if (TestData.id == "clickOnRightOfLine")
- {
- mouseX = mouseX + 1; //make sure right of the line
- }
- else if (TestData.id == "clickBelowLastLine")
- {
- mouseY = lastLine.y + 1; // make sure click below last line
- }
- else if (TestData.id == "clickBetweenLinesFor2ndLine")
- {
- offset = (lastLine.y - firstLine.y) / 3;
- mouseY = firstLine.y + 2*offset; // this will go to second line
- }
- else if (TestData.id == "clickBetweenLinesFor1stLine")
- {
- offset = (lastLine.y - firstLine.y) / 3;
- mouseY = firstLine.y + offset; // this will go to first line
- }
-
- var mEvent:MouseEvent;
- mEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseX, mouseY, TestFrame.container);
- TestFrame.container.dispatchEvent(mEvent);
- SelManager.flushPendingOperations();
-
- var posAfterClick:int = SelManager.activePosition;
- assertTrue("Position changed after click." + " Position of selected is: " + posOfSelection
- + " Position of after Click: " + posAfterClick,
- posOfSelection == posAfterClick);
- }
-
- //click between columns (closer to left, close to right, before first column and after last column)
- public function clickSelectionOnColumn():void
- {
- var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
- ca.columnCount = 3;
- ca.columnGap = 10;
- ca.paddingTop = 40;
- ca.paddingLeft = 30;
- ca.paddingRight = 30;
- ca.paddingBottom = 40;
- ca.firstBaselineOffset = "auto";
- SelManager.applyContainerFormat(ca);
- SelManager.applyFormatToElement(SelManager.textFlow,ca);
-
- // position 34 in 2nd line of first column
- var x1:int = SelManager.textFlow.flowComposer.findLineAtPosition(34).x;
-
- // position 725 in 1st line of second column
- var x2:int = SelManager.textFlow.flowComposer.findLineAtPosition(725).x;
-
- // position 1493 in 3rd line of third column
- var x3:int = SelManager.textFlow.flowComposer.findLineAtPosition(1493).x;
-
- var mouseX:Number = 0;
- var mouseY:Number = 0;
- var posOfSelection:int = TestData.posOfSelection;
- var tfl:TextFlowLine = SelManager.textFlow.flowComposer.findLineAtPosition(posOfSelection);
- var adjustedPosOfSelection:int = posOfSelection - tfl.absoluteStart;
- var tl:TextLine = tfl.getTextLine();
- var bounds:Rectangle = tl.getAtomBounds(adjustedPosOfSelection);
-
- if (TestData.id == "clickCloseToLeftColumn")
- {
- // for this case, posOfselection = 75 which is the end of the 2nd line in 1st paragraph.
- // bounds.x+ x1 +1 to make sure click position is closer to left column
- mouseX = bounds.x + x1 + 1;
- mouseY = tl.y;
- }
- else if (TestData.id == "clickCloseToRightColumn")
- {
- // for this case, posOfselection = 725 which is the beginning of the first line in second
- // column. bounds.x + x2 - 1 to make sure click position is closer to right column
- mouseX = bounds.x + x2 - 1;
- mouseY = tl.y;
- }
- else if (TestData.id == "clickBeforeFirstColumn")
- {
- mouseX = bounds.x + x1 - 1; // bounds.x + x1 - 1 to make sure click position is before first column
- mouseY = tl.y;
- }
- else if (TestData.id == "clickAfterLastColumn")
- {
- mouseX = bounds.x + x3 + 1;
- mouseY = tl.y;
- }
-
- SelManager.selectRange(0,0);
- var mEvent:MouseEvent;
- mEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseX, mouseY, TestFrame.container);
- TestFrame.container.dispatchEvent(mEvent);
- SelManager.flushPendingOperations();
-
- var posAfterClick:int = SelManager.activePosition;
- assertTrue("Position changed after click." + " Position of selected is: " + posOfSelection
- + " Position of after Click: " + posAfterClick,
- posOfSelection == posAfterClick);
- }
-
- public function clickSelectionTest():void
- {
- var textInput:String = TestData.inputString;
- var posOfSelection:int = TestData.posOfSelection;
- SelManager.insertText(textInput);
- if (TestData.id == "clickAtEndOfLineWithSpaces" || TestData.id == "clickEndOfLineWithSpacesAtSpace")
- {
- textInput = " ";
- SelManager.insertText(textInput);
- }
- SelManager.selectRange(0, 0);
- var tl:TextLine = SelManager.textFlow.flowComposer.getLineAt(0).getTextLine();
- var bounds:Rectangle = tl.getAtomBounds(posOfSelection);
- var mouseX:Number = bounds.x;
- var mouseY:Number = tl.y;
- SelManager.selectRange(0,0);
- var mEvent:MouseEvent;
- mEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseX, mouseY, TestFrame.container);
- TestFrame.container.dispatchEvent(mEvent);
- SelManager.flushPendingOperations();
-
- var posAfterClick:int = SelManager.activePosition;
- assertTrue("Position changed after click." + " Position of selected is: " + posOfSelection
- + " Position of after Click: " + posAfterClick,
- posOfSelection == posAfterClick);
- }
-
- public function clickContainerTest():void
- {
- var textInput:String = "This is a Container test";
- var posOfSelection:int = TestData.posOfSelection;
- var format:TextLayoutFormat = new TextLayoutFormat();
- format = new TextLayoutFormat();
- format.paddingLeft = 30;
- format.paddingRight = 30;
- format.paddingTop = 40;
- format.paddingBottom = 40;
-
- SelManager.insertText(textInput);
-
- format.firstBaselineOffset = "auto";
- SelManager.applyContainerFormat(format);
- SelManager.applyFormatToElement(SelManager.textFlow,format);
-
- SelManager.selectRange(0, 0);
-
- var controller:ContainerController = SelManager.textFlow.flowComposer.getControllerAt(0);
- var containerXPos:Number = controller.container.x;
- var containerYPos:Number = controller.container.y;
- var containerWidth:Number = controller.container.width;
- var containerHeight:Number = controller.container.height;
-
- var mouseX:Number;
- var mouseY:Number;
- if (TestData.id == "clickLeftToContainer")
- {
- mouseX = containerXPos - 1;
- mouseY = containerYPos;
- } else if (TestData.id == "clickRightToContainer")
- {
- mouseX = containerXPos + containerWidth ;
- mouseY = containerYPos;
- }
- else if (TestData.id == "clickTopContainer")
- {
- mouseX = containerXPos;
- mouseY = containerYPos - 1;
- }
- else if (TestData.id == "clickBottomContainer")
- {
- mouseX = containerXPos + containerWidth;
- mouseY = containerYPos + containerHeight + 1;
- }
-
- var mEvent:MouseEvent;
- mEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseX, mouseY, TestFrame.container);
- TestFrame.container.dispatchEvent(mEvent);
- SelManager.flushPendingOperations();
-
- var posAfterClick:int = SelManager.activePosition;
-
- assertTrue("Position changed after click." + " Position of selected is: " + posOfSelection
- + " Position of after Click: " + posAfterClick,
- posOfSelection == posAfterClick);
- }
-
-
- public function clickInTCY():void
- {
- //clean the stage, get attributes from tcyTestBase.xml, and insert texts
- SelManager.selectAll();
- SelManager.deleteText();
- var TestText:String = "\nこれは縦中横テストです";
- SelManager.insertText(TestText);
-
- //appy TCY to "縦中横" in the texts
- var letterT:int = 4;
- var letterY:int = 7;
- SelManager.selectRange(letterT,letterY);
- SelManager.applyTCY(true);
-
- //deselct
- SelManager.selectRange(0,0);
-
- var line:TextLine = SelManager.textFlow.flowComposer.getLineAt(1).getTextLine();
- var flowLine:TextFlowLine = line.userData as TextFlowLine;
- var bounds:Rectangle = line.getAtomBounds(3); //set position after letter "は"
- var mousePoint:Point = new Point(flowLine.x, bounds.y);
- var x_point:Number;
- var y_point:Number;
-
- if (TestData.id == "clickInTCYBeginning")
- {
- //click point after letter "は"
- x_point = mousePoint.x;
- y_point = mousePoint.y;
- }
-
- else if (TestData.id == "clickInTCYMiddle")
- {
- //click point between letter "縦" and"中"
- x_point = mousePoint.x;
- y_point = mousePoint.y + 18;
- }
-
- else if (TestData.id == "clickInTCYMiddle2")
- {
- //click point between letter"中" and"横"
- x_point = mousePoint.x + 18;
- y_point = mousePoint.y + 18;
- }
-
- else if (TestData.id == "clickInTCYEnd")
- {
- //click point after letter "横"
- x_point = mousePoint.x + 36;
- y_point = mousePoint.y + 18;
- }
-
- var TCYpoint:MouseEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, x_point, y_point, TestFrame.container);
- TestFrame.container.dispatchEvent(TCYpoint);
-
- var activePoint:int = SelManager.activePosition;
- var clickPoint:int = TestData.clickPoint; //local point after click
- assertTrue("Position changed after click in TCY." + " Position clicked was " + activePoint + "."
- + " Position trying to click was " + "." + clickPoint, activePoint == clickPoint);
- }
-
- public function selectInEmptyFlow():void
- {
- // test selection in an empty, not yet normalized TextFlow
- var textFlow:TextFlow = new TextFlow();
- textFlow.interactionManager = new SelectionManager();
- textFlow.interactionManager.selectRange(0, 0);
- assertTrue("Selection at start of flow", textFlow.interactionManager.absoluteStart == 0 && textFlow.interactionManager.absoluteEnd == 0);
- }
-
- public function selectAll():void
- {
- SelManager.selectAll();
- assertTrue("Expected entire flow expect last CR to be selected", SelManager.absoluteStart == 0 && SelManager.absoluteEnd == SelManager.textFlow.textLength - 1);
- }
-
- public function clickEndOfLine():void
- {
- SelManager.selectAll();
- SelManager.deleteText();
- //create four text lines
- SelManager.insertText("AAAAAAAA\n");
- SelManager.insertText("AAAAAAAA\n");
- SelManager.insertText("AAAAAAAA\n");
- SelManager.insertText("AAAAAAAA");
- TestFrame.textFlow.flowComposer.updateAllControllers();
-
- var container:Sprite = TestFrame.textFlow.flowComposer.getControllerAt(0).container;
- var textLine:TextLine = container.getChildAt(0) as TextLine;
- var line:TextFlowLine = textLine.userData;
- var selectStart:int = line.absoluteStart + line.textLength - 1;
- var selectEnd:int = selectStart;
-
- // Simulate a click in the container
- var xLineEnd:int = textLine.x + textLine.textWidth + 5 /* fudge factor */;
- var yLineEnd:int = textLine.y - 2 /* fudge factor so it won't be below the midline */; // baseline
- container.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN, true, true, xLineEnd, yLineEnd, container));
- assertTrue( "Selection should have been from " + selectStart + " to " + selectEnd +
- " but was actually from " + SelManager.absoluteStart + " to " + SelManager.absoluteEnd,
- SelManager.absoluteStart == selectStart &&
- SelManager.absoluteEnd == selectEnd );
-
- // try again using the TextLine as relatedObject
- xLineEnd = textLine.textWidth + 5 /* fudge factor */;
- yLineEnd = -2 /* fudge factor so it won't be below the midline */; // baseline
- textLine.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN, true, true, xLineEnd, yLineEnd, textLine));
- assertTrue( "Selection should have been from " + selectStart + " to " + selectEnd +
- " but was actually from " + SelManager.absoluteStart + " to " + SelManager.absoluteEnd,
- SelManager.absoluteStart == selectStart &&
- SelManager.absoluteEnd == selectEnd );
-
- }
-
- public function FlowElement_deepCopy():void
- {
- var container:Sprite = new Sprite();
- var p:ParagraphElement = new ParagraphElement();
- var span1:SpanElement = new SpanElement();
- var span2:SpanElement = new SpanElement();
- // add text to the spans and spans to the paragraph
- span1.text = "Hello, ";
- span2.text = "World!";
- p.fontSize = 48;
- p.addChild(span1);
- p.addChild(span2);
- // make a deep copy of paragraph p, starting at relative offset 3; copy to end
- var p2:ParagraphElement = p.deepCopy(3, -1) as ParagraphElement;
- // add copied paragraph (p2) to textflow; add composer and controller
- SelManager.textFlow.addChild(p); // original 'Hello, World!"
- SelManager.textFlow.addChild(p2); // 'lo, World!'
-
- //make sure the second paragraph textlength is 3 less than the original lenth
- assertTrue ("deepCopy doesn't copy the correct texts.", (p.textLength - 3 ) == p2.textLength);
-
- // make a deep copy by default parameters
- var p3:ParagraphElement = p.deepCopy() as ParagraphElement;
- SelManager.textFlow.addChild(p3); // 'Hello, World!'
- //make sure the third paragraph textlength is same as the original lenth
- assertTrue ("deepCopy doesn't copy the correct texts.", p.textLength == p3.textLength);
-
- // make a copy starting from index 0
- var p4:ParagraphElement = p.deepCopy(0, -1) as ParagraphElement;
- SelManager.textFlow.addChild(p4); // 'Hello, World!'
- //make sure the fourth paragraph textlength is same as the original lenth
-
- assertTrue ("deepCopy doesn't copy the correct texts.", p.textLength == p4.textLength);
- var controller:ContainerController = new ContainerController(container, 200, 300 );
- SelManager.textFlow.flowComposer.addController(controller);
- SelManager.textFlow.flowComposer.updateAllControllers();
- }
-
- private function initializeFlow(textFlow:TextFlow):TextFlow
- {
- VellumTestCase.testApp.contentChange (textFlow);
- TestDisplayObject = VellumTestCase.testApp.getDisplayObject();
- TestFrame = textFlow.flowComposer.getControllerAt(0);
- if (TestFrame.rootElement)
- {
- SelManager = EditManager(textFlow.interactionManager);
- if(SelManager)
- {
- //make sure there is never any blinking when running these tests
- setCaretBlinkRate (0);
- }
- }
- return textFlow;
- }
-
- private function selectionHelper(markup:String, startPos:int, endPos:int):void
- {
- var textFlow:TextFlow = initializeFlow(TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT));
- textFlow.flowComposer.updateAllControllers();
- SelManager.selectRange(startPos, startPos);
- textFlow.flowComposer.updateAllControllers();
- if (startPos != endPos)
- {
- SelManager.selectRange(startPos, endPos);
- textFlow.flowComposer.updateAllControllers();
- }
- }
-
- public function selectRangeTest():void
- {
- // 2792266 - select in ltr paragraph all whose chars are rtl
- selectionHelper('<TextFlow fontFamily="Times New Roman" fontSize="24" whiteSpaceCollapse="preserve" version="2.0.0" xmlns="http://ns.adobe.com/textLayout/2008">' +
- '<p direction="ltr" locale="he"><span> ארבע חמש שש שבע שמונה תשע</span></p>' +
- '<p direction="rtl" locale="ar"><span>0123456789 سلام ᅠصفر واحد إثنان ثلاثة أربعة خمسة ستة سبعة ثمانية</span></p></TextFlow>', 24, 34);
-
- // 2545628 - select 'fl' ligature char
- selectionHelper("<TextFlow xmlns='http://ns.adobe.com/textLayout/2008' fontSize='36' fontWeight='bold' typographicCase='uppercase' color='#ff0000'>fifl</TextFlow>",
- 2, 2);
- }
-
- // Selection Tests -ltr/rtl/rl
- /* 1 - 11, 14, 15, 20, 12(partial) Done
- // 16 - 18 Done
-
- // Selection Tests -ltr/rtl/rl
- /* 1 - 7 Done
- 1. Click to left of line (ltr/rtl)
- 2. Click on left edge of line {ltr/rtl)
- 3. Click on right edge of line (rtl/ltr)
- 4. Click to the right of line (ltr/rtl)
- 5. Click above first line (in padding)
- 6. Click between lines (in leading)
- 7. Click after last line (in padding)
- 8. Click between columns (closer to left)
- 9. Click between columns (closer to right)
- 10. Click before first column (in padding)
- 11. Click after last column (in padding)
- 12. Click on stage near container (left/top/right/bottom)
- -> linked containers with different width/height
- 13. Emulate drag select from one container to the next
- 14 Click between Arabic & English (leading edge/trailing edge)
- 15. Click between English & Arabic (leading edge/trailing edge)
- 16. Click in TCY at start
- 17. Click in TCY at end
- 18. Click in TCY in middle
-
- Validate selection highlight in all cases
- Test with extend selection
- */
- }
+ }
+
+ var diff:Number = diffCount / pixelCount * 100;
+ assertTrue("The selection didn't select the last line breaker, otherwise diff > diffTolerance" + " The diff is " +
+ diff + " And the diffTolerance is " + diffTolerance, diff > diffTolerance);
+
+ }
+
+ private function dispatchEvent(event:Event):void
+ {
+ // assume containers support dispatchEvent. Otherwise we get an error
+ TestFrame.container["dispatchEvent"](event);
+ }
+
+ /**
+ * click to left of line, on left edge of line, on right edge of line, to right of line, between lines, after last line
+ */
+ [Test(dataProvider=clickSelectionDp)]
+ public function clickSelection(testCaseVo:TestCaseVo):void
+ {
+ TestData.fileName = testCaseVo.fileName;
+ setUpTest();
+
+ var textInput:String = testCaseVo.inputString;
+ var posOfSelection:int = testCaseVo.posOfSelection;
+ var format:TextLayoutFormat = new TextLayoutFormat();
+ format.paddingLeft = 30;
+ format.paddingRight = 30;
+ format.paddingTop = 40;
+ format.paddingBottom = 40;
+ format.lineHeight = 30;
+ SelManager.insertText(textInput);
+ textInput = "Second line in test";
+ SelManager.insertText(textInput);
+ SelManager.selectRange(14, 14);
+ SelManager.splitParagraph();
+ SelManager.applyFormatToElement(SelManager.textFlow, format);
+ var firstLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(0).getTextLine();
+ var lastLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(1).getTextLine();;
+ var offset:Number = 0;
+
+ SelManager.selectRange(0, 0);
+ if (posOfSelection <= 14) //selection in first line
+ {
+ var bounds_1:Rectangle = firstLine.getAtomBounds(posOfSelection);
+ }
+ else
+ {
+ var tfl_2:TextFlowLine = SelManager.textFlow.flowComposer.findLineAtPosition(posOfSelection);
+ var adjustedPosOfSelection:int = posOfSelection - tfl_2.absoluteStart;
+ var bounds_2:Rectangle = lastLine.getAtomBounds(adjustedPosOfSelection);
+ }
+
+ var mouseX:Number;
+ var mouseY:Number;
+ if (posOfSelection <= 14)
+ {
+ mouseX = bounds_1.x + format.paddingLeft;
+ mouseY = firstLine.y;
+ }
+ else
+ {
+ mouseX = bounds_2.x + format.paddingLeft;
+ mouseY = lastLine.y;
+ }
+
+ if (testCaseVo.id == "clickAboveFirstLine")
+ {
+ mouseY = firstLine.y - 1;
+ } else if (testCaseVo.id == "clickOnLeftOfLine")
+ {
+ mouseX = mouseX - 1;
+ } else if (testCaseVo.id == "clickOnRightOfLine")
+ {
+ mouseX = mouseX + 1; //make sure right of the line
+ }
+ else if (testCaseVo.id == "clickBelowLastLine")
+ {
+ mouseY = lastLine.y + 1; // make sure click below last line
+ }
+ else if (testCaseVo.id == "clickBetweenLinesFor2ndLine")
+ {
+ offset = (lastLine.y - firstLine.y) / 3;
+ mouseY = firstLine.y + 2 * offset; // this will go to second line
+ }
+ else if (testCaseVo.id == "clickBetweenLinesFor1stLine")
+ {
+ offset = (lastLine.y - firstLine.y) / 3;
+ mouseY = firstLine.y + offset; // this will go to first line
+ }
+
+ var mEvent:MouseEvent;
+ mEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseX, mouseY, TestFrame.container);
+ TestFrame.container.dispatchEvent(mEvent);
+ SelManager.flushPendingOperations();
+
+ var posAfterClick:int = SelManager.activePosition;
+ assertTrue("Position changed after click." + " Position of selected is: " + posOfSelection
+ + " Position of after Click: " + posAfterClick,
+ posOfSelection == posAfterClick);
+ }
+
+ /**
+ * click between columns (closer to left, close to right, before first column and after last column)
+ */
+ [Test(dataProvider=clickSelectionOnColumnDp)]
+ public function clickSelectionOnColumn(testCaseVo:TestCaseVo):void
+ {
+ var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
+ ca.columnCount = 3;
+ ca.columnGap = 10;
+ ca.paddingTop = 40;
+ ca.paddingLeft = 30;
+ ca.paddingRight = 30;
+ ca.paddingBottom = 40;
+ ca.firstBaselineOffset = "auto";
+ SelManager.applyContainerFormat(ca);
+ SelManager.applyFormatToElement(SelManager.textFlow, ca);
+
+ // position 34 in 2nd line of first column
+ var x1:int = SelManager.textFlow.flowComposer.findLineAtPosition(34).x;
+
+ // position 725 in 1st line of second column
+ var x2:int = SelManager.textFlow.flowComposer.findLineAtPosition(725).x;
+
+ // position 1493 in 3rd line of third column
+ var x3:int = SelManager.textFlow.flowComposer.findLineAtPosition(1493).x;
+
+ var mouseX:Number = 0;
+ var mouseY:Number = 0;
+ var posOfSelection:int = testCaseVo.posOfSelection;
+ var tfl:TextFlowLine = SelManager.textFlow.flowComposer.findLineAtPosition(posOfSelection);
+ var adjustedPosOfSelection:int = posOfSelection - tfl.absoluteStart;
+ var tl:TextLine = tfl.getTextLine();
+ var bounds:Rectangle = tl.getAtomBounds(adjustedPosOfSelection);
+
+ if (testCaseVo.id == "clickCloseToLeftColumn")
+ {
+ // for this case, posOfselection = 75 which is the end of the 2nd line in 1st paragraph.
+ // bounds.x+ x1 +1 to make sure click position is closer to left column
+ mouseX = bounds.x + x1 + 1;
+ mouseY = tl.y;
+ }
+ else if (testCaseVo.id == "clickCloseToRightColumn")
+ {
+ // for this case, posOfselection = 725 which is the beginning of the first line in second
+ // column. bounds.x + x2 - 1 to make sure click position is closer to right column
+ mouseX = bounds.x + x2 - 1;
+ mouseY = tl.y;
+ }
+ else if (testCaseVo.id == "clickBeforeFirstColumn")
+ {
+ mouseX = bounds.x + x1 - 1; // bounds.x + x1 - 1 to make sure click position is before first column
+ mouseY = tl.y;
+ }
+ else if (testCaseVo.id == "clickAfterLastColumn")
+ {
+ mouseX = bounds.x + x3 + 1;
+ mouseY = tl.y;
+ }
+
+ SelManager.selectRange(0, 0);
+ var mEvent:MouseEvent;
+ mEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseX, mouseY, TestFrame.container);
+ TestFrame.container.dispatchEvent(mEvent);
+ SelManager.flushPendingOperations();
+
+ var posAfterClick:int = SelManager.activePosition;
+ assertTrue("Position changed after click." + " Position of selected is: " + posOfSelection
+ + " Position of after Click: " + posAfterClick,
+ posOfSelection == posAfterClick);
+ }
+
+ [Test(dataProvider=clickSelectionTestDp)]
+ public function clickSelectionTest(testCaseVo:TestCaseVo):void
+ {
+ TestData.fileName = testCaseVo.fileName;
+ setUpTest();
+
+ var textInput:String = testCaseVo.inputString;
+ var posOfSelection:int = testCaseVo.posOfSelection;
+ SelManager.insertText(textInput);
+ if (testCaseVo.id == "clickAtEndOfLineWithSpaces" || testCaseVo.id == "clickEndOfLineWithSpacesAtSpace")
+ {
+ textInput = " ";
+ SelManager.insertText(textInput);
+ }
+ SelManager.selectRange(0, 0);
+ var tl:TextLine = SelManager.textFlow.flowComposer.getLineAt(0).getTextLine();
+ var bounds:Rectangle = tl.getAtomBounds(posOfSelection);
+ var mouseX:Number = bounds.x;
+ var mouseY:Number = tl.y;
+ SelManager.selectRange(0, 0);
+ var mEvent:MouseEvent;
+ mEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseX, mouseY, TestFrame.container);
+ TestFrame.container.dispatchEvent(mEvent);
+ SelManager.flushPendingOperations();
+
+ var posAfterClick:int = SelManager.activePosition;
+ assertTrue("Position changed after click." + " Position of selected is: " + posOfSelection
+ + " Position of after Click: " + posAfterClick,
+ posOfSelection == posAfterClick);
+ }
+
+ [Test(dataProvider=clickContainerTestDp)]
+ public function clickContainerTest(testCaseVo:TestCaseVo):void
+ {
+ TestData.fileName = testCaseVo.fileName;
+ setUpTest();
+
+ var textInput:String = "This is a Container test";
+ var posOfSelection:int = testCaseVo.posOfSelection;
+ var format:TextLayoutFormat = new TextLayoutFormat();
+ format.paddingLeft = 30;
+ format.paddingRight = 30;
+ format.paddingTop = 40;
+ format.paddingBottom = 40;
+
+ SelManager.insertText(textInput);
+
+ format.firstBaselineOffset = "auto";
+ SelManager.applyContainerFormat(format);
+ SelManager.applyFormatToElement(SelManager.textFlow, format);
+
+ SelManager.selectRange(0, 0);
+
+ var controller:ContainerController = SelManager.textFlow.flowComposer.getControllerAt(0);
+ var containerXPos:Number = controller.container.x;
+ var containerYPos:Number = controller.container.y;
+ var containerWidth:Number = controller.container.width;
+ var containerHeight:Number = controller.container.height;
+
+ var mouseX:Number;
+ var mouseY:Number;
+ if (testCaseVo.id == "clickLeftToContainer")
+ {
+ mouseX = containerXPos - 1;
+ mouseY = containerYPos;
+ } else if (testCaseVo.id == "clickRightToContainer")
+ {
+ mouseX = containerXPos + containerWidth;
+ mouseY = containerYPos;
+ }
+ else if (testCaseVo.id == "clickTopContainer")
+ {
+ mouseX = containerXPos;
+ mouseY = containerYPos - 1;
+ }
+ else if (testCaseVo.id == "clickBottomContainer")
+ {
+ mouseX = containerXPos + containerWidth;
+ mouseY = containerYPos + containerHeight + 1;
+ }
+
+ var mEvent:MouseEvent;
+ mEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, mouseX, mouseY, TestFrame.container);
+ TestFrame.container.dispatchEvent(mEvent);
+ SelManager.flushPendingOperations();
+
+ var posAfterClick:int = SelManager.activePosition;
+
+ assertTrue("Position changed after click." + " Position of selected is: " + posOfSelection
+ + " Position of after Click: " + posAfterClick,
+ posOfSelection == posAfterClick);
+ }
+
+ [Test(dataProvider=clickInTCYDp)]
+ public function clickInTCY(testCaseVo:TestCaseVo):void
+ {
+ TestData.fileName = testCaseVo.fileName;
+ setUpTest();
+
+ //clean the stage, get attributes from tcyTestBase.xml, and insert texts
+ SelManager.selectAll();
+ SelManager.deleteText();
+ var TestText:String = "\nこれは縦中横テストです";
+ SelManager.insertText(TestText);
+
+ //appy TCY to "縦中横" in the texts
+ var letterT:int = 4;
+ var letterY:int = 7;
+ SelManager.selectRange(letterT, letterY);
+ SelManager.applyTCY(true);
+
+ //deselct
+ SelManager.selectRange(0, 0);
+
+ var line:TextLine = SelManager.textFlow.flowComposer.getLineAt(1).getTextLine();
+ var flowLine:TextFlowLine = line.userData as TextFlowLine;
+ var bounds:Rectangle = line.getAtomBounds(3); //set position after letter "は"
+ var mousePoint:Point = new Point(flowLine.x, bounds.y);
+ var x_point:Number;
+ var y_point:Number;
+
+ if (testCaseVo.id == "clickInTCYBeginning")
+ {
+ //click point after letter "は"
+ x_point = mousePoint.x;
+ y_point = mousePoint.y;
+ }
+
+ else if (testCaseVo.id == "clickInTCYMiddle")
+ {
+ //click point between letter "縦" and"中"
+ x_point = mousePoint.x;
+ y_point = mousePoint.y + 18;
+ }
+
+ else if (testCaseVo.id == "clickInTCYMiddle2")
+ {
+ //click point between letter"中" and"横"
+ x_point = mousePoint.x + 18;
+ y_point = mousePoint.y + 18;
+ }
+
+ else if (testCaseVo.id == "clickInTCYEnd")
+ {
+ //click point after letter "横"
+ x_point = mousePoint.x + 36;
+ y_point = mousePoint.y + 18;
+ }
+
+ var TCYpoint:MouseEvent = new MouseEvent(MouseEvent.MOUSE_DOWN, true, false, x_point, y_point, TestFrame.container);
+ TestFrame.container.dispatchEvent(TCYpoint);
+
+ var activePoint:int = SelManager.activePosition;
+ var clickPoint:int = testCaseVo.clickPoint; //local point after click
+ assertTrue("Position changed after click in TCY." + " Position clicked was " + activePoint + "."
+ + " Position trying to click was " + "." + clickPoint, activePoint == clickPoint);
+ }
+
+ [Test]
+ public function selectInEmptyFlow():void
+ {
+ // test selection in an empty, not yet normalized TextFlow
+ var textFlow:TextFlow = new TextFlow();
+ textFlow.interactionManager = new SelectionManager();
+ textFlow.interactionManager.selectRange(0, 0);
+ assertTrue("Selection at start of flow", textFlow.interactionManager.absoluteStart == 0 && textFlow.interactionManager.absoluteEnd == 0);
+ }
+
+ [Test]
+ public function selectAll():void
+ {
+ SelManager.selectAll();
+ assertTrue("Expected entire flow expect last CR to be selected", SelManager.absoluteStart == 0 && SelManager.absoluteEnd == SelManager.textFlow.textLength - 1);
+ }
+
+ [Test]
+ public function clickEndOfLine():void
+ {
+ SelManager.selectAll();
+ SelManager.deleteText();
+ //create four text lines
+ SelManager.insertText("AAAAAAAA\n");
+ SelManager.insertText("AAAAAAAA\n");
+ SelManager.insertText("AAAAAAAA\n");
+ SelManager.insertText("AAAAAAAA");
+ TestFrame.textFlow.flowComposer.updateAllControllers();
+
+ var container:Sprite = TestFrame.textFlow.flowComposer.getControllerAt(0).container;
+ var textLine:TextLine = container.getChildAt(0) as TextLine;
+ var line:TextFlowLine = textLine.userData;
+ var selectStart:int = line.absoluteStart + line.textLength - 1;
+ var selectEnd:int = selectStart;
+
+ // Simulate a click in the container
+ var xLineEnd:int = textLine.x + textLine.textWidth + 5 /* fudge factor */;
+ var yLineEnd:int = textLine.y - 2 /* fudge factor so it won't be below the midline */; // baseline
+ container.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN, true, true, xLineEnd, yLineEnd, container));
+ assertTrue("Selection should have been from " + selectStart + " to " + selectEnd +
+ " but was actually from " + SelManager.absoluteStart + " to " + SelManager.absoluteEnd,
+ SelManager.absoluteStart == selectStart &&
+ SelManager.absoluteEnd == selectEnd);
+
+ // try again using the TextLine as relatedObject
+ xLineEnd = textLine.textWidth + 5 /* fudge factor */;
+ yLineEnd = -2 /* fudge factor so it won't be below the midline */; // baseline
+ textLine.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_DOWN, true, true, xLineEnd, yLineEnd, textLine));
+ assertTrue("Selection should have been from " + selectStart + " to " + selectEnd +
+ " but was actually from " + SelManager.absoluteStart + " to " + SelManager.absoluteEnd,
+ SelManager.absoluteStart == selectStart &&
+ SelManager.absoluteEnd == selectEnd);
+
+ }
+
+ [Test(dataProvider=flowElementDeepCopyDp)]
+ public function flowElementDeepCopy(testCaseVo:TestCaseVo):void
+ {
+ TestData.fileName = testCaseVo.fileName;
+ setUpTest();
+
+ var container:Sprite = new Sprite();
+ var p:ParagraphElement = new ParagraphElement();
+ var span1:SpanElement = new SpanElement();
+ var span2:SpanElement = new SpanElement();
+ // add text to the spans and spans to the paragraph
+ span1.text = "Hello, ";
+ span2.text = "World!";
+ p.fontSize = 48;
+ p.addChild(span1);
+ p.addChild(span2);
+ // make a deep copy of paragraph p, starting at relative offset 3; copy to end
+ var p2:ParagraphElement = p.deepCopy(3, -1) as ParagraphElement;
+ // add copied paragraph (p2) to textflow; add composer and controller
+ SelManager.textFlow.addChild(p); // original 'Hello, World!"
+ SelManager.textFlow.addChild(p2); // 'lo, World!'
+
+ //make sure the second paragraph textlength is 3 less than the original lenth
+ assertTrue("deepCopy doesn't copy the correct texts.", (p.textLength - 3 ) == p2.textLength);
+
+ // make a deep copy by default parameters
+ var p3:ParagraphElement = p.deepCopy() as ParagraphElement;
+ SelManager.textFlow.addChild(p3); // 'Hello, World!'
+ //make sure the third paragraph textlength is same as the original lenth
+ assertTrue("deepCopy doesn't copy the correct texts.", p.textLength == p3.textLength);
+
+ // make a copy starting from index 0
+ var p4:ParagraphElement = p.deepCopy(0, -1) as ParagraphElement;
+ SelManager.textFlow.addChild(p4); // 'Hello, World!'
+ //make sure the fourth paragraph textlength is same as the original lenth
+
+ assertTrue("deepCopy doesn't copy the correct texts.", p.textLength == p4.textLength);
+ var controller:ContainerController = new ContainerController(container, 200, 300);
+ SelManager.textFlow.flowComposer.addController(controller);
+ SelManager.textFlow.flowComposer.updateAllControllers();
+ }
+
+ private function initializeFlow(textFlow:TextFlow):TextFlow
+ {
+ VellumTestCase.testApp.contentChange(textFlow);
+ TestDisplayObject = VellumTestCase.testApp.getDisplayObject();
+ TestFrame = textFlow.flowComposer.getControllerAt(0);
+ if (TestFrame.rootElement)
+ {
+ SelManager = EditManager(textFlow.interactionManager);
+ if (SelManager)
+ {
+ //make sure there is never any blinking when running these tests
+ setCaretBlinkRate(0);
+ }
+ }
+ return textFlow;
+ }
+
+ private function selectionHelper(markup:String, startPos:int, endPos:int):void
+ {
+ var textFlow:TextFlow = initializeFlow(TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT));
+ textFlow.flowComposer.updateAllControllers();
+ SelManager.selectRange(startPos, startPos);
+ textFlow.flowComposer.updateAllControllers();
+ if (startPos != endPos)
+ {
+ SelManager.selectRange(startPos, endPos);
+ textFlow.flowComposer.updateAllControllers();
+ }
+ }
+
+ [Test(dataProvider=flowElementDeepCopyDp)]
+ public function selectRangeTest(testCaseVo:TestCaseVo):void
+ {
+ TestData.fileName = testCaseVo.fileName;
+ setUpTest();
+ // 2792266 - select in ltr paragraph all whose chars are rtl
+ selectionHelper('<TextFlow fontFamily="Times New Roman" fontSize="24" whiteSpaceCollapse="preserve" version="2.0.0" xmlns="http://ns.adobe.com/textLayout/2008">' +
+ '<p direction="ltr" locale="he"><span> ארבע חמש שש שבע שמונה תשע</span></p>' +
+ '<p direction="rtl" locale="ar"><span>0123456789 سلام ᅠصفر واحد إثنان ثلاثة أربعة خمسة ستة سبعة ثمانية</span></p></TextFlow>', 24, 34);
+
+ // 2545628 - select 'fl' ligature char
+ selectionHelper("<TextFlow xmlns='http://ns.adobe.com/textLayout/2008' fontSize='36' fontWeight='bold' typographicCase='uppercase' color='#ff0000'>fifl</TextFlow>",
+ 2, 2);
+ }
+
+ // Selection Tests -ltr/rtl/rl
+ /* 1 - 11, 14, 15, 20, 12(partial) Done
+ // 16 - 18 Done
+
+ // Selection Tests -ltr/rtl/rl
+ /* 1 - 7 Done
+ 1. Click to left of line (ltr/rtl)
+ 2. Click on left edge of line {ltr/rtl)
+ 3. Click on right edge of line (rtl/ltr)
+ 4. Click to the right of line (ltr/rtl)
+ 5. Click above first line (in padding)
+ 6. Click between lines (in leading)
+ 7. Click after last line (in padding)
+ 8. Click between columns (closer to left)
+ 9. Click between columns (closer to right)
+ 10. Click before first column (in padding)
+ 11. Click after last column (in padding)
+ 12. Click on stage near container (left/top/right/bottom)
+ -> linked containers with different width/height
+ 13. Emulate drag select from one container to the next
+ 14 Click between Arabic & English (leading edge/trailing edge)
+ 15. Click between English & Arabic (leading edge/trailing edge)
+ 16. Click in TCY at start
+ 17. Click in TCY at end
+ 18. Click in TCY in middle
+
+ Validate selection highlight in all cases
+ Test with extend selection
+ */
+ }
}
http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/372126a9/test/testCases/SelectionTest.xml
----------------------------------------------------------------------
diff --git a/test/testCases/SelectionTest.xml b/test/testCases/SelectionTest.xml
index 55d9b65..84ed595 100644
--- a/test/testCases/SelectionTest.xml
+++ b/test/testCases/SelectionTest.xml
@@ -232,7 +232,7 @@
<TestData name="inputString">This is a test</TestData>
<TestData name="posOfSelection">7</TestData>
</TestCase>
-<TestCase functionName="SelectLineBreakOnLastEmptyLine">
+<TestCase functionName="selectLineBreakOnLastEmptyLine">
<TestData name="fileName">empty.xml</TestData>
</TestCase>
<TestCase functionName="clickSelectionOnColumn">