(function() { var subTestKeyPattern = null; var match; var collectKeys = false; var collectCounts = false; var keys = {}; var exclude = false; if (location.search) { match = /(?:^\?|&)(include|exclude)=([^&]+)?/.exec(location.search); if (match) { subTestKeyPattern = new RegExp(`^${match[2]}$`); if (match[1] === 'exclude') { exclude = true; } } // Below is utility code to generate for copy/paste into tests. // Sample usage: // test.html?get-keys match = /(?:^\?|&)get-keys(&get-counts)?(?:&|$)/.exec(location.search); if (match) { collectKeys = true; if (match[1]) { collectCounts = true; } add_completion_callback(() => { var metas = []; var template = ''; if (collectCounts) { template += ' '; } for (var key in keys) { var meta = template.replace("%s", key); if (collectCounts) { meta = meta.replace("%s", keys[key]); } metas.push(meta); } var pre = document.createElement('pre'); pre.textContent = metas.join('\n') + '\n'; document.body.insertBefore(pre, document.body.firstChild); document.getSelection().selectAllChildren(pre); }); } } /** * Check if `key` is in the subset specified in the URL. * @param {string} key * @returns {boolean} */ function shouldRunSubTest(key) { if (key && subTestKeyPattern) { var found = subTestKeyPattern.test(key); if (exclude) { return !found; } return found; } return true; } /** * Only test a subset of tests with `?include=Foo` or `?exclude=Foo` in the URL. * Can be used together with `` * Sample usage: * for (const test of tests) { * subsetTestByKey("Foo", async_test, test.fn, test.name); * } */ function subsetTestByKey(key, testFunc, ...args) { if (collectKeys) { if (collectCounts && key in keys) { keys[key]++; } else { keys[key] = 1; } } if (shouldRunSubTest(key)) { return testFunc(...args); } return null; } self.shouldRunSubTest = shouldRunSubTest; self.subsetTestByKey = subsetTestByKey; })();