////////////////////////////////////////////////////////////////////////////////
//
//  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.TestDescriptor;
    import UnitTest.ExtendedClasses.TestSuiteExtended;
    import UnitTest.ExtendedClasses.VellumTestCase;
    import UnitTest.Fixtures.TestConfig;

    import flash.display.DisplayObject;
    import flash.display.Sprite;

    import flashx.textLayout.compose.TextFlowLine;
    import flashx.textLayout.container.ContainerController;
    import flashx.textLayout.conversion.TextConverter;
    import flashx.textLayout.edit.EditManager;
    import flashx.textLayout.elements.FlowElement;
    import flashx.textLayout.elements.InlineGraphicElement;
    import flashx.textLayout.elements.ParagraphElement;
    import flashx.textLayout.elements.SpanElement;
    import flashx.textLayout.elements.TableElement;
    import flashx.textLayout.elements.TableRowElement;
    import flashx.textLayout.elements.TextFlow;
    import flashx.textLayout.events.CompositionCompleteEvent;
    import flashx.textLayout.formats.BlockProgression;
    import flashx.textLayout.formats.Direction;
    import flashx.textLayout.formats.Float;
    import flashx.textLayout.formats.TextAlign;
    import flashx.textLayout.formats.TextLayoutFormat;
    import flashx.textLayout.tlf_internal;

    import mx.containers.Canvas;

    import org.flexunit.asserts.assertTrue;

    //import flashx.textLayout.elements.TableDataCellElement;
    use namespace tlf_internal;
	
	public class TableTests extends VellumTestCase
	{
        // Constants
        private static const INS_SPAN:uint = 1;
        private static const INS_ILG:uint = 2;
        
        private static const VALIDATOR_PREFIX:String = "validate_";
        private static const SETTER_PREFIX:String = "set_";
        private static const EnglishHeader:String = '<TextFlow whiteSpaceCollapse="preserve" version="3.0.0" xmlns="http://ns.adobe.com/textLayout/2008">';
        private static const EnglishText:String =  '<p paddingBottom="0"><span>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. Others, where the lime-burner still feeds his daily and nightlong fire, afford points of interest to the wanderer among the hills, who seats himself on a log of wood or a fragment of marble, to hold a chat with the solitary man. It is a lonesome, and, when the character is inclined to thought, may be an intensely thoughtful occupation; as it proved in the case of Ethan Brand, who had mused to such strange purpose, in days gone by, while the fire in this very kiln was burning.</span></p>'
                                                 + '<p paddingBottom="0"><span>The man who now watched the fire was of a different order, and troubled himself with no thoughts save the very few that were requisite to his business. At frequent intervals, he flung back the clashing weight of the iron door, and, turning his face from the insufferable glare, thrust in huge logs of oak, or stirred the immense brands with a long pole. Within the furnace were seen the curling and riotous flames, and the burning marble, almost molten with the intensity of heat; while without, the reflection of the fire quivered on the dark intricacy of the surrounding forest, and showed in the foreground a bright and ruddy little picture of the hut, the spring beside its door, the athletic and coal-begrimed figure of the lime-burner, and the half-frightened child, shrinking into the protection of his father\'s shadow. And when again the iron door was closed, then reappeared the tender light of the half-full moon, which vainly strove to trace out the indistinct shapes of the neighboring mountains; and, in the upper sky, there was a flitting congregation of clouds, still faintly tinged with the rosy sunset, though thus far down into the valley the sunshine had vanished long and long ago.</span></p>';
        private static const JapaneseHeader:String = '<TextFlow whiteSpaceCollapse="preserve" version="3.0.0" xmlns="http://ns.adobe.com/textLayout/2008">';
        private static const JapaneseText:String = '<p paddingBottom="0"><span>2.文字コードが割り当てられていないグリフの大半は既に文字コードが割り当てられているグリフの異体字です。次のセクションでは、このようなグリフスする方法について解説しまが割り当てられていないグリフの大半は既に文字コードが割り当てられているグリフの異体字です。次のセクす。</span></p>';
        
        // Static Markups
        private static var EnglishContent:String = EnglishHeader
                                                 + EnglishText
                                                 + EnglishText
                                                 + '</TextFlow>';
        
        private static var JapaneseContent:String = JapaneseHeader
                                                  + JapaneseText
                                                  + JapaneseText
                                                  + JapaneseText
                                                  + JapaneseText
                                                  + JapaneseText
                                                  + '</TextFlow>';
        // Static members
        [Embed(source="../../../../test/testFiles/assets/smiley.gif")]
        private static var SmileyIcon:Class;
        
        private static var BaseImageURL:String;
        private static var FormatValueList:Array = [0, 1, 5];
        private static var ContentLanguageList:Array = [ EnglishContent, JapaneseContent ];
        private static var SourceTextFlow:Array;
        private static var TableRowCountList:Array = [25];
        private static var TableColumnCountList:Array = [4];
        private static var TableInsertPositionList:Array = [1];

        // Members
        private var _cellBorderWidth:int;
        private var _cellPadding:int;
        private var _cellSpacing:int;
        private var _columnShifts:Array;
        private var _container1:Sprite;
        private var _contentType:uint;
        private var _currentLanguage:String;
        private var _currentInsertPos:uint;
        private var _currentTestMethodName:String;
        private var _currentValidatorMethodName:String;
        private var _currentSetterMethodName:String;
        private var _firstVisibleLineAbsStart:int;
        private var _floatColor:int;
        private var _lastVisibleLineAbsStart:int;
        private var _rtlText:Boolean;
        private var _tableElement:TableElement;
		private var _textFlow:TextFlow;
        private var _textFlowSprite:Sprite;
        private var _testCanvas:Canvas;
		private var _testXML:XML;
        private var _verticalText:Boolean;
        private var _testResultX:*;
        private var _testResultY:*;
        private var _assertMsgX:String;
        private var _assertMsgY:String;
        private var _tableMargin:int;
        private var _tablePaddingTop:int;
        private var _tablePaddingBottom:int;
        private var _tableBorderWidth:int;
		
		public function TableTests(methodName:String, testID:String, testConfig:TestConfig, testXML:XML = null)
		{
			super (methodName, testID, testConfig);
			_testXML = testXML;
			TestData.fileName = null;
			
			// Note: These must correspond to a Watson product area (case-sensitive)
			metaData.productArea = "Text Composition";
            _floatColor = 0xFF0000;
		}
		
		public static function suite(testConfig:TestConfig, ts:TestSuiteExtended):void
		{
            addTestCase(ts, testConfig, "cellBorderWidthTest");
            addTestCase(ts, testConfig, "cellPaddingTest");
            addTestCase(ts, testConfig, "cellSpacingTest");
            addTestCase(ts, testConfig, "inlineGraphicTest");
            addTestCase(ts, testConfig, "tableBorderWidthTest");
            addTestCase(ts, testConfig, "tableMarginTest");
            addTestCase(ts, testConfig, "tableAbsPositionTest");
		}
		
		private static function addTestCase(ts:TestSuiteExtended, testConfig:TestConfig, methodName:String):void
		{
			var testXML:XML = <TestCase>
								<TestData name="methodName">{methodName}</TestData>
								<TestData name="id">{methodName}</TestData>
							</TestCase>;
            
            ts.addTestDescriptor (new TestDescriptor (TableTests,"callTestMethod", testConfig, testXML) );
		}
		
		override public function setUpTest() : void
		{
			super.setUpTest();
			initializeSourceTextFlow();
			initializeFlow();
		}
		
		override public function tearDownTest(): void
		{
			super.tearDownTest();
		}
		
        public function callTestMethod():void
        {
            for each (_currentLanguage in ContentLanguageList)
            {
                var TestCase:XML = _testXML;
                _currentTestMethodName = TestCase.TestData.(@name == "methodName").toString();
                _currentValidatorMethodName = VALIDATOR_PREFIX + _currentTestMethodName;
                _currentSetterMethodName = SETTER_PREFIX + _currentTestMethodName;
                for each (_currentInsertPos in TableInsertPositionList)
                    for each (var rowCount:uint in TableRowCountList)
                        for each (var colCount:uint in TableColumnCountList)
                            this[_currentTestMethodName](rowCount, colCount);
            }
        }
        
		private function initializeFlow():void
		{
            _textFlow = new TextFlow();
            _textFlow.columnCount = 3;
            _testCanvas = myEmptyChilds();
            var controllerWidth:Number = _testCanvas.width;
            var controllerOne:ContainerController;
            _container1 = new Sprite();
            controllerOne = new ContainerController(_container1, controllerWidth, _testCanvas.height);
            _textFlow.flowComposer.addController(controllerOne);
            _textFlow.interactionManager = new EditManager();
            
            _textFlowSprite = new Sprite();
            _textFlowSprite.addChild(_container1);
            
            _testCanvas.rawChildren.addChild(_textFlowSprite);
			
            // Set the writing direction specified by the test
			_textFlow.blockProgression = writingDirection[0];
			_textFlow.direction        = writingDirection[1];
            _verticalText = (_textFlow.blockProgression == BlockProgression.RL);
            _rtlText = (_textFlow.direction == Direction.RTL);
            
			SelManager = EditManager(_textFlow.interactionManager);
            if(SelManager)
            {
                SelManager.selectRange(0, 0);
                //make sure there is never any blinking when running these tests
                setCaretBlinkRate (0);
            }
            
            calculateColumnShifts();
		}
		
		private function setUpFlow():void
		{
			var sourceFlow:TextFlow;
			if (_currentLanguage == EnglishContent)
				sourceFlow = SourceTextFlow[0];
			else if (_currentLanguage == JapaneseContent)
				sourceFlow = SourceTextFlow[1];
			else 
				sourceFlow = TextConverter.importToFlow(_currentLanguage, TextConverter.TEXT_LAYOUT_FORMAT);
			
			_textFlow.replaceChildren(0, _textFlow.numChildren);
			assertTrue("Empty TextFlow has incorrect ContainerLength",_textFlow.textLength == _textFlow.flowComposer.getControllerAt(0).textLength);
			var newFlow:TextFlow = sourceFlow.deepCopy() as TextFlow;
			var childCount:int = newFlow.numChildren;
			for (var i:int = newFlow.numChildren - 1; i >= 0; --i)
			{
				var child:FlowElement = newFlow.getChildAt(i);
				_textFlow.addChildAt(0, child);
			}
			_textFlow.interactionManager.selectRange(0, 0);
		}
		
		private function initializeSourceTextFlow():void
		{
			SourceTextFlow = [];
			
			// Create english content
			var englishFlow:TextFlow = TextConverter.importToFlow(EnglishContent, TextConverter.TEXT_LAYOUT_FORMAT);
            var engTLF:TextLayoutFormat = new TextLayoutFormat();
            engTLF.locale = "en_US";
            engTLF.fontSize = 14;
            engTLF.fontFamily="Arial" ;
            englishFlow.format = engTLF;
			SourceTextFlow.push(englishFlow);

			// Create japanese content
			var japaneseFlow:TextFlow = TextConverter.importToFlow(JapaneseContent, TextConverter.TEXT_LAYOUT_FORMAT);
			var japTLF:TextLayoutFormat = new TextLayoutFormat();
            japTLF.locale = "ja";
            japTLF.fontSize = 14;
			japaneseFlow.format = japTLF;
			SourceTextFlow.push(japaneseFlow);
		}
                
        private function myEmptyChilds():Canvas
        {
            var TestCanvas:Canvas = null;
            TestDisplayObject = testApp.getDisplayObject();
            if (TestDisplayObject)
            {
                TestCanvas = Canvas(TestDisplayObject);
                TestCanvas.removeAllChildren();
                var iCnt:int = TestCanvas.rawChildren.numChildren;
                for ( var a:int = 0; a < iCnt; a ++ )
                {
                    TestCanvas.rawChildren.removeChildAt(0);
                }
            }
            
            return TestCanvas;
        }
		
        // Test cases
        private function cellBorderWidthTest(rowCount:uint, colCount:uint):void
        {
            _contentType = INS_SPAN;
            initTestFormats();
            _currentValidatorMethodName = "validate_cellPositionVHTest";
            for each(_cellBorderWidth in FormatValueList)
            {
                beforeSetTableFormat(rowCount, colCount);
                afterSetTableFormat();
            }
            // Validation has to be executed until all images are loaded successfully.
            // So it should be postponed to the event listener.
        }
        
        private function cellPaddingTest(rowCount:uint, colCount:uint):void
        {
            _contentType = INS_SPAN;
            initTestFormats();
            for each(_cellPadding in FormatValueList)
            {
                beforeSetTableFormat(rowCount, colCount);
                afterSetTableFormat();
            }
            // Validation has to be executed until all images are loaded successfully.
            // So it should be postponed to the event listener.
        }
        
        private function cellSpacingTest(rowCount:uint, colCount:uint):void
        {
            _contentType = INS_SPAN;
            initTestFormats();
            _currentValidatorMethodName = "validate_cellPositionVHTest";
            for each(_cellSpacing in FormatValueList)
            {
                beforeSetTableFormat(rowCount, colCount);
                afterSetTableFormat();         
            }
            // Validation has to be executed until all images are loaded successfully.
            // So it should be postponed to the event listener.
        }
        
        private function tableAbsPositionTest(rowCount:uint, colCount:uint):void
        {
            _contentType = INS_SPAN;
            initTestFormats();
            beforeSetTableFormat(rowCount, colCount);
            afterSetTableFormat();
            // Validation has to be executed until all images are loaded successfully.
            // So it should be postponed to the event listener.
        }
        
        private function inlineGraphicTest(rowCount:uint, colCount:uint):void
        {
            _contentType = INS_ILG;
            initTestFormats();
            beforeSetTableFormat(rowCount, colCount);
            afterSetTableFormat();
            // Validation has to be executed until all images are loaded successfully.
            // So it should be postponed to the event listener.
        }
        
        private function tableMarginTest(rowCount:uint, colCount:uint):void
        {
            _contentType = INS_SPAN;
            initTestFormats();
            for each(_tableMargin in FormatValueList)
            {
                beforeSetTableFormat(rowCount, colCount);
                afterSetTableFormat();
            }
            // Validation has to be executed until all images are loaded successfully.
            // So it should be postponed to the event listener.
        }
        
        private function tableBorderWidthTest(rowCount:uint, colCount:uint):void
        {
            _contentType = INS_SPAN;
            initTestFormats();
            for each(_tableBorderWidth in FormatValueList)
            {
                beforeSetTableFormat(rowCount, colCount);
                afterSetTableFormat();
            }
            // Validation has to be executed until all images are loaded successfully.
            // So it should be postponed to the event listener.
        }
        
        private function beforeSetTableFormat(rowCount:uint, colCount:uint):void
        {
            setUpFlow();
            _tableElement = createTable(rowCount, colCount);
            initTableFormat(_tableElement);
        }
        
        private function afterSetTableFormat():void
        {
            _textFlow.addEventListener(CompositionCompleteEvent.COMPOSITION_COMPLETE, compositionCompleteHandler);
            insertTable(_tableElement, _currentInsertPos);
            _textFlow.flowComposer.updateAllControllers();
            if(_testResultX != undefined && _testResultX == false)
                assertTrue(_assertMsgX, false);
            if(_testResultY != undefined && _testResultY == false)
                assertTrue(_assertMsgY, false);
        }
        
        // Helper functions
        private function createTable(rowCount:uint, colCount:uint):TableElement
        {
            var tableElement:TableElement = new TableElement();
            //tableElement.initTableElement(rowCount, colCount);
            createTableRows(tableElement, _contentType);
            setColumnWidth(tableElement);
            return tableElement;
        }
        
        private function createTableRows(table:TableElement, contentInside:uint):void
        {
           /* for ( var i:uint = 0; i < table.row; i ++ )
            {
                // Create single row
                var rowElement:TableRowElement = new TableRowElement();
                table.addChild(rowElement);
                // Create data cells in row
                for ( var j:uint = 0; j < table.column; j ++ )
                {
                    var dataInCell:String = "cell" + (i*table.column + j);
                    createTableDataCell(rowElement, dataInCell, contentInside);
                }
            }  */
        }
        
        private function createTableDataCell(rowElement:TableRowElement, dataInCell:String, contentInside:uint):void
        {
            // new ParagraphElement to contain span/float
            var paragraph:ParagraphElement = new ParagraphElement();
            paragraph.paddingTop = 5;
            paragraph.paddingBottom = 5;
            
            switch(contentInside)
            {
                case INS_SPAN:
                    addSpanToParagraph(paragraph, dataInCell);
                    break;
                case INS_ILG:
                    addFloatToParagraph(paragraph, Float.NONE);
                    break;
                default:
                    break;
            }
            
           /* var cell:TableDataCellElement = new TableDataCellElement();
            var tlf:TextLayoutFormat = new TextLayoutFormat();
            tlf.backgroundAlpha = 1.0;
            tlf.backgroundColor = 0xCCCCCC;
//            tlf.cellPadding = _cellPadding;
            cell.format = tlf;
            cell.setBorderColor(0x000000);
            cell.setBorderWidth(_cellBorderWidth);
            cell.addChild(paragraph);

            // Add paragraph to TableRowElement
            rowElement.addChild(cell);     */
        }
        
        private function addSpanToParagraph(paragraph:ParagraphElement, dataInCell:String):void
        {
            // new Span with null string
            var spanElement:SpanElement = new SpanElement();
            spanElement.text = dataInCell;
            
            paragraph.addChild(spanElement);
        }
        
        private function addFloatToParagraph(paragraph:ParagraphElement, floatPos:String):void
        {   
            // InlineGraphicElement has "auto" width/height so the size can't be calculated till the graphic is loaded
            var inlineGraphic:InlineGraphicElement = new InlineGraphicElement();
            inlineGraphic.source = SmileyIcon;
            paragraph.addChild(inlineGraphic);            
        }
        
        private function calculateColumnShifts():void
        {
            _columnShifts = [];
            
            // We only support single controller for simplification
            var controller:ContainerController = _textFlow.flowComposer.getControllerAt(0);
            var columnCount:uint = controller.computedFormat.columnCount;
            var columnGap:Number = controller.computedFormat.columnGap;
            // For case which have multiple columns defined in text flow
            var singleColumnShift:Number = (controller.compositionWidth
                - (columnCount - 1) * columnGap) / columnCount + columnGap;
            for (var parcelIndex:int = 0; parcelIndex < columnCount; ++parcelIndex)
                _columnShifts[parcelIndex] = singleColumnShift * parcelIndex;
        }

        private function initTableFormat(tableElement:TableElement):void
        {
            var tableLayoutFormat:TextLayoutFormat = new TextLayoutFormat();
            tableLayoutFormat.tableWidth = 500;
            tableLayoutFormat.textAlign = TextAlign.CENTER;    // Supported
            tableLayoutFormat.backgroundColor = 0xCCCCCC;
            tableElement.format = tableLayoutFormat;
            
            tableElement.cellSpacing = _cellSpacing;
            tableElement.marginLeft = _tableMargin;
            tableElement.marginRight = _tableMargin;
            tableElement.marginTop = _tableMargin;
            tableElement.marginBottom = _tableMargin;
            
            tableElement.setBorderColor(0x550000);
            tableElement.setBorderWidth(_tableBorderWidth);
            
            tableElement.paddingTop = _tablePaddingTop;
            tableElement.paddingBottom = _tablePaddingBottom;
            
            tableElement.cellPadding = _cellPadding;
        }
        
        private function initTestFormats():void
        {
            _cellBorderWidth = 1;
            _cellPadding = 0;
            _cellSpacing = 0;
            _tableBorderWidth = 1;
            _tableMargin = 0;
            _tablePaddingTop = 0;
            _tablePaddingBottom = 0;
        }

        private function insertTable(tableElement:TableElement, pos:uint):uint
        {
            if(pos >= _textFlow.numChildren)
                pos = _textFlow.numChildren - 1;
            
            _textFlow.addChildAt(pos, tableElement);
            
            return pos;
        }
        
        private function setColumnWidth(tableElement:TableElement):void
        {
            var arColWidth:Array = ["30%", "20%", "20%", "80", "70"];
            /*for ( var i:uint = 0; i < tableElement.column; i ++ )
            {
                tableElement.setColumnWidth(i, arColWidth[i]);
            }   */
        }

        /*
         *********** Validators *****************
         */
        private function validate_cellPaddingTest(tableElement:TableElement):void
        {
            for(var i:uint = 0; i < tableElement.numChildren; ++i)
            {
                var rowElement:TableRowElement = tableElement.getChildAt(i) as TableRowElement;
                if(!rowElement)
                    continue;
                
                if(!isTableRowVisible(rowElement))
                    break;
                
                for(var j:uint = 0; j < rowElement.numChildren; ++j)
                {
                    /*var cellElement:TableDataCellElement = rowElement.getChildAt(j) as TableDataCellElement;
                    if(!cellElement)
                        continue;
                    
                    validate_cellPositionVH(rowElement, cellElement);  */
                }
            }
        }
        
        private function validate_inlineGraphicTest(tableElement:TableElement):void
        {
            validate_tableVPositionTop(tableElement);
            validate_tableVPositionBottom(tableElement);
            validate_tableHPosition(tableElement);
        }
        
        private function validate_tableAbsPositionTest(tableElement:TableElement):void
        {
            var tableAbsStart:int = tableElement.getAbsoluteStart();
            var tableLastLineIndex:int = _textFlow.flowComposer.findLineIndexAtPosition(tableAbsStart + tableElement.textLength - 1);
            var nextLine:TextFlowLine = _textFlow.flowComposer.getLineAt(tableLastLineIndex+1);
            if(nextLine)
            {
                var nextLineAbsStart:int = nextLine.absoluteStart;
                _testResultX = (tableAbsStart + tableElement.textLength) == nextLineAbsStart;
                _assertMsgX = "Table is not added in right position!";
            }
            
            var tableFirstLineIndex:int = _textFlow.flowComposer.findLineIndexAtPosition(tableAbsStart);
            var previousLine:TextFlowLine = _textFlow.flowComposer.getLineAt(tableFirstLineIndex-1);
            if(previousLine)
            {
                var previousParagraph:ParagraphElement = previousLine.paragraph;
                var computedTableAbsStart:int = previousParagraph.getAbsoluteStart() + previousParagraph.textLength;
                _testResultX = computedTableAbsStart == tableAbsStart;
                _assertMsgX = "Table is not added in right position!";
            }
        }
        
        private function validate_tableBorderWidthTest(tableElement:TableElement):void
        {
            validate_tableVPositionTop(tableElement);
            validate_tableVPositionBottom(tableElement);
            validate_tableHPosition(tableElement);
        }
        
        private function validate_tableMarginTest(tableElement:TableElement):void
        {
            validate_tableVPositionTop(tableElement);
            validate_tableVPositionBottom(tableElement);
            validate_tableHPosition(tableElement);
        }
        
        private function isLineVisible(line:TextFlowLine):Boolean
        {
            if(!line || isNaN(line.height) || isNaN(line.x) || isNaN(line.y))
                return false;
            else
                return true;
        }
        
        private function isTableRowVisible(row:TableRowElement):Boolean
        {
            if(isNaN(row.height) || isNaN(row.x) || isNaN(row.y))
                return false;
            else
                return true;
        }
        
        private function isTableVisible(table:TableElement):Boolean
        {
        /*    if(isNaN(table.height) || isNaN(table.x) || isNaN(table.y))
                return false;
            else        */
                return true;
        }
        
        private function validate_tableVPositionTop(tableElement:TableElement):void
        {
            if(_verticalText)
                return;
            
            if( !isTableVisible(tableElement) )
                return;
            
            var tableAbsStart:int = tableElement.getAbsoluteStart();
            var tableFirstLineIndex:int = _textFlow.flowComposer.findLineIndexAtPosition(tableAbsStart);
            var previousLine:TextFlowLine = _textFlow.flowComposer.getLineAt(tableFirstLineIndex-1);
            
            // Check vertical position
            if(previousLine)
            {
                var previousParagraph:ParagraphElement = previousLine.paragraph;
                _testResultX = Math.abs(tableElement.y - tableElement.getEffectiveMarginTop()
                    - Math.max(tableElement.getEffectivePaddingTop(), previousParagraph.getEffectivePaddingBottom())
                    - previousLine.spaceAfter - previousLine.height
                    - previousLine.y) < 1;
            }
            else
                _testResultX = Math.abs(tableElement.y) < 1;
            
            _assertMsgX = "Table has incorrect top logical vertical position!"; 
        }
        
        private function validate_tableVPositionBottom(tableElement:TableElement):void
        {
            if(_verticalText)
                return;
            
            var tableAbsStart:int = tableElement.getAbsoluteStart();
            var tableLastLineIndex:int = _textFlow.flowComposer.findLineIndexAtPosition(tableAbsStart + tableElement.textLength - 1);
            var nextLine:TextFlowLine = _textFlow.flowComposer.getLineAt(tableLastLineIndex+1);
            if(!isLineVisible(nextLine))
                return;
            
            if(nextLine)
            {
                var nextParagraph:ParagraphElement = nextLine.paragraph;
              /*  _testResultX = Math.abs(nextLine.y - tableElement.getEffectiveMarginTop()
                                    - tableElement.y - tableElement.height
                                    - nextLine.spaceBefore
                                    - Math.max(tableElement.getEffectivePaddingBottom(), nextParagraph.getEffectivePaddingTop())) < 1; */
            }
            else
            {
                var tableHolder:DisplayObject = TestDisplayObject;
              //  _testResultX = Math.abs(tableElement.y + tableElement.getEffectiveMarginBottom() + tableElement.height - tableHolder.y) < 1;
            }
            
           _assertMsgX = "Table has incorrect bottom logical vertical position!";
        }
        
        private function validate_tableHPosition(tableElement:TableElement):void
        {
            if(_verticalText)
                return;
            
            if(!isTableVisible(tableElement))
                return;
            
          /*  if (_rtlText)
                _testResultX = Math.abs(tableElement.x + _columnShifts[tableElement.originParcelIndex] + tableElement.computedWidth  + tableElement.getEffectivePaddingRight() + tableElement.getEffectiveMarginRight() - TestDisplayObject.width) < 1;
            else
                _testResultX = Math.abs(tableElement.x - _columnShifts[tableElement.originParcelIndex] - tableElement.getEffectivePaddingLeft() - tableElement.getEffectiveMarginLeft()) < 1;
                                                                              */
            _assertMsgX = "Table has incorrect logical horizontal position!";
        }
        
        private function validate_cellPositionVHTest(tableElement:TableElement):void
        {
            for(var i:uint = 0; i < tableElement.numChildren; ++i)
            {
                var rowElement:TableRowElement = tableElement.getChildAt(i) as TableRowElement;
                if(!rowElement)
                    continue;
                if(!isTableRowVisible(rowElement))
                    break;
                
                for(var j:uint = 0; j < rowElement.numChildren; ++j)
                {
                   // var cellElement:TableDataCellElement = rowElement.getChildAt(j) as TableDataCellElement;
                   /* if(!cellElement)
                        continue;       */
                    
                 //   validate_cellPositionVH(rowElement, cellElement);
                }
            }
        }

        /*  private function validate_cellPositionVH(rowElement:TableRowElement, cellElement:TableDataCellElement):void
        {
            if(_verticalText)
                return;
            
          //  var previousCell:TableDataCellElement = cellElement.getPreviousSibling() as TableDataCellElement;
          //  var nextCell:TableDataCellElement = cellElement.getNextSibling() as TableDataCellElement;
            
            var cellSpacing:Number = _tableElement.cellSpacing == undefined ? 0 : _tableElement.cellSpacing;
            
            var columnShifts:Number = _columnShifts[rowElement.parcelIndex - _tableElement.originParcelIndex];
            if(_rtlText)
                columnShifts = -columnShifts;

            _assertMsgX = "X Position of cell is incorrect!";
            _assertMsgY = "Y Position of cell is incorrect!";
            
            _testResultY = Math.abs(cellElement.y - rowElement.y) < 1;
            
            if(!previousCell) {
                _testResultX = Math.abs(cellElement.x - cellSpacing - _tableElement.getEffectiveBorderLeftWidth() - columnShifts - _tableElement.x) < 1;
            } else {
                _testResultX = Math.abs(previousCell.x + previousCell.width + cellSpacing - cellElement.x) < 1;
            }
            
            if(_testResultX == false || _testResultY == false)
                return;
            
            if(!nextCell) {
                _testResultX = Math.abs(_tableElement.x + _tableElement.computedWidth + columnShifts - cellSpacing - _tableElement.getEffectiveBorderRightWidth() - cellElement.width - cellElement.x) < 1;
            } else {
                _testResultX = Math.abs(cellElement.x + cellElement.width + cellSpacing - nextCell.x) < 1;
            }
        }    */
        
        /*
         ********* Event Handlers **********
         */
        private function compositionCompleteHandler(e:CompositionCompleteEvent):void
        {
            _testResultX = undefined;
            _testResultY = undefined;
            _assertMsgX = "";
            _assertMsgY = "";
            this[_currentValidatorMethodName](_tableElement);
        }
    } // !class
}
