blob: d8050abf72576012bc6cb1969749de24a726e00a [file] [log] [blame]
{"version":3,"file":"threshold.js","sourceRoot":"","sources":["../../src/istanbul/threshold.ts"],"names":[],"mappings":"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","sourcesContent":["import * as istanbul from \"istanbul\";\nimport { merge } from \"lodash\";\nimport { Logger } from \"log4js\";\nimport * as minimatch from \"minimatch\";\nimport { Configuration } from \"../shared/configuration\";\nimport { FileUtils } from \"../shared/file-utils\";\n\nexport class Threshold {\n\n constructor(private config: Configuration, private log: Logger) {\n }\n\n public check(browser: any, collector: any) {\n\n const thresholdConfig = this.config.coverageOptions.threshold;\n const finalCoverage = collector.getFinalCoverage();\n const globalCoverage = this.excludeFiles(finalCoverage, thresholdConfig.global.excludes);\n const globalResults = (istanbul.utils as any).summarizeCoverage(globalCoverage);\n let passedThreshold = true;\n\n const checkThresholds = (name: string, thresholds: any, results: any) => {\n\n [\"branches\", \"functions\", \"lines\", \"statements\"].forEach((key) => {\n\n const result = results[key];\n const uncovered = result.total - result.covered;\n const threshold = thresholds[key];\n\n if (threshold < 0 && threshold * -1 < uncovered) {\n passedThreshold = false;\n this.log.error(\"%s: Expected max %s uncovered %s, got %s (%s)\",\n browser.name, (-1 * threshold), key, uncovered, name);\n }\n else if (result.pct < threshold) {\n passedThreshold = false;\n this.log.error(\"%s: Expected %s% coverage for %s, got %s% (%s)\",\n browser.name, threshold, key, result.pct, name);\n }\n });\n };\n\n checkThresholds(\"global\", thresholdConfig.global, globalResults);\n\n Object.keys(finalCoverage).forEach((filename) => {\n\n const relativeFilename = FileUtils.getRelativePath(filename, this.config.karma.basePath);\n const excludes = this.config.coverageOptions.threshold.file.excludes;\n\n if (!this.isExcluded(relativeFilename, excludes)) {\n const fileResult = (istanbul.utils as any).summarizeFileCoverage(finalCoverage[filename]);\n const thresholds = merge(thresholdConfig.file, this.getFileOverrides(relativeFilename));\n checkThresholds(filename, thresholds, fileResult);\n }\n });\n\n return passedThreshold;\n }\n\n private excludeFiles(coverage: any, excludes: string[]) {\n const result: { [key: string]: any } = {};\n Object.keys(coverage).forEach((filename) => {\n if (!this.isExcluded(FileUtils.getRelativePath(filename, this.config.karma.basePath), excludes)) {\n result[filename] = coverage[filename];\n }\n });\n return result;\n }\n\n private isExcluded(relativeFilename: string, excludes: string[]) {\n return excludes.some((pattern) => {\n return minimatch(relativeFilename, pattern, { dot: true });\n });\n }\n\n private getFileOverrides(relativeFilename: string) {\n let thresholds = {};\n const overrides = this.config.coverageOptions.threshold.file.overrides;\n Object.keys(overrides).forEach((pattern) => {\n if (minimatch(relativeFilename, pattern, { dot: true })) {\n thresholds = overrides[pattern];\n }\n });\n return thresholds;\n }\n}\n"]}