http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/ExtendedClasses/VellumTestCase.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/ExtendedClasses/VellumTestCase.as 
b/automation_core/src/UnitTest/ExtendedClasses/VellumTestCase.as
index 31c2d44..426563f 100644
--- a/automation_core/src/UnitTest/ExtendedClasses/VellumTestCase.as
+++ b/automation_core/src/UnitTest/ExtendedClasses/VellumTestCase.as
@@ -18,692 +18,693 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.ExtendedClasses
 {
-       import UnitTest.Fixtures.FileRepository;
-       import UnitTest.Fixtures.TestApp;
-       import UnitTest.Fixtures.TestConfig;
-       import UnitTest.Validation.BoundsChecker;
-       import UnitTest.Validation.LineSnapshot;
-       import UnitTest.Validation.MD5;
-       import UnitTest.Validation.StringSnapshot;
-       import UnitTest.Validation.TCMComposition;
-       import UnitTest.Validation.XMLSnapshot;
-       
-       import flash.display.Bitmap;
-       import flash.display.BitmapData;
-       import flash.display.DisplayObject;
-       import flash.display.IBitmapDrawable;
-       import flash.display.Sprite;
-       import flash.system.System;
-       import flash.utils.ByteArray;
-       import flash.utils.getTimer;
-       
-       import flashx.textLayout.compose.StandardFlowComposer;
-       import flashx.textLayout.container.ContainerController;
-       import flashx.textLayout.container.ScrollPolicy;
-       import flashx.textLayout.conversion.ITextImporter;
-       import flashx.textLayout.conversion.TextConverter;
-       import flashx.textLayout.edit.EditManager;
-       import flashx.textLayout.edit.EditingMode;
-       import flashx.textLayout.edit.SelectionFormat;
-       import flashx.textLayout.elements.Configuration;
-       import flashx.textLayout.elements.TextFlow;
-       import flashx.textLayout.factory.TextFlowTextLineFactory;
-       import flashx.textLayout.formats.TextLayoutFormat;
-       import flashx.textLayout.tlf_internal;
-       use namespace tlf_internal;
-       
-       import flexunit.framework.TestCase;
-       
-       import mx.containers.Canvas;
-       import mx.core.UIComponent;
-       import mx.skins.Border;
-
-
-       public class VellumTestCase extends TestCase
-       {
-               //public static var app:VellumUnit = Application.application as 
VellumUnit;
-               public static var testApp:TestApp;
-               public var TestID:String;
-               public var TestData:Object;
-               public var TestFrame:ContainerController;
-               public var TestDisplayObject:DisplayObject;
-               public var SelManager:EditManager;
-               public var containerType:String;
-               public var writingDirection:Array;
-               public var useEmbeddedFonts:Boolean;
-               public var baseURL:String;              // baseURL for loading 
files
-               public var doBeforeAfterCompare:Boolean;
-               public var diffTolerance:Number;
-
-               public var bitmapBaseline:Bitmap;
-               public var lineBaseline:XML;
-               public var plaintextBaseline:String;
-               public var xflBaseline:XML;
-               public var htmlBaseline:XML;
-
-               //checksum for the baseline
-               public var bitmapBaselineChecksum:String = null;
-               public var lineBaselineChecksum:String = null;
-               public var plaintextBaselineChecksum:String = null;
-               public var xflBaselineChecksum:String = null;
-               public var htmlBaselineChecksum:String = null;
-
-               //checksum for the snapshot
-               public var bitmapSnapshotChecksum:String = null;
-               public var lineSnapshotChecksum:String = null;
-               public var plaintextSnapshotChecksum:String = null;
-               public var xflSnapshotChecksum:String = null;
-               public var htmlSnapshotChecksum:String = null;
-
-               //result link for the failed snapshot
-               public static var snapAdminServerUrl:String = "";
-               public var runID:Number;
-
-               public var fileName:String = null;
-               public var beforeData:BitmapData = null;
-               public var afterData:Bitmap = null;
-
-               public var bitmapSnapshot:Bitmap = null;
-               public var lineSnapshot:XML = null;
-               public var plaintextSnapshot:String = null;
-               public var xflSnapshot:XML = null;
-               public var htmlSnapshot:XML = null;
-
-
-               public var TCMCompositionResult:Boolean = true;
-               public var bitmapResult:Boolean = true;
-               public var lineResult:Boolean = true;
-               public var plaintextResult:Boolean = true;
-               public var xflResult:Boolean = true;
-               public var htmlResult:Boolean = true;
-
-               private var failString:String = "";
-               private var endOfSetupTime:Number;
-               
-               protected var addDefaultTestSettings:Boolean;
-
-               private static var useRandom:Boolean = false;
-               private static var LineSnapshotUtils:LineSnapshot = new 
LineSnapshot();
-               private static var XMLSnapshotUtils:XMLSnapshot = new 
XMLSnapshot();
-               private static var StringSnapshotUtils:StringSnapshot = new 
StringSnapshot();
-
-               public function VellumTestCase(methodName:String, 
testID:String, testConfig:TestConfig, testCaseXML:XML = null)
-               {
-                       TestData = new Object();
-
-                       // set defaults to some items in TestData - these can 
be overridden
-                       // in a specific test case's constructor or in an XML 
file
-                       TestData.bitmapSnapshot = "false";
-                       TestData.lineSnapshot = "false";
-                       TestData.xflSnapshot = "false";
-                       TestData.minimal = "true";
-
-                       if (testCaseXML)
-                       {
-                               for each (var testDataXML:XML in testCaseXML.*)
-                               {
-                                       TestData[testDataXML.@name] = 
testDataXML.toString();
-                               }
-                       }
-
-                       if (TestData["bitmapSnapshotTolerance"] != null)
-                               diffTolerance = 
TestData["bitmapSnapshotTolerance"];
-                       else
-                               diffTolerance = 0.001;
-
-                       writingDirection = testConfig.writingDirection;
-                       containerType = testConfig.containerType;
-                       doBeforeAfterCompare = testConfig.doBeforeAfterCompare;
-                       useEmbeddedFonts = testConfig.useEmbeddedFonts;
-                       baseURL = testConfig.baseURL;
-                       addDefaultTestSettings = true;
-
-                       TestID = testID;
-
-                       super (methodName);
-
-               }
-
-               public static function suiteFromXML(testCaseClass:Class, 
testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void
-               {
-                       var writingDirection:String = 
testConfig.writingDirection[0] + "_" + testConfig.writingDirection[1];
-                       for each (var testCaseXML:XML in testListXML.*)
-                       {
-                               var testFile:String = 
testCaseXML.TestData.(@name == "testFile").toString();
-                               if (testFile != "")
-                               {
-                                       var extension:String = 
getExtension(testFile);
-                                       var folderName:String = "";
-                                       if (extension == "html")
-                                               folderName = "html/";
-                                       else if (extension == "txt")
-                                               folderName = "plainText/";
-                                       else
-                                               folderName = "tlf/";
-                                       
FileRepository.readFile(testConfig.baseURL, "../../test/testFiles/markup/" + 
folderName + testFile);
-                               }
-                               if ((testCaseXML.TestData.(@name == 
writingDirection).toString() != "false") &&
-                                       (testCaseXML.TestData.(@name == 
testConfig.containerType).toString() != "false") &&
-                                       (testCaseXML.TestData.(@name == 
testConfig.flashVersion) != "false"))
-                               {
-                                       ts.addTestDescriptor (new 
TestDescriptor (testCaseClass, testCaseXML.@functionName, testConfig, 
testCaseXML));
-                               }
-                       }
-               }
-
-               static public var defaultFileName:String = "simple.xml";
-               static private var DEFAULT_COMPOSITION_WIDTH:Number = 826;
-               static private var DEFAULT_COMPOSITION_HEIGHT:Number = 477;
-
-               /** start every test with nothing on the canvas
-                */
-               public function cleanUpTestApp() : void
-               {
-                       testApp.detachActiveFlow(true);
-                       var canvas:Canvas = testApp.getDisplayObject();
-                       // remove everything but the Border
-                       for (var i:int = canvas.rawChildren.numChildren - 1; i 
>= 0; i--)
-                               if (!(canvas.rawChildren.getChildAt(i) is 
Border))
-                                       canvas.rawChildren.removeChildAt(i);
-               }
-
-               override public function setUp() : void
-               {
-                       //trace("Beginning test: " + TestID);
-
-                       // Make sure whatever was left from last test is cleared
-                       cleanUpTestApp();
-
-                       testApp.contentChange(null);
-                       testApp.setInteractionManager(EditingMode.READ_WRITE);
-                       testApp.changeContainerSetup("arrangeSideBySide", 0, 1);
-
-       //              if (TestData.requiresLayout == "true")
-       //              {
-       //                      trace ("-----------set up layout-enabled 
container here-----------");
-       //              }
-
-                       fileName = TestData.fileName == undefined ? 
defaultFileName : TestData.fileName;
-
-                       loadTestFile(fileName);
-
-                       TestFrame = 
TextFlow(testApp.getTextFlow()).flowComposer.getControllerAt(0);
-                       TestDisplayObject = testApp.getDisplayObject();
-
-                       // all of this should eventually go away, but some 
tests are depending
-                       // on it at the moment.  I'm assuming that:
-                       // 1. Container attributes should either stay the 
default, or these
-                       //    attributes should get put into the default file.
-                       // 2. Tests that depend on scrolling being off should 
do that themselves
-                       // 3. Writing direction for the default file should be 
handled in loadTestFile.
-                       if (fileName == defaultFileName && 
addDefaultTestSettings)
-                       {
-                               // set the container attributes to the same as 
those in the Flex TextContainer (see the flow:TextContaienr below)
-                               var containerAttr:TextLayoutFormat = new 
TextLayoutFormat(TestFrame.format);
-                               containerAttr.columnCount = 2;
-                               containerAttr.columnGap = 10;
-                               //containerAttr.paddingLeft = 4;
-                               containerAttr.paddingRight = 4;
-                               //containerAttr.paddingTop = 4;
-                               TestFrame.horizontalScrollPolicy = 
ScrollPolicy.OFF;
-                               TestFrame.verticalScrollPolicy = 
ScrollPolicy.OFF;
-                               TestFrame.format = containerAttr;
-                               containerAttr = null;
-                               if (TestFrame.compositionWidth != 
DEFAULT_COMPOSITION_WIDTH || TestFrame.compositionHeight != 
DEFAULT_COMPOSITION_HEIGHT)
-                                       
TestFrame.setCompositionSize(DEFAULT_COMPOSITION_WIDTH, 
DEFAULT_COMPOSITION_HEIGHT);
-
-                       }
-
-                       // Set the writing direction specified by the test
-                       if (fileName == defaultFileName && 
TestFrame.rootElement)
-                       {
-                               TestFrame.rootElement.blockProgression = 
writingDirection[0];
-                               TestFrame.rootElement.direction        = 
writingDirection[1];
-                       }
-                       
-                       
TextFlow(testApp.getTextFlow()).flowComposer.updateAllControllers();
-
-                       if (TestFrame.rootElement)
-                       {
-                               SelManager = 
EditManager(TestFrame.rootElement.getTextFlow().interactionManager);
-                               if(SelManager)
-                               {
-                                       setSelectionRange();
-                                       //make sure there is never any blinking 
when running these tests
-                                       setCaretBlinkRate (0);
-                               }
-                       }
-                       //endOfSetupTime = getTimer();
-               }
-
-               override public function tearDown() : void
-               {
-               //      trace ("Beginning of teardown.");
-
-                       if (TestFrame && TestFrame.flowComposer)
-                               TestFrame.flowComposer.updateAllControllers();
-
-                       //middleDuration = (getTimer() - endOfSetupTime);
-
-                       // generic validation
-                       // note: why must the selectionmanager be active?
-                       if (SelManager)
-                       {
-                               assertTrue ("teardown assert for active 
SelectionManager failed", SelManager.hasSelection());
-                               CONFIG::debug
-                               {
-                                       assertTrue("teardown assert for 
SelManager.debugCheckSelectionManager() failed", 
SelManager.debugCheckSelectionManager() == 0);
-                                       assertTrue("teardown assert for 
SelManager.textFlow.debugCheckTextFlow() failed", 
SelManager.textFlow.debugCheckTextFlow() == 0);
-                               }
-                       }
-
-                       if (containerType == "sprite")
-                               assertTrue ("TestFrame should be a Sprite, but 
is not", TestFrame.container is Sprite);
-
-
-                       //Only run this test if VellumUnit is set to do it.
-                       if (doBeforeAfterCompare)
-                       {
-                               var tempSelManager:EditManager = new 
EditManager();
-                               var fFormat:SelectionFormat = 
SelManager.focusedSelectionFormat;
-                               var nfFormat:SelectionFormat = 
SelManager.unfocusedSelectionFormat;
-                               var inFormat:SelectionFormat = 
SelManager.inactiveSelectionFormat;
-                               tempSelManager.focusedSelectionFormat = new 
SelectionFormat(fFormat.rangeColor, fFormat.rangeAlpha, fFormat.rangeBlendMode, 
fFormat.pointColor, fFormat.pointAlpha, fFormat.pointBlendMode, 1000);
-                               tempSelManager.unfocusedSelectionFormat = new 
SelectionFormat(nfFormat.rangeColor, nfFormat.rangeAlpha, 
nfFormat.rangeBlendMode, nfFormat.pointColor, nfFormat.pointAlpha, 
nfFormat.pointBlendMode, 1000);
-                               tempSelManager.inactiveSelectionFormat = new 
SelectionFormat(inFormat.rangeColor, inFormat.rangeAlpha, 
inFormat.rangeBlendMode, inFormat.pointColor, inFormat.pointAlpha, 
inFormat.pointBlendMode, 1000);
-
-                               var TestCanvas:Canvas = 
testApp.getDisplayObject();
-                               var curTextFlow:TextFlow = 
TextFlow(testApp.getTextFlow());
-
-                               var TCMCompositionUtils:TCMComposition = new 
TCMComposition(TestCanvas, curTextFlow);
-                               TCMCompositionUtils.Height = 
testApp.getDisplayObject().height;
-                               TCMCompositionUtils.Width = 
testApp.getDisplayObject().width;
-                               TCMCompositionResult = 
TCMCompositionUtils.compare();
-
-                               if (!TCMCompositionResult)
-                               {
-                                       failString += " TextContainerManager 
composition: " + TCMCompositionUtils.ErrorString;
-                               }
-
-                               SelManager = tempSelManager;
-                       }
-
-                       if (TestData.bitmapSnapshot == true)
-                       {
-                               // Create the afterData snapshot.
-                               if (TestDisplayObject is mx.core.UIComponent)
-                                       
mx.core.UIComponent(TestDisplayObject).validateNow();
-                               var bits:BitmapData = new 
BitmapData(TestDisplayObject.width, TestDisplayObject.height);
-                               bits.draw(TestDisplayObject as IBitmapDrawable);
-                               bitmapSnapshot = new Bitmap(bits);
-                               bits = null;
-
-                               var pixels:ByteArray = 
bitmapSnapshot.bitmapData.getPixels(bitmapSnapshot.bitmapData.rect);
-                               pixels.compress();
-                               pixels.position = 0;
-                               bitmapSnapshotChecksum = MD5.hashBinary(pixels);
-
-                               // If there is a baseline, then run a compare. 
If not, (gcai) we'll report an error about what's wrong there.
-                               //bitmapResult = true;
-                               if (bitmapBaseline != null)
-                               {
-                                       if(bitmapSnapshotChecksum != 
bitmapBaselineChecksum)
-                                       {
-                                               // If the checksum is 
different, do the bitmap compare of the two bitmaps to make the diffTolerance 
enabled.
-                                               
bitmapBaseline.bitmapData.draw(bitmapSnapshot, null, null, "difference");
-                                               var diffPixels:ByteArray = 
bitmapBaseline.bitmapData.getPixels(bitmapBaseline.bitmapData.rect);
-                                               diffPixels.position = 0;
-                                               var pixelCount:uint = 
diffPixels.bytesAvailable;
-                                               var diffCount:uint = 0;
-                                               var redDiff:uint = 0;
-                                               var greenDiff:uint = 0;
-                                               var blueDiff:uint = 0;
-                                               var componentTolerance:uint = 
20;
-                                               
-                                               while 
(diffPixels.bytesAvailable > 0)
-                                               {
-                                                       // throw away alpha
-                                                       
diffPixels.readUnsignedByte();
-                                                       
-                                                       redDiff = 
diffPixels.readUnsignedByte();
-                                                       greenDiff = 
diffPixels.readUnsignedByte();
-                                                       blueDiff = 
diffPixels.readUnsignedByte();
-                                                       
-                                                       // only count pixels 
where the difference is visible
-                                                       if (redDiff > 
componentTolerance || greenDiff > componentTolerance || blueDiff > 
componentTolerance)
-                                                       {
-                                                               // previously 
we'd count the number of pixels that were different
-                                                               //diffCount ++;
-                                                               // now we're 
summing the amount of the differences - so a small number of very different
-                                                               // pixels will 
error, but only a large number of slightly different pixels will error
-                                                               diffCount += 
redDiff + greenDiff + blueDiff
-                                                       }
-                                                       
-                                                       redDiff = 0;
-                                                       greenDiff = 0;
-                                                       blueDiff = 0;
-                                               }
-
-                                               // If this is larger than the 
tolerance, then something changed and it is a bug.
-                                               // previous pixel count 
threshold
-                                               //bitmapResult = 
(((diffCount/(pixelCount/4))*100) < diffTolerance);
-                                               // new summed differences 
threshold
-                                               bitmapResult = diffCount < 
(pixelCount/4)*diffTolerance*255*3;
-                                               //trace ("  TestID: " + TestID 
+ " count: "+ diffCount + " threshold: " + (pixelCount/4)*diffTolerance*255);
-
-                                               if (!bitmapResult)
-                                               {
-                                                       failString += "Bitmap 
data snapshot differed from the baseline. Detail:"+getUrl("Bitmap");
-                                                       failString += "  Bitmap 
compare failed by " + ((diffCount/pixelCount)*100) + " percent of pixels 
compared.";
-                                               }
-                               }
-                               }
-                               else
-                               {
-                                       bitmapResult = false;
-                                       failString += "Don't have any bitmap 
baseline for current case. Detail:"+getUrl("Bitmap");
-                               }
-                       }
-
-                       if (TestData.lineSnapshot == true)
-                       {
-                               lineSnapshot = 
LineSnapshotUtils.takeSnapshot(TestFrame.rootElement.getTextFlow());
-                               var lineDataBytes:ByteArray = new ByteArray();
-                               lineSnapshot.normalize();
-                               lineDataBytes.writeObject (lineSnapshot);
-                               lineDataBytes.compress();
-                               lineDataBytes.uncompress();
-                               lineSnapshot = new 
XML(lineDataBytes.readObject());
-                               lineSnapshot.normalize();
-
-                               lineSnapshotChecksum = 
getChecksum(lineSnapshot);
-                               // Do a compare as long as there is a baseline.
-                               if (lineBaseline != null)
-                               {
-                                       if(lineSnapshotChecksum != 
lineBaselineChecksum)
-                                       {
-                                               lineResult = 
XMLSnapshotUtils.compareAdvanced(lineBaseline, lineSnapshot);
-                                               if (!lineResult)
-                                               {
-                                                       failString += "  , Line 
data snapshot differed from the baseline. Detail:"+getUrl("Line");
-                                               }
-                                       }
-                               }
-                               else
-                               {
-                                       lineResult = false;
-                                       failString += " , Don't have any line 
baseline for current case. Detail:"+getUrl("Line");
-                               }
-                       }
-
-                       if (TestData.plaintextSnapshot == true)
-                       {
-                               plaintextSnapshot = 
StringSnapshotUtils.takeSnapshot(TestFrame.rootElement.getTextFlow(), 
TextConverter.PLAIN_TEXT_FORMAT);
-                               plaintextSnapshotChecksum = 
MD5.hash(plaintextSnapshot);
-                               // Do a compare as long as there is a baseline.
-                               if (plaintextBaseline != null)
-                               {
-                                       if(plaintextSnapshotChecksum != 
plaintextBaselineChecksum)
-                                       {
-                                               plaintextResult = 
StringSnapshotUtils.compare(plaintextBaseline, plaintextSnapshot);
-                                               if (!plaintextResult)
-                                               {
-                                                       failString += "  , 
PlainText data snapshot differed from the baseline. Detail:" + 
getUrl("PlainText");
-                                               }
-                                       }
-                               }
-                               else
-                               {
-                                       plaintextResult = false;
-                                       failString += " , Don't have any 
PlainText baseline for current case. Detail:"+getUrl("PlainText");
-                               }
-                       }
-
-                       if (TestData.xflSnapshot == true)
-                       {
-                               xflSnapshot = 
XMLSnapshotUtils.takeSnapshot(TestFrame.rootElement.getTextFlow(), 
TextConverter.TEXT_LAYOUT_FORMAT);
-                               xflSnapshotChecksum = getChecksum(xflSnapshot);
-                               // Do a compare as long as there is a baseline.
-                               if (xflBaseline != null)
-                               {
-                                       if(xflSnapshotChecksum != 
xflBaselineChecksum)
-                                       {
-                                               xflResult = 
XMLSnapshotUtils.compareAdvanced(xflBaseline, xflSnapshot);
-                                               if (!xflResult)
-                                               {
-                                                       failString += "  , XFL 
data snapshot differed from the baseline. Detail:" + getUrl("XFL");
-                                               }
-                                       }
-                               }
-                               else
-                               {
-                                       xflResult = false;
-                                       failString += " , Don't have any xfl 
baseline for current case. Detail:"+getUrl("XFL");
-                               }
-                       }
-
-                       if (TestData.htmlSnapshot == true)
-                       {
-                               htmlSnapshot = 
XMLSnapshotUtils.takeSnapshot(TestFrame.rootElement.getTextFlow(), 
TextConverter.TEXT_FIELD_HTML_FORMAT);
-                               htmlSnapshotChecksum = 
getChecksum(htmlSnapshot);
-                               // Do a compare as long as there is a baseline.
-                               if (htmlBaseline != null)
-                               {
-                                       if(htmlBaselineChecksum != 
htmlSnapshotChecksum)
-                                       {
-                                               htmlResult = 
XMLSnapshotUtils.compareAdvanced(htmlBaseline, htmlSnapshot);
-                                               if (!htmlResult)
-                                               {
-                                                       failString += "  , HTML 
data snapshot differed from the baseline. Detail:"+getUrl("HTML");
-                                               }
-                                       }
-                               }
-                               else
-                               {
-                                       htmlResult = false;
-                                       failString += " , Don't have any HTML 
baseline for current case. Detail:"+getUrl("HTML");
-                               }
-                       }
-
-               //      Comment this code in to enable bounds checking on each 
test. 
-               /*      if (TestFrame && TestFrame.textFlow)
-                       {
-                               var s:Sprite = new Sprite();
-                               
testApp.getDisplayObject().rawChildren.addChild(s);
-                               
BoundsChecker.boundsValidation(TestFrame.textFlow, s);
-                               
testApp.getDisplayObject().rawChildren.removeChild(s);
-                       } */
-
-
-                       //      trace ("Ending test: " + TestID);
-
-                       //*****************************************************
-                       if (SelManager)
-                       {
-                               //turn caret blinking back on
-                               setCaretBlinkRate (1000);
-                       }
-                       // Nulls for garbage collection
-                       TestFrame = null;
-                       SelManager = null;
-       //              trace ("End of teardown.");
-                       
-                       
-                       // This code breaks snapshotting of XML - need to move 
the disposeXML calls somewhere else
-                       /*if (Configuration.playerEnablesArgoFeatures)
-                               System["disposeXML"](lineSnapshot);
-                       lineSnapshot = null;
-                       plaintextSnapshot = null;
-                       if (Configuration.playerEnablesArgoFeatures)
-                               System["disposeXML"](xflSnapshot);
-                       xflSnapshot = null;
-                       if (Configuration.playerEnablesArgoFeatures)
-                               System["disposeXML"](htmlSnapshot);
-                       htmlSnapshot = null;*/
-
-                       
-                       // The assert makes it end the test, so we need to put 
that at the very
-                       // end of everything, so that all snapshot tests get a 
chance to run.
-                       assertTrue (failString, ((TCMCompositionResult) && 
(bitmapResult) && (lineResult) && (xflResult) && (htmlResult)));
+
+    import UnitTest.Fixtures.FileRepository;
+    import UnitTest.Fixtures.TestApp;
+    import UnitTest.Fixtures.TestConfig;
+    import UnitTest.Validation.LineSnapshot;
+    import UnitTest.Validation.MD5;
+    import UnitTest.Validation.StringSnapshot;
+    import UnitTest.Validation.TCMComposition;
+    import UnitTest.Validation.XMLSnapshot;
+
+    import flash.display.Bitmap;
+    import flash.display.BitmapData;
+    import flash.display.DisplayObject;
+    import flash.display.IBitmapDrawable;
+    import flash.display.Sprite;
+    import flash.utils.ByteArray;
+    import flash.utils.getTimer;
+
+    import flashx.textLayout.container.ContainerController;
+    import flashx.textLayout.container.ScrollPolicy;
+    import flashx.textLayout.conversion.ITextImporter;
+    import flashx.textLayout.conversion.TextConverter;
+    import flashx.textLayout.edit.EditManager;
+    import flashx.textLayout.edit.EditingMode;
+    import flashx.textLayout.edit.SelectionFormat;
+    import flashx.textLayout.elements.TextFlow;
+    import flashx.textLayout.formats.TextLayoutFormat;
+    import flashx.textLayout.tlf_internal;
+
+    import mx.containers.Canvas;
+    import mx.core.UIComponent;
+    import mx.skins.Border;
+
+    import org.flexunit.asserts.assertTrue;
+
+    use namespace tlf_internal;
+
+
+    public class VellumTestCase extends TestCaseBase
+    {
+        //public static var app:VellumUnit = Application.application as 
VellumUnit;
+        public static var testApp:TestApp;
+        public var TestID:String;
+        public var TestData:Object;
+        public var TestFrame:ContainerController;
+        public var TestDisplayObject:DisplayObject;
+        public var SelManager:EditManager;
+        public var containerType:String;
+        public var writingDirection:Array;
+        public var useEmbeddedFonts:Boolean;
+        public var baseURL:String;             // baseURL for loading files
+        public var doBeforeAfterCompare:Boolean;
+        public var diffTolerance:Number;
+
+        public var bitmapBaseline:Bitmap;
+        public var lineBaseline:XML;
+        public var plaintextBaseline:String;
+        public var xflBaseline:XML;
+        public var htmlBaseline:XML;
+
+        //checksum for the baseline
+        public var bitmapBaselineChecksum:String = null;
+        public var lineBaselineChecksum:String = null;
+        public var plaintextBaselineChecksum:String = null;
+        public var xflBaselineChecksum:String = null;
+        public var htmlBaselineChecksum:String = null;
+
+        //checksum for the snapshot
+        public var bitmapSnapshotChecksum:String = null;
+        public var lineSnapshotChecksum:String = null;
+        public var plaintextSnapshotChecksum:String = null;
+        public var xflSnapshotChecksum:String = null;
+        public var htmlSnapshotChecksum:String = null;
+
+        //result link for the failed snapshot
+        public static var snapAdminServerUrl:String = "";
+        public var runID:Number;
+
+        public var fileName:String = null;
+        public var beforeData:BitmapData = null;
+        public var afterData:Bitmap = null;
+
+        public var bitmapSnapshot:Bitmap = null;
+        public var lineSnapshot:XML = null;
+        public var plaintextSnapshot:String = null;
+        public var xflSnapshot:XML = null;
+        public var htmlSnapshot:XML = null;
+
+
+        public var TCMCompositionResult:Boolean = true;
+        public var bitmapResult:Boolean = true;
+        public var lineResult:Boolean = true;
+        public var plaintextResult:Boolean = true;
+        public var xflResult:Boolean = true;
+        public var htmlResult:Boolean = true;
+
+        private var failString:String = "";
+        private var endOfSetupTime:Number;
+
+        protected var addDefaultTestSettings:Boolean;
+
+        private static var useRandom:Boolean = false;
+        private static var LineSnapshotUtils:LineSnapshot = new LineSnapshot();
+        private static var XMLSnapshotUtils:XMLSnapshot = new XMLSnapshot();
+        private static var StringSnapshotUtils:StringSnapshot = new 
StringSnapshot();
+
+        public function VellumTestCase(methodName:String = null, testID:String 
= null, testConfig:TestConfig = null, testCaseXML:XML = null)
+        {
+            TestData = new Object();
+
+            // set defaults to some items in TestData - these can be overridden
+            // in a specific test case's constructor or in an XML file
+            TestData.bitmapSnapshot = "false";
+            TestData.lineSnapshot = "false";
+            TestData.xflSnapshot = "false";
+            TestData.minimal = "true";
+
+            if (testCaseXML)
+            {
+                for each (var testDataXML:XML in testCaseXML.*)
+                {
+                    TestData[testDataXML.@name] = testDataXML.toString();
+                }
+            }
+
+            if (TestData["bitmapSnapshotTolerance"] != null)
+                diffTolerance = TestData["bitmapSnapshotTolerance"];
+            else
+                diffTolerance = 0.001;
+
+            writingDirection = testConfig.writingDirection;
+            containerType = testConfig.containerType;
+            doBeforeAfterCompare = testConfig.doBeforeAfterCompare;
+            useEmbeddedFonts = testConfig.useEmbeddedFonts;
+            baseURL = testConfig.baseURL;
+            addDefaultTestSettings = true;
+
+            TestID = testID;
+
+            super(methodName);
+
+        }
+
+        public static function suiteFromXML(testCaseClass:Class, 
testListXML:XML, testConfig:TestConfig, ts:TestSuiteExtended):void
+        {
+            var writingDirection:String = testConfig.writingDirection[0] + "_" 
+ testConfig.writingDirection[1];
+            for each (var testCaseXML:XML in testListXML.*)
+            {
+                var testFile:String = testCaseXML.TestData.(@name == 
"testFile").toString();
+                if (testFile != "")
+                {
+                    var extension:String = getExtension(testFile);
+                    var folderName:String = "";
+                    if (extension == "html")
+                        folderName = "html/";
+                    else if (extension == "txt")
+                        folderName = "plainText/";
+                    else
+                        folderName = "tlf/";
+                    FileRepository.readFile(testConfig.baseURL, 
"../../test/testFiles/markup/" + folderName + testFile);
+                }
+                if ((testCaseXML.TestData.(@name == 
writingDirection).toString() != "false") &&
+                        (testCaseXML.TestData.(@name == 
testConfig.containerType).toString() != "false") &&
+                        (testCaseXML.TestData.(@name == 
testConfig.flashVersion) != "false"))
+                {
+                    ts.addTestDescriptor(new TestDescriptor(testCaseClass, 
testCaseXML.@functionName, testConfig, testCaseXML));
+                }
+            }
+        }
+
+        static public var defaultFileName:String = "simple.xml";
+        static private var DEFAULT_COMPOSITION_WIDTH:Number = 826;
+        static private var DEFAULT_COMPOSITION_HEIGHT:Number = 477;
+
+        /** start every test with nothing on the canvas
+         */
+        public function cleanUpTestApp():void
+        {
+            testApp.detachActiveFlow(true);
+            var canvas:Canvas = testApp.getDisplayObject();
+            // remove everything but the Border
+            for (var i:int = canvas.rawChildren.numChildren - 1; i >= 0; i--)
+                if (!(canvas.rawChildren.getChildAt(i) is Border))
+                    canvas.rawChildren.removeChildAt(i);
+        }
+
+        public function setUpTest():void
+        {
+            //trace("Beginning test: " + TestID);
+
+            // Make sure whatever was left from last test is cleared
+            cleanUpTestApp();
+
+            testApp.contentChange(null);
+            testApp.setInteractionManager(EditingMode.READ_WRITE);
+            testApp.changeContainerSetup("arrangeSideBySide", 0, 1);
+
+            //         if (TestData.requiresLayout == "true")
+            //         {
+            //                 trace ("-----------set up layout-enabled 
container here-----------");
+            //         }
+
+            fileName = TestData.fileName == undefined ? defaultFileName : 
TestData.fileName;
+
+            loadTestFile(fileName);
+
+            TestFrame = 
TextFlow(testApp.getTextFlow()).flowComposer.getControllerAt(0);
+            TestDisplayObject = testApp.getDisplayObject();
+
+            // all of this should eventually go away, but some tests are 
depending
+            // on it at the moment.  I'm assuming that:
+            // 1. Container attributes should either stay the default, or these
+            //    attributes should get put into the default file.
+            // 2. Tests that depend on scrolling being off should do that 
themselves
+            // 3. Writing direction for the default file should be handled in 
loadTestFile.
+            if (fileName == defaultFileName && addDefaultTestSettings)
+            {
+                // set the container attributes to the same as those in the 
Flex TextContainer (see the flow:TextContaienr below)
+                var containerAttr:TextLayoutFormat = new 
TextLayoutFormat(TestFrame.format);
+                containerAttr.columnCount = 2;
+                containerAttr.columnGap = 10;
+                //containerAttr.paddingLeft = 4;
+                containerAttr.paddingRight = 4;
+                //containerAttr.paddingTop = 4;
+                TestFrame.horizontalScrollPolicy = ScrollPolicy.OFF;
+                TestFrame.verticalScrollPolicy = ScrollPolicy.OFF;
+                TestFrame.format = containerAttr;
+                containerAttr = null;
+                if (TestFrame.compositionWidth != DEFAULT_COMPOSITION_WIDTH || 
TestFrame.compositionHeight != DEFAULT_COMPOSITION_HEIGHT)
+                    TestFrame.setCompositionSize(DEFAULT_COMPOSITION_WIDTH, 
DEFAULT_COMPOSITION_HEIGHT);
+
+            }
+
+            // Set the writing direction specified by the test
+            if (fileName == defaultFileName && TestFrame.rootElement)
+            {
+                TestFrame.rootElement.blockProgression = writingDirection[0];
+                TestFrame.rootElement.direction = writingDirection[1];
+            }
+
+            
TextFlow(testApp.getTextFlow()).flowComposer.updateAllControllers();
+
+            if (TestFrame.rootElement)
+            {
+                SelManager = 
EditManager(TestFrame.rootElement.getTextFlow().interactionManager);
+                if (SelManager)
+                {
+                    setSelectionRange();
+                    //make sure there is never any blinking when running these 
tests
+                    setCaretBlinkRate(0);
+                }
+            }
+            //endOfSetupTime = getTimer();
+        }
+
+        public function tearDownTest():void
+        {
+            // trace ("Beginning of teardown.");
+
+            if (TestFrame && TestFrame.flowComposer)
+                TestFrame.flowComposer.updateAllControllers();
+
+            //middleDuration = (getTimer() - endOfSetupTime);
+
+            // generic validation
+            // note: why must the selectionmanager be active?
+            if (SelManager)
+            {
+                assertTrue("teardown assert for active SelectionManager 
failed", SelManager.hasSelection());
+                /*CONFIG::debug
+                 {
+                 assertTrue("teardown assert for 
SelManager.debugCheckSelectionManager() failed", 
SelManager.debugCheckSelectionManager() == 0);
+                 assertTrue("teardown assert for 
SelManager.textFlow.debugCheckTextFlow() failed", 
SelManager.textFlow.debugCheckTextFlow() == 0);
+                 }  */
+            }
+
+            if (containerType == "sprite")
+                assertTrue("TestFrame should be a Sprite, but is not", 
TestFrame.container is Sprite);
+
+
+            //Only run this test if VellumUnit is set to do it.
+            if (doBeforeAfterCompare)
+            {
+                var tempSelManager:EditManager = new EditManager();
+                var fFormat:SelectionFormat = 
SelManager.focusedSelectionFormat;
+                var nfFormat:SelectionFormat = 
SelManager.unfocusedSelectionFormat;
+                var inFormat:SelectionFormat = 
SelManager.inactiveSelectionFormat;
+                tempSelManager.focusedSelectionFormat = new 
SelectionFormat(fFormat.rangeColor, fFormat.rangeAlpha, fFormat.rangeBlendMode, 
fFormat.pointColor, fFormat.pointAlpha, fFormat.pointBlendMode, 1000);
+                tempSelManager.unfocusedSelectionFormat = new 
SelectionFormat(nfFormat.rangeColor, nfFormat.rangeAlpha, 
nfFormat.rangeBlendMode, nfFormat.pointColor, nfFormat.pointAlpha, 
nfFormat.pointBlendMode, 1000);
+                tempSelManager.inactiveSelectionFormat = new 
SelectionFormat(inFormat.rangeColor, inFormat.rangeAlpha, 
inFormat.rangeBlendMode, inFormat.pointColor, inFormat.pointAlpha, 
inFormat.pointBlendMode, 1000);
+
+                var TestCanvas:Canvas = testApp.getDisplayObject();
+                var curTextFlow:TextFlow = TextFlow(testApp.getTextFlow());
+
+                var TCMCompositionUtils:TCMComposition = new 
TCMComposition(TestCanvas, curTextFlow);
+                TCMCompositionUtils.Height = testApp.getDisplayObject().height;
+                TCMCompositionUtils.Width = testApp.getDisplayObject().width;
+                TCMCompositionResult = TCMCompositionUtils.compare();
+
+                if (!TCMCompositionResult)
+                {
+                    failString += " TextContainerManager composition: " + 
TCMCompositionUtils.ErrorString;
+                }
+
+                SelManager = tempSelManager;
+            }
+
+            if (TestData.bitmapSnapshot == true)
+            {
+                // Create the afterData snapshot.
+                if (TestDisplayObject is UIComponent)
+                    UIComponent(TestDisplayObject).validateNow();
+                var bits:BitmapData = new BitmapData(TestDisplayObject.width, 
TestDisplayObject.height);
+                bits.draw(TestDisplayObject as IBitmapDrawable);
+                bitmapSnapshot = new Bitmap(bits);
+                bits = null;
+
+                var pixels:ByteArray = 
bitmapSnapshot.bitmapData.getPixels(bitmapSnapshot.bitmapData.rect);
+                pixels.compress();
+                pixels.position = 0;
+                bitmapSnapshotChecksum = MD5.hashBinary(pixels);
+
+                // If there is a baseline, then run a compare. If not, (gcai) 
we'll report an error about what's wrong there.
+                //bitmapResult = true;
+                if (bitmapBaseline != null)
+                {
+                    if (bitmapSnapshotChecksum != bitmapBaselineChecksum)
+                    {
+                        // If the checksum is different, do the bitmap compare 
of the two bitmaps to make the diffTolerance enabled.
+                        bitmapBaseline.bitmapData.draw(bitmapSnapshot, null, 
null, "difference");
+                        var diffPixels:ByteArray = 
bitmapBaseline.bitmapData.getPixels(bitmapBaseline.bitmapData.rect);
+                        diffPixels.position = 0;
+                        var pixelCount:uint = diffPixels.bytesAvailable;
+                        var diffCount:uint = 0;
+                        var redDiff:uint = 0;
+                        var greenDiff:uint = 0;
+                        var blueDiff:uint = 0;
+                        var componentTolerance:uint = 20;
+
+                        while (diffPixels.bytesAvailable > 0)
+                        {
+                            // throw away alpha
+                            diffPixels.readUnsignedByte();
+
+                            redDiff = diffPixels.readUnsignedByte();
+                            greenDiff = diffPixels.readUnsignedByte();
+                            blueDiff = diffPixels.readUnsignedByte();
+
+                            // only count pixels where the difference is 
visible
+                            if (redDiff > componentTolerance || greenDiff > 
componentTolerance || blueDiff > componentTolerance)
+                            {
+                                // previously we'd count the number of pixels 
that were different
+                                //diffCount ++;
+                                // now we're summing the amount of the 
differences - so a small number of very different
+                                // pixels will error, but only a large number 
of slightly different pixels will error
+                                diffCount += redDiff + greenDiff + blueDiff
+                            }
+
+                            redDiff = 0;
+                            greenDiff = 0;
+                            blueDiff = 0;
+                        }
+
+                        // If this is larger than the tolerance, then 
something changed and it is a bug.
+                        // previous pixel count threshold
+                        //bitmapResult = (((diffCount/(pixelCount/4))*100) < 
diffTolerance);
+                        // new summed differences threshold
+                        bitmapResult = diffCount < (pixelCount / 4) * 
diffTolerance * 255 * 3;
+                        //trace ("  TestID: " + TestID + " count: "+ diffCount 
+ " threshold: " + (pixelCount/4)*diffTolerance*255);
+
+                        if (!bitmapResult)
+                        {
+                            failString += "Bitmap data snapshot differed from 
the baseline. Detail:" + getUrl("Bitmap");
+                            failString += "  Bitmap compare failed by " + 
((diffCount / pixelCount) * 100) + " percent of pixels compared.";
+                        }
+                    }
+                }
+                else
+                {
+                    bitmapResult = false;
+                    failString += "Don't have any bitmap baseline for current 
case. Detail:" + getUrl("Bitmap");
+                }
+            }
+
+            if (TestData.lineSnapshot == true)
+            {
+                lineSnapshot = 
LineSnapshotUtils.takeSnapshot(TestFrame.rootElement.getTextFlow());
+                var lineDataBytes:ByteArray = new ByteArray();
+                lineSnapshot.normalize();
+                lineDataBytes.writeObject(lineSnapshot);
+                lineDataBytes.compress();
+                lineDataBytes.uncompress();
+                lineSnapshot = new XML(lineDataBytes.readObject());
+                lineSnapshot.normalize();
+
+                lineSnapshotChecksum = getChecksum(lineSnapshot);
+                // Do a compare as long as there is a baseline.
+                if (lineBaseline != null)
+                {
+                    if (lineSnapshotChecksum != lineBaselineChecksum)
+                    {
+                        lineResult = 
XMLSnapshotUtils.compareAdvanced(lineBaseline, lineSnapshot);
+                        if (!lineResult)
+                        {
+                            failString += "  , Line data snapshot differed 
from the baseline. Detail:" + getUrl("Line");
+                        }
+                    }
+                }
+                else
+                {
+                    lineResult = false;
+                    failString += " , Don't have any line baseline for current 
case. Detail:" + getUrl("Line");
+                }
+            }
+
+            if (TestData.plaintextSnapshot == true)
+            {
+                plaintextSnapshot = 
StringSnapshotUtils.takeSnapshot(TestFrame.rootElement.getTextFlow(), 
TextConverter.PLAIN_TEXT_FORMAT);
+                plaintextSnapshotChecksum = MD5.hash(plaintextSnapshot);
+                // Do a compare as long as there is a baseline.
+                if (plaintextBaseline != null)
+                {
+                    if (plaintextSnapshotChecksum != plaintextBaselineChecksum)
+                    {
+                        plaintextResult = 
StringSnapshotUtils.compare(plaintextBaseline, plaintextSnapshot);
+                        if (!plaintextResult)
+                        {
+                            failString += "  , PlainText data snapshot 
differed from the baseline. Detail:" + getUrl("PlainText");
+                        }
+                    }
+                }
+                else
+                {
+                    plaintextResult = false;
+                    failString += " , Don't have any PlainText baseline for 
current case. Detail:" + getUrl("PlainText");
+                }
+            }
+
+            if (TestData.xflSnapshot == true)
+            {
+                xflSnapshot = 
XMLSnapshotUtils.takeSnapshot(TestFrame.rootElement.getTextFlow(), 
TextConverter.TEXT_LAYOUT_FORMAT);
+                xflSnapshotChecksum = getChecksum(xflSnapshot);
+                // Do a compare as long as there is a baseline.
+                if (xflBaseline != null)
+                {
+                    if (xflSnapshotChecksum != xflBaselineChecksum)
+                    {
+                        xflResult = 
XMLSnapshotUtils.compareAdvanced(xflBaseline, xflSnapshot);
+                        if (!xflResult)
+                        {
+                            failString += "  , XFL data snapshot differed from 
the baseline. Detail:" + getUrl("XFL");
+                        }
+                    }
+                }
+                else
+                {
+                    xflResult = false;
+                    failString += " , Don't have any xfl baseline for current 
case. Detail:" + getUrl("XFL");
+                }
+            }
+
+            if (TestData.htmlSnapshot == true)
+            {
+                htmlSnapshot = 
XMLSnapshotUtils.takeSnapshot(TestFrame.rootElement.getTextFlow(), 
TextConverter.TEXT_FIELD_HTML_FORMAT);
+                htmlSnapshotChecksum = getChecksum(htmlSnapshot);
+                // Do a compare as long as there is a baseline.
+                if (htmlBaseline != null)
+                {
+                    if (htmlBaselineChecksum != htmlSnapshotChecksum)
+                    {
+                        htmlResult = 
XMLSnapshotUtils.compareAdvanced(htmlBaseline, htmlSnapshot);
+                        if (!htmlResult)
+                        {
+                            failString += "  , HTML data snapshot differed 
from the baseline. Detail:" + getUrl("HTML");
+                        }
+                    }
+                }
+                else
+                {
+                    htmlResult = false;
+                    failString += " , Don't have any HTML baseline for current 
case. Detail:" + getUrl("HTML");
+                }
+            }
+
+            // Comment this code in to enable bounds checking on each test.
+            /* if (TestFrame && TestFrame.textFlow)
+             {
+             var s:Sprite = new Sprite();
+             testApp.getDisplayObject().rawChildren.addChild(s);
+             BoundsChecker.boundsValidation(TestFrame.textFlow, s);
+             testApp.getDisplayObject().rawChildren.removeChild(s);
+             } */
+
+
+            // trace ("Ending test: " + TestID);
+
+            //*****************************************************
+            if (SelManager)
+            {
+                //turn caret blinking back on
+                setCaretBlinkRate(1000);
+            }
+            // Nulls for garbage collection
+            TestFrame = null;
+            SelManager = null;
+            //         trace ("End of teardown.");
+
+
+            // This code breaks snapshotting of XML - need to move the 
disposeXML calls somewhere else
+            /*if (Configuration.playerEnablesArgoFeatures)
+             System["disposeXML"](lineSnapshot);
+             lineSnapshot = null;
+             plaintextSnapshot = null;
+             if (Configuration.playerEnablesArgoFeatures)
+             System["disposeXML"](xflSnapshot);
+             xflSnapshot = null;
+             if (Configuration.playerEnablesArgoFeatures)
+             System["disposeXML"](htmlSnapshot);
+             htmlSnapshot = null;*/
+
+
+            // The assert makes it end the test, so we need to put that at the 
very
+            // end of everything, so that all snapshot tests get a chance to 
run.
+            assertTrue(failString, ((TCMCompositionResult) && (bitmapResult) 
&& (lineResult) && (xflResult) && (htmlResult)));
 //                             fail(failString);
-               }
-
-               private function getUrl(snapShotType:String):String
-               {
-                       return 
snapAdminServerUrl+"runid="+runID+";caseid="+TestID+";snapshottype="+snapShotType;
-               }
-
-               private function getChecksum(file:XML):String
-               {
-                       var dataBytes:ByteArray = new ByteArray();
-                       dataBytes.writeObject (file);
-                       dataBytes.compress();
-                       dataBytes.position = 0;
-
-                       return MD5.hashBinary(dataBytes);
-               }
-
-               override public function toString():String
-               {
-                       return TestID;
-               }
-
-               private function getRandomInteger(start:int, end:int):int
-                       // Return a random number between start and end
-               {
-                       var num:Number = Math.random();
-                       return Math.ceil((num * (end - start)) + start);
-               }
-
-               private function setSelectionRange():void
-               {
-                       if (useRandom)
-                       {
-                               var startIdx:int = getRandomInteger(0, 
SelManager.textFlow.textLength);
-                               var endIdx:int = getRandomInteger(0, 
SelManager.textFlow.textLength);
-                               if (startIdx > endIdx)
-                               {
-                                       var tmp:int = startIdx;
-                                       startIdx = endIdx;
-                                       endIdx = tmp;
-                               }
-                               SelManager.selectRange(startIdx, endIdx);
-                       }
-                       else
-                       {
-                               if(SelManager.textFlow.textLength > 60){
-                                       SelManager.selectRange(22, 60);
-                               }else{
-                                       SelManager.selectRange(0, 
SelManager.textFlow.textLength / 2);
-                               }
-                       }
-               }
-
-               public function setCaretBlinkRate (caretBlinkRate:int):void
-               {
-                       var fFormat:SelectionFormat = 
SelManager.focusedSelectionFormat;
-                       var nfFormat:SelectionFormat = 
SelManager.unfocusedSelectionFormat;
-                       var inFormat:SelectionFormat = 
SelManager.inactiveSelectionFormat;
-                       SelManager.focusedSelectionFormat = new 
SelectionFormat(fFormat.rangeColor, fFormat.rangeAlpha, fFormat.rangeBlendMode, 
fFormat.pointColor, fFormat.pointAlpha, fFormat.pointBlendMode, caretBlinkRate);
-                       SelManager.unfocusedSelectionFormat = new 
SelectionFormat(nfFormat.rangeColor, nfFormat.rangeAlpha, 
nfFormat.rangeBlendMode, nfFormat.pointColor, nfFormat.pointAlpha, 
nfFormat.pointBlendMode, caretBlinkRate);
-                       SelManager.inactiveSelectionFormat = new 
SelectionFormat(inFormat.rangeColor, inFormat.rangeAlpha, 
inFormat.rangeBlendMode, inFormat.pointColor, inFormat.pointAlpha, 
inFormat.pointBlendMode, caretBlinkRate);
-               }
-
-               protected function get importParser():ITextImporter
-               {
-                       var extension:String = getExtension(fileName);
-                       if (extension == "xml")
-                               extension = TextConverter.TEXT_LAYOUT_FORMAT;
-                       else if (extension == "txt")
-                               extension = TextConverter.PLAIN_TEXT_FORMAT;
-                       else if (extension == "html")
-                               extension = 
TextConverter.TEXT_FIELD_HTML_FORMAT;
-                       return TextConverter.getImporter(extension);
-               }
-
-               public static function getExtension(fileName:String):String
-               {
-                       var dotPos:int = fileName.lastIndexOf(".");
-                       if (dotPos >= 0)
-                               return fileName.substring(dotPos + 1);
-                       return fileName;
-               }
-
-               public function importContent (content:Object):void
-               {
-                       var beginTime:int = getTimer();
-                       //TestFrame.removeAllChildren();
-                       var parser:ITextImporter = importParser;
-                       var textFlow:TextFlow = parser.importToFlow(content);
-
-                       setUpFlowForTest(textFlow);
-               }
-
-               public function setUpFlowForTest(textFlow:TextFlow):void
-               {
-                       textFlow.flowComposer = null;
-                       testApp.contentChange (textFlow);
-
-                       TestFrame = 
TextFlow(testApp.getTextFlow()).flowComposer.getControllerAt(0);
-                       if (TestFrame.rootElement)
-                       {
-                               SelManager = 
EditManager(TestFrame.rootElement.getTextFlow().interactionManager);
-                               if(SelManager) setSelectionRange();
-                       }
-
-                       if (textFlow.flowComposer)
-                               textFlow.flowComposer.compose();
-               }
-
-
-               public function getFileData(fileName:String):Object
-               {
-                       var fileData:Object; // XML or String
-
-                       var extension:String = getExtension(fileName);
-                       if (extension == "html")
-                               fileData = FileRepository.getFile(baseURL, 
"../../test/testFiles/markup/html/" + fileName);
-                       else if (extension == "txt")
-                               fileData = FileRepository.getFile(baseURL, 
"../../test/testFiles/markup/plainText/" + fileName);
-                       else
-                               fileData = FileRepository.getFileAsXML(baseURL, 
"../../test/testFiles/markup/tlf/" + fileName);
-                       return fileData;
-               }
-
-               static private var cacheTestFile:TextFlow;
-               public function loadTestFile (fileName:String):void
-               {
-                       var containerFormat:TextLayoutFormat;
-
-                       if (fileName == defaultFileName && cacheTestFile != 
null)
-                       {
-                               var textFlow:TextFlow = 
cacheTestFile.deepCopy(0, cacheTestFile.textLength) as TextFlow;
-                               setUpFlowForTest(textFlow);
-                       }
-                       else
-                       {
-                               var fileData:Object = getFileData(fileName); // 
XML or String
-                               if (fileData is XML)
-                               {
-                                       var flowNS:Namespace = 
fileData.namespace("flow");
-                                       if (writingDirection[0] != "tb" && 
writingDirection[1] != "ltr")
-                                       {
-                                               
fileData.flowNS::TextFlow.@blockProgression = writingDirection[0];
-                                               
fileData.flowNS::TextFlow.@direction = writingDirection[1];
-                                       }
-                                       if (useEmbeddedFonts)
-                                       {
-                                               
fileData.flowNS::TextFlow.@fontLookup = "embeddedCff";
-                                       }
-                               }
-                               importContent(fileData);
-                       }
-
-                       if (!cacheTestFile && fileName == defaultFileName)
-                       {
-                               var resultFlow:TextFlow = TestFrame.rootElement 
as TextFlow;
-                               cacheTestFile = resultFlow.deepCopy() as 
TextFlow;
-                       }
-               }
-       }
+        }
+
+        private function getUrl(snapShotType:String):String
+        {
+            return snapAdminServerUrl + "runid=" + runID + ";caseid=" + TestID 
+ ";snapshottype=" + snapShotType;
+        }
+
+        private function getChecksum(file:XML):String
+        {
+            var dataBytes:ByteArray = new ByteArray();
+            dataBytes.writeObject(file);
+            dataBytes.compress();
+            dataBytes.position = 0;
+
+            return MD5.hashBinary(dataBytes);
+        }
+
+        override public function toString():String
+        {
+            return TestID;
+        }
+
+        private function getRandomInteger(start:int, end:int):int
+            // Return a random number between start and end
+        {
+            var num:Number = Math.random();
+            return Math.ceil((num * (end - start)) + start);
+        }
+
+        private function setSelectionRange():void
+        {
+            if (useRandom)
+            {
+                var startIdx:int = getRandomInteger(0, 
SelManager.textFlow.textLength);
+                var endIdx:int = getRandomInteger(0, 
SelManager.textFlow.textLength);
+                if (startIdx > endIdx)
+                {
+                    var tmp:int = startIdx;
+                    startIdx = endIdx;
+                    endIdx = tmp;
+                }
+                SelManager.selectRange(startIdx, endIdx);
+            }
+            else
+            {
+                if (SelManager.textFlow.textLength > 60)
+                {
+                    SelManager.selectRange(22, 60);
+                }
+                else
+                {
+                    SelManager.selectRange(0, SelManager.textFlow.textLength / 
2);
+                }
+            }
+        }
+
+        public function setCaretBlinkRate(caretBlinkRate:int):void
+        {
+            var fFormat:SelectionFormat = SelManager.focusedSelectionFormat;
+            var nfFormat:SelectionFormat = SelManager.unfocusedSelectionFormat;
+            var inFormat:SelectionFormat = SelManager.inactiveSelectionFormat;
+            SelManager.focusedSelectionFormat = new 
SelectionFormat(fFormat.rangeColor, fFormat.rangeAlpha, fFormat.rangeBlendMode, 
fFormat.pointColor, fFormat.pointAlpha, fFormat.pointBlendMode, caretBlinkRate);
+            SelManager.unfocusedSelectionFormat = new 
SelectionFormat(nfFormat.rangeColor, nfFormat.rangeAlpha, 
nfFormat.rangeBlendMode, nfFormat.pointColor, nfFormat.pointAlpha, 
nfFormat.pointBlendMode, caretBlinkRate);
+            SelManager.inactiveSelectionFormat = new 
SelectionFormat(inFormat.rangeColor, inFormat.rangeAlpha, 
inFormat.rangeBlendMode, inFormat.pointColor, inFormat.pointAlpha, 
inFormat.pointBlendMode, caretBlinkRate);
+        }
+
+        protected function get importParser():ITextImporter
+        {
+            var extension:String = getExtension(fileName);
+            if (extension == "xml")
+                extension = TextConverter.TEXT_LAYOUT_FORMAT;
+            else if (extension == "txt")
+                extension = TextConverter.PLAIN_TEXT_FORMAT;
+            else if (extension == "html")
+                extension = TextConverter.TEXT_FIELD_HTML_FORMAT;
+            return TextConverter.getImporter(extension);
+        }
+
+        public static function getExtension(fileName:String):String
+        {
+            var dotPos:int = fileName.lastIndexOf(".");
+            if (dotPos >= 0)
+                return fileName.substring(dotPos + 1);
+            return fileName;
+        }
+
+        public function importContent(content:Object):void
+        {
+            var beginTime:int = getTimer();
+            //TestFrame.removeAllChildren();
+            var parser:ITextImporter = importParser;
+            var textFlow:TextFlow = parser.importToFlow(content);
+
+            setUpFlowForTest(textFlow);
+        }
+
+        public function setUpFlowForTest(textFlow:TextFlow):void
+        {
+            textFlow.flowComposer = null;
+            testApp.contentChange(textFlow);
+
+            TestFrame = 
TextFlow(testApp.getTextFlow()).flowComposer.getControllerAt(0);
+            if (TestFrame.rootElement)
+            {
+                SelManager = 
EditManager(TestFrame.rootElement.getTextFlow().interactionManager);
+                if (SelManager) setSelectionRange();
+            }
+
+            if (textFlow.flowComposer)
+                textFlow.flowComposer.compose();
+        }
+
+
+        public function getFileData(fileName:String):Object
+        {
+            var fileData:Object; // XML or String
+
+            var extension:String = getExtension(fileName);
+            if (extension == "html")
+                fileData = FileRepository.getFile(baseURL, 
"../../test/testFiles/markup/html/" + fileName);
+            else if (extension == "txt")
+                fileData = FileRepository.getFile(baseURL, 
"../../test/testFiles/markup/plainText/" + fileName);
+            else
+                fileData = FileRepository.getFileAsXML(baseURL, 
"../../test/testFiles/markup/tlf/" + fileName);
+            return fileData;
+        }
+
+        static private var cacheTestFile:TextFlow;
+
+        public function loadTestFile(fileName:String):void
+        {
+            var containerFormat:TextLayoutFormat;
+
+            if (fileName == defaultFileName && cacheTestFile != null)
+            {
+                var textFlow:TextFlow = cacheTestFile.deepCopy(0, 
cacheTestFile.textLength) as TextFlow;
+                setUpFlowForTest(textFlow);
+            }
+            else
+            {
+                var fileData:Object = getFileData(fileName); // XML or String
+                if (fileData is XML)
+                {
+                    var flowNS:Namespace = fileData.namespace("flow");
+                    if (writingDirection[0] != "tb" && writingDirection[1] != 
"ltr")
+                    {
+                        fileData.flowNS::TextFlow.@blockProgression = 
writingDirection[0];
+                        fileData.flowNS::TextFlow.@direction = 
writingDirection[1];
+                    }
+                    if (useEmbeddedFonts)
+                    {
+                        fileData.flowNS::TextFlow.@fontLookup = "embeddedCff";
+                    }
+                }
+                importContent(fileData);
+            }
+
+            if (!cacheTestFile && fileName == defaultFileName)
+            {
+                var resultFlow:TextFlow = TestFrame.rootElement as TextFlow;
+                cacheTestFile = resultFlow.deepCopy() as TextFlow;
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Fixtures/FileRepository.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Fixtures/FileRepository.as 
b/automation_core/src/UnitTest/Fixtures/FileRepository.as
index 937603c..55830f4 100644
--- a/automation_core/src/UnitTest/Fixtures/FileRepository.as
+++ b/automation_core/src/UnitTest/Fixtures/FileRepository.as
@@ -102,7 +102,9 @@ package UnitTest.Fixtures
        import flash.events.IOErrorEvent;
        import flashx.textLayout.debug.assert;
 
-       /** Serves as a single bottleneck for all requests that go through
+import org.flexunit.asserts.assertEquals;
+
+/** Serves as a single bottleneck for all requests that go through
         * FileRepository. Requests come in as URLLoader.load calls, and we
         * always listen for completion, error, and security error. If a handler
         * for any of these is passed in when the CustomURLLoader is 
constructed,
@@ -178,7 +180,8 @@ package UnitTest.Fixtures
                 * and the file contents as a string. */
                static private function addToCache(urlLoader:CustomURLLoader, 
data:String):void
                {
-                       CONFIG::debug { 
assert(_fileCache[getFileKey(urlLoader)] == null, "Adding over existing cache 
entry!"); }
+
+                       //CONFIG::debug { 
assertEquals(_fileCache[getFileKey(urlLoader)] == null, "Adding over existing 
cache entry!"); }
                        _fileCache[getFileKey(urlLoader)] = data;
                }
 
@@ -247,7 +250,7 @@ package UnitTest.Fixtures
                        // If we have already read this file in, or we are 
already in the middle of reading it in, don't make another request
                        if (_fileCache.hasOwnProperty(getFileKey(this)))
                        {
-                               CONFIG::debug { assert (completeHandler == 
null, "Load has file cached, won't be calling completeHandler! You should call 
get() before calling readFile()"); }
+                               //CONFIG::debug { assert (completeHandler == 
null, "Load has file cached, won't be calling completeHandler! You should call 
get() before calling readFile()"); }
                                return;
                        }
 

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Fixtures/TestConfig.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Fixtures/TestConfig.as 
b/automation_core/src/UnitTest/Fixtures/TestConfig.as
index 1a25299..69e7574 100644
--- a/automation_core/src/UnitTest/Fixtures/TestConfig.as
+++ b/automation_core/src/UnitTest/Fixtures/TestConfig.as
@@ -24,20 +24,37 @@ package UnitTest.Fixtures
 
        public class TestConfig
        {
+        private static var _instance:TestConfig;
+
                public var writingDirection:Array = [ BlockProgression.TB, 
Direction.LTR ] ;
                public var containerType:String = "flex";
                public var doBeforeAfterCompare:Boolean = false;
                public var useEmbeddedFonts:Boolean = false;
                public var baseURL:String = "";
                public var flashVersion:String = 
Capabilities.version.substr(4,4);
+        public var testXMLStore:XML;
 
-               public function TestConfig()
+               public function 
TestConfig(testConfigEnforcer:TestConfigEnforcer)
                {
+            if (testConfigEnforcer == null)
+            {
+                throw  new Error("Call getInstant()!");
+            }
                }
 
+        public static function getInstance():TestConfig
+        {
+            if (_instance == null)
+            {
+                _instance = new TestConfig(new TestConfigEnforcer());
+            }
+
+            return _instance;
+        }
+
                public function copyTestConfig():TestConfig
                {
-                       var newConfig:TestConfig = new TestConfig();
+                       var newConfig:TestConfig = new TestConfig(new 
TestConfigEnforcer());
                        newConfig.writingDirection = writingDirection;
                        newConfig.containerType = containerType;
                        newConfig.doBeforeAfterCompare = doBeforeAfterCompare;
@@ -49,3 +66,5 @@ package UnitTest.Fixtures
 
        }
 }
+
+class TestConfigEnforcer{}

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/BoundsChecker.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/BoundsChecker.as 
b/automation_core/src/UnitTest/Validation/BoundsChecker.as
index 6515a04..e77cc3c 100644
--- a/automation_core/src/UnitTest/Validation/BoundsChecker.as
+++ b/automation_core/src/UnitTest/Validation/BoundsChecker.as
@@ -18,46 +18,30 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.display.DisplayObject;
-       import flash.display.DisplayObjectContainer;
-       import flash.display.Graphics;
-       import flash.display.Sprite;
-       import flash.events.Event;
-       import flash.events.EventDispatcher;
-       import flash.events.IEventDispatcher;
-       import flash.geom.Rectangle;
-       import flash.system.*;
-       import flash.text.engine.TextLine;
-       import flash.text.engine.TextRotation;
-       
-       import flashx.textLayout.compose.StandardFlowComposer;
-       import flashx.textLayout.container.ContainerController;
-       import flashx.textLayout.container.ScrollPolicy;
-       import flashx.textLayout.conversion.ConversionType;
-       import flashx.textLayout.conversion.TextConverter;
-       import flashx.textLayout.edit.EditManager;
-       import flashx.textLayout.edit.IEditManager;
-       import flashx.textLayout.elements.FlowLeafElement;
-       import flashx.textLayout.elements.InlineGraphicElement;
-       import flashx.textLayout.elements.InlineGraphicElementStatus;
-       import flashx.textLayout.elements.TextFlow;
-       import flashx.textLayout.events.StatusChangeEvent;
-       import flashx.textLayout.factory.StringTextLineFactory;
-       import flashx.textLayout.factory.TextFlowTextLineFactory;
-       import flashx.textLayout.formats.BlockProgression;
-       import flashx.textLayout.formats.Direction;
-       import flashx.textLayout.formats.Float;
-       import flashx.textLayout.formats.ITextLayoutFormat;
-       import flashx.textLayout.formats.TextAlign;
-       import flashx.textLayout.formats.TextLayoutFormat;
-       import flashx.textLayout.formats.VerticalAlign;
-       import flashx.textLayout.tlf_internal;
-       
-       import flexunit.framework.Assert;
-       
-       import mx.core.UIComponent;
+    import flash.display.DisplayObject;
+    import flash.display.Sprite;
+    import flash.geom.Rectangle;
+    import flash.text.engine.TextRotation;
 
-       use namespace tlf_internal;
+    import flashx.textLayout.compose.StandardFlowComposer;
+    import flashx.textLayout.container.ContainerController;
+    import flashx.textLayout.container.ScrollPolicy;
+    import flashx.textLayout.elements.FlowLeafElement;
+    import flashx.textLayout.elements.InlineGraphicElement;
+    import flashx.textLayout.elements.TextFlow;
+    import flashx.textLayout.factory.TextFlowTextLineFactory;
+    import flashx.textLayout.formats.BlockProgression;
+    import flashx.textLayout.formats.Direction;
+    import flashx.textLayout.formats.Float;
+    import flashx.textLayout.formats.ITextLayoutFormat;
+    import flashx.textLayout.formats.TextAlign;
+    import flashx.textLayout.formats.TextLayoutFormat;
+    import flashx.textLayout.formats.VerticalAlign;
+    import flashx.textLayout.tlf_internal;
+
+    import flexunit.framework.Assert;
+
+    use namespace tlf_internal;
 
        /** Check a sample text composition result to make sure:
         * (1) The text falls in the correct area of the container, given the 
vertical and horizontal alignment values applied to the TextFlow;

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/CompositionCompleteEventValidator.as
----------------------------------------------------------------------
diff --git 
a/automation_core/src/UnitTest/Validation/CompositionCompleteEventValidator.as 
b/automation_core/src/UnitTest/Validation/CompositionCompleteEventValidator.as
index 5c39be5..c5d65e5 100644
--- 
a/automation_core/src/UnitTest/Validation/CompositionCompleteEventValidator.as
+++ 
b/automation_core/src/UnitTest/Validation/CompositionCompleteEventValidator.as
@@ -18,12 +18,12 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.events.Event;
-       import flash.events.IEventDispatcher;
-       import flashx.textLayout.debug.assert;
-       import flashx.textLayout.events.CompositionCompleteEvent;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
 
-       public class CompositionCompleteEventValidator extends EventValidator
+    import flashx.textLayout.events.CompositionCompleteEvent;
+
+    public class CompositionCompleteEventValidator extends EventValidator
        {
                public function 
CompositionCompleteEventValidator(target:IEventDispatcher, expectedEvent:Event)
                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/CompositionResults.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/CompositionResults.as 
b/automation_core/src/UnitTest/Validation/CompositionResults.as
index 2a37e63..1b446bd 100644
--- a/automation_core/src/UnitTest/Validation/CompositionResults.as
+++ b/automation_core/src/UnitTest/Validation/CompositionResults.as
@@ -18,18 +18,16 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.display.DisplayObject;
-       import flash.display.Sprite;
-       import flash.text.engine.TextLine;
-       
-       import flashx.textLayout.compose.IFlowComposer;
-       import flashx.textLayout.compose.TextFlowLine;
-       import flashx.textLayout.debug.assert;
-       import flashx.textLayout.elements.TextFlow;
-       
-       import flexunit.framework.Assert;
-       
-       public class CompositionResults
+    import flash.display.Sprite;
+    import flash.text.engine.TextLine;
+
+    import flashx.textLayout.compose.IFlowComposer;
+    import flashx.textLayout.compose.TextFlowLine;
+    import flashx.textLayout.elements.TextFlow;
+
+    import flexunit.framework.Assert;
+
+    public class CompositionResults
        {
                static public function 
getContainerResults(container:Sprite):Array
                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/DamageEventValidator.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/DamageEventValidator.as 
b/automation_core/src/UnitTest/Validation/DamageEventValidator.as
index a75422b..cae42cf 100644
--- a/automation_core/src/UnitTest/Validation/DamageEventValidator.as
+++ b/automation_core/src/UnitTest/Validation/DamageEventValidator.as
@@ -18,12 +18,12 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.events.Event;
-       import flash.events.IEventDispatcher;
-       import flashx.textLayout.debug.assert;
-       import flashx.textLayout.events.DamageEvent;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
 
-       public class DamageEventValidator extends EventValidator
+    import flashx.textLayout.events.DamageEvent;
+
+    public class DamageEventValidator extends EventValidator
        {
                public function DamageEventValidator(target:IEventDispatcher, 
expectedEvent:Event)
                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/EventValidator.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/EventValidator.as 
b/automation_core/src/UnitTest/Validation/EventValidator.as
index db4a206..ff98ce0 100644
--- a/automation_core/src/UnitTest/Validation/EventValidator.as
+++ b/automation_core/src/UnitTest/Validation/EventValidator.as
@@ -18,60 +18,61 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.events.Event;
-       import flash.events.IEventDispatcher;
-       import flashx.textLayout.debug.assert;
-       import flexunit.framework.Assert;
 
-       public class EventValidator
-       {
-               private var _eventCount:int;
-               private var _expectedEvent:Event;
-               private var _target:IEventDispatcher;
-               private var _attachCount:int;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
 
-               public var lastEvent:Event;
-               
-               public function EventValidator(target:IEventDispatcher, 
expectedEvent:Event)
-               {
-                       _target = target;
-                       _attachCount = 0;
-                       reset(expectedEvent);
-               }
+    import flexunit.framework.Assert;
 
-               protected function validateHandler(event:Event):void
-               {
-                       if (event.type == _expectedEvent.type && 
eventsAreEqual(event, _expectedEvent))
-                       {
-                               lastEvent = event;
-                               ++_eventCount;
-                       }
-               }
+    public class EventValidator
+    {
+        private var _eventCount:int;
+        private var _expectedEvent:Event;
+        private var _target:IEventDispatcher;
+        private var _attachCount:int;
 
-               protected function eventsAreEqual(event:Event, 
expectedEvent:Event):Boolean
-               {
-                       return true; // override in derived class
-               }
+        public var lastEvent:Event;
 
-               public function validate(count:int):Boolean
-               {
-                       var result:Boolean = _eventCount == count;
-                       _eventCount = 0;
-                       _target.removeEventListener(_expectedEvent.type, 
validateHandler);
-                       --_attachCount;
-                       Assert.assertTrue("Expected to get an event, but 
didn't", result);
-                       return result;
-               }
-               
-               public function reset(expectedEvent:Event = null):void
-               {
-                       CONFIG::debug { assert (_attachCount == 0, "Expected 
previous call to validate"); }
-                       if (expectedEvent != null)
-                               _expectedEvent = expectedEvent;
-                       _eventCount = 0;
-                       lastEvent = null;
-                       _target.addEventListener(_expectedEvent.type, 
validateHandler);
-                       ++_attachCount;
-               }
-       }
+        public function EventValidator(target:IEventDispatcher, 
expectedEvent:Event)
+        {
+            _target = target;
+            _attachCount = 0;
+            reset(expectedEvent);
+        }
+
+        protected function validateHandler(event:Event):void
+        {
+            if (event.type == _expectedEvent.type && eventsAreEqual(event, 
_expectedEvent))
+            {
+                lastEvent = event;
+                ++_eventCount;
+            }
+        }
+
+        protected function eventsAreEqual(event:Event, 
expectedEvent:Event):Boolean
+        {
+            return true; // override in derived class
+        }
+
+        public function validate(count:int):Boolean
+        {
+            var result:Boolean = _eventCount == count;
+            _eventCount = 0;
+            _target.removeEventListener(_expectedEvent.type, validateHandler);
+            --_attachCount;
+            Assert.assertTrue("Expected to get an event, but didn't", result);
+            return result;
+        }
+
+        public function reset(expectedEvent:Event = null):void
+        {
+            //CONFIG::debug { assert (_attachCount == 0, "Expected previous 
call to validate"); }
+            if (expectedEvent != null)
+                _expectedEvent = expectedEvent;
+            _eventCount = 0;
+            lastEvent = null;
+            _target.addEventListener(_expectedEvent.type, validateHandler);
+            ++_attachCount;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/FlowElementMouseEventValidator.as
----------------------------------------------------------------------
diff --git 
a/automation_core/src/UnitTest/Validation/FlowElementMouseEventValidator.as 
b/automation_core/src/UnitTest/Validation/FlowElementMouseEventValidator.as
index f94a4c4..40519f7 100644
--- a/automation_core/src/UnitTest/Validation/FlowElementMouseEventValidator.as
+++ b/automation_core/src/UnitTest/Validation/FlowElementMouseEventValidator.as
@@ -18,15 +18,13 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.events.Event;
-       import flash.events.IEventDispatcher;
-       import flash.events.MouseEvent;
-       import flashx.textLayout.debug.assert;
-       import flashx.textLayout.elements.FlowElement;
-       import flashx.textLayout.events.FlowElementMouseEvent;
-       import flashx.textLayout.elements.LinkElement;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
+    import flash.events.MouseEvent;
 
-       public class FlowElementMouseEventValidator extends EventValidator
+    import flashx.textLayout.events.FlowElementMouseEvent;
+
+    public class FlowElementMouseEventValidator extends EventValidator
        {
                public function 
FlowElementMouseEventValidator(target:IEventDispatcher, expectedEvent:Event)
                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/FlowOperationEventValidator.as
----------------------------------------------------------------------
diff --git 
a/automation_core/src/UnitTest/Validation/FlowOperationEventValidator.as 
b/automation_core/src/UnitTest/Validation/FlowOperationEventValidator.as
index ff0a4a3..8b5f336 100644
--- a/automation_core/src/UnitTest/Validation/FlowOperationEventValidator.as
+++ b/automation_core/src/UnitTest/Validation/FlowOperationEventValidator.as
@@ -18,12 +18,12 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.events.Event;
-       import flash.events.IEventDispatcher;
-       import flashx.textLayout.debug.assert;
-       import flashx.textLayout.events.FlowOperationEvent;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
 
-       public class FlowOperationEventValidator extends EventValidator
+    import flashx.textLayout.events.FlowOperationEvent;
+
+    public class FlowOperationEventValidator extends EventValidator
        {
                public function 
FlowOperationEventValidator(target:IEventDispatcher, expectedEvent:Event)
                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/IntUtil.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/IntUtil.as 
b/automation_core/src/UnitTest/Validation/IntUtil.as
index 68be08b..21a1ff3 100644
--- a/automation_core/src/UnitTest/Validation/IntUtil.as
+++ b/automation_core/src/UnitTest/Validation/IntUtil.as
@@ -18,9 +18,7 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation {
 
-       import flash.utils.Endian;
-
-       /**
+    /**
         * Contains reusable methods for operations pertaining
         * to int values.
         */

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/LineSnapshot.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/LineSnapshot.as 
b/automation_core/src/UnitTest/Validation/LineSnapshot.as
index 0f847e5..9b1ea4e 100644
--- a/automation_core/src/UnitTest/Validation/LineSnapshot.as
+++ b/automation_core/src/UnitTest/Validation/LineSnapshot.as
@@ -18,10 +18,9 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flashx.textLayout.elements.TextFlow;
-       import flashx.textLayout.compose.IFlowComposer;
+    import flashx.textLayout.elements.TextFlow;
 
-       public class LineSnapshot
+    public class LineSnapshot
        {
                /* abandoned in favor of the code already in VellumUnit
                 * main entry point -
@@ -49,7 +48,7 @@ package UnitTest.Validation
                        {
                                try
                                {
-                                       CONFIG::debug { newSnapshot = 
newSnapshot.appendChild(aFlow.flowComposer.getLineAt(i).dumpToXML()); }
+                                       //CONFIG::debug { newSnapshot = 
newSnapshot.appendChild(aFlow.flowComposer.getLineAt(i).dumpToXML()); }
                                }
                                catch (m:Error)
                                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/MD5.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/MD5.as 
b/automation_core/src/UnitTest/Validation/MD5.as
index db6e700..3e831ea 100644
--- a/automation_core/src/UnitTest/Validation/MD5.as
+++ b/automation_core/src/UnitTest/Validation/MD5.as
@@ -18,9 +18,9 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation {
 
-       import UnitTest.Validation.IntUtil;
-       import flash.utils.ByteArray;
-       /**
+    import flash.utils.ByteArray;
+
+    /**
         * The MD5 Message-Digest Algorithm
         *
         * Implementation based on algorithm description at

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/SelectionEventValidator.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/SelectionEventValidator.as 
b/automation_core/src/UnitTest/Validation/SelectionEventValidator.as
index 94f566b..e50694f 100644
--- a/automation_core/src/UnitTest/Validation/SelectionEventValidator.as
+++ b/automation_core/src/UnitTest/Validation/SelectionEventValidator.as
@@ -18,13 +18,13 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.events.Event;
-       import flash.events.IEventDispatcher;
-       import flashx.textLayout.debug.assert;
-       import flashx.textLayout.edit.SelectionState;
-       import flashx.textLayout.events.SelectionEvent;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
 
-       public class SelectionEventValidator extends EventValidator
+    import flashx.textLayout.edit.SelectionState;
+    import flashx.textLayout.events.SelectionEvent;
+
+    public class SelectionEventValidator extends EventValidator
        {
                public function 
SelectionEventValidator(target:IEventDispatcher, expectedEvent:Event)
                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/StatusChangeEventValidator.as
----------------------------------------------------------------------
diff --git 
a/automation_core/src/UnitTest/Validation/StatusChangeEventValidator.as 
b/automation_core/src/UnitTest/Validation/StatusChangeEventValidator.as
index ca64fcd..6e2f6a5 100644
--- a/automation_core/src/UnitTest/Validation/StatusChangeEventValidator.as
+++ b/automation_core/src/UnitTest/Validation/StatusChangeEventValidator.as
@@ -18,12 +18,12 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.events.Event;
-       import flash.events.IEventDispatcher;
-       import flashx.textLayout.debug.assert;
-       import flashx.textLayout.events.StatusChangeEvent;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
 
-       public class StatusChangeEventValidator extends EventValidator
+    import flashx.textLayout.events.StatusChangeEvent;
+
+    public class StatusChangeEventValidator extends EventValidator
        {
                public function 
StatusChangeEventValidator(target:IEventDispatcher, expectedEvent:Event)
                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/StringSnapshot.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/StringSnapshot.as 
b/automation_core/src/UnitTest/Validation/StringSnapshot.as
index 80aba13..ae1b683 100644
--- a/automation_core/src/UnitTest/Validation/StringSnapshot.as
+++ b/automation_core/src/UnitTest/Validation/StringSnapshot.as
@@ -18,12 +18,12 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flashx.textLayout.conversion.ConversionType;
-       import flashx.textLayout.conversion.ITextExporter;
-       import flashx.textLayout.conversion.TextConverter;
-       import flashx.textLayout.elements.TextFlow;
+    import flashx.textLayout.conversion.ConversionType;
+    import flashx.textLayout.conversion.ITextExporter;
+    import flashx.textLayout.conversion.TextConverter;
+    import flashx.textLayout.elements.TextFlow;
 
-       public class StringSnapshot
+    public class StringSnapshot
        {
                /**
                 * return PlainText data from the TextFlow in String

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/TCMComposition.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/TCMComposition.as 
b/automation_core/src/UnitTest/Validation/TCMComposition.as
index 414a63a..093f4d7 100644
--- a/automation_core/src/UnitTest/Validation/TCMComposition.as
+++ b/automation_core/src/UnitTest/Validation/TCMComposition.as
@@ -18,32 +18,25 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.display.Bitmap;
-       import flash.display.BitmapData;
-       import flash.display.DisplayObjectContainer;
-       import flash.display.Sprite;
-       import flash.geom.Rectangle;
-       import flash.utils.ByteArray;
+    import flash.display.Bitmap;
+    import flash.display.BitmapData;
+    import flash.display.DisplayObjectContainer;
+    import flash.display.Sprite;
+    import flash.geom.Rectangle;
+    import flash.utils.ByteArray;
 
-       import flashx.textLayout.container.ScrollPolicy;
-       import flashx.textLayout.conversion.TextConverter;
-       import flashx.textLayout.edit.EditingMode;
-       import flashx.textLayout.elements.TextFlow;
-       import flashx.textLayout.tlf_internal;
+    import flashx.textLayout.container.TextContainerManager;
+    import flashx.textLayout.edit.EditingMode;
+    import flashx.textLayout.elements.TextFlow;
+    import flashx.textLayout.tlf_internal;
 
-       use namespace tlf_internal;
+    import mx.containers.Canvas;
+    import mx.skins.Border;
 
-       import flexunit.framework.TestCase;
+    use namespace tlf_internal;
 
-       import mx.containers.Canvas;
-       import mx.core.UIComponent;
-       import mx.skins.Border;
-       import mx.utils.LoaderUtil;
 
-       import flashx.textLayout.container.TextContainerManager;
-       import flashx.textLayout.factory.TextFlowTextLineFactory;
-
-       public class TCMComposition
+    public class TCMComposition
        {
                private var ItemsToRemove:Array;
                private var testCanvas:Canvas = null;

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/UpdateCompleteEventValidator.as
----------------------------------------------------------------------
diff --git 
a/automation_core/src/UnitTest/Validation/UpdateCompleteEventValidator.as 
b/automation_core/src/UnitTest/Validation/UpdateCompleteEventValidator.as
index 066c922..88e1765 100644
--- a/automation_core/src/UnitTest/Validation/UpdateCompleteEventValidator.as
+++ b/automation_core/src/UnitTest/Validation/UpdateCompleteEventValidator.as
@@ -18,12 +18,12 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.events.Event;
-       import flash.events.IEventDispatcher;
-       import flashx.textLayout.debug.assert;
-       import flashx.textLayout.events.UpdateCompleteEvent;
+    import flash.events.Event;
+    import flash.events.IEventDispatcher;
 
-       public class UpdateCompleteEventValidator extends EventValidator
+    import flashx.textLayout.events.UpdateCompleteEvent;
+
+    public class UpdateCompleteEventValidator extends EventValidator
        {
                public function 
UpdateCompleteEventValidator(target:IEventDispatcher, expectedEvent:Event)
                {

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_core/src/UnitTest/Validation/XMLSnapshot.as
----------------------------------------------------------------------
diff --git a/automation_core/src/UnitTest/Validation/XMLSnapshot.as 
b/automation_core/src/UnitTest/Validation/XMLSnapshot.as
index ce3338f..8a47121 100644
--- a/automation_core/src/UnitTest/Validation/XMLSnapshot.as
+++ b/automation_core/src/UnitTest/Validation/XMLSnapshot.as
@@ -18,14 +18,14 @@
 
////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Validation
 {
-       import flash.utils.ByteArray;
-       
-       import flashx.textLayout.conversion.ConversionType;
-       import flashx.textLayout.conversion.ITextExporter;
-       import flashx.textLayout.conversion.TextConverter;
-       import flashx.textLayout.elements.TextFlow;
-
-       public class XMLSnapshot
+    import flash.utils.ByteArray;
+
+    import flashx.textLayout.conversion.ConversionType;
+    import flashx.textLayout.conversion.ITextExporter;
+    import flashx.textLayout.conversion.TextConverter;
+    import flashx.textLayout.elements.TextFlow;
+
+    public class XMLSnapshot
        {
                private var baselineXMLStack:Array = new Array();
                private var currentXMLStack:Array = new Array();

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/libs/flexunit.swc
----------------------------------------------------------------------
diff --git a/automation_tests/libs/flexunit.swc 
b/automation_tests/libs/flexunit.swc
new file mode 100644
index 0000000..0722885
Binary files /dev/null and b/automation_tests/libs/flexunit.swc differ

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/cad064e0/automation_tests/src/AllTestsSuite.as
----------------------------------------------------------------------
diff --git a/automation_tests/src/AllTestsSuite.as 
b/automation_tests/src/AllTestsSuite.as
new file mode 100644
index 0000000..ab31501
--- /dev/null
+++ b/automation_tests/src/AllTestsSuite.as
@@ -0,0 +1,45 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package
+{
+
+    import UnitTest.Tests.AccessibilityMethodsTest;
+    import UnitTest.Tests.AllEventTest;
+    import UnitTest.Tests.AttributeTest;
+    import UnitTest.Tests.BoxTest;
+    import UnitTest.Tests.ContainerTypeTest;
+    import UnitTest.Tests.FloatTest;
+    import UnitTest.Tests.OperationTest;
+    import UnitTest.Tests.ScrollingTest;
+
+    [Suite]
+    [RunWith("org.flexunit.runners.Suite")]
+    public dynamic class AllTestsSuite
+    {
+        public var accessibilityMethodsTest:AccessibilityMethodsTest;
+        public var allEventTest:AllEventTest;
+        public var attributeTest:AttributeTest;
+        public var boxTest:BoxTest;
+        public var containerTypeTest:ContainerTypeTest;
+        public var floatTest:FloatTest;
+        public var operationTest:OperationTest;
+        public var scrollingTest:ScrollingTest;
+    }
+
+}

Reply via email to