rooibos-roku
Version:
simple, flexible, fun brightscript test framework for roku scenegraph apps - roku brighterscript plugin
230 lines • 9.32 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RooibosPlugin = void 0;
const brighterscript_1 = require("brighterscript");
const RooibosSession_1 = require("./lib/rooibos/RooibosSession");
const CodeCoverageProcessor_1 = require("./lib/rooibos/CodeCoverageProcessor");
const FileFactory_1 = require("./lib/rooibos/FileFactory");
const minimatch = require("minimatch");
const path = require("path");
const MockUtil_1 = require("./lib/rooibos/MockUtil");
const Utils_1 = require("./lib/rooibos/Utils");
class RooibosPlugin {
constructor() {
this.name = 'rooibosPlugin';
}
beforeProgramCreate(builder) {
this._builder = builder;
this.config = this.getConfig(builder.options.rooibos || {});
this.fileFactory = new FileFactory_1.FileFactory();
if (!this.session) {
this.session = new RooibosSession_1.RooibosSession(builder, this.fileFactory);
this.codeCoverageProcessor = new CodeCoverageProcessor_1.CodeCoverageProcessor(builder, this.fileFactory);
this.mockUtil = new MockUtil_1.MockUtil(builder, this.fileFactory, this.session);
}
}
getConfig(options) {
let config = options;
if (config.printTestTimes === undefined) {
config.printTestTimes = true;
}
if (config.catchCrashes === undefined) {
config.catchCrashes = true;
}
if (config.colorizeOutput === undefined) {
config.colorizeOutput = false;
}
if (config.throwOnFailedAssertion === undefined) {
config.throwOnFailedAssertion = false;
}
if (config.sendHomeOnFinish === undefined) {
config.sendHomeOnFinish = true;
}
if (config.failFast === undefined) {
config.failFast = true;
}
if (config.showOnlyFailures === undefined) {
config.showOnlyFailures = true;
}
if (config.isRecordingCodeCoverage === undefined) {
config.isRecordingCodeCoverage = false;
}
if (config.isGlobalMethodMockingEnabled === undefined) {
config.isGlobalMethodMockingEnabled = false;
}
if (config.isGlobalMethodMockingEfficientMode === undefined) {
config.isGlobalMethodMockingEfficientMode = true;
}
if (config.keepAppOpen === undefined) {
config.keepAppOpen = true;
}
if (config.testSceneName === undefined) {
config.testSceneName = 'RooibosScene';
}
//ignore roku modules by default
if (config.includeFilters === undefined) {
config.includeFilters = [
'**/*.spec.bs',
'!**/BaseTestSuite.spec.bs',
'!**/roku_modules/**/*'
];
}
const defaultCoverageExcluded = [
'**/*.spec.bs',
'**/roku_modules/**/*',
'**/source/main.bs',
'**/source/rooibos/**/*'
];
// Set default coverage exclusions, or merge with defaults if available.
if (config.coverageExcludedFiles === undefined) {
config.coverageExcludedFiles = defaultCoverageExcluded;
}
else {
config.coverageExcludedFiles.push(...defaultCoverageExcluded);
}
const defaultGlobalMethodMockingExcluded = [
'**/*.spec.bs',
'**/source/main.bs',
'**/source/rooibos/**/*'
];
if (config.globalMethodMockingExcludedFiles === undefined) {
config.globalMethodMockingExcludedFiles = defaultGlobalMethodMockingExcluded;
}
return config;
}
afterProgramCreate(program) {
this.fileFactory.addFrameworkFiles(program);
}
afterFileDispose(file) {
// eslint-disable-next-line @typescript-eslint/dot-notation
const xmlFile = file['rooibosXmlFile'];
if (xmlFile) {
// Remove the old generated xml files
this._builder.program.removeFile(xmlFile.srcPath);
}
}
afterFileParse(file) {
// console.log('afp', file.pkgPath);
if (file.pathAbsolute.includes('/rooibos/bsc-plugin/dist/framework')) {
// eslint-disable-next-line @typescript-eslint/dot-notation
file['diagnostics'] = [];
return;
}
if (this.fileFactory.isIgnoredFile(file) || !this.shouldSearchInFileForTests(file)) {
return;
}
// console.log('processing ', file.pkgPath);
if ((0, brighterscript_1.isBrsFile)(file)) {
// Add the node test component so brighter script can validate the test files
let suites = this.session.processFile(file);
let nodeSuites = suites.filter((ts) => ts.isNodeTest);
for (const suite of nodeSuites) {
const xmlFile = this._builder.program.setFile({
src: path.resolve(suite.xmlPkgPath),
dest: suite.xmlPkgPath
}, this.session.getNodeTestXmlText(suite));
// eslint-disable-next-line @typescript-eslint/dot-notation
file['rooibosXmlFile'] = xmlFile;
}
}
}
beforeProgramTranspile(program, entries, editor) {
this.session.prepareForTranspile(editor, program, this.mockUtil);
}
afterProgramTranspile(program, entries, editor) {
this.session.addLaunchHookFileIfNotPresent();
this.codeCoverageProcessor.generateMetadata(this.config.isRecordingCodeCoverage, program);
}
beforeFileTranspile(event) {
let testSuite = this.session.sessionInfo.testSuitesToRun.find((ts) => ts.file.pkgPath === event.file.pkgPath);
if (testSuite) {
const scope = (0, Utils_1.getScopeForSuite)(testSuite);
let noEarlyExit = testSuite.annotation.noEarlyExit;
if (noEarlyExit) {
console.warn(`WARNING: testSuite "${testSuite.name}" is marked as noEarlyExit`);
}
const modifiedTestCases = new Set();
testSuite.addDataFunctions(event.editor);
for (let group of [...testSuite.testGroups.values()].filter((tg) => tg.isIncluded)) {
for (let testCase of [...group.testCases].filter((tc) => tc.isIncluded)) {
let caseName = group.testSuite.generatedNodeName + group.file.pkgPath + testCase.funcName;
if (!modifiedTestCases.has(caseName)) {
group.modifyAssertions(testCase, noEarlyExit, event.editor, this.session.namespaceLookup, scope);
modifiedTestCases.add(caseName);
}
}
}
}
if ((0, brighterscript_1.isBrsFile)(event.file)) {
if (this.shouldAddCodeCoverageToFile(event.file)) {
this.codeCoverageProcessor.addCodeCoverage(event.file, event.editor);
}
if (this.shouldEnableGlobalMocksOnFile(event.file)) {
this.mockUtil.enableGlobalMethodMocks(event.file, event.editor);
}
}
}
afterProgramValidate(program) {
// console.log('bpv');
this.session.updateSessionStats();
for (let testSuite of [...this.session.sessionInfo.testSuites.values()]) {
testSuite.validate();
}
for (let file of this.fileFactory.addedFrameworkFiles) {
// eslint-disable-next-line @typescript-eslint/dot-notation
file['diagnostics'] = [];
}
}
shouldSearchInFileForTests(file) {
if (!this.config.includeFilters || this.config.includeFilters.length === 0) {
return true;
}
else {
for (let filter of this.config.includeFilters) {
if (!minimatch(file.pathAbsolute, filter, { dot: true })) {
return false;
}
}
}
// console.log('including ', file.pkgPath);
return true;
}
shouldAddCodeCoverageToFile(file) {
if (!(0, brighterscript_1.isBrsFile)(file) || !this.config.isRecordingCodeCoverage) {
return false;
}
else if (!this.config.coverageExcludedFiles) {
return true;
}
else {
for (let filter of this.config.coverageExcludedFiles) {
if (minimatch(file.pkgPath, filter, { dot: true })) {
return false;
}
}
}
return true;
}
shouldEnableGlobalMocksOnFile(file) {
if (!(0, brighterscript_1.isBrsFile)(file) || !this.config.isGlobalMethodMockingEnabled) {
return false;
}
else if (!this.config.globalMethodMockingExcludedFiles) {
return true;
}
else {
for (let filter of this.config.globalMethodMockingExcludedFiles) {
if (minimatch(file.pkgPath, filter, { dot: true })) {
// console.log('±±±skipping file', file.pkgPath);
return false;
}
}
}
return true;
}
}
exports.RooibosPlugin = RooibosPlugin;
exports.default = () => {
return new RooibosPlugin();
};
//# sourceMappingURL=plugin.js.map