TestFormat.js revision 0b5e1d37b52292808888e5c0674f90c2bbc3c210
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney Y.namespace("Test.Format");
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney /* (intentionally not documented)
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney * Basic XML escaping method. Replaces quotes, less-than, greater-than,
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney * apostrophe, and ampersand characters with their corresponding entities.
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney * @param {String} text The text to encode.
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney * @return {String} The XML-escaped text.
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney */
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney function xmlEscape(text){
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney return text.replace(/[<>"'&]/g, function(value){
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney switch(value){
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney case "<": return "&lt;";
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney case ">": return "&gt;";
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney case "\"": return "&quot;";
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney case "'": return "&apos;";
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney case "&": return "&amp;";
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney }
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney });
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney }
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney
fb1ecdf65fd4106deb62da339763f2e7670ca0f6Matt Sweeney /**
* Returns test results formatted as a JSON string. Requires JSON utility.
* @param {Object} result The results object created by TestRunner.
* @return {String} A JSON-formatted string of results.
* @namespace Test.Format
* @method JSON
* @static
*/
Y.Test.Format.JSON = function(results) {
return Y.JSON.stringify(results);
};
/**
* Returns test results formatted as an XML string.
* @param {Object} result The results object created by TestRunner.
* @return {String} An XML-formatted string of results.
* @namespace Test.Format
* @method XML
* @static
*/
Y.Test.Format.XML = function(results) {
var l = Y.Lang;
var xml = "<" + results.type + " name=\"" + xmlEscape(results.name) + "\"";
if (results.type == "test"){
xml += " result=\"" + xmlEscape(results.result) + "\" message=\"" + xmlEscape(results.message) + "\">";
} else {
xml += " passed=\"" + results.passed + "\" failed=\"" + results.failed + "\" ignored=\"" + results.ignored + "\" total=\"" + results.total + "\">";
Y.Object.each(results, function(value, prop){
if (l.isObject(value) && !l.isArray(value)){
xml += arguments.callee(value);
}
});
}
xml += "</" + results.type + ">";
return xml;
};
/**
* Returns test results formatted as an XML string.
* @param {Object} result The results object created by TestRunner.
* @return {String} An XML-formatted string of results.
* @namespace Test.Format
* @method XML
* @static
*/
Y.Test.Format.XML = function(results) {
function serializeToXML(results){
var l = Y.Lang,
xml = "<" + results.type + " name=\"" + xmlEscape(results.name) + "\"";
if (l.isNumber(results.duration)){
xml += " duration=\"" + results.duration + "\"";
}
if (results.type == "test"){
xml += " result=\"" + results.result + "\" message=\"" + xmlEscape(results.message) + "\">";
} else {
xml += " passed=\"" + results.passed + "\" failed=\"" + results.failed + "\" ignored=\"" + results.ignored + "\" total=\"" + results.total + "\">";
Y.Object.each(results, function(value, prop){
if (l.isObject(value) && !l.isArray(value)){
xml += serializeToXML(value);
}
});
}
xml += "</" + results.type + ">";
return xml;
}
return "<?xml version=\"1.0\" charset=\"UTF-8\"?>" + serializeToXML(results);
};
/**
* Returns test results formatted in JUnit XML format.
* @param {Object} result The results object created by TestRunner.
* @return {String} An XML-formatted string of results.
* @namespace Test.Format
* @method JUnitXML
* @static
*/
Y.Test.Format.JUnitXML = function(results) {
function serializeToJUnitXML(results){
var l = Y.Lang,
xml = "",
prop;
switch (results.type){
//equivalent to testcase in JUnit
case "test":
if (results.result != "ignore"){
xml = "<testcase name=\"" + xmlEscape(results.name) + "\">";
if (results.result == "fail"){
xml += "<failure message=\"" + xmlEscape(results.message) + "\"><![CDATA[" + results.message + "]]></failure>";
}
xml+= "</testcase>";
}
break;
//equivalent to testsuite in JUnit
case "testcase":
xml = "<testsuite name=\"" + xmlEscape(results.name) + "\" tests=\"" + results.total + "\" failures=\"" + results.failed + "\">";
Y.Object.each(results, function(value, prop){
if (l.isObject(value) && !l.isArray(value)){
xml += serializeToJUnitXML(value);
}
});
xml += "</testsuite>";
break;
case "testsuite":
Y.Object.each(results, function(value, prop){
if (l.isObject(value) && !l.isArray(value)){
xml += serializeToJUnitXML(value);
}
});
//skip output - no JUnit equivalent
break;
case "report":
xml = "<testsuites>";
Y.Object.each(results, function(value, prop){
if (l.isObject(value) && !l.isArray(value)){
xml += serializeToJUnitXML(value);
}
});
xml += "</testsuites>";
//no default
}
return xml;
}
return "<?xml version=\"1.0\" charset=\"UTF-8\"?>" + serializeToJUnitXML(results);
};