| /** |
| * @fileoverview jUnit Reporter |
| * @author Jamund Ferguson |
| */ |
| "use strict"; |
| |
| const xmlEscape = require("../xml-escape"); |
| const path = require("path"); |
| |
| //------------------------------------------------------------------------------ |
| // Helper Functions |
| //------------------------------------------------------------------------------ |
| |
| /** |
| * Returns the severity of warning or error |
| * @param {Object} message message object to examine |
| * @returns {string} severity level |
| * @private |
| */ |
| function getMessageType(message) { |
| if (message.fatal || message.severity === 2) { |
| return "Error"; |
| } |
| return "Warning"; |
| |
| } |
| |
| /** |
| * Returns a full file path without extension |
| * @param {string} filePath input file path |
| * @returns {string} file path without extension |
| * @private |
| */ |
| function pathWithoutExt(filePath) { |
| return path.posix.join(path.posix.dirname(filePath), path.basename(filePath, path.extname(filePath))); |
| } |
| |
| //------------------------------------------------------------------------------ |
| // Public Interface |
| //------------------------------------------------------------------------------ |
| |
| module.exports = function(results) { |
| |
| let output = ""; |
| |
| output += "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; |
| output += "<testsuites>\n"; |
| |
| results.forEach(result => { |
| |
| const messages = result.messages; |
| const classname = pathWithoutExt(result.filePath); |
| |
| if (messages.length > 0) { |
| output += `<testsuite package="org.eslint" time="0" tests="${messages.length}" errors="${messages.length}" name="${result.filePath}">\n`; |
| messages.forEach(message => { |
| const type = message.fatal ? "error" : "failure"; |
| |
| output += `<testcase time="0" name="org.eslint.${message.ruleId || "unknown"}" classname="${classname}">`; |
| output += `<${type} message="${xmlEscape(message.message || "")}">`; |
| output += "<![CDATA["; |
| output += `line ${message.line || 0}, col `; |
| output += `${message.column || 0}, ${getMessageType(message)}`; |
| output += ` - ${xmlEscape(message.message || "")}`; |
| output += (message.ruleId ? ` (${message.ruleId})` : ""); |
| output += "]]>"; |
| output += `</${type}>`; |
| output += "</testcase>\n"; |
| }); |
| output += "</testsuite>\n"; |
| } else { |
| output += `<testsuite package="org.eslint" time="0" tests="1" errors="0" name="${result.filePath}">\n`; |
| output += `<testcase time="0" name="${result.filePath}" classname="${classname}" />\n`; |
| output += "</testsuite>\n"; |
| } |
| |
| }); |
| |
| output += "</testsuites>\n"; |
| |
| return output; |
| }; |