summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/common/subset-tests-by-key.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/common/subset-tests-by-key.js')
-rw-r--r--testing/web-platform/tests/common/subset-tests-by-key.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/testing/web-platform/tests/common/subset-tests-by-key.js b/testing/web-platform/tests/common/subset-tests-by-key.js
new file mode 100644
index 0000000000..483017a644
--- /dev/null
+++ b/testing/web-platform/tests/common/subset-tests-by-key.js
@@ -0,0 +1,83 @@
+(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 <meta> 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 = '<meta name="variant" content="?include=%s">';
+ if (collectCounts) {
+ template += ' <!--%s-->';
+ }
+ 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 `<meta name="variant" content="...">`
+ * 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;
+})();