<!DOCTYPE HTML>
<title>SVGAngle interface</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>
test(function() {
// This test checks the SVGAngle API.
var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
var angle = svgElement.createSVGAngle();
// Check initial angle values.
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
assert_equals(angle.valueAsString, "0");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
// Spec: Raised if unitType is SVG_ANGLETYPE_UNKNOWN or not a valid unit type constant (one of the other SVG_ANGLETYPE_* constants defined on this interface).
// Check invalid arguments for 'convertToSpecifiedUnits'.
assert_throws_dom("NotSupportedError", function() { angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNKNOWN); });
assert_throws_dom("NotSupportedError", function() { angle.convertToSpecifiedUnits(-1); });
assert_throws_dom("NotSupportedError", function() { angle.convertToSpecifiedUnits(5); });
// 'aString' converts to short 0 (through NaN) according to ECMA-262, ToUint16.
// Therefore this throws NOT_SUPPORTED_ERR.
assert_throws_dom("NotSupportedError", function() { angle.convertToSpecifiedUnits('aString'); });
// Same here, via ToString conversion of object.
assert_throws_dom("NotSupportedError", function() { angle.convertToSpecifiedUnits(angle); });
// Same here, via ToString conversion of object.
assert_throws_dom("NotSupportedError", function() { angle.convertToSpecifiedUnits(svgElement); });
assert_throws_js(TypeError, function() { angle.convertToSpecifiedUnits(); });
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
// Check valid arguments for 'convertToSpecifiedUnits', that should only modify the 'valueAsString'");
angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_RAD);
assert_equals(angle.valueAsString, "0rad");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_RAD);
angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_GRAD);
assert_equals(angle.valueAsString, "0grad");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_GRAD);
angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG);
assert_equals(angle.valueAsString, "0deg");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_DEG);
angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
assert_equals(angle.valueAsString, "0");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
// Spec: Raised if unitType is SVG_ANGLETYPE_UNKNOWN or not a valid unit type constant (one of the other SVG_ANGLETYPE_* constants defined on this interface).
// Check invalid arguments for 'newValueSpecifiedUnits'.
assert_throws_dom("NotSupportedError", function() { angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNKNOWN, 50); });
assert_throws_dom("NotSupportedError", function() { angle.newValueSpecifiedUnits(-1, 50); });
assert_throws_dom("NotSupportedError", function() { angle.newValueSpecifiedUnits(5, 50); });
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG); });
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 'aString'); });
assert_equals(angle.value, 0);
angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 0);
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, angle); });
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, svgElement); });
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, NaN); });
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, Infinity); });
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG); });
// All of the following unitType arguments convert to 0 (SVG_ANGLETYPE_UNKNOWN).
assert_throws_dom("NotSupportedError", function() { angle.newValueSpecifiedUnits('aString', 4); });
assert_throws_dom("NotSupportedError", function() { angle.newValueSpecifiedUnits(angle, 4); });
assert_throws_dom("NotSupportedError", function() { angle.newValueSpecifiedUnits(svgElement, 4); });
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits('aString', 'aString'); });
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(angle, angle); });
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(svgElement, svgElement); });
assert_throws_js(TypeError, function() { angle.newValueSpecifiedUnits(); });
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_DEG);
// Check valid arguments for 'newValueSpecifiedUnits', that should only modify the 'valueAsString'.
angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_RAD, parseFloat(Math.PI.toFixed(5)));
assert_equals(angle.valueAsString, Math.PI.toFixed(5) + "rad");
assert_equals(angle.value.toFixed(1), "180.0");
assert_equals(angle.valueInSpecifiedUnits.toFixed(5), Math.PI.toFixed(5));
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_RAD);
angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_GRAD, 400);
assert_equals(angle.valueAsString, "400grad");
assert_equals(angle.value.toFixed(1), "360.0");
assert_equals(angle.valueInSpecifiedUnits, 400);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_GRAD);
angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 360);
assert_equals(angle.valueAsString, "360deg");
assert_equals(angle.value, 360);
assert_equals(angle.valueInSpecifiedUnits, 360);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_DEG);
angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNSPECIFIED, 180);
assert_equals(angle.valueAsString, "180");
assert_equals(angle.value, 180);
assert_equals(angle.valueInSpecifiedUnits, 180);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
// Reset to initial angle state.
angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNSPECIFIED, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
// Spec: Raised if the assigned string cannot be parsed as a valid <angle>.
// Check setting invalid 'valueAsString' arguments.
assert_throws_dom("SyntaxError", function() { angle.valueAsString = '10px'; });
assert_equals(angle.valueAsString, "0");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
assert_throws_dom("SyntaxError", function() { angle.valueAsString = '10x'; });
assert_equals(angle.valueAsString, "0");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
assert_throws_dom("SyntaxError", function() { angle.valueAsString = '5graD'; });
assert_equals(angle.valueAsString, "0");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
assert_throws_dom("SyntaxError", function() { angle.valueAsString = '5Rad'; });
assert_equals(angle.valueAsString, "0");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
assert_throws_dom("SyntaxError", function() { angle.valueAsString = ',5 rad'; });
assert_equals(angle.valueAsString, "0");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
assert_throws_dom("SyntaxError", function() { angle.valueAsString = null; });
assert_equals(angle.valueAsString, "0");
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
// Check setting invalid 'valueInSpecifiedUnits' arguments
assert_throws_js(TypeError, function() { angle.valueInSpecifiedUnits = 'test'; });
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
angle.valueInSpecifiedUnits = 0;
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_throws_js(TypeError, function() { angle.valueInSpecifiedUnits = angle; });
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.valueInSpecifiedUnits = NaN; });
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.valueInSpecifiedUnits = Infinity; });
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
// Check setting invalid 'value' arguments.
angle.value = 0;
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.value = 'test'; });
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
angle.value = 0;
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.value = angle; });
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.value = NaN; });
assert_equals(angle.value, 0);
assert_throws_js(TypeError, function() { angle.value = Infinity; });
assert_equals(angle.value, 0);
assert_equals(angle.valueInSpecifiedUnits, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_UNSPECIFIED);
// Reset to angle in degree units.
angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 0);
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_DEG);
// Check setting valid 'value' arguments, assure that 'valueInSpecifiedUnits' and 'valueAsString' are synchronized.
angle.value = 50;
assert_equals(angle.value, 50);
assert_equals(angle.valueInSpecifiedUnits, 50);
assert_equals(angle.valueAsString, "50deg");
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_DEG);
// Try modifiying the readonly 'unitType', needs to fail.
angle.unitType = SVGAngle.SVG_ANGLETYPE_RAD;
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_DEG);
// Check setting valid 'valueInSpecifiedUnits' arguments, assure that 'value' and 'valueAsString' are synchronized.
angle.valueInSpecifiedUnits = 100;
assert_equals(angle.valueInSpecifiedUnits, 100);
assert_equals(angle.value, 100);
assert_equals(angle.valueAsString, "100deg");
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_DEG);
// Check setting valid 'valueAsString' arguments, assure that 'value' and 'valueInSpecifiedUnits' are synchronized.
angle.valueAsString = '200grad';
assert_equals(angle.valueAsString, "200grad");
assert_equals(angle.valueInSpecifiedUnits, 200);
assert_equals(angle.value.toFixed(1), "180.0");
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_GRAD);
// Now convert the GRAD value into a RAD value, and assure that all properties have been synchronized.
angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_RAD);
assert_equals(angle.value.toFixed(1), "180.0");
assert_equals(angle.valueInSpecifiedUnits.toFixed(5), Math.PI.toFixed(5));
assert_equals(angle.valueAsString, Math.PI.toFixed(5) + "rad");
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_RAD);
// Now try converting the RAD value into an unknown value, that should fail and throw;
assert_throws_dom("NotSupportedError", function() { angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNKNOWN); });
assert_equals(angle.value.toFixed(1), "180.0");
assert_equals(angle.valueInSpecifiedUnits.toFixed(5), Math.PI.toFixed(5));
assert_equals(angle.valueAsString, Math.PI.toFixed(5) + "rad");
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_RAD);
// Now convert the RAD value into a DEG value, and assure that all properties have been synchronized.
angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG);
assert_equals(angle.value.toFixed(1), "180.0");
assert_equals(angle.valueInSpecifiedUnits.toFixed(1), "180.0");
assert_equals(angle.valueAsString, "180deg");
assert_equals(angle.unitType, SVGAngle.SVG_ANGLETYPE_DEG);
});
</script>