<!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_exists(SVGAngle, str, "");
	}, "SVGAngle." + str);
}
for(var constant in nonexposedunitconstants) {
	var str = "SVG_ANGLETYPE_" + constant;
	test(function() {
		assert_not_exists(SVGAngle, str, "");
	}, "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>
