"use strict" ; module /**
 * Module dependencies.
 */ var Base = require ( "./base" ) ; var utils = require ( "../utils" ) ; var fs = require ( "fs" ) ; var path = require ( "path" ) ; var errors = require ( "../errors" ) ; var createUnsupportedError = errors . createUnsupportedError ; var constants = require ( "../runner" ) . default . constants ; var EVENT_TEST_PASS = constants . EVENT_TEST_PASS ; var EVENT_TEST_FAIL = constants . EVENT_TEST_FAIL ; var EVENT_RUN_END = constants . EVENT_RUN_END ; var EVENT_TEST_PENDING = constants . EVENT_TEST_PENDING ; var STATE_FAILED = require ( "../runnable" ) . default . constants . STATE_FAILED ; var inherits = utils . inherits ; var escape = utils . escape ; /**
 * Save timer references to avoid Sinon interfering (see GH-237).
 */ var Date = global . Date ; /**
 * Expose `XUnit`.
 */ exports = module . exports = XUnit ; public class memberof extends Mocha . reporters . Base param { Runner } runner param { Object } options function XUnit ( runner , options ) { Base . call ( this , runner , options ) ; var stats = this . stats ; var tests = [ ] ; var self = this ; var suiteName ; var DEFAULT_SUITE_NAME = "Mocha Tests" ; if ( options && options . reporterOptions ) { if ( options . reporterOptions . output ) { if ( ! fs . createWriteStream ) { throw createUnsupportedError ( "file output not supported in browser" ) ; } fs . mkdirSync ( path . dirname ( options . reporterOptions . output ) , { recursive : true , } ) ; self . fileStream = fs . createWriteStream ( options . reporterOptions . output ) ; } suiteName = options . reporterOptions . suiteName ; } suiteName = suiteName || DEFAULT_SUITE_NAME ; runner . on ( EVENT_TEST_PENDING , function ( test ) { tests . push ( test ) ; } ) ; runner . on ( EVENT_TEST_PASS , function ( test ) { tests . push ( test ) ; } ) ; runner . on ( EVENT_TEST_FAIL , function ( test ) { tests . push ( test ) ; } ) ; runner . once ( EVENT_RUN_END , function ( ) { self . write ( tag ( "testsuite" , { name : suiteName , tests : stats . tests , failures : 0 , errors : stats . failures , skipped : stats . tests - stats . failures - stats . passes , timestamp : new Date ( ) . toUTCString ( ) , time : stats . duration / 1000 || 0 , } , false ) ) ; tests . forEach ( function ( t ) { self . test ( t ) ; } ) ; self . write ( "</testsuite>" ) ; } ) ; } /**
 * Inherit from `Base.prototype`.
 */ inherits ( XUnit , Base ) ; param failures param { Function } fn XUnit . prototype . done = function ( failures , fn ) { if ( this . fileStream ) { this . fileStream . end ( function ( ) { fn ( failures ) ; } ) ; } else { fn ( failures ) ; } } ; param { string } line XUnit . prototype . write = function ( line ) { if ( this . fileStream ) { this . fileStream . write ( line + "\n" ) ; } else if ( typeof process === "object" && process . stdout ) { process . stdout . write ( line + "\n" ) ; } else { Base . consoleLog ( line ) ; } } ; param { Test } test XUnit . prototype . test = function ( test ) { Base . useColors = false ; var attrs = { classname : test . parent . fullTitle ( ) , name : test . title , time : test . duration / 1000 || 0 , } ; if ( test . state === STATE_FAILED ) { var err = test . err ; var diff = ! Base . hideDiff && Base . showDiff ( err ) ? "\n" + Base . generateDiff ( err . actual , err . expected ) : "" ; this . write ( tag ( "testcase" , attrs , false , tag ( "failure" , { } , false , escape ( err . message ) + escape ( diff ) + "\n" + escape ( err . stack ) ) ) ) ; } else if ( test . isPending ( ) ) { this . write ( tag ( "testcase" , attrs , false , tag ( "skipped" , { } , true ) ) ) ; } else { this . write ( tag ( "testcase" , attrs , true ) ) ; } } ; param name param attrs param close param content return { string } function tag ( name , attrs , close , content ) { var end = close ? "/>" : ">" ; var pairs = [ ] ; var tag ; for ( var key in attrs ) { if ( Object . prototype . hasOwnProperty . call ( attrs , key ) ) { pairs . push ( key + '="' + escape ( attrs [ key ] ) + '"' ) ; } } tag = "<" + name + ( pairs . length ? " " + pairs . join ( " " ) : "" ) + end ; if ( content ) { tag += content + "</" + name + end ; } return tag ; } XUnit . description = "XUnit-compatible XML output" ;