blob: 30e2a39e50a42d39c2b0eddbf944ad151174858e [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// 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.TestConfigurationLoader;
import UnitTest.ExtendedClasses.VellumTestCase;
import UnitTest.Fixtures.TestCaseVo;
import UnitTest.Fixtures.TestConfig;
import flash.display.BitmapData;
import flash.display.DisplayObject;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.system.Capabilities;
import flash.text.engine.TextLine;
import flash.ui.Mouse;
import flash.utils.*;
import flashx.textLayout.compose.TextFlowLine;
import flashx.textLayout.container.*;
import flashx.textLayout.conversion.TextConverter;
import flashx.textLayout.edit.EditManager;
import flashx.textLayout.elements.Configuration;
import flashx.textLayout.elements.GlobalSettings;
import flashx.textLayout.elements.InlineGraphicElementStatus;
import flashx.textLayout.elements.ParagraphElement;
import flashx.textLayout.elements.TextFlow;
import flashx.textLayout.events.StatusChangeEvent;
import flashx.textLayout.formats.*;
import flashx.textLayout.tlf_internal;
import mx.containers.Canvas;
import org.flexunit.asserts.assertTrue;
use namespace tlf_internal;
/**
* Class is using mechanism IExternalDependencyLoader.
* Data providers with loaded data are shared between test methods
*/
[TestCase(order=15)]
[RunWith("org.flexunit.runners.Parameterized")]
public class ContainerAttributeTest extends VellumTestCase
{
[DataPoints(loader=checkColumnWidthOnGapChangeTestLoader)]
[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
public static var checkColumnWidthOnGapChangeTestDp:Array;
public static var checkColumnWidthOnGapChangeTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "checkColumnWidthOnGapChangeTest");
[DataPoints(loader=checkVerticalAlignTopTestLoader)]
[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
public static var checkVerticalAlignTopTestDp:Array;
public static var checkVerticalAlignTopTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "checkVerticalAlignTopTest");
[DataPoints(loader=checkVerticalAlignBottomTestLoader)]
[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
public static var checkVerticalAlignBottomTestDp:Array;
public static var checkVerticalAlignBottomTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "checkVerticalAlignBottomTest");
[DataPoints(loader=leftPaddingSqueezeTestLoader)]
[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
public static var leftPaddingSqueezeTestDp:Array;
public static var leftPaddingSqueezeTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "leftPaddingSqueezeTest");
[DataPoints(loader=checkVerticalAlignMiddleTestLoader)]
[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
public static var checkVerticalAlignMiddleTestDp:Array;
public static var checkVerticalAlignMiddleTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "checkVerticalAlignMiddleTest");
[DataPoints(loader=contentBoundsWithWhitespacesLoader)]
[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
public static var contentBoundsWithWhitespacesDp:Array;
public static var contentBoundsWithWhitespacesLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "ContentBoundsWithWhitespaces");
[DataPoints(loader=hBeamCursorTestLoader)]
[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
public static var hBeamCursorTestDp:Array;
public static var hBeamCursorTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "HBeamCursorTest");
[DataPoints(loader=topPaddingSqueezeTestLoader)]
[ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
public static var topPaddingSqueezeTestDp:Array;
public static var topPaddingSqueezeTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/ContainerAttributeTests.xml", "topPaddingSqueezeTest");
private var testContainer:Boolean;
private var inputContainerAttrs:TextLayoutFormat;
private var outputContainerAttrs:ITextLayoutFormat;
private var initSize:Point;
private var currentTestCaseVo:TestCaseVo;
public function ContainerAttributeTest()
{
super("", "ContainerAttributeTest", TestConfig.getInstance());
this.testContainer = (TestData.testContainer == "true");
TestID = TestID + ":" + testContainer;
inputContainerAttrs = new TextLayoutFormat();
metaData = {};
metaData.productArea = "Text Container";
}
public override function setUpTest():void
{
super.setUpTest();
paddingRight = 0;
paddingLeft = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;
SelManager.selectAll();
columnGap = 0;
columnWidth = FormatValue.AUTO;
columnCount = FormatValue.AUTO;
testContainer = currentTestCaseVo.testContainer;
TestData.bitmapSnapshot = currentTestCaseVo.bitmapSnapshot ? "true" : "false";
TestData.minimal = currentTestCaseVo.minimal ? "true" : "false";
writingDirection[0] = currentTestCaseVo.rl_ltr == "true" ? BlockProgression.TB : BlockProgression.RL;
writingDirection[1] = currentTestCaseVo.tb_rtl == "true" ? Direction.LTR : Direction.RTL;
}
[After]
public override function tearDownTest():void
{
if (initSize)
{
size = initSize;
}
super.tearDownTest();
}
private function set columnCount(count:Object):void
{
if (testContainer)
{
var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
ca.columnCount = count;
TestFrame.format = ca;
}
else
{
inputContainerAttrs.columnCount = count;
SelManager.applyContainerFormat(inputContainerAttrs);
}
}
private function get columnCount():Object
{
outputContainerAttrs = TestFrame.computedFormat;
return outputContainerAttrs.columnCount;
}
private function set columnGap(gap:Object):void
{
if (testContainer)
{
var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
ca.columnGap = gap;
TestFrame.format = ca;
}
else
{
inputContainerAttrs.columnGap = gap;
SelManager.applyContainerFormat(inputContainerAttrs);
}
}
private function get columnGap():Object
{
outputContainerAttrs = TestFrame.computedFormat;
return outputContainerAttrs.columnGap;
}
private function set columnWidth(width:Object):void
{
if (testContainer)
{
var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
ca.columnWidth = width;
TestFrame.format = ca;
}
else
{
inputContainerAttrs.columnWidth = width;
SelManager.applyContainerFormat(inputContainerAttrs);
}
}
private function get verticalAlign():Object
{
outputContainerAttrs = TestFrame.computedFormat;
return outputContainerAttrs.verticalAlign;
}
private function set verticalAlign(align:Object):void
{
if (testContainer)
{
var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
ca.verticalAlign = align as String;
TestFrame.format = ca;
// Added as result of bug #1875477
TestFrame.textFlow.flowComposer.updateAllControllers();
}
else
{
inputContainerAttrs.verticalAlign = align as String;
SelManager.applyContainerFormat(inputContainerAttrs);
}
}
private function get columnWidth():Object
{
outputContainerAttrs = TestFrame.computedFormat;
return outputContainerAttrs.columnWidth;
}
private function set paddingTop(padding:Object):void
{
if (testContainer)
{
var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
ca.paddingTop = padding;
TestFrame.format = ca;
}
else
{
inputContainerAttrs.paddingTop = padding;
SelManager.applyContainerFormat(inputContainerAttrs);
}
}
private function set paddingBottom(padding:Object):void
{
if (testContainer)
{
var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
ca.paddingBottom = padding;
TestFrame.format = ca;
}
else
{
inputContainerAttrs.paddingBottom = padding;
SelManager.applyContainerFormat(inputContainerAttrs);
}
}
private function set paddingRight(padding:Object):void
{
if (testContainer)
{
var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
ca.paddingRight = padding;
TestFrame.format = ca;
}
else
{
inputContainerAttrs.paddingRight = padding;
SelManager.applyContainerFormat(inputContainerAttrs);
}
}
private function set paddingLeft(padding:Object):void
{
if (testContainer)
{
var ca:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
ca.paddingLeft = padding;
TestFrame.format = ca;
}
else
{
inputContainerAttrs.paddingLeft = padding;
SelManager.applyContainerFormat(inputContainerAttrs);
}
}
private function get testFrameWidth():Number
{
return TestFrame.compositionWidth;
}
private function get testFrameHeight():Number
{
return TestFrame.compositionHeight;
}
private function get blockProgression():String
{
return TestFrame.rootElement.computedFormat.blockProgression;
}
private function set blockProgression(mode:String):void
{
TestFrame.rootElement.blockProgression = mode;
TestFrame.textFlow.flowComposer.compose();
}
private function get size():Point
{
var width:Number = 0;
var height:Number = 0;
if (TestFrame.container is DisplayObject)
{
var frame:DisplayObject = TestFrame.container as DisplayObject;
width = frame.width;
height = frame.height;
}
return new Point(width, height);
}
private function set size(dimension:Point):void
{
var containerAttr:TextLayoutFormat = new TextLayoutFormat(TestFrame.format);
containerAttr.columnCount = 1;
containerAttr.paddingLeft = 0;
containerAttr.paddingRight = 0;
containerAttr.paddingTop = 0;
containerAttr.paddingBottom = 0;
TestFrame.format = containerAttr;
if (TestFrame.container is Sprite)
{
TextFlow(testApp.getTextFlow()).flowComposer.getControllerAt(0).setCompositionSize(dimension.x, dimension.y);
TextFlow(testApp.getTextFlow()).flowComposer.updateAllControllers();
}
else
throw new Error("test does not know how to resize this container type"); // Above should be generalized?
}
/**
* Set and get the firstBaselineOffset string values and test bound of numeric values.
*/
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function checkfirstBaselineOffset(testCaseVo:TestCaseVo):void // KJT
{
currentTestCaseVo = testCaseVo;
setUpTest();
inputContainerAttrs.firstBaselineOffset = BaselineOffset.ASCENT;
assertTrue("expected: ascent. cascaded: " + String(inputContainerAttrs.firstBaselineOffset),
String(inputContainerAttrs.firstBaselineOffset) == BaselineOffset.ASCENT);
inputContainerAttrs.firstBaselineOffset = BaselineOffset.LINE_HEIGHT;
assertTrue("expected: leading. cascaded: " + String(inputContainerAttrs.firstBaselineOffset),
String(inputContainerAttrs.firstBaselineOffset) == BaselineOffset.LINE_HEIGHT);
for (var cter:uint = TextLayoutFormat.firstBaselineOffsetProperty.minValue; cter <= TextLayoutFormat.firstBaselineOffsetProperty.maxValue; cter += 33.33)
{
inputContainerAttrs.firstBaselineOffset = cter;
assertTrue("expected: " + cter + ". cascaded: " + inputContainerAttrs.firstBaselineOffset, inputContainerAttrs.firstBaselineOffset == cter);
}
inputContainerAttrs.firstBaselineOffset = undefined;
}
/**
* Set the gap, then change the width to see how the column count changes.
*/
public function checkColumnCountOnWidthChangeTest():void
{
var width:Number = testFrameWidth;
var cWidth:Number = width / 10;
columnGap = 0;
columnWidth = cWidth;
var initCount:int = TestFrame.columnState.columnCount;
columnWidth = cWidth * 2;
var endCount:int = TestFrame.columnState.columnCount;
assertTrue("expected " + Math.floor(initCount / 2) + " but got " + endCount,
Math.floor(initCount / 2) == endCount);
}
/**
* Set the width, then change the column gap to see how the column count changes.
*/
public function checkColumnCountOnGapChangeTest():void
{
var width:Number = testFrameWidth;
var cWidth:Number = width / 10;
/*paddingRight = 0;
paddingLeft = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;*/
columnGap = 0;
columnWidth = cWidth;
var initCount:Number = TestFrame.columnState.columnCount;
columnGap = cWidth / 10;
var endCount:Number = TestFrame.columnState.columnCount;
assertTrue("expected " + (initCount - 1) + " but got " + endCount,
initCount - 1 == endCount);
}
/**
* Set the column count, then change the column gap and see how the column width changes.
*/
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function checkColumnWidthOnGapChangeTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var width:Number = testFrameWidth;
var cWidth:Number = width / 10;
/*paddingRight = 0;
paddingLeft = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;*/
columnGap = 0;
columnCount = 10;
var initColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var initWidth:Number = initColumn.width;
columnGap = cWidth / 9;
var endColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var endWidth:Number = endColumn.width;
assertTrue("expected " + (initWidth - (initWidth / 10)) + " but got " + endWidth,
((initWidth - (initWidth / 10)) - endWidth) < 0.01);
}
/**
* Set the column gap, then change the column count to see how the column width changes.
*/
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function checkColumnWidthOnCountChangeTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var bp:String = TestFrame.textFlow.computedFormat.blockProgression;
var width:Number = bp == BlockProgression.TB ? testFrameWidth : testFrameHeight;
var cWidth:Number = width / 10;
/*paddingRight = 0;
paddingLeft = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;*/
columnGap = 0;
columnCount = 10;
var initColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var initWidth:Number = bp == BlockProgression.TB ? initColumn.width : initColumn.height;
columnCount = 5;
var endColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var endWidth:Number = bp == BlockProgression.TB ? endColumn.width : endColumn.height;
assertTrue("expected " + Math.floor(endWidth / 2) + " but got " + initWidth,
Math.floor(endWidth / 2) == Math.floor(initWidth));
assertTrue("expected " + Math.floor(initWidth) + " but got " + Math.floor(cWidth),
Math.floor(initWidth) == Math.floor(cWidth));
}
/**
* Set the column count, then change the column width to see how the column gap changes.
*/
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
[Ignore]
public function checkColumnGapOnWidthChangeTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var width:Number = testFrameWidth;
columnCount = 2;
columnWidth = width / 3;
var initColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var initGap:Number = width - initColumn.width * 2;
assertTrue("expected init width to equal " + width / 3 + ", but got " + columnWidth,
columnWidth == width / 3);
assertTrue("expected init count to equal " + 2 + ", but got " + columnCount,
columnCount == 2);
assertTrue("expected init gap to equal " + width / 3 + ", but got " + initGap,
Math.floor(initGap) == Math.floor(width / 3));
columnWidth = width / 2;
var endColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var endGap:Number = width - endColumn.width * 2;
assertTrue("expected " + Math.floor(width / 2) + " but got " + Math.floor(endGap),
Math.floor(endGap) == 0);
}
/**
* Set the column width, then change the column count to see how the column gap changes.
* NOTE: Currently commented out due to bug 1657149.
*/
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function checkColumnGapOnCountChangeTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var width:Number = testFrameWidth;
columnCount = 10;
var cWidth:Number = width / 10;
//to get gap by reducing column width
columnWidth = cWidth - cWidth / 9;
var initColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var initGap:Number = cWidth - initColumn.width;
//increase column count but no change to column count, gap should reduce
columnCount = 11;
cWidth = width / 11;
var endColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var endGap:Number = cWidth - endColumn.width;
assertTrue("Gap should reduce when column count increased and column width no change. ",
initGap > endGap);
}
/**
* Slowly increase the padding at the top until it pushes a line off the screen
* then verify that the last line was the line pushed off the screen.
*/
[Test(dataProvider=topPaddingSqueezeTestDp)]
public function topPaddingSqueezeTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var length:int = SelManager.textFlow.flowComposer.numLines;
var last:TextFlowLine = SelManager.textFlow.flowComposer.getLineAt(length - 1);
var size:int = last.textLength;
var count:int = TestFrame.textLength;
for (var i:int = 0; i < 1000; i++)
{
paddingTop = i;
TestFrame.textFlow.flowComposer.compose();
if (TestFrame.textLength == count - size)
{
return;
}
}
assertTrue("Expected " + size + "characters to be pushed off (the last line)" +
" but actually had " + (TestFrame.textLength - count) + "pushed off",
TestFrame.textLength != count - size);
}
/**
* Slowly increase the padding at the bottom until it eats the last line
* then verify that the last line was the line eaten.
*/
[Test(dataProvider=topPaddingSqueezeTestDp)]
public function bottomPaddingSqueezeTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
//FLEX: Why no lines?
var length:int = SelManager.textFlow.flowComposer.numLines;
var last:TextFlowLine = SelManager.textFlow.flowComposer.getLineAt(length - 1);
var size:int = last.textLength;
var count:int = TestFrame.textLength;
for (var i:int = 0; i < 1000; i++)
{
paddingBottom = i;
TestFrame.textFlow.flowComposer.compose();
if (TestFrame.textLength == count - size)
{
return;
}
}
assertTrue("Expected " + size + "characters to be pushed off (the last line)" +
" but actually had " + (TestFrame.textLength - count) + "pushed off",
TestFrame.textLength != count - size);
}
/**
* Increase the left padding until you force the flow to create a new line.
*/
[Test(dataProvider=leftPaddingSqueezeTestDp)]
public function leftPaddingSqueezeTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var length:int = SelManager.textFlow.flowComposer.numLines;
for (var i:int = 0; i < 1000; i++)
{
paddingLeft = i;
TestFrame.textFlow.flowComposer.compose();
if (SelManager.textFlow.flowComposer.numLines > length)
{
return;
}
}
assertTrue("Increasing the left padding to 1000 did not add lines",
SelManager.textFlow.flowComposer.numLines <= length);
}
/**
* Increase the right padding until you force the flow to create a new line.
*/
[Test(dataProvider=leftPaddingSqueezeTestDp)]
public function rightPaddingSqueezeTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var length:int = SelManager.textFlow.flowComposer.numLines;
for (var i:int = 0; i < 1000; i++)
{
paddingRight = i;
TestFrame.textFlow.flowComposer.compose();
if (SelManager.textFlow.flowComposer.numLines > length)
{
return;
}
}
assertTrue("Increasing the right padding to 1000 did not add lines",
SelManager.textFlow.flowComposer.numLines <= length);
}
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function writingModeBreakTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
// clear all padding on the textFlow for this test
SelManager.textFlow.paddingTop = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;
SelManager.textFlow.paddingBottom = 0;
initSize = size;
size = new Point(200, 200);
var initCounts:Array = new Array(SelManager.textFlow.flowComposer.numLines);
var initMode:String = blockProgression;
var nextMode:String = null;
if (initMode == BlockProgression.TB)
{
nextMode = BlockProgression.RL;
} else
{
nextMode = BlockProgression.TB;
}
var i:int = 0;
var numLines:int = SelManager.textFlow.flowComposer.numLines;
for (; i < numLines; i++)
{
var line:TextFlowLine = SelManager.textFlow.flowComposer.getLineAt(i);
if (line.isDamaged())
break;
initCounts[i] = line.textLength;
}
initCounts.length = i;
blockProgression = nextMode;
SelManager.flushPendingOperations();
var endCounts:Array = new Array(SelManager.textFlow.flowComposer.numLines);
i = 0;
numLines = SelManager.textFlow.flowComposer.numLines;
for (; i < numLines; i++)
{
line = SelManager.textFlow.flowComposer.getLineAt(i);
if (line.isDamaged())
break;
endCounts[i] = line.textLength;
}
endCounts.length = i;
var initCount:int = initCounts.length;
assertTrue("number of lines are not the same after changing writing direction in a square frame",
initCount == endCounts.length);
for (i = 0; i < initCount; i++)
{
assertTrue("line length of line " + i + " changed after changing writing direction in a square frame",
initCounts[i] == endCounts[i]);
}
}
/**
* This test exists solely for snapshotting.
*/
[Test(dataProvider=checkVerticalAlignTopTestDp)]
public function checkVerticalAlignTopTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var division:int =
TestFrame.textFlow.computedFormat.blockProgression ==
BlockProgression.RL ?
TestFrame.compositionWidth / 3 :
TestFrame.compositionHeight / 3;
SelManager.selectAll();
SelManager.deleteNextCharacter();
SelManager.flushPendingOperations();
SelManager.insertText("ABC");
SelManager.selectRange(2, 2);
SelManager.splitParagraph();
SelManager.selectRange(1, 1);
SelManager.splitParagraph();
SelManager.flushPendingOperations();
verticalAlign = VerticalAlign.TOP;
SelManager.flushPendingOperations();
if (TestFrame.textFlow.computedFormat.blockProgression ==
BlockProgression.RL
)
{
assertTrue(
"Vertical Alignment = TOP did not correctly place the first line.",
SelManager.textFlow.flowComposer.findLineAtPosition(1).x > -1 * division &&
SelManager.textFlow.flowComposer.findLineAtPosition(1).x < 0
);
assertTrue(
"Vertical Alignment = TOP did not correctly place the second line.",
SelManager.textFlow.flowComposer.findLineAtPosition(3).x > -1 * division &&
SelManager.textFlow.flowComposer.findLineAtPosition(3).x < 0
);
assertTrue(
"Vertical Alignment = TOP did not correctly place the third line.",
SelManager.textFlow.flowComposer.findLineAtPosition(5).x > -1 * division &&
SelManager.textFlow.flowComposer.findLineAtPosition(5).x < 0
);
} else
{
assertTrue(
"Vertical Alignment = TOP did not correctly place the first line.",
SelManager.textFlow.flowComposer.findLineAtPosition(1).y < division
);
assertTrue(
"Vertical Alignment = TOP did not correctly place the second line.",
SelManager.textFlow.flowComposer.findLineAtPosition(3).y < division
);
assertTrue(
"Vertical Alignment = TOP did not correctly place the third line.",
SelManager.textFlow.flowComposer.findLineAtPosition(5).y < division
);
}
}
/**
* This test exists solely for snapshotting.
*/
[Test(dataProvider=checkVerticalAlignBottomTestDp)]
public function checkVerticalAlignBottomTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var division:int =
TestFrame.textFlow.computedFormat.blockProgression ==
BlockProgression.RL ?
TestFrame.compositionWidth / 3 :
TestFrame.compositionHeight / 3;
SelManager.selectAll();
SelManager.deleteNextCharacter();
SelManager.flushPendingOperations();
SelManager.insertText("ABC");
SelManager.selectRange(2, 2);
SelManager.splitParagraph();
SelManager.selectRange(1, 1);
SelManager.splitParagraph();
SelManager.flushPendingOperations();
verticalAlign = VerticalAlign.BOTTOM;
SelManager.flushPendingOperations();
if (TestFrame.textFlow.computedFormat.blockProgression ==
BlockProgression.RL
)
{
assertTrue(
"Vertical Alignment = BOTTOM did not correctly place the first line.",
SelManager.textFlow.flowComposer.findLineAtPosition(1).x < -2 * division
);
assertTrue(
"Vertical Alignment = BOTTOM did not correctly place the second line.",
SelManager.textFlow.flowComposer.findLineAtPosition(3).x < -2 * division
);
assertTrue(
"Vertical Alignment = BOTTOM did not correctly place the third line.",
SelManager.textFlow.flowComposer.findLineAtPosition(5).x < -2 * division
);
} else
{
assertTrue(
"Vertical Alignment = BOTTOM did not correctly place the first line.",
SelManager.textFlow.flowComposer.findLineAtPosition(1).y > 2 * division
);
assertTrue(
"Vertical Alignment = BOTTOM did not correctly place the second line.",
SelManager.textFlow.flowComposer.findLineAtPosition(3).y > 2 * division
);
assertTrue(
"Vertical Alignment = BOTTOM did not correctly place the third line.",
SelManager.textFlow.flowComposer.findLineAtPosition(5).y > 2 * division
);
}
}
/**
* This test exists solely for snapshotting.
*/
[Test(dataProvider=checkVerticalAlignMiddleTestDp)]
public function checkVerticalAlignMiddleTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var division:int =
TestFrame.textFlow.computedFormat.blockProgression ==
BlockProgression.RL ?
TestFrame.compositionWidth / 3 :
TestFrame.compositionHeight / 3;
SelManager.selectAll();
SelManager.deleteNextCharacter();
SelManager.flushPendingOperations();
SelManager.insertText("ABC");
SelManager.selectRange(2, 2);
SelManager.splitParagraph();
SelManager.selectRange(1, 1);
SelManager.splitParagraph();
SelManager.flushPendingOperations();
verticalAlign = VerticalAlign.MIDDLE;
SelManager.flushPendingOperations();
if (TestFrame.textFlow.computedFormat.blockProgression ==
BlockProgression.RL
)
{
assertTrue(
"Vertical Alignment = MIDDLE did not correctly place the first line.",
SelManager.textFlow.flowComposer.findLineAtPosition(1).x < -1 * division &&
SelManager.textFlow.flowComposer.findLineAtPosition(1).x > -2 * division
);
assertTrue(
"Vertical Alignment = MIDDLE did not correctly place the second line.",
SelManager.textFlow.flowComposer.findLineAtPosition(3).x < -1 * division &&
SelManager.textFlow.flowComposer.findLineAtPosition(3).x > -2 * division
);
assertTrue(
"Vertical Alignment = MIDDLE did not correctly place the third line.",
SelManager.textFlow.flowComposer.findLineAtPosition(5).x < -1 * division &&
SelManager.textFlow.flowComposer.findLineAtPosition(5).x > -2 * division
);
} else
{
assertTrue(
"Vertical Alignment = MIDDLE did not correctly place the first line.",
SelManager.textFlow.flowComposer.findLineAtPosition(1).y > division &&
SelManager.textFlow.flowComposer.findLineAtPosition(1).y < 2 * division
);
assertTrue(
"Vertical Alignment = MIDDLE did not correctly place the second line.",
SelManager.textFlow.flowComposer.findLineAtPosition(3).y > division &&
SelManager.textFlow.flowComposer.findLineAtPosition(3).y < 2 * division
);
assertTrue(
"Vertical Alignment = MIDDLE did not correctly place the third line.",
SelManager.textFlow.flowComposer.findLineAtPosition(5).y > division &&
SelManager.textFlow.flowComposer.findLineAtPosition(5).y < 2 * division
);
}
}
/**
* This test exists solely for snapshotting.
*/
[Test(dataProvider=checkVerticalAlignTopTestDp)]
public function checkVerticalAlignJustifyTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var division:int =
TestFrame.textFlow.computedFormat.blockProgression ==
BlockProgression.RL ?
TestFrame.compositionWidth / 3 :
TestFrame.compositionHeight / 3;
SelManager.selectAll();
SelManager.deleteNextCharacter();
SelManager.flushPendingOperations();
SelManager.insertText("ABC");
SelManager.selectRange(2, 2);
SelManager.splitParagraph();
SelManager.selectRange(1, 1);
SelManager.splitParagraph();
SelManager.flushPendingOperations();
verticalAlign = VerticalAlign.JUSTIFY;
SelManager.flushPendingOperations();
if (TestFrame.textFlow.computedFormat.blockProgression ==
BlockProgression.RL
)
{
assertTrue(
"Vertical Alignment = JUSTIFY did not correctly place the first line.",
SelManager.textFlow.flowComposer.findLineAtPosition(1).x > -1 * division
);
assertTrue(
"Vertical Alignment = JUSTIFY did not correctly place the second line.",
SelManager.textFlow.flowComposer.findLineAtPosition(3).x < -1 * division &&
SelManager.textFlow.flowComposer.findLineAtPosition(3).x > -2 * division
);
assertTrue(
"Vertical Alignment = JUSTIFY did not correctly place the third line.",
SelManager.textFlow.flowComposer.findLineAtPosition(5).x < -2 * division
);
} else
{
assertTrue(
"Vertical Alignment = JUSTIFY did not correctly place the first line.",
SelManager.textFlow.flowComposer.findLineAtPosition(1).y < division
);
assertTrue(
"Vertical Alignment = JUSTIFY did not correctly place the second line.",
SelManager.textFlow.flowComposer.findLineAtPosition(3).y > division &&
SelManager.textFlow.flowComposer.findLineAtPosition(3).y < 2 * division
);
assertTrue(
"Vertical Alignment = JUSTIFY did not correctly place the third line.",
SelManager.textFlow.flowComposer.findLineAtPosition(5).y > 2 * division
);
}
}
// non-empty flow, check if attribute changed after insertion point at position 0
[Test(dataProvider=leftPaddingSqueezeTestDp)]
public function insertPos0CheckColumnWidthTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var bp:String = TestFrame.textFlow.computedFormat.blockProgression;
var width:Number = bp == BlockProgression.TB ? testFrameWidth : testFrameHeight;
var cWidth:Number = width / 10;
columnGap = 0;
columnCount = 10;
var initColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var initWidth:Number = bp == BlockProgression.TB ? initColumn.width : initColumn.height;
SelManager.selectRange(0, 0);
SelManager.insertText("BBB");
SelManager.updateAllControllers();
var endColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var endWidth:Number = bp == BlockProgression.TB ? endColumn.width : endColumn.height;
assertTrue("Container attribute got changed, expected column width " + initWidth + " but got " + cWidth,
initWidth == endWidth);
}
//check if container attribute change after insertion in an empty flow
[Test(dataProvider=leftPaddingSqueezeTestDp)]
public function checkColumnCountEmptyFlowInsertTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var width:Number = testFrameWidth;
var cWidth:Number = width / 10;
columnGap = 0;
columnWidth = cWidth;
var initCount:Number = TestFrame.columnState.columnCount;
//insert text in a empty flow
SelManager.selectAll();
SelManager.deleteText();
SelManager.insertText("AAAAAAAAAAAAAA");
SelManager.updateAllControllers();
var endCount:Number = TestFrame.columnState.columnCount;
assertTrue("container attribute has been changed, expected colume count is" + initCount + " but got " + endCount,
initCount == endCount);
}
// non-empty flow, check if attribute changed after insertion point at end position
[Test(dataProvider=leftPaddingSqueezeTestDp)]
public function insertAtEndOfFlowCheckColumnGapTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var bp:String = TestFrame.textFlow.computedFormat.blockProgression;
var width:Number = testFrameWidth;
columnCount = 2;
columnWidth = width / 3;
var initColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var initGap:Number = bp == BlockProgression.TB ? (width - initColumn.width * 2) : (width - initColumn.height * 2);
var len:int = SelManager.textFlow.textLength;
SelManager.selectRange(len, len);
SelManager.insertText("BBB");
SelManager.updateAllControllers();
var endColumn:Rectangle = TestFrame.columnState.getColumnAt(0);
var endGap:Number = bp == BlockProgression.TB ? (width - endColumn.width * 2) : (width - endColumn.height * 2);
assertTrue("Container attribute got changed, expected column gap " + initGap + " but got " + endGap,
initGap == endGap);
}
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function columnBreakTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var TestCanvas:Canvas = myEmptyChilds();
var FORMAT1_BB:int = 1;
var FORMAT1_BA:int = 2;
var FORMAT2_BB:int = 4;
var FORMAT2_BA:int = 8;
var FORMAT3_BB:int = 16;
var FORMAT3_BA:int = 32;
var tlFmt1:TextLayoutFormat = new TextLayoutFormat();
var tlFmt2:TextLayoutFormat = new TextLayoutFormat();
var tlFmt3:TextLayoutFormat = new TextLayoutFormat();
var columnWidth:int = 600;
for (var i:int = 0; i < 64; i++)
{
tlFmt1.columnBreakBefore = (FORMAT1_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt1.columnBreakAfter = (FORMAT1_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt2.columnBreakBefore = (FORMAT2_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt2.columnBreakAfter = (FORMAT2_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt3.columnBreakBefore = (FORMAT3_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt3.columnBreakAfter = (FORMAT3_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
var cb:ColumnBreak = new ColumnBreak(columnWidth, tlFmt1, tlFmt2, tlFmt3);
TestCanvas.rawChildren.addChild(cb);
// Verify test results
var textFlow:TextFlow = cb.textFlow;
var columnWidthModify:int = columnWidth / 3;
var numLines:int = textFlow.flowComposer.numLines;
for (var j:int = 0; j < numLines; j++)
{
var textFlowLine:TextFlowLine = textFlow.flowComposer.getLineAt(j);
var textLine:TextLine = textFlowLine.getTextLine();
var text:String = textLine.textBlock.content.text;
var textLineBounds:Rectangle = textFlowLine.getTextLine().getBounds(cb);
// Assert for STR1's position
if (j == 0)
assertTrue(isBetween(textLineBounds.x, 0, columnWidthModify));
// Assert for STR2's position
var isStr2InColumn1:Boolean = true;
if (tlFmt1.columnBreakAfter == BreakStyle.ALWAYS || tlFmt2.columnBreakBefore == BreakStyle.ALWAYS)
isStr2InColumn1 = false;
if (text.search("STR2") >= 0)
{
if (isStr2InColumn1)
assertTrue(isBetween(textLineBounds.x, 0, columnWidthModify));
else
assertTrue(isBetween(textLineBounds.x, columnWidthModify, columnWidthModify * 2));
}
// Assert for STR3's position
if (text.search("STR3") >= 0)
{
if (isStr2InColumn1)
{
if (tlFmt2.columnBreakAfter == BreakStyle.ALWAYS || tlFmt3.columnBreakBefore == BreakStyle.ALWAYS)
assertTrue(isBetween(textLineBounds.x, columnWidthModify, columnWidthModify * 2));
else
assertTrue(isBetween(textLineBounds.x, 0, columnWidthModify));
}
else
{
if (tlFmt2.columnBreakAfter == BreakStyle.ALWAYS || tlFmt3.columnBreakBefore == BreakStyle.ALWAYS)
assertTrue(isBetween(textLineBounds.x, columnWidthModify * 2, columnWidthModify * 3));
else
assertTrue(isBetween(textLineBounds.x, columnWidthModify, columnWidthModify * 2));
}
}
}
}
}
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function containerBreakTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var TestCanvas:Canvas = myEmptyChilds();
var FORMAT1_BB:int = 1;
var FORMAT1_BA:int = 2;
var FORMAT2_BB:int = 4;
var FORMAT2_BA:int = 8;
var FORMAT3_BB:int = 16;
var FORMAT3_BA:int = 32;
var tlFmt1:TextLayoutFormat = new TextLayoutFormat();
var tlFmt2:TextLayoutFormat = new TextLayoutFormat();
var tlFmt3:TextLayoutFormat = new TextLayoutFormat();
var containerWidth:int = 200;
for (var i:int = 0; i < 64; i++)
{
tlFmt1.containerBreakBefore = (FORMAT1_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt1.containerBreakAfter = (FORMAT1_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt2.containerBreakBefore = (FORMAT2_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt2.containerBreakAfter = (FORMAT2_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt3.containerBreakBefore = (FORMAT3_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt3.containerBreakAfter = (FORMAT3_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
var cb:ContainerBreak = new ContainerBreak(containerWidth, tlFmt1, tlFmt2, tlFmt3);
TestCanvas.rawChildren.addChild(cb);
// Verify test results
var textFlow:TextFlow = cb.textFlow;
var numLines:int = textFlow.flowComposer.numLines;
for (var j:int = 0; j < numLines; j++)
{
var textFlowLine:TextFlowLine = textFlow.flowComposer.getLineAt(j);
var textLine:TextLine = textFlowLine.getTextLine();
var text:String = textLine.textBlock.content.text;
var textLineBounds:Rectangle = textFlowLine.getTextLine().getBounds(cb);
// Assert for STR1's position
if (j == 0)
assertTrue(isBetween(textLineBounds.x, 0, containerWidth));
// Assert for STR2's position
var isStr2InColumn1:Boolean = true;
if (tlFmt1.containerBreakAfter == BreakStyle.ALWAYS || tlFmt2.containerBreakBefore == BreakStyle.ALWAYS)
isStr2InColumn1 = false;
if (text.search("STR2") >= 0)
{
if (isStr2InColumn1)
assertTrue(isBetween(textLineBounds.x, 0, containerWidth));
else
assertTrue(isBetween(textLineBounds.x, containerWidth, containerWidth * 2));
}
// Assert for STR3's position
if (text.search("STR3") >= 0)
{
if (isStr2InColumn1)
{
if (tlFmt2.containerBreakAfter == BreakStyle.ALWAYS || tlFmt3.containerBreakBefore == BreakStyle.ALWAYS)
assertTrue(isBetween(textLineBounds.x, containerWidth, containerWidth * 2));
else
assertTrue(isBetween(textLineBounds.x, 0, containerWidth));
}
else
{
if (tlFmt2.containerBreakAfter == BreakStyle.ALWAYS || tlFmt3.containerBreakBefore == BreakStyle.ALWAYS)
assertTrue(isBetween(textLineBounds.x, containerWidth * 2, containerWidth * 3));
else
assertTrue(isBetween(textLineBounds.x, containerWidth, containerWidth * 2));
}
}
}
}
}
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function columnContainerBreakTest0(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
columnContainerBreakTestX(0);
}
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function columnContainerBreakTest1000(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
columnContainerBreakTestX(1000);
}
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function columnContainerBreakTest2000(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
columnContainerBreakTestX(2000);
}
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function columnContainerBreakTest3000(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
columnContainerBreakTestX(3000);
}
[Test(dataProvider=checkColumnWidthOnGapChangeTestDp)]
public function columnContainerBreakTest4000(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
columnContainerBreakTestX(4000);
}
public function columnContainerBreakTestX(startIdx:int):void
{
var TestCanvas:Canvas = myEmptyChilds();
var tlFmt1:TextLayoutFormat = new TextLayoutFormat();
var tlFmt2:TextLayoutFormat = new TextLayoutFormat();
var tlFmt3:TextLayoutFormat = new TextLayoutFormat();
var FORMAT1_COL_BB:int = 1;
var FORMAT1_COL_BA:int = 2;
var FORMAT1_CON_BB:int = 4;
var FORMAT1_CON_BA:int = 8;
var FORMAT2_COL_BB:int = 16;
var FORMAT2_COL_BA:int = 32;
var FORMAT2_CON_BB:int = 64;
var FORMAT2_CON_BA:int = 128;
var FORMAT3_COL_BB:int = 256;
var FORMAT3_COL_BA:int = 512;
var FORMAT3_CON_BB:int = 1024;
var FORMAT3_CON_BA:int = 2048;
var containerWidth:int = 300;
for (var i:int = startIdx; i < startIdx + 1000; i++)
{
if (i >= 4096)
break;
TestCanvas = myEmptyChilds();
tlFmt1.columnBreakBefore = (FORMAT1_COL_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt1.columnBreakAfter = (FORMAT1_COL_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt1.containerBreakBefore = (FORMAT1_CON_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt1.containerBreakAfter = (FORMAT1_CON_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt2.columnBreakBefore = (FORMAT2_COL_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt2.columnBreakAfter = (FORMAT2_COL_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt2.containerBreakBefore = (FORMAT2_CON_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt2.containerBreakAfter = (FORMAT2_CON_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt3.columnBreakBefore = (FORMAT3_COL_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt3.columnBreakAfter = (FORMAT3_COL_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt3.containerBreakBefore = (FORMAT3_CON_BB & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
tlFmt3.containerBreakAfter = (FORMAT3_CON_BA & i) ? BreakStyle.ALWAYS : BreakStyle.AUTO;
var cb:ColumnContainerBreak = new ColumnContainerBreak(containerWidth, tlFmt1, tlFmt2, tlFmt3);
TestCanvas.rawChildren.addChild(cb);
// Verify test results
var textFlow:TextFlow = cb.textFlow;
var bStr2Checked:Boolean = false;
var bStr3Checked:Boolean = false;
var numLines:int = textFlow.flowComposer.numLines;
for (var j:int = 0; j < numLines; j++)
{
var textFlowLine:TextFlowLine = textFlow.flowComposer.getLineAt(j);
var textLine:TextLine = textFlowLine.getTextLine();
var text:String = textLine.textBlock.content.text;
var textLineBounds:Rectangle = textFlowLine.getTextLine().getBounds(cb);
// Assert for STR1's position
if (j == 0)
assertTrue(isBetween(textLineBounds.x, 0, containerWidth));
// Assert for STR2's position,
// str2Pos = 1 means str2 in container1, column1
// str2Pos = 2 means str2 in container1, column2
// str2Pos = 3 means str2 in container2, column1
var str2Pos:int = 1;
if (tlFmt1.containerBreakAfter == BreakStyle.ALWAYS || tlFmt2.containerBreakBefore == BreakStyle.ALWAYS)
str2Pos = 3;
else if (tlFmt1.columnBreakAfter == BreakStyle.ALWAYS || tlFmt2.columnBreakBefore == BreakStyle.ALWAYS)
str2Pos = 2;
var columnWidth:int = containerWidth / 3;
if (!bStr2Checked && text.search("STR2") >= 0)
{
bStr2Checked = true;
switch (str2Pos)
{
case 1:
assertTrue(isBetween(textLineBounds.x, 0, columnWidth));
break;
case 2:
assertTrue(isBetween(textLineBounds.x, columnWidth, columnWidth * 2));
break;
case 3:
assertTrue(isBetween(textLineBounds.x, containerWidth, containerWidth + columnWidth));
break;
default:
break;
}
}
// Assert for STR3's position
if (!bStr3Checked && text.search("STR3") >= 0)
{
bStr3Checked = true;
var isStr3ColumnBreak:Boolean = false;
var isStr3ContainerBreak:Boolean = false;
if (tlFmt2.columnBreakAfter == BreakStyle.ALWAYS || tlFmt3.columnBreakBefore == BreakStyle.ALWAYS)
isStr3ColumnBreak = true;
if (tlFmt2.containerBreakAfter == BreakStyle.ALWAYS || tlFmt3.containerBreakBefore == BreakStyle.ALWAYS)
isStr3ContainerBreak = true;
// str3Pos = 1 means str3 in container1, column1
// str3Pos = 2 means str3 in container1, column2
// str3Pos = 3 means str3 in container1, column3
// str3Pos = 4 means str3 in container2, column1
// str3Pos = 5 means str3 in container2, column2
// str3Pos = 6 means str3 in container3, column1
var str3Pos:int = 0;
switch (str2Pos)
{
case 1:
if (!isStr3ContainerBreak && !isStr3ColumnBreak)
str3Pos = 1;
if (!isStr3ContainerBreak && isStr3ColumnBreak)
str3Pos = 2;
if (isStr3ContainerBreak)
str3Pos = 4;
break;
case 2:
if (!isStr3ContainerBreak && !isStr3ColumnBreak)
str3Pos = 2;
if (!isStr3ContainerBreak && isStr3ColumnBreak)
str3Pos = 3;
if (isStr3ContainerBreak)
str3Pos = 4;
break;
case 3:
if (!isStr3ContainerBreak && !isStr3ColumnBreak)
str3Pos = 4;
if (!isStr3ContainerBreak && isStr3ColumnBreak)
str3Pos = 5;
if (isStr3ContainerBreak)
str3Pos = 6;
break;
default :
break;
}
switch (str3Pos)
{
case 1:
assertTrue(isBetween(textLineBounds.x, 0, columnWidth));
break;
case 2:
assertTrue(isBetween(textLineBounds.x, columnWidth, columnWidth * 2));
break;
case 3:
assertTrue(isBetween(textLineBounds.x, columnWidth * 2, columnWidth * 3));
break;
case 4:
assertTrue(isBetween(textLineBounds.x, containerWidth, containerWidth + columnWidth));
break;
case 5:
assertTrue(isBetween(textLineBounds.x, containerWidth + columnWidth, containerWidth + columnWidth * 2));
break;
case 6:
assertTrue(isBetween(textLineBounds.x, containerWidth * 2, containerWidth * 2 + columnWidth));
break;
default :
break;
}
}
}
}
}
public function myEmptyChilds():Canvas
{
var TestCanvas:Canvas = null;
TestDisplayObject = testApp.getDisplayObject();
if (TestDisplayObject)
{
TestCanvas = Canvas(TestDisplayObject);
TestCanvas.removeAllChildren();
var iCnt:int = TestCanvas.numChildren;
for (var a:int = 0; a < iCnt; a++)
{
TestCanvas.rawChildren.removeChildAt(0);
}
}
return TestCanvas;
}
// mjzhang : Watson Bug#2841799 When lineBreak="toFit" the contentBounds width does
// not include the trailing whitespace
[Test(dataProvider=contentBoundsWithWhitespacesDp)]
public function ContentBoundsWithWhitespaces(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
// This is the switch for calculate whitespace or not regardless lineBreak="toFix".
GlobalSettings.alwaysCalculateWhitespaceBounds = true;
SelManager.selectAll();
SelManager.deleteText();
SelManager.insertText("AAAAAAAAAAAAAA");
SelManager.updateAllControllers();
var textFlowLine:TextFlowLine = SelManager.textFlow.flowComposer.getLineAt(0);
var textLength:Number = textFlowLine.lineExtent;
var contentBounds:Number = SelManager.textFlow.flowComposer.getControllerAt(0).getContentBounds().width;
SelManager.selectAll();
SelManager.deleteText();
SelManager.insertText("AAAAAAAAAAAAAA ");
SelManager.updateAllControllers();
var textFlowLine1:TextFlowLine = SelManager.textFlow.flowComposer.getLineAt(0);
var textWithSpace:Number = textFlowLine1.lineExtent;
var contentBoundsWithSpace:Number = SelManager.textFlow.flowComposer.getControllerAt(0).getContentBounds().width;
// mjzhang : if the blockProgression is RL, we needs to check the height, not the width.
if (SelManager.textFlow.blockProgression == BlockProgression.RL)
{
textWithSpace = textFlowLine1.lineExtent;
contentBoundsWithSpace = SelManager.textFlow.flowComposer.getControllerAt(0).getContentBounds().height;
}
GlobalSettings.alwaysCalculateWhitespaceBounds = false;
assertTrue("With spaces text length should larger than no spaces text length.",
textWithSpace > textLength);
assertTrue("With spaces text length should larger than no spaces text length.",
contentBoundsWithSpace > contentBounds);
}
// mjzhang : Bug#2835316 The TextLine is INVALID and cannot be used to access the current state of the TextBlock
[Test(dataProvider=contentBoundsWithWhitespacesDp)]
public function TextSelectAllTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var textFlow:TextFlow = SelManager.textFlow;
var markup:String = '<TextFlow whiteSpaceCollapse="preserve" version="3.0.0" xmlns="http://ns.adobe.com/textLayout/2008"><p><span>hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh</span></p></TextFlow>';
var textFlowNew:TextFlow = TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT);
var textLayoutFormat:TextLayoutFormat = new TextLayoutFormat();
textLayoutFormat.fontSize = 12;
textLayoutFormat.textIndent = 0;
textLayoutFormat.paragraphSpaceAfter = 5;
textLayoutFormat.fontFamily = "Arial";
var paraElement:ParagraphElement = textFlowNew.getChildAt(0) as ParagraphElement;
var paraElementCopy:ParagraphElement = paraElement.deepCopy(0, paraElement.textLength) as ParagraphElement;
paraElementCopy.format = textLayoutFormat;
textFlow.replaceChildren(0, textFlow.numChildren, paraElementCopy);
textFlow.whiteSpaceCollapse = "preserve";
textFlow.flowComposer.updateAllControllers();
var cc:ContainerController = SelManager.textFlow.flowComposer.getControllerAt(0);
cc.setCompositionSize(229, 81);
cc.verticalScrollPolicy = ScrollPolicy.ON;
cc.horizontalScrollPolicy = ScrollPolicy.ON;
SelManager.selectRange(40, 40);
var mouseEvent:MouseEvent = new MouseEvent(MouseEvent.DOUBLE_CLICK, true, false, 80, 80);
TestFrame.container["dispatchEvent"](mouseEvent);
SelManager.flushPendingOperations();
}
// mjzhang : Bug#2898924 TLF reports incorrect content height after composition when floats are used with padding
[Test(dataProvider=hBeamCursorTestDp)]
public function ContentBoundsWithPaddingTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
// Get image content height which has padding top set
var textFlow:TextFlow = SelManager.textFlow;
var markup:String = '<TextFlow fontFamily="Arial" fontSize="16" paddingBottom="2" paddingLeft="2" paddingRight="2" paddingTop="2" whiteSpaceCollapse="preserve" version="2.0.0" xmlns="http://ns.adobe.com/textLayout/2008"><p><img paddingTop="-100" paddingLeft="50" height="auto" width="auto" source="http://flex.apache.org/images/logo_01_fullcolor-sm.png" float="left"/><span fontFamily="Georgia" fontSize="24">La Cité Libreria Cafè</span></p></TextFlow>';
var textFlowNew:TextFlow = TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT);
textFlow.addEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE, statusChangeHandler);
var paraElement:ParagraphElement = textFlowNew.getChildAt(0) as ParagraphElement;
var paraElementCopy:ParagraphElement = paraElement.deepCopy(0, paraElement.textLength) as ParagraphElement;
textFlow.replaceChildren(0, textFlow.numChildren, paraElementCopy);
textFlow.flowComposer.updateAllControllers();
SelManager.updateAllControllers();
}
// mjzhang : Track the completion of loading inlines
private function statusChangeHandler(obj:Event):void
{
var event:StatusChangeEvent = StatusChangeEvent(obj);
var textFlow:TextFlow = event.element.getTextFlow();
switch (event.status)
{
case InlineGraphicElementStatus.LOADING:
break;
case InlineGraphicElementStatus.SIZE_PENDING:
textFlow.removeEventListener(StatusChangeEvent.INLINE_GRAPHIC_STATUS_CHANGE, statusChangeHandler);
var contentHeight:int = textFlow.flowComposer.getControllerAt(0).getContentBounds().height;
var contentWidth:int = textFlow.flowComposer.getControllerAt(0).getContentBounds().width;
assertTrue("Content height should calculate padding info of inlinegraphic, should be 44", contentHeight == 44);
assertTrue("Content width should calculate padding info of inlinegraphic, should be 670", contentWidth == 669);
break;
case InlineGraphicElementStatus.READY:
break;
default:
break;
}
}
// mjzhang : Bug#2758977 <s:p color="red"/> throws out of range error - can you do color lookup like Flex SDK?
// Tests all the color options, also test Upper case and bad case(XXX)
[Test(dataProvider=contentBoundsWithWhitespacesDp)]
public function colorPropetyTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var textFlow:TextFlow = SelManager.textFlow;
var markup:String = '<TextFlow xmlns="http://ns.adobe.com/textLayout/2008">'
+ '<p color="black"><span>black</span></p>'
+ '<p color="blue"><span>blue</span></p>'
+ '<p color="green"><span>green</span></p>'
+ '<p color="gray"><span>gray</span></p>'
+ '<p color="silver"><span>silver</span></p>'
+ '<p color="lime"><span>lime</span></p>'
+ '<p color="olive"><span>olive</span></p>'
+ '<p color="white"><span>white</span></p>'
+ '<p color="yellow"><span>yellow</span></p>'
+ '<p color="maroon"><span>maroon</span></p>'
+ '<p color="navy"><span>navy</span></p>'
+ '<p color="red"><span>Red</span></p>'
+ '<p color="purple"><span>purple</span></p>'
+ '<p color="teal"><span>teal</span></p>'
+ '<p color="fuchsia"><span>fuchsia</span></p>'
+ '<p color="aqua"><span>aqua</span></p>'
+ '<p color="magenta"><span>magenta</span></p>'
+ '<p color="cyan"><span>cyan</span></p>'
+ '<p color="CYAN"><span>CYAN</span></p>'
+ '<p color="XXX"><span>XXX</span></p>'
+ '</TextFlow>';
var textFlowNew:TextFlow = TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT);
SelManager.selectAll();
SelManager.deleteText();
for (var i:int = 0; i < 20; i++)
{
var paraElement:ParagraphElement = textFlowNew.getChildAt(i) as ParagraphElement;
var paraElementCopy:ParagraphElement = paraElement.deepCopy(0, paraElement.textLength) as ParagraphElement;
textFlow.replaceChildren(i, i, paraElementCopy);
}
SelManager.updateAllControllers();
var paraBlack:ParagraphElement = textFlow.getChildAt(0) as ParagraphElement;
var paraBlue:ParagraphElement = textFlow.getChildAt(1) as ParagraphElement;
var paraGreen:ParagraphElement = textFlow.getChildAt(2) as ParagraphElement;
var paraGray:ParagraphElement = textFlow.getChildAt(3) as ParagraphElement;
var paraSilver:ParagraphElement = textFlow.getChildAt(4) as ParagraphElement;
var paraLime:ParagraphElement = textFlow.getChildAt(5) as ParagraphElement;
var paraOlive:ParagraphElement = textFlow.getChildAt(6) as ParagraphElement;
var paraWhite:ParagraphElement = textFlow.getChildAt(7) as ParagraphElement;
var paraYellow:ParagraphElement = textFlow.getChildAt(8) as ParagraphElement;
var paraMaroon:ParagraphElement = textFlow.getChildAt(9) as ParagraphElement;
var paraNavy:ParagraphElement = textFlow.getChildAt(10) as ParagraphElement;
var paraRed:ParagraphElement = textFlow.getChildAt(11) as ParagraphElement;
var paraPurple:ParagraphElement = textFlow.getChildAt(12) as ParagraphElement;
var paraTeal:ParagraphElement = textFlow.getChildAt(13) as ParagraphElement;
var paraFuchsia:ParagraphElement = textFlow.getChildAt(14) as ParagraphElement;
var paraAqua:ParagraphElement = textFlow.getChildAt(15) as ParagraphElement;
var paraMagenta:ParagraphElement = textFlow.getChildAt(16) as ParagraphElement;
var paraCyan:ParagraphElement = textFlow.getChildAt(17) as ParagraphElement;
var paraCYAN:ParagraphElement = textFlow.getChildAt(18) as ParagraphElement;
var paraXXX:ParagraphElement = textFlow.getChildAt(19) as ParagraphElement;
assertTrue("Paragraph color value should be equal", paraBlack.format.color == ColorName.BLACK);
assertTrue("Paragraph color value should be equal", paraBlue.format.color == ColorName.BLUE);
assertTrue("Paragraph color value should be equal", paraGreen.format.color == ColorName.GREEN);
assertTrue("Paragraph color value should be equal", paraGray.format.color == ColorName.GRAY);
assertTrue("Paragraph color value should be equal", paraSilver.format.color == ColorName.SILVER);
assertTrue("Paragraph color value should be equal", paraLime.format.color == ColorName.LIME);
assertTrue("Paragraph color value should be equal", paraOlive.format.color == ColorName.OLIVE);
assertTrue("Paragraph color value should be equal", paraWhite.format.color == ColorName.WHITE);
assertTrue("Paragraph color value should be equal", paraYellow.format.color == ColorName.YELLOW);
assertTrue("Paragraph color value should be equal", paraMaroon.format.color == ColorName.MAROON);
assertTrue("Paragraph color value should be equal", paraNavy.format.color == ColorName.NAVY);
assertTrue("Paragraph color value should be equal", paraRed.format.color == ColorName.RED);
assertTrue("Paragraph color value should be equal", paraPurple.format.color == ColorName.PURPLE);
assertTrue("Paragraph color value should be equal", paraTeal.format.color == ColorName.TEAL);
assertTrue("Paragraph color value should be equal", paraFuchsia.format.color == ColorName.FUCHSIA);
assertTrue("Paragraph color value should be equal", paraAqua.format.color == ColorName.AQUA);
assertTrue("Paragraph color value should be equal", paraMagenta.format.color == ColorName.MAGENTA);
assertTrue("Paragraph color value should be equal", paraCyan.format.color == ColorName.CYAN);
assertTrue("Paragraph color value should be equal", paraCYAN.format.color == undefined);
assertTrue("Paragraph color value should be equal", paraXXX.format.color == undefined);
}
private function myHBeamCursorFunction(value:String):String
{
var cursorPoints:Vector.<Number>;
var cursorCommands:Vector.<int>;
// mjzhang : IBEAM cursor have different appearence on Mac and Win, so we draw HBEAM differently
if (Capabilities.os.search("Mac OS") > -1)
{
cursorPoints = new <Number>[0, 0, 0, 1, 3, 4, 3, 4, 0, 7, 0, 8, 3, 4, 16, 4, 19, 0, 19, 1, 17, 4, 17, 4, 19, 7, 19, 8, 10, 3, 10, 6];
cursorCommands = new <int>[1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2];
}
else
{
cursorPoints = new <Number>[0, 0, 0, 4, 0, 5, 0, 9, 1, 4, 17, 4, 17, 0, 17, 4, 17, 5, 17, 9];
cursorCommands = new <int>[1, 2, 1, 2, 1, 2, 1, 2, 1, 2];
}
var cursorShape:Shape = new Shape();
cursorShape.graphics.beginFill(0x000000, 1.0);
cursorShape.graphics.lineStyle(1);
cursorShape.graphics.drawPath(cursorCommands, cursorPoints);
cursorShape.graphics.endFill();
var cursorBmp:BitmapData = new BitmapData(20, 10, true, 0);
cursorBmp.draw(cursorShape);
var cursorData:Vector.<BitmapData> = new Vector.<BitmapData>();
cursorData.push(cursorBmp);
var MouseCursorDataClass:Class;
try
{
MouseCursorDataClass = getDefinitionByName("flash.ui.MouseCursorData") as Class;
}
catch (e:Error)
{
}
if (MouseCursorDataClass)
{
var mouseCursorData:Object = new MouseCursorDataClass();
mouseCursorData.data = cursorData;
mouseCursorData.hotSpot = new Point(10, 5);
var registerCursor:Function = Mouse["registerCursor"];
if (Mouse["registerCursor"] != undefined)
{
registerCursor("hbeam", mouseCursorData);
}
}
return "hbeam";
}
[Test(dataProvider=hBeamCursorTestDp)]
public function HBeamCursorTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
SelManager.selectAll();
SelManager.deleteText();
var markup:String = '<TextFlow whiteSpaceCollapse="preserve" version="2.0.0" xmlns="http://ns.adobe.com/textLayout/2008"><p paddingBottom="25"><span>Move your mouse over this text to see custom cursor</span></p></TextFlow>';
var config:Configuration = new Configuration();
config.cursorFunction = myHBeamCursorFunction;
var textFlow:TextFlow = TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT, config);
textFlow.blockProgression = BlockProgression.RL;
textFlow.interactionManager = new EditManager();
var sprite:Sprite = new Sprite();
textFlow.flowComposer.addController(new ContainerController(sprite, 400, 200));
textFlow.flowComposer.updateAllControllers();
var testCanvas:Canvas = myEmptyChilds();
testCanvas.rawChildren.addChild(sprite);
}
// mjzhang : Bug#2907691 When composition starts in middle of the container, paddingBottom for the previous paragraph is ignored
[Ignore][Test(dataProvider=hBeamCursorTestDp)]
public function paddingBottomTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var textFlow:TextFlow = SelManager.textFlow;
var markup:String = '<TextFlow whiteSpaceCollapse="preserve" version="2.0.0" xmlns="http://ns.adobe.com/textLayout/2008"><p paddingBottom="25"><span>para1</span></p><p paddingBottom="25"><span>para2</span></p><p paddingBottom="25"><span>para3</span></p></TextFlow>';
var textFlowNew:TextFlow = TextConverter.importToFlow(markup, TextConverter.TEXT_LAYOUT_FORMAT);
textFlow.replaceChildren(0, textFlow.numChildren, textFlowNew.mxmlChildren);
SelManager.updateAllControllers();
SelManager.selectRange(100, 100);
SelManager.insertText("aaa");
SelManager.textFlow.flowComposer.compose();
var textFlowLine:TextFlowLine = SelManager.textFlow.flowComposer.getLineAt(2);
var canvas:Canvas = Canvas(testApp.getDisplayObject());
var textLineBounds:Rectangle = textFlowLine.getTextLine().getBounds(canvas);
assertTrue("Paragraph3's top value should be 87.55, but was " + textLineBounds.top, Math.abs(textLineBounds.top - 87.55) < 0.001);
}
//Fix bug 2869747 using TextFlow.flowComposer and ContainerController, displayed text is incorrectly masked
[Test(dataProvider=checkVerticalAlignMiddleTestDp)]
public function scrollRectTest(testCaseVo:TestCaseVo):void
{
currentTestCaseVo = testCaseVo;
setUpTest();
var textFlow:TextFlow = SelManager.textFlow;
var container:Sprite = textFlow.flowComposer.getControllerAt(0).container as Sprite;
textFlow.flowComposer.addController(new ContainerController(container, 200, 100));
textFlow.flowComposer.updateAllControllers();
textFlow.flowComposer.removeAllControllers();
textFlow.flowComposer.addController(new ContainerController(container, 500, 500));
textFlow.flowComposer.updateAllControllers();
}
private function isBetween(item:int, x1:int, x2:int):Boolean
{
return item >= x1 && item <= x2;
}
}
}