Spaces:
Sleeping
Sleeping
; | |
Object.defineProperty(exports, '__esModule', { | |
value: true | |
}); | |
exports.default = void 0; | |
function _chalk() { | |
const data = _interopRequireDefault(require('chalk')); | |
_chalk = function () { | |
return data; | |
}; | |
return data; | |
} | |
function _stringLength() { | |
const data = _interopRequireDefault(require('string-length')); | |
_stringLength = function () { | |
return data; | |
}; | |
return data; | |
} | |
var _utils = require('./utils'); | |
function _interopRequireDefault(obj) { | |
return obj && obj.__esModule ? obj : {default: obj}; | |
} | |
function _defineProperty(obj, key, value) { | |
if (key in obj) { | |
Object.defineProperty(obj, key, { | |
value: value, | |
enumerable: true, | |
configurable: true, | |
writable: true | |
}); | |
} else { | |
obj[key] = value; | |
} | |
return obj; | |
} | |
const RUNNING_TEXT = ' RUNS '; | |
const RUNNING = _chalk().default.reset.inverse.yellow.bold(RUNNING_TEXT) + ' '; | |
/** | |
* This class is a perf optimization for sorting the list of currently | |
* running tests. It tries to keep tests in the same positions without | |
* shifting the whole list. | |
*/ | |
class CurrentTestList { | |
constructor() { | |
_defineProperty(this, '_array', void 0); | |
this._array = []; | |
} | |
add(testPath, config) { | |
const index = this._array.indexOf(null); | |
const record = { | |
config, | |
testPath | |
}; | |
if (index !== -1) { | |
this._array[index] = record; | |
} else { | |
this._array.push(record); | |
} | |
} | |
delete(testPath) { | |
const record = this._array.find( | |
record => record !== null && record.testPath === testPath | |
); | |
this._array[this._array.indexOf(record || null)] = null; | |
} | |
get() { | |
return this._array; | |
} | |
} | |
/** | |
* A class that generates the CLI status of currently running tests | |
* and also provides an ANSI escape sequence to remove status lines | |
* from the terminal. | |
*/ | |
class Status { | |
constructor() { | |
_defineProperty(this, '_cache', void 0); | |
_defineProperty(this, '_callback', void 0); | |
_defineProperty(this, '_currentTests', void 0); | |
_defineProperty(this, '_currentTestCases', void 0); | |
_defineProperty(this, '_done', void 0); | |
_defineProperty(this, '_emitScheduled', void 0); | |
_defineProperty(this, '_estimatedTime', void 0); | |
_defineProperty(this, '_interval', void 0); | |
_defineProperty(this, '_aggregatedResults', void 0); | |
_defineProperty(this, '_showStatus', void 0); | |
this._cache = null; | |
this._currentTests = new CurrentTestList(); | |
this._currentTestCases = []; | |
this._done = false; | |
this._emitScheduled = false; | |
this._estimatedTime = 0; | |
this._showStatus = false; | |
} | |
onChange(callback) { | |
this._callback = callback; | |
} | |
runStarted(aggregatedResults, options) { | |
this._estimatedTime = (options && options.estimatedTime) || 0; | |
this._showStatus = options && options.showStatus; | |
this._interval = setInterval(() => this._tick(), 1000); | |
this._aggregatedResults = aggregatedResults; | |
this._debouncedEmit(); | |
} | |
runFinished() { | |
this._done = true; | |
if (this._interval) clearInterval(this._interval); | |
this._emit(); | |
} | |
addTestCaseResult(test, testCaseResult) { | |
this._currentTestCases.push({ | |
test, | |
testCaseResult | |
}); | |
if (!this._showStatus) { | |
this._emit(); | |
} else { | |
this._debouncedEmit(); | |
} | |
} | |
testStarted(testPath, config) { | |
this._currentTests.add(testPath, config); | |
if (!this._showStatus) { | |
this._emit(); | |
} else { | |
this._debouncedEmit(); | |
} | |
} | |
testFinished(_config, testResult, aggregatedResults) { | |
const {testFilePath} = testResult; | |
this._aggregatedResults = aggregatedResults; | |
this._currentTests.delete(testFilePath); | |
this._currentTestCases = this._currentTestCases.filter(({test}) => { | |
if (_config !== test.context.config) { | |
return true; | |
} | |
return test.path !== testFilePath; | |
}); | |
this._debouncedEmit(); | |
} | |
get() { | |
if (this._cache) { | |
return this._cache; | |
} | |
if (this._done) { | |
return { | |
clear: '', | |
content: '' | |
}; | |
} | |
const width = process.stdout.columns; | |
let content = '\n'; | |
this._currentTests.get().forEach(record => { | |
if (record) { | |
const {config, testPath} = record; | |
const projectDisplayName = config.displayName | |
? (0, _utils.printDisplayName)(config) + ' ' | |
: ''; | |
const prefix = RUNNING + projectDisplayName; | |
content += | |
(0, _utils.wrapAnsiString)( | |
prefix + | |
(0, _utils.trimAndFormatPath)( | |
(0, _stringLength().default)(prefix), | |
config, | |
testPath, | |
width | |
), | |
width | |
) + '\n'; | |
} | |
}); | |
if (this._showStatus && this._aggregatedResults) { | |
content += | |
'\n' + | |
(0, _utils.getSummary)(this._aggregatedResults, { | |
currentTestCases: this._currentTestCases, | |
estimatedTime: this._estimatedTime, | |
roundTime: true, | |
width | |
}); | |
} | |
let height = 0; | |
for (let i = 0; i < content.length; i++) { | |
if (content[i] === '\n') { | |
height++; | |
} | |
} | |
const clear = '\r\x1B[K\r\x1B[1A'.repeat(height); | |
return (this._cache = { | |
clear, | |
content | |
}); | |
} | |
_emit() { | |
this._cache = null; | |
if (this._callback) this._callback(); | |
} | |
_debouncedEmit() { | |
if (!this._emitScheduled) { | |
// Perf optimization to avoid two separate renders When | |
// one test finishes and another test starts executing. | |
this._emitScheduled = true; | |
setTimeout(() => { | |
this._emit(); | |
this._emitScheduled = false; | |
}, 100); | |
} | |
} | |
_tick() { | |
this._debouncedEmit(); | |
} | |
} | |
exports.default = Status; | |