////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
//
// This file contains content from Ethan Brand by Nathaniel Hawthorne,
// now in the public domain.
//
////////////////////////////////////////////////////////////////////////////////

package UnitTest.Tests
{
    import UnitTest.ExtendedClasses.VellumTestCase;
    import UnitTest.Fixtures.TestConfig;

    import flash.display.Sprite;
    import flash.geom.Rectangle;
    import flash.text.engine.TextLine;
    import flash.text.engine.TextLineValidity;

    import flashx.textLayout.*;
    import flashx.textLayout.compose.IFlowComposer;
    import flashx.textLayout.compose.StandardFlowComposer;
    import flashx.textLayout.compose.TextFlowLine;
    import flashx.textLayout.container.ContainerController;
    import flashx.textLayout.edit.EditManager;
    import flashx.textLayout.edit.TextScrap;
    import flashx.textLayout.elements.*;
    import flashx.textLayout.events.CompositionCompleteEvent;
    import flashx.textLayout.factory.StringTextLineFactory;
    import flashx.textLayout.factory.TruncationOptions;
    import flashx.textLayout.formats.BlockProgression;
    import flashx.textLayout.formats.LineBreak;
    import flashx.textLayout.formats.TextAlign;
    import flashx.textLayout.formats.TextLayoutFormat;
    import flashx.textLayout.formats.VerticalAlign;

    import mx.core.Container;
    import mx.utils.UIDUtil;

    import org.flexunit.asserts.assertTrue;
    import org.flexunit.asserts.fail;

    use namespace tlf_internal;


    [TestCase(order=10)]
    [RunWith("org.flexunit.runners.Parameterized")]
    public class CompositionTest extends VellumTestCase
    {
        [Parameters]
        public static var parameters:Array = [
            ["simple.xml", false],
            ["asknot.xml", true]
        ];

        private var _lines:Array;
        private var _textLen:int;
        private const numberOfLinesBack:int = 5;

        public function CompositionTest(fileName:String, testSettings:Boolean)
        {
            super("", "CompositionTest", TestConfig.getInstance());

            TestData.fileName = fileName;
            addDefaultTestSettings = testSettings;

            metaData = {};
            // Note: These must correspond to a Watson product area (case-sensitive)
            metaData.productArea = "Text Composition";
        }

        [Before]
        override public function setUpTest():void
        {
            super.setUpTest();
        }

        [After]
        override public function tearDownTest():void
        {
            super.tearDownTest();
        }

        /**
         * First, find two back to back paragraphs. Second, record the first line of the
         * second paragraph; if the first paragraph is changed and the second gets recomposed
         * (i.e. what we don't want) this line will be re-created (also, the first line of
         * the second paragraph is the easiest to find). Third, make an insertion
         * point at the end of the first paragraph. Fourth, place a bunch of text at the end
         * of the paragraph to force it to recompose. Finally, find the first line in the
         * second paragraph again and see if it is the same as the line you recorded in step
         * (using "===").
         */
        [Test]
        public function checkParagraphShufflingTest():void
        {
            var startLength:int = TestFrame.rootElement.textLength;

            var flow1:FlowElement;
            var flow2:FlowElement;

            //Look for two back to back paragraphs.
            for (var i:int = 0; i < TestFrame.rootElement.numChildren - 1; i++)
            {
                flow1 = TestFrame.rootElement.getChildAt(i);
                flow2 = TestFrame.rootElement.getChildAt(i + 1);

                if (flow1 is ParagraphElement && flow2 is ParagraphElement)
                {
                    break;
                }
            }

            assertTrue("either flow1 or flow2 are null", flow1 != null && flow2 != null);

            var para1:ParagraphElement = flow1 as ParagraphElement;
            var para2:ParagraphElement = flow2 as ParagraphElement;

            var lines:Array = StandardFlowComposer(SelManager.textFlow.flowComposer).lines;

            var refLine:Object;
            for each (var line:TextFlowLine in lines)
            {
                if (line.paragraph == para2)
                {
                    refLine = line;
                    break;
                }
            }

            var para1end:int = para1.textLength - 1;
            SelManager.selectRange(para1end, para1end);

            var longString:String = "Far be it from me to interrupt such an important " +
                    "discussion, but it's come to my attention that the behavior of " +
                    "line shuffling has yet to be fully investigated within this context. " +
                    "So please allow me but a few lines with which to test whether or not " +
                    "the aforementioned is indeed working. Thank you.";
            SelManager.insertText(longString);

            SelManager.flushPendingOperations();

            lines = StandardFlowComposer(SelManager.textFlow.flowComposer).lines;

            for each (var line2:TextFlowLine in lines)
            {
                if (line2.paragraph == para2)
                {
                    assertTrue("the next paragraph got recomposed instead of shuffling", line2 === refLine);
                    break;
                }
            }
        }

        /**
         * This very complicated test inserts some text in the middle of the flow after
         * determining which lines will be affected by the change (in terms of which
         * will need to recompose). It then checks to see if only those that should
         * be effected by the change have been changed.
         */
        [Test]
        [Ignore]
        public function partialCompositionTest():void
        {
            var lines:Array = StandardFlowComposer(SelManager.textFlow.flowComposer).lines;

            var linenum:int = lines.length / 2;
            var initLength:int = lines.length;

            var good:Boolean = false;
            for (var i:int = 0; i < lines.length - 1; i++)
            {
                if (
                        (lines[linenum + i] as TextFlowLine).paragraph ==
                                (lines[linenum + i + 1] as TextFlowLine).paragraph
                        )
                {
                    good = true;
                    linenum = linenum + i;
                    break;
                }
            }

            if (!good)
            {
                for (var j:int = 0; j > 1; j--)
                {
                    if (
                            (lines[linenum - j] as TextFlowLine).paragraph ==
                                    (lines[linenum - j - 1] as TextFlowLine).paragraph
                            )
                    {
                        good = true;
                        linenum = linenum - j;
                        break;
                    }
                }
            }

            if (!good)
            {
                fail("No starting place could be found");
            }

            //Register all the lines that shouldn't be damaged.
            var undamagedUIDs:Array = new Array();
            for (var k:int = 0; k < linenum; k++)
            {
                undamagedUIDs[k] = UIDUtil.getUID(lines[k]);
            }

            for (var l:int = lines.length - 1;
                 l > linenum &&
                         (lines[l] as TextFlowLine).paragraph != (lines[linenum] as TextFlowLine).paragraph;
                 l--)
            {
                undamagedUIDs[l] = UIDUtil.getUID(lines[l]);
            }

            //Register all the lines that should be damaged.
            var damagedUIDs:Array = new Array();
            for (var n:int = linenum;
                 n < lines.length &&
                         (lines[n] as TextFlowLine).paragraph != null &&
                         (lines[n] as TextFlowLine).paragraph == (lines[linenum] as TextFlowLine).paragraph;
                 n++)
            {
                damagedUIDs[n] = UIDUtil.getUID(lines[n]);
            }

            var lineToDamage:TextFlowLine = lines[linenum] as TextFlowLine;
            var ip:int = lineToDamage.absoluteStart + lineToDamage.textLength;

            SelManager.selectRange(ip, ip + 9);

            var longString:String = "Line Break";
            SelManager.insertText(longString);

            SelManager.flushPendingOperations();

            for (var m:int = 0; m < initLength; m++)
            {
                var UID:String = undamagedUIDs[m];

                if (UID != null)
                {
                    assertTrue("Expected line " + m + " not to recompose." +
                            " Break was at " + linenum + ".",
                            UID == UIDUtil.getUID(lines[m])
                    );
                } else
                {
                    UID = damagedUIDs[m];
                    assertTrue("Expected line " + m + " to recompose." +
                            " Break was at " + linenum + ".",
                            UID != UIDUtil.getUID(lines[m])
                    );
                }
            }
        }

        // For benchmark: read in Alice and display one screenfull
        [Test]
        public function composeOneScreen():void
        {
            loadTestFile("aliceExcerpt.xml");
        }

        // Tests that lines that aren't in view are released, and that composition didn't run to the end
        public function releasedLineTest():void
        {
            loadTestFile("aliceExcerpt.xml");

            var flowComposer:IFlowComposer = SelManager.textFlow.flowComposer;
            assertTrue("Composed to the end, should leave text that is not in view uncomposed", flowComposer.damageAbsoluteStart < SelManager.textFlow.textLength);

            var controller:ContainerController = flowComposer.getControllerAt(0);
            var originalEstimatedHeight:Number = controller.contentHeight;
            controller.verticalScrollPosition += 500;		// scroll ahead so we have some lines generated that can be released

            var lineSummary:Object = createLineSummary(flowComposer);

            assertTrue("Expected some invalid lines -- composition not complete", lineSummary["invalidLineCount"] > 0);
            // NOTE: Released lines not in view can be garbage collected. This assertion is not necessarily valid.
            assertTrue("Expected some released lines -- not all lines in view", lineSummary["releasedLineCount"] > 0);
            assertTrue("Expected some valid and parented lines", lineSummary["parentedLineCount"] > 0);

            // This will force composition
            flowComposer.composeToPosition();
            var actualContentHeight:Number = controller.contentHeight;
            assertTrue("Expected full compose", flowComposer.damageAbsoluteStart == SelManager.textFlow.textLength);

            var afterFullCompose:Object = createLineSummary(flowComposer);
            assertTrue("Expected no invalid lines -- composition complete", afterFullCompose["invalidLineCount"] == 0);

            assertTrue("Expected estimated is correct after full composition!", flowComposer.getControllerAt(0).contentHeight == actualContentHeight);

            /*		Can't seem to get gc to release the textlines, although they get released when run through the profiler.
             var eventCount:int = 0;
             System.gc();System.gc();
             var sprite:Sprite = Sprite(flowComposer.getControllerAt(0).container);
             sprite.stage.addEventListener(Event.ENTER_FRAME, checkSummary);
             // Wait for next enterFrame event, because gc is delayed

             function checkSummary():void
             {
             if (eventCount > 50)
             {
             var afterGC:Object = createLineSummary(flowComposer);

             // Test that lines are really getting gc'd
             assertTrue("Expected lines to be gc'd!", afterGC["nonexistentLineCount"] > lineSummary["nonexistentLineCount"]);
             assertTrue("Released lines expected 0", afterGC["releasedLineCount"] == 0);
             sprite.stage.removeEventListener(Event.ENTER_FRAME, checkSummary);
             }
             System.gc();System.gc();
             ++eventCount;
             } */
        }

        [Test]
        public function truncationTest():void
        {
            var bounds:Rectangle = new Rectangle();
			
            var text:String = 'There are many such lime-kilns in that tract of country, for the purpose of burning the white marble which composes a large part of the substance of the hills. ' +
                    'Some of them, built years ago, and long deserted, with weeds growing in the vacant round of the interior, which is open to the sky, and grass and wild-flowers ' +
                    'rooting themselves into the chinks of the stones, look already like relics of antiquity, and may yet be overspread with the lichens of centuries to come.';

            var rtlText:String = 'مدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسة' +
                    'مدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسة' +
                    'مدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسة' +
                    'مدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسةمدرسة';

			var accentedText:String = '\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A' +
                    '\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A' +
                    '\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A' +
                    '\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A' +
                    '\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A\u0041\u030A';

            var formatForRtlTest:TextLayoutFormat = new TextLayoutFormat();
            formatForRtlTest.fontFamily = 'Adobe Arabic';

            // Get stats used later
            _lines = new Array();
            _textLen = 0;
            bounds.width = 200;
            bounds.height = NaN;
            var factory:StringTextLineFactory = new StringTextLineFactory();
            factory.text = text;
            factory.compositionBounds = bounds;
            factory.createTextLines(truncationTestCallback);
            bounds = factory.getContentBounds();
            assertTrue("[Not a code bug] Fix test case so that text occupies at least three lines when composed in specified bounds.", _lines.length >= 3);
            var line0:TextLine = _lines[0] as TextLine;
            var line0Extent:Number = StringTextLineFactory.defaultConfiguration.overflowPolicy == OverflowPolicy.FIT_ANY ? line0.y - line0.ascent : line0.y + line0.descent;
            var line0TextLen:int = line0.rawTextLength;
            var line1:TextLine = _lines[1] as TextLine;
            var line1Extent:Number = StringTextLineFactory.defaultConfiguration.overflowPolicy == OverflowPolicy.FIT_ANY ? line1.y - line1.ascent : line1.y + line1.descent;
            var line2:TextLine = _lines[2] as TextLine;
            var line2Extent:Number = StringTextLineFactory.defaultConfiguration.overflowPolicy == OverflowPolicy.FIT_ANY ? line2.y - line2.ascent : line2.y + line2.descent;
            var contentHeight:Number = bounds.height;
            var contentTextLength:int = _textLen;

            _lines.splice(0);
            _textLen = 0; // reset
            bounds.width = 200;
            bounds.height = NaN;
            factory.compositionBounds = bounds;
            factory.text = rtlText;
            factory.spanFormat = formatForRtlTest;
            factory.createTextLines(truncationTestCallback);
            assertTrue("[Not a code bug] Fix test case so that RTL text occupies at least two lines when composed in specified bounds.", _lines.length >= 2);
            var rtlLine0TextLen:int = _lines[0].rawTextLength;

            _lines.splice(0);
            _textLen = 0; // Reset
            bounds.width = 200;
            bounds.height = NaN;
            factory.compositionBounds = bounds;
            factory.text = accentedText;
            factory.spanFormat = null;
            factory.createTextLines(truncationTestCallback);
            assertTrue("[Not a code bug] Fix test case so that accented text occupies at least two lines when composed in specified bounds.", _lines.length >= 2);

            var line:TextLine;
            var lineExtent:Number;
            var truncationIndicatorIndex:int;
            var originalContentPrefix:String;
            var customTruncationIndicator:String;
            var customFactory:StringTextLineFactory = new StringTextLineFactory();

            // Verify that text is truncated even if width is not specified
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = NaN;
            bounds.height = NaN;
            factory.text = "A\nB"; // has an explicit new line character to ensure two lines
            factory.compositionBounds = bounds;
            factory.truncationOptions = new TruncationOptions(null, 1);
            factory.createTextLines(truncationTestCallback);
            assertTrue("Did not truncate when width is unspecified", factory.isTruncated);

            // Verify that text is truncated even if explicit line breaking is used
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = NaN;
            var format:TextLayoutFormat = new TextLayoutFormat();
            format.lineBreak = LineBreak.EXPLICIT;
            factory.textFlowFormat = format;
            factory.text = "A\nB"; // has an explicit new line character to ensure two lines
            factory.compositionBounds = bounds;
            factory.createTextLines(truncationTestCallback);
            assertTrue("Did not truncate when explicit line breaking is used", factory.isTruncated);

            // No lines case 1: compose height allows no line
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = line0Extent / 2; // less than what one line requires
            factory.textFlowFormat = null;
            factory.text = text;
            factory.compositionBounds = bounds;
            factory.truncationOptions = new TruncationOptions();
            factory.createTextLines(truncationTestCallback);
            assertTrue("Composed one or more lines when compose height allows none", _lines.length == 0 && factory.isTruncated);

            // No lines case 2: 0 line count limit
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = contentHeight; // enough to fit all content
            factory.compositionBounds = bounds;
            factory.truncationOptions = new TruncationOptions(null, 0);
            factory.createTextLines(truncationTestCallback);
            assertTrue("Composed one or more lines when line count limit is 0", _lines.length == 0 && factory.isTruncated);

            // No lines case 3: truncation indicator is too large
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = contentHeight - 1; // just shy of what the truncation indicator (same as original text) requires
            factory.compositionBounds = bounds;
            factory.text = text;
            factory.truncationOptions = new TruncationOptions(text);
            factory.textFlowFormat = null;
            factory.createTextLines(truncationTestCallback);
            assertTrue("Composed one or more lines when compose height does not allow truncation indicator itself to fit", _lines.length == 0 && factory.isTruncated);

            // Verify truncation if composing to fit in bounds
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = line1Extent; // should fit two lines
            factory.compositionBounds = bounds;
            factory.truncationOptions = new TruncationOptions();
            factory.createTextLines(truncationTestCallback);
            assertTrue("Invalid truncation results when composing to fit in bounds (lineCount)", _lines.length == 2 && factory.isTruncated);
            line = _lines[1] as TextLine;
            lineExtent = StringTextLineFactory.defaultConfiguration.overflowPolicy == OverflowPolicy.FIT_ANY ? line.y - line.ascent : line.y + line.descent;
            assertTrue("Invalid truncation results when composing to fit in bounds", lineExtent <= line1Extent);

            // Verify truncation if composing to fit in a line count limit
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.width = 200;
            bounds.height = NaN;
            bounds.left = 0;
            bounds.top = 0;
            factory.text = text;
            factory.compositionBounds = bounds;
            factory.truncationOptions = new TruncationOptions(null, 2);
            factory.createTextLines(truncationTestCallback);
            assertTrue("Invalid truncation results when composing to fit in a line count limit", _lines.length == 2 && factory.isTruncated);

            // Verify truncation if composing to fit in bounds and a line count limit; the former dominates
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = line0Extent; // should fit one line
            factory.text = text;
            factory.compositionBounds = bounds;
            factory.truncationOptions = new TruncationOptions(null, 2);
            factory.createTextLines(truncationTestCallback); // line count limit of 2
            assertTrue("Invalid truncation results when multiple truncation criteria provided", _lines.length == 1 && factory.isTruncated);
            line = _lines[0] as TextLine;
            lineExtent = StringTextLineFactory.defaultConfiguration.overflowPolicy == OverflowPolicy.FIT_ANY ? line.y - line.ascent : line.y + line.descent;
            assertTrue("Invalid truncation results when multiple truncation criteria provided", lineExtent <= line0Extent);

            // Verify truncation if composing to fit in bounds and a line count limit; the latter dominates
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = line1Extent; // should fit two lines
            factory.text = text;
            factory.compositionBounds = bounds;
            factory.truncationOptions = new TruncationOptions(null, 1);
            factory.createTextLines(truncationTestCallback); // line count limit of 1
            assertTrue("Invalid truncation results when multiple truncation criteria provided", _lines.length == 1 && factory.isTruncated);
            line = _lines[0] as TextLine;
            lineExtent = StringTextLineFactory.defaultConfiguration.overflowPolicy == OverflowPolicy.FIT_ANY ? line.y - line.ascent : line.y + line.descent;
            assertTrue("Invalid truncation results when multiple truncation criteria provided", lineExtent <= line1Extent);

            // Verify truncated text content with default truncation indicator (line count limit)
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = NaN;
            customFactory.text = text;
            customFactory.compositionBounds = bounds;
            customFactory.truncationOptions = new TruncationOptions(null, 2);
            customFactory.createTextLines(truncationTestCallback);
            truncationIndicatorIndex = customFactory.truncatedText.lastIndexOf(TruncationOptions.HORIZONTAL_ELLIPSIS);
            assertTrue("Default truncation indicator not present at the end of the truncated string", truncationIndicatorIndex + TruncationOptions.HORIZONTAL_ELLIPSIS.length == customFactory.truncatedText.length && factory.isTruncated);
            originalContentPrefix = customFactory.truncatedText.slice(0, truncationIndicatorIndex);
            assertTrue("Original content before truncation indicator mangled", text.indexOf(originalContentPrefix) == 0);

            // Verify truncated text content with default truncation indicator (fit in bounds)
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = line1Extent; // should fit two lines;
            customFactory.text = text;
            customFactory.compositionBounds = bounds;
            customFactory.truncationOptions = new TruncationOptions();
            customFactory.createTextLines(truncationTestCallback);
            truncationIndicatorIndex = customFactory.truncatedText.lastIndexOf(TruncationOptions.HORIZONTAL_ELLIPSIS);
            assertTrue("Default truncation indicator not present at the end of the truncated string", truncationIndicatorIndex + TruncationOptions.HORIZONTAL_ELLIPSIS.length == customFactory.truncatedText.length && factory.isTruncated);
            originalContentPrefix = customFactory.truncatedText.slice(0, truncationIndicatorIndex);
            assertTrue("Original content before truncation indicator mangled", text.indexOf(originalContentPrefix) == 0);

            // Verify truncated text content with custom truncation indicator
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = NaN;
            customFactory.text = text;
            customTruncationIndicator = "<SNIP>";
            customFactory.compositionBounds = bounds;
            customFactory.truncationOptions = new TruncationOptions(customTruncationIndicator, 2);
            customFactory.createTextLines(truncationTestCallback);
            truncationIndicatorIndex = customFactory.truncatedText.lastIndexOf(customTruncationIndicator);
            assertTrue("Truncation indicator not present at the end of the truncated string", truncationIndicatorIndex + customTruncationIndicator.length == customFactory.truncatedText.length && factory.isTruncated);
            originalContentPrefix = customFactory.truncatedText.slice(0, truncationIndicatorIndex);
            assertTrue("Original content before truncation indicator mangled", text.indexOf(originalContentPrefix) == 0);

            // Verify original text replacement is optimal
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = NaN;
            customFactory.text = text;
            customFactory.text = text;
            customFactory.compositionBounds = bounds;
            customTruncationIndicator = '\u200B'; // Zero-width space : should not require *any* original content that fits to be replaced
            customFactory.truncationOptions = new TruncationOptions(customTruncationIndicator, 1);
            customFactory.createTextLines(truncationTestCallback);
            assertTrue("Replacing more original content than is neccessary", customFactory.truncatedText.length == line0TextLen + customTruncationIndicator.length && factory.isTruncated);

            // Verify original text replacement is optimal (RTL text)
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = NaN;
            customFactory.text = rtlText;
            customFactory.compositionBounds = bounds;
            customTruncationIndicator = '\u200B'; // Zero-width space : should not require *any* original content that fits to be replaced
            customFactory.spanFormat = formatForRtlTest;
            customFactory.truncationOptions = new TruncationOptions(customTruncationIndicator, 1);
            customFactory.createTextLines(truncationTestCallback);
            assertTrue("Replacing more original content than is neccessary (RTL text)", customFactory.truncatedText.length == rtlLine0TextLen + customTruncationIndicator.length && factory.isTruncated);
            customFactory.spanFormat = null;

            // Verify truncation happens at atom boundaries
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = NaN;
            customFactory.text = accentedText;
            customTruncationIndicator = '<' + '\u200A' /* Hair space */ + '>'; // what precedes and succeeds the hair space is irrelevant
            customFactory.compositionBounds = bounds;
            customFactory.truncationOptions = new TruncationOptions(customTruncationIndicator, 1);
            customFactory.createTextLines(truncationTestCallback);
            assertTrue("[Not a code bug] Fix test case so that truncation indicator itself fits", _lines.length == 1 && factory.isTruncated); // baseline

            var initialTruncationPoint:int = customFactory.truncatedText.length - customTruncationIndicator.length;
            assertTrue("[Not a code bug] Fix test case so that some of the original content is left behind on first truncation attempt", initialTruncationPoint > 0); // baseline
            assertTrue("Truncation in the middle of an atom!", initialTruncationPoint % 2 == 0);
            var nextTruncationPoint:int;
            do
            {
                bounds.height = NaN;
                customTruncationIndicator = customTruncationIndicator.replace('\u200A', '\u200A\u200A'); // add another hair space in each iteration, making truncation indicator wider (ever so slightly)
                customFactory.compositionBounds = bounds;
                customFactory.truncationOptions = new TruncationOptions(customTruncationIndicator, 1);
                customFactory.createTextLines(truncationTestCallback);

                nextTruncationPoint = customFactory.truncatedText.length - customTruncationIndicator.length;
                if (nextTruncationPoint != initialTruncationPoint)
                {
                    assertTrue("Truncation in the middle of an atom!", nextTruncationPoint % 2 == 0);
                    assertTrue("Sub-optimal replacement of original content?", nextTruncationPoint == initialTruncationPoint - 2);
                    initialTruncationPoint = nextTruncationPoint;
                }

            } while (nextTruncationPoint);

            // Verify scrolling behavior when truncation options are set
            _lines.splice(0);
            _textLen = 0; // reset
            bounds.left = 0;
            bounds.top = 0;
            bounds.width = 200;
            bounds.height = line1Extent; // should fit two lines
            factory.compositionBounds = bounds;
            factory.verticalScrollPolicy = "on";
            var vaFormat:TextLayoutFormat = new TextLayoutFormat();
            vaFormat.verticalAlign = VerticalAlign.BOTTOM;
            factory.textFlowFormat = vaFormat;
            factory.truncationOptions = new TruncationOptions(); // should override scroll policy
            factory.createTextLines(truncationTestCallback);
            assertTrue("When verticalAlign is Bottom, and scrolling is on, but truncation options are set, only text that fits should be generated",
                    _textLen < contentTextLength && factory.isTruncated);
        }

        [Test]
        public function CompositionCompleteEventTest():void
        {
            var gotEvent:Boolean = false;
            var textFlow:TextFlow = SelManager.textFlow;
            textFlow.addEventListener(CompositionCompleteEvent.COMPOSITION_COMPLETE, completionHandler);
            var charFormat:TextLayoutFormat = new TextLayoutFormat();
            charFormat.fontSize = 48;
            SelManager.selectAll();
            (SelManager as EditManager).applyLeafFormat(charFormat);
            assertTrue("Didn't get the CompositionCompleteEvent", gotEvent == true);

            function completionHandler(event:CompositionCompleteEvent):void
            {
                gotEvent = true;
                textFlow.removeEventListener(CompositionCompleteEvent.COMPOSITION_COMPLETE, completionHandler);
            }
        }

        private function setUpMultipleLinkedContainers(numberOfContainers:int):Sprite
        {
            var flexContainer:Container;
            var textFlow:TextFlow = SelManager.textFlow;
            var flowComposer:IFlowComposer = textFlow.flowComposer;
            var firstController:ContainerController = textFlow.flowComposer.getControllerAt(0);
            var totalWidth:Number = firstController.compositionWidth;
            var containerWidth:Number = totalWidth / numberOfContainers;
            var containerHeight:Number = firstController.compositionHeight;
            firstController.setCompositionSize(containerWidth, firstController.compositionHeight);
            var containerParent:Sprite = firstController.container.parent as Sprite;
            if (containerParent is Container)
            {
                flexContainer = Container(containerParent);
                var newContainerParent:Sprite = new Sprite();
                flexContainer.rawChildren.addChild(newContainerParent);
                flexContainer.rawChildren.removeChild(firstController.container);
                newContainerParent.addChild(firstController.container);
                containerParent = newContainerParent;
            }
            var pos:int = containerWidth;
            while (flowComposer.numControllers < numberOfContainers)
            {
                var s:Sprite = new Sprite();
                s.x = pos;
                pos += containerWidth;
                containerParent.addChild(s);
                flowComposer.addController(new ContainerController(s, containerWidth, containerHeight));
            }
            return containerParent;
        }

        private function restoreToSingleContainer(containerParent:Sprite):void
        {
            var flexContainer:Container = containerParent.parent as Container;

            if (flexContainer)
            {
                flexContainer.rawChildren.removeChild(containerParent);
                flexContainer.rawChildren.addChild(containerParent.getChildAt(0));
            }
            var flowComposer:IFlowComposer = SelManager.textFlow.flowComposer;
            while (flowComposer.numControllers > 1)
                flowComposer.removeControllerAt(flowComposer.numControllers - 1);
        }

        // Test case with multiple containers, where the last container is scrolled down, and update will cause a scroll
        // Watson 2583969
        [Test]
        public function scrolledRedrawPartialCompose():void
        {
            var multiContainerParent:Sprite;

            try
            {
                var textFlow:TextFlow = SelManager.textFlow;
                var flowComposer:IFlowComposer = textFlow.flowComposer;
                multiContainerParent = setUpMultipleLinkedContainers(5);

                // Paste all the text again, so all containers are full, and there is text scrolled out
                var textScrap:TextScrap = TextScrap.createTextScrap(new TextRange(textFlow, 0, textFlow.textLength));
                EditManager(SelManager).pasteTextScrap(textScrap);
                flowComposer.updateAllControllers();


                // Set selection to the last two lines of the flow, and scroll to the new selection, and then delete the text
                var lastController:ContainerController = flowComposer.getControllerAt(flowComposer.numControllers - 1);
                flowComposer.composeToPosition();	// force all text to compose
                var nextToLastLine:TextFlowLine = flowComposer.getLineAt(flowComposer.numLines - 2);
                SelManager.selectRange(nextToLastLine.absoluteStart, textFlow.textLength);
                lastController.scrollToRange(SelManager.absoluteStart, SelManager.absoluteEnd);
                var firstVisibleChar:int = lastController.getFirstVisibleLine().absoluteStart; // save off the current scrolled-to text pos
                flowComposer.updateAllControllers();
                EditManager(SelManager).deleteText();

                // The delete (and subsequent redraw) should have caused a scroll during the ContainerController updateCompositionShapes.
                // Check that this happened correctly.
                var firstVisibleCharAfterPaste:int = lastController.getFirstVisibleLine().absoluteStart;
                assertTrue("Expected scroll during update", firstVisibleChar != firstVisibleCharAfterPaste);
            }
            finally
            {
                // restore how containers were set up before
                restoreToSingleContainer(multiContainerParent);
            }
        }

        // Test case with multiple containers, where the last container is scrolled down, and update will cause a scroll
        // Watson 2583969
        [Test]
        public function multipleContainersWithPadding():void
        {
            var multiContainerParent:Sprite;

            try
            {
                var textFlow:TextFlow = SelManager.textFlow;
                var flowComposer:IFlowComposer = textFlow.flowComposer;
                multiContainerParent = setUpMultipleLinkedContainers(2);

                var firstController:ContainerController = flowComposer.getControllerAt(0);
                var format:TextLayoutFormat = new TextLayoutFormat(firstController.format);
                format.paddingTop = firstController.compositionHeight;
                firstController.format = format;
                flowComposer.updateAllControllers();

                assertTrue("Expected no lines in first container", firstController.getFirstVisibleLine() == null && firstController.getLastVisibleLine() == null);
            }
            finally
            {
                // restore how containers were set up before
                restoreToSingleContainer(multiContainerParent);
            }
        }

        [Test]
        [Ignore]
        public function deleteAtContainerStart():void
        {
            var multiContainerParent:Sprite;

            try
            {
                var textFlow:TextFlow = SelManager.textFlow;
                var flowComposer:IFlowComposer = textFlow.flowComposer;
                multiContainerParent = setUpMultipleLinkedContainers(2);

                flowComposer.composeToPosition();
                var controller:ContainerController = flowComposer.getControllerAt(0);

                var lastLineIndex:int = flowComposer.findLineIndexAtPosition(controller.absoluteStart + controller.textLength);
                var startIndex:int = flowComposer.getLineAt(lastLineIndex - numberOfLinesBack).absoluteStart;
                SelManager.selectRange(startIndex, startIndex);
                for (var i:int = 0; i < numberOfLinesBack + 1; ++i)
                    SelManager.splitParagraph();
                flowComposer.updateAllControllers();
                var textLengthBefore:int = controller.textLength;

                assertTrue("Selection should be at the start of the next container", SelManager.absoluteStart == controller.absoluteStart + controller.textLength);
                SelManager.deletePreviousCharacter();
                flowComposer.composeToPosition();
                assertTrue("Expected first line of following container to be sucked in", controller.textLength > textLengthBefore);
            }
            finally
            {
                // restore how containers were set up before
                restoreToSingleContainer(multiContainerParent);
            }
        }

        [Test]
        public function resizeController2644361():void
        {
            var textFlow:TextFlow = SelManager.textFlow;
            var controller:ContainerController = textFlow.flowComposer.getControllerAt(0);

            var scrap:TextScrap = TextScrap.createTextScrap(new TextRange(textFlow, 0, textFlow.textLength));
            SelManager.selectRange(textFlow.textLength - 1, textFlow.textLength - 1);
            SelManager.splitParagraph();
            SelManager.pasteTextScrap(scrap);
            SelManager.pasteTextScrap(scrap);
            textFlow.flowComposer.updateAllControllers();
            controller.setCompositionSize(825, 471)
            SelManager.updateAllControllers();
            controller.setCompositionSize(808, 464)
            SelManager.updateAllControllers();
            controller.setCompositionSize(791, 462)
            SelManager.updateAllControllers();
            controller.setCompositionSize(768, 461)
            SelManager.updateAllControllers();
        }

        [Test]
        public function resizeEmptyController():void
        {
            var textFlow:TextFlow = new TextFlow();
            var p:ParagraphElement = new ParagraphElement();
            textFlow.addChild(p);

            var span:SpanElement = new SpanElement();
            span.text = "Hello world";
            span.fontSize = 40;
            p.addChild(span);

            var sprite1:Sprite = new Sprite();
            var cc1:ContainerController = new ContainerController(sprite1, 100, 50);
            sprite1.x = 100;
            var sprite2:Sprite = new Sprite();
            var cc2:ContainerController = new ContainerController(sprite2, 100, 50);
            sprite2.x = 300;
            //	addChild(sprite1);
            //	addChild(sprite2);
            textFlow.flowComposer.addController(cc1);
            textFlow.flowComposer.addController(cc2);
            textFlow.flowComposer.updateAllControllers();
            var originalLength:int = cc1.textLength;
            cc1.setCompositionSize(100, 10);
            textFlow.flowComposer.updateAllControllers();
            cc1.setCompositionSize(100, 50);
            textFlow.flowComposer.updateAllControllers();
            assertTrue("Expected text to recompose into controller", cc1.textLength == originalLength);
        }

        [Test]
        public function emptyController():void
        {
            var s:Sprite = new Sprite();
            var textFlow:TextFlow = new TextFlow();
            textFlow.flowComposer.addController(new ContainerController(s, 0, 0));
            textFlow.flowComposer.updateAllControllers();
        }

        // Check that the content bounds includes all parcels when composition starts from a column that is not the first
        // See Watson 2769670
        [Test]
        public function contentBoundsOnComposeFromMiddle():void
        {
            TestFrame.rootElement.blockProgression = writingDirection[0];
            TestFrame.rootElement.direction = writingDirection[1];

            var textFlow:TextFlow = SelManager.textFlow;
            var controller:ContainerController = textFlow.flowComposer.getControllerAt(0);
            var composeSpace:Rectangle = new Rectangle(0, 0, controller.compositionWidth, controller.compositionHeight);

            var lastLine:TextFlowLine = controller.getLastVisibleLine();
            var lastVisiblePosition:int = lastLine.absoluteStart + lastLine.textLength - 1;
            var charPos:int = lastVisiblePosition - 100;

            // Trim off the unseen portion of the flow to a little before the end, so we aren't
            // affected by content height estimation, and so we can check that height from previous
            // columns is included.
            SelManager.selectRange(charPos, textFlow.textLength - 1);
            SelManager.deleteText();

            // Change format to 3 columns justified text, and get the bounds. This time we composed from the start.
            var format:TextLayoutFormat = new TextLayoutFormat(textFlow.format);
            format.columnCount = 3;
            format.textAlign = TextAlign.JUSTIFY;
            textFlow.format = format;
            textFlow.flowComposer.updateAllControllers();
            var bounds:Rectangle = controller.getContentBounds();

            // Force partial composition in the last column. The bounds may be slightly different in height because we aren't
            // iterating all the lines to get height. If it doesn't match, it should be equal to the (logical) compositionHeight.
            charPos = textFlow.textLength - 3;
            var leafFormat:TextLayoutFormat = new TextLayoutFormat();
            leafFormat.color = 0xFF0000;
            SelManager.selectRange(charPos, charPos + 1);
            SelManager.applyLeafFormat(leafFormat);
            var boundsAfterPartialCompose:Rectangle = controller.getContentBounds();

            var boundsMatch:Boolean = boundsAfterPartialCompose.equals(bounds);
            if (!boundsMatch &&
                    bounds.y == boundsAfterPartialCompose.y)
            {
                if (controller.effectiveBlockProgression == BlockProgression.TB)
                    boundsMatch = Math.abs(boundsAfterPartialCompose.x - bounds.x) < 1 && Math.abs(boundsAfterPartialCompose.width - bounds.width) < 1 && boundsAfterPartialCompose.height == controller.compositionHeight;
                else
                    boundsMatch = Math.abs(boundsAfterPartialCompose.x - -controller.compositionWidth) < 1 && Math.abs(boundsAfterPartialCompose.height - bounds.height) < 1 && boundsAfterPartialCompose.width == controller.compositionWidth;
            }

            assertTrue("Expected bounds after partial compose to match bounds from previous full compose", boundsMatch);
        }

        private function truncationTestCallback(textLine:TextLine):void
        {
            _textLen += textLine.rawTextLength;
            _lines.push(textLine);
        }

        private function createLineSummary(flowComposer:IFlowComposer):Object
        {
            // Lines that are referenced should go first
            var releasedLineCount:int = 0;
            var invalidLineCount:int = 0;
            var validLineCount:int = 0;
            var parentedLineCount:int = 0;
            var nonexistentLineCount:int = 0;
            var lineIndex:int = 0;
            while (lineIndex < flowComposer.numLines)
            {
                var line:TextFlowLine = flowComposer.getLineAt(lineIndex);
                if (line.validity == TextLineValidity.VALID)
                {
                    assertTrue("Expecting valid referenced lines before invalid lines", invalidLineCount == 0);
                    var textLine:TextLine = line.peekTextLine();
                    assertTrue(!textLine || textLine.userData == line, "TextLine userData doesn't point back to TextFlowLine");
                    if (!textLine || !textLine.textBlock || textLine.textBlock.firstLine == null)
                        releasedLineCount++;
                    else if (textLine.parent)
                        parentedLineCount++;
                    else if (textLine.validity == TextLineValidity.VALID)
                        validLineCount++;
                    else assertTrue(false, "Found damaged unreleased TextLine for valid TextFlowLine");
                }
                else
                    invalidLineCount++;
                lineIndex++;
            }

            var result:Object = new Object();
            result["releasedLineCount"] = releasedLineCount;
            result["invalidLineCount"] = invalidLineCount;
            result["validLineCount"] = validLineCount;
            result["parentedLineCount"] = parentedLineCount;
            result["nonexistentLineCount"] = nonexistentLineCount;
            return result;
        }
    }
}
