summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/common/subset-tests-by-key.js
blob: 483017a644886a935c17a30b060462828a5efcdc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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;
})();