blob: 74d3bfb469e4725ec5cadc00f64a568007e6cd24 [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.TestSuiteExtended;
import UnitTest.ExtendedClasses.VellumTestCase;
import UnitTest.Fixtures.TestConfig;
import flash.display.DisplayObject;
import flash.text.engine.TextLine;
import flashx.textLayout.container.ContainerController;
import flashx.textLayout.formats.BlockProgression;
import flashx.textLayout.formats.Direction;
public class WritingModeTest extends VellumTestCase
{
public function WritingModeTest(methodName:String, testID:String, testConfig:TestConfig, testCaseXML:XML=null)
{
super(methodName, testID, testConfig, testCaseXML);
// Note: These must correspond to a Watson product area (case-sensitive)
metaData.productArea = "Text Container";
metaData.productSubArea = "Text Direction";
}
public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void
{
var testCaseClass:Class = WritingModeTest;
VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts);
}
// test each writingMode with two columns setting them on the TextFlow
// have to clear any container overrides - not sure how they got there.
public function japaneseAttrib():void
{
SelManager.selectRange(0,0);
SelManager.flushPendingOperations();
SelManager.textFlow.blockProgression = BlockProgression.RL;
SelManager.textFlow.columnCount = 2;
SelManager.textFlow.direction = Direction.LTR;
assertTrue(true, SelManager.textFlow.format.blockProgression == BlockProgression.RL);
assertTrue(true, SelManager.textFlow.computedFormat.blockProgression == BlockProgression.RL);
}
public function arabicAttrib():void
{
SelManager.selectRange(0,0);
SelManager.flushPendingOperations();
SelManager.textFlow.blockProgression = BlockProgression.TB;
SelManager.textFlow.columnCount = 2;
SelManager.textFlow.direction = Direction.RTL;
assertTrue(true, SelManager.textFlow.format.blockProgression == BlockProgression.TB );
assertTrue(true, SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB );
}
public function romanAttrib():void
{
SelManager.selectRange(0,0);
SelManager.flushPendingOperations();
SelManager.textFlow.blockProgression = BlockProgression.TB;
SelManager.textFlow.columnCount = 2;
SelManager.textFlow.direction = Direction.LTR;
assertTrue(true, SelManager.textFlow.format.blockProgression == BlockProgression.TB );
assertTrue(true, SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB );
}
// No writing system uses this, but it's still a possible combination
public function rtlAttrib():void
{
SelManager.selectRange(0,0);
SelManager.flushPendingOperations();
SelManager.textFlow.blockProgression = BlockProgression.RL;
SelManager.textFlow.columnCount = 2;
SelManager.textFlow.direction = Direction.RTL;
assertTrue(true, SelManager.textFlow.format.blockProgression == BlockProgression.RL);
assertTrue(true, SelManager.textFlow.computedFormat.blockProgression == BlockProgression.RL);
}
// Test BlockProgression.RL + Direction.LTR
public function japanesePositioning():void
{
// Force the intended text positioning
SelManager.textFlow.blockProgression = BlockProgression.RL;
SelManager.textFlow.direction = Direction.LTR;
SelManager.textFlow.paddingBottom = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;
SelManager.textFlow.paddingTop = 0;
SelManager.textFlow.columnCount = 2;
SelManager.textFlow.columnGap = 0;
// Create a new paragraph in the second column
SelManager.selectRange(1842,1842);
SelManager.splitParagraph();
SelManager.flushPendingOperations();
// Get the posititioning of the first and second columns
var x1:int = SelManager.textFlow.flowComposer.findLineAtPosition(0).x;
var y1:int = SelManager.textFlow.flowComposer.findLineAtPosition(0).y;
var x2:int = SelManager.textFlow.flowComposer.findLineAtPosition(1843).x;
var y2:int = SelManager.textFlow.flowComposer.findLineAtPosition(1843).y;
assertTrue(
"BlockProgression: BP: R to L, Direction: L to R placed text in an incorrect direction.",
x1 == x2
);
assertTrue(
"BlockProgression: BP: R to L, Direction: L to R placed text in an incorrect direction.",
y1 < y2
);
}
// Test BlockProgression.TB + Direction.LTR
public function romanPositioning():void
{
// Force the intended text positioning
SelManager.textFlow.blockProgression = BlockProgression.TB;
SelManager.textFlow.direction = Direction.LTR;
SelManager.textFlow.paddingBottom = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;
SelManager.textFlow.paddingTop = 0;
SelManager.textFlow.columnCount = 2;
SelManager.textFlow.columnGap = 0;
// Create a new paragraph in the second column
SelManager.selectRange(1862,1862);
SelManager.splitParagraph();
SelManager.flushPendingOperations();
// Get the posititioning of the first and second columns
var x1:int = SelManager.textFlow.flowComposer.findLineAtPosition(0).x;
var y1:int = SelManager.textFlow.flowComposer.findLineAtPosition(0).y;
var x2:int = SelManager.textFlow.flowComposer.findLineAtPosition(1873).x;
var y2:int = SelManager.textFlow.flowComposer.findLineAtPosition(1873).y;
assertTrue(
"BlockProgression: BP: T to B, Direction: L to R placed text in an incorrect direction.",
x1 < x2
);
assertTrue(
"BlockProgression: BP: T to B, Direction: L to R placed text in an incorrect direction.",
y1 == y2
);
}
// Test BlockProgression.RL + Direction.RTL
public function rtlPositioning():void
{
// Force the intended text positioning
SelManager.textFlow.blockProgression = BlockProgression.RL;
SelManager.textFlow.direction = Direction.RTL;
SelManager.textFlow.paddingBottom = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;
SelManager.textFlow.paddingTop = 0;
SelManager.textFlow.columnCount = 2;
SelManager.textFlow.columnGap = 0;
// Create a new paragraph in the second column
SelManager.selectRange(1842,1842);
SelManager.splitParagraph();
SelManager.flushPendingOperations();
// Get the posititioning of the first and second columns
var x1:int = SelManager.textFlow.flowComposer.findLineAtPosition(0).x;
var y1:int = SelManager.textFlow.flowComposer.findLineAtPosition(0).y;
var x2:int = SelManager.textFlow.flowComposer.findLineAtPosition(1843).x;
var y2:int = SelManager.textFlow.flowComposer.findLineAtPosition(1843).y;
assertTrue(
"BlockProgression: BP: R to L, Direction: R to L placed text in an incorrect direction.",
x1 == x2
);
assertTrue(
"BlockProgression: BP: R to L, Direction: R to L placed text in an incorrect direction.",
y1 < y2
);
}
// Test BlockProgression.TB + Direction.RTL
public function arabicPositioning():void
{
// Force the intended text positioning
SelManager.textFlow.blockProgression = BlockProgression.TB;
SelManager.textFlow.direction = Direction.RTL;
SelManager.textFlow.paddingBottom = 0;
SelManager.textFlow.paddingLeft = 0;
SelManager.textFlow.paddingRight = 0;
SelManager.textFlow.paddingTop = 0;
SelManager.textFlow.columnCount = 2;
SelManager.textFlow.columnGap = 0;
// Create a new paragraph in the second column
SelManager.selectRange(1862,1862);
SelManager.splitParagraph();
SelManager.flushPendingOperations();
// Get the posititioning of the first and second columns
var x1:int = SelManager.textFlow.flowComposer.findLineAtPosition(0).x;
var y1:int = SelManager.textFlow.flowComposer.findLineAtPosition(0).y;
var x2:int = SelManager.textFlow.flowComposer.findLineAtPosition(1873).x;
var y2:int = SelManager.textFlow.flowComposer.findLineAtPosition(1873).y;
assertTrue(
"BlockProgression: BlockProgression: T to B, Direction: R to L placed text in an incorrect direction.",
x1 > x2
);
assertTrue(
"BlockProgression: BlockProgression: T to B, Direction: R to L placed text in an incorrect direction.",
y1 == y2
);
}
// Test BlockProgression.RL + Direction.LTR
public function japaneseJustification():void
{
// Force the intended text positioning
SelManager.textFlow.blockProgression = BlockProgression.RL;
SelManager.textFlow.direction = Direction.LTR;
// Create new paragraphs to with severe justification differences
SelManager.insertText("M");
SelManager.insertText("MMMMMM");
SelManager.insertText("MMMMMMMMMMMM");
SelManager.selectRange(1,1);
SelManager.splitParagraph();
SelManager.selectRange(8,8);
SelManager.splitParagraph();
var xPos:Array = new Array();
var yPos:Array = new Array();
for ( var l:int = 0; l < TestFrame.textFlow.flowComposer.numLines; l++ )
{
var testLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(l).getTextLine();
xPos.push(testLine.getBounds( TestFrame.container as DisplayObject ).x);
yPos.push(testLine.getBounds( TestFrame.container as DisplayObject ).y);
}
// Check that we're on different lines
assertTrue( "Justification incorrect with BlockProgression: R to L, Direction: L to R",
xPos[0] > xPos[1] && xPos[1] > xPos[2] );
// Justification is correct
assertTrue( "Justification incorrect with BlockProgression: R to L, Direction: L to R",
yPos[0] == yPos[1] && yPos[1] == yPos[2] );
}
// Test BlockProgression.TB + Direction.LTR
public function romanJustification():void
{
// Force the intended text positioning
SelManager.textFlow.blockProgression = BlockProgression.TB;
SelManager.textFlow.direction = Direction.LTR;
// Create new paragraphs to with severe justification differences
SelManager.insertText("M");
SelManager.insertText("MMMMMM");
SelManager.insertText("MMMMMMMMMMMM");
SelManager.selectRange(1,1);
SelManager.splitParagraph();
SelManager.selectRange(8,8);
SelManager.splitParagraph();
var xPos:Array = new Array();
var yPos:Array = new Array();
for ( var l:int = 0; l < TestFrame.textFlow.flowComposer.numLines; l++ )
{
var testLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(l).getTextLine();
xPos.push(testLine.getBounds( TestFrame.container as DisplayObject ).x);
yPos.push(testLine.getBounds( TestFrame.container as DisplayObject ).y);
}
// Check that we're on different lines
assertTrue( "Justification incorrect with BlockProgression: T to B, Direction: L to R",
yPos[0] != yPos[1] && yPos[1] != yPos[2] );
// Justification is correct
assertTrue( "Justification incorrect with BlockProgression: T to B, Direction: L to R",
xPos[0] == xPos[1] && xPos[1] == xPos[2] );
}
// Test BlockProgression.RL + Direction.RTL
public function rtlJustification():void
{
// Force the intended text positioning
SelManager.textFlow.blockProgression = BlockProgression.RL;
SelManager.textFlow.direction = Direction.RTL;
// Create new paragraphs to with severe justification differences
SelManager.insertText("M");
SelManager.insertText("MMMMMM");
SelManager.insertText("MMMMMMMMMMMM");
SelManager.selectRange(1,1);
SelManager.splitParagraph();
SelManager.selectRange(8,8);
SelManager.splitParagraph();
var xPos:Array = new Array();
var yPos:Array = new Array();
for ( var l:int = 0; l < TestFrame.textFlow.flowComposer.numLines; l++ )
{
var testLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(l).getTextLine();
xPos.push(testLine.getBounds( TestFrame.container as DisplayObject ).x);
yPos.push(testLine.getBounds( TestFrame.container as DisplayObject ).y);
}
// Check that we're on different lines
assertTrue( "Justification incorrect with BlockProgression: R to L, Direction: R to L",
xPos[0] != xPos[1] && xPos[1] != xPos[2] );
// Justification is correct
assertTrue( "Justification incorrect with BlockProgression: R to L, Direction: R to L",
yPos[0] > yPos[1] && yPos[1] > yPos[2] );
}
// Test BlockProgression.TB + Direction.RTL
public function arabicJustification():void
{
// Force the intended text positioning
SelManager.textFlow.blockProgression = BlockProgression.TB;
SelManager.textFlow.direction = Direction.RTL;
// Create new paragraphs to with severe justification differences
SelManager.insertText("M");
SelManager.insertText("MMMMMM");
SelManager.insertText("MMMMMMMMMMMM");
SelManager.selectRange(1,1);
SelManager.splitParagraph();
SelManager.selectRange(8,8);
SelManager.splitParagraph();
var xPos:Array = new Array();
var yPos:Array = new Array();
for ( var l:int = 0; l < TestFrame.textFlow.flowComposer.numLines; l++ )
{
var testLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(l).getTextLine();
xPos.push(testLine.getBounds( TestFrame.container as DisplayObject ).x);
yPos.push(testLine.getBounds( TestFrame.container as DisplayObject ).y);
}
// Check that we're on different lines
assertTrue( "Justification incorrect with BlockProgression: T to B & Direction: R to L",
yPos[0] != yPos[1] && yPos[1] != yPos[2] );
// Justification is correct
assertTrue( "Justification incorrect with BlockProgression: T to B & Direction: R to L",
xPos[0] > xPos[1] && xPos[1] > xPos[2] );
}
// Make sure the right to left fonts are displayed right to left
public function arabicDirection():void
{
for ( var l:int = 0; l < TestFrame.textFlow.flowComposer.numLines; l++ )
{
var testLine:TextLine = SelManager.textFlow.flowComposer.getLineAt(l).getTextLine();
for ( var i:int = 1; i < testLine.atomCount; i++)
{
assertTrue( "Display direction incorrect on right to left fonts",
testLine.getAtomBounds(i).x > testLine.getAtomBounds(i-1).x );
assertTrue( "Display direction incorrect on right to left fonts",
testLine.getAtomBounds(i).y == testLine.getAtomBounds(i-1).y );
}
}
}
}
}