| /** | 
|  * @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.join(path.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; | 
| }; |