////////////////////////////////////////////////////////////////////////////////
//
//  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.Sprite;
	import flash.events.KeyboardEvent;
	import flash.text.engine.TextLine;
	import flash.ui.KeyLocation;
	import flash.ui.Keyboard;
	
	import flashx.textLayout.compose.IFlowComposer;
	import flashx.textLayout.compose.StandardFlowComposer;
	import flashx.textLayout.compose.TextFlowLine;
	import flashx.textLayout.container.ContainerController;
	import flashx.textLayout.container.ScrollPolicy;
	import flashx.textLayout.conversion.ConversionType;
	import flashx.textLayout.conversion.TextConverter;
	import flashx.textLayout.edit.EditManager;
	import flashx.textLayout.elements.DivElement;
	import flashx.textLayout.elements.FlowElement;
	import flashx.textLayout.elements.FlowGroupElement;
	import flashx.textLayout.elements.ListElement;
	import flashx.textLayout.elements.ListItemElement;
	import flashx.textLayout.elements.ParagraphElement;
	import flashx.textLayout.elements.SpanElement;
	import flashx.textLayout.elements.TCYElement;
	import flashx.textLayout.elements.TextFlow;
	import flashx.textLayout.formats.BlockProgression;
	import flashx.textLayout.formats.ListMarkerFormat;
	import flashx.textLayout.formats.ListStyleType;
	import flashx.textLayout.formats.TabStopFormat;
	import flashx.textLayout.tlf_internal;
	
	import mx.containers.Canvas;
	
	use namespace tlf_internal;

	public class ListTest extends VellumTestCase
	{
		public function ListTest(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 = "Lists";
		}
		override public function setUp() : void
		{
			if (containerType == "custom")
			{
				cleanUpTestApp();
			}
			else
			{
				super.setUp();
			}
		}
		public static function suite(testConfig:TestConfig, ts:TestSuiteExtended):void
		{
			ts.addTestDescriptor (new TestDescriptor (ListTest, "addList", testConfig ) );
			ts.addTestDescriptor (new TestDescriptor (ListTest, "addNestedLists", testConfig ) );
			ts.addTestDescriptor (new TestDescriptor (ListTest, "removeNestedLists", testConfig ) );
			ts.addTestDescriptor (new TestDescriptor (ListTest, "addMultiListItem", testConfig ) );
			ts.addTestDescriptor (new TestDescriptor (ListTest, "checkMarkerRegeneration", testConfig ) );
			ts.addTestDescriptor (new TestDescriptor (ListTest, "removeListItem", testConfig ) );
			ts.addTestDescriptor (new TestDescriptor (ListTest, "tabsInMarkerFormat", testConfig ) );
			//ts.addTestDescriptor (new TestDescriptor (ListTest, "SplitAndMergeCauseMarkerRegeneration", testConfig ) );
			//ts.addTestDescriptor (new TestDescriptor (ListTest, "listItemGoOutOfList", testConfig ) );
			//ts.addTestDescriptor (new TestDescriptor (ListTest, "splitElementOperationTest", testConfig ) );
			//ts.addTestDescriptor (new TestDescriptor (ListTest, "enterSplitListItem", testConfig ) );
			//ts.addTestDescriptor (new TestDescriptor (ListTest, "backspaceMergeListItem", testConfig ) );
			
			var customTestConfig:TestConfig = testConfig.copyTestConfig();
			customTestConfig.containerType = "custom";
			ts.addTestDescriptor (new TestDescriptor (ListTest, "scrollByLinesTest", customTestConfig ) );
			ts.addTestDescriptor (new TestDescriptor (ListTest, "crossContainers", customTestConfig ) );

		}
		public function addList():void
		{
			// See VellumTextCase.setup() for where SelManager comes from.
			// This creates a list with the default selection from setup()
			var listElementCreated:ListElement = SelManager.createList();
			
		//Check model
			var tf:TextFlow = SelManager.textFlow;
			// Iterate through the FlowElements, looking for a ListElement.
			// This works only because we know the list isn't inside a div.
			// More complex flows might require iterating through FlowLeafElements
			var listsFound:int = 0;
			var elem:FlowElement = tf.getChildAt(0);
			while (elem)
			{
				if (elem as ListElement)
				{
					// save this for display check below
					var listElement:ListElement = elem as ListElement;
					assertTrue("List element found doesn't match what was returned by createList()", listElement == listElementCreated);
					listsFound++;
				}
				elem = elem.getNextSibling();
			}
			assertTrue("Expected one list element in the model and found: " + listsFound, listsFound == 1);
			// here you could look at the ListElement to perform more validation steps
			
		//Check export
			var exportedXML:XML = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT,ConversionType.XML_TYPE) as XML;
			// set the default namespace to what the exported XML uses
			var xmlns:Namespace = new Namespace("http://ns.adobe.com/textLayout/2008");
			default xml namespace = xmlns;
			// find all the nodes named "list"
			var listNodes:XMLList = exportedXML.child("list");
			// check that we have one list node. Other checks could be added based on the XML data.
			assertTrue("Expected one list element and found: " + listNodes.length(), listNodes.length() == 1);
			// here you could look at the rest of the XML data to perform more validation steps
			
		//Check display.
			// determine what the bullet text should be
			var listItem:ListItemElement = listElement.getChildAt(0) as ListItemElement;
			var bulletText:String = listElement.computeListItemText(listItem, listItem.computedListMarkerFormat());
			// here you could use this tlf_internal function to check more complex markers 
			// add one for the TextBlock terminator
			var markerLength:int = bulletText.length + 1;
			// find the TextFlowLine for the list start
			var listStartIndex:int = listElement.getElementRelativeStart(tf);
			var listFlowLine:TextFlowLine = tf.flowComposer.findLineAtPosition(listStartIndex);
			// this line should have a TextLine with a child TextLine that contains the bullet
			// the bulletLine is static, so there's not much information we can get from it.
			var listLine:TextLine = listFlowLine.getTextLine();
			var bulletLine:TextLine = listLine.getChildAt(0) as TextLine;
			assertTrue("Did not find a TextLine for the bullet", bulletLine !=null);
			assertTrue("text length for the bullet line should be " + markerLength + ", but was " + bulletLine.rawTextLength, bulletLine.rawTextLength == markerLength);
		}
		
		public function addNestedLists():void
		{
			//this test case will check up to three level nested lists
			//create three lists
			SelManager.createList();
			SelManager.createList();
			SelManager.createList();
			var tf:TextFlow = SelManager.textFlow;
			var listsFound:int = 0;
			var elem:FlowElement = tf.getChildAt(0);
			while (elem)
			{
				if (elem as ListElement)
				{	
					var listElement:ListElement = elem as ListElement;
					var allListElement:Array = [];
					var a:int = 0;
					allListElement[a] = listElement;
					var elem2:FlowElement = listElement.getChildAt(0);
					var e:FlowGroupElement = FlowGroupElement (elem2);
					var i:int=0;
					while (i < e.mxmlChildren.length)
					{
						if (e.mxmlChildren[i] as ListElement)
						{	
							var listElement1:ListElement = e.mxmlChildren[i] as ListElement;
							var elem3:FlowElement = listElement1.getChildAt(0);
							var e1:FlowGroupElement = FlowGroupElement (elem3);
							var j:int=0;
							while (j < e1.mxmlChildren.length)
							{
								if (e1.mxmlChildren[j] as ListElement)
								{	
									listsFound++;
									a++;
									allListElement[a] = e1.mxmlChildren[j] as ListElement;
								}
								j++;
							}
							listsFound++;
							a++;
							allListElement[a] = e.mxmlChildren[i] as ListElement;
						}
						i++;
					}
					listsFound++;
				}
				elem = elem.getNextSibling();
			}
			
			//check if there are three lists found
			assertTrue("Expected four list element in the model and found: " + listsFound, listsFound == 3);
			
			//Check export
			var exportedXML:XML = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT,ConversionType.XML_TYPE) as XML;
			// set the default namespace to what the exported XML uses
			var xmlns:Namespace = new Namespace("http://ns.adobe.com/textLayout/2008");
			default xml namespace = xmlns;
			var listNodes:XMLList = exportedXML.child("list");
			// check that we have one list node. Other checks could be added based on the XML data.
			assertTrue("Expected one list element and found: " + listNodes.length(), listNodes.length() == 1);
	
			// determine what the bullet text should be
			var listItem:ListItemElement = new ListItemElement();
			var bulletText:String = "";
			var markerLength:int = 0;
			var listStartIndex:int = 0;
			var listFlowLine:TextFlowLine;
			var listLine:TextLine;
			var bulletLine:TextLine;
			for (i=0; i<listsFound; i++)
			{
				listElement = allListElement[i] as ListElement;
				listItem = listElement.getChildAt(0) as ListItemElement;
				bulletText = listElement.computeListItemText(listItem, listItem.computedListMarkerFormat());
				markerLength = bulletText.length + 1;
				// find the TextFlowLine for the list start
				listStartIndex = listElement.getElementRelativeStart(tf);
				listFlowLine = tf.flowComposer.findLineAtPosition(listStartIndex);
				listLine = listFlowLine.getTextLine();
				bulletLine = listLine.getChildAt(0) as TextLine;
				assertTrue("Did not find a TextLine for the bullet", bulletLine !=null);
				assertTrue("text length for the bullet line should be " + markerLength + ", but was " + bulletLine.rawTextLength, bulletLine.rawTextLength == markerLength);
			}

		}
		
		public function removeNestedLists():void
		{
			//create three lists
			SelManager.createList();
			SelManager.createList();
			SelManager.createList();
			var tf:TextFlow = SelManager.textFlow;
			var elem:FlowElement = tf.getChildAt(0);
			
			//save first list to remove it later
			while (elem)
			{
				if (elem as ListElement)
				{	
					var firstListElement:ListElement = elem as ListElement;
				}
				elem = elem.getNextSibling();
			}
			
			//remove the first ListElement, since it's nested list, remove first one will remove all
			firstListElement.parent.removeChild(firstListElement);
			tf.flowComposer.updateAllControllers();
			elem = tf.getChildAt(0);
			var listsFound:int = 0;
			while (elem)
			{
				if (elem as ListElement)
				{	
					var listElement:ListElement = elem as ListElement;
					var elem2:FlowElement = listElement.getChildAt(0);
					var e:FlowGroupElement = FlowGroupElement (elem2);
					var i:int = 0;
					while (i < e.mxmlChildren.length)
					{
						if (e.mxmlChildren[i] as ListElement)
						{	
							var listElement1:ListElement = e.mxmlChildren[i] as ListElement;
							var elem3:FlowElement = listElement1.getChildAt(0);
							var e1:FlowGroupElement = FlowGroupElement (elem3);
							var j:int=0;
							while (j < e1.mxmlChildren.length)
							{
								if (e1.mxmlChildren[j] as ListElement)
								{	
									listsFound++;
								}
								j++;
							}
							listsFound++;
						}
						i++;
					}
					listsFound++;
				}
				elem = elem.getNextSibling();
			}
			
			//check 0 list found after removal
			assertTrue("Expected 0 list element found: " + listsFound, listsFound == 0);
		}
		
		public function addMultiListItem():void
		{
			SelManager.selectRange(0,0);
			var tf:TextFlow = SelManager.textFlow;
			
			//Add three DECIMAL list items
			var list:ListElement = new ListElement();
			list.listStyleType = ListStyleType.DECIMAL;
			tf.addChild(list);
			var item:ListItemElement = new ListItemElement();
			list.addChild(item);
			list.addChild(new ListItemElement());
			list.addChild(new ListItemElement());
			tf.flowComposer.updateAllControllers();
			
			// Iterate through the FlowElements, looking for a ListElement.
			var listItemsFound:int = 0;
			var elem:FlowElement = tf.getChildAt(0);
		
			while (elem)
			{
				if (elem as ListElement)
				{
					// save this for display check below
					var listElement:ListElement = elem as ListElement;
					var elem2:FlowElement = listElement.getChildAt(0)
					// look for ListItemElement
					while (elem2)
					{
						if (elem2 as ListItemElement)
						{
							listItemsFound++;
						}
						elem2 = elem2.getNextSibling();
					}
				}
				elem = elem.getNextSibling();
			}
			//check three listItems have been added
			assertTrue("Expected one list element in the model and found: " + listItemsFound, listItemsFound == 3);
	
			//Check export
			var exportedXML:XML = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT,ConversionType.XML_TYPE) as XML;
			// set the default namespace to what the exported XML uses
			var xmlns:Namespace = new Namespace("http://ns.adobe.com/textLayout/2008");
			default xml namespace = xmlns;
			
			// find all the nodes named "list"
			var listNodes:XMLList = exportedXML.child("list");
			assertTrue("Expected one list element and found: " + listNodes.length(), listNodes.length() == 1);
			
			//Check display.
			// determine what the bullet text should be
			var listItem:ListItemElement = new ListItemElement();
			var bulletText:String = "";
			var markerLength:int = 0;
			var listStartIndex:int = 0;
			var listFlowLine:TextFlowLine;
			var listLine:TextLine;
			var bulletLine:TextLine;
			for (var i:int=0; i<listItemsFound; i++)
			{
				listItem = listElement.getChildAt(i) as ListItemElement;
				bulletText = listElement.computeListItemText(listItem, listItem.computedListMarkerFormat());
				markerLength = bulletText.length + 1;
				// find the TextFlowLine for the list start
				listStartIndex = listElement.getElementRelativeStart(tf);
				listFlowLine = tf.flowComposer.findLineAtPosition(listStartIndex);
				listLine = listFlowLine.getTextLine();
				bulletLine = listLine.getChildAt(0) as TextLine;
				assertTrue("Did not find a TextLine for the bullet", bulletLine !=null);
				assertTrue("text length for the bullet line should be " + markerLength + ", but was " + bulletLine.rawTextLength, bulletLine.rawTextLength == markerLength);
			}
		}
		
		public function checkMarkerRegeneration():void
		{
			SelManager.selectRange(0,0);
			var tf:TextFlow = SelManager.textFlow;
			
			//Add four CJK_HEAVENLY_STEM list items
			var list:ListElement = new ListElement();
			list.listStyleType = ListStyleType.CJK_HEAVENLY_STEM;
			tf.addChild(list);
			var item:ListItemElement = new ListItemElement();
			list.addChild(item);
			list.addChild(new ListItemElement());
			list.addChild(new ListItemElement());
			list.addChild(new ListItemElement());
			tf.flowComposer.updateAllControllers();			
			
			var elem:FlowElement = tf.getChildAt(0);
			while (elem)
			{
				if (elem as ListElement)
				{
					// save this for list Marker check below
					var listElement:ListElement = elem as ListElement;
				}
				elem = elem.getNextSibling();
			}
			
			//check the Marker regeneration after adding list items, Check 3rd Marker
			var	listItem:ListItemElement = listElement.getChildAt(2) as ListItemElement;
			var	bulletText:String = listElement.computeListItemText(listItem, listItem.computedListMarkerFormat());
			assertTrue("Marker regeneration is incorrect after adding a new list item", bulletText == "丙.");
		
			//check the Marker regeneration after removing list items, Recheck 3rd Marker after remove 2nd Marker
			list.removeChildAt(1);
			tf.flowComposer.updateAllControllers();	
			elem = tf.getChildAt(0);
			while (elem)
			{
				if (elem as ListElement)
				{
					// save this for Marker check
					listElement = elem as ListElement;
				}
				elem = elem.getNextSibling();
			}
			listItem = listElement.getChildAt(2) as ListItemElement;
			bulletText = listElement.computeListItemText(listItem, listItem.computedListMarkerFormat());
			assertTrue("Marker regeneration is incorrect after removing a list item ", bulletText == "丙.");
		
			//check the Marker regeneration after changing the listStyeType
			list.listStyleType = ListStyleType.DIAMOND;
			listItem = listElement.getChildAt(2) as ListItemElement;
			bulletText = listElement.computeListItemText(listItem, listItem.computedListMarkerFormat());
			assertTrue("Marker regeneration is incorrect after changing listStyleType ", bulletText == "◆");
			
			list.listStyleType = ListStyleType.LOWER_GREEK;
			listItem = listElement.getChildAt(2) as ListItemElement;
			bulletText = listElement.computeListItemText(listItem, listItem.computedListMarkerFormat());
			assertTrue("Marker regeneration is incorrect after changing listStyleType ", bulletText == "γ.");
		}
		
		public function removeListItem():void
		{
			SelManager.selectRange(0,0);
			var tf:TextFlow = SelManager.textFlow;
			
			//Add four ARABIC_INDIC list items
			var list:ListElement = new ListElement();
			list.listStyleType = ListStyleType.ARABIC_INDIC;
			tf.addChild(list);
			var item:ListItemElement = new ListItemElement();
			list.addChild(item);
			list.addChild(new ListItemElement());
			list.addChild(new ListItemElement());
			list.addChild(new ListItemElement());
			//Remove one list item
			list.removeChildAt(1);
			tf.flowComposer.updateAllControllers();
			
			// Iterate through the FlowElements, looking for a ListElement.
			var listItemsFound:int = 0;
			var elem:FlowElement = tf.getChildAt(0);
			
			while (elem)
			{
				if (elem as ListElement)
				{
					// save this for display check below
					var listElement:ListElement = elem as ListElement;
					var elem2:FlowElement = listElement.getChildAt(0)
					while (elem2)
					{
						if (elem2 as ListItemElement)
						{
							listItemsFound++;
						}
						elem2 = elem2.getNextSibling();
					}
				}
				elem = elem.getNextSibling();
			}
			
			//check three listItems are still existing
			assertTrue("Expected one list element in the model and found: " + listItemsFound, listItemsFound == 3);
			
			//Check export
			var exportedXML:XML = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT,ConversionType.XML_TYPE) as XML;
			// set the default namespace to what the exported XML uses
			var xmlns:Namespace = new Namespace("http://ns.adobe.com/textLayout/2008");
			default xml namespace = xmlns;
			
			// find all the nodes named "list"
			var listNodes:XMLList = exportedXML.child("list");
			assertTrue("Expected one list element and found: " + listNodes.length(), listNodes.length() == 1);
			
			//Check display.
			var listItem:ListItemElement = new ListItemElement();
			var bulletText:String = "";
			var markerLength:int = 0;
			var listStartIndex:int = 0;
			var listFlowLine:TextFlowLine;
			var listLine:TextLine;
			var bulletLine:TextLine;
			for (var i:int=0; i<listItemsFound; i++)
			{
				listItem = listElement.getChildAt(i) as ListItemElement;
				bulletText = listElement.computeListItemText(listItem, listItem.computedListMarkerFormat());
				markerLength = bulletText.length + 1;
				// find the TextFlowLine for the list start
				listStartIndex = listElement.getElementRelativeStart(tf);
				listFlowLine = tf.flowComposer.findLineAtPosition(listStartIndex);
				listLine = listFlowLine.getTextLine();
				bulletLine = listLine.getChildAt(0) as TextLine;
				assertTrue("Did not find a TextLine for the bullet", bulletLine !=null);
				assertTrue("text length for the bullet line should be " + markerLength + ", but was " + bulletLine.rawTextLength, bulletLine.rawTextLength == markerLength);
			}
		}
		public function crossContainers():void
		{	
			var TestCanvas:Canvas;
			TestDisplayObject = testApp.getDisplayObject();
			if (TestDisplayObject)
			{
				TestCanvas = Canvas(TestDisplayObject);
			}
			var tf:TextFlow = new TextFlow();
			
			tf.flowComposer = new StandardFlowComposer();
			//create three linked containers
			
			var container1:Sprite = new Sprite();
			var container2:Sprite = new Sprite();
			var container3:Sprite = new Sprite();
			var controllerOne:ContainerController = new ContainerController(container1,100,100);
			var controllerTwo:ContainerController = new ContainerController(container2,100,100);
			var controllerThree:ContainerController = new ContainerController(container3,100,100);
			
			TestCanvas.rawChildren.addChild(container1);
			TestCanvas.rawChildren.addChild(container2);
			TestCanvas.rawChildren.addChild(container3);
			
			container1.x = 50;
			container1.y = 100;
			container2.x = 150;
			container2.y = 100;
			container3.x = 250;
			container3.y = 100;
			
			// add the controllers to the text flow and update them
			tf.flowComposer.addController(controllerOne);
			tf.flowComposer.addController(controllerTwo);
			tf.flowComposer.addController(controllerThree);
			controllerOne.verticalScrollPolicy = ScrollPolicy.AUTO;
			controllerTwo.verticalScrollPolicy = ScrollPolicy.AUTO;
			controllerThree.verticalScrollPolicy = ScrollPolicy.AUTO;
			tf.interactionManager = new EditManager();
			tf.flowComposer.updateAllControllers();
			
			//create List			
			var listElement:ListElement = new ListElement();
			listElement.listStyleType = ListStyleType.DECIMAL;
			tf.addChild(listElement);
			for(var i:int = 0; i<21; i++){
				listElement.addChild(new ListItemElement());				
			}			
			tf.flowComposer.updateAllControllers();			
			
			//Get the ListElment.
			var elem:FlowElement = tf.getChildAt(0);
			var listElem:ListElement;
			while (elem)
			{
				if (elem as ListElement)
				{
					// save this for list Marker check below
					listElem = elem as ListElement;
				}
				elem = elem.getNextSibling();
			}
			
			//check the Marker generation
			var listItem:ListItemElement;
			var bulletText:String;
			for(var j:int = 0; j <listElem.numChildren; j++ ){
				listItem = listElem.getChildAt(j) as ListItemElement;
				
				bulletText = listElem.computeListItemText(listItem, listItem.computedListMarkerFormat());
				assertTrue("Marker generation is incorrect after crossing the containers ",bulletText == ((j+1)+"."));
			}			
		}
		public function scrollByLinesTest():void
		{
			var TestCanvas:Canvas;
			TestDisplayObject = testApp.getDisplayObject();
			if (TestDisplayObject)
			{
				TestCanvas = Canvas(TestDisplayObject);
			}
			
			var Markup:String = "<flow:TextFlow xmlns:flow='http://ns.adobe.com/textLayout/2008'> " +
				"<flow:p>before</flow:p>" +
				"<flow:list listStyleType='decimal'>" +
				"<flow:li>one</flow:li>" +
				"<flow:li>two</flow:li>" +
				"<flow:li>three</flow:li>" +
				"<flow:li>four</flow:li>" +
				"<flow:li>five</flow:li>" +
				"<flow:li>six</flow:li>" +
				"<flow:li>seven</flow:li>" +
				"<flow:li>eight</flow:li>" +
				"<flow:li>nine</flow:li>" +
				"<flow:li>ten</flow:li>" +				
				"</flow:list>" +
				"<flow:p>after</flow:p>" +
				"<flow:p></flow:p>" +
				"<flow:list listStyleType='upperAlpha' listStylePosition='inside'>" +
				"<flow:listMarkerFormat>" +
				"<flow:ListMarkerFormat beforeContent='Chapter ' content='counters(ordered,&quot;.&quot;,upperRoman)' afterContent='&#x9;'/>" +
				"</flow:listMarkerFormat>" +
				"<flow:li>" +
				"<p><span>First</span></p>" +
				"<flow:list>" +
				"<flow:listMarkerFormat>" +
				"<flow:ListMarkerFormat beforeContent='Section ' content='counters(ordered,&quot;.&quot;,upperRoman)' afterContent='&#x9;'/>" +
				"</flow:listMarkerFormat>" +
				"<flow:li>one</flow:li>" +
				"<flow:li>two</flow:li>" +
				"<flow:li>three</flow:li>" +
				"<flow:li>four</flow:li>" +
				"<flow:li>five</flow:li>" +
				"<flow:li>six</flow:li>" +
				"<flow:li>seven</flow:li>" +
				"<flow:li>eight</flow:li>" +
				"<flow:li>nine</flow:li>" +
				"<flow:li>ten</flow:li>" +	
				"</flow:list>" +
				"</flow:li>" +
				"</flow:list>" +
				"</flow:TextFlow>";
			var tf:TextFlow = TextConverter.importToFlow(Markup, TextConverter.TEXT_LAYOUT_FORMAT);			
			tf.flowComposer = new StandardFlowComposer();
			var blockProgression:String = tf.computedFormat.blockProgression;			
			
			var container:Sprite = new Sprite();			
			var controller:ContainerController = new ContainerController(container,200,100);
			
			TestCanvas.rawChildren.addChild(container);	
			container.x = 50;
			container.y = 50;			
			
			// add the controller to the text flow and update them
			tf.flowComposer.addController(controller);	
			controller.verticalScrollPolicy = ScrollPolicy.AUTO;
			tf.interactionManager = new EditManager();
			tf.flowComposer.updateAllControllers();
			
			var beforePosition:Array;
			var beforeFirstVisibleLine:int;
			var beforeLastVisibleLine:int;
			var afterPosition:Array;
			var afterFirstVisibleLine:int;
			var afterLastVisibleLine:int;
		
			var amount:Number;			
			var numberOfLines:int = 1;

			for (var i:int = 0; i< 17; i++){
				
				beforePosition = findFirstAndLastVisibleLine(tf.flowComposer, controller);
				
				amount = controller.getScrollDelta(numberOfLines);
				if (blockProgression == BlockProgression.TB)
					controller.verticalScrollPosition += amount;
				else
					controller.horizontalScrollPosition -= amount;
				
				tf.flowComposer.updateAllControllers();
				beforeFirstVisibleLine = beforePosition[0];
				beforeLastVisibleLine = beforePosition[1];
				
				afterPosition = findFirstAndLastVisibleLine(tf.flowComposer, controller);
				afterFirstVisibleLine = afterPosition[0];
				afterLastVisibleLine = afterPosition[1];
				
				// Check that we did scroll forward, and check that some text that was visible before is still visible.				
				assertTrue("scrollMultipleLines didn't advance scroll correctly at line "+ (i+1), afterFirstVisibleLine == beforeFirstVisibleLine + numberOfLines);
			}
			
			
		}
		// Copy of function in ContainerControllerBase -- if you change that one, change this one too!
		private function findFirstAndLastVisibleLine(flowComposer:IFlowComposer, controller:ContainerController):Array
		{
			var firstLine:int = flowComposer.findLineIndexAtPosition(controller.absoluteStart);
			var lastLine:int = flowComposer.findLineIndexAtPosition(controller.absoluteStart + controller.textLength - 1);
			var lastColumn:int = 0;
			var firstVisibleLine:int = -1;
			var lastVisibleLine:int = -1;
			for (var lineIndex:int = firstLine; lineIndex <= lastLine; lineIndex++)
			{
				var curLine:TextFlowLine = flowComposer.getLineAt(lineIndex);
				if (curLine.controller != controller)
					continue;
				
				// skip until we find the lines in the last column
				if (curLine.columnIndex != lastColumn)
					continue;
				
				if (curLine.textLineExists && curLine.getTextLine().parent)
				{
					if (firstVisibleLine < 0)
						firstVisibleLine = lineIndex;
					
					lastVisibleLine = lineIndex;
				}
			}
			
			return [firstVisibleLine, lastVisibleLine];
		}

		public function SplitAndMergeCauseMarkerRegeneration():void
		{
			SelManager.selectAll();
			SelManager.deleteText();
			SelManager.selectRange(0,0);
			var tf:TextFlow = SelManager.textFlow;
			tf.removeChildAt(0);
			var list:ListElement = new ListElement();
			list.listStyleType = ListStyleType.DECIMAL;
			
			tf.addChild(list);
			var item:ListItemElement = new ListItemElement();
			list.addChild(item);
			list.addChild(new ListItemElement());
			list.addChild(new ListItemElement());
			tf.flowComposer.updateAllControllers();				
			
			//check the Marker regeneration after merging list items
			SelManager.selectRange(2,2);
			var kBackSpace:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, Keyboard.BACKSPACE);
			TestFrame.container["dispatchEvent"](kBackSpace);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			
			var	listItem1:ListItemElement = list.getChildAt(0) as ListItemElement;
			var	bulletText1:String = list.computeListItemText(listItem1, listItem1.computedListMarkerFormat());			
			var	listItem2:ListItemElement = list.getChildAt(1) as ListItemElement;
			var	bulletText2:String = list.computeListItemText(listItem2, listItem2.computedListMarkerFormat());
			assertTrue("Marker regeneration is incorrect after merging a new list item", 
				bulletText1 == "1." && bulletText2 == "2.");
			
			//check the Marker regeneration after spliting list items
			SelManager.selectRange(0,0);
			var kEnter:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, Keyboard.ENTER);
			TestFrame.container["dispatchEvent"](kEnter);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			
			listItem1 = list.getChildAt(0) as ListItemElement;
			bulletText1 = list.computeListItemText(listItem1, listItem1.computedListMarkerFormat());			
			listItem2 = list.getChildAt(1) as ListItemElement;
			bulletText2 = list.computeListItemText(listItem2, listItem2.computedListMarkerFormat());
			var	listItem3:ListItemElement = list.getChildAt(2) as ListItemElement;	
			var	bulletText3:String = list.computeListItemText(listItem3, listItem3.computedListMarkerFormat());
			assertTrue("Marker regeneration is incorrect after spliting a new list item",
				bulletText1 == "1." && bulletText2 == "2." &&  bulletText3 == "3.");
		}
		
		public function listItemGoOutOfList():void
		{
			SelManager.selectAll();
			SelManager.deleteText();
			SelManager.selectRange(0,0);
			var tf:TextFlow = SelManager.textFlow;
			tf.removeChildAt(0);
			var list:ListElement = new ListElement();
			list.listStyleType = ListStyleType.DECIMAL;
			
			tf.addChild(list);
			var item1:ListItemElement = new ListItemElement();
			var item2:ListItemElement = new ListItemElement();
			var para1:ParagraphElement = new ParagraphElement();
			var para2:ParagraphElement = new ParagraphElement();
			var span1:SpanElement = new SpanElement();
			span1.text = "ab";
			var span2:SpanElement = new SpanElement();
			span2.text = "cd";
			list.addChild(item1);
			list.addChild(item2);
			item1.addChild(para1);
			para1.addChild(span1);
			item2.addChild(para2);
			para2.addChild(span2);
			list.addChild(new ListItemElement());

			tf.flowComposer.updateAllControllers();	

			var kEnter:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, Keyboard.ENTER);
			var kBackSpace:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, Keyboard.BACKSPACE);
			
			//Enter on an empty list item at the end of the list should remove the empty item and put the cursor after the list
			SelManager.selectRange(6,6);
			TestFrame.container["dispatchEvent"](kEnter);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			
			assertTrue("Number of Items in List is incorrect after ente on an empty list item at the end of the list", 
				list.numChildren == 2);
			assertTrue("Item out of List is incorrect after enter on an empty list item at the end of the list", 
				tf.getChildAt(0) is ListElement && tf.getChildAt(1) is ParagraphElement);
			
			//Backspace from the beginning of first item should pull item out of the list and regenerate markers.
			SelManager.selectRange(0,0);
			TestFrame.container["dispatchEvent"](kBackSpace);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
						
			var listItem1:ListItemElement = list.getChildAt(0) as ListItemElement;
			var	marker:String = list.computeListItemText(listItem1, listItem1.computedListMarkerFormat());	
			assertTrue("Marker is incorrect after backspace from the beginning of first item", marker == "1.");
			var elem1:ParagraphElement = tf.getChildAt(0) as ParagraphElement;
			var elem2:ListElement = tf.getChildAt(1) as ListElement;
			span1 = elem1.getChildAt(0) as SpanElement;
			item2 = elem2.getChildAt(0) as ListItemElement;
			para2 = item2.getChildAt(0) as ParagraphElement;
			span2 = para2.getChildAt(0) as SpanElement;
			assertTrue("Item out of List is incorrect after backspace from the beginning of first item", 
				tf.getChildAt(0) is ParagraphElement && tf.getChildAt(1) is ListElement && span1.text == "ab" );
			assertTrue("The first item is incorrect backspace from the beginning of first item", span2.text == "cd");
			assertTrue("Number of Items is incorrect after backspace from the beginning of first item", list.numChildren == 1);
		}
		public function splitElementOperationTest():void
		{
			var tf:TextFlow = SelManager.textFlow;
			var listItemMarkup:String = "<TextFlow xmlns='http://ns.adobe.com/textLayout/2008'>"
				+"<list><li><div><p><span>が全然分からへん。</span><tcy>12</tcy></p></div></li></list>"
				+"</TextFlow>";
			var listFlow:TextFlow = TextConverter.importToFlow(listItemMarkup,TextConverter.TEXT_LAYOUT_FORMAT);
			var list:ListElement = listFlow.getChildAt(0) as ListElement;
			var listCopy:ListElement;

			// splitElementOperation on List at the beginnning
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			var xmlOut:XML = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			SelManager.selectRange(0,0);
			EditManager(SelManager).splitElement(listCopy as ListElement);
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of Lists is incorrect after splitElementOperation on List at the beginnning",tf.numChildren == 2 );
			
			// splitElementOperation on List in the middle
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			SelManager.selectRange(3,3);
			EditManager(SelManager).splitElement(listCopy as ListElement);
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of Lists is incorrect after splitElementOperation on List in the middle",tf.numChildren == 2 );
			
			// splitElementOperation on List at the end
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			SelManager.selectRange(13,13);
			EditManager(SelManager).splitElement(listCopy as ListElement);
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of Lists is incorrect after splitElementOperation on List at the end",tf.numChildren == 2 );
			
			// splitElementOperation on ListItem at the beginnning
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			SelManager.selectRange(0,0);
			list = tf.getChildAt(0) as ListElement;
			EditManager(SelManager).splitElement(list.getChildAt(0)as ListItemElement);
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of ListItems is incorrect after splitElementOperation on ListItem at the beginnning", listCopy.numChildren == 2 );
			
			// splitElementOperation on ListItem in the middle
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			SelManager.selectRange(3,3);
			list = tf.getChildAt(0) as ListElement;
			EditManager(SelManager).splitElement(list.getChildAt(0)as ListItemElement);
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of ListItems is incorrect after splitElementOperation on ListItem in the middle", listCopy.numChildren == 2 );
			
			// splitElementOperation on ListItem at the end
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			SelManager.selectRange(13,13);
			list = tf.getChildAt(0) as ListElement;
			EditManager(SelManager).splitElement(list.getChildAt(0)as ListItemElement);
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of ListItems is incorrect after splitElementOperation on ListItem at the end", listCopy.numChildren == 2 );
			
			// splitElementOperation on div at the beginnning
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			SelManager.selectRange(0,0);
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			list = tf.getChildAt(0) as ListElement;
			var listItem: ListItemElement = list.getChildAt(0) as ListItemElement;
			EditManager(SelManager).splitElement(listItem.getChildAt(0) as DivElement);
			listCopy = tf.getChildAt(0) as ListElement;
			listItem = listCopy.getChildAt(0) as ListItemElement;
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of Divs is incorrect after splitElementOperation on Div at the beginnning", listItem.numChildren == 2 );
			
			// splitElementOperation on div in the middle
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			SelManager.selectRange(3,3);
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			EditManager(SelManager).splitElement(listItem.getChildAt(0) as DivElement);
			listCopy = tf.getChildAt(0) as ListElement;
			listItem = listCopy.getChildAt(0) as ListItemElement;
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of Divs is incorrect after splitElementOperation on Div in the middle", listItem.numChildren == 2 );
			
			// splitElementOperation on div at the end
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			SelManager.selectRange(13,13);
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			EditManager(SelManager).splitElement(listItem.getChildAt(0) as DivElement);
			listCopy = tf.getChildAt(0) as ListElement;
			listItem = listCopy.getChildAt(0) as ListItemElement;
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of Divs is incorrect after splitElementOperation on Div at the end", listItem.numChildren == 2 );
			
			
			// splitElementOperation on paragraph at the beginnning
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			
			SelManager.selectRange(0,0);
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			var div: DivElement = listItem.getChildAt(0) as DivElement;
			EditManager(SelManager).splitElement(div.getChildAt(0) as ParagraphElement);
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			div = listItem.getChildAt(0) as DivElement;
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of para is incorrect after splitElementOperation on para at the beginnning", div.numChildren == 2 );	
			
			// splitElementOperation on paragraph in the middle
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			
			SelManager.selectRange(3,3);
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			div = listItem.getChildAt(0) as DivElement;
			EditManager(SelManager).splitElement(div.getChildAt(0) as ParagraphElement);
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			div = listItem.getChildAt(0) as DivElement;
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of para is incorrect after splitElementOperation on para in the middle", div.numChildren == 2 );	
			
			// splitElementOperation on paragraph at the end
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			
			SelManager.selectRange(13,13);
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			div = listItem.getChildAt(0) as DivElement;
			EditManager(SelManager).splitElement(div.getChildAt(0) as ParagraphElement);
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			div = listItem.getChildAt(0) as DivElement;
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of para is incorrect after splitElementOperation on para at the end", div.numChildren == 2 );	
			
			// splitElementOperation on tcy
			/*list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			
			SelManager.selectRange(10,10);
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			div = listItem.getChildAt(0) as DivElement;
			var para: ParagraphElement = div.getChildAt(0) as ParagraphElement;

			EditManager(SelManager).splitElement(para.getChildAt(1) as TCYElement);
			list = tf.getChildAt(0) as ListElement;
			listItem = list.getChildAt(0) as ListItemElement;
			div = listItem.getChildAt(0) as DivElement;
			para = div.getChildAt(0) as ParagraphElement;
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of TCY is incorrect after splitElementOperation on TCY", para.numChildren == 3 ); */
		}
		
		public function enterSplitListItem():void
		{
			var tf:TextFlow = SelManager.textFlow;
			var listItemMarkup:String = "<TextFlow xmlns='http://ns.adobe.com/textLayout/2008'>"
				+"<list><li><div><p><span>abc</span></p></div></li></list>"
				+"</TextFlow>";
			var listFlow:TextFlow = TextConverter.importToFlow(listItemMarkup,TextConverter.TEXT_LAYOUT_FORMAT);
			var list:ListElement = listFlow.getChildAt(0) as ListElement;
			var listCopy:ListElement;
			
			// setup
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			// enter at the beginning of a list item
			var kEnter:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, Keyboard.ENTER);
			SelManager.selectRange(0,0);
			TestFrame.container["dispatchEvent"](kEnter);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			var xmlOut:XML = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			list = tf.getChildAt(0) as ListElement;
			assertTrue("The number of list items is incorrect after enter at the beginning", list.numChildren == 2 );
			var item1:ListItemElement = list.getChildAt(0) as ListItemElement;
			assertTrue("The structure of the first item created after enter at the beginning is incorrect", 
				item1.getChildAt(0) is DivElement );
			var div1:DivElement = item1.getChildAt(0) as DivElement; 
			var para1:ParagraphElement = div1.getChildAt(0) as ParagraphElement;
			var span1:SpanElement = para1.getChildAt(0) as SpanElement;
			assertTrue("The text of the first item created after enter at the beginning is incorrect", span1.text == "");
			var item2:ListItemElement = list.getChildAt(1) as ListItemElement;
			assertTrue("The structure of the second item created after enter at the beginning is incorrect", 
				item2.getChildAt(0) is DivElement);
			var div2:DivElement = item2.getChildAt(0) as DivElement;
			var para2:ParagraphElement = div2.getChildAt(0) as ParagraphElement;
			var span2:SpanElement = para2.getChildAt(0) as SpanElement;
			assertTrue("The text of the second item created after enter at the beginning is incorrect", span2.text == "abc");
			
			// setup
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			// enter in the middle of a list item
			SelManager.selectRange(2,2);
			TestFrame.container["dispatchEvent"](kEnter);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			list = tf.getChildAt(0) as ListElement;
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			assertTrue("The number of list items is incorrect after enter in the middle", list.numChildren == 2 );
			item1 = list.getChildAt(0) as ListItemElement;
			assertTrue("The structure of the first item created after enter in the middle is incorrect", 
				item1.getChildAt(0) is DivElement);
			div1 = item1.getChildAt(0) as DivElement;
			para1 = div1.getChildAt(0) as ParagraphElement;
			span1 = para1.getChildAt(0) as SpanElement;
			assertTrue("The text of the  first item created after enter in the middle is incorrect", span1.text == "ab");
			item2 = list.getChildAt(1) as ListItemElement;
			assertTrue("The structure of the second item created after enter in the middle is incorrect", 
				item2.getChildAt(0) is DivElement);
			div2 = item2.getChildAt(0) as DivElement;
			para2 = div2.getChildAt(0) as ParagraphElement;
			span2 = para2.getChildAt(0) as SpanElement;
			assertTrue("The text of the second item created after enter in the middle is incorrect", span2.text == "c");
			
			// setup
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			// enter at the end of a list item
			SelManager.selectRange(3,3);
			TestFrame.container["dispatchEvent"](kEnter);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			list = tf.getChildAt(0) as ListElement;
			assertTrue("The number of list items is incorrect after enter at the end", list.numChildren == 2 );
			item1 = list.getChildAt(0) as ListItemElement;
			assertTrue("The structure of the first item created after enter at the end is incorrect", 
				item1.getChildAt(0) is DivElement);
			div1 = item1.getChildAt(0) as DivElement;
			para1 = div1.getChildAt(0) as ParagraphElement;
			span1 = para1.getChildAt(0) as SpanElement;
			assertTrue("The text of the first item created after enter at the end is incorrect", span1.text == "abc");
			item2 = list.getChildAt(1) as ListItemElement;
			assertTrue("The structure of the second item created after enter at the end is incorrect", 
				item2.getChildAt(0) is DivElement);
			div2 = item2.getChildAt(0) as DivElement;
			para2 = div2.getChildAt(0) as ParagraphElement;
			span2 = para2.getChildAt(0) as SpanElement;
			assertTrue("The text of the second item created after enter at the end is incorrect", span2.text == "");
		}
		
		public function backspaceMergeListItem():void
		{
			var tf:TextFlow = SelManager.textFlow;
			var listItemMarkup:String = "<TextFlow xmlns='http://ns.adobe.com/textLayout/2008'>"
				+"<list>"
				+"<li><p><span>ab</span></p></li>"
				+"<li><p><span>cd</span></p></li>"
				+"<li><div><p><span>ef</span></p></div></li>"
				+"<li><p><tcy><span>ab</span></tcy></p></li>"
				+"<li><p><tcy><span>cd</span></tcy></p></li>"
				+"<li><div><p><span>ef</span></p></div></li>"
				+"<li><div><p><span>gh</span></p></div></li>"
				+"</list>"
				+"</TextFlow>";
			var listFlow:TextFlow = TextConverter.importToFlow(listItemMarkup,TextConverter.TEXT_LAYOUT_FORMAT);
			var list:ListElement = listFlow.getChildAt(0) as ListElement;
			var listCopy:ListElement;

			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			//merge two list items that have only paragraph element
			var kBackspace:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN, true, false, Keyboard.BACKSPACE);
			SelManager.selectRange(3,3);
			TestFrame.container["dispatchEvent"](kBackspace);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			var xmlOut:XML = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			list = tf.getChildAt(0) as ListElement;
			assertTrue("The number of list items is incorrect after merging two list items that have only paragraph element", 
				list.numChildren == 6 );
			var item1:ListItemElement = list.getChildAt(0) as ListItemElement;
			assertTrue("The structure of the item created after merging two list items that have only paragraph element", 
				item1.numChildren == 1 && item1.getChildAt(0) is ParagraphElement);
			var para:ParagraphElement = item1.getChildAt(0) as ParagraphElement;
			var span:SpanElement = para.getChildAt(0) as SpanElement;
			assertTrue("The text of the item created after merging two list items that have only paragraph element", span.text == "abcd");

			//merge two list items that both have paragraph nested in Div
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			
			SelManager.selectRange(18,18);
			TestFrame.container["dispatchEvent"](kBackspace);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			list = tf.getChildAt(0) as ListElement;
			assertTrue("The number of list items is incorrect after merging two list items that have only paragraph element", 
				list.numChildren == 6 );
			item1 = list.getChildAt(0) as ListItemElement;
			var div:DivElement = item1.getChildAt(0) as DivElement; 
			assertTrue("The structure of the item created after merging two list items that have only paragraph element", 
				item1.numChildren == 1 && item1.getChildAt(0) is DivElement);
			para = div.getChildAt(0) as ParagraphElement;
			span = para.getChildAt(0) as SpanElement;
			assertTrue("The text of the item created after merging two list items that have only paragraph element", span.text == "efgh");
			
			//merge two list items that have different elements
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			
			SelManager.selectRange(6,6);
			TestFrame.container["dispatchEvent"](kBackspace);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			list = tf.getChildAt(0) as ListElement;
			assertTrue("The number of list items is incorrect after merging two list items that have different elements", 
				list.numChildren == 6 );
			var item2:ListItemElement = list.getChildAt(1) as ListItemElement;
			assertTrue("The structure of the item created after merging two list items that have different elements is incorrect", 
				item2.numChildren == 2 && item2.getChildAt(0) is ParagraphElement && item2.getChildAt(1) is DivElement);
			var para1:ParagraphElement = item2.getChildAt(0) as ParagraphElement;
			div = item2.getChildAt(1) as DivElement;
			var para2:ParagraphElement = div.getChildAt(0) as ParagraphElement;
			var span1:SpanElement = para1.getChildAt(0) as SpanElement;
			var span2:SpanElement = para2.getChildAt(1) as SpanElement;
			assertTrue("The text of the item created after merging two list items that have different elements is incorrect", 
				span1.text == "cd" && span2.text == "ef" );
			
			//merge two list items that have only tcy nested in paragraph
			list = listFlow.getChildAt(0) as ListElement;
			listCopy = list.deepCopy(0,list.textLength) as ListElement;
			tf.replaceChildren(0,tf.numChildren,listCopy);
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			
			SelManager.selectRange(12,12);
			TestFrame.container["dispatchEvent"](kBackspace);
			SelManager.flushPendingOperations();			
			tf.flowComposer.updateAllControllers();
			xmlOut = TextConverter.export(tf,TextConverter.TEXT_LAYOUT_FORMAT, ConversionType.XML_TYPE) as XML;
			trace(xmlOut);
			list = tf.getChildAt(0) as ListElement;
			assertTrue("The number of list items is incorrect after merging two list items that have tcy nested in paragraph", 
				list.numChildren == 6 );
			var item3:ListItemElement = list.getChildAt(3) as ListItemElement;
			para = item3.getChildAt(0) as ParagraphElement;
			var tcy:TCYElement = para.getChildAt(0) as TCYElement;
			assertTrue("The structure of the item created after merging two list items that have tcy nested in paragraph is incorrect", 
				item3.numChildren == 1 && para.numChildren == 1);
			span = tcy.getChildAt(0) as SpanElement;
			assertTrue("The text of the item created after merging two list items that have tcy nested in paragraph is incorrect", 
				span.text == "abcd");
		}
		
		public function tabsInMarkerFormat():void
		{
			var textFlow:TextFlow = SelManager.textFlow;
			SelManager.selectRange(0,0);
			textFlow.format = null;
			textFlow.replaceChildren(0,textFlow.numChildren);
			
			var list:ListElement = new ListElement()
			list.listStyleType = "decimal"; 
			list.listStylePosition = "inside";
			list.paddingLeft = "0";
			
			var listMarkerFormat:ListMarkerFormat = new ListMarkerFormat();
			var tabStops:Array = new Array();
			var tabstop:TabStopFormat = new TabStopFormat();
			tabstop.position = 50;
			var tabstop2:TabStopFormat = new TabStopFormat();
			tabstop2.position = 80;
			tabStops.push(tabstop);
			tabStops.push(tabstop2);
			listMarkerFormat.tabStops = tabStops;
			listMarkerFormat.beforeContent = "- ";
			listMarkerFormat.afterContent = String.fromCharCode(0x9);
			
			var item:ListItemElement;
			item = new ListItemElement();
			item.listMarkerFormat = listMarkerFormat;
			var paragraphElement:ParagraphElement = new ParagraphElement();
			var spanElement:SpanElement = new SpanElement();
			spanElement.text = "Text starts here";
			paragraphElement.addChild(spanElement);
			item.addChild(paragraphElement);
			list.addChild(item);
			textFlow.addChild(list);
			
			textFlow.flowComposer.updateAllControllers()
		}
	}
}