//////////////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// package UnitTest.Tests { import UnitTest.ExtendedClasses.TestSuiteExtended; import UnitTest.ExtendedClasses.VellumTestCase; import UnitTest.Fixtures.TestConfig; import UnitTest.Validation.CompositionResults; import flash.display.DisplayObject; import flash.events.Event; import flash.geom.Rectangle; import flash.text.engine.TextLine; import flashx.textLayout.compose.IFlowComposer; import flashx.textLayout.compose.StandardFlowComposer; import flashx.textLayout.container.ContainerController; import flashx.textLayout.conversion.ITextImporter; import flashx.textLayout.conversion.TextConverter; import flashx.textLayout.edit.EditManager; import flashx.textLayout.elements.FlowLeafElement; import flashx.textLayout.elements.InlineGraphicElement; import flashx.textLayout.elements.InlineGraphicElementStatus; import flashx.textLayout.elements.TextFlow; import flashx.textLayout.events.StatusChangeEvent; import flashx.textLayout.events.UpdateCompleteEvent; import flashx.textLayout.factory.TextFlowTextLineFactory; import flashx.textLayout.formats.BlockProgression; import flashx.textLayout.formats.TextLayoutFormat; public class ImportTest extends VellumTestCase { //private var importFileName:String; public function ImportTest(fileToImport:String, testID:String, testConfig:TestConfig, testCaseXML:XML=null) { super ("doThis", testID, testConfig, testCaseXML); TestData.fileName = TestData.testFile; // Note: These must correspond to a Watson product area (case-sensitive) metaData.productArea = "Import/Export"; } private var _errors:Vector.; public override function importContent (content:Object):void { var parser:ITextImporter = importParser; var textFlow:TextFlow = parser.importToFlow(content); _errors = parser.errors; setUpFlowForTest(textFlow); } public function doThis():void { var tf:TextFlow = TestFrame.rootElement.getTextFlow(); // only change it if different. doesn't disturb existing results this way. if (tf.computedFormat.blockProgression != writingDirection[0]) tf.blockProgression = this.writingDirection[0]; if (tf.computedFormat.direction != writingDirection[1]) tf.direction = this.writingDirection[1]; if (this.TestData.hasOwnProperty("locale")) tf.locale = TestData.locale; tf.flowComposer.updateAllControllers(); // assertTrue("Errors found on import",_errors == null); SelManager = EditManager(tf.interactionManager); checkForInlines(); } override public function tearDown():void { compareResultsToFactory(); super.tearDown(); } private static var textFlowFactory:TextFlowTextLineFactory = new TextFlowTextLineFactory(); private function compareResultsToFactory():void { // When we load simple, we overrode lots of stuff in the controller, making this comparison invalid if (fileName == defaultFileName) return; // Compare the results we get running through ComposeState to what we get from SimpleCompose (the factory composer). // Results should match unless the format values are overridden in the controller, which is invisible to the factory. var textFlow:TextFlow = SelManager.textFlow; var controller:ContainerController = textFlow.flowComposer.getControllerAt(0); var verticalText:Boolean = textFlow.computedFormat.blockProgression == BlockProgression.RL; var tfResults:Array = CompositionResults.getTextFlowResults(textFlow); var textLineArray:Array = []; textFlowFactory.compositionBounds = new Rectangle(0, 0, controller.compositionWidth, controller.compositionHeight); //textFlow.flowComposer = null; // this releases all the inlinegraphics textFlowFactory.createTextLines(gatherLines, textFlow); textFlow.flowComposer = new StandardFlowComposer(); textFlow.flowComposer.addController(controller); var factoryResults:Array = CompositionResults.getFactoryResults(textLineArray); CompositionResults.assertEquals("Factory and TextFlow composition should match", tfResults, factoryResults, !verticalText); function gatherLines(displayObject:DisplayObject):void { if (displayObject is TextLine) textLineArray.push(displayObject); } } private function updateCompletionHandler(event:Event):void { } private var notReadyGraphicsCount:int; // If there are inlines still loading, add a call back so we snapshot after load is complete private function checkForInlines(callBack:Object = null):void { var textFlow:TextFlow = TestFrame.rootElement.getTextFlow(); if (!callBack) { notReadyGraphicsCount = 0; for (var leaf:FlowLeafElement = textFlow.getFirstLeaf(); leaf != null; leaf = leaf.getNextLeaf()) if (leaf is InlineGraphicElement && InlineGraphicElement(leaf).status != InlineGraphicElementStatus.READY) notReadyGraphicsCount++; if (notReadyGraphicsCount != 0) textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE,addAsync(checkForInlines,2500,null),false,0,true); } else { var event:StatusChangeEvent = StatusChangeEvent(callBack); switch (event.status) { case InlineGraphicElementStatus.LOADING: case InlineGraphicElementStatus.SIZE_PENDING: textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE,addAsync(checkForInlines,2500,null),false,0,true); break; case InlineGraphicElementStatus.READY: notReadyGraphicsCount--; if (notReadyGraphicsCount != 0) textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE,addAsync(checkForInlines,2500,null),false,0,true); else if (textFlow.flowComposer.composing) textFlow.addEventListener(UpdateCompleteEvent.UPDATE_COMPLETE,addAsync(updateCompletionHandler,2500,null),false,0,true); else textFlow.flowComposer.updateAllControllers(); break; default: assertTrue("unexpected StatusChangeEvent status: "+event.status,false); break; } } } public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void { var testCaseClass:Class = ImportTest; VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts); } } }