This test checks the use of SVGAnimatedEnumeration within SVGMaskElement

On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".



Check initial 'maskUnits' value
PASS maskElement.maskUnits.toString() is "[object SVGAnimatedEnumeration]"
PASS typeof(maskElement.maskUnits.baseVal) is "number"
PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE

Switch to 'objectBoundingBox'
PASS maskElement.maskUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.getAttribute('maskUnits') is "objectBoundingBox"

Try setting invalid values
PASS maskElement.maskUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.getAttribute('maskUnits') is "objectBoundingBox"
PASS maskElement.maskUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.getAttribute('maskUnits') is "objectBoundingBox"
PASS maskElement.maskUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.getAttribute('maskUnits') is "objectBoundingBox"

Switch to 'userSpaceOnUse'
PASS maskElement.maskUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
PASS maskElement.getAttribute('maskUnits') is "userSpaceOnUse"

Check initial 'maskContentUnits' value
PASS maskElement.maskContentUnits.toString() is "[object SVGAnimatedEnumeration]"
PASS typeof(maskElement.maskContentUnits.baseVal) is "number"
PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE

Switch to 'objectBoundingBox'
PASS maskElement.maskContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.getAttribute('maskContentUnits') is "objectBoundingBox"

Try setting invalid values
PASS maskElement.maskContentUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.getAttribute('maskContentUnits') is "objectBoundingBox"
PASS maskElement.maskContentUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.getAttribute('maskContentUnits') is "objectBoundingBox"
PASS maskElement.maskContentUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
PASS maskElement.getAttribute('maskContentUnits') is "objectBoundingBox"

Switch to 'userSpaceOnUse'
PASS maskElement.maskContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
PASS maskElement.getAttribute('maskContentUnits') is "userSpaceOnUse"
PASS successfullyParsed is true

TEST COMPLETE

