83 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @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;
 | 
						|
};
 |