http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/AutomationTestClasses.as ---------------------------------------------------------------------- diff --git a/automation_tests/src/AutomationTestClasses.as b/automation_tests/src/AutomationTestClasses.as index fb12340..db74742 100644 --- a/automation_tests/src/AutomationTestClasses.as +++ b/automation_tests/src/AutomationTestClasses.as @@ -20,7 +20,7 @@ package { internal class AutomationTestClasses { - import perfAppTests.FTEGridTestCanvas; FTEGridTestCanvas; + /*import perfAppTests.FTEGridTestCanvas; FTEGridTestCanvas; import perfAppTests.InputManagerTestSprite; InputManagerTestSprite; import perfAppTests.TextFlowTestSprite; TextFlowTestSprite; @@ -32,9 +32,11 @@ package import UnitTest.PerformanceTests.VellumAliceTests; VellumAliceTests; import UnitTest.PerformanceTests.VellumParaTests; VellumParaTests; import UnitTest.PerformanceTests.VellumWordTests; VellumWordTests; - - import UnitTest.Tests.AccessibilityMethodsTest; AccessibilityMethodsTest; - import UnitTest.Tests.AllAttributeTest; AllAttributeTest; + */ + import AllTestsSuite; AllTestsSuite; + import MinimalTestsSuite; MinimalTestsSuite; + import UnitTest.Tests.AccessibilityMethodsTest; AccessibilityMethodsTest; + /*import UnitTest.Tests.AllAttributeTest; AllAttributeTest; import UnitTest.Tests.AllCharAttributeTest; AllCharAttributeTest; import UnitTest.Tests.AllContAttributeTest; AllContAttributeTest; import UnitTest.Tests.AllParaAttributeTest; AllParaAttributeTest; @@ -84,7 +86,7 @@ package import UnitTest.Tests.TextFlowTextLineFactoryTest; TextFlowTextLineFactoryTest; import UnitTest.Tests.TextLineFilterTest; TextLineFilterTest; import UnitTest.Tests.UndoRedoTest; UndoRedoTest; - import UnitTest.Tests.ScrollToRangeTest; ScrollToRangeTest; + import UnitTest.Tests.ScrollToRangeTest; ScrollToRangeTest; */ } }
http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/MinimalTestsSuite.as ---------------------------------------------------------------------- diff --git a/automation_tests/src/MinimalTestsSuite.as b/automation_tests/src/MinimalTestsSuite.as new file mode 100644 index 0000000..3122012 --- /dev/null +++ b/automation_tests/src/MinimalTestsSuite.as @@ -0,0 +1,31 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//////////////////////////////////////////////////////////////////////////////// +package +{ + + import UnitTest.Tests.AccessibilityMethodsTest; + + [Suite] + [RunWith("org.flexunit.runners.Suite")] + public dynamic class MinimalTestsSuite + { + public var accessibilityMethodsTest:AccessibilityMethodsTest; + } + +} http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/UnitTest/Tests/AccessibilityMethodsTest.as ---------------------------------------------------------------------- diff --git a/automation_tests/src/UnitTest/Tests/AccessibilityMethodsTest.as b/automation_tests/src/UnitTest/Tests/AccessibilityMethodsTest.as index dbc6b9f..8ab3d89 100644 --- a/automation_tests/src/UnitTest/Tests/AccessibilityMethodsTest.as +++ b/automation_tests/src/UnitTest/Tests/AccessibilityMethodsTest.as @@ -18,477 +18,462 @@ //////////////////////////////////////////////////////////////////////////////// package UnitTest.Tests { - import UnitTest.ExtendedClasses.TestDescriptor; - import UnitTest.ExtendedClasses.TestSuiteExtended; - import UnitTest.ExtendedClasses.VellumTestCase; - import UnitTest.Fixtures.TestConfig; - - import flash.accessibility.AccessibilityImplementation; - import flash.display.Sprite; - import flash.events.IMEEvent; - import flash.system.Capabilities; - import flash.text.ime.IIMEClient; - - import flashx.textLayout.accessibility.TextAccImpl; - import flashx.textLayout.compose.StandardFlowComposer; - import flashx.textLayout.compose.TextLineRecycler; - import flashx.textLayout.container.ContainerController; - import flashx.textLayout.conversion.ConversionType; - import flashx.textLayout.conversion.TextConverter; - import flashx.textLayout.debug.assert; - import flashx.textLayout.edit.EditManager; - import flashx.textLayout.edit.SelectionManager; - import flashx.textLayout.elements.Configuration; - import flashx.textLayout.elements.GlobalSettings; - import flashx.textLayout.elements.ParagraphElement; - import flashx.textLayout.elements.TextFlow; - import flashx.textLayout.formats.TextLayoutFormat; - import flashx.textLayout.tlf_internal; - - import mx.containers.Canvas; - - use namespace tlf_internal; - - public class AccessibilityMethodsTest extends VellumTestCase - { - private var textFlow:TextFlow; - private var container:Sprite; - - public function AccessibilityMethodsTest(methodName:String, testID:String, testConfig:TestConfig, testXML:XML = null) - { - super(methodName, testID, testConfig); - } - - public static function suite(testConfig:TestConfig, ts:TestSuiteExtended):void - { - ts.addTestDescriptor (new TestDescriptor (AccessibilityMethodsTest, "selectionReportingTests", testConfig ) ); - ts.addTestDescriptor (new TestDescriptor (AccessibilityMethodsTest, "searchIndexTests", testConfig ) ); - if (Configuration.versionIsAtLeast(10,1)) - { - ts.addTestDescriptor (new TestDescriptor (AccessibilityMethodsTest, "textReportingTests", testConfig ) ); - ts.addTestDescriptor (new TestDescriptor (AccessibilityMethodsTest, "textSelectTests", testConfig ) ); - ts.addTestDescriptor (new TestDescriptor (AccessibilityMethodsTest, "multiParaTest", testConfig ) ); - } - } - - override public function setUp() : void - { - cleanUpTestApp(); - TestDisplayObject = testApp.getDisplayObject(); - createTextFlow(getFileData("simple.xml")); - TestFrame = textFlow.flowComposer.getControllerAt(0); //pacify assert in tearDown - } - - override public function tearDown():void - { - super.tearDown(); - if (container.parent) // this should've been done already - container.parent.removeChild(container); - container = null; - textFlow = null; - } - - private function createTextFlow(flowData:Object):void - { - // We need to create a new TextFlow even if there's a cached one so that we set it up with the correct Configuration - var configuration:Configuration = TextFlow.defaultConfiguration.clone(); - configuration.enableAccessibility = true; - textFlow = TextConverter.importToFlow(flowData, TextConverter.TEXT_LAYOUT_FORMAT, configuration); - - // Add a container to attach the accessibility object onto. - container = new Sprite(); - textFlow.flowComposer.addController(new ContainerController(container, 300, 300)); - var testCanvas:Canvas = testApp.getDisplayObject(); - testCanvas.rawChildren.addChild(container); - } - - private function getAccessibilityImplementation():AccessibilityImplementation - { - // Hack! The accessibilityImplementation may not be on the container if the Player does - // not detect that accessibility is turned on in the OS/browser. We want the test to run - // even in that case, so we push the accessibility implementation in anyway. If accessibility - // is turned on, we should not hit this case -- accImpl should be there already - if (container.accessibilityImplementation == null && - textFlow.flowComposer.getControllerAt(0).container == container) - { - assertTrue("Accessibility object wasn't added to container", !flash.system.Capabilities.hasAccessibility); - container.accessibilityImplementation = new TextAccImpl(container, textFlow); - } - - return container.accessibilityImplementation; - } - /** - */ - - public function selectionReportingTests():void - { - - var accessibilityObject:AccessibilityImplementation = getAccessibilityImplementation(); - - //start with no interaction - should return false - textFlow.interactionManager = null; - - //we no longer have a selection manager, so there should be no selection. Make sure - //that we report -1 for anchor and active. - assertTrue("selectionActiveIndex should report -1 when there is no Manager or EditingMode is READ_ONLY!", accessibilityObject["selectionActiveIndex"] == -1); - assertTrue("selectionAnchorIndex should report -1 when there is no Manager or EditingMode is READ_ONLY!", accessibilityObject["selectionAnchorIndex"] == -1); - - textFlow.interactionManager = new SelectionManager(); - textFlow.interactionManager.selectRange(25, 50); - assertTrue("selectionActiveIndex should report 50 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 50); - assertTrue("selectionAnchorIndex should report 25 but is "+ accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 25); - assertTrue("selectionActiveIndex should match. SelMgr reports " + textFlow.interactionManager.activePosition + - " but container reports " + accessibilityObject["selectionActiveIndex"], textFlow.interactionManager.activePosition == accessibilityObject["selectionActiveIndex"]); - assertTrue("selectionAnchorIndex should match. SelMgr reports " + textFlow.interactionManager.anchorPosition + - " but container reports " + accessibilityObject["selectionAnchorIndex"], textFlow.interactionManager.anchorPosition == accessibilityObject["selectionAnchorIndex"]); - - textFlow.interactionManager = new EditManager(); - textFlow.interactionManager.selectRange(15, 10); - assertTrue("selectionActiveIndex should report 10 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 10); - assertTrue("selectionAnchorIndex should report 15 but is "+ accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 15); - assertTrue("selectionActiveIndex should match. EditMgr reports " + textFlow.interactionManager.activePosition + - " but container reports " + accessibilityObject["selectionActiveIndex"], textFlow.interactionManager.activePosition == accessibilityObject["selectionActiveIndex"]); - assertTrue("selectionAnchorIndex should match. EditMgr reports " + textFlow.interactionManager.anchorPosition + - " but container reports " + accessibilityObject["selectionAnchorIndex"], textFlow.interactionManager.anchorPosition == accessibilityObject["selectionAnchorIndex"]); - } - - - private function createIMEClient():IIMEClient - { - // We're mimicing an IME startComposition event, so that we can get an IME client. But under pre-Argo (10.1) players, - // there is no imeStartComposition event, so in that case we can't return - var imeEvent:IMEEvent = new IMEEvent("imeStartComposition"); - // figure out which controller we're targetting and set focus on it so the ime event will be received - var i:int; - for (i = 0; i < textFlow.flowComposer.numControllers && textFlow.flowComposer.getControllerAt(i).container != container; ++i) - { - // empty loop: prevent compiler warning - } - if (textFlow.interactionManager) - textFlow.interactionManager.selectRange(-1, -1); - textFlow.flowComposer.getControllerAt(i).setFocus(); - container.dispatchEvent(imeEvent); - if (imeEvent["imeClient"] !== undefined) - return imeEvent["imeClient"]; - return null; - } - - public function textReportingTests():void - { - // Construct an IMEClient just for testing its getTextInRange in isolation. - var editManager:EditManager = new EditManager(); - textFlow.interactionManager = editManager; - var imeClient:IIMEClient = createIMEClient(); - - //textFlow.textLength includes all para terminators. However, we dont' include the final one for the last - //paragraph when getting text - since there may not be a carriage return on it - var textLen:int = textFlow.textLength - 1; - - var totalText:String = imeClient.getTextInRange(-1, -1); - assertTrue("getTextInRange with default values should get all text in the Flow, but only got " + totalText.length - + " characters out of " + textLen + ".", totalText.length == textLen); - - var para:ParagraphElement = textFlow.getFirstLeaf().getParagraph(); - var paraEnd:int = para.textLength - 1; - var selEnd:int = 64 < paraEnd ? 64 : paraEnd; - var selStart:int = selEnd >= 10 ? selEnd - 10 : 0; - var expectedLen:int = selEnd - selStart; - - //assert that we have legit values. - CONFIG::debug{ assert(selStart != selEnd, "We need to have text to make this test work! Where did it go!?")}; - - var subText:String = imeClient.getTextInRange(selStart, selEnd); - var outOfOrderText:String = imeClient.getTextInRange(selEnd, selStart); - assertTrue("getTextInRange with values (" + selStart + ", " + selEnd + ") should have a text length of " + expectedLen - + " but is " + subText.length,subText.length == expectedLen); - assertTrue("getTextInRange with values (" + selEnd + ", " + selStart + ") should have a text length of " + expectedLen - + " but is " + outOfOrderText.length, outOfOrderText.length == expectedLen); - - assertTrue("getTextInRange with values both in and out of order should have the same text!", - outOfOrderText == subText); - - //get text directly from paragraph. Since this is the first one, the absolute positions and relative positions should match - var paraText:String = para.getText().substring(selStart, selEnd); - assertTrue("getTextInRange did not report the same text as the paragraph! paraText is \'" + paraText - + "\' while result is \'" + subText + "\'.", paraText == subText); - - //get text from second paragraph - var nextPara:ParagraphElement = para.getNextParagraph(); - if(nextPara) - { - var nextAbsStart:int = nextPara.getAbsoluteStart(); - //remember that nextPara.textLength includes the para terminator mark, which will - //be included in this calculation. When we pull the paragraph text, we need to decrement the - //value by 1 to prevent a false negative as getText will not include the terminator. - selStart = nextAbsStart + nextPara.textLength - 26; - selEnd = selStart + 25; - subText = imeClient.getTextInRange(selStart, selEnd); - - //make sure that it is 1 < the absStart. See note above - var nextParaText:String = nextPara.getText().substring(selStart - nextAbsStart, selEnd - nextAbsStart); - assertTrue("getTextInRange did not report the same text as the paragraph! nextParaText is \'" + nextParaText - + "\' while result is \'" + subText + "\'.", nextParaText == subText); - - //perform tests accross para boundaries - selStart = nextAbsStart - 20; - selEnd = nextAbsStart + 20; - var boundaryText:String = imeClient.getTextInRange(selStart, selEnd); - - assertTrue("getTextInRange across boundaries should be 40, but is " + boundaryText.length, boundaryText.length == 40); - - //again, in first para, absolute is same as local indicies - substring - all chars up to endIdx, so CR is not included, - //which means we only compare the first 19 glyphs of boundaryText - var firstBoundaryText:String = para.getText().substring(selStart, selStart + 20); - assertTrue("getTextInRange across boundaries did not report the same text as the first paragraph! paraText is \'" + firstBoundaryText - + "\' while result is \'" + boundaryText.substr(0, 19) + "\'.", firstBoundaryText == boundaryText.substr(0, 19)); - - var secondBoundaryText:String = nextPara.getText().substring(0, 20); - //use a start idx of 20 so we skip the CR - assertTrue("getTextInRange across boundaries did not report the same text as the second paragraph! paraText is \'" + secondBoundaryText - + "\' while result is \'" + boundaryText.substr(20, 20) + "\'.", secondBoundaryText == boundaryText.substr(20, 20)); - - } - - - //now do negative tests and make sure we fail properly - var nullText:String = imeClient.getTextInRange(-2, 0); - assertTrue("getTextInRange should return null with an invalid startIndex!", nullText == null); - - nullText = imeClient.getTextInRange(0, -23); - assertTrue("getTextInRange should return null with an invalid endIndex!", nullText == null); - - nullText = imeClient.getTextInRange(textLen + 1, 1); - assertTrue("getTextInRange should return null with a startIndex > the text length!", nullText == null); - - nullText = imeClient.getTextInRange(0, textLen + 1); - assertTrue("getTextInRange should return null with an endIndex > the text length!", nullText == null); - - editManager.endIMESession(); - } - - public function searchIndexTests():void - { - var accessibilityObject:AccessibilityImplementation = getAccessibilityImplementation(); - - var saveEnableSearch:Boolean = GlobalSettings.enableSearch; - - // Turn search index on and check the length and content of the result - GlobalSettings.enableSearch = true; - var entireContent:String = accessibilityObject["searchText"]; - assertTrue("length of searchText should match TextFlow length, got " + entireContent.length.toString + " expected " + (textFlow.textLength - 1).toString, entireContent.length == textFlow.textLength - 1); - var checkContent:String = TextConverter.export(textFlow, TextConverter.PLAIN_TEXT_FORMAT, ConversionType.STRING_TYPE) as String; - assertTrue("expected content of searchText to match exported plain text", entireContent == checkContent); - - // Turn search index off and check that we get nothing - GlobalSettings.enableSearch = false; - entireContent = accessibilityObject["searchText"]; - assertTrue("enableSearchIndex is off, but searchText return result", entireContent == null || entireContent.length == 0); - - GlobalSettings.enableSearch = saveEnableSearch; - } - - public function textSelectTests():void - { - //start with no interaction - should return false - textFlow.interactionManager = null; - var imeClient:IIMEClient = createIMEClient(); - assertTrue("imeClient should be null on read-only textFlow", imeClient == null); - - // try a SelectionManager (read-only) should return null - textFlow.interactionManager = new SelectionManager(); - imeClient = createIMEClient(); - assertTrue("imeClient should be null on read-select textFlow", imeClient == null); - - // Construct an IMEClient just for testing its selectRange in isolation. - var editManager:EditManager = new EditManager(); - textFlow.interactionManager = editManager; - imeClient = createIMEClient(); - imeClient.selectRange(15, 10); - assertTrue("selectionActiveIndex should report 15 but is " + imeClient.selectionActiveIndex, imeClient.selectionActiveIndex == 10); - assertTrue("selectionAnchorIndex should report 10 but is "+ imeClient.selectionAnchorIndex, imeClient.selectionAnchorIndex == 15); - - editManager.endIMESession(); - } - - private const Markup:String = "<flow:TextFlow xmlns:flow='http://ns.adobe.com/textLayout/2008' fontSize='14' " + - "textIndent='0' paragraphSpaceBefore='6' paddingTop='4' paddingBottom='4' fontFamily='Times New Roman'>" + - "<flow:p paragraphSpaceAfter='15' >" + - "<flow:span>There are many </flow:span>" + - "<flow:span fontStyle='italic'>such</flow:span>" + - "<flow:span> lime-kilns in that tract of country, for the purpose of burning the white" + - "himself on a log of wood or a fragment of marble, to hold a chat with the solitary man. " + - "It is a lonesome, and, when the character is inclined to thought, may be an intensely " + - "thoughtful occupation; as it proved in the case of Ethan Brand, who had mused to such " + - "strange purpose, in days gone by, while the fire in this very kiln was burning.</flow:span>" + - "</flow:p>" + - "<flow:p paragraphSpaceAfter='15'>" + - "<flow:span>" + - "The man who now watched the fire was of a different order, and troubled himself with no " + - "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + - "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + - "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + - "</flow:p>" + - "<flow:p paragraphSpaceAfter='15'>" + - "<flow:span>" + - "The man who now watched the fire was of a different order, and troubled himself with no " + - "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + - "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + - "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + - "</flow:p>" + - "<flow:p paragraphSpaceAfter='15'>" + - "<flow:span>" + - "The man who now watched the fire was of a different order, and troubled himself with no " + - "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + - "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + - "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + - "</flow:p>" + - "<flow:p paragraphSpaceAfter='15'>" + - "<flow:span>" + - "The man who now watched the fire was of a different order, and troubled himself with no " + - "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + - "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + - "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + - "</flow:p>" + - "<flow:p paragraphSpaceAfter='15'>" + - "<flow:span>" + - "The man who now watched the fire was of a different order, and troubled himself with no " + - "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + - "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + - "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + - "</flow:p>" + - "<flow:p paragraphSpaceAfter='15'>" + - "<flow:span>" + - "The man who now watched the fire was of a different order, and troubled himself with no " + - "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + - "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + - "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + - "</flow:p>" + - "<flow:p paragraphSpaceAfter='15'>" + - "<flow:span>" + - "The man who now watched the fire was of a different order, and troubled himself with no " + - "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + - "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + - "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + - "</flow:p>" + - "</flow:TextFlow>"; - - private var TestCanvas:Canvas = null; - - public function multiParaTest():void - { - cleanUpTestApp(); - var posOfSelection:int = TestData.posOfSelection; - var format:TextLayoutFormat = new TextLayoutFormat(); - format = new TextLayoutFormat(); - format.paddingLeft = 20; - format.paddingRight = 20; - format.paddingTop = 20; - format.paddingBottom = 20; - - createTextFlow(Markup); - textFlow.flowComposer = new StandardFlowComposer(); - var editManager:EditManager = new EditManager(); - textFlow.interactionManager = editManager; - - format.firstBaselineOffset = "auto"; - editManager.applyContainerFormat(format); - editManager.applyFormatToElement(editManager.textFlow,format); - editManager.selectRange(0, 0); - - //create two containers - container = new Sprite(); - var container2:Sprite = new Sprite(); - var controllerOne:ContainerController = new ContainerController(container, 200, 500); - var controllerTwo:ContainerController = new ContainerController(container2, 200, 500); - - addToCanvas(container); - addToCanvas(container2); - container.x = 50; - container.y = 50; - container2.x = 300; - container2.y = 50; - - // add the controllers to the text flow and update them to display the text - textFlow.flowComposer.addController(controllerOne); - textFlow.flowComposer.addController(controllerTwo); - textFlow.flowComposer.updateAllControllers(); - - var accessibilityObject:AccessibilityImplementation = getAccessibilityImplementation(); - - textFlow.interactionManager = new SelectionManager(); - textFlow.interactionManager.selectRange(200, 2000); - assertTrue("selectionActiveIndex should report 2000 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 2000); - assertTrue("selectionAnchorIndex should report 200 but is "+ accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 200); - assertTrue("selectionActiveIndex should match. SelMgr reports " + textFlow.interactionManager.activePosition + - " but container reports " + accessibilityObject["selectionActiveIndex"], textFlow.interactionManager.activePosition == accessibilityObject["selectionActiveIndex"]); - assertTrue("selectionAnchorIndex should match. SelMgr reports " + textFlow.interactionManager.anchorPosition + - " but container reports " + accessibilityObject["selectionAnchorIndex"], textFlow.interactionManager.anchorPosition == accessibilityObject["selectionAnchorIndex"]); - - textFlow.interactionManager = new EditManager(); - textFlow.interactionManager.selectRange(200, 2000); - assertTrue("selectionActiveIndex should report 2000 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 2000); - assertTrue("selectionAnchorIndex should report 200 but is "+ accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 200); - assertTrue("selectionActiveIndex should match. EditMgr reports " + textFlow.interactionManager.activePosition + - " but container reports " + accessibilityObject["selectionActiveIndex"], textFlow.interactionManager.activePosition == accessibilityObject["selectionActiveIndex"]); - assertTrue("selectionAnchorIndex should match. EditMgr reports " + textFlow.interactionManager.anchorPosition + - " but container reports " + accessibilityObject["selectionAnchorIndex"], textFlow.interactionManager.anchorPosition == accessibilityObject["selectionAnchorIndex"]); - - // Construct an IMEClient just for testing its getTextInRange in isolation. - var imeClient:IIMEClient = createIMEClient(); - - var textLen:int = textFlow.textLength - 1; - var totalText:String = imeClient.getTextInRange(-1, -1); - assertTrue("getTextInRange with default values should get all text in the Flow, but only got " + totalText.length - + " characters out of " + textLen + ".", totalText.length == textLen); - - - var firstPara:ParagraphElement = textFlow.getFirstLeaf().getParagraph(); - var secondPara:ParagraphElement = firstPara.getNextParagraph(); - var thirdPara:ParagraphElement = secondPara.getNextParagraph(); - var fourthPara:ParagraphElement = thirdPara.getNextParagraph(); - var secondParaStart:int = secondPara.getAbsoluteStart(); - var thirdParaEnd:int = fourthPara.getAbsoluteStart() - 1; - var subText:String = imeClient.getTextInRange(secondParaStart, thirdParaEnd); - var paraText:String = secondPara.getText() + '\n' + thirdPara.getText(); - var paraLength:int = paraText.length; - var subLength:int = subText.length; - var secondParaLength:int = secondPara.textLength; - - assertTrue("getTextInRange did not report the same text as the paragraph! paraText is \'" + paraText - + "\' while result is \'" + subText + "\'.", paraText.length == subText.length); - assertTrue("getTextInRange did not report the same text as the paragraph! paraText is \'" + paraText - + "\' while result is \'" + subText + "\'.", paraText == subText); - EditManager(textFlow.interactionManager).endIMESession(); - - //start with no interaction - should return false - textFlow.interactionManager = null; - - //we no longer have a selection manager, so there should be no selection. Make sure - //that we report -1 for anchor and active. - assertTrue("textSelectTests should report -1 when there is no Manager or EditingMode is READ_ONLY!", accessibilityObject["selectionActiveIndex"] == -1); - assertTrue("textSelectTests should report -1 when there is no Manager or EditingMode is READ_ONLY!", accessibilityObject["selectionAnchorIndex"] == -1); - - textFlow.interactionManager = new SelectionManager(); - textFlow.interactionManager.selectRange(200, 2000); - assertTrue("selectionActiveIndex should report 2000 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 2000); - assertTrue("selectionAnchorIndex should report 200 but is "+ accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 200); - - - textFlow.interactionManager = new EditManager(); - textFlow.interactionManager.selectRange(20, 2000); - assertTrue("selectionActiveIndex should report 2000 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 2000); - assertTrue("selectionAnchorIndex should report 200 but is "+ accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 20); - - } - - private function addToCanvas(sprite:Sprite):void - { - TestDisplayObject = testApp.getDisplayObject(); - if (TestDisplayObject is Canvas) - Canvas(TestDisplayObject).rawChildren.addChild(sprite); - } - - - - } + + import UnitTest.ExtendedClasses.VellumTestCase; + import UnitTest.Fixtures.TestConfig; + + import flash.accessibility.AccessibilityImplementation; + import flash.display.Sprite; + import flash.events.IMEEvent; + import flash.system.Capabilities; + import flash.text.ime.IIMEClient; + + import flashx.textLayout.accessibility.TextAccImpl; + import flashx.textLayout.compose.StandardFlowComposer; + import flashx.textLayout.container.ContainerController; + import flashx.textLayout.conversion.ConversionType; + import flashx.textLayout.conversion.TextConverter; + import flashx.textLayout.edit.EditManager; + import flashx.textLayout.edit.SelectionManager; + import flashx.textLayout.elements.Configuration; + import flashx.textLayout.elements.GlobalSettings; + import flashx.textLayout.elements.ParagraphElement; + import flashx.textLayout.elements.TextFlow; + import flashx.textLayout.formats.TextLayoutFormat; + import flashx.textLayout.tlf_internal; + + import mx.containers.Canvas; + + import org.flexunit.asserts.assertTrue; + + use namespace tlf_internal; + + public class AccessibilityMethodsTest extends VellumTestCase + { + private var textFlow:TextFlow; + private var container:Sprite; + + private const Markup:String = "<flow:TextFlow xmlns:flow='http://ns.adobe.com/textLayout/2008' fontSize='14' " + + "textIndent='0' paragraphSpaceBefore='6' paddingTop='4' paddingBottom='4' fontFamily='Times New Roman'>" + + "<flow:p paragraphSpaceAfter='15' >" + + "<flow:span>There are many </flow:span>" + + "<flow:span fontStyle='italic'>such</flow:span>" + + "<flow:span> lime-kilns in that tract of country, for the purpose of burning the white" + + "himself on a log of wood or a fragment of marble, to hold a chat with the solitary man. " + + "It is a lonesome, and, when the character is inclined to thought, may be an intensely " + + "thoughtful occupation; as it proved in the case of Ethan Brand, who had mused to such " + + "strange purpose, in days gone by, while the fire in this very kiln was burning.</flow:span>" + + "</flow:p>" + + "<flow:p paragraphSpaceAfter='15'>" + + "<flow:span>" + + "The man who now watched the fire was of a different order, and troubled himself with no " + + "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + + "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + + "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + + "</flow:p>" + + "<flow:p paragraphSpaceAfter='15'>" + + "<flow:span>" + + "The man who now watched the fire was of a different order, and troubled himself with no " + + "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + + "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + + "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + + "</flow:p>" + + "<flow:p paragraphSpaceAfter='15'>" + + "<flow:span>" + + "The man who now watched the fire was of a different order, and troubled himself with no " + + "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + + "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + + "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + + "</flow:p>" + + "<flow:p paragraphSpaceAfter='15'>" + + "<flow:span>" + + "The man who now watched the fire was of a different order, and troubled himself with no " + + "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + + "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + + "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + + "</flow:p>" + + "<flow:p paragraphSpaceAfter='15'>" + + "<flow:span>" + + "The man who now watched the fire was of a different order, and troubled himself with no " + + "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + + "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + + "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + + "</flow:p>" + + "<flow:p paragraphSpaceAfter='15'>" + + "<flow:span>" + + "The man who now watched the fire was of a different order, and troubled himself with no " + + "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + + "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + + "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + + "</flow:p>" + + "<flow:p paragraphSpaceAfter='15'>" + + "<flow:span>" + + "The man who now watched the fire was of a different order, and troubled himself with no " + + "trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, " + + "there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, " + + "though thus far down into the valley the sunshine had vanished long and long ago.</flow:span>" + + "</flow:p>" + + "</flow:TextFlow>"; + + public function AccessibilityMethodsTest() + { + super("", "AccessibilityMethodsTest", TestConfig.getInstance()); + } + + [Before] + override public function setUpTest():void + { + super.setUpTest(); + cleanUpTestApp(); + TestDisplayObject = testApp.getDisplayObject(); + createTextFlow(getFileData("simple.xml")); + TestFrame = textFlow.flowComposer.getControllerAt(0); //pacify assert in tearDown */ + } + + [After] + override public function tearDownTest():void + { + super.tearDownTest(); + if (container.parent) // this should've been done already + container.parent.removeChild(container); + container = null; + textFlow = null; + } + + [Test] + public function selectionReportingTests():void + { + + var accessibilityObject:AccessibilityImplementation = getAccessibilityImplementation(); + + //start with no interaction - should return false + textFlow.interactionManager = null; + + //we no longer have a selection manager, so there should be no selection. Make sure + //that we report -1 for anchor and active. + assertTrue("selectionActiveIndex should report -1 when there is no Manager or EditingMode is READ_ONLY!", accessibilityObject["selectionActiveIndex"] == -1); + assertTrue("selectionAnchorIndex should report -1 when there is no Manager or EditingMode is READ_ONLY!", accessibilityObject["selectionAnchorIndex"] == -1); + + textFlow.interactionManager = new SelectionManager(); + textFlow.interactionManager.selectRange(25, 50); + assertTrue("selectionActiveIndex should report 50 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 50); + assertTrue("selectionAnchorIndex should report 25 but is " + accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 25); + assertTrue("selectionActiveIndex should match. SelMgr reports " + textFlow.interactionManager.activePosition + + " but container reports " + accessibilityObject["selectionActiveIndex"], textFlow.interactionManager.activePosition == accessibilityObject["selectionActiveIndex"]); + assertTrue("selectionAnchorIndex should match. SelMgr reports " + textFlow.interactionManager.anchorPosition + + " but container reports " + accessibilityObject["selectionAnchorIndex"], textFlow.interactionManager.anchorPosition == accessibilityObject["selectionAnchorIndex"]); + + textFlow.interactionManager = new EditManager(); + textFlow.interactionManager.selectRange(15, 10); + assertTrue("selectionActiveIndex should report 10 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 10); + assertTrue("selectionAnchorIndex should report 15 but is " + accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 15); + assertTrue("selectionActiveIndex should match. EditMgr reports " + textFlow.interactionManager.activePosition + + " but container reports " + accessibilityObject["selectionActiveIndex"], textFlow.interactionManager.activePosition == accessibilityObject["selectionActiveIndex"]); + assertTrue("selectionAnchorIndex should match. EditMgr reports " + textFlow.interactionManager.anchorPosition + + " but container reports " + accessibilityObject["selectionAnchorIndex"], textFlow.interactionManager.anchorPosition == accessibilityObject["selectionAnchorIndex"]); + } + + [Test] + public function textReportingTests():void + { + // Construct an IMEClient just for testing its getTextInRange in isolation. + var editManager:EditManager = new EditManager(); + textFlow.interactionManager = editManager; + var imeClient:IIMEClient = createIMEClient(); + + //textFlow.textLength includes all para terminators. However, we dont' include the final one for the last + //paragraph when getting text - since there may not be a carriage return on it + var textLen:int = textFlow.textLength - 1; + + var totalText:String = imeClient.getTextInRange(-1, -1); + assertTrue("getTextInRange with default values should get all text in the Flow, but only got " + totalText.length + + " characters out of " + textLen + ".", totalText.length == textLen); + + var para:ParagraphElement = textFlow.getFirstLeaf().getParagraph(); + var paraEnd:int = para.textLength - 1; + var selEnd:int = 64 < paraEnd ? 64 : paraEnd; + var selStart:int = selEnd >= 10 ? selEnd - 10 : 0; + var expectedLen:int = selEnd - selStart; + + //assert that we have legit values. + assertTrue(selStart != selEnd, "We need to have text to make this test work! Where did it go!?"); + // CONFIG::debug{ assert(selStart != selEnd, "We need to have text to make this test work! Where did it go!?")}; + + var subText:String = imeClient.getTextInRange(selStart, selEnd); + var outOfOrderText:String = imeClient.getTextInRange(selEnd, selStart); + assertTrue("getTextInRange with values (" + selStart + ", " + selEnd + ") should have a text length of " + expectedLen + + " but is " + subText.length, subText.length == expectedLen); + assertTrue("getTextInRange with values (" + selEnd + ", " + selStart + ") should have a text length of " + expectedLen + + " but is " + outOfOrderText.length, outOfOrderText.length == expectedLen); + + assertTrue("getTextInRange with values both in and out of order should have the same text!", + outOfOrderText == subText); + + //get text directly from paragraph. Since this is the first one, the absolute positions and relative positions should match + var paraText:String = para.getText().substring(selStart, selEnd); + assertTrue("getTextInRange did not report the same text as the paragraph! paraText is \'" + paraText + + "\' while result is \'" + subText + "\'.", paraText == subText); + + //get text from second paragraph + var nextPara:ParagraphElement = para.getNextParagraph(); + if (nextPara) + { + var nextAbsStart:int = nextPara.getAbsoluteStart(); + //remember that nextPara.textLength includes the para terminator mark, which will + //be included in this calculation. When we pull the paragraph text, we need to decrement the + //value by 1 to prevent a false negative as getText will not include the terminator. + selStart = nextAbsStart + nextPara.textLength - 26; + selEnd = selStart + 25; + subText = imeClient.getTextInRange(selStart, selEnd); + + //make sure that it is 1 < the absStart. See note above + var nextParaText:String = nextPara.getText().substring(selStart - nextAbsStart, selEnd - nextAbsStart); + assertTrue("getTextInRange did not report the same text as the paragraph! nextParaText is \'" + nextParaText + + "\' while result is \'" + subText + "\'.", nextParaText == subText); + + //perform tests accross para boundaries + selStart = nextAbsStart - 20; + selEnd = nextAbsStart + 20; + var boundaryText:String = imeClient.getTextInRange(selStart, selEnd); + + assertTrue("getTextInRange across boundaries should be 40, but is " + boundaryText.length, boundaryText.length == 40); + + //again, in first para, absolute is same as local indicies - substring - all chars up to endIdx, so CR is not included, + //which means we only compare the first 19 glyphs of boundaryText + var firstBoundaryText:String = para.getText().substring(selStart, selStart + 20); + assertTrue("getTextInRange across boundaries did not report the same text as the first paragraph! paraText is \'" + firstBoundaryText + + "\' while result is \'" + boundaryText.substr(0, 19) + "\'.", firstBoundaryText == boundaryText.substr(0, 19)); + + var secondBoundaryText:String = nextPara.getText().substring(0, 20); + //use a start idx of 20 so we skip the CR + assertTrue("getTextInRange across boundaries did not report the same text as the second paragraph! paraText is \'" + secondBoundaryText + + "\' while result is \'" + boundaryText.substr(20, 20) + "\'.", secondBoundaryText == boundaryText.substr(20, 20)); + + } + + + //now do negative tests and make sure we fail properly + var nullText:String = imeClient.getTextInRange(-2, 0); + assertTrue("getTextInRange should return null with an invalid startIndex!", nullText == null); + + nullText = imeClient.getTextInRange(0, -23); + assertTrue("getTextInRange should return null with an invalid endIndex!", nullText == null); + + nullText = imeClient.getTextInRange(textLen + 1, 1); + assertTrue("getTextInRange should return null with a startIndex > the text length!", nullText == null); + + nullText = imeClient.getTextInRange(0, textLen + 1); + assertTrue("getTextInRange should return null with an endIndex > the text length!", nullText == null); + + editManager.endIMESession(); + } + + [Test] + public function searchIndexTests():void + { + var accessibilityObject:AccessibilityImplementation = getAccessibilityImplementation(); + + var saveEnableSearch:Boolean = GlobalSettings.enableSearch; + + // Turn search index on and check the length and content of the result + GlobalSettings.enableSearch = true; + var entireContent:String = accessibilityObject["searchText"]; + assertTrue("length of searchText should match TextFlow length, got " + entireContent.length.toString + " expected " + (textFlow.textLength - 1).toString, entireContent.length == textFlow.textLength - 1); + var checkContent:String = TextConverter.export(textFlow, TextConverter.PLAIN_TEXT_FORMAT, ConversionType.STRING_TYPE) as String; + assertTrue("expected content of searchText to match exported plain text", entireContent == checkContent); + + // Turn search index off and check that we get nothing + GlobalSettings.enableSearch = false; + entireContent = accessibilityObject["searchText"]; + assertTrue("enableSearchIndex is off, but searchText return result", entireContent == null || entireContent.length == 0); + + GlobalSettings.enableSearch = saveEnableSearch; + } + + [Test] + public function textSelectTests():void + { + //start with no interaction - should return false + textFlow.interactionManager = null; + var imeClient:IIMEClient = createIMEClient(); + assertTrue("imeClient should be null on read-only textFlow", imeClient == null); + + // try a SelectionManager (read-only) should return null + textFlow.interactionManager = new SelectionManager(); + imeClient = createIMEClient(); + assertTrue("imeClient should be null on read-select textFlow", imeClient == null); + + // Construct an IMEClient just for testing its selectRange in isolation. + var editManager:EditManager = new EditManager(); + textFlow.interactionManager = editManager; + imeClient = createIMEClient(); + imeClient.selectRange(15, 10); + assertTrue("selectionActiveIndex should report 15 but is " + imeClient.selectionActiveIndex, imeClient.selectionActiveIndex == 10); + assertTrue("selectionAnchorIndex should report 10 but is " + imeClient.selectionAnchorIndex, imeClient.selectionAnchorIndex == 15); + + editManager.endIMESession(); + } + + [Test] + public function multiParaTest():void + { + cleanUpTestApp(); + + var format:TextLayoutFormat = new TextLayoutFormat(); + format = new TextLayoutFormat(); + format.paddingLeft = 20; + format.paddingRight = 20; + format.paddingTop = 20; + format.paddingBottom = 20; + + createTextFlow(Markup); + textFlow.flowComposer = new StandardFlowComposer(); + var editManager:EditManager = new EditManager(); + textFlow.interactionManager = editManager; + + format.firstBaselineOffset = "auto"; + editManager.applyContainerFormat(format); + editManager.applyFormatToElement(editManager.textFlow, format); + editManager.selectRange(0, 0); + + //create two containers + container = new Sprite(); + var container2:Sprite = new Sprite(); + var controllerOne:ContainerController = new ContainerController(container, 200, 500); + var controllerTwo:ContainerController = new ContainerController(container2, 200, 500); + + addToCanvas(container); + addToCanvas(container2); + container.x = 50; + container.y = 50; + container2.x = 300; + container2.y = 50; + + // add the controllers to the text flow and update them to display the text + textFlow.flowComposer.addController(controllerOne); + textFlow.flowComposer.addController(controllerTwo); + textFlow.flowComposer.updateAllControllers(); + + var accessibilityObject:AccessibilityImplementation = getAccessibilityImplementation(); + + textFlow.interactionManager = new SelectionManager(); + textFlow.interactionManager.selectRange(200, 2000); + assertTrue("selectionActiveIndex should report 2000 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 2000); + assertTrue("selectionAnchorIndex should report 200 but is " + accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 200); + assertTrue("selectionActiveIndex should match. SelMgr reports " + textFlow.interactionManager.activePosition + + " but container reports " + accessibilityObject["selectionActiveIndex"], textFlow.interactionManager.activePosition == accessibilityObject["selectionActiveIndex"]); + assertTrue("selectionAnchorIndex should match. SelMgr reports " + textFlow.interactionManager.anchorPosition + + " but container reports " + accessibilityObject["selectionAnchorIndex"], textFlow.interactionManager.anchorPosition == accessibilityObject["selectionAnchorIndex"]); + + textFlow.interactionManager = new EditManager(); + textFlow.interactionManager.selectRange(200, 2000); + assertTrue("selectionActiveIndex should report 2000 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 2000); + assertTrue("selectionAnchorIndex should report 200 but is " + accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 200); + assertTrue("selectionActiveIndex should match. EditMgr reports " + textFlow.interactionManager.activePosition + + " but container reports " + accessibilityObject["selectionActiveIndex"], textFlow.interactionManager.activePosition == accessibilityObject["selectionActiveIndex"]); + assertTrue("selectionAnchorIndex should match. EditMgr reports " + textFlow.interactionManager.anchorPosition + + " but container reports " + accessibilityObject["selectionAnchorIndex"], textFlow.interactionManager.anchorPosition == accessibilityObject["selectionAnchorIndex"]); + + // Construct an IMEClient just for testing its getTextInRange in isolation. + var imeClient:IIMEClient = createIMEClient(); + + var textLen:int = textFlow.textLength - 1; + var totalText:String = imeClient.getTextInRange(-1, -1); + assertTrue("getTextInRange with default values should get all text in the Flow, but only got " + totalText.length + + " characters out of " + textLen + ".", totalText.length == textLen); + + + var firstPara:ParagraphElement = textFlow.getFirstLeaf().getParagraph(); + var secondPara:ParagraphElement = firstPara.getNextParagraph(); + var thirdPara:ParagraphElement = secondPara.getNextParagraph(); + var fourthPara:ParagraphElement = thirdPara.getNextParagraph(); + var secondParaStart:int = secondPara.getAbsoluteStart(); + var thirdParaEnd:int = fourthPara.getAbsoluteStart() - 1; + var subText:String = imeClient.getTextInRange(secondParaStart, thirdParaEnd); + var paraText:String = secondPara.getText() + '\n' + thirdPara.getText(); + + assertTrue("getTextInRange did not report the same text as the paragraph! paraText is \'" + paraText + + "\' while result is \'" + subText + "\'.", paraText.length == subText.length); + assertTrue("getTextInRange did not report the same text as the paragraph! paraText is \'" + paraText + + "\' while result is \'" + subText + "\'.", paraText == subText); + EditManager(textFlow.interactionManager).endIMESession(); + + //start with no interaction - should return false + textFlow.interactionManager = null; + + //we no longer have a selection manager, so there should be no selection. Make sure + //that we report -1 for anchor and active. + assertTrue("textSelectTests should report -1 when there is no Manager or EditingMode is READ_ONLY!", accessibilityObject["selectionActiveIndex"] == -1); + assertTrue("textSelectTests should report -1 when there is no Manager or EditingMode is READ_ONLY!", accessibilityObject["selectionAnchorIndex"] == -1); + + textFlow.interactionManager = new SelectionManager(); + textFlow.interactionManager.selectRange(200, 2000); + assertTrue("selectionActiveIndex should report 2000 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 2000); + assertTrue("selectionAnchorIndex should report 200 but is " + accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 200); + + + textFlow.interactionManager = new EditManager(); + textFlow.interactionManager.selectRange(20, 2000); + assertTrue("selectionActiveIndex should report 2000 but is " + accessibilityObject["selectionActiveIndex"], accessibilityObject["selectionActiveIndex"] == 2000); + assertTrue("selectionAnchorIndex should report 200 but is " + accessibilityObject["selectionAnchorIndex"], accessibilityObject["selectionAnchorIndex"] == 20); + + } + + private function addToCanvas(sprite:Sprite):void + { + TestDisplayObject = testApp.getDisplayObject(); + if (TestDisplayObject is Canvas) + Canvas(TestDisplayObject).rawChildren.addChild(sprite); + } + + private function createIMEClient():IIMEClient + { + // We're mimicing an IME startComposition event, so that we can get an IME client. But under pre-Argo (10.1) players, + // there is no imeStartComposition event, so in that case we can't return + var imeEvent:IMEEvent = new IMEEvent("imeStartComposition"); + // figure out which controller we're targetting and set focus on it so the ime event will be received + var i:int; + for (i = 0; i < textFlow.flowComposer.numControllers && textFlow.flowComposer.getControllerAt(i).container != container; ++i) + { + // empty loop: prevent compiler warning + } + if (textFlow.interactionManager) + textFlow.interactionManager.selectRange(-1, -1); + textFlow.flowComposer.getControllerAt(i).setFocus(); + container.dispatchEvent(imeEvent); + if (imeEvent["imeClient"] !== undefined) + return imeEvent["imeClient"]; + return null; + } + + private function createTextFlow(flowData:Object):void + { + // We need to create a new TextFlow even if there's a cached one so that we set it up with the correct Configuration + var configuration:Configuration = TextFlow.defaultConfiguration.clone(); + configuration.enableAccessibility = true; + textFlow = TextConverter.importToFlow(flowData, TextConverter.TEXT_LAYOUT_FORMAT, configuration); + + // Add a container to attach the accessibility object onto. + container = new Sprite(); + textFlow.flowComposer.addController(new ContainerController(container, 300, 300)); + var testCanvas:Canvas = testApp.getDisplayObject(); + testCanvas.rawChildren.addChild(container); + } + + private function getAccessibilityImplementation():AccessibilityImplementation + { + // Hack! The accessibilityImplementation may not be on the container if the Player does + // not detect that accessibility is turned on in the OS/browser. We want the test to run + // even in that case, so we push the accessibility implementation in anyway. If accessibility + // is turned on, we should not hit this case -- accImpl should be there already + if (container.accessibilityImplementation == null && + textFlow.flowComposer.getControllerAt(0).container == container) + { + assertTrue("Accessibility object wasn't added to container", !Capabilities.hasAccessibility); + container.accessibilityImplementation = new TextAccImpl(container, textFlow); + } + + return container.accessibilityImplementation; + } + } } http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/UnitTest/Tests/AllAttributeTest.as ---------------------------------------------------------------------- diff --git a/automation_tests/src/UnitTest/Tests/AllAttributeTest.as b/automation_tests/src/UnitTest/Tests/AllAttributeTest.as index 76f7047..44bca88 100644 --- a/automation_tests/src/UnitTest/Tests/AllAttributeTest.as +++ b/automation_tests/src/UnitTest/Tests/AllAttributeTest.as @@ -31,7 +31,9 @@ package UnitTest.Tests import flashx.textLayout.formats.TextLayoutFormat; import flashx.textLayout.property.*; - /** Base class for All*AttributeTest */ + import org.flexunit.asserts.assertTrue; + + /** Base class for All*AttributeTest */ public class AllAttributeTest extends VellumTestCase { // test specific configuration http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as ---------------------------------------------------------------------- diff --git a/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as b/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as index 401fe85..ff0596e 100644 --- a/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as +++ b/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as @@ -29,7 +29,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 AllCharAttributeTest extends AllAttributeTest { http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/UnitTest/Tests/AllContAttributeTest.as ---------------------------------------------------------------------- diff --git a/automation_tests/src/UnitTest/Tests/AllContAttributeTest.as b/automation_tests/src/UnitTest/Tests/AllContAttributeTest.as index 087b425..978d8f1 100644 --- a/automation_tests/src/UnitTest/Tests/AllContAttributeTest.as +++ b/automation_tests/src/UnitTest/Tests/AllContAttributeTest.as @@ -31,7 +31,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 AllContAttributeTest extends AllAttributeTest { @@ -48,10 +50,10 @@ package UnitTest.Tests testAllProperties(ts, testConfig, TextLayoutFormat.description, Category.CONTAINER, AllContAttributeTest, "runOneContainerAttributeTest"); } - public override function tearDown():void + public override function tearDownTest():void { SelManager.applyContainerFormat(TextLayoutFormat.defaultFormat); - super.tearDown(); + super.tearDownTest(); } /**
