UNPKG

rooibos-roku

Version:

simple, flexible, fun brightscript test framework for roku scenegraph apps - roku brighterscript plugin

230 lines 9.32 kB
"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