<!DOCTYPE HTML>
<title>Use of SVGAnimatedEnumeration within SVGGradientElement</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
test(function() {
  // This test checks the use of SVGAnimatedEnumeration within SVGGradientElement.

  var gradientElement = document.createElementNS("http://www.w3.org/2000/svg", "linearGradient");
  gradientElement.setAttribute("gradientUnits", "userSpaceOnUse");
  gradientElement.setAttribute("spreadMethod", "pad");

  // gradientUnits
  // Check initial 'gradientUnits' value.
  assert_true(gradientElement.gradientUnits instanceof SVGAnimatedEnumeration);
  assert_equals(typeof(gradientElement.gradientUnits.baseVal), "number");
  assert_equals(gradientElement.gradientUnits.baseVal, SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE);

  // Switch to 'objectBoundingBox'.
  gradientElement.gradientUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
  assert_equals(gradientElement.gradientUnits.baseVal, SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
  assert_equals(gradientElement.getAttribute('gradientUnits'), "objectBoundingBox");

  // Try setting invalid values.
  assert_throws(new TypeError(), function() { gradientElement.gradientUnits.baseVal = 3; });
  assert_equals(gradientElement.gradientUnits.baseVal, SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
  assert_equals(gradientElement.getAttribute('gradientUnits'), "objectBoundingBox");

  assert_throws(new TypeError(), function() { gradientElement.gradientUnits.baseVal = -1; });
  assert_equals(gradientElement.gradientUnits.baseVal, SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
  assert_equals(gradientElement.getAttribute('gradientUnits'), "objectBoundingBox");

  assert_throws(new TypeError(), function() { gradientElement.gradientUnits.baseVal = 0; });
  assert_equals(gradientElement.gradientUnits.baseVal, SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
  assert_equals(gradientElement.getAttribute('gradientUnits'), "objectBoundingBox");

  // Switch to 'userSpaceOnUse'.
  gradientElement.gradientUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE;
  assert_equals(gradientElement.gradientUnits.baseVal, SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE);
  assert_equals(gradientElement.getAttribute('gradientUnits'), "userSpaceOnUse");

  // spreadMethod
  // Check initial 'spreadMethod' value.
  assert_true(gradientElement.spreadMethod instanceof SVGAnimatedEnumeration);
  assert_equals(typeof(gradientElement.spreadMethod.baseVal), "number");
  assert_equals(gradientElement.spreadMethod.baseVal, SVGGradientElement.SVG_SPREADMETHOD_PAD);

  // Switch to 'reflect' value.
  gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_REFLECT;
  assert_equals(gradientElement.spreadMethod.baseVal, SVGGradientElement.SVG_SPREADMETHOD_REFLECT);
  assert_equals(gradientElement.getAttribute('spreadMethod'), "reflect");

  // Switch to 'repeat' value.
  gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_REPEAT;
  assert_equals(gradientElement.spreadMethod.baseVal, SVGGradientElement.SVG_SPREADMETHOD_REPEAT);
  assert_equals(gradientElement.getAttribute('spreadMethod'), "repeat");

  // Try setting invalid values.
  assert_throws(new TypeError(), function() { gradientElement.spreadMethod.baseVal = 4; });
  assert_equals(gradientElement.spreadMethod.baseVal, SVGGradientElement.SVG_SPREADMETHOD_REPEAT);
  assert_equals(gradientElement.getAttribute('spreadMethod'), "repeat");

  assert_throws(new TypeError(), function() { gradientElement.spreadMethod.baseVal = -1; });
  assert_equals(gradientElement.spreadMethod.baseVal, SVGGradientElement.SVG_SPREADMETHOD_REPEAT);
  assert_equals(gradientElement.getAttribute('spreadMethod'), "repeat");

  assert_throws(new TypeError(), function() { gradientElement.spreadMethod.baseVal = 0; });
  assert_equals(gradientElement.spreadMethod.baseVal, SVGGradientElement.SVG_SPREADMETHOD_REPEAT);
  assert_equals(gradientElement.getAttribute('spreadMethod'), "repeat");

  // Switch to 'pad'.
  gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_PAD;
  assert_equals(gradientElement.spreadMethod.baseVal, SVGGradientElement.SVG_SPREADMETHOD_PAD);
  assert_equals(gradientElement.getAttribute('spreadMethod'), "pad");
});
</script>
