<!doctype html>
<title>SVGAngle tests</title>
<script src=../../resources/testharness.js></script>
<script src=../../resources/testharnessreport.js></script>
<div id="testcontainer">
<svg width="1" height="1" visibility="hidden">
<defs><marker/></defs>
</svg>
</div>
<div id=log></div>
<script>
var svg = document.querySelector("svg");
var marker = document.querySelector("marker");
var EPSILON = Math.pow(2, -8);
var angles = [ 10, 0, 360, 500, 90, 180, 45, 25.9, 145, 270, 0.5, 0.2, 1.37, 3.14159 /* Math.PI */, 0.523599 /* Math.PI/6 */ ];
var units = {
"" : 1,
"deg": 2,
"rad": 3,
"grad": 4,
"turn": 5
};
var highestExposedUnit = 4; // SVG_ANGLETYPE_GRAD
var unitconstants = {
"UNKNOWN" : 0,
"UNSPECIFIED": 1,
"DEG": 2,
"RAD": 3,
"GRAD": 4,
};
var nonexposedunitconstants = {
"TURN": 5
};
function convertTo(value, unit, outunit) {
switch(unit) {
case "":
case "deg":
switch(outunit) {
case "":
case "deg":
return value;
case "rad":
return value*(Math.PI/180);
case "grad":
return value*(400/360);
case "turn":
return value/360;
}
case "rad":
switch(outunit) {
case "":
case "deg":
return value * 180 / Math.PI;
case "rad":
return value;
case "grad":
return value * 180 / Math.PI * 400 / 360;
case "turn":
return value / (2 * Math.PI);
}
case "grad":
switch(outunit) {
case "":
case "deg":
return value * 360 / 400;
case "rad":
return value * Math.PI * 2 / 400;
case "grad":
return value;
case "turn":
return value / 400;
}
case "turn":
switch(outunit) {
case "":
case "deg":
return value * 360;
case "rad":
return value * Math.PI * 2;
case "grad":
return value * 400;
case "turn":
return value;
}
}
}
function createAngle(valuestr) {
var angle = svg.createSVGAngle();
angle.valueAsString = valuestr;
return angle;
}
for(var unit in units) {
test(function() {
var result = undefined;
try {
var a = createAngle(47 + unit);
result = a.unitType;
}
catch(e) {}
if (units[unit] > highestExposedUnit)
assert_equals(result, undefined);
else
assert_equals(result, units[unit]);
}, "SVGAngle(47" + unit + ").unitType");
}
for(var constant in unitconstants) {
var str = "SVG_ANGLETYPE_" + constant;
test(function() {
assert_own_property(SVGAngle, str);
}, "SVGAngle." + str);
}
for(var constant in nonexposedunitconstants) {
var str = "SVG_ANGLETYPE_" + constant;
test(function() {
assert_false(str in SVGAngle);
}, "SVGAngle." + str);
}
angles.forEach(function(angle) {
for(var unit in units) {
var anglestr = angle + unit;
var ref;
try {
ref = createAngle(anglestr);
}
catch(e) {
continue;
}
test(function() {
assert_approx_equals(angle, ref.valueInSpecifiedUnits, EPSILON);
}, "SVGAngle(" + anglestr + ").valueInSpecifiedUnits");
try {
marker.setAttribute("orient", anglestr);
test(function() {
assert_equals(marker.orientAngle.baseVal.valueAsString, anglestr);
}, "orient=\"" + anglestr + "\".valueAsString");
test(function() {
assert_approx_equals(marker.orientAngle.baseVal.value, convertTo(angle, unit, "deg"), EPSILON);
}, "orient=\"" + anglestr + "\".value");
}
finally {
marker.removeAttribute("orient");
}
for (var otherunit in units) {
test(function() {
var a = createAngle(anglestr);
try {
a.convertToSpecifiedUnits(units[otherunit]);
}
catch(e) {}
// unknown unit
if (units[otherunit] > highestExposedUnit)
assert_approx_equals(a.valueInSpecifiedUnits, angle, EPSILON);
else
assert_approx_equals(a.valueInSpecifiedUnits, convertTo(angle, unit, otherunit), EPSILON);
}, "SVGAngle(" + anglestr + ").convertToSpecifiedUnits(" + units[otherunit] + " /*" + (otherunit ? otherunit : "unspecified") + "*/)");
test(function() {
var result = "";
try {
var a = createAngle(47 + otherunit);
a.newValueSpecifiedUnits(units[unit], angle);
result = a.valueAsString;
}
catch(e) {
}
// unknown unit
if (units[unit] > highestExposedUnit || units[otherunit] > highestExposedUnit)
assert_equals(result, "");
else
assert_equals(result, ref.valueAsString);
}, "SVGAngle(47" + otherunit + ").newValueSpecifiedUnits(" + units[unit] + ", " + angle + ")");
};
}
});
</script>