diff --git a/README.md b/README.md index b81a84e5649c5..4902b89b0d133 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ +# Browser Test Stats + +|Firefox|Chromium|WebKit|all| +|---|---|---|---| +|511/650|698/705|325/653|309/650| + # Contributing diff --git a/test/stats.js b/test/stats.js new file mode 100644 index 0000000000000..7053ba1f9403f --- /dev/null +++ b/test/stats.js @@ -0,0 +1,69 @@ +const path = require('path'); +const {TestRunner} = require('../utils/testrunner/'); +const utils = require('./utils'); +const {addTests} = require('./playwright.spec.js'); +const firefoxTests = testsForProduct('Firefox'); +const chromiumTests = testsForProduct('Chromium'); +const webkitTests = testsForProduct('WebKit'); +const goalSuite = intersectSets(firefoxTests.all, chromiumTests.all, webkitTests.all); +const skippedSuite = intersectSets(goalSuite, joinSets(firefoxTests.skipped, chromiumTests.skipped, webkitTests.skipped)); + +module.exports = { + firefox: { + total: firefoxTests.all.size, + skipped: firefoxTests.skipped.size, + }, + chromium: { + total: chromiumTests.all.size, + skipped: chromiumTests.skipped.size, + }, + webkit: { + total: webkitTests.all.size, + skipped: webkitTests.skipped.size, + }, + all: { + total: goalSuite.size, + skipped: skippedSuite.size, + } +}; + +/** + * @param {string} product + */ +function testsForProduct(product) { + const testRunner = new TestRunner(); + addTests({ + product, + playwrightPath: path.join(utils.projectRoot(), `${product.toLowerCase()}.js`), + testRunner + }); + return { + all: new Set(testRunner.tests().map(test => test.fullName)), + skipped: new Set(testRunner.tests().filter(test => test.declaredMode === 'skip').map(test => test.fullName)) + } +} + +/** + * @param {...Set} sets + */ +function intersectSets(...sets) { + if (!sets.length) + return new Set(); + const intersect = new Set(); + const [first, ...rest] = sets; + outer: for (const item of first) { + for (const set of rest) + if (!set.has(item)) + continue outer; + intersect.add(item); + } + return intersect; +} + +function joinSets(...sets) { + const joined = new Set(); + for (const set of sets) + for (const item of set) + joined.add(item); + return joined; +} \ No newline at end of file diff --git a/utils/doclint/preprocessor/index.js b/utils/doclint/preprocessor/index.js index 2b0b506338c72..e02607f646844 100644 --- a/utils/doclint/preprocessor/index.js +++ b/utils/doclint/preprocessor/index.js @@ -70,6 +70,8 @@ module.exports.runCommands = function(sources, version) { newText = isReleaseVersion ? '' : command.originalText; else if (command.name === 'toc') newText = generateTableOfContents(command.source.text().substring(command.to)); + else if (command.name === 'test-stats') + newText = generateTestStats(); if (newText === null) messages.push(Message.error(`Unknown command 'gen:${command.name}'`)); else if (applyCommand(command, newText)) @@ -91,6 +93,19 @@ function applyCommand(command, editText) { return command.source.setText(newText); } +function generateTestStats() { + const stats = require('../../../test/stats'); + return ` +|Firefox|Chromium|WebKit|all| +|---|---|---|---| +|${s('firefox')}|${s('chromium')}|${s('webkit')}|${s('all')}| +`; + function s(product) { + const {total, skipped} = stats[product]; + return `${total-skipped}/${total}`; + } +} + function generateTableOfContents(mdText) { const ids = new Set(); const titles = [];