summaryrefslogtreecommitdiffstats
path: root/remote/test/puppeteer/tools/sort-test-expectations.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'remote/test/puppeteer/tools/sort-test-expectations.mjs')
-rw-r--r--remote/test/puppeteer/tools/sort-test-expectations.mjs94
1 files changed, 93 insertions, 1 deletions
diff --git a/remote/test/puppeteer/tools/sort-test-expectations.mjs b/remote/test/puppeteer/tools/sort-test-expectations.mjs
index d1c8588d8a..972d244874 100644
--- a/remote/test/puppeteer/tools/sort-test-expectations.mjs
+++ b/remote/test/puppeteer/tools/sort-test-expectations.mjs
@@ -13,9 +13,22 @@ import prettier from 'prettier';
const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
const source = 'test/TestExpectations.json';
-const testExpectations = JSON.parse(fs.readFileSync(source, 'utf-8'));
+let testExpectations = JSON.parse(fs.readFileSync(source, 'utf-8'));
const committedExpectations = structuredClone(testExpectations);
+function testIdMatchesExpectationPattern(title, pattern) {
+ const patternRegExString = pattern
+ // Replace `*` with non special character
+ .replace(/\*/g, '--STAR--')
+ // Escape special characters https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
+ .replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
+ // Replace placeholder with greedy match
+ .replace(/--STAR--/g, '(.*)?');
+ // Match beginning and end explicitly
+ const patternRegEx = new RegExp(`^${patternRegExString}$`);
+ return patternRegEx.test(title);
+}
+
const prettierConfig = await import(
path.join(__dirname, '..', '.prettierrc.cjs')
);
@@ -43,9 +56,80 @@ testExpectations.forEach(item => {
item.parameters.sort();
item.expectations.sort();
item.platforms.sort();
+ // Delete comments for PASS expectations. They are likely outdated.
+ if (item.expectations.length === 1 && item.expectations[0] === 'PASS') {
+ delete item.comment;
+ }
+});
+
+function isSubset(superset, subset) {
+ let isSubset = true;
+
+ for (const p of subset) {
+ if (!superset.has(p)) {
+ isSubset = false;
+ }
+ }
+
+ return isSubset;
+}
+
+const toBeRemoved = new Set();
+for (let i = testExpectations.length - 1; i >= 0; i--) {
+ const expectation = testExpectations[i];
+ const params = new Set(expectation.parameters);
+ const labels = new Set(expectation.expectations);
+ const platforms = new Set(expectation.platforms);
+
+ let foundMatch = false;
+ for (let j = i - 1; j >= 0; j--) {
+ const candidate = testExpectations[j];
+ const candidateParams = new Set(candidate.parameters);
+ const candidateLabels = new Set(candidate.expectations);
+ const candidatePlatforms = new Set(candidate.platforms);
+
+ if (
+ testIdMatchesExpectationPattern(
+ expectation.testIdPattern,
+ candidate.testIdPattern
+ ) &&
+ isSubset(candidateParams, params) &&
+ isSubset(candidatePlatforms, platforms)
+ ) {
+ foundMatch = true;
+ if (isSubset(candidateLabels, labels)) {
+ console.log('removing', expectation, 'already covered by', candidate);
+ toBeRemoved.add(expectation);
+ }
+ break;
+ }
+ }
+
+ if (!foundMatch && isSubset(new Set(['PASS']), labels)) {
+ console.log(
+ 'removing',
+ expectation,
+ 'because the default expectation is to pass'
+ );
+ toBeRemoved.add(expectation);
+ }
+}
+
+testExpectations = testExpectations.filter(item => {
+ return !toBeRemoved.has(item);
});
if (process.argv.includes('--lint')) {
+ const missingComments = [];
+ testExpectations.forEach(item => {
+ if (item.expectations.length === 1 && item.expectations[0] === 'PASS') {
+ return;
+ }
+ if (!item.comment) {
+ missingComments.push(item);
+ }
+ });
+
if (
JSON.stringify(committedExpectations) !== JSON.stringify(testExpectations)
) {
@@ -54,6 +138,14 @@ if (process.argv.includes('--lint')) {
);
process.exit(1);
}
+
+ if (missingComments.length > 0) {
+ console.error(
+ `${source}: missing comments for the following expectations:`,
+ missingComments
+ );
+ process.exit(1);
+ }
} else {
fs.writeFileSync(
source,