You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by pi...@apache.org on 2014/10/05 11:05:28 UTC

[17/30] git commit: [flex-tlf] [refs/heads/develop] - Migrate AllCharAttributeTest to Flex Unit 4

Migrate AllCharAttributeTest to Flex Unit 4


Project: http://git-wip-us.apache.org/repos/asf/flex-tlf/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-tlf/commit/2b0067b7
Tree: http://git-wip-us.apache.org/repos/asf/flex-tlf/tree/2b0067b7
Diff: http://git-wip-us.apache.org/repos/asf/flex-tlf/diff/2b0067b7

Branch: refs/heads/develop
Commit: 2b0067b7de49ec926def1d65711c95917d2dc89e
Parents: 98bebb2
Author: piotrz <pi...@gmail.com>
Authored: Mon May 26 23:15:38 2014 +0200
Committer: piotrz <pi...@gmail.com>
Committed: Mon May 26 23:15:38 2014 +0200

----------------------------------------------------------------------
 automation_tests/src/AllTestsSuite.as           |   3 +
 automation_tests/src/AutomationTestClasses.as   |   2 +-
 .../src/UnitTest/Tests/AllAttributeTest.as      | 691 +++++++++++--------
 .../src/UnitTest/Tests/AllCharAttributeTest.as  | 136 ++--
 4 files changed, 435 insertions(+), 397 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/2b0067b7/automation_tests/src/AllTestsSuite.as
----------------------------------------------------------------------
diff --git a/automation_tests/src/AllTestsSuite.as b/automation_tests/src/AllTestsSuite.as
index ab31501..2134fcd 100644
--- a/automation_tests/src/AllTestsSuite.as
+++ b/automation_tests/src/AllTestsSuite.as
@@ -20,6 +20,7 @@ package
 {
 
     import UnitTest.Tests.AccessibilityMethodsTest;
+    import UnitTest.Tests.AllCharAttributeTest;
     import UnitTest.Tests.AllEventTest;
     import UnitTest.Tests.AttributeTest;
     import UnitTest.Tests.BoxTest;
@@ -40,6 +41,8 @@ package
         public var floatTest:FloatTest;
         public var operationTest:OperationTest;
         public var scrollingTest:ScrollingTest;
+        public var allAttributeTest:AllCharAttributeTest;
+      //  public var allParagraphTest:AllParaAttributeTest;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/2b0067b7/automation_tests/src/AutomationTestClasses.as
----------------------------------------------------------------------
diff --git a/automation_tests/src/AutomationTestClasses.as b/automation_tests/src/AutomationTestClasses.as
index db74742..3079ccf 100644
--- a/automation_tests/src/AutomationTestClasses.as
+++ b/automation_tests/src/AutomationTestClasses.as
@@ -35,7 +35,7 @@ package
                                                             */
 		import AllTestsSuite; AllTestsSuite;
         import MinimalTestsSuite; MinimalTestsSuite;
-        import UnitTest.Tests.AccessibilityMethodsTest; AccessibilityMethodsTest;
+       // import UnitTest.Tests.AccessibilityMethodsTest; AccessibilityMethodsTest;
 		/*import UnitTest.Tests.AllAttributeTest; AllAttributeTest;
 		import UnitTest.Tests.AllCharAttributeTest; AllCharAttributeTest;
 		import UnitTest.Tests.AllContAttributeTest; AllContAttributeTest;

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/2b0067b7/automation_tests/src/UnitTest/Tests/AllAttributeTest.as
----------------------------------------------------------------------
diff --git a/automation_tests/src/UnitTest/Tests/AllAttributeTest.as b/automation_tests/src/UnitTest/Tests/AllAttributeTest.as
index 44bca88..4402025 100644
--- a/automation_tests/src/UnitTest/Tests/AllAttributeTest.as
+++ b/automation_tests/src/UnitTest/Tests/AllAttributeTest.as
@@ -18,310 +18,397 @@
 ////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Tests
 {
-	import UnitTest.ExtendedClasses.TestDescriptor;
-	import UnitTest.ExtendedClasses.TestSuiteExtended;
-	import UnitTest.ExtendedClasses.VellumTestCase;
-	import UnitTest.Fixtures.TestConfig;
-	
-	import flash.display.Sprite;
-	
-	import flashx.textLayout.debug.assert;
-	import flashx.textLayout.formats.Category;
-	import flashx.textLayout.formats.FormatValue;
-	import flashx.textLayout.formats.TextLayoutFormat;
-	import flashx.textLayout.property.*;
+    import UnitTest.ExtendedClasses.VellumTestCase;
+    import UnitTest.Fixtures.TestConfig;
+
+    import flash.display.Sprite;
+
+    import flashx.textLayout.elements.FlowLeafElement;
+    import flashx.textLayout.elements.TextFlow;
+    import flashx.textLayout.formats.Category;
+    import flashx.textLayout.formats.FormatValue;
+    import flashx.textLayout.formats.TextLayoutFormat;
+    import flashx.textLayout.property.*;
 
     import org.flexunit.asserts.assertTrue;
 
     /** Base class for All*AttributeTest */
-	public class AllAttributeTest extends VellumTestCase
-	{
-		// test specific configuration
-		protected var testProp:Property;
-		protected var testValue:*;
-		protected var expectedValue:*;
-
-		public function AllAttributeTest(methodName:String, testID:String, testConfig:TestConfig, prop:Property, testValue:*, expectedValue:*)
-		{
-			super (methodName, testID, testConfig);
-
-			// assert(testValue != null,"null?");
-			testProp = prop;
-			this.testValue = testValue;
-			this.expectedValue = expectedValue;
-
-			// Note: These must correspond to a Watson product area (case-sensitive)
-			metaData.productArea = "Text Attributes";
-		}
-
-		/* ************************************************************** */
-		/* Use Format description and Property classes to generate testcases for Format in description
-		/* ************************************************************** */
-
-		/** Build testcases for all properties in the description. Depending on the property type iterate over possible values and test. */
-		static internal function testAllProperties(ts:TestSuiteExtended, testConfig:TestConfig, description:Object, category:String, testClass:Class, methodName:String):void
-		{
-			testAllNumberPropsFromMinToMax(ts, testConfig, description, category, testClass, methodName);
-   			testAllIntPropsFromMinToMax(ts, testConfig, description, category, testClass, methodName);
-   			testAllNumberOrPercentPropsFromMinToMax(ts, testConfig, description, category, testClass, methodName);
-			testAllBooleanProps(ts, testConfig, description, category, testClass, methodName);
-			testAllEnumProps(ts, testConfig, description, category, testClass, methodName);
-			testAllSharedValues(ts, testConfig, description, category, testClass, methodName);
-		}
-
-		/**
-		 * This builds testcases for properties in description that are Number types.  For each number property
-		 * testcases are built to set the value to the below the minimum value, step from the minimum value to the maximum value
-		 * and then above the maximum value.
-		 */
-		static internal function testAllNumberPropsFromMinToMax(ts:TestSuiteExtended, testConfig:TestConfig, description:Object, category:String, testClass:Class, methodName:String):void
-		{
-			for each (var prop:Property in description)
-			{
-				var handler:NumberPropertyHandler = prop.findHandler(NumberPropertyHandler) as NumberPropertyHandler;
-				
-				if (handler && prop.category == category)
-				{
-					var minVal:Number = handler.minValue;
-					var maxVal:Number = handler.maxValue;
-					assertTrue(true, minVal < maxVal);
-					var delta:Number = (maxVal-minVal)/10;
-					var includeInMinimalTestSuite:Boolean;
-
-					for (var value:Number = minVal-delta;;)
-					{
-						var expectedValue:* = value < minVal ? undefined : (value > maxVal ? undefined : value);
-
-						// include in the minmalTest values below the range, min value, max value and values above the range
-						includeInMinimalTestSuite = (value <= minVal || value >= maxVal)
-
-						ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, value, expectedValue, includeInMinimalTestSuite) );
-
-						if (value > maxVal)
-							break;
-						value += delta;
-					}
-				}
-			}
-		}
-		/**
-		 * This builds testcases for properties in attributes in description that are Int types.  For each number property
-		 * testcases are built to set the value to the below the minimum value, step from the minimum value to the maximum value
-		 * and then above the maximum value.
-		 */
-		static internal function testAllIntPropsFromMinToMax(ts:TestSuiteExtended, testConfig:TestConfig, description:Object, category:String, testClass:Class, methodName:String):void
-		{
-			for each (var prop:Property in description)
-			{
-				if (prop.category == category)
-				{
-					var handler:IntPropertyHandler = prop.findHandler(IntPropertyHandler) as IntPropertyHandler;
-					if (handler)
-					{
-						var minVal:int = handler.minValue;
-						var maxVal:int = handler.maxValue;
-						assertTrue(true, minVal < maxVal);
-						var delta:int = (maxVal-minVal)/10;
-						var includeInMinimalTestSuite:Boolean;
-	
-						for (var value:Number = minVal-delta;;)
-						{
-							var expectedValue:* = value < minVal ? undefined : (value > maxVal ? undefined : value);
-	
-							// include in the minmalTest values below the range, min value, max value and values above the range
-							includeInMinimalTestSuite = (value <= minVal || value >= maxVal)
-	
-							ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, value, expectedValue, includeInMinimalTestSuite) );
-	
-							if (value > maxVal)
-								break;
-							value += delta;
-						}
-					}
-				}
-			}
-		}
-		/**
-		 * This builds testcases for properties in description that are NumberOrPercent types.  For each number property
-		 * testcases are built to set the value to the below the minimum value, step from the minimum value to the maximum value
-		 * and then above the maximum value.  This is done first using the min/max number values and then the min/max percent values.
-		 */
-		static internal function testAllNumberOrPercentPropsFromMinToMax(ts:TestSuiteExtended, testConfig:TestConfig, description:Object, category:String, testClass:Class, methodName:String):void
-		{
-			for each (var prop:Property in description)
-			{
-				if (prop.category == category)
-				{
-					var numberHandler:NumberPropertyHandler = prop.findHandler(NumberPropertyHandler) as NumberPropertyHandler;
-					var percentHandler:PercentPropertyHandler = prop.findHandler(PercentPropertyHandler) as PercentPropertyHandler;
-					if (numberHandler && percentHandler)
-					{
-						var minVal:Number = numberHandler.minValue;
-						var maxVal:Number = numberHandler.maxValue;
-						assertTrue(true, minVal < maxVal);
-						var delta:Number = (maxVal-minVal)/10;
-						var includeInMinimalTestSuite:Boolean;
-	
-						for (var value:Number = minVal-delta;;)
-						{
-							var expectedValue:* = value < minVal ? undefined : (value > maxVal ? undefined : value);
-	
-							// include in the minmalTest values below the range, min value, max value and values above the range
-							includeInMinimalTestSuite = (value <= minVal || value >= maxVal)
-	
-							ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, value, expectedValue, includeInMinimalTestSuite) );
-	
-							if (value > maxVal)
-								break;
-							value += delta;
-						}
-
-						// repeat with percent values
-						minVal = percentHandler.minValue;
-						maxVal = percentHandler.maxValue;
-						assertTrue(true, minVal < maxVal);
-						delta = (maxVal-minVal)/10;
-	
-						for (value = minVal-delta;;)
-						{
-							expectedValue = value < minVal ? undefined : (value > maxVal ? undefined : value.toString()+"%");
-							ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, value.toString()+"%", expectedValue, true) );
-	
-							if (value > maxVal)
-								break;
-							value += delta;
-						}
-					}
-				}
-			}
-		}
-		/**
-		 * This builds testcases for properties in attributes in description that are Boolean types.  A testcase is generated
-		 * for true and false for the value.
-		 */
-		static internal function testAllBooleanProps(ts:TestSuiteExtended, testConfig:TestConfig, description:Object, category:String, testClass:Class, methodName:String):void
-		{
-			for each (var prop:Property in description)
-			{
-				if (prop.category == category && prop.findHandler(BooleanPropertyHandler) != null)
-				{
-					ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, true, true, true) );
-					ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, false, false, true) );
-				}
-			}
-		}
-
-		/**
-		 * This builds testcases for properties in attributes in description that are Enumerated types types.  A testcase is generated
-		 * for each possible enumerated value
-		 */
-		static internal function testAllEnumProps(ts:TestSuiteExtended, testConfig:TestConfig, description:Object, category:String, testClass:Class, methodName:String):void
-		{
-			var range:Object;
-			var value:Object;
-			
-			for each (var prop:Property in description)
-			{
-				// new code
-				if (prop.category == category)
-				{
-					var handler:EnumPropertyHandler = prop.findHandler(EnumPropertyHandler) as EnumPropertyHandler;
-					if (handler)
-					{
-						range = handler.range;
-						for (value in range)
-						{
-							if ( value != FormatValue.INHERIT )
-								ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, value, value, true) );
-						}
-						ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, "foo", undefined, true) );
-					}
-					
-				}
-			}
-		}
-		/**
-		 * This builds testcases for setting all properties in description to inherit, null, undefined and an object.
-		 */
-		static internal function testAllSharedValues(ts:TestSuiteExtended, testConfig:TestConfig, description:Object, category:String, testClass:Class, methodName:String):void
-		{
-			for each (var prop:Property in description)
-			{
-				if (prop.category == category)
-				{
-					ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, FormatValue.INHERIT, FormatValue.INHERIT, true) );
-					// try an object, null and undefined
-					ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, new Sprite(), undefined, false) );
-					ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, null, undefined, false) );
-					ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, undefined, undefined, false) );
-					ts.addTestDescriptor( new TestDescriptor (testClass,"clearFormatTest", testConfig, null, prop, undefined, undefined, false));
-				}
-			}
-		}
-
-		public function clearFormatTest():void
-		{
-			SelManager.selectAll();
-
-			var applyFormat:TextLayoutFormat  = new TextLayoutFormat();
-			applyFormat[testProp.name] =  testProp.defaultValue;
-			var clearFormat:TextLayoutFormat  = new TextLayoutFormat();
-			clearFormat[testProp.name] =  FormatValue.INHERIT;
-
-			switch(testProp.category)
-			{
-				case Category.CHARACTER:
-					SelManager.applyFormat(applyFormat,null,null);
-					AllCharAttributeTest.validateCharacterPropertyOnEntireFlow(SelManager.textFlow,testProp,testProp.defaultValue);
-					SelManager.clearFormat(clearFormat,null,null);
-					AllCharAttributeTest.validateCharacterPropertyOnEntireFlow(SelManager.textFlow,testProp,undefined);
-					break;
-				case Category.PARAGRAPH:
-					SelManager.applyFormat(null,applyFormat,null);
-					AllParaAttributeTest.validateParagraphPropertyOnEntireFlow(SelManager.textFlow,testProp,testProp.defaultValue);
-					SelManager.clearFormat(null,clearFormat,null);
-					AllParaAttributeTest.validateParagraphPropertyOnEntireFlow(SelManager.textFlow,testProp,undefined);
-					break;
-				case Category.CONTAINER:
-					SelManager.applyFormat(null,null,applyFormat);
-					AllContAttributeTest.validateContainerPropertyOnEntireFlow(SelManager.textFlow,testProp,testProp.defaultValue);
-					SelManager.clearFormat(null,null,clearFormat);
-					AllContAttributeTest.validateContainerPropertyOnEntireFlow(SelManager.textFlow,testProp,undefined);
-					break;
-			}
-		}
-
-		private var errorHandlerCount:int = 0;
-		public function errorHandler(p:Property,value:Object):void
-		{
-			errorHandlerCount++;
-		}
-
-		protected function assignmentHelper(target:Object):void
-		{
-			Property.errorHandler = errorHandler;
-			errorHandlerCount = 0;
-			try {
-				target[testProp.name] = testValue;
-			}
-			catch (e:Error)
-			{
-				Property.errorHandler = Property.defaultErrorHandler;
-				assertTrue("Unexpected error in AllAttributeTest.assignmentHelper", false);
-				throw(e);
-			}
-			Property.errorHandler = Property.defaultErrorHandler;
-
-			if (expectedValue == undefined && testValue != undefined)
-			{
-				// expect an error
-				assertTrue("Error expected but no error in AllAttributeTest.assignmentHelper",errorHandlerCount == 1);
-			}
-			else
-			{
-				// no error
-				assertTrue("Error not expected but error found in AllAttributeTest.assignmentHelper",errorHandlerCount == 0);
-			}
-		}
-	}
+    public class AllAttributeTest extends VellumTestCase
+    {
+        // test specific configuration
+        protected var testProp:Property;
+        protected var testValue:*;
+        protected var expectedValue:*;
+        protected var description:Object;
+        protected var category:String;
+
+        public function AllAttributeTest(methodName:String, testID:String, testConfig:TestConfig, prop:Property, testValue:*, expectedValue:*)
+        {
+            super(methodName, testID, testConfig);
+
+            // assert(testValue != null,"null?");
+            testProp = prop;
+            this.testValue = testValue;
+            this.expectedValue = expectedValue;
+            metaData = {};
+            // Note: These must correspond to a Watson product area (case-sensitive)
+            metaData.productArea = "Text Attributes";
+        }
+
+        /**
+         * This builds testcases for properties in description that are Number types.  For each number property
+         * testcases are built to set the value to the below the minimum value, step from the minimum value to the maximum value
+         * and then above the maximum value.
+         */
+        protected function testAllNumberPropsFromMinToMax(testConfig:TestConfig, description:Object, category:String):void
+        {
+            for each (testProp in description)
+            {
+                var handler:NumberPropertyHandler = testProp.findHandler(NumberPropertyHandler) as NumberPropertyHandler;
+
+                if (handler && testProp.category == category)
+                {
+                    var minVal:Number = handler.minValue;
+                    var maxVal:Number = handler.maxValue;
+                    assertTrue(true, minVal < maxVal);
+                    var delta:Number = (maxVal - minVal) / 10;
+                    var includeInMinimalTestSuite:Boolean;
+
+                    for (var value:Number = minVal - delta; ;)
+                    {
+                        expectedValue = value < minVal ? undefined : (value > maxVal ? undefined : value);
+                        testValue = value;
+                        // include in the minmalTest values below the range, min value, max value and values above the range
+                        includeInMinimalTestSuite = (value <= minVal || value >= maxVal)
+
+                        runOneCharacterAttributeTest();
+
+                        if (value > maxVal)
+                            break;
+                        value += delta;
+                    }
+                }
+            }
+        }
+
+        /**
+         * This builds testcases for properties in attributes in description that are Int types.  For each number property
+         * testcases are built to set the value to the below the minimum value, step from the minimum value to the maximum value
+         * and then above the maximum value.
+         */
+        protected function testAllIntPropsFromMinToMax(testConfig:TestConfig, description:Object, category:String):void
+        {
+            for each (testProp in description)
+            {
+                if (testProp.category == category)
+                {
+                    var handler:IntPropertyHandler = testProp.findHandler(IntPropertyHandler) as IntPropertyHandler;
+                    if (handler)
+                    {
+                        var minVal:int = handler.minValue;
+                        var maxVal:int = handler.maxValue;
+                        assertTrue(true, minVal < maxVal);
+                        var delta:int = (maxVal - minVal) / 10;
+                        var includeInMinimalTestSuite:Boolean;
+
+                        for (var value:Number = minVal - delta; ;)
+                        {
+                            expectedValue = value < minVal ? undefined : (value > maxVal ? undefined : value);
+                            testValue = value;
+                            // include in the minmalTest values below the range, min value, max value and values above the range
+                            includeInMinimalTestSuite = (value <= minVal || value >= maxVal)
+
+                            runOneCharacterAttributeTest();
+
+                            if (value > maxVal)
+                                break;
+                            value += delta;
+                        }
+                    }
+                }
+            }
+        }
+
+        /**
+         * This builds testcases for properties in description that are NumberOrPercent types.  For each number property
+         * testcases are built to set the value to the below the minimum value, step from the minimum value to the maximum value
+         * and then above the maximum value.  This is done first using the min/max number values and then the min/max percent values.
+         */
+        protected function testAllNumberOrPercentPropsFromMinToMax(testConfig:TestConfig, description:Object, category:String):void
+        {
+            for each (testProp in description)
+            {
+                if (testProp.category == category)
+                {
+                    var numberHandler:NumberPropertyHandler = testProp.findHandler(NumberPropertyHandler) as NumberPropertyHandler;
+                    var percentHandler:PercentPropertyHandler = testProp.findHandler(PercentPropertyHandler) as PercentPropertyHandler;
+                    if (numberHandler && percentHandler)
+                    {
+                        var minVal:Number = numberHandler.minValue;
+                        var maxVal:Number = numberHandler.maxValue;
+                        assertTrue(true, minVal < maxVal);
+                        var delta:Number = (maxVal - minVal) / 10;
+                        var includeInMinimalTestSuite:Boolean;
+
+                        for (var value:Number = minVal - delta; ;)
+                        {
+                            expectedValue = value < minVal ? undefined : (value > maxVal ? undefined : value);
+                            testValue = value;
+
+                            // include in the minmalTest values below the range, min value, max value and values above the range
+                            includeInMinimalTestSuite = (value <= minVal || value >= maxVal)
+
+                            runOneCharacterAttributeTest();
+                            //ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, value, expectedValue, includeInMinimalTestSuite) );
+
+                            if (value > maxVal)
+                                break;
+                            value += delta;
+                        }
+
+                        // repeat with percent values
+                        minVal = percentHandler.minValue;
+                        maxVal = percentHandler.maxValue;
+                        assertTrue(true, minVal < maxVal);
+                        delta = (maxVal - minVal) / 10;
+
+                        for (value = minVal - delta; ;)
+                        {
+                            expectedValue = value < minVal ? undefined : (value > maxVal ? undefined : value.toString() + "%");
+                            //ts.addTestDescriptor( new TestDescriptor (testClass, methodName, testConfig, null, prop, value.toString()+"%", expectedValue, true) );
+
+                            testValue = value.toString() + "%";
+
+                            runOneCharacterAttributeTest();
+
+                            if (value > maxVal)
+                                break;
+                            value += delta;
+                        }
+                    }
+                }
+            }
+        }
+
+        /**
+         * This builds testcases for properties in attributes in description that are Boolean types.  A testcase is generated
+         * for true and false for the value.
+         */
+        protected function testAllBooleanProps(testConfig:TestConfig, description:Object, category:String):void
+        {
+            for each (testProp in description)
+            {
+                if (testProp.category == category && testProp.findHandler(BooleanPropertyHandler) != null)
+                {
+                    expectedValue = testValue = true;
+                    runOneCharacterAttributeTest();
+
+                    expectedValue = testValue = false;
+                    runOneCharacterAttributeTest();
+                }
+            }
+        }
+
+        /**
+         * This builds testcases for properties in attributes in description that are Enumerated types types.  A testcase is generated
+         * for each possible enumerated value
+         */
+        protected function testAllEnumProps(testConfig:TestConfig, description:Object, category:String):void
+        {
+            var range:Object = null;
+            var value:Object = null;
+
+            for each (testProp in description)
+            {
+                // new code
+                if (testProp.category == category)
+                {
+                    var handler:EnumPropertyHandler = testProp.findHandler(EnumPropertyHandler) as EnumPropertyHandler;
+                    if (handler)
+                    {
+                        range = handler.range;
+                        for (value in range)
+                        {
+                            if (value != FormatValue.INHERIT)
+                            {
+                                expectedValue = testValue = value;
+                                runOneCharacterAttributeTest();
+                            }
+                        }
+                        expectedValue = undefined;
+                        testValue = "foo";
+                        runOneCharacterAttributeTest();
+                    }
+
+                }
+            }
+        }
+
+        /**
+         * This builds testcases for setting all properties in description to inherit, null, undefined and an object.
+         */
+        protected function testAllSharedValues(testConfig:TestConfig, description:Object, category:String):void
+        {
+            for each (testProp in description)
+            {
+                if (testProp.category == category)
+                {
+
+                    testValue = expectedValue = FormatValue.INHERIT;
+                    runOneCharacterAttributeTest();
+
+                    testValue = new Sprite();
+                    expectedValue = undefined;
+                    runOneCharacterAttributeTest();
+
+                    testValue = null;
+                    expectedValue = undefined;
+                    runOneCharacterAttributeTest();
+
+                    testValue = expectedValue = undefined;
+                    runOneCharacterAttributeTest();
+
+                    testValue = expectedValue = undefined;
+                    clearFormatTest();
+                }
+            }
+        }
+
+        public function clearFormatTest():void
+        {
+            SelManager.selectAll();
+
+            var applyFormat:TextLayoutFormat = new TextLayoutFormat();
+            applyFormat[testProp.name] = testProp.defaultValue;
+            var clearFormat:TextLayoutFormat = new TextLayoutFormat();
+            clearFormat[testProp.name] = FormatValue.INHERIT;
+
+            switch (testProp.category)
+            {
+                case Category.CHARACTER:
+                    SelManager.applyFormat(applyFormat, null, null);
+                    validateCharacterPropertyOnEntireFlow(SelManager.textFlow, testProp, testProp.defaultValue);
+                    SelManager.clearFormat(clearFormat, null, null);
+                    validateCharacterPropertyOnEntireFlow(SelManager.textFlow, testProp, undefined);
+                    break;
+                case Category.PARAGRAPH:
+                    SelManager.applyFormat(null, applyFormat, null);
+                  //  AllParaAttributeTest.validateParagraphPropertyOnEntireFlow(SelManager.textFlow, testProp, testProp.defaultValue);
+                    SelManager.clearFormat(null, clearFormat, null);
+                   // AllParaAttributeTest.validateParagraphPropertyOnEntireFlow(SelManager.textFlow, testProp, undefined);
+                    break;
+                case Category.CONTAINER:
+                    SelManager.applyFormat(null, null, applyFormat);
+                    AllContAttributeTest.validateContainerPropertyOnEntireFlow(SelManager.textFlow, testProp, testProp.defaultValue);
+                    SelManager.clearFormat(null, null, clearFormat);
+                    AllContAttributeTest.validateContainerPropertyOnEntireFlow(SelManager.textFlow, testProp, undefined);
+                    break;
+            }
+        }
+
+        private var errorHandlerCount:int = 0;
+
+        public function errorHandler(p:Property, value:Object):void
+        {
+            errorHandlerCount++;
+        }
+
+        protected function assignmentHelper(target:Object):void
+        {
+            Property.errorHandler = errorHandler;
+            errorHandlerCount = 0;
+            try
+            {
+                target[testProp.name] = testValue;
+            }
+            catch (e:Error)
+            {
+                Property.errorHandler = Property.defaultErrorHandler;
+                assertTrue("Unexpected error in AllAttributeTest.assignmentHelper", false);
+                throw(e);
+            }
+            Property.errorHandler = Property.defaultErrorHandler;
+
+            if (expectedValue == undefined && testValue != undefined)
+            {
+                // expect an error
+                assertTrue("Error expected but no error in AllAttributeTest.assignmentHelper", errorHandlerCount == 1);
+            }
+            else
+            {
+                // no error
+                assertTrue("Error not expected but error found in AllAttributeTest.assignmentHelper", errorHandlerCount == 0);
+            }
+        }
+
+
+        /**
+         * Generic function to run one character attribute test.  Uses the selection manager to set the attributes on the entire flow at the span level
+         * to value and then validates that the value is expectedValue.
+         */
+        private function runOneCharacterAttributeTest():void
+        {
+            if (testProp == null)
+                return;	// must be set
+
+            SelManager.selectAll();
+
+            // Test direct change on single leaf
+            var leaf:FlowLeafElement = SelManager.textFlow.findLeaf(SelManager.absoluteStart);
+            var originalValue:* = leaf[testProp.name];
+
+            assignmentHelper(leaf);
+
+            var expectedResult:*;
+            if (expectedValue === undefined)
+                expectedResult = testValue === undefined || testValue === null ? undefined : originalValue;
+            else
+                expectedResult = expectedValue;
+
+            assertTrue("FlowLeafElement does not have the expected value after direct change", leaf[testProp.name] == expectedResult);
+            leaf[testProp.name] = originalValue;
+
+            var ca:TextLayoutFormat = new TextLayoutFormat();
+            assignmentHelper(ca);
+            SelManager.applyLeafFormat(ca);
+
+            // expect that all FlowLeafElements have expectedValue as the properties value
+            if (expectedValue !== undefined)
+                assertTrue("not all FlowLeafElements have the expected value", validateCharacterPropertyOnEntireFlow(SelManager.textFlow, testProp, expectedValue));
+        }
+
+
+        // support function to walk all FlowLeafElements and verify that prop is val
+        private function validateCharacterPropertyOnEntireFlow(textFlow:TextFlow, prop:Property, val:*):Boolean
+        {
+            var idx:int = 0;
+            var elem:FlowLeafElement = textFlow.getFirstLeaf();
+            assertTrue("either the first FlowLeafElement is null or the textFlow length is zero", elem != null || textFlow.textLength == 0);
+            while (elem)
+            {
+                // error if elements have zero length
+                assertTrue("The FlowLeafElement has zero length", elem.textLength != 0);
+
+                // expect all values of prop to be supplied val
+                if (elem.format[prop.name] !== val || elem[prop.name] !== val)
+                    return false;
+
+                // inherit is never computed
+                if ((val == FormatValue.INHERIT && elem.computedFormat[prop.name] == val) || elem.computedFormat[prop.name] === undefined)
+                    return false;
+
+                // skip to the next element
+                var nextElem:FlowLeafElement = elem.getNextLeaf();
+                var absoluteEnd:int = elem.getAbsoluteStart() + elem.textLength;
+                if (nextElem == null)
+                    assertTrue("absoluteEnd of the last FlowLeafElement is not the end of the textFlow", absoluteEnd == textFlow.textLength);
+                else
+                    assertTrue("the end of this FlowLeafElement does not equal the start of the next", absoluteEnd == nextElem.getAbsoluteStart());
+
+                elem = nextElem;
+            }
+            return true;
+        }
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/flex-tlf/blob/2b0067b7/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as
----------------------------------------------------------------------
diff --git a/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as b/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as
index ff0596e..a9e1561 100644
--- a/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as
+++ b/automation_tests/src/UnitTest/Tests/AllCharAttributeTest.as
@@ -18,103 +18,51 @@
 ////////////////////////////////////////////////////////////////////////////////
 package UnitTest.Tests
 {
-	import UnitTest.ExtendedClasses.TestSuiteExtended;
-	import UnitTest.Fixtures.TestConfig;
+    import UnitTest.Fixtures.TestConfig;
 
-	import flashx.textLayout.elements.FlowLeafElement;
-	import flashx.textLayout.elements.TextFlow;
-	import flashx.textLayout.formats.Category;
-	import flashx.textLayout.formats.FormatValue;
-	import flashx.textLayout.formats.TextLayoutFormat;
-	import flashx.textLayout.property.Property;
-	import flashx.textLayout.tlf_internal;
+    import flashx.textLayout.formats.Category;
+    import flashx.textLayout.formats.TextLayoutFormat;
 
-    import org.flexunit.asserts.assertTrue;
+    import flashx.textLayout.tlf_internal;
 
     use namespace tlf_internal;
 
-	public class AllCharAttributeTest extends AllAttributeTest
-	{
-		public function AllCharAttributeTest(methodName:String, testID:String, testConfig:TestConfig, prop:Property, testValue:Object, expectedValue:*)
-		{
-			super (methodName, testID, testConfig, prop, testValue, expectedValue);
-
-			// Note: These must correspond to a Watson product area (case-sensitive)
-			metaData.productArea = "Text Attributes";
-			metaData.productSubArea = "Character Attributes";
-		}
-
-		public static function suite(testConfig:TestConfig, ts:TestSuiteExtended):void
-		{
- 			// generate test cases
-  			testAllProperties(ts, testConfig, TextLayoutFormat.description, Category.CHARACTER, AllCharAttributeTest, "runOneCharacterAttributeTest");
-   		}
-
-		/**
-		 * Generic function to run one character attribute test.  Uses the selection manager to set the attributes on the entire flow at the span level
-		 * to value and then validates that the value is expectedValue.
-		 */
-		public function runOneCharacterAttributeTest():void
-		{
-			if (testProp == null)
-				return;	// must be set
-
-			SelManager.selectAll();
-
-			// Test direct change on single leaf
-			var leaf:FlowLeafElement = SelManager.textFlow.findLeaf(SelManager.absoluteStart);
-			var originalValue:* = leaf[testProp.name];
-
-			assignmentHelper(leaf);
-
-			var expectedResult:*;
-			if (expectedValue === undefined)
-				expectedResult = testValue === undefined || testValue === null ? undefined : originalValue;
-			else
-				expectedResult = expectedValue;
-
-			assertTrue("FlowLeafElement does not have the expected value after direct change", leaf[testProp.name] == expectedResult);
-			leaf[testProp.name] = originalValue;
-
-			var ca:TextLayoutFormat = new TextLayoutFormat();
-			assignmentHelper(ca);
-			SelManager.applyLeafFormat(ca);
-
-			// expect that all FlowLeafElements have expectedValue as the properties value
-			if (expectedValue !== undefined)
-				assertTrue("not all FlowLeafElements have the expected value", validateCharacterPropertyOnEntireFlow(SelManager.textFlow,testProp,expectedValue));
-		}
-
-		// support function to walk all FlowLeafElements and verify that prop is val
-		static public function validateCharacterPropertyOnEntireFlow(textFlow:TextFlow, prop:Property,val:*):Boolean
-		{
-			var idx:int = 0;
-			var elem:FlowLeafElement = textFlow.getFirstLeaf();
-			assertTrue("either the first FlowLeafElement is null or the textFlow length is zero", elem != null || textFlow.textLength == 0);
-			while (elem)
-			{
-				// error if elements have zero length
-				assertTrue("The FlowLeafElement has zero length", elem.textLength != 0);
-
-				// expect all values of prop to be supplied val
-				if (elem.format[prop.name] !== val || elem[prop.name] !== val)
-					return false;
-
-				// inherit is never computed
-				if ((val == FormatValue.INHERIT && elem.computedFormat[prop.name] == val) || elem.computedFormat[prop.name] === undefined)
-					return false;
-
-				// skip to the next element
-				var nextElem:FlowLeafElement = elem.getNextLeaf();
-				var absoluteEnd:int = elem.getAbsoluteStart() + elem.textLength;
-				if (nextElem == null)
-					assertTrue("absoluteEnd of the last FlowLeafElement is not the end of the textFlow", absoluteEnd == textFlow.textLength);
-				else
-					assertTrue("the end of this FlowLeafElement does not equal the start of the next", absoluteEnd == nextElem.getAbsoluteStart());
-
-				elem = nextElem;
-			}
-			return true;
-		}
-	}
+    public class AllCharAttributeTest extends AllAttributeTest
+    {
+        public function AllCharAttributeTest()
+        {
+            super("", "AllCharAttributeTest", TestConfig.getInstance(), null, null, null);
+            // Note: These must correspond to a Watson product area (case-sensitive)
+            metaData.productArea = "Text Attributes";
+            metaData.productSubArea = "Character Attributes";
+        }
+
+
+        [Before]
+        override public function setUpTest():void
+        {
+            super.setUpTest();
+
+            testProp = null;
+            expectedValue = null;
+            testValue = null;
+        }
+
+        [After]
+        override public function tearDownTest():void
+        {
+            super.tearDownTest();
+        }
+
+        [Test]
+        public function propertiesCharacterTests():void
+        {
+            testAllNumberPropsFromMinToMax(TestConfig.getInstance(), TextLayoutFormat.description, Category.CHARACTER);
+            testAllIntPropsFromMinToMax(TestConfig.getInstance(), TextLayoutFormat.description, Category.CHARACTER);
+            testAllNumberOrPercentPropsFromMinToMax(TestConfig.getInstance(), TextLayoutFormat.description, Category.CHARACTER);
+            testAllBooleanProps(TestConfig.getInstance(), TextLayoutFormat.description, Category.CHARACTER);
+            testAllEnumProps(TestConfig.getInstance(), TextLayoutFormat.description, Category.CHARACTER);
+            testAllSharedValues(TestConfig.getInstance(), TextLayoutFormat.description, Category.CHARACTER);
+        }
+    }
 }