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

	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.text.engine.TextLine;
	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.FlowLeafElement;
	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;

	import org.flexunit.asserts.assertTrue;

	use namespace tlf_internal;

	[TestCase(order=31)]
	public class ListTest extends VellumTestCase
	{
		public function ListTest()
		{
			super("", "ListTest", TestConfig.getInstance());

			metaData = {};
			metaData.productArea = "Lists";
		}

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

		[Test]
		public function addList():void
		{
			super.setUpTest();
			// 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);
		}

		[Test]
		public function addNestedLists():void
		{
			super.setUpTest();
			//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);
			}

		}

		[Test]
		public function removeNestedLists():void
		{
			super.setUpTest();
			//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);
		}

		[Test]
		public function addDivInList():void
		{
			super.setUpTest();

			var tf:TextFlow = SelManager.textFlow;
			SelManager.selectAll();
			SelManager.deleteText();
			
			var list:ListElement = new ListElement();
			list.listStyleType = ListStyleType.DECIMAL;
			var item:ListItemElement = new ListItemElement();
			var paragraphElement:ParagraphElement = new ParagraphElement();
			var spanElement:SpanElement = new SpanElement();
			spanElement.text = "Decimal list";
			paragraphElement.addChild(spanElement);
			var divElementCreated:DivElement = SelManager.createDiv();
			divElementCreated.addChild(paragraphElement);
			item.addChild(divElementCreated);
			list.addChild(item);
			tf.addChild(list);

			tf.flowComposer.updateAllControllers();
			
			//to check if div element has been created successfully
			var elem:FlowLeafElement = tf.findLeaf(0);
			var divElement:DivElement =new DivElement();
			while (elem)
			{
				divElement = elem.getParentByType(DivElement) as DivElement;
				if (divElement as DivElement)
				{
					assertTrue("div element found doesn't match what was returned by createDiv()", divElement == divElementCreated);
				}
				elem = elem.getNextLeaf();
			}
		}

		[Test]
		public function addMultiListItem():void
		{
			super.setUpTest();

			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);
			}
		}

		[Test]
		public function checkMarkerRegeneration():void
		{
			super.setUpTest();

			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 == "γ.");
		}

		[Test]
		public function removeListItem():void
		{
			super.setUpTest();

			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);
			}
		}

		[Test]
		public function crossContainers():void
		{
			containerType = "custom";
			super.cleanUpTestApp();

			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)+"."));
			}			
		}

		[Test]
		public function scrollByLinesTest():void
		{
			containerType = "custom";
			super.cleanUpTestApp();

			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];
		}

		[Test]
		public function SplitAndMergeCauseMarkerRegeneration():void
		{
			super.setUpTest();

			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.");
		}

		[Test]
		public function listItemGoOutOfList():void
		{
			super.setUpTest();

			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);
		}

		[Test]
		public function splitElementOperationTest():void
		{
			super.setUpTest();

			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;

			// splitElementOperation on List at the beginnning
			var listCopy:ListElement = 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 ); 
			*/
		}

		[Test]
		public function enterSplitListItem():void
		{
			super.setUpTest();

			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 == "");
		}

		[Test]
		public function backspaceMergeListItem():void
		{
			super.setUpTest();

			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 = 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();
			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 both have paragraph nested in Div", 
				list.numChildren == 6 );
			item1 = list.getChildAt(5) as ListItemElement;
			var div:DivElement = item1.getChildAt(0) as DivElement; 
			assertTrue("The structure of the item created after merging two list items that both have paragraph nested in Div", 
				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 both have paragraph nested in Div", 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(9,9);
			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(2) as ListItemElement;
			div = item2.getChildAt(0) as DivElement;
			para = div.getChildAt(0) as ParagraphElement;
			assertTrue("The structure of the item created after merging two list items that have different elements is incorrect", 
				para.numChildren == 2 && para.getChildAt(0) is SpanElement && para.getChildAt(1) is TCYElement);			
			var span1:SpanElement = para.getChildAt(0) as SpanElement;
			var tcy:TCYElement = para.getChildAt(1) as TCYElement;
			var span2:SpanElement = tcy.getChildAt(0) as SpanElement;
			assertTrue("The text of the item created after merging two list items that have different elements is incorrect", 
				span1.text == "ef" && span2.text == "ab" );
			
			//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;
			assertTrue("The structure of the item created after merging two list items that have tcy nested in paragraph is incorrect", 
				item3.numChildren == 1 && item3.getChildAt(0) is ParagraphElement);
			para = item3.getChildAt(0) as ParagraphElement;
			tcy = para.getChildAt(0) as TCYElement;			
			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");
		}

		[Test]
		public function tabsInMarkerFormat():void
		{
			super.setUpTest();

			var textFlow:TextFlow = SelManager.textFlow;
			SelManager.selectRange(0,0);
			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 = [];
			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();
		}

		[Test]
		public function listMarkerFormatTest():void
		{
			super.setUpTest();

			var textFlow:TextFlow = SelManager.textFlow;
			SelManager.selectRange(0,0);
			//textFlow.format = null;
			textFlow.replaceChildren(0,textFlow.numChildren);
			
			var p:ParagraphElement = new ParagraphElement();
			var span:SpanElement = new SpanElement();
			var listElement:ListElement = new ListElement();
			listElement.listStyleType = "decimal"; 
			listElement.listStylePosition = "inside";
			listElement.paddingLeft = "0";
			var listItemElement:ListItemElement = new ListItemElement();
			
			var listMarkerFormat:ListMarkerFormat = new ListMarkerFormat();
			var listMarkerFormat2:ListMarkerFormat = new ListMarkerFormat();
			
			//concat test
			// set format attributes in the first one
			listMarkerFormat.afterContent = "*";
			listMarkerFormat.color = 0x336633;
			listMarkerFormat.fontSize = 18;
			// set some of the same attributes on the second one listMarkerFormat2
			listMarkerFormat2.color = 0x0000CC;
			listMarkerFormat2.fontSize = 12;
			listMarkerFormat2.fontFamily = "Arial, Helvetica, _sans";
			
			// concat listMarkerFormat2 settings;		
			listMarkerFormat.concat(listMarkerFormat2);	
			//assign format to the listElement
			listItemElement.listMarkerFormat = listMarkerFormat;
			
			assertTrue("concat doesn't work properly. ",listMarkerFormat.afterContent == "*" &&
				listMarkerFormat.color == 0x336633 &&
				listMarkerFormat.fontSize == 18 &&
				listMarkerFormat.fontFamily == "Arial, Helvetica, _sans");
			
			span.text = "concat() test successful. ";
			
			//concatInheritOnly test
			listMarkerFormat = new ListMarkerFormat();
			listMarkerFormat2 = new ListMarkerFormat();
			// set format attributes in the first one
			listMarkerFormat.color = 0xFF0000;
			listMarkerFormat.fontSize = undefined;	
			// set some of the same attributes on the second one listMarkerFormat2
			listMarkerFormat2.color = 0x00FF00;
			listMarkerFormat2.backgroundColor = 0x00CCCC;
			listMarkerFormat2.fontSize = 16;
			listMarkerFormat2.fontFamily = "Times Roman";
			
			// concatInheritOnly listMarkerFormat2 settings;		
			listMarkerFormat.concatInheritOnly(listMarkerFormat2);	
			//assign format to the listElement
			listItemElement.listMarkerFormat = listMarkerFormat;
			
			assertTrue("concatInheritOnly doesn't work properly. ",
				listMarkerFormat.backgroundColor == undefined &&
				listMarkerFormat.color == 0xFF0000 &&
				listMarkerFormat.fontSize == 16 &&
				listMarkerFormat.fontFamily == "Times Roman");
			
			span.text += "concatInheritOnly() test successful. ";
				
			//apply() test
			listMarkerFormat = new ListMarkerFormat();
			listMarkerFormat2 = new ListMarkerFormat();
			// set format attributes in the first one
			listMarkerFormat.textIndent = 8;
			listMarkerFormat.color = 0x336633;
			listMarkerFormat.fontFamily = "Arial, Helvetica, _sans";
			listMarkerFormat.fontSize = 24;
			// set some of the same attributes on the second one
			listMarkerFormat2.color = 0x0000CC;
			listMarkerFormat2.fontSize = 12;
			listMarkerFormat2.textIndent = 24;
			
			// apply listMarkerFormat2 settings;		
			listMarkerFormat.apply(listMarkerFormat2);	
			//assign format to the listElement
			listItemElement.listMarkerFormat = listMarkerFormat;
			
			assertTrue("apply() doesn't work properly. ",
				listMarkerFormat.textIndent == 24 &&
				listMarkerFormat.color == 0x0000CC &&
				listMarkerFormat.fontSize == 12 &&
				listMarkerFormat.fontFamily == "Arial, Helvetica, _sans");
			
			// add text to the span, the span to the paragraph, and the paragraph to the text flow.
			span.text += "apply() test successful. ";
			
			//removeMatching() test
			listMarkerFormat = new ListMarkerFormat();
			listMarkerFormat2 = new ListMarkerFormat();
			// set format attributes in the first one
			listMarkerFormat.textIndent = 8;
			listMarkerFormat.color = 0x336633;
			listMarkerFormat.fontFamily = "Arial, Helvetica, _sans";
			listMarkerFormat.fontSize = 24;
			
			// set fontFamily to same value for listMarkerFormat2			
			listMarkerFormat2.fontFamily = "Arial, Helvetica, _sans";
			
			// call removeMatching() to remove any values that match textLayoutFormat2; 
			listMarkerFormat.removeMatching(listMarkerFormat2);	
			//assign format to the listElement
			listItemElement.listMarkerFormat = listMarkerFormat;
			
			assertTrue("removeMatching() doesn't work properly. ",
				listMarkerFormat.textIndent == 8 &&
				listMarkerFormat.color == 0x336633 &&
				listMarkerFormat.fontSize == 24 &&
				listMarkerFormat.fontFamily == undefined);
			
			// add text to the span, the span to the paragraph, and the paragraph to the text flow.
			span.text += "removeMatching() test successful. ";
				
			//removeClashing() test
			listMarkerFormat = new ListMarkerFormat();
			listMarkerFormat2 = new ListMarkerFormat();
			// set format attributes in the first one
			listMarkerFormat.textIndent = 8;
			listMarkerFormat.color = 0x336633;
			listMarkerFormat.fontFamily = "Arial, Helvetica, _sans";
			listMarkerFormat.fontSize = 24;
			
			// set fontFamily to same value for listMarkerFormat2			
			listMarkerFormat2.fontFamily = "Arial, Helvetica, _sans";
			
			// call removeClashing() to remove any values that clash listMarkerFormat; 
			listMarkerFormat.removeClashing(listMarkerFormat2);	
			//assign format to the listElement
			listItemElement.listMarkerFormat = listMarkerFormat;
			
			assertTrue("removeClashing() doesn't work properly. ",
				listMarkerFormat.textIndent == 8 &&
				listMarkerFormat.color == 0x336633 &&
				listMarkerFormat.fontSize == 24 &&
				listMarkerFormat.fontFamily == "Arial, Helvetica, _sans");
			
			// add text to the span, the span to the paragraph, and the paragraph to the text flow.
			span.text += "removeClashing() test successful. ";
			
			p.addChild(span);
			listItemElement.addChild(p);
			listElement.addChild(listItemElement);
			textFlow.addChild(listElement);
			textFlow.flowComposer.updateAllControllers(); 
		}
		
		//yongtian : Watson Bug#2800975 ListMarkerFormat.paragraphStartIndent not applied properly in Inside lists.
		/**
		 * The attribute listMarkerFormat.paragraphStartIndent should push all of the list content to the right. 
		 */
		[Test]
		public function ListListMarkerFormatparagraphStartIndent():void
		{
			super.setUpTest();

			var textFlow:TextFlow = SelManager.textFlow;
			SelManager.selectRange(0,0);
		
			textFlow.replaceChildren(0,textFlow.numChildren);
			
			var list:ListElement = new ListElement();
			list.listStyleType = "decimal"; 
			list.listStylePosition = "inside";
			list.paddingLeft = "50";
			list.paddingTop = "50";
			list.paddingRight = "50";
			
			var listMarkerFormat:ListMarkerFormat = new ListMarkerFormat();
			listMarkerFormat.beforeContent = "- ";
			listMarkerFormat.afterContent = String.fromCharCode(0x9);
			listMarkerFormat.paragraphStartIndent = "25";
			
			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();
			var line:TextFlowLine = textFlow.flowComposer.getLineAt(0);
			assertTrue("Expected list to indent to paragraphStartIndent and Padding",line.lineOffset== 90);
		}
		
		//yongtian : Fix bug related Bug#2800975, the custom tabStop of ListMarkerFormat are not correct displayed
		[Test]
		public function ListMarkerFormatTabStopTest():void
		{
			super.setUpTest();

			var textFlow:TextFlow = SelManager.textFlow;
			SelManager.selectRange(0,0);
			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 = [];
			var tabstop:TabStopFormat = new TabStopFormat();
			tabstop.position = 70;
			tabStops.push(tabstop);
			listMarkerFormat.tabStops = tabStops;
			listMarkerFormat.beforeContent = "- ";
			listMarkerFormat.afterContent = String.fromCharCode(0x9);
			var item:ListItemElement;
			item = new ListItemElement();
			item.listMarkerFormat = listMarkerFormat;
			var paragraphElement:ParagraphElement = new ParagraphElement();
			paragraphElement.paragraphStartIndent = 0;
			var spanElement:SpanElement = new SpanElement();
			spanElement.text = "Text starts at 100";
			paragraphElement.addChild(spanElement);
			item.addChild(paragraphElement);
			list.addChild(item);
			textFlow.addChild(list);
			textFlow.flowComposer.updateAllControllers();		
			assertTrue("The custome TabStop is not correct!",(((textFlow.getChildAt(0) as ListElement).mxmlChildren[0] as ListItemElement).computedFormat.listMarkerFormat.afterContent) == "\t" && ((((textFlow.getChildAt(0) as ListElement).mxmlChildren[0] as ListItemElement).computedFormat.listMarkerFormat.tabStops as Array)[0] as TabStopFormat).position == 70);	
		}
	}
}