testaro 78.0.8 → 78.4.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 (356) hide show
  1. package/.gitattributes +94 -0
  2. package/.github/workflows/ci.yml +58 -0
  3. package/.github/workflows/publish.yml +49 -0
  4. package/.github/workflows/typescript.yml +35 -0
  5. package/AGENTS.md +2 -2
  6. package/CLAUDE.md +24 -18
  7. package/CONTAINERS.md +9 -6
  8. package/CONTRIBUTING.md +29 -3
  9. package/Dockerfile +1 -1
  10. package/README.md +73 -19
  11. package/UPGRADES.md +4 -0
  12. package/actSpecs-doc.md +13 -1
  13. package/actSpecs.js +29 -5
  14. package/call.js +6 -5
  15. package/docker-compose.yml +8 -2
  16. package/docs/checkpoint-scanning.md +199 -0
  17. package/docs/standard-result-outcome.md +165 -0
  18. package/env.example +44 -10
  19. package/eslint.config.mjs +101 -0
  20. package/netWatch.js +372 -222
  21. package/package.json +46 -31
  22. package/pour/README.md +47 -0
  23. package/pour/pour.min.js +8 -0
  24. package/procs/actDo.js +808 -0
  25. package/procs/catalog.d.ts +17 -0
  26. package/procs/catalog.js +312 -221
  27. package/procs/catalog.ts +398 -0
  28. package/procs/checkpoint.js +110 -0
  29. package/procs/config.d.ts +35 -0
  30. package/procs/config.js +62 -0
  31. package/procs/dateTime.js +2 -1
  32. package/procs/doActs.js +442 -849
  33. package/procs/doTestAct.js +27 -121
  34. package/procs/flow.js +221 -0
  35. package/procs/generateRuleRegistry.js +94 -0
  36. package/procs/getSource.d.ts +26 -0
  37. package/procs/job.js +115 -1
  38. package/procs/launch.d.ts +40 -0
  39. package/procs/launch.js +239 -108
  40. package/procs/nu.d.ts +48 -0
  41. package/procs/scope.js +196 -0
  42. package/procs/shoot.d.ts +33 -0
  43. package/procs/standard.d.ts +18 -0
  44. package/procs/standard.js +83 -0
  45. package/procs/standard.ts +126 -0
  46. package/procs/testAct.js +145 -0
  47. package/procs/testaro.d.ts +20 -0
  48. package/procs/testaro.js +236 -189
  49. package/procs/testaro.ts +321 -0
  50. package/procs/userPath.js +126 -0
  51. package/procs/xPath.d.ts +4 -0
  52. package/procs/xPath.js +81 -69
  53. package/procs/xPath.ts +106 -0
  54. package/procs/xPathScript.d.ts +6 -0
  55. package/procs/xPathScript.js +70 -0
  56. package/run.js +3 -2
  57. package/surea11y/README.md +44 -0
  58. package/surea11y/surea11y.browser.js +14 -0
  59. package/testaro/adbID.d.ts +3 -0
  60. package/testaro/adbID.js +38 -41
  61. package/testaro/adbID.ts +66 -0
  62. package/testaro/allCapStyle.d.ts +3 -0
  63. package/testaro/allCapStyle.js +31 -34
  64. package/testaro/allCapStyle.ts +55 -0
  65. package/testaro/allCaps.d.ts +16 -0
  66. package/testaro/allCaps.js +179 -151
  67. package/testaro/allCaps.ts +228 -0
  68. package/testaro/allHidden.d.ts +13 -0
  69. package/testaro/allHidden.js +29 -30
  70. package/testaro/allHidden.ts +50 -0
  71. package/testaro/allSlanted.d.ts +3 -0
  72. package/testaro/allSlanted.js +30 -33
  73. package/testaro/allSlanted.ts +54 -0
  74. package/testaro/altScheme.d.ts +3 -0
  75. package/testaro/altScheme.js +27 -30
  76. package/testaro/altScheme.ts +50 -0
  77. package/testaro/attVal.d.ts +3 -0
  78. package/testaro/attVal.js +20 -21
  79. package/testaro/attVal.ts +52 -0
  80. package/testaro/autocomplete.d.ts +3 -0
  81. package/testaro/autocomplete.js +59 -75
  82. package/testaro/autocomplete.ts +101 -0
  83. package/testaro/bulk.d.ts +13 -0
  84. package/testaro/bulk.js +32 -33
  85. package/testaro/bulk.ts +55 -0
  86. package/testaro/buttonMenu.d.ts +9 -0
  87. package/testaro/buttonMenu.js +317 -319
  88. package/testaro/buttonMenu.ts +391 -0
  89. package/testaro/captionLoc.d.ts +3 -0
  90. package/testaro/captionLoc.js +17 -20
  91. package/testaro/captionLoc.ts +40 -0
  92. package/testaro/datalistRef.d.ts +3 -0
  93. package/testaro/datalistRef.js +33 -36
  94. package/testaro/datalistRef.ts +55 -0
  95. package/testaro/distortion.d.ts +3 -0
  96. package/testaro/distortion.js +57 -26
  97. package/testaro/distortion.ts +81 -0
  98. package/testaro/docType.d.ts +15 -0
  99. package/testaro/docType.js +25 -25
  100. package/testaro/docType.ts +45 -0
  101. package/testaro/dupAtt.d.ts +16 -0
  102. package/testaro/dupAtt.js +113 -104
  103. package/testaro/dupAtt.ts +144 -0
  104. package/testaro/elements.d.ts +6 -0
  105. package/testaro/elements.js +153 -153
  106. package/testaro/elements.ts +215 -0
  107. package/testaro/embAc.d.ts +3 -0
  108. package/testaro/embAc.js +19 -20
  109. package/testaro/embAc.ts +40 -0
  110. package/testaro/focAll.d.ts +13 -0
  111. package/testaro/focAll.js +185 -191
  112. package/testaro/focAll.ts +217 -0
  113. package/testaro/focAndOp.d.ts +3 -0
  114. package/testaro/focAndOp.js +100 -104
  115. package/testaro/focAndOp.ts +128 -0
  116. package/testaro/focInd.d.ts +3 -0
  117. package/testaro/focInd.js +64 -66
  118. package/testaro/focInd.ts +96 -0
  119. package/testaro/focVis.d.ts +3 -0
  120. package/testaro/focVis.js +28 -30
  121. package/testaro/focVis.ts +52 -0
  122. package/testaro/headEl.d.ts +10 -0
  123. package/testaro/headEl.js +61 -62
  124. package/testaro/headEl.ts +82 -0
  125. package/testaro/headingAmb.d.ts +3 -0
  126. package/testaro/headingAmb.js +54 -63
  127. package/testaro/headingAmb.ts +72 -0
  128. package/testaro/hovInd.d.ts +12 -0
  129. package/testaro/hovInd.js +163 -130
  130. package/testaro/hovInd.ts +199 -0
  131. package/testaro/hover.d.ts +3 -0
  132. package/testaro/hover.js +155 -126
  133. package/testaro/hover.ts +154 -0
  134. package/testaro/hr.d.ts +3 -0
  135. package/testaro/hr.js +14 -17
  136. package/testaro/hr.ts +36 -0
  137. package/testaro/imageLink.d.ts +3 -0
  138. package/testaro/imageLink.js +17 -20
  139. package/testaro/imageLink.ts +42 -0
  140. package/testaro/labClash.d.ts +3 -0
  141. package/testaro/labClash.js +31 -33
  142. package/testaro/labClash.ts +54 -0
  143. package/testaro/legendLoc.d.ts +3 -0
  144. package/testaro/legendLoc.js +17 -20
  145. package/testaro/legendLoc.ts +42 -0
  146. package/testaro/lineHeight.d.ts +3 -0
  147. package/testaro/lineHeight.js +43 -48
  148. package/testaro/lineHeight.ts +70 -0
  149. package/testaro/linkAmb.d.ts +7 -0
  150. package/testaro/linkAmb.js +79 -80
  151. package/testaro/linkAmb.ts +105 -0
  152. package/testaro/linkExt.d.ts +3 -0
  153. package/testaro/linkExt.js +13 -16
  154. package/testaro/linkExt.ts +35 -0
  155. package/testaro/linkOldAtt.d.ts +3 -0
  156. package/testaro/linkOldAtt.js +25 -28
  157. package/testaro/linkOldAtt.ts +48 -0
  158. package/testaro/linkTo.d.ts +3 -0
  159. package/testaro/linkTo.js +22 -22
  160. package/testaro/linkTo.ts +43 -0
  161. package/testaro/linkUl.d.ts +3 -0
  162. package/testaro/linkUl.js +30 -34
  163. package/testaro/linkUl.ts +54 -0
  164. package/testaro/miniText.d.ts +3 -0
  165. package/testaro/miniText.js +41 -44
  166. package/testaro/miniText.ts +68 -0
  167. package/testaro/motion.d.ts +10 -0
  168. package/testaro/motion.js +92 -96
  169. package/testaro/motion.ts +125 -0
  170. package/testaro/nonTable.d.ts +3 -0
  171. package/testaro/nonTable.js +39 -45
  172. package/testaro/nonTable.ts +66 -0
  173. package/testaro/optRoleSel.d.ts +3 -0
  174. package/testaro/optRoleSel.js +16 -19
  175. package/testaro/optRoleSel.ts +41 -0
  176. package/testaro/phOnly.d.ts +3 -0
  177. package/testaro/phOnly.js +18 -21
  178. package/testaro/phOnly.ts +43 -0
  179. package/testaro/pseudoP.d.ts +3 -0
  180. package/testaro/pseudoP.js +36 -38
  181. package/testaro/pseudoP.ts +59 -0
  182. package/testaro/radioSet.d.ts +3 -0
  183. package/testaro/radioSet.js +57 -59
  184. package/testaro/radioSet.ts +79 -0
  185. package/testaro/registry.d.ts +63 -0
  186. package/testaro/registry.js +67 -0
  187. package/testaro/registry.ts +141 -0
  188. package/testaro/role.d.ts +3 -0
  189. package/testaro/role.js +27 -29
  190. package/testaro/role.ts +53 -0
  191. package/testaro/secHeading.d.ts +3 -0
  192. package/testaro/secHeading.js +30 -33
  193. package/testaro/secHeading.ts +53 -0
  194. package/testaro/styleDiff.d.ts +25 -0
  195. package/testaro/styleDiff.js +248 -252
  196. package/testaro/styleDiff.ts +303 -0
  197. package/testaro/tabNav.d.ts +33 -0
  198. package/testaro/tabNav.js +272 -342
  199. package/testaro/tabNav.ts +454 -0
  200. package/testaro/targetsNear.d.ts +9 -0
  201. package/testaro/targetsNear.js +130 -132
  202. package/testaro/targetsNear.ts +160 -0
  203. package/testaro/textNodes.d.ts +6 -0
  204. package/testaro/textNodes.js +139 -135
  205. package/testaro/textNodes.ts +185 -0
  206. package/testaro/textSem.d.ts +3 -0
  207. package/testaro/textSem.js +25 -28
  208. package/testaro/textSem.ts +47 -0
  209. package/testaro/title.d.ts +9 -0
  210. package/testaro/title.js +16 -13
  211. package/testaro/title.ts +31 -0
  212. package/testaro/titledEl.d.ts +3 -0
  213. package/testaro/titledEl.js +15 -18
  214. package/testaro/titledEl.ts +38 -0
  215. package/testaro/zIndex.d.ts +3 -0
  216. package/testaro/zIndex.js +19 -22
  217. package/testaro/zIndex.ts +42 -0
  218. package/tests/alfa.d.ts +45 -0
  219. package/tests/alfa.js +138 -141
  220. package/tests/alfa.ts +214 -0
  221. package/tests/aslint.d.ts +33 -0
  222. package/tests/aslint.js +272 -249
  223. package/tests/aslint.ts +301 -0
  224. package/tests/axe.d.ts +27 -0
  225. package/tests/axe.js +199 -200
  226. package/tests/axe.ts +277 -0
  227. package/tests/ed11y.d.ts +28 -0
  228. package/tests/ed11y.js +141 -99
  229. package/tests/ed11y.ts +178 -0
  230. package/tests/htmlcs.d.ts +21 -0
  231. package/tests/htmlcs.js +174 -140
  232. package/tests/htmlcs.ts +181 -0
  233. package/tests/ibm.d.ts +52 -0
  234. package/tests/ibm.js +164 -166
  235. package/tests/ibm.ts +251 -0
  236. package/tests/nuVal.d.ts +13 -0
  237. package/tests/nuVal.js +107 -112
  238. package/tests/nuVal.ts +145 -0
  239. package/tests/nuVnu.d.ts +15 -0
  240. package/tests/nuVnu.js +141 -111
  241. package/tests/nuVnu.ts +144 -0
  242. package/tests/pour.d.ts +31 -0
  243. package/tests/pour.js +242 -0
  244. package/tests/pour.ts +273 -0
  245. package/tests/qualWeb.d.ts +39 -0
  246. package/tests/qualWeb.js +302 -272
  247. package/tests/qualWeb.ts +415 -0
  248. package/tests/surea11y.d.ts +33 -0
  249. package/tests/surea11y.js +288 -0
  250. package/tests/surea11y.ts +334 -0
  251. package/tests/testaro.d.ts +25 -0
  252. package/tests/testaro.js +745 -652
  253. package/tests/testaro.ts +862 -0
  254. package/tests/wave.d.ts +46 -0
  255. package/tests/wave.js +166 -177
  256. package/tests/wave.ts +252 -0
  257. package/tsconfig.json +17 -0
  258. package/types.d.ts +243 -0
  259. package/types.js +10 -0
  260. package/types.ts +376 -0
  261. package/validation/act/README.md +46 -0
  262. package/validation/act/capture.js +424 -0
  263. package/validation/act/chromium-issue-draft.md +66 -0
  264. package/validation/act/fp-triage-2026-08-22.md +86 -0
  265. package/validation/act/isolation-notes.md +159 -0
  266. package/validation/act/playwright-issue-draft.md +73 -0
  267. package/validation/act/propose-mappings.js +0 -0
  268. package/validation/act/repro-cdp-raw.js +105 -0
  269. package/validation/act/repro-metarefresh.js +65 -0
  270. package/validation/act/score.js +184 -0
  271. package/validation/act/stage3a-stress-report.md +69 -0
  272. package/validation/act/stage3b-mapping-proposals.md +94 -0
  273. package/validation/act/stage3b-triage-draft.md +138 -0
  274. package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
  275. package/validation/executors/netWatch.js +180 -90
  276. package/validation/executors/test.js +17 -2
  277. package/validation/executors/tests.js +118 -10
  278. package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
  279. package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
  280. package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
  281. package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
  282. package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
  283. package/validation/knownFailures.json +1 -0
  284. package/validation/tests/jobProperties/adbID.json +27 -2
  285. package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
  286. package/validation/tests/jobProperties/allCaps.json +25 -0
  287. package/validation/tests/jobProperties/allHidden.json +133 -13
  288. package/validation/tests/jobProperties/allSlanted.json +3 -3
  289. package/validation/tests/jobProperties/altScheme.json +23 -8
  290. package/validation/tests/jobProperties/attVal.json +57 -57
  291. package/validation/tests/jobProperties/autocomplete.json +11 -1
  292. package/validation/tests/jobProperties/bulk.json +6 -1
  293. package/validation/tests/jobProperties/buttonMenu.json +63 -42
  294. package/validation/tests/jobProperties/captionLoc.json +1 -6
  295. package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
  296. package/validation/tests/jobProperties/checkpoint-page.json +397 -0
  297. package/validation/tests/jobProperties/checkpoint.json +395 -0
  298. package/validation/tests/jobProperties/datalistRef.json +20 -5
  299. package/validation/tests/jobProperties/distortion.json +28 -3
  300. package/validation/tests/jobProperties/docType.json +2 -2
  301. package/validation/tests/jobProperties/dupAtt.json +48 -33
  302. package/validation/tests/jobProperties/elements.json +28 -28
  303. package/validation/tests/jobProperties/embAc.json +36 -31
  304. package/validation/tests/jobProperties/focAndOp.json +284 -0
  305. package/validation/tests/jobProperties/focInd.json +34 -34
  306. package/validation/tests/jobProperties/focVis.json +1 -1
  307. package/validation/tests/jobProperties/hover.json +39 -37
  308. package/validation/tests/jobProperties/hr.json +13 -3
  309. package/validation/tests/jobProperties/imageLink.json +0 -5
  310. package/validation/tests/jobProperties/labClash.json +68 -33
  311. package/validation/tests/jobProperties/legendLoc.json +1 -6
  312. package/validation/tests/jobProperties/lineHeight.json +2 -2
  313. package/validation/tests/jobProperties/linkAmb.json +13 -18
  314. package/validation/tests/jobProperties/linkExt.json +1 -1
  315. package/validation/tests/jobProperties/linkOldAtt.json +12 -2
  316. package/validation/tests/jobProperties/linkTo.json +1 -1
  317. package/validation/tests/jobProperties/linkUl.json +65 -65
  318. package/validation/tests/jobProperties/miniText.json +7 -2
  319. package/validation/tests/jobProperties/motion.json +4 -50
  320. package/validation/tests/jobProperties/nonTable.json +48 -3
  321. package/validation/tests/jobProperties/optRoleSel.json +12 -2
  322. package/validation/tests/jobProperties/phOnly.json +6 -16
  323. package/validation/tests/jobProperties/pseudoP.json +17 -2
  324. package/validation/tests/jobProperties/radioSet.json +30 -30
  325. package/validation/tests/jobProperties/role.json +25 -5
  326. package/validation/tests/jobProperties/secHeading.json +26 -21
  327. package/validation/tests/jobProperties/styleDiff.json +35 -5
  328. package/validation/tests/jobProperties/tabNav.json +3 -1
  329. package/validation/tests/jobProperties/targetsNear.json +237 -0
  330. package/validation/tests/jobProperties/textNodes.json +29 -29
  331. package/validation/tests/jobProperties/textSem.json +26 -1
  332. package/validation/tests/jobProperties/title.json +12 -2
  333. package/validation/tests/jobProperties/titledEl.json +39 -9
  334. package/validation/tests/jobProperties/userPath.json +317 -0
  335. package/validation/tests/jobProperties/zIndex.json +40 -35
  336. package/validation/tests/targets/allCapStyle/index.html +26 -0
  337. package/validation/tests/targets/checkpoint/index.html +38 -0
  338. package/validation/tests/targets/datalistRef/index.html +1 -1
  339. package/validation/tests/targets/focAndOp/bad.html +29 -0
  340. package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
  341. package/validation/tests/targets/focInd/bad.html +2 -1
  342. package/validation/tests/targets/headEl/index.html +10 -1
  343. package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
  344. package/validation/tests/targets/userPath/index.html +42 -0
  345. package/validation/validateTest.js +61 -9
  346. package/.claude/settings.local.json +0 -11
  347. package/.eslintrc.json +0 -41
  348. package/htmlcs/.eslintrc.json +0 -67
  349. package/validation/tests/jobProperties/linkTitle.json +0 -127
  350. package/validation/tests/jobProperties/opFoc.json +0 -164
  351. package/validation/tests/jobProperties/targetSmall.json +0 -152
  352. package/validation/tests/jobProperties/targetTiny.json +0 -142
  353. package/validation/tests/targets/focOp/bad.html +0 -25
  354. package/validation/tests/targets/linkTitle/index.html +0 -24
  355. package/validation/tests/targets/opFoc/bad.html +0 -26
  356. package/validation/tests/targets/opFoc/good.html +0 -23
@@ -1,5 +1,6 @@
1
1
  /*
2
2
  © 2022–2025 CVS Health and/or one of its affiliates. All rights reserved.
3
+ © 2026 Jeff Witt.
3
4
  © 2025–2026 Jonathan Robert Pool.
4
5
 
5
6
  Licensed under the MIT License. See LICENSE file at the project root or
@@ -15,13 +16,13 @@
15
16
 
16
17
  // IMPORTS
17
18
 
18
- // Module to process files.
19
- const fs = require('fs').promises;
20
19
  // Module to run Testaro jobs.
21
20
  const {doJob} = require('../run');
21
+ // Function to evaluate an expectation against an object.
22
+ const {isTrue} = require('../procs/doActs');
22
23
 
23
24
  // CONSTANTS
24
- const job = {
25
+ const jobTemplate = {
25
26
  id: '250101T0000-aaa-00',
26
27
  what: '',
27
28
  strict: true,
@@ -52,18 +53,45 @@ const job = {
52
53
 
53
54
  // FUNCTIONS
54
55
 
55
- // Validates a Testaro test.
56
+ // Validates a Testaro test and returns a result summary.
56
57
  exports.validateTest = async testID => {
57
58
  // Get data for a job for the test.
58
59
  const jobProperties = require(`./tests/jobProperties/${testID}.json`);
59
- // Use the data to complete the job.
60
+ // Use the data to complete a copy of the job template, so jobs cannot contaminate each other.
61
+ const job = structuredClone(jobTemplate);
62
+ // Give the job an ID unique to this process, so concurrent validations do not share a
63
+ // temporary directory (run.js keeps and deletes tmp/<jobID>).
64
+ job.id = `${jobTemplate.id}-${process.pid}-${Date.now().toString(36)}`;
60
65
  if (jobProperties.standard) {
61
66
  job.standard = jobProperties.standard;
62
67
  }
68
+ // Test-act isolation (process, browser, or page), if the validator specifies it.
69
+ if (jobProperties.isolation) {
70
+ job.isolation = jobProperties.isolation;
71
+ }
72
+ // Rules that compare a page with its catalog image (motion) need one to be made.
73
+ if (jobProperties.imageColor !== undefined) {
74
+ job.imageColor = jobProperties.imageColor;
75
+ }
63
76
  job.what = `validate Testaro test ${jobProperties.rule}`;
64
77
  job.acts = jobProperties.acts;
65
- // Perform it.
66
- report = await doJob(job);
78
+ /*
79
+ Make the job target the page that the job launches. The catalog, and the page
80
+ image that the motion rule compares its own screenshot with, are made on the
81
+ job target before the first act, so leaving the target at its default made
82
+ every validation catalog a catalog of an unrelated page.
83
+ */
84
+ const launchAct = jobProperties.acts.find(act => act.type === 'launch');
85
+ if (launchAct && launchAct.target && launchAct.target.url) {
86
+ job.target = {
87
+ what: launchAct.target.what || 'page for test validation',
88
+ url: launchAct.target.url
89
+ };
90
+ }
91
+ // Initialize the failure descriptions.
92
+ const failures = [];
93
+ // Perform the job.
94
+ const report = await doJob(job);
67
95
  // Report whether the end time was reported.
68
96
  const {acts, jobData} = report;
69
97
  if (jobData.endTime && /^(?:\d{2}-){2}\d{2}T\d{2}:\d{2}$/.test(jobData.endTime)) {
@@ -71,6 +99,22 @@ exports.validateTest = async testID => {
71
99
  }
72
100
  else {
73
101
  console.log('Failure: End time empty or invalid');
102
+ failures.push('End time empty or invalid');
103
+ }
104
+ // If the validator has report-level expectations, evaluate them against the report.
105
+ const reportExpectations = jobProperties.expectReport;
106
+ if (Array.isArray(reportExpectations)) {
107
+ reportExpectations.forEach(spec => {
108
+ const truth = isTrue(report, spec, report.catalog);
109
+ if (! truth[1]) {
110
+ const message = `Report expectation ${JSON.stringify(spec)} not met (actual ${JSON.stringify(truth[0])})`;
111
+ console.log(`Failure: ${message}`);
112
+ failures.push(message);
113
+ }
114
+ });
115
+ if (! failures.length) {
116
+ console.log('Success: Report expectations met');
117
+ }
74
118
  }
75
119
  // If the test acts were correctly reported:
76
120
  const testActs = acts.filter(act => act.type && act.type === 'test');
@@ -82,8 +126,8 @@ exports.validateTest = async testID => {
82
126
  ) {
83
127
  // Report this.
84
128
  console.log('Success: Reports have been correctly populated');
85
- // If all expectations were satisfied:
86
- if (testActs.every(testAct => testAct.expectationFailures === 0)) {
129
+ // If all expectations, including any report-level ones, were satisfied:
130
+ if (testActs.every(testAct => testAct.expectationFailures === 0) && ! failures.length) {
87
131
  // Report this.
88
132
  console.log('######## Success: No failures\n');
89
133
  }
@@ -93,6 +137,7 @@ exports.validateTest = async testID => {
93
137
  console.log(
94
138
  '######## Failure: The test has at least one failure (see “"passed": false” below)\n'
95
139
  );
140
+ failures.push('At least one expectation was not satisfied');
96
141
  // Output the acts that had failures.
97
142
  console.log(
98
143
  JSON.stringify(
@@ -103,6 +148,13 @@ exports.validateTest = async testID => {
103
148
  }
104
149
  else {
105
150
  console.log('Failure: Act results empty or invalid');
151
+ failures.push('Act results empty or invalid');
106
152
  console.log(JSON.stringify(acts, null, 2));
107
153
  }
154
+ // Return the result summary.
155
+ return {
156
+ testID,
157
+ success: ! failures.length,
158
+ failures
159
+ };
108
160
  };
@@ -1,11 +0,0 @@
1
- {
2
- "permissions": {
3
- "allow": [
4
- "Bash(git branch *)",
5
- "Bash(git add *)",
6
- "Bash(git commit -m ' *)",
7
- "Bash(git push *)"
8
- ]
9
- },
10
- "outputStyle": "Explanatory"
11
- }
package/.eslintrc.json DELETED
@@ -1,41 +0,0 @@
1
- {
2
- "env": {
3
- "browser": true,
4
- "commonjs": true,
5
- "es2021": true,
6
- "node": true
7
- },
8
- "extends": "eslint:recommended",
9
- "parserOptions": {
10
- "ecmaVersion": 2021
11
- },
12
- "rules": {
13
- "indent": [
14
- "error",
15
- 2,
16
- {
17
- "MemberExpression": 0,
18
- "ObjectExpression": "first"
19
- }
20
- ],
21
- "linebreak-style": [
22
- "error",
23
- "unix"
24
- ],
25
- "quotes": [
26
- "error",
27
- "single"
28
- ],
29
- "semi": [
30
- "error",
31
- "always"
32
- ],
33
- "no-use-before-define": [
34
- "error"
35
- ],
36
- "brace-style": [
37
- "error",
38
- "stroustrup"
39
- ]
40
- }
41
- }
@@ -1,67 +0,0 @@
1
- {
2
- "root": true,
3
- "env": {
4
- "browser": true,
5
- "commonjs": true,
6
- "es2021": true,
7
- "node": true
8
- },
9
- "extends": "eslint:recommended",
10
- "parserOptions": {
11
- "ecmaVersion": 5
12
- },
13
- "rules": {
14
- "indent": [
15
- "error",
16
- 2,
17
- {
18
- "MemberExpression": 0,
19
- "ObjectExpression": "first"
20
- }
21
- ],
22
- "linebreak-style": [
23
- "error",
24
- "unix"
25
- ],
26
- "quotes": [
27
- "error",
28
- "single"
29
- ],
30
- "semi": [
31
- "error",
32
- "always"
33
- ],
34
- "brace-style": [
35
- "error",
36
- "stroustrup"
37
- ],
38
- "no-undef": "off",
39
- "no-redeclare": "off",
40
- "no-unused-vars": "off",
41
- "no-empty": "off",
42
- "no-prototype-builtins": "off",
43
- "no-cond-assign": "off",
44
- "no-fallthrough": "off",
45
- "no-constant-condition": "off",
46
- "block-spacing": [
47
- "error",
48
- "never"
49
- ],
50
- "array-bracket-spacing": [
51
- "error",
52
- "never"
53
- ],
54
- "space-before-function-paren": [
55
- "error",
56
- "always"
57
- ],
58
- "space-in-parens": [
59
- "error",
60
- "never"
61
- ],
62
- "object-curly-spacing": [
63
- "error",
64
- "never"
65
- ]
66
- }
67
- }
@@ -1,127 +0,0 @@
1
- {
2
- "rule": "linkTitle",
3
- "timeLimit": 20,
4
- "acts": [
5
- {
6
- "type": "launch",
7
- "target": {
8
- "url": "file://validation/tests/targets/linkTitle/index.html",
9
- "what": "page with normal and rodundantly titled links"
10
- }
11
- },
12
- {
13
- "type": "test",
14
- "which": "testaro",
15
- "withItems": true,
16
- "stopOnFail": true,
17
- "expect": [
18
- [
19
- "standardResult.totals.0",
20
- "=",
21
- 1
22
- ],
23
- [
24
- "standardResult.totals.3",
25
- "=",
26
- 0
27
- ],
28
- [
29
- "standardResult.instances.length",
30
- "=",
31
- 1
32
- ],
33
- [
34
- "standardResult.instances.0.ruleID",
35
- "=",
36
- "linkTitle"
37
- ],
38
- [
39
- "standardResult.instances.0.what",
40
- "i",
41
- "Link has"
42
- ],
43
- [
44
- "standardResult.instances.0.ordinalSeverity",
45
- "=",
46
- 0
47
- ],
48
- [
49
- "standardResult.instances.0.tagName",
50
- "=",
51
- "A"
52
- ],
53
- [
54
- "standardResult.instances.0.id",
55
- "=",
56
- "basqueInfo"
57
- ],
58
- [
59
- "standardResult.instances.0.location.type",
60
- "=",
61
- "selector"
62
- ],
63
- [
64
- "standardResult.instances.0.location.spec",
65
- "=",
66
- "#basqueInfo"
67
- ],
68
- [
69
- "standardResult.instances.0.excerpt",
70
- "i",
71
- "Basque information"
72
- ]
73
- ],
74
- "rules": [
75
- "y",
76
- "linkTitle"
77
- ]
78
- },
79
- {
80
- "type": "test",
81
- "which": "testaro",
82
- "withItems": false,
83
- "stopOnFail": true,
84
- "expect": [
85
- [
86
- "standardResult.totals.0",
87
- "=",
88
- 1
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
- "linkTitle"
104
- ],
105
- [
106
- "standardResult.instances.0.count",
107
- "=",
108
- 1
109
- ],
110
- [
111
- "standardResult.instances.0.what",
112
- "i",
113
- "Links have"
114
- ],
115
- [
116
- "standardResult.instances.0.tagName",
117
- "=",
118
- "A"
119
- ]
120
- ],
121
- "rules": [
122
- "y",
123
- "linkTitle"
124
- ]
125
- }
126
- ]
127
- }
@@ -1,164 +0,0 @@
1
- {
2
- "rule": "opFoc",
3
- "timeLimit": 20,
4
- "acts": [
5
- {
6
- "type": "launch",
7
- "target": {
8
- "url": "file://validation/tests/targets/opFoc/good.html",
9
- "what": "page with standard focusability and operability"
10
- }
11
- },
12
- {
13
- "type": "test",
14
- "which": "testaro",
15
- "withItems": true,
16
- "stopOnFail": true,
17
- "expect": [
18
- [
19
- "standardResult.totals.2",
20
- "=",
21
- 0
22
- ],
23
- [
24
- "standardResult.totals.3",
25
- "=",
26
- 0
27
- ],
28
- [
29
- "standardResult.instances.length",
30
- "=",
31
- 0
32
- ]
33
- ],
34
- "rules": [
35
- "y",
36
- "opFoc"
37
- ]
38
- },
39
- {
40
- "type": "url",
41
- "which": "file://validation/tests/targets/opFoc/bad.html",
42
- "what": "page with deviant focusability and operability"
43
- },
44
- {
45
- "type": "test",
46
- "which": "testaro",
47
- "withItems": true,
48
- "stopOnFail": true,
49
- "expect": [
50
- [
51
- "standardResult.totals.2",
52
- "=",
53
- 0
54
- ],
55
- [
56
- "standardResult.totals.3",
57
- "=",
58
- 3
59
- ],
60
- [
61
- "standardResult.instances.0.ruleID",
62
- "=",
63
- "opFoc"
64
- ],
65
- [
66
- "standardResult.instances.0.what",
67
- "i",
68
- "Element is operable (tag name BUTTON)"
69
- ],
70
- [
71
- "standardResult.instances.0.ordinalSeverity",
72
- "=",
73
- 3
74
- ],
75
- [
76
- "standardResult.instances.0.tagName",
77
- "=",
78
- "BUTTON"
79
- ],
80
- [
81
- "standardResult.instances.0.location.doc",
82
- "=",
83
- "dom"
84
- ],
85
- [
86
- "standardResult.instances.0.location.type",
87
- "=",
88
- "box"
89
- ],
90
- [
91
- "standardResult.instances.0.location.spec.width",
92
- ">",
93
- 0
94
- ],
95
- [
96
- "standardResult.instances.0.excerpt",
97
- "=",
98
- "button"
99
- ],
100
- [
101
- "standardResult.instances.1.tagName",
102
- "=",
103
- "SPAN"
104
- ],
105
- [
106
- "standardResult.instances.2.what",
107
- "i",
108
- "Element is operable (pointer cursor)"
109
- ]
110
- ],
111
- "rules": [
112
- "y",
113
- "opFoc"
114
- ]
115
- },
116
- {
117
- "type": "test",
118
- "which": "testaro",
119
- "withItems": false,
120
- "stopOnFail": true,
121
- "expect": [
122
- [
123
- "standardResult.totals.2",
124
- "=",
125
- 0
126
- ],
127
- [
128
- "standardResult.totals.3",
129
- "=",
130
- 3
131
- ],
132
- [
133
- "standardResult.totals.1",
134
- "=",
135
- 0
136
- ],
137
- [
138
- "standardResult.instances.0.ruleID",
139
- "=",
140
- "opFoc"
141
- ],
142
- [
143
- "standardResult.instances.0.what",
144
- "i",
145
- "Elements are operable but"
146
- ],
147
- [
148
- "standardResult.instances.0.ordinalSeverity",
149
- "=",
150
- 3
151
- ],
152
- [
153
- "standardResult.instances.0.count",
154
- "=",
155
- 3
156
- ]
157
- ],
158
- "rules": [
159
- "y",
160
- "opFoc"
161
- ]
162
- }
163
- ]
164
- }
@@ -1,152 +0,0 @@
1
- {
2
- "rule": "targetsNear",
3
- "timeLimit": 20,
4
- "acts": [
5
- {
6
- "type": "launch",
7
- "target": {
8
- "url": "file://validation/tests/targetsNear/index.html",
9
- "what": "page with variously sized interaction targets"
10
- }
11
- },
12
- {
13
- "type": "test",
14
- "which": "testaro",
15
- "withItems": true,
16
- "stopOnFail": true,
17
- "expect": [
18
- [
19
- "standardResult.totals.0",
20
- "=",
21
- 6
22
- ],
23
- [
24
- "standardResult.totals.1",
25
- "=",
26
- 0
27
- ],
28
- [
29
- "standardResult.instances.0.ruleID",
30
- "=",
31
- "targetsNear"
32
- ],
33
- [
34
- "standardResult.instances.0.what",
35
- "i",
36
- "is less than 44"
37
- ],
38
- [
39
- "standardResult.instances.0.ordinalSeverity",
40
- "=",
41
- 0
42
- ],
43
- [
44
- "standardResult.instances.0.tagName",
45
- "=",
46
- "BUTTON"
47
- ],
48
- [
49
- "standardResult.instances.0.id",
50
- "=",
51
- "defaultbutton"
52
- ],
53
- [
54
- "standardResult.instances.0.location.doc",
55
- "=",
56
- "dom"
57
- ],
58
- [
59
- "standardResult.instances.0.location.type",
60
- "=",
61
- "selector"
62
- ],
63
- [
64
- "standardResult.instances.0.location.spec",
65
- "=",
66
- "#defaultbutton"
67
- ],
68
- [
69
- "standardResult.instances.0.excerpt",
70
- "i",
71
- "Default (small)"
72
- ],
73
- [
74
- "standardResult.instances.2.what",
75
- "i",
76
- "is less than"
77
- ],
78
- [
79
- "standardResult.instances.2.tagName",
80
- "=",
81
- "INPUT"
82
- ],
83
- [
84
- "standardResult.instances.2.excerpt",
85
- "i",
86
- "Small box:"
87
- ],
88
- [
89
- "standardResult.instances.2.location.spec.y",
90
- ">",
91
- 0
92
- ],
93
- [
94
- "standardResult.instances.4.tagName",
95
- "=",
96
- "A"
97
- ],
98
- [
99
- "standardResult.instances.4.excerpt",
100
- "=",
101
- "Wikimedia Foundation (small)"
102
- ]
103
- ],
104
- "rules": [
105
- "y",
106
- "targetsNear"
107
- ]
108
- },
109
- {
110
- "type": "test",
111
- "which": "testaro",
112
- "withItems": false,
113
- "stopOnFail": true,
114
- "expect": [
115
- [
116
- "standardResult.totals.0",
117
- "=",
118
- 6
119
- ],
120
- [
121
- "standardResult.totals.3",
122
- "=",
123
- 0
124
- ],
125
- [
126
- "standardResult.instances.0.ruleID",
127
- "=",
128
- "targetsNear"
129
- ],
130
- [
131
- "standardResult.instances.0.what",
132
- "i",
133
- "are smaller"
134
- ],
135
- [
136
- "standardResult.instances.0.ordinalSeverity",
137
- "=",
138
- 0
139
- ],
140
- [
141
- "standardResult.instances.0.count",
142
- "=",
143
- 6
144
- ]
145
- ],
146
- "rules": [
147
- "y",
148
- "targetsNear"
149
- ]
150
- }
151
- ]
152
- }