//////////////////////////////////////////////////////////////////////////////// // // 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.Validation { import flash.display.DisplayObject; import flash.display.Sprite; import flash.text.engine.TextLine; import flashx.textLayout.compose.IFlowComposer; import flashx.textLayout.compose.TextFlowLine; import flashx.textLayout.debug.assert; import flashx.textLayout.elements.TextFlow; import flexunit.framework.Assert; public class CompositionResults { static public function getContainerResults(container:Sprite):Array { var result:Array = []; for (var i:int = 0; i < container.numChildren; ++i) { var textLine:TextLine = container.getChildAt(i) as TextLine; if (textLine) { var lineResults:Array = getTextLineResults(textLine, 0); result.push(lineResults); } } return result; } static public function getTextFlowResults(textFlow:TextFlow):Array { var result:Array = []; var flowComposer:IFlowComposer = textFlow.flowComposer; flowComposer.composeToPosition(); for (var i:int = 0; i < flowComposer.numLines; ++i) { var line:TextFlowLine = textFlow.flowComposer.getLineAt(i); var textLine:TextLine = line.getTextLine(); if (!textLine) textLine = line.getTextLine(); var lineResults:Array = getTextLineResults(textLine, line.absoluteStart); result.push(lineResults); } return result; } static public function getFactoryResults(textLineArray:Array):Array { var result:Array = []; var pos:int = 0; for (var i:int = 0; i < textLineArray.length; ++i) { var textLine:TextLine = textLineArray[i] as TextLine; if (!textLine) trace("here we are"); var lineResults:Array = getTextLineResults(textLine, pos); result.push(lineResults); pos += textLine.rawTextLength; } return result; } static private function getTextLineResults(textLine:TextLine, lineStart:int):Array { var lineResults:Array = []; lineResults.push(lineStart); lineResults.push(textLine.rawTextLength); lineResults.push(textLine.x); lineResults.push(textLine.y); return lineResults; } static public function compareResultsInternal(results1:Array, results2:Array, compareLocation:Boolean = true):int { // Returns first line # different, or -1 if same for (var i:int = 0; i < results2.length && i < results2.length; ++i) { if (results1[i][0] != results2[i][0] || results1[i][1] != results2[i][1]) return i; if (compareLocation && (results1[i][2] != results2[i][2] || results1[i][3] != results2[i][3])) return i; } return -1; } static public function compareResults(results1:Array, results2:Array, compareLocation:Boolean = true):Boolean { // if (compareLocation) // return (results1.toString() == results2.toString()); return (compareResultsInternal(results1, results2, compareLocation) == -1); } static public function assertEquals(message:String, results1:Array, results2:Array, compareLocation:Boolean):void { var firstLineDifference:int = compareResultsInternal(results1, results2, compareLocation); if (firstLineDifference >= 0) { trace("Composition results differ starting at line", firstLineDifference); for (var i:int = 0; i < results2.length && i < results2.length; ++i) { trace("results1 line", i, ":", results1[i].toString()); trace("results2 line: ", i, ":", results2[i].toString()); } } Assert.assertTrue(message, CompositionResults.compareResults(results1, results2, compareLocation)); } } }