suiteUtils.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.applyRepeatEachIndex = applyRepeatEachIndex;
  6. exports.bindFileSuiteToProject = bindFileSuiteToProject;
  7. exports.filterByFocusedLine = filterByFocusedLine;
  8. exports.filterByTestIds = filterByTestIds;
  9. exports.filterOnly = filterOnly;
  10. exports.filterSuite = filterSuite;
  11. exports.filterSuiteWithOnlySemantics = filterSuiteWithOnlySemantics;
  12. exports.filterTestsRemoveEmptySuites = filterTestsRemoveEmptySuites;
  13. var _path = _interopRequireDefault(require("path"));
  14. var _utils = require("playwright-core/lib/utils");
  15. var _util = require("../util");
  16. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  17. /**
  18. * Copyright Microsoft Corporation. All rights reserved.
  19. *
  20. * Licensed under the Apache License, Version 2.0 (the "License");
  21. * you may not use this file except in compliance with the License.
  22. * You may obtain a copy of the License at
  23. *
  24. * http://www.apache.org/licenses/LICENSE-2.0
  25. *
  26. * Unless required by applicable law or agreed to in writing, software
  27. * distributed under the License is distributed on an "AS IS" BASIS,
  28. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  29. * See the License for the specific language governing permissions and
  30. * limitations under the License.
  31. */
  32. function filterSuite(suite, suiteFilter, testFilter) {
  33. for (const child of suite.suites) {
  34. if (!suiteFilter(child)) filterSuite(child, suiteFilter, testFilter);
  35. }
  36. const filteredTests = suite.tests.filter(testFilter);
  37. const entries = new Set([...suite.suites, ...filteredTests]);
  38. suite._entries = suite._entries.filter(e => entries.has(e)); // Preserve the order.
  39. }
  40. function filterTestsRemoveEmptySuites(suite, filter) {
  41. const filteredSuites = suite.suites.filter(child => filterTestsRemoveEmptySuites(child, filter));
  42. const filteredTests = suite.tests.filter(filter);
  43. const entries = new Set([...filteredSuites, ...filteredTests]);
  44. suite._entries = suite._entries.filter(e => entries.has(e)); // Preserve the order.
  45. return !!suite._entries.length;
  46. }
  47. function bindFileSuiteToProject(project, suite) {
  48. const relativeFile = _path.default.relative(project.project.testDir, suite.location.file).split(_path.default.sep).join('/');
  49. const fileId = (0, _utils.calculateSha1)(relativeFile).slice(0, 20);
  50. // Clone suite.
  51. const result = suite._deepClone();
  52. result._fileId = fileId;
  53. // Assign test properties with project-specific values.
  54. result.forEachTest((test, suite) => {
  55. var _inheritedRetries, _inheritedTimeout;
  56. suite._fileId = fileId;
  57. // At the point of the query, suite is not yet attached to the project, so we only get file, describe and test titles.
  58. const testIdExpression = `[project=${project.id}]${test.titlePath().join('\x1e')}`;
  59. const testId = fileId + '-' + (0, _utils.calculateSha1)(testIdExpression).slice(0, 20);
  60. test.id = testId;
  61. test._projectId = project.id;
  62. // Inherit properties from parent suites.
  63. let inheritedRetries;
  64. let inheritedTimeout;
  65. for (let parentSuite = suite; parentSuite; parentSuite = parentSuite.parent) {
  66. test._staticAnnotations.push(...parentSuite._staticAnnotations);
  67. if (inheritedRetries === undefined && parentSuite._retries !== undefined) inheritedRetries = parentSuite._retries;
  68. if (inheritedTimeout === undefined && parentSuite._timeout !== undefined) inheritedTimeout = parentSuite._timeout;
  69. }
  70. test.retries = (_inheritedRetries = inheritedRetries) !== null && _inheritedRetries !== void 0 ? _inheritedRetries : project.project.retries;
  71. test.timeout = (_inheritedTimeout = inheritedTimeout) !== null && _inheritedTimeout !== void 0 ? _inheritedTimeout : project.project.timeout;
  72. test.annotations = [...test._staticAnnotations];
  73. // Skip annotations imply skipped expectedStatus.
  74. if (test._staticAnnotations.some(a => a.type === 'skip' || a.type === 'fixme')) test.expectedStatus = 'skipped';
  75. // We only compute / set digest in the runner.
  76. if (test._poolDigest) test._workerHash = `${project.id}-${test._poolDigest}-0`;
  77. });
  78. return result;
  79. }
  80. function applyRepeatEachIndex(project, fileSuite, repeatEachIndex) {
  81. // Assign test properties with project-specific values.
  82. fileSuite.forEachTest((test, suite) => {
  83. if (repeatEachIndex) {
  84. const testIdExpression = `[project=${project.id}]${test.titlePath().join('\x1e')} (repeat:${repeatEachIndex})`;
  85. const testId = suite._fileId + '-' + (0, _utils.calculateSha1)(testIdExpression).slice(0, 20);
  86. test.id = testId;
  87. test.repeatEachIndex = repeatEachIndex;
  88. if (test._poolDigest) test._workerHash = `${project.id}-${test._poolDigest}-${repeatEachIndex}`;
  89. }
  90. });
  91. }
  92. function filterOnly(suite) {
  93. if (!suite._getOnlyItems().length) return;
  94. const suiteFilter = suite => suite._only;
  95. const testFilter = test => test._only;
  96. return filterSuiteWithOnlySemantics(suite, suiteFilter, testFilter);
  97. }
  98. function filterSuiteWithOnlySemantics(suite, suiteFilter, testFilter) {
  99. const onlySuites = suite.suites.filter(child => filterSuiteWithOnlySemantics(child, suiteFilter, testFilter) || suiteFilter(child));
  100. const onlyTests = suite.tests.filter(testFilter);
  101. const onlyEntries = new Set([...onlySuites, ...onlyTests]);
  102. if (onlyEntries.size) {
  103. suite._entries = suite._entries.filter(e => onlyEntries.has(e)); // Preserve the order.
  104. return true;
  105. }
  106. return false;
  107. }
  108. function filterByFocusedLine(suite, focusedTestFileLines) {
  109. if (!focusedTestFileLines.length) return;
  110. const matchers = focusedTestFileLines.map(createFileMatcherFromFilter);
  111. const testFileLineMatches = (testFileName, testLine, testColumn) => matchers.some(m => m(testFileName, testLine, testColumn));
  112. const suiteFilter = suite => !!suite.location && testFileLineMatches(suite.location.file, suite.location.line, suite.location.column);
  113. const testFilter = test => testFileLineMatches(test.location.file, test.location.line, test.location.column);
  114. return filterSuite(suite, suiteFilter, testFilter);
  115. }
  116. function filterByTestIds(suite, testIdMatcher) {
  117. if (!testIdMatcher) return;
  118. filterTestsRemoveEmptySuites(suite, test => testIdMatcher(test.id));
  119. }
  120. function createFileMatcherFromFilter(filter) {
  121. const fileMatcher = (0, _util.createFileMatcher)(filter.re || filter.exact || '');
  122. return (testFileName, testLine, testColumn) => fileMatcher(testFileName) && (filter.line === testLine || filter.line === null) && (filter.column === testColumn || filter.column === null);
  123. }