<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("This test checks the SVGAngle API");

var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
var angle = svgElement.createSVGAngle();

debug("");
debug("Check initial angle values");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");
shouldBeEqualToString("angle.valueAsString", "0");
shouldBe("angle.value", "0");
shouldBe("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).
debug("");
debug("Check invalid arguments for 'convertToSpecifiedUnits'");
shouldThrow("angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNKNOWN)");
shouldThrow("angle.convertToSpecifiedUnits(-1)");
shouldThrow("angle.convertToSpecifiedUnits(5)");
// 'aString' converts to short 0 (through NaN) according to ECMA-262, ToUint16.
// Therefore this throws NOT_SUPPORTED_ERR.
shouldThrow("angle.convertToSpecifiedUnits('aString')");
// Same here, via ToString conversion of object.
shouldThrow("angle.convertToSpecifiedUnits(angle)");
// Same here, via ToString conversion of object.
shouldThrow("angle.convertToSpecifiedUnits(svgElement)");
shouldThrow("angle.convertToSpecifiedUnits()");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

debug("");
debug("Check valid arguments for 'convertToSpecifiedUnits', that should only modify the 'valueAsString'");
shouldBeUndefined("angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_RAD)");
shouldBeEqualToString("angle.valueAsString", "0rad");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_RAD");

shouldBeUndefined("angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_GRAD)");
shouldBeEqualToString("angle.valueAsString", "0grad");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_GRAD");

shouldBeUndefined("angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG)");
shouldBeEqualToString("angle.valueAsString", "0deg");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");

shouldBeUndefined("angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNSPECIFIED)");
shouldBeEqualToString("angle.valueAsString", "0");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("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).
debug("");
debug("Check invalid arguments for 'newValueSpecifiedUnits'");
shouldThrow("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNKNOWN, 50)");
shouldThrow("angle.newValueSpecifiedUnits(-1, 50)");
shouldThrow("angle.newValueSpecifiedUnits(5, 50)");
shouldThrow("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG)");
shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 'aString')");
shouldBe("angle.value", "NaN");
shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 0)");
shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, angle)");
shouldBe("angle.value", "NaN");
shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, svgElement)");
shouldBe("angle.value", "NaN");
shouldThrow("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG)");
// All of the following unitType arguments convert to 0 (SVG_ANGLETYPE_UNKNOWN).
shouldThrow("angle.newValueSpecifiedUnits('aString', 4)");
shouldThrow("angle.newValueSpecifiedUnits(angle, 4)");
shouldThrow("angle.newValueSpecifiedUnits(svgElement, 4)");
shouldThrow("angle.newValueSpecifiedUnits('aString', 'aString')");
shouldThrow("angle.newValueSpecifiedUnits(angle, angle)");
shouldThrow("angle.newValueSpecifiedUnits(svgElement, svgElement)");
shouldThrow("angle.newValueSpecifiedUnits()");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");

debug("");
debug("Check valid arguments for 'newValueSpecifiedUnits', that should only modify the 'valueAsString'");
shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_RAD, parseFloat(Math.PI.toFixed(5)))");
// Exact result of valueAsString depends on precision, no trivial way to correctly test it, especially across engines.
shouldBeEqualToString("angle.valueAsString.slice(-3)", "rad");
shouldBeEqualToString("angle.value.toFixed(1)", "180.0");
shouldBe("angle.valueInSpecifiedUnits.toFixed(5)", "Math.PI.toFixed(5)");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_RAD");

shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_GRAD, 400)");
shouldBeEqualToString("angle.valueAsString", "400grad");
shouldBeEqualToString("angle.value.toFixed(1)", "360.0");
shouldBe("angle.valueInSpecifiedUnits", "400");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_GRAD");

shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 360)");
shouldBeEqualToString("angle.valueAsString", "360deg");
shouldBe("angle.value", "360");
shouldBe("angle.valueInSpecifiedUnits", "360");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");

shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNSPECIFIED, 180)");
shouldBeEqualToString("angle.valueAsString", "180");
shouldBe("angle.value", "180");
shouldBe("angle.valueInSpecifiedUnits", "180");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

debug("");
debug("Reset to initial angle state");
shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNSPECIFIED, 0)");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

// Spec: Raised if the assigned string cannot be parsed as a valid <angle>.
debug("");
debug("Check setting invalid 'valueAsString' arguments");
shouldThrow("angle.valueAsString = '10px'");
shouldBeEqualToString("angle.valueAsString", "0");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

shouldThrow("angle.valueAsString = '10x'");
shouldBeEqualToString("angle.valueAsString", "0");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

shouldThrow("angle.valueAsString = '5graD'");
shouldBeEqualToString("angle.valueAsString", "0");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

shouldThrow("angle.valueAsString = '5Rad'");
shouldBeEqualToString("angle.valueAsString", "0");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

shouldThrow("angle.valueAsString = ',5 rad'");
shouldBeEqualToString("angle.valueAsString", "0");
shouldBe("angle.value", "0");
shouldBe("angle.valueInSpecifiedUnits", "0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

debug("");
debug("Check setting invalid 'valueInSpecifiedUnits' arguments");
shouldBe("angle.valueInSpecifiedUnits = 'test'", "'test'");
shouldBe("angle.value", "NaN");
shouldBe("angle.valueInSpecifiedUnits", "NaN");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");
shouldBe("angle.valueInSpecifiedUnits = 0", "0");

shouldBe("angle.valueInSpecifiedUnits = angle", "angle");
shouldBe("angle.value", "NaN");
shouldBe("angle.valueInSpecifiedUnits", "NaN");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

debug("");
debug("Check setting invalid 'value' arguments");
shouldBe("angle.value = 0", "0");
shouldBe("angle.value = 'test'", "'test'");
shouldBe("angle.value", "NaN");
shouldBe("angle.valueInSpecifiedUnits", "NaN");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

shouldBe("angle.value = 0", "0");
shouldBe("angle.value = angle", "angle");
shouldBe("angle.value", "NaN");
shouldBe("angle.valueInSpecifiedUnits", "NaN");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");

debug("");
debug("Reset to angle in degree units");
shouldBeUndefined("angle.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 0)");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");

debug("");
debug("Check setting valid 'value' arguments, assure that 'valueInSpecifiedUnits' and 'valueAsString' are synchronized");
shouldBe("angle.value = 50", "50");
shouldBe("angle.valueInSpecifiedUnits", "50");
shouldBeEqualToString("angle.valueAsString", "50deg");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");

debug("");
debug("Try modifiying the readonly 'unitType', needs to fail");
shouldBeUndefined("angle.unitType = SVGAngle.SVG_ANGLETTYE_RAD");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");

debug("");
debug("Check setting valid 'valueInSpecifiedUnits' arguments, assure that 'value' and 'valueAsString' are synchronized");
shouldBe("angle.valueInSpecifiedUnits = 100", "100");
shouldBe("angle.value", "100");
shouldBeEqualToString("angle.valueAsString", "100deg");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");

debug("");
debug("Check setting valid 'valueAsString' arguments, assure that 'value' and 'valueInSpecifiedUnits' are synchronized");
shouldBeEqualToString("angle.valueAsString = '200grad'", "200grad");
shouldBe("angle.valueInSpecifiedUnits", "200");
shouldBeEqualToString("angle.value.toFixed(1)", "180.0");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_GRAD");

debug("");
debug("Now convert the GRAD value into a RAD value, and assure that all properties have been synchronized");
shouldBeUndefined("angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_RAD)");
shouldBeEqualToString("angle.value.toFixed(1)", "180.0");
shouldBeEqualToString("angle.valueInSpecifiedUnits.toFixed(5)", Math.PI.toFixed(5));
// Exact result of valueAsString depends on precision, no trivial way to correctly test it, especially across engines.
shouldBeEqualToString("angle.valueAsString.slice(-3)", "rad");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_RAD");

debug("");
debug("Now try converting the RAD value into an unknown value, that should fail and throw");
shouldThrow("angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_UNKNOWN)");
shouldBeEqualToString("angle.value.toFixed(1)", "180.0");
shouldBeEqualToString("angle.valueInSpecifiedUnits.toFixed(5)", Math.PI.toFixed(5));
// Exact result of valueAsString depends on precision, no trivial way to correctly test it, especially across engines.
shouldBeEqualToString("angle.valueAsString.slice(-3)", "rad");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_RAD");

debug("");
debug("Now convert the RAD value into a DEG value, and assure that all properties have been synchronized");
shouldBeUndefined("angle.convertToSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG)");
shouldBeEqualToString("angle.value.toFixed(1)", "180.0");
shouldBeEqualToString("angle.valueInSpecifiedUnits.toFixed(1)", "180.0");
shouldBeEqualToString("angle.valueAsString", "180deg");
shouldBe("angle.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");

successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
