[d565449] | 1 | /**
|
---|
| 2 | * @fileoverview jUnit Reporter
|
---|
| 3 | * @author Jamund Ferguson
|
---|
| 4 | */
|
---|
| 5 | "use strict";
|
---|
| 6 |
|
---|
| 7 | const xmlEscape = require("../xml-escape");
|
---|
| 8 | const path = require("path");
|
---|
| 9 |
|
---|
| 10 | //------------------------------------------------------------------------------
|
---|
| 11 | // Helper Functions
|
---|
| 12 | //------------------------------------------------------------------------------
|
---|
| 13 |
|
---|
| 14 | /**
|
---|
| 15 | * Returns the severity of warning or error
|
---|
| 16 | * @param {Object} message message object to examine
|
---|
| 17 | * @returns {string} severity level
|
---|
| 18 | * @private
|
---|
| 19 | */
|
---|
| 20 | function getMessageType(message) {
|
---|
| 21 | if (message.fatal || message.severity === 2) {
|
---|
| 22 | return "Error";
|
---|
| 23 | }
|
---|
| 24 | return "Warning";
|
---|
| 25 |
|
---|
| 26 | }
|
---|
| 27 |
|
---|
| 28 | /**
|
---|
| 29 | * Returns a full file path without extension
|
---|
| 30 | * @param {string} filePath input file path
|
---|
| 31 | * @returns {string} file path without extension
|
---|
| 32 | * @private
|
---|
| 33 | */
|
---|
| 34 | function pathWithoutExt(filePath) {
|
---|
| 35 | return path.join(path.dirname(filePath), path.basename(filePath, path.extname(filePath)));
|
---|
| 36 | }
|
---|
| 37 |
|
---|
| 38 | //------------------------------------------------------------------------------
|
---|
| 39 | // Public Interface
|
---|
| 40 | //------------------------------------------------------------------------------
|
---|
| 41 |
|
---|
| 42 | module.exports = function(results) {
|
---|
| 43 |
|
---|
| 44 | let output = "";
|
---|
| 45 |
|
---|
| 46 | output += "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
|
---|
| 47 | output += "<testsuites>\n";
|
---|
| 48 |
|
---|
| 49 | results.forEach(result => {
|
---|
| 50 |
|
---|
| 51 | const messages = result.messages;
|
---|
| 52 | const classname = pathWithoutExt(result.filePath);
|
---|
| 53 |
|
---|
| 54 | if (messages.length > 0) {
|
---|
| 55 | output += `<testsuite package="org.eslint" time="0" tests="${messages.length}" errors="${messages.length}" name="${result.filePath}">\n`;
|
---|
| 56 | messages.forEach(message => {
|
---|
| 57 | const type = message.fatal ? "error" : "failure";
|
---|
| 58 |
|
---|
| 59 | output += `<testcase time="0" name="org.eslint.${message.ruleId || "unknown"}" classname="${classname}">`;
|
---|
| 60 | output += `<${type} message="${xmlEscape(message.message || "")}">`;
|
---|
| 61 | output += "<![CDATA[";
|
---|
| 62 | output += `line ${message.line || 0}, col `;
|
---|
| 63 | output += `${message.column || 0}, ${getMessageType(message)}`;
|
---|
| 64 | output += ` - ${xmlEscape(message.message || "")}`;
|
---|
| 65 | output += (message.ruleId ? ` (${message.ruleId})` : "");
|
---|
| 66 | output += "]]>";
|
---|
| 67 | output += `</${type}>`;
|
---|
| 68 | output += "</testcase>\n";
|
---|
| 69 | });
|
---|
| 70 | output += "</testsuite>\n";
|
---|
| 71 | } else {
|
---|
| 72 | output += `<testsuite package="org.eslint" time="0" tests="1" errors="0" name="${result.filePath}">\n`;
|
---|
| 73 | output += `<testcase time="0" name="${result.filePath}" classname="${classname}" />\n`;
|
---|
| 74 | output += "</testsuite>\n";
|
---|
| 75 | }
|
---|
| 76 |
|
---|
| 77 | });
|
---|
| 78 |
|
---|
| 79 | output += "</testsuites>\n";
|
---|
| 80 |
|
---|
| 81 | return output;
|
---|
| 82 | };
|
---|