testaro 78.0.8 → 78.6.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 (357) hide show
  1. package/.gitattributes +94 -0
  2. package/.github/workflows/ci.yml +58 -0
  3. package/.github/workflows/publish.yml +50 -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 +143 -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/dist/nameComputation.js +1 -0
  16. package/docker-compose.yml +8 -2
  17. package/docs/checkpoint-scanning.md +199 -0
  18. package/docs/standard-result-outcome.md +165 -0
  19. package/env.example +49 -10
  20. package/eslint.config.mjs +101 -0
  21. package/netWatch.js +372 -222
  22. package/package.json +46 -31
  23. package/pour/README.md +47 -0
  24. package/pour/pour.min.js +8 -0
  25. package/procs/actDo.js +808 -0
  26. package/procs/catalog.d.ts +17 -0
  27. package/procs/catalog.js +312 -221
  28. package/procs/catalog.ts +398 -0
  29. package/procs/checkpoint.js +110 -0
  30. package/procs/config.d.ts +41 -0
  31. package/procs/config.js +98 -0
  32. package/procs/dateTime.js +2 -1
  33. package/procs/doActs.js +442 -849
  34. package/procs/doTestAct.js +27 -121
  35. package/procs/flow.js +221 -0
  36. package/procs/generateRuleRegistry.js +94 -0
  37. package/procs/getSource.d.ts +26 -0
  38. package/procs/job.js +115 -1
  39. package/procs/launch.d.ts +40 -0
  40. package/procs/launch.js +243 -108
  41. package/procs/nu.d.ts +48 -0
  42. package/procs/scope.js +196 -0
  43. package/procs/shoot.d.ts +33 -0
  44. package/procs/standard.d.ts +18 -0
  45. package/procs/standard.js +83 -0
  46. package/procs/standard.ts +126 -0
  47. package/procs/testAct.js +145 -0
  48. package/procs/testaro.d.ts +20 -0
  49. package/procs/testaro.js +236 -189
  50. package/procs/testaro.ts +321 -0
  51. package/procs/userPath.js +126 -0
  52. package/procs/xPath.d.ts +4 -0
  53. package/procs/xPath.js +81 -69
  54. package/procs/xPath.ts +106 -0
  55. package/procs/xPathScript.d.ts +6 -0
  56. package/procs/xPathScript.js +70 -0
  57. package/run.js +3 -2
  58. package/surea11y/README.md +44 -0
  59. package/surea11y/surea11y.browser.js +14 -0
  60. package/testaro/adbID.d.ts +3 -0
  61. package/testaro/adbID.js +38 -41
  62. package/testaro/adbID.ts +66 -0
  63. package/testaro/allCapStyle.d.ts +3 -0
  64. package/testaro/allCapStyle.js +31 -34
  65. package/testaro/allCapStyle.ts +55 -0
  66. package/testaro/allCaps.d.ts +16 -0
  67. package/testaro/allCaps.js +179 -151
  68. package/testaro/allCaps.ts +228 -0
  69. package/testaro/allHidden.d.ts +13 -0
  70. package/testaro/allHidden.js +29 -30
  71. package/testaro/allHidden.ts +50 -0
  72. package/testaro/allSlanted.d.ts +3 -0
  73. package/testaro/allSlanted.js +30 -33
  74. package/testaro/allSlanted.ts +54 -0
  75. package/testaro/altScheme.d.ts +3 -0
  76. package/testaro/altScheme.js +27 -30
  77. package/testaro/altScheme.ts +50 -0
  78. package/testaro/attVal.d.ts +3 -0
  79. package/testaro/attVal.js +20 -21
  80. package/testaro/attVal.ts +52 -0
  81. package/testaro/autocomplete.d.ts +3 -0
  82. package/testaro/autocomplete.js +59 -75
  83. package/testaro/autocomplete.ts +101 -0
  84. package/testaro/bulk.d.ts +13 -0
  85. package/testaro/bulk.js +32 -33
  86. package/testaro/bulk.ts +55 -0
  87. package/testaro/buttonMenu.d.ts +9 -0
  88. package/testaro/buttonMenu.js +317 -319
  89. package/testaro/buttonMenu.ts +391 -0
  90. package/testaro/captionLoc.d.ts +3 -0
  91. package/testaro/captionLoc.js +17 -20
  92. package/testaro/captionLoc.ts +40 -0
  93. package/testaro/datalistRef.d.ts +3 -0
  94. package/testaro/datalistRef.js +33 -36
  95. package/testaro/datalistRef.ts +55 -0
  96. package/testaro/distortion.d.ts +3 -0
  97. package/testaro/distortion.js +57 -26
  98. package/testaro/distortion.ts +81 -0
  99. package/testaro/docType.d.ts +15 -0
  100. package/testaro/docType.js +25 -25
  101. package/testaro/docType.ts +45 -0
  102. package/testaro/dupAtt.d.ts +16 -0
  103. package/testaro/dupAtt.js +113 -104
  104. package/testaro/dupAtt.ts +144 -0
  105. package/testaro/elements.d.ts +6 -0
  106. package/testaro/elements.js +153 -153
  107. package/testaro/elements.ts +215 -0
  108. package/testaro/embAc.d.ts +3 -0
  109. package/testaro/embAc.js +19 -20
  110. package/testaro/embAc.ts +40 -0
  111. package/testaro/focAll.d.ts +13 -0
  112. package/testaro/focAll.js +185 -191
  113. package/testaro/focAll.ts +217 -0
  114. package/testaro/focAndOp.d.ts +3 -0
  115. package/testaro/focAndOp.js +100 -104
  116. package/testaro/focAndOp.ts +128 -0
  117. package/testaro/focInd.d.ts +3 -0
  118. package/testaro/focInd.js +64 -66
  119. package/testaro/focInd.ts +96 -0
  120. package/testaro/focVis.d.ts +3 -0
  121. package/testaro/focVis.js +28 -30
  122. package/testaro/focVis.ts +52 -0
  123. package/testaro/headEl.d.ts +10 -0
  124. package/testaro/headEl.js +61 -62
  125. package/testaro/headEl.ts +82 -0
  126. package/testaro/headingAmb.d.ts +3 -0
  127. package/testaro/headingAmb.js +54 -63
  128. package/testaro/headingAmb.ts +72 -0
  129. package/testaro/hovInd.d.ts +12 -0
  130. package/testaro/hovInd.js +163 -130
  131. package/testaro/hovInd.ts +199 -0
  132. package/testaro/hover.d.ts +3 -0
  133. package/testaro/hover.js +155 -126
  134. package/testaro/hover.ts +154 -0
  135. package/testaro/hr.d.ts +3 -0
  136. package/testaro/hr.js +14 -17
  137. package/testaro/hr.ts +36 -0
  138. package/testaro/imageLink.d.ts +3 -0
  139. package/testaro/imageLink.js +17 -20
  140. package/testaro/imageLink.ts +42 -0
  141. package/testaro/labClash.d.ts +3 -0
  142. package/testaro/labClash.js +31 -33
  143. package/testaro/labClash.ts +54 -0
  144. package/testaro/legendLoc.d.ts +3 -0
  145. package/testaro/legendLoc.js +17 -20
  146. package/testaro/legendLoc.ts +42 -0
  147. package/testaro/lineHeight.d.ts +3 -0
  148. package/testaro/lineHeight.js +43 -48
  149. package/testaro/lineHeight.ts +70 -0
  150. package/testaro/linkAmb.d.ts +7 -0
  151. package/testaro/linkAmb.js +79 -80
  152. package/testaro/linkAmb.ts +105 -0
  153. package/testaro/linkExt.d.ts +3 -0
  154. package/testaro/linkExt.js +13 -16
  155. package/testaro/linkExt.ts +35 -0
  156. package/testaro/linkOldAtt.d.ts +3 -0
  157. package/testaro/linkOldAtt.js +25 -28
  158. package/testaro/linkOldAtt.ts +48 -0
  159. package/testaro/linkTo.d.ts +3 -0
  160. package/testaro/linkTo.js +22 -22
  161. package/testaro/linkTo.ts +43 -0
  162. package/testaro/linkUl.d.ts +3 -0
  163. package/testaro/linkUl.js +30 -34
  164. package/testaro/linkUl.ts +54 -0
  165. package/testaro/miniText.d.ts +3 -0
  166. package/testaro/miniText.js +41 -44
  167. package/testaro/miniText.ts +68 -0
  168. package/testaro/motion.d.ts +10 -0
  169. package/testaro/motion.js +92 -96
  170. package/testaro/motion.ts +125 -0
  171. package/testaro/nonTable.d.ts +3 -0
  172. package/testaro/nonTable.js +39 -45
  173. package/testaro/nonTable.ts +66 -0
  174. package/testaro/optRoleSel.d.ts +3 -0
  175. package/testaro/optRoleSel.js +16 -19
  176. package/testaro/optRoleSel.ts +41 -0
  177. package/testaro/phOnly.d.ts +3 -0
  178. package/testaro/phOnly.js +18 -21
  179. package/testaro/phOnly.ts +43 -0
  180. package/testaro/pseudoP.d.ts +3 -0
  181. package/testaro/pseudoP.js +36 -38
  182. package/testaro/pseudoP.ts +59 -0
  183. package/testaro/radioSet.d.ts +3 -0
  184. package/testaro/radioSet.js +57 -59
  185. package/testaro/radioSet.ts +79 -0
  186. package/testaro/registry.d.ts +63 -0
  187. package/testaro/registry.js +67 -0
  188. package/testaro/registry.ts +141 -0
  189. package/testaro/role.d.ts +3 -0
  190. package/testaro/role.js +27 -29
  191. package/testaro/role.ts +53 -0
  192. package/testaro/secHeading.d.ts +3 -0
  193. package/testaro/secHeading.js +30 -33
  194. package/testaro/secHeading.ts +53 -0
  195. package/testaro/styleDiff.d.ts +25 -0
  196. package/testaro/styleDiff.js +248 -252
  197. package/testaro/styleDiff.ts +303 -0
  198. package/testaro/tabNav.d.ts +33 -0
  199. package/testaro/tabNav.js +272 -342
  200. package/testaro/tabNav.ts +454 -0
  201. package/testaro/targetsNear.d.ts +9 -0
  202. package/testaro/targetsNear.js +130 -132
  203. package/testaro/targetsNear.ts +160 -0
  204. package/testaro/textNodes.d.ts +6 -0
  205. package/testaro/textNodes.js +139 -135
  206. package/testaro/textNodes.ts +185 -0
  207. package/testaro/textSem.d.ts +3 -0
  208. package/testaro/textSem.js +25 -28
  209. package/testaro/textSem.ts +47 -0
  210. package/testaro/title.d.ts +9 -0
  211. package/testaro/title.js +16 -13
  212. package/testaro/title.ts +31 -0
  213. package/testaro/titledEl.d.ts +3 -0
  214. package/testaro/titledEl.js +15 -18
  215. package/testaro/titledEl.ts +38 -0
  216. package/testaro/zIndex.d.ts +3 -0
  217. package/testaro/zIndex.js +19 -22
  218. package/testaro/zIndex.ts +42 -0
  219. package/tests/alfa.d.ts +45 -0
  220. package/tests/alfa.js +138 -141
  221. package/tests/alfa.ts +214 -0
  222. package/tests/aslint.d.ts +33 -0
  223. package/tests/aslint.js +272 -249
  224. package/tests/aslint.ts +301 -0
  225. package/tests/axe.d.ts +27 -0
  226. package/tests/axe.js +199 -200
  227. package/tests/axe.ts +277 -0
  228. package/tests/ed11y.d.ts +28 -0
  229. package/tests/ed11y.js +141 -99
  230. package/tests/ed11y.ts +178 -0
  231. package/tests/htmlcs.d.ts +21 -0
  232. package/tests/htmlcs.js +174 -140
  233. package/tests/htmlcs.ts +181 -0
  234. package/tests/ibm.d.ts +57 -0
  235. package/tests/ibm.js +182 -175
  236. package/tests/ibm.ts +287 -0
  237. package/tests/nuVal.d.ts +13 -0
  238. package/tests/nuVal.js +107 -112
  239. package/tests/nuVal.ts +145 -0
  240. package/tests/nuVnu.d.ts +15 -0
  241. package/tests/nuVnu.js +141 -111
  242. package/tests/nuVnu.ts +144 -0
  243. package/tests/pour.d.ts +31 -0
  244. package/tests/pour.js +242 -0
  245. package/tests/pour.ts +273 -0
  246. package/tests/qualWeb.d.ts +39 -0
  247. package/tests/qualWeb.js +262 -273
  248. package/tests/qualWeb.ts +344 -0
  249. package/tests/surea11y.d.ts +33 -0
  250. package/tests/surea11y.js +288 -0
  251. package/tests/surea11y.ts +334 -0
  252. package/tests/testaro.d.ts +25 -0
  253. package/tests/testaro.js +745 -652
  254. package/tests/testaro.ts +862 -0
  255. package/tests/wave.d.ts +46 -0
  256. package/tests/wave.js +166 -177
  257. package/tests/wave.ts +252 -0
  258. package/tsconfig.json +17 -0
  259. package/types.d.ts +243 -0
  260. package/types.js +10 -0
  261. package/types.ts +376 -0
  262. package/validation/act/README.md +46 -0
  263. package/validation/act/capture.js +877 -0
  264. package/validation/act/chromium-issue-draft.md +66 -0
  265. package/validation/act/fp-triage-2026-08-22.md +86 -0
  266. package/validation/act/isolation-notes.md +159 -0
  267. package/validation/act/playwright-issue-draft.md +73 -0
  268. package/validation/act/propose-mappings.js +0 -0
  269. package/validation/act/repro-cdp-raw.js +105 -0
  270. package/validation/act/repro-metarefresh.js +65 -0
  271. package/validation/act/score.js +184 -0
  272. package/validation/act/stage3a-stress-report.md +69 -0
  273. package/validation/act/stage3b-mapping-proposals.md +94 -0
  274. package/validation/act/stage3b-triage-draft.md +138 -0
  275. package/validation/act/surea11y-track-a-2026-09-01.md +50 -0
  276. package/validation/executors/netWatch.js +180 -90
  277. package/validation/executors/test.js +17 -2
  278. package/validation/executors/tests.js +118 -10
  279. package/validation/jobs/reports/raw/260901T1000-surea11y-validation.json +964 -0
  280. package/validation/jobs/todo/240101T1200-simple-example.json +14 -6
  281. package/validation/jobs/todo/240101T1300-shoot-example.json +2 -1
  282. package/validation/jobs/todo/260821T1900-pour-validation.json +45 -0
  283. package/validation/jobs/todo/260901T1000-surea11y-validation.json +45 -0
  284. package/validation/knownFailures.json +1 -0
  285. package/validation/tests/jobProperties/adbID.json +27 -2
  286. package/validation/tests/jobProperties/{focOp.json → allCapStyle.json} +56 -53
  287. package/validation/tests/jobProperties/allCaps.json +25 -0
  288. package/validation/tests/jobProperties/allHidden.json +133 -13
  289. package/validation/tests/jobProperties/allSlanted.json +3 -3
  290. package/validation/tests/jobProperties/altScheme.json +23 -8
  291. package/validation/tests/jobProperties/attVal.json +57 -57
  292. package/validation/tests/jobProperties/autocomplete.json +11 -1
  293. package/validation/tests/jobProperties/bulk.json +6 -1
  294. package/validation/tests/jobProperties/buttonMenu.json +63 -42
  295. package/validation/tests/jobProperties/captionLoc.json +1 -6
  296. package/validation/tests/jobProperties/checkpoint-browser.json +401 -0
  297. package/validation/tests/jobProperties/checkpoint-page.json +397 -0
  298. package/validation/tests/jobProperties/checkpoint.json +395 -0
  299. package/validation/tests/jobProperties/datalistRef.json +20 -5
  300. package/validation/tests/jobProperties/distortion.json +28 -3
  301. package/validation/tests/jobProperties/docType.json +2 -2
  302. package/validation/tests/jobProperties/dupAtt.json +48 -33
  303. package/validation/tests/jobProperties/elements.json +28 -28
  304. package/validation/tests/jobProperties/embAc.json +36 -31
  305. package/validation/tests/jobProperties/focAndOp.json +284 -0
  306. package/validation/tests/jobProperties/focInd.json +34 -34
  307. package/validation/tests/jobProperties/focVis.json +1 -1
  308. package/validation/tests/jobProperties/hover.json +39 -37
  309. package/validation/tests/jobProperties/hr.json +13 -3
  310. package/validation/tests/jobProperties/imageLink.json +0 -5
  311. package/validation/tests/jobProperties/labClash.json +68 -33
  312. package/validation/tests/jobProperties/legendLoc.json +1 -6
  313. package/validation/tests/jobProperties/lineHeight.json +2 -2
  314. package/validation/tests/jobProperties/linkAmb.json +13 -18
  315. package/validation/tests/jobProperties/linkExt.json +1 -1
  316. package/validation/tests/jobProperties/linkOldAtt.json +12 -2
  317. package/validation/tests/jobProperties/linkTo.json +1 -1
  318. package/validation/tests/jobProperties/linkUl.json +65 -65
  319. package/validation/tests/jobProperties/miniText.json +7 -2
  320. package/validation/tests/jobProperties/motion.json +4 -50
  321. package/validation/tests/jobProperties/nonTable.json +48 -3
  322. package/validation/tests/jobProperties/optRoleSel.json +12 -2
  323. package/validation/tests/jobProperties/phOnly.json +6 -16
  324. package/validation/tests/jobProperties/pseudoP.json +17 -2
  325. package/validation/tests/jobProperties/radioSet.json +30 -30
  326. package/validation/tests/jobProperties/role.json +25 -5
  327. package/validation/tests/jobProperties/secHeading.json +26 -21
  328. package/validation/tests/jobProperties/styleDiff.json +35 -5
  329. package/validation/tests/jobProperties/tabNav.json +3 -1
  330. package/validation/tests/jobProperties/targetsNear.json +237 -0
  331. package/validation/tests/jobProperties/textNodes.json +29 -29
  332. package/validation/tests/jobProperties/textSem.json +26 -1
  333. package/validation/tests/jobProperties/title.json +12 -2
  334. package/validation/tests/jobProperties/titledEl.json +39 -9
  335. package/validation/tests/jobProperties/userPath.json +317 -0
  336. package/validation/tests/jobProperties/zIndex.json +40 -35
  337. package/validation/tests/targets/allCapStyle/index.html +26 -0
  338. package/validation/tests/targets/checkpoint/index.html +38 -0
  339. package/validation/tests/targets/datalistRef/index.html +1 -1
  340. package/validation/tests/targets/focAndOp/bad.html +29 -0
  341. package/validation/tests/targets/{focOp → focAndOp}/good.html +3 -1
  342. package/validation/tests/targets/focInd/bad.html +2 -1
  343. package/validation/tests/targets/headEl/index.html +10 -1
  344. package/validation/tests/targets/{targetSmall → targetsNear}/index.html +15 -1
  345. package/validation/tests/targets/userPath/index.html +42 -0
  346. package/validation/validateTest.js +61 -9
  347. package/.claude/settings.local.json +0 -11
  348. package/.eslintrc.json +0 -41
  349. package/htmlcs/.eslintrc.json +0 -67
  350. package/validation/tests/jobProperties/linkTitle.json +0 -127
  351. package/validation/tests/jobProperties/opFoc.json +0 -164
  352. package/validation/tests/jobProperties/targetSmall.json +0 -152
  353. package/validation/tests/jobProperties/targetTiny.json +0 -142
  354. package/validation/tests/targets/focOp/bad.html +0 -25
  355. package/validation/tests/targets/linkTitle/index.html +0 -24
  356. package/validation/tests/targets/opFoc/bad.html +0 -26
  357. 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
- }