testaro 18.1.1 → 18.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/aslint/LICENSE +362 -0
  2. package/aslint/README.md +260 -0
  3. package/aslint/app/rules/abstract-rule.ts +83 -0
  4. package/aslint/app/rules/aslint/aria-hidden-false/aria-hidden-false.test.ts +73 -0
  5. package/aslint/app/rules/aslint/aria-hidden-false/aria-hidden-false.ts +34 -0
  6. package/aslint/app/rules/aslint/aria-hidden-false/aria-hidden.documentation.md +32 -0
  7. package/aslint/app/rules/aslint/aria-role-dialog/aria-role-dialog.documentation.md +49 -0
  8. package/aslint/app/rules/aslint/aria-role-dialog/aria-role-dialog.test.ts +91 -0
  9. package/aslint/app/rules/aslint/aria-role-dialog/aria-role-dialog.ts +62 -0
  10. package/aslint/app/rules/aslint/capital-letters-words/capital-letters-words.documentation.md +44 -0
  11. package/aslint/app/rules/aslint/capital-letters-words/capital-letters-words.test.ts +111 -0
  12. package/aslint/app/rules/aslint/capital-letters-words/capital-letters-words.ts +120 -0
  13. package/aslint/app/rules/aslint/content-editable-missing-attributes/content-editable-missing-attributes.docmentation.md +48 -0
  14. package/aslint/app/rules/aslint/content-editable-missing-attributes/content-editable-missing-attributes.test.ts +67 -0
  15. package/aslint/app/rules/aslint/content-editable-missing-attributes/content-editable-missing-attributes.ts +63 -0
  16. package/aslint/app/rules/aslint/contentinfo-landmark-only-one/contentinfo-landmark-only-one.documentation.md +45 -0
  17. package/aslint/app/rules/aslint/contentinfo-landmark-only-one/contentinfo-landmark-only-one.test.ts +63 -0
  18. package/aslint/app/rules/aslint/contentinfo-landmark-only-one/contentinfo-landmark-only-one.ts +44 -0
  19. package/aslint/app/rules/aslint/elements-not-allowed-in-head/elements-not-allowed-in-head.documentation.md +65 -0
  20. package/aslint/app/rules/aslint/elements-not-allowed-in-head/elements-not-allowed-in-head.test.ts +53 -0
  21. package/aslint/app/rules/aslint/elements-not-allowed-in-head/elements-not-allowed-in-head.ts +47 -0
  22. package/aslint/app/rules/aslint/empty-title-attribute/empty-title-attribute.documentation.md +55 -0
  23. package/aslint/app/rules/aslint/empty-title-attribute/empty-title-attribute.test.ts +80 -0
  24. package/aslint/app/rules/aslint/empty-title-attribute/empty-title-attribute.ts +58 -0
  25. package/aslint/app/rules/aslint/flash-content/flash-content.documentation.md +48 -0
  26. package/aslint/app/rules/aslint/flash-content/flash-content.test.ts +52 -0
  27. package/aslint/app/rules/aslint/flash-content/flash-content.ts +32 -0
  28. package/aslint/app/rules/aslint/font-style-italic/font-style-italic.documentation.md +44 -0
  29. package/aslint/app/rules/aslint/font-style-italic/font-style-italic.test.ts +12 -0
  30. package/aslint/app/rules/aslint/font-style-italic/font-style-italic.ts +83 -0
  31. package/aslint/app/rules/aslint/h1-must-be/h1-must-be.documentation.md +46 -0
  32. package/aslint/app/rules/aslint/h1-must-be/h1-must-be.test.ts +46 -0
  33. package/aslint/app/rules/aslint/h1-must-be/h1-must-be.ts +36 -0
  34. package/aslint/app/rules/aslint/headings-sibling-unique/headings-sibling-unique.documentation.md +57 -0
  35. package/aslint/app/rules/aslint/headings-sibling-unique/headings-sibling-unique.test.ts +52 -0
  36. package/aslint/app/rules/aslint/headings-sibling-unique/headings-sibling-unique.ts +63 -0
  37. package/aslint/app/rules/aslint/horizontal-rule/horizontal-rule.documentation.md +39 -0
  38. package/aslint/app/rules/aslint/horizontal-rule/horizontal-rule.test.ts +66 -0
  39. package/aslint/app/rules/aslint/horizontal-rule/horizontal-rule.ts +37 -0
  40. package/aslint/app/rules/aslint/incorrect-technique-for-hiding-content/incorrect-technique-for-hiding-content.documentation.md +36 -0
  41. package/aslint/app/rules/aslint/incorrect-technique-for-hiding-content/incorrect-technique-for-hiding-content.test.ts +113 -0
  42. package/aslint/app/rules/aslint/incorrect-technique-for-hiding-content/incorrect-technique-for-hiding-content.ts +103 -0
  43. package/aslint/app/rules/aslint/invalid-attribute-dir-value/invalid-attribute-dir-value.documentation.md +34 -0
  44. package/aslint/app/rules/aslint/invalid-attribute-dir-value/invalid-attribute-dir-value.test.ts +82 -0
  45. package/aslint/app/rules/aslint/invalid-attribute-dir-value/invalid-attribute-dir-value.ts +44 -0
  46. package/aslint/app/rules/aslint/label-duplicated-content-title/label-duplicated-content-title.documentation.md +40 -0
  47. package/aslint/app/rules/aslint/label-duplicated-content-title/label-duplicated-content-title.test.ts +48 -0
  48. package/aslint/app/rules/aslint/label-duplicated-content-title/label-duplicated-content-title.ts +37 -0
  49. package/aslint/app/rules/aslint/links-language-destination/links-language-destination.test.ts +50 -0
  50. package/aslint/app/rules/aslint/links-language-destination/links-language-destination.ts +70 -0
  51. package/aslint/app/rules/aslint/main-element-only-one/main-element-only-one.test.ts +55 -0
  52. package/aslint/app/rules/aslint/main-element-only-one/main-element-only-one.ts +83 -0
  53. package/aslint/app/rules/aslint/main-landmark-must-be-top-level/main-landmark-must-be-top-level.test.ts +12 -0
  54. package/aslint/app/rules/aslint/main-landmark-must-be-top-level/main-landmark-must-be-top-level.ts +73 -0
  55. package/aslint/app/rules/aslint/minimum-font-size/minimum-font-size.test.ts +12 -0
  56. package/aslint/app/rules/aslint/minimum-font-size/minimum-font-size.ts +87 -0
  57. package/aslint/app/rules/aslint/missing-href-on-a/missing-href-on-a.test.ts +48 -0
  58. package/aslint/app/rules/aslint/missing-href-on-a/missing-href-on-a.ts +40 -0
  59. package/aslint/app/rules/aslint/misused-aria-on-focusable-element/misused-aria-on-focusable-element.test.ts +12 -0
  60. package/aslint/app/rules/aslint/misused-aria-on-focusable-element/misused-aria-on-focusable-element.ts +66 -0
  61. package/aslint/app/rules/aslint/misused-input-attribute/misused-input-attribute.test.ts +12 -0
  62. package/aslint/app/rules/aslint/misused-input-attribute/misused-input-attribute.ts +134 -0
  63. package/aslint/app/rules/aslint/misused-required-attribute/misused-required-attribute.test.ts +12 -0
  64. package/aslint/app/rules/aslint/misused-required-attribute/misused-required-attribute.ts +90 -0
  65. package/aslint/app/rules/aslint/navigation-landmark-restrictions/navigation-landmark-restrictions.test.ts +12 -0
  66. package/aslint/app/rules/aslint/navigation-landmark-restrictions/navigation-landmark-restrictions.ts +48 -0
  67. package/aslint/app/rules/aslint/obsolete-html-attributes/obsolete-html-attributes.test.ts +12 -0
  68. package/aslint/app/rules/aslint/obsolete-html-attributes/obsolete-html-attributes.ts +148 -0
  69. package/aslint/app/rules/aslint/obsolete-html-elements/obsolete-html-elements.test.ts +12 -0
  70. package/aslint/app/rules/aslint/obsolete-html-elements/obsolete-html-elements.ts +66 -0
  71. package/aslint/app/rules/aslint/outline-zero/outline-zero.test.ts +12 -0
  72. package/aslint/app/rules/aslint/outline-zero/outline-zero.ts +85 -0
  73. package/aslint/app/rules/aslint/overlay/overlay.test.ts +122 -0
  74. package/aslint/app/rules/aslint/overlay/overlay.ts +141 -0
  75. package/aslint/app/rules/aslint/role-application/role-application.test.ts +48 -0
  76. package/aslint/app/rules/aslint/role-application/role-application.ts +38 -0
  77. package/aslint/app/rules/aslint/rtl-content/rtl-content.test.ts +12 -0
  78. package/aslint/app/rules/aslint/rtl-content/rtl-content.ts +75 -0
  79. package/aslint/app/rules/aslint/unclear-uri-on-a/unclear-anchor-uri.test.ts +12 -0
  80. package/aslint/app/rules/aslint/unclear-uri-on-a/unclear-anchor-uri.ts +48 -0
  81. package/aslint/app/rules/aslint/unsupported-role-on-element/unsupported-role-on-element.test.ts +12 -0
  82. package/aslint/app/rules/aslint/unsupported-role-on-element/unsupported-role-on-element.ts +63 -0
  83. package/package.json +1 -1
  84. package/testaro/headingAmb.js +103 -0
  85. package/testaro/template.js +78 -0
  86. package/tests/testaro.js +1 -0
  87. package/validation/tests/jobs/headingAmb.json +129 -0
  88. package/validation/tests/targets/headingAmb/index.html +26 -0
@@ -0,0 +1,103 @@
1
+ /*
2
+ headingAmb
3
+ Related to ASLint rule headings-sibling-unique.
4
+ This test reports same-level heading siblings in the heading hierarchy that have identical text
5
+ contents.
6
+ */
7
+
8
+ // ########## IMPORTS
9
+
10
+ // Module to get locator data.
11
+ const {getLocatorData} = require('../procs/getLocatorData');
12
+
13
+ // ########## FUNCTIONS
14
+
15
+ // Performs the test.
16
+ exports.reporter = async (page, withItems) => {
17
+ // Initialize the standard result.
18
+ const data = {};
19
+ const totals = [0, 0, 0, 0];
20
+ const standardInstances = [];
21
+ // Get locators for all the headings.
22
+ const headingLevels = [1, 2, 3, 4, 5, 6];
23
+ const locAll = page.locator(headingLevels.map(level => `body h${level}`).join(', '));
24
+ const locsAll = await locAll.all();
25
+ const ambIndexes = await locAll.evaluateAll(headings => {
26
+ // Initialize the array of indexes of violating headings.
27
+ const badIndexes = [];
28
+ // For each heading:
29
+ headings.forEach((heading, index) => {
30
+ // If any same-level and same-text heading precedes it:
31
+ const priors = headings.slice(0, index);
32
+ priors.forEach((prior, priorIndex) => {
33
+ if (['tagName', 'textContent'].every(property => prior[property] === heading[property])) {
34
+ // If no superior heading exists between them:
35
+ if (
36
+ headings
37
+ .slice(priorIndex + 1, index)
38
+ .every(betweenHeading => betweenHeading.tagName[1] >= heading.tagName[1])
39
+ ) {
40
+ // Add the index of the later heading to the index of violating headings.
41
+ badIndexes.push(headings.indexOf(heading));
42
+ }
43
+ }
44
+ });
45
+ });
46
+ return badIndexes;
47
+ });
48
+ // If there were any instances:
49
+ if (ambIndexes.length) {
50
+ // Add to the totals.
51
+ totals[1] = ambIndexes.length;
52
+ // If itemization is required:
53
+ if (withItems) {
54
+ // For each instance:
55
+ for (const index of ambIndexes) {
56
+ // If it exists:
57
+ const loc = locsAll[index];
58
+ if (loc) {
59
+ // Get data on the element.
60
+ const elData = await getLocatorData(loc);
61
+ // Add a standard instance.
62
+ standardInstances.push({
63
+ ruleID: 'headingAmb',
64
+ what: 'Heading has the same text as a prior same-level sibling heading',
65
+ ordinalSeverity: 1,
66
+ tagName: elData.tagName,
67
+ id: elData.id,
68
+ location: elData.location,
69
+ excerpt: elData.excerpt
70
+ });
71
+ }
72
+ // Otherwise, i.e. if it does not exist:
73
+ else {
74
+ // Report this.
75
+ console.log('ERROR: Reportedly same-text sibling heading not found');
76
+ }
77
+ }
78
+ }
79
+ // Otherwise, i.e. if itemization is not required:
80
+ else {
81
+ // Add a summary instance.
82
+ standardInstances.push({
83
+ ruleID: 'headingAmb',
84
+ what: 'Sibling same-level headings have the same text',
85
+ ordinalSeverity: 1,
86
+ count: totals[1],
87
+ tagName: '',
88
+ id: '',
89
+ location: {
90
+ doc: '',
91
+ type: '',
92
+ spec: ''
93
+ },
94
+ excerpt: ''
95
+ });
96
+ }
97
+ }
98
+ return {
99
+ data,
100
+ totals,
101
+ standardInstances
102
+ };
103
+ };
@@ -0,0 +1,78 @@
1
+ /*
2
+ template
3
+ This test reports ….
4
+ */
5
+
6
+ // ########## IMPORTS
7
+
8
+ // Module to get locator data.
9
+ const {getLocatorData} = require('../procs/getLocatorData');
10
+
11
+ // ########## FUNCTIONS
12
+
13
+ // Performs the test.
14
+ exports.reporter = async (page, withItems) => {
15
+ // Initialize the standard result.
16
+ const data = {};
17
+ const totals = [0, 0, 0, 0];
18
+ const standardInstances = [];
19
+ // Get locators for all applicable elements.
20
+ const locAll = page.locator('body *', {option: ''});
21
+ const locsAll = await locAll.all();
22
+ // For each of them:
23
+ for (const loc of locsAll) {
24
+ // Get data on it.
25
+ const facts = await loc.evaluate(element => {
26
+ return element.something;
27
+ });
28
+ // If there are any instances:
29
+ if (facts.length) {
30
+ // Add to the totals.
31
+ totals[0]++;
32
+ // If itemization is required:
33
+ if (withItems) {
34
+ // Get data on the element.
35
+ const elData = await getLocatorData(loc);
36
+ // Add a standard instance.
37
+ standardInstances.push({
38
+ ruleID: 'template',
39
+ what: 'Element is bad',
40
+ ordinalSeverity: 0,
41
+ tagName: elData.tagName,
42
+ id: elData.id,
43
+ location: elData.location,
44
+ excerpt: elData.excerpt
45
+ });
46
+ }
47
+ }
48
+ }
49
+ // If itemization is not required:
50
+ if (! withItems) {
51
+ // For each ordinal severity:
52
+ [0, 1, 2, 3].forEach(ordinalSeverity => {
53
+ // If there are instances with it:
54
+ if (totals[ordinalSeverity]) {
55
+ // Add a summary instance.
56
+ standardInstances.push({
57
+ ruleID: 'template',
58
+ what: 'Elements are bad',
59
+ ordinalSeverity,
60
+ count: totals[ordinalSeverity],
61
+ tagName: '',
62
+ id: '',
63
+ location: {
64
+ doc: '',
65
+ type: '',
66
+ spec: ''
67
+ },
68
+ excerpt: ''
69
+ });
70
+ }
71
+ });
72
+ }
73
+ return {
74
+ data,
75
+ totals,
76
+ standardInstances
77
+ };
78
+ };
package/tests/testaro.js CHANGED
@@ -21,6 +21,7 @@ const evalRules = {
21
21
  focInd: 'missing and nonstandard focus indicators',
22
22
  focOp: 'discrepancies between focusability and operability',
23
23
  focVis: 'links that are invisible when focused',
24
+ headingAmb: 'same-level sibling headings with identical texts',
24
25
  hover: 'hover-caused content changes',
25
26
  hovInd: 'hover indication nonstandard',
26
27
  labClash: 'labeling inconsistencies',
@@ -0,0 +1,129 @@
1
+ {
2
+ "id": "headingAmb",
3
+ "what": "validation of headingAmb test",
4
+ "strict": true,
5
+ "timeLimit": 20,
6
+ "acts": [
7
+ {
8
+ "type": "launch",
9
+ "which": "chromium",
10
+ "what": "usual browser"
11
+ },
12
+ {
13
+ "type": "url",
14
+ "which": "__targets__/headingAmb/index.html",
15
+ "what": "page with and without heading ambiguity"
16
+ },
17
+ {
18
+ "type": "test",
19
+ "which": "testaro",
20
+ "withItems": true,
21
+ "stopOnFail": true,
22
+ "expect": [
23
+ [
24
+ "standardResult.totals.1",
25
+ "=",
26
+ 3
27
+ ],
28
+ [
29
+ "standardResult.instances.length",
30
+ "=",
31
+ 3
32
+ ],
33
+ [
34
+ "standardResult.instances.0.ruleID",
35
+ "=",
36
+ "headingAmb"
37
+ ],
38
+ [
39
+ "standardResult.instances.0.what",
40
+ "i",
41
+ "Heading has the same text"
42
+ ],
43
+ [
44
+ "standardResult.instances.0.ordinalSeverity",
45
+ "=",
46
+ 1
47
+ ],
48
+ [
49
+ "standardResult.instances.0.tagName",
50
+ "=",
51
+ "H2"
52
+ ],
53
+ [
54
+ "standardResult.instances.0.location.doc",
55
+ "=",
56
+ "dom"
57
+ ],
58
+ [
59
+ "standardResult.instances.0.location.type",
60
+ "=",
61
+ "box"
62
+ ],
63
+ [
64
+ "standardResult.instances.0.location.spec.y",
65
+ ">",
66
+ 0
67
+ ],
68
+ [
69
+ "standardResult.instances.0.excerpt",
70
+ "=",
71
+ "Level-2 heading"
72
+ ]
73
+ ],
74
+ "rules": [
75
+ "y",
76
+ "headingAmb"
77
+ ]
78
+ },
79
+ {
80
+ "type": "test",
81
+ "which": "testaro",
82
+ "withItems": false,
83
+ "stopOnFail": true,
84
+ "expect": [
85
+ [
86
+ "standardResult.totals.1",
87
+ "=",
88
+ 3
89
+ ],
90
+ [
91
+ "standardResult.totals.2",
92
+ "=",
93
+ 0
94
+ ],
95
+ [
96
+ "standardResult.instances.length",
97
+ "=",
98
+ 1
99
+ ],
100
+ [
101
+ "standardResult.instances.0.ruleID",
102
+ "=",
103
+ "headingAmb"
104
+ ],
105
+ [
106
+ "standardResult.instances.0.count",
107
+ "=",
108
+ 3
109
+ ],
110
+ [
111
+ "standardResult.instances.0.what",
112
+ "i",
113
+ "Sibling same-level headings"
114
+ ]
115
+ ],
116
+ "rules": [
117
+ "y",
118
+ "headingAmb"
119
+ ]
120
+ }
121
+ ],
122
+ "sources": {
123
+ "script": "",
124
+ "host": {},
125
+ "requester": ""
126
+ },
127
+ "creationTime": "2013-05-28T12:00:00",
128
+ "timeStamp": "00000"
129
+ }
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Page with and without heading ambiguity</title>
6
+ <meta name="description" content="tester">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1">
8
+ </head>
9
+ <body>
10
+ <main>
11
+ <h1>Page with and without heading ambiguity</h1>
12
+ <p>This is a paragraph.</p>
13
+ <h2>Level-2 heading</h2>
14
+ <h2>Level-2 heading</h2>
15
+ <p>The heading of this paragraph is a violator.</p>
16
+ <h2>Yet another level-2 heading</h2>
17
+ <h3>Level-3 heading</h3>
18
+ <div>
19
+ <h2>Level-2 heading</h2>
20
+ <p>The heading of this paragraph is a 2-time violator, notwithstanding the div.</p>
21
+ <h3>Level-3 heading</h3>
22
+ <p>The heading of this paragraph is OK, because a superior heading intervenes.</p>
23
+ </div>
24
+ </main>
25
+ </body>
26
+ </html>