diff --git a/automation_tests/src/AllTestsSuite.as b/automation_tests/src/AllTestsSuite.as
index 708c768..1e8206a 100644
--- a/automation_tests/src/AllTestsSuite.as
+++ b/automation_tests/src/AllTestsSuite.as
@@ -47,6 +47,7 @@
     import UnitTest.Tests.TabTest;
     import UnitTest.Tests.TextFlowEditTest;
     import UnitTest.Tests.UndoRedoTest;
+    import UnitTest.Tests.VerticalScrollingTest;
     import UnitTest.Tests.WritingModeTest;
 
     [Suite(order=1)]
@@ -82,6 +83,7 @@
         public var importApiTest:ImportAPITest;
         public var keyboardGestureTest:KeyboardGestureTest;
         public var spacingTest:SpacingTest;
+        public var verticalScrollingTest:VerticalScrollingTest;
     }
 
 }
diff --git a/automation_tests/src/UnitTest/Tests/VerticalScrollingTest.as b/automation_tests/src/UnitTest/Tests/VerticalScrollingTest.as
index 86ec159..e698d39 100644
--- a/automation_tests/src/UnitTest/Tests/VerticalScrollingTest.as
+++ b/automation_tests/src/UnitTest/Tests/VerticalScrollingTest.as
@@ -18,1125 +18,1246 @@
 ////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Tests
 {
-	import UnitTest.ExtendedClasses.TestSuiteExtended;
-	import UnitTest.ExtendedClasses.VellumTestCase;
-	import UnitTest.Fixtures.FileRepository;
-	import UnitTest.Fixtures.TestConfig;
+    import UnitTest.ExtendedClasses.TestConfigurationLoader;
+    import UnitTest.ExtendedClasses.VellumTestCase;
+    import UnitTest.Fixtures.TestCaseVo;
+    import UnitTest.Fixtures.TestConfig;
 
-	import flash.events.KeyboardEvent;
-	import flash.events.MouseEvent;
-	import flash.ui.KeyLocation;
+    import flash.events.KeyboardEvent;
+    import flash.events.MouseEvent;
+    import flash.ui.KeyLocation;
 
-	import flashx.textLayout.container.ContainerController;
-	import flashx.textLayout.formats.BlockProgression;
-	import flashx.textLayout.elements.TextFlow;
+    import flashx.textLayout.container.ContainerController;
+    import flashx.textLayout.elements.TextFlow;
+    import flashx.textLayout.formats.BlockProgression;
 
     import org.flexunit.asserts.assertTrue;
 
-
+    [TestCase(order=30)]
+    [RunWith("org.flexunit.runners.Parameterized")]
     public class VerticalScrollingTest extends VellumTestCase
-	{
-		// List of available keyboard gestures
-		// Note that on Mac: CTRL == COMMAND
-		//              and: ALT == OPTION
-		// These are directly mapped in flash player
-		private static const CTRL_BACKSPACE:int   = 100;
-   		private static const CTRL_DELETE:int      = 101;
-   		private static const OPT_BACKSPACE:int    = 102;
-   		private static const OPT_DELETE:int       = 103;
-   		private static const CTRL_LEFT:int        = 104;
-   		private static const CTRL_RIGHT:int       = 105;
-   		private static const CTRL_UP:int          = 106;
-   		private static const CTRL_DOWN:int        = 107;
-   		private static const OPT_LEFT:int         = 108;
-   		private static const OPT_RIGHT:int        = 109;
-   		private static const OPT_UP:int           = 110;
-   		private static const OPT_DOWN:int         = 111;
-   		private static const SHIFT_CTRL_LEFT:int  = 112;
-   		private static const SHIFT_CTRL_RIGHT:int = 113;
-   		private static const SHIFT_CTRL_UP:int    = 114;
-   		private static const SHIFT_CTRL_DOWN:int  = 115;
-   		private static const SHIFT_OPT_LEFT:int   = 116;
-   		private static const SHIFT_OPT_RIGHT:int  = 117;
-   		private static const SHIFT_OPT_UP:int     = 118;
-   		private static const SHIFT_OPT_DOWN:int   = 119;
-   		private static const HOME:int             = 120;
-   		private static const END:int              = 121;
-   		private static const SHIFT_HOME:int       = 122;
-   		private static const SHIFT_END:int        = 123;
-   		private static const CTRL_HOME:int        = 124;
-   		private static const CTRL_END:int         = 125;
-   		private static const SHIFT_CTRL_HOME:int  = 126;
-   		private static const SHIFT_CTRL_END:int   = 127;
-   		private static const PG_UP:int            = 128;
-   		private static const PG_DOWN:int          = 129;
-   		private static const SHIFT_PG_UP:int      = 130;
-   		private static const SHIFT_PG_DOWN:int    = 131;
-   		private static const UP:int          	  = 132;
-   		private static const DOWN:int     	      = 133;
-   		private static const LEFT:int     		  = 134;
-   		private static const RIGHT:int    		  = 135;
+    {
+        // List of available keyboard gestures
+        // Note that on Mac: CTRL == COMMAND
+        //              and: ALT == OPTION
+        // These are directly mapped in flash player
+        private static const CTRL_BACKSPACE:int = 100;
+        private static const CTRL_DELETE:int = 101;
+        private static const OPT_BACKSPACE:int = 102;
+        private static const OPT_DELETE:int = 103;
+        private static const CTRL_LEFT:int = 104;
+        private static const CTRL_RIGHT:int = 105;
+        private static const CTRL_UP:int = 106;
+        private static const CTRL_DOWN:int = 107;
+        private static const OPT_LEFT:int = 108;
+        private static const OPT_RIGHT:int = 109;
+        private static const OPT_UP:int = 110;
+        private static const OPT_DOWN:int = 111;
+        private static const SHIFT_CTRL_LEFT:int = 112;
+        private static const SHIFT_CTRL_RIGHT:int = 113;
+        private static const SHIFT_CTRL_UP:int = 114;
+        private static const SHIFT_CTRL_DOWN:int = 115;
+        private static const SHIFT_OPT_LEFT:int = 116;
+        private static const SHIFT_OPT_RIGHT:int = 117;
+        private static const SHIFT_OPT_UP:int = 118;
+        private static const SHIFT_OPT_DOWN:int = 119;
+        private static const HOME:int = 120;
+        private static const END:int = 121;
+        private static const SHIFT_HOME:int = 122;
+        private static const SHIFT_END:int = 123;
+        private static const CTRL_HOME:int = 124;
+        private static const CTRL_END:int = 125;
+        private static const SHIFT_CTRL_HOME:int = 126;
+        private static const SHIFT_CTRL_END:int = 127;
+        private static const PG_UP:int = 128;
+        private static const PG_DOWN:int = 129;
+        private static const SHIFT_PG_UP:int = 130;
+        private static const SHIFT_PG_DOWN:int = 131;
+        private static const UP:int = 132;
+        private static const DOWN:int = 133;
+        private static const LEFT:int = 134;
+        private static const RIGHT:int = 135;
 
-   		private static const SHIFT_RIGHT:int	  = 136;
-   		private static const SHIFT_LEFT:int    	  = 137;
-   		private static const SHIFT_UP:int		  = 138;
-   		private static const SHIFT_DOWN:int    	  = 139;
+        private static const SHIFT_RIGHT:int = 136;
+        private static const SHIFT_LEFT:int = 137;
+        private static const SHIFT_UP:int = 138;
+        private static const SHIFT_DOWN:int = 139;
 
-		private var i:Number;
 
-		public function VerticalScrollingTest(methodName:String, testID:String, testConfig:TestConfig, testCaseXML:XML=null)
-		{
-			super(methodName, testID, testConfig, testCaseXML);
+        [DataPoints(loader=HOLTR_endKeyScrollingTestLoader)]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var HOLTRTestDp:Array;
 
-			// Note: These must correspond to a Watson product area (case-sensitive)
-			metaData.productArea = "UI";
-			metaData.productSubArea = "Scrolling";
-		}
+        public static var HOLTR_endKeyScrollingTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/VerticalScrollingTests.xml", "HOLTR_endKeyScrollingTest");
 
-		public static function suiteFromXML(testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void
- 		{
-			FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/HORLTRAUTO.xml");
-			FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/VORLTRAUTO.xml");
-			FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/HORRTLAUTO.xml");
-			FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/VORRTLAUTO.xml");
-			FileRepository.readFile(testConfig.baseURL,"../../test/testFiles/markup/tlf/VSAUTO.xml");
- 			var testCaseClass:Class = VerticalScrollingTest;
- 			VellumTestCase.suiteFromXML(testCaseClass, testListXML, testConfig, ts);
- 		}
+        [DataPoints(loader=VOLTR_endKeyScrollingTestLoader)]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var VOLTRTestDp:Array;
 
-   		public override function setUpTest():void
-   		{
-			// Booga - Need to load up the test file here.
+        public static var VOLTR_endKeyScrollingTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/VerticalScrollingTests.xml", "VOLTR_endKeyScrollingTest");
 
-			super.setUpTest();
-   		}
+        [DataPoints(loader=HORTL_endKeyScrollingTestLoader)]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var HORTLTestDp:Array;
 
-   		public override function tearDownTest():void
-   		{
-   			// Restore default configurations
-   			super.tearDownTest();
-   		}
+        public static var HORTL_endKeyScrollingTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/VerticalScrollingTests.xml", "HORTL_endKeyScrollingTest");
 
+        [DataPoints(loader=VORTL_endKeyScrollingTestLoader)]
+        [ArrayElementType("UnitTest.Fixtures.TestCaseVo")]
+        public static var VORTLTestDp:Array;
 
-   		// Send a keyboard gesture using values listed above
-   		// Code folding extremely recommended here
-   		private function sendKeyboardGesture( type:int ): void
-   		{
-   			var charCode:int;
-   			var keyCode:int;
-   			var ctrlDown:Boolean = false;
-   			var shiftDown:Boolean = false;
-   			var altDown:Boolean = false;
+        public static var VORTL_endKeyScrollingTestLoader:TestConfigurationLoader = new TestConfigurationLoader("../../test/testCases/VerticalScrollingTests.xml", "VORTL_endKeyScrollingTest");
 
-   			var leftCode:int = 37;
-   			var rightCode:int = 39;
-   			var upCode:int = 38;
-   			var downCode:int = 40;
+        public function VerticalScrollingTest()
+        {
+            super("", "HorizontalScrollingTest", TestConfig.getInstance());
 
-   			// Arrow keys behave differently on Right to Left Blockprogression
-   			// For the sake of test simplicity, I am translating the directions here
-   			if( SelManager.textFlow.computedFormat.blockProgression == BlockProgression.RL )
-   			{
-   				leftCode = 38;
-   				rightCode = 40;
-   				upCode = 39;
-   				downCode = 37;
-   			}
-   			switch( type )
-   			{
-   				case CTRL_BACKSPACE:
-   					charCode = 8;
-   					keyCode  = 8;
-   					ctrlDown = true;
-   					break;
-   				case CTRL_DELETE:
-   					charCode = 127;
-   					keyCode  = 46;
-   					ctrlDown = true;
-   					break;
-   				case OPT_BACKSPACE:
-   					charCode = 8;
-   					keyCode  = 8;
-   					altDown = true;
-   					break;
-   				case OPT_DELETE:
-   					charCode = 127;
-   					keyCode  = 46;
-   					altDown = true;
-   					break;
-   				case CTRL_LEFT:
-   					charCode = 0;
-   					keyCode  = leftCode;
-   					ctrlDown = true;
-   					break;
-   				case CTRL_RIGHT:
-   					charCode = 0;
-   					keyCode  = rightCode;
-   					ctrlDown = true;
-   					break;
-   				case CTRL_UP:
-   					charCode = 0;
-   					keyCode  = upCode;
-   					ctrlDown = true;
-   					break;
-   				case CTRL_DOWN:
-   					charCode = 0;
-   					keyCode  = downCode;
-   					ctrlDown = true;
-   					break;
-   				case OPT_LEFT:
-   					charCode = 0;
-   					keyCode  = leftCode;
-   					altDown = true;
-   					break;
-   				case OPT_RIGHT:
-   					charCode = 0;
-   					keyCode  = rightCode;
-   					altDown = true;
-   					break;
-   				case OPT_UP:
-   					charCode = 0;
-   					keyCode  = upCode;
-   					altDown = true;
-   					break;
-   				case OPT_DOWN:
-   					charCode = 0;
-   					keyCode  = downCode;
-   					altDown = true;
-   					break;
-   				case SHIFT_LEFT:
-   					charCode = 0;
-   					keyCode  = leftCode;
-   					ctrlDown = false;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_RIGHT:
-   					charCode = 0;
-   					keyCode  = rightCode;
-   					ctrlDown = false;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_UP:
-   					charCode = 0;
-   					keyCode  = upCode;
-   					ctrlDown = false;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_DOWN:
-   					charCode = 0;
-   					keyCode  = downCode;
-   					ctrlDown = false;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_CTRL_LEFT:
-   					charCode = 0;
-   					keyCode  = leftCode;
-   					ctrlDown = true;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_CTRL_RIGHT:
-   					charCode = 0;
-   					keyCode  = rightCode;
-   					ctrlDown = true;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_CTRL_UP:
-   					charCode = 0;
-   					keyCode  = upCode;
-   					ctrlDown = true;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_CTRL_DOWN:
-   					charCode = 0;
-   					keyCode  = downCode;
-   					ctrlDown = true;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_OPT_LEFT:
-   					charCode = 0;
-   					keyCode  = leftCode;
-   					ctrlDown = true;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_OPT_RIGHT:
-   					charCode = 0;
-   					keyCode  = rightCode;
-   					ctrlDown = true;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_OPT_UP:
-   					charCode = 0;
-   					keyCode  = upCode;
-   					ctrlDown = true;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_OPT_DOWN:
-   					charCode = 0;
-   					keyCode  = downCode;
-   					altDown = true;
-   					shiftDown = true;
-   					break;
-   				case HOME:
-   					charCode = 0;
-   					keyCode  = 36;
-   					break;
-   				case END:
-   					charCode = 0;
-   					keyCode  = 35;
-   					break;
-   				case SHIFT_HOME:
-   					charCode = 0;
-   					keyCode  = 36;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_END:
-   					charCode = 0;
-   					keyCode  = 35;
-   					shiftDown = true;
-   					break;
-   				case CTRL_HOME:
-   					charCode = 0;
-   					keyCode  = 36;
-   					ctrlDown = true;
-   					break;
-   				case CTRL_END:
-   					charCode = 0;
-   					keyCode  = 35;
-   					ctrlDown = true;
-   					break;
-   				case SHIFT_CTRL_HOME:
-   					charCode = 0;
-   					keyCode  = 36;
-   					shiftDown = true;
-   					ctrlDown = true;
-   					break;
-   				case SHIFT_CTRL_END:
-   					charCode = 0;
-   					keyCode  = 35;
-   					shiftDown = true;
-   					ctrlDown = true;
-   					break;
-   				case PG_UP:
-   					charCode = 0;
-   					keyCode  = 33;
-   					break;
-   				case PG_DOWN:
-   					charCode = 0;
-   					keyCode  = 34;
-   					break;
-   				case SHIFT_PG_UP:
-   					charCode = 0;
-   					keyCode  = 33;
-   					shiftDown = true;
-   					break;
-   				case SHIFT_PG_DOWN:
-   					charCode = 0;
-   					keyCode  = 34;
-   					shiftDown = true;
-   					break;
-   				case UP:
-   					charCode = 0;
-   					keyCode  = upCode;
-   					break;
-   				case DOWN:
-   					charCode = 0;
-   					keyCode  = downCode;
-   					break;
-   				case LEFT:
-   					charCode = 0;
-   					keyCode  = leftCode;
-   					break;
-   				case RIGHT:
-   					charCode = 0;
-   					keyCode  = rightCode;
-   					break;
-   				default:
-   					return;
-   			}
+            metaData = {};
 
-   			var kEvent:KeyboardEvent = new KeyboardEvent( KeyboardEvent.KEY_DOWN,
-				true, false, charCode, keyCode, KeyLocation.STANDARD, ctrlDown, altDown, shiftDown);
-			TestFrame.container["dispatchEvent"](kEvent);
-   		}
+            // Note: These must correspond to a Watson product area (case-sensitive)
+            metaData.productArea = "UI";
+            metaData.productSubArea = "Scrolling";
+        }
 
-		public function endKeyScrollingTest(scrollPos:Number):void
-		{
-			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Hit the CTRL + Home key to scroll to the end of the first line.
-			sendKeyboardGesture( CTRL_HOME );
-			// Hit the CTRL + End key to scroll to the end of the first line.
-			sendKeyboardGesture( CTRL_END );
-			// Check to make sure that it scrolled.
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("endKeyScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("endKeyScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "EndKey Scrolling Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "EndKey Scrolling Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [After]
+        public override function tearDownTest():void
+        {
+            // Restore default configurations
+            super.tearDownTest();
+        }
 
-		public function homeKeyScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Hit the CTRL + End key to scroll to the end of the first line.
-			sendKeyboardGesture( CTRL_END );
-			// Hit the CTRL + Home key to scroll to the end of the first line.
-			sendKeyboardGesture( CTRL_HOME );
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("homeKeyScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("homeKeyScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "HomeKey Scrolling Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "HomeKey Scrolling Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        // Horizontal Orientation Left To Right Direction Scrolling Tests.
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_endKeyScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            endKeyScrollingTest(647, testCaseVo);
+        }
 
-		public function cursorUpScrollingTest(lines:Number, scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Hit the End key to scroll to the end of the text.
-			sendKeyboardGesture( CTRL_END );
-			// Move the cursor over to the right.
-			for (var i:Number = 0; i < lines; i++)
-			{
-				sendKeyboardGesture( UP );
-			}
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("cursorUpScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("cursorUpScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "cursorUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "cursorUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_homeKeyScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            homeKeyScrollingTest(4, testCaseVo);
+        }
 
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_cursorUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            cursorUpScrollingTest(13, 645, testCaseVo);
+        }
 
-		public function cursorDownScrollingTest(lines:Number, scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Hit the CTRL + HOME key to scroll to the end of the first line.
-			sendKeyboardGesture( CTRL_HOME );
-			// Move the cursor over to the right.
-			for (var i:Number = 0; i < lines; i++)
-			{
-				sendKeyboardGesture( DOWN );
-			}
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("cursorDownScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("cursorDownScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "cursorDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "cursorDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_cursorDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            cursorDownScrollingTest(13, 5, testCaseVo);
+        }
 
-		public function dragUpScrollingTest(lines:Number, scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Hit the End key to scroll to the end of the text.
-			sendKeyboardGesture( CTRL_END );
-			// Move the cursor over to the right.
-			for (var i:Number = 0; i < lines; i++)
-			{
-				sendKeyboardGesture( UP );
-			}
-			sendKeyboardGesture( SHIFT_UP );
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("dragUpScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("dragUpScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "dragUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "dragUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_dragUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            dragUpScrollingTest(12, 645, testCaseVo);
+        }
 
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_dragDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            dragDownScrollingTest(12, 5, testCaseVo);
+        }
 
-		public function dragDownScrollingTest(lines:Number, scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Hit the CTRL + HOME key to scroll to the end of the first line.
-			sendKeyboardGesture( CTRL_HOME );
-			// Move the cursor over to the right.
-			for (var i:Number = 0; i < lines; i++)
-			{
-				sendKeyboardGesture( DOWN );
-			}
-			sendKeyboardGesture( SHIFT_DOWN );
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("dragDownScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("dragDownScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "dragDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "dragDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_characterEntryEndOfTextScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            characterEntryEndOfTextScrollingTest(647, testCaseVo);
+        }
 
-		public function characterEntryEndOfTextScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Hit the End key to scroll to the end of the first line.
-			sendKeyboardGesture( CTRL_END );
-			// Type in ABC and confirm that it scrolls.
-			SelManager.insertText(" It was the best of times, it was the worst of times. I hope this thing scrolls like I expect it to scroll or this test will fail. ;)");
-			//SelManager.flushPendingOperations();
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("characterEntryEndOfTextScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("characterEntryEndOfTextScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "characterEntryEndOfTextScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "characterEntryEndOfTextScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_spaceEntryMiddleOfTextScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            spaceEntryMiddleOfTextScrollingTest(5, testCaseVo);
+        }
 
-		public function spaceEntryMiddleOfTextScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Hit the CTRL + HOME key to scroll to the beginning of the text.
-			sendKeyboardGesture( CTRL_HOME );
-			// Move down to the middle of the text.
-			for (var i:Number = 0; i < 13; i++)
-			{
-				sendKeyboardGesture( DOWN );
-			}
-			sendKeyboardGesture( END )
-			// Type in ABC and confirm that it scrolls.
-			SelManager.insertText("                                                                                       ");
-			//SelManager.flushPendingOperations();
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("spaceEntryMiddleOfTextScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("spaceEntryMiddleOfTextScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "spaceEntryMiddleOfTextScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "spaceEntryMiddleOfTextScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_deleteScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            deleteScrollingTest(0, testCaseVo);
+        }
 
-		public function deleteScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the start of the first line.
-			sendKeyboardGesture( CTRL_HOME );
-			// Delete to force it to scroll up.
-			for(i = 0; i < 60; i++)
-			{
-				SelManager.deleteNextCharacter();
-			}
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("deleteScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("deleteScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "deleteScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "deleteScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_backspaceScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            backspaceScrollingTest(0, testCaseVo);
+        }
 
-		public function backspaceScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Move to the second line.
-			sendKeyboardGesture( DOWN );
-			// Hit the End key to scroll to the end of the second line.
-			sendKeyboardGesture( END );
-			// Backspace to force it to scroll up.
-			for(i = 0; i < 60; i++)
-			{
-				SelManager.deletePreviousCharacter();
-			}
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("backspaceScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("backspaceScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "backspaceScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "backspaceScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_pageUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            pageUpScrollingTest(229, testCaseVo);
+        }
 
-		public function pageUpScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the start of the first line.
-			sendKeyboardGesture( CTRL_END );
-			// Do a page up.
-			sendKeyboardGesture( PG_UP );
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("pageUpScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("pageUpScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "pageUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "pageUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_pageDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            pageDownScrollingTest(417, testCaseVo);
+        }
 
-		public function pageDownScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the start of the first line.
-			sendKeyboardGesture( CTRL_HOME );
-			// Do a page down.
-			sendKeyboardGesture( PG_DOWN );
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("pageDownScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("pageDownScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "pageDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "pageDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_mousewheelUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelUpScrollingTest(587, testCaseVo);
+        }
 
-		public function mousewheelUpScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the start of the first line.
-			sendKeyboardGesture( CTRL_END );
-			// Do a mousewheel up.
-			var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL,true, false, 0,0,null,false,false,false,false,3);
-			TestFrame.container["dispatchEvent"](mEvent);
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("mousewheelUpScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("mousewheelUpScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "mousewheelUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "mousewheelUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_mousewheelUpScrollingNoInteractionTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelUpScrollingNoInteractionTest(587, testCaseVo);
+        }
 
-		public function mousewheelUpScrollingNoInteractionTest(scrollPos:Number):void
-		{
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the start of the first line.
-			sendKeyboardGesture( CTRL_END );
-			var textFlow:TextFlow = SelManager.textFlow;		// save it for later
-			SelManager.textFlow.interactionManager = null;		// turn off editing
-			
-			// Do a mousewheel up.
-			var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL,true, false, 0,0,null,false,false,false,false,3);
-			TestFrame.container["dispatchEvent"](mEvent);
-			
-			textFlow.interactionManager = SelManager;
-			
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "mousewheelUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "mousewheelUpScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			
-			//to avoid tear down assertion
-			SelManager.selectRange(0,0);
-		}
-		
-		public function mousewheelDownScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the start of the first line.
-			sendKeyboardGesture( CTRL_HOME );
-			// Do a mousewheel down.
-			var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL,true, false, 0,0,null,false,false,false,false,-3);
-			TestFrame.container["dispatchEvent"](mEvent);
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("mousewheelDownScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("mousewheelDownScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "mousewheelDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "mousewheelDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
-		
-		public function mousewheelDownScrollingNoInteractionTest(scrollPos:Number):void
-		{
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the start of the first line.
-			sendKeyboardGesture( CTRL_HOME );
-			// Do a mousewheel down.
-			var textFlow:TextFlow = SelManager.textFlow;		// save it for later
-			SelManager.textFlow.interactionManager = null;		// turn off editing
-			var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL,true, false, 0,0,null,false,false,false,false,-3);
-			TestFrame.container["dispatchEvent"](mEvent);
-			
-			textFlow.interactionManager = SelManager;
-			
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-			
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "mousewheelDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "mousewheelDownScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			
-			//to avoid tear down assertion
-			SelManager.selectRange(0,0);
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_mousewheelDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelDownScrollingTest(60, testCaseVo);
+        }
 
-		public function autoScrollVisibleScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the end of the text.
-			sendKeyboardGesture( CTRL_END );
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-			tmpContainerController.verticalScrollPolicy = "auto";
-			// Type in enough text to make the scroll bars appear.
-			SelManager.insertText(" It was the best of times, it was the worst of times.");
-			//var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("autoScrollVisibleScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("autoScrollVisibleScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "autoScrollVisibleScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "autoScrollVisibleScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        [Test(dataProvider=HOLTRTestDp)]
+        public function HOLTR_mousewheelDownScrollingNoInteractionTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelDownScrollingNoInteractionTest(60, testCaseVo);
+        }
 
-		public function autoScrollHideScrollingTest(scrollPos:Number):void
-		{
-   			// Success or failure will be determined by the bitmap snapshot.
-			// Move the cursor to the beginning of the first line.
-			SelManager.selectRange(0,0);
-			// Make sure we are at the end of the text.
-			sendKeyboardGesture( CTRL_END );
-			// Delete enough characters so scroll bars disappear.
-			for(i = 0; i < 60; i++)
-			{
-				SelManager.deletePreviousCharacter();
-			}
-			var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
-		//	trace("autoScrollHideScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
-		//	trace("autoScrollHideScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
-			if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
-			{
-				assertTrue( "autoScrollHideScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
-			}
-			else
-			{
-				assertTrue( "autoScrollHideScrollingTest Test Failed.",(scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
-			}
-		}
+        // Vertical Orientation Left To Right Direction Scrolling Tests.
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_endKeyScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            endKeyScrollingTest(1094, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_homeKeyScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            homeKeyScrollingTest(0, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_cursorUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            cursorUpScrollingTest(24, 1059, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_cursorDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            cursorDownScrollingTest(24, 35, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_dragUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            dragUpScrollingTest(23, 1059, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_dragDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            dragDownScrollingTest(23, 35, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_characterEntryEndOfTextScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            characterEntryEndOfTextScrollingTest(1094, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_spaceEntryMiddleOfTextScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            spaceEntryMiddleOfTextScrollingTest(0, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_deleteScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            deleteScrollingTest(0, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_backspaceScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            backspaceScrollingTest(0, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_pageUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            pageUpScrollingTest(0, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_pageDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            pageDownScrollingTest(722, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_mousewheelUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelUpScrollingTest(1034, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_mousewheelUpScrollingNoInteractionTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelUpScrollingNoInteractionTest(1034, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_mousewheelDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelDownScrollingTest(60, testCaseVo);
+        }
+
+        [Test(dataProvider=VOLTRTestDp)]
+        public function VOLTR_mousewheelDownScrollingNoInteractionTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelDownScrollingNoInteractionTest(60, testCaseVo);
+        }
+
+        // Horizontal Orientation Left To Right Direction Scrolling Tests.
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_endKeyScrollingTest(testCaseVo:TestCaseVo):void
+        {
+
+            endKeyScrollingTest(647, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_homeKeyScrollingTest(testCaseVo:TestCaseVo):void
+        {
+
+            homeKeyScrollingTest(4, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_cursorUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+
+            cursorUpScrollingTest(13, 645, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_cursorDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+
+            cursorDownScrollingTest(13, 5, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_dragUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+
+            dragUpScrollingTest(12, 645, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_dragDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            dragDownScrollingTest(12, 5, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_characterEntryEndOfTextScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            characterEntryEndOfTextScrollingTest(647, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_spaceEntryMiddleOfTextScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            spaceEntryMiddleOfTextScrollingTest(5, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_deleteScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            deleteScrollingTest(0, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_backspaceScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            backspaceScrollingTest(0, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_pageUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            pageUpScrollingTest(229, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_pageDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            pageDownScrollingTest(417, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_mousewheelUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelUpScrollingTest(587, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_mousewheelUpScrollingNoInteractionTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelUpScrollingNoInteractionTest(587, testCaseVo);
+        }
+
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_mousewheelDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelDownScrollingTest(60, testCaseVo);
+        }
 
+        [Test(dataProvider=HORTLTestDp)]
+        public function HORTL_mousewheelDownScrollingNoInteractionTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelDownScrollingNoInteractionTest(60, testCaseVo);
+        }
 
-		// Horizontal Orientation Left To Right Direction Scrolling Tests.
+        // Vertical Orientation Left To Right Direction Scrolling Tests.
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_endKeyScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            endKeyScrollingTest(1094, testCaseVo);
+        }
 
-		public function HOLTR_endKeyScrollingTest():void
-		{
-			endKeyScrollingTest(647);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_homeKeyScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            homeKeyScrollingTest(0, testCaseVo);
+        }
 
-		public function HOLTR_homeKeyScrollingTest():void
-		{
-			homeKeyScrollingTest(4);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_cursorUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            cursorUpScrollingTest(24, 1059, testCaseVo);
+        }
 
-		public function HOLTR_cursorUpScrollingTest():void
-		{
-			cursorUpScrollingTest(13,645);
-		}
+        public function VORTL_cursorDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            cursorDownScrollingTest(24, 35, testCaseVo);
+        }
 
-		public function HOLTR_cursorDownScrollingTest():void
-		{
-			cursorDownScrollingTest(13,5);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_dragUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            dragUpScrollingTest(23, 1059, testCaseVo);
+        }
 
-		public function HOLTR_dragUpScrollingTest():void
-		{
-			dragUpScrollingTest(12,645);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_dragDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            dragDownScrollingTest(23, 35, testCaseVo);
+        }
 
-		public function HOLTR_dragDownScrollingTest():void
-		{
-			dragDownScrollingTest(12,5);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_characterEntryEndOfTextScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            characterEntryEndOfTextScrollingTest(1094, testCaseVo);
+        }
 
-		public function HOLTR_characterEntryEndOfTextScrollingTest():void
-		{
-			characterEntryEndOfTextScrollingTest(647)
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_spaceEntryMiddleOfTextScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            spaceEntryMiddleOfTextScrollingTest(0, testCaseVo);
+        }
 
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_deleteScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            deleteScrollingTest(0, testCaseVo);
+        }
 
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_backspaceScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            backspaceScrollingTest(0, testCaseVo);
+        }
 
-		public function HOLTR_spaceEntryMiddleOfTextScrollingTest():void
-		{
-			spaceEntryMiddleOfTextScrollingTest(5);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_pageUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            pageUpScrollingTest(0, testCaseVo);
+        }
 
-		public function HOLTR_deleteScrollingTest():void
-		{
-			deleteScrollingTest(0);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_pageDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            pageDownScrollingTest(722, testCaseVo);
+        }
 
-		public function HOLTR_backspaceScrollingTest():void
-		{
-			backspaceScrollingTest(0);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_mousewheelUpScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelUpScrollingTest(1034, testCaseVo);
+        }
 
-		public function HOLTR_pageUpScrollingTest():void
-		{
-			pageUpScrollingTest(229);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_mousewheelUpScrollingNoInteractionTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelUpScrollingNoInteractionTest(1034, testCaseVo);
+        }
 
-		public function HOLTR_pageDownScrollingTest():void
-		{
-			pageDownScrollingTest(417);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_mousewheelDownScrollingTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelDownScrollingTest(60, testCaseVo);
+        }
 
-		public function HOLTR_mousewheelUpScrollingTest():void
-		{
-			mousewheelUpScrollingTest(587);
-		}
-		public function HOLTR_mousewheelUpScrollingNoInteractionTest():void
-		{
-			mousewheelUpScrollingNoInteractionTest(587);
-		}
+        [Test(dataProvider=VORTLTestDp)]
+        public function VORTL_mousewheelDownScrollingNoInteractionTest(testCaseVo:TestCaseVo):void
+        {
+            mousewheelDownScrollingNoInteractionTest(60, testCaseVo);
+        }
 
-		public function HOLTR_mousewheelDownScrollingTest():void
-		{
-			mousewheelDownScrollingTest(60);
-		}
-		public function HOLTR_mousewheelDownScrollingNoInteractionTest():void
-		{
-			mousewheelDownScrollingNoInteractionTest(60);
-		}
+        /**
+         * Send a keyboard gesture using values listed above
+         * Code folding extremely recommended here
+         * @param type
+         */
+        private function sendKeyboardGesture(type:int):void
+        {
+            var charCode:int;
+            var keyCode:int;
+            var ctrlDown:Boolean = false;
+            var shiftDown:Boolean = false;
+            var altDown:Boolean = false;
 
-		// Vertical Orientation Left To Right Direction Scrolling Tests.
+            var leftCode:int = 37;
+            var rightCode:int = 39;
+            var upCode:int = 38;
+            var downCode:int = 40;
 
-		public function VOLTR_endKeyScrollingTest():void
-		{
-			endKeyScrollingTest(1094);
-		}
+            // Arrow keys behave differently on Right to Left Blockprogression
+            // For the sake of test simplicity, I am translating the directions here
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.RL)
+            {
+                leftCode = 38;
+                rightCode = 40;
+                upCode = 39;
+                downCode = 37;
+            }
+            switch (type)
+            {
+                case CTRL_BACKSPACE:
+                    charCode = 8;
+                    keyCode = 8;
+                    ctrlDown = true;
+                    break;
+                case CTRL_DELETE:
+                    charCode = 127;
+                    keyCode = 46;
+                    ctrlDown = true;
+                    break;
+                case OPT_BACKSPACE:
+                    charCode = 8;
+                    keyCode = 8;
+                    altDown = true;
+                    break;
+                case OPT_DELETE:
+                    charCode = 127;
+                    keyCode = 46;
+                    altDown = true;
+                    break;
+                case CTRL_LEFT:
+                    charCode = 0;
+                    keyCode = leftCode;
+                    ctrlDown = true;
+                    break;
+                case CTRL_RIGHT:
+                    charCode = 0;
+                    keyCode = rightCode;
+                    ctrlDown = true;
+                    break;
+                case CTRL_UP:
+                    charCode = 0;
+                    keyCode = upCode;
+                    ctrlDown = true;
+                    break;
+                case CTRL_DOWN:
+                    charCode = 0;
+                    keyCode = downCode;
+                    ctrlDown = true;
+                    break;
+                case OPT_LEFT:
+                    charCode = 0;
+                    keyCode = leftCode;
+                    altDown = true;
+                    break;
+                case OPT_RIGHT:
+                    charCode = 0;
+                    keyCode = rightCode;
+                    altDown = true;
+                    break;
+                case OPT_UP:
+                    charCode = 0;
+                    keyCode = upCode;
+                    altDown = true;
+                    break;
+                case OPT_DOWN:
+                    charCode = 0;
+                    keyCode = downCode;
+                    altDown = true;
+                    break;
+                case SHIFT_LEFT:
+                    charCode = 0;
+                    keyCode = leftCode;
+                    ctrlDown = false;
+                    shiftDown = true;
+                    break;
+                case SHIFT_RIGHT:
+                    charCode = 0;
+                    keyCode = rightCode;
+                    ctrlDown = false;
+                    shiftDown = true;
+                    break;
+                case SHIFT_UP:
+                    charCode = 0;
+                    keyCode = upCode;
+                    ctrlDown = false;
+                    shiftDown = true;
+                    break;
+                case SHIFT_DOWN:
+                    charCode = 0;
+                    keyCode = downCode;
+                    ctrlDown = false;
+                    shiftDown = true;
+                    break;
+                case SHIFT_CTRL_LEFT:
+                    charCode = 0;
+                    keyCode = leftCode;
+                    ctrlDown = true;
+                    shiftDown = true;
+                    break;
+                case SHIFT_CTRL_RIGHT:
+                    charCode = 0;
+                    keyCode = rightCode;
+                    ctrlDown = true;
+                    shiftDown = true;
+                    break;
+                case SHIFT_CTRL_UP:
+                    charCode = 0;
+                    keyCode = upCode;
+                    ctrlDown = true;
+                    shiftDown = true;
+                    break;
+                case SHIFT_CTRL_DOWN:
+                    charCode = 0;
+                    keyCode = downCode;
+                    ctrlDown = true;
+                    shiftDown = true;
+                    break;
+                case SHIFT_OPT_LEFT:
+                    charCode = 0;
+                    keyCode = leftCode;
+                    ctrlDown = true;
+                    shiftDown = true;
+                    break;
+                case SHIFT_OPT_RIGHT:
+                    charCode = 0;
+                    keyCode = rightCode;
+                    ctrlDown = true;
+                    shiftDown = true;
+                    break;
+                case SHIFT_OPT_UP:
+                    charCode = 0;
+                    keyCode = upCode;
+                    ctrlDown = true;
+                    shiftDown = true;
+                    break;
+                case SHIFT_OPT_DOWN:
+                    charCode = 0;
+                    keyCode = downCode;
+                    altDown = true;
+                    shiftDown = true;
+                    break;
+                case HOME:
+                    charCode = 0;
+                    keyCode = 36;
+                    break;
+                case END:
+                    charCode = 0;
+                    keyCode = 35;
+                    break;
+                case SHIFT_HOME:
+                    charCode = 0;
+                    keyCode = 36;
+                    shiftDown = true;
+                    break;
+                case SHIFT_END:
+                    charCode = 0;
+                    keyCode = 35;
+                    shiftDown = true;
+                    break;
+                case CTRL_HOME:
+                    charCode = 0;
+                    keyCode = 36;
+                    ctrlDown = true;
+                    break;
+                case CTRL_END:
+                    charCode = 0;
+                    keyCode = 35;
+                    ctrlDown = true;
+                    break;
+                case SHIFT_CTRL_HOME:
+                    charCode = 0;
+                    keyCode = 36;
+                    shiftDown = true;
+                    ctrlDown = true;
+                    break;
+                case SHIFT_CTRL_END:
+                    charCode = 0;
+                    keyCode = 35;
+                    shiftDown = true;
+                    ctrlDown = true;
+                    break;
+                case PG_UP:
+                    charCode = 0;
+                    keyCode = 33;
+                    break;
+                case PG_DOWN:
+                    charCode = 0;
+                    keyCode = 34;
+                    break;
+                case SHIFT_PG_UP:
+                    charCode = 0;
+                    keyCode = 33;
+                    shiftDown = true;
+                    break;
+                case SHIFT_PG_DOWN:
+                    charCode = 0;
+                    keyCode = 34;
+                    shiftDown = true;
+                    break;
+                case UP:
+                    charCode = 0;
+                    keyCode = upCode;
+                    break;
+                case DOWN:
+                    charCode = 0;
+                    keyCode = downCode;
+                    break;
+                case LEFT:
+                    charCode = 0;
+                    keyCode = leftCode;
+                    break;
+                case RIGHT:
+                    charCode = 0;
+                    keyCode = rightCode;
+                    break;
+                default:
+                    return;
+            }
 
-		public function VOLTR_homeKeyScrollingTest():void
-		{
-			homeKeyScrollingTest(0);
-		}
+            var kEvent:KeyboardEvent = new KeyboardEvent(KeyboardEvent.KEY_DOWN,
+                    true, false, charCode, keyCode, KeyLocation.STANDARD, ctrlDown, altDown, shiftDown);
+            TestFrame.container["dispatchEvent"](kEvent);
+        }
 
-		public function VOLTR_cursorUpScrollingTest():void
-		{
-			cursorUpScrollingTest(24,1059);
-		}
+        public function endKeyScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function VOLTR_cursorDownScrollingTest():void
-		{
-			cursorDownScrollingTest(24,35);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Hit the CTRL + Home key to scroll to the end of the first line.
+            sendKeyboardGesture(CTRL_HOME);
+            // Hit the CTRL + End key to scroll to the end of the first line.
+            sendKeyboardGesture(CTRL_END);
+            // Check to make sure that it scrolled.
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("endKeyScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("endKeyScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("EndKey Scrolling Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("EndKey Scrolling Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function VOLTR_dragUpScrollingTest():void
-		{
-			dragUpScrollingTest(23,1059);
-		}
+        public function homeKeyScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function VOLTR_dragDownScrollingTest():void
-		{
-			dragDownScrollingTest(23,35);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Hit the CTRL + End key to scroll to the end of the first line.
+            sendKeyboardGesture(CTRL_END);
+            // Hit the CTRL + Home key to scroll to the end of the first line.
+            sendKeyboardGesture(CTRL_HOME);
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("homeKeyScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("homeKeyScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("HomeKey Scrolling Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("HomeKey Scrolling Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function VOLTR_characterEntryEndOfTextScrollingTest():void
-		{
-			characterEntryEndOfTextScrollingTest(1094);
-		}
+        public function cursorUpScrollingTest(lines:Number, scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Hit the End key to scroll to the end of the text.
+            sendKeyboardGesture(CTRL_END);
+            // Move the cursor over to the right.
+            for (var i:Number = 0; i < lines; i++)
+            {
+                sendKeyboardGesture(UP);
+            }
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("cursorUpScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("cursorUpScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("cursorUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("cursorUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
 
-		public function VOLTR_spaceEntryMiddleOfTextScrollingTest():void
-		{
-			spaceEntryMiddleOfTextScrollingTest(0);
-		}
+        }
 
-		public function VOLTR_deleteScrollingTest():void
-		{
-			deleteScrollingTest(0);
-		}
+        public function cursorDownScrollingTest(lines:Number, scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function VOLTR_backspaceScrollingTest():void
-		{
-			backspaceScrollingTest(0);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Hit the CTRL + HOME key to scroll to the end of the first line.
+            sendKeyboardGesture(CTRL_HOME);
+            // Move the cursor over to the right.
+            for (var i:Number = 0; i < lines; i++)
+            {
+                sendKeyboardGesture(DOWN);
+            }
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("cursorDownScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("cursorDownScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("cursorDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("cursorDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function VOLTR_pageUpScrollingTest():void
-		{
-			pageUpScrollingTest(0);
-		}
+        public function dragUpScrollingTest(lines:Number, scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function VOLTR_pageDownScrollingTest():void
-		{
-			pageDownScrollingTest(722);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Hit the End key to scroll to the end of the text.
+            sendKeyboardGesture(CTRL_END);
+            // Move the cursor over to the right.
+            for (var i:Number = 0; i < lines; i++)
+            {
+                sendKeyboardGesture(UP);
+            }
+            sendKeyboardGesture(SHIFT_UP);
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("dragUpScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("dragUpScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("dragUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("dragUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
 
-		public function VOLTR_mousewheelUpScrollingTest():void
-		{
-			mousewheelUpScrollingTest(1034);
-		}
-		public function VOLTR_mousewheelUpScrollingNoInteractionTest():void
-		{
-			mousewheelUpScrollingNoInteractionTest(1034);
-		}
+        }
 
-		public function VOLTR_mousewheelDownScrollingTest():void
-		{
-			mousewheelDownScrollingTest(60);
-		}
-		public function VOLTR_mousewheelDownScrollingNoInteractionTest():void
-		{
-			mousewheelDownScrollingNoInteractionTest(60);
-		}
+        public function dragDownScrollingTest(lines:Number, scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		// Horizontal Orientation Left To Right Direction Scrolling Tests.
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Hit the CTRL + HOME key to scroll to the end of the first line.
+            sendKeyboardGesture(CTRL_HOME);
+            // Move the cursor over to the right.
+            for (var i:Number = 0; i < lines; i++)
+            {
+                sendKeyboardGesture(DOWN);
+            }
+            sendKeyboardGesture(SHIFT_DOWN);
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("dragDownScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("dragDownScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("dragDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("dragDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function HORTL_endKeyScrollingTest():void
-		{
-			endKeyScrollingTest(647);
-		}
+        public function characterEntryEndOfTextScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function HORTL_homeKeyScrollingTest():void
-		{
-			homeKeyScrollingTest(4);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Hit the End key to scroll to the end of the first line.
+            sendKeyboardGesture(CTRL_END);
+            // Type in ABC and confirm that it scrolls.
+            SelManager.insertText(" It was the best of times, it was the worst of times. I hope this thing scrolls like I expect it to scroll or this test will fail. ;)");
+            //SelManager.flushPendingOperations();
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("characterEntryEndOfTextScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("characterEntryEndOfTextScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("characterEntryEndOfTextScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("characterEntryEndOfTextScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function HORTL_cursorUpScrollingTest():void
-		{
-			cursorUpScrollingTest(13,645);
-		}
+        public function spaceEntryMiddleOfTextScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function HORTL_cursorDownScrollingTest():void
-		{
-			cursorDownScrollingTest(13,5);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Hit the CTRL + HOME key to scroll to the beginning of the text.
+            sendKeyboardGesture(CTRL_HOME);
+            // Move down to the middle of the text.
+            for (var i:Number = 0; i < 13; i++)
+            {
+                sendKeyboardGesture(DOWN);
+            }
+            sendKeyboardGesture(END);
+            // Type in ABC and confirm that it scrolls.
+            SelManager.insertText("                                                                                       ");
+            //SelManager.flushPendingOperations();
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("spaceEntryMiddleOfTextScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("spaceEntryMiddleOfTextScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("spaceEntryMiddleOfTextScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("spaceEntryMiddleOfTextScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function HORTL_dragUpScrollingTest():void
-		{
-			dragUpScrollingTest(12,645);
-		}
+        public function deleteScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function HORTL_dragDownScrollingTest():void
-		{
-			dragDownScrollingTest(12,5);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the start of the first line.
+            sendKeyboardGesture(CTRL_HOME);
+            // Delete to force it to scroll up.
+            for (var i:int = 0; i < 60; i++)
+            {
+                SelManager.deleteNextCharacter();
+            }
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("deleteScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("deleteScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("deleteScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("deleteScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function HORTL_characterEntryEndOfTextScrollingTest():void
-		{
-			characterEntryEndOfTextScrollingTest(647)
-		}
+        public function backspaceScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function HORTL_spaceEntryMiddleOfTextScrollingTest():void
-		{
-			spaceEntryMiddleOfTextScrollingTest(5);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Move to the second line.
+            sendKeyboardGesture(DOWN);
+            // Hit the End key to scroll to the end of the second line.
+            sendKeyboardGesture(END);
+            // Backspace to force it to scroll up.
+            for (var i:int = 0; i < 60; i++)
+            {
+                SelManager.deletePreviousCharacter();
+            }
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("backspaceScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("backspaceScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("backspaceScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("backspaceScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function HORTL_deleteScrollingTest():void
-		{
-			deleteScrollingTest(0);
-		}
+        public function pageUpScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function HORTL_backspaceScrollingTest():void
-		{
-			backspaceScrollingTest(0);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the start of the first line.
+            sendKeyboardGesture(CTRL_END);
+            // Do a page up.
+            sendKeyboardGesture(PG_UP);
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("pageUpScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("pageUpScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("pageUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("pageUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function HORTL_pageUpScrollingTest():void
-		{
-			pageUpScrollingTest(229);
-		}
+        public function pageDownScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function HORTL_pageDownScrollingTest():void
-		{
-			pageDownScrollingTest(417);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the start of the first line.
+            sendKeyboardGesture(CTRL_HOME);
+            // Do a page down.
+            sendKeyboardGesture(PG_DOWN);
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("pageDownScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("pageDownScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("pageDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("pageDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		public function HORTL_mousewheelUpScrollingTest():void
-		{
-			mousewheelUpScrollingTest(587);
-		}
-		public function HORTL_mousewheelUpScrollingNoInteractionTest():void
-		{
-			mousewheelUpScrollingNoInteractionTest(587);
-		}
+        public function mousewheelUpScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function HORTL_mousewheelDownScrollingTest():void
-		{
-			mousewheelDownScrollingTest(60);
-		}
-		
-		
-		public function HORTL_mousewheelDownScrollingNoInteractionTest():void
-		{
-			mousewheelDownScrollingNoInteractionTest(60);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the start of the first line.
+            sendKeyboardGesture(CTRL_END);
+            // Do a mousewheel up.
+            var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false, 0, 0, null, false, false, false, false, 3);
+            TestFrame.container["dispatchEvent"](mEvent);
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("mousewheelUpScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("mousewheelUpScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("mousewheelUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("mousewheelUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-		// Vertical Orientation Left To Right Direction Scrolling Tests.
+        public function mousewheelUpScrollingNoInteractionTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function VORTL_endKeyScrollingTest():void
-		{
-			endKeyScrollingTest(1094);
-		}
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the start of the first line.
+            sendKeyboardGesture(CTRL_END);
+            var textFlow:TextFlow = SelManager.textFlow;		// save it for later
+            SelManager.textFlow.interactionManager = null;		// turn off editing
 
-		public function VORTL_homeKeyScrollingTest():void
-		{
-			homeKeyScrollingTest(0);
-		}
+            // Do a mousewheel up.
+            var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false, 0, 0, null, false, false, false, false, 3);
+            TestFrame.container["dispatchEvent"](mEvent);
 
-		public function VORTL_cursorUpScrollingTest():void
-		{
-			cursorUpScrollingTest(24,1059);
-		}
+            textFlow.interactionManager = SelManager;
 
-		public function VORTL_cursorDownScrollingTest():void
-		{
-			cursorDownScrollingTest(24,35);
-		}
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("mousewheelUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("mousewheelUpScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
 
-		public function VORTL_dragUpScrollingTest():void
-		{
-			dragUpScrollingTest(23,1059);
-		}
+            //to avoid tear down assertion
+            SelManager.selectRange(0, 0);
+        }
 
-		public function VORTL_dragDownScrollingTest():void
-		{
-			dragDownScrollingTest(23,35);
-		}
+        public function mousewheelDownScrollingTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function VORTL_characterEntryEndOfTextScrollingTest():void
-		{
-			characterEntryEndOfTextScrollingTest(1094);
-		}
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the start of the first line.
+            sendKeyboardGesture(CTRL_HOME);
+            // Do a mousewheel down.
+            var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false, 0, 0, null, false, false, false, false, -3);
+            TestFrame.container["dispatchEvent"](mEvent);
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("mousewheelDownScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("mousewheelDownScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("mousewheelDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("mousewheelDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
+        public function mousewheelDownScrollingNoInteractionTest(scrollPos:Number, testCaseVo:TestCaseVo):void
+        {
+            TestData.fileName = testCaseVo.fileName;
+            super.setUpTest();
 
-		public function VORTL_spaceEntryMiddleOfTextScrollingTest():void
-		{
-			spaceEntryMiddleOfTextScrollingTest(0);
-		}
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the start of the first line.
+            sendKeyboardGesture(CTRL_HOME);
+            // Do a mousewheel down.
+            var textFlow:TextFlow = SelManager.textFlow;		// save it for later
+            SelManager.textFlow.interactionManager = null;		// turn off editing
+            var mEvent:MouseEvent = new MouseEvent(MouseEvent.MOUSE_WHEEL, true, false, 0, 0, null, false, false, false, false, -3);
+            TestFrame.container["dispatchEvent"](mEvent);
 
-		public function VORTL_deleteScrollingTest():void
-		{
-			deleteScrollingTest(0);
-		}
+            textFlow.interactionManager = SelManager;
 
-		public function VORTL_backspaceScrollingTest():void
-		{
-			backspaceScrollingTest(0);
-		}
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
 
-		public function VORTL_pageUpScrollingTest():void
-		{
-			pageUpScrollingTest(0);
-		}
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("mousewheelDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("mousewheelDownScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
 
-		public function VORTL_pageDownScrollingTest():void
-		{
-			pageDownScrollingTest(722);
-		}
+            //to avoid tear down assertion
+            SelManager.selectRange(0, 0);
+        }
 
-		public function VORTL_mousewheelUpScrollingTest():void
-		{
-			mousewheelUpScrollingTest(1034);
-		}
-		
-		public function VORTL_mousewheelUpScrollingNoInteractionTest():void
-		{
-			mousewheelUpScrollingNoInteractionTest(1034);
-		}
-		
-		public function VORTL_mousewheelDownScrollingTest():void
-		{
-			mousewheelDownScrollingTest(60);
-		}
-		
-		public function VORTL_mousewheelDownScrollingNoInteractionTest():void
-		{
-			mousewheelDownScrollingNoInteractionTest(60);
-		}
+        public function autoScrollVisibleScrollingTest(scrollPos:Number):void
+        {
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the end of the text.
+            sendKeyboardGesture(CTRL_END);
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            tmpContainerController.verticalScrollPolicy = "auto";
+            // Type in enough text to make the scroll bars appear.
+            SelManager.insertText(" It was the best of times, it was the worst of times.");
+            //var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("autoScrollVisibleScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("autoScrollVisibleScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("autoScrollVisibleScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("autoScrollVisibleScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
 
-	}
+        public function autoScrollHideScrollingTest(scrollPos:Number):void
+        {
+            // Success or failure will be determined by the bitmap snapshot.
+            // Move the cursor to the beginning of the first line.
+            SelManager.selectRange(0, 0);
+            // Make sure we are at the end of the text.
+            sendKeyboardGesture(CTRL_END);
+            // Delete enough characters so scroll bars disappear.
+            for (var i:int = 0; i < 60; i++)
+            {
+                SelManager.deletePreviousCharacter();
+            }
+            var tmpContainerController:ContainerController = ContainerController(SelManager.textFlow.flowComposer.getControllerAt(0));
+            //	trace("autoScrollHideScrollingTestHP=" + tmpContainerController.horizontalScrollPosition);
+            //	trace("autoScrollHideScrollingTestVP=" + tmpContainerController.verticalScrollPosition);
+            if (SelManager.textFlow.computedFormat.blockProgression == BlockProgression.TB)
+            {
+                assertTrue("autoScrollHideScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.verticalScrollPosition) < (scrollPos + 1)) == true);
+            }
+            else
+            {
+                assertTrue("autoScrollHideScrollingTest Test Failed.", (scrollPos < Math.abs(tmpContainerController.horizontalScrollPosition) < (scrollPos + 1)) == true);
+            }
+        }
+    }
 }
